/* Gildenobjekt fuer Abenteurer - MorgenGrauen */
/* Boing, 1993-1998                                */
/* Sprueche:
     Lichtkugel herbeizaubern: licht
       Magiepunkte 5, Stufe 4
       Dauer: Level * 20 Sekunden
     Identifizieren: identifiziere
       Magiepunkte 10, Stufe 3
     Monster einschaetzen: schaetz <name>
       Magiepunkte 3, Stufe 10
     Pfeilangriff: pfeil <name>
       Schaden maximal 20, Magiepunkte 10, Stufe 11
     Gegenstaende untersuchen: identifiziere <objekt>
       Wenn P_INFO exisitiert, wird dies ausgegeben
       Magiepunkte 10, stufe 8
     Ausweichen: ausweichen
       Geht nur im Kampf, genau einer Attacke wird ausgewichen.
       Magiepunkte 10, Stufe 12
     Kampfschrei: kampfschrei <opfer> bzw. kampfschrei meldung <meldung>
       Der Kampfschrei wird ausgestossen und verlangsamt den Gegner.
       Magiepunkte 30, stufe 13
     Feuerball: feuerball <name>
       Schaden maximal 40, Magiepunkte 20, Stufe 15
     Schnelligkeit: schnell
       Gibt fuer eine bestimmte Zeit zusaetzliche Angriffe
       Magiepunkte 100, Stufe 17
     Saeurestrahl: saeurestrahl <name>
       Schaden maximal 60, Magiepunkte 25, Stufe 30
*/

#include <properties.h>
#include <language.h>
#include <attributes.h>
#include <combat.h>
#include <wizlevels.h>
#include <new_skills.h>

#define LICHTKUGEL "/gilden/files.abenteurer/lichtkugel"

inherit "/std/spellbook";

void create() {
  ::create();
  SetProp(P_GLOBAL_SKILLPROPS,
          ([SI_SPELLFATIGUE:2,       // 2 Sekunden kein neuer Spell
            SI_SKILLLEARN:5,         // 0.05% pro 2 A_INT
            OFFSET(SI_SKILLLEARN):10 // plus 0.1% in jedem Fall
            ]));

    AddSpell("steinschlag",5,
        ([SI_SKILLRESTR_LEARN:([P_LEVEL:1]),
         SI_SKILLDAMAGE:40,
         OFFSET(SI_SKILLDAMAGE):40,
         SI_SKILLDAMAGE_TYPE: ({DT_BLUDGEON}),
         SI_MAGIC_TYPE:({MT_ANGRIFF}),
         SI_SPELL:([SP_NAME:"steinschlag"])]));

  AddSpell("identifiziere",10,
       ([SI_SKILLRESTR_LEARN:([P_LEVEL:3]),
         SI_MAGIC_TYPE: ({ MT_HELLSICHT }),
         SI_SPELL: ([P_NAME: "identifiziere"]),
         ]) );
  AddSpell("licht",5,
      ([SI_SKILLRESTR_LEARN:([P_LEVEL:6]),
        SI_SPELL: ([P_NAME: "licht"]) 
       ]) );
  AddSpell("schaetz",3,
       ([SI_SKILLRESTR_LEARN:([P_LEVEL:8]),
         SI_MAGIC_TYPE: ({ MT_HELLSICHT }),
         SI_SPELL: ([SP_NAME: "schaetz"]),
         ]));
  AddSpell("pfeil",10,
           ([SI_SKILLRESTR_LEARN:([P_LEVEL:10]),
             // Um diesen Spruch lernen zu koennen muss
             // der Level mindestens 11 sein
             SI_SKILLDAMAGE:200,
             // Schaden: Random(200) ...
             SI_SKILLDAMAGE_TYPE:({DT_MAGIC}),
             // Damage Type: Magic
             SI_MAGIC_TYPE: ({ MT_ANGRIFF }),
             SI_SPELL: ([ SP_NAME: "pfeil" ]),
             // Boni für hintere Kampfreihen
             SI_SKILLDAMAGE_BY_ROW: ([2:110,3:50,4:10]),
             OFFSET(SI_SKILLDAMAGE_BY_ROW): ([2:50,3:20,4:5])
             ]));
  AddSpell("ausweichen", 10,
      ([SI_SKILLRESTR_LEARN:([P_LEVEL:13]),
        SI_SPELL: ([P_NAME: "ausweichen"]),
        ]));
  AddSpell("kampfschrei", 30,
       ([SI_SKILLRESTR_LEARN:([P_LEVEL:16]),
         SI_MAGIC_TYPE: ({ MT_PSYCHO }),
         SI_SPELL: ([SP_NAME: "kampfschrei"]),
         ]));
  AddSpell("feuerball",20,
           ([SI_SKILLRESTR_LEARN:([P_LEVEL:18]),
             SI_SKILLDAMAGE:300,
             // Schaden: Random(300) ...
             OFFSET(SI_SKILLDAMAGE):100,
             // ... plus 100
             SI_SKILLDAMAGE_TYPE:({DT_FIRE}),
             // Damage Type: Fire
            SI_MAGIC_TYPE: ({ MT_ANGRIFF }),
            SI_SPELL: ([SP_NAME: "feuerball"]),
            SI_SKILLDAMAGE_BY_ROW: ([2:80,3:150,4:80,5:20]),
            OFFSET(SI_SKILLDAMAGE_BY_ROW): ([2:30,3:80,4:30,5:10])
             ]));
  AddSpell("schnell",100,
      ([SI_SKILLRESTR_LEARN:([P_LEVEL:21]),
        SI_SPELL: ([P_NAME: "schnell"]) ]));
  AddSpell("saeurestrahl",25,
       ([SI_SKILLRESTR_LEARN:([P_LEVEL:28]),
             OFFSET(SI_SKILLLEARN):1,
             FACTOR(SI_SKILLLEARN):20,
             SI_SKILLDAMAGE:400,
             // Schaden: Random(400) ...
             OFFSET(SI_SKILLDAMAGE):200,
             // ... plus 200
             SI_SKILLDAMAGE_TYPE:({DT_ACID}),
             // Damage Type: Saeure
             SI_MAGIC_TYPE: ({ MT_ANGRIFF }),
             SI_SPELL: ([SP_NAME: "saeurestrahl"]),
             SI_SKILLDAMAGE_BY_ROW:([2:60,3:150,4:210,5:150,6:60]),
             OFFSET(SI_SKILLDAMAGE_BY_ROW):([2:30,3:80,4:120,5:80,6:30])
             ]));

}

int
steinschlag(object caster, mapping sinfo) {
  object victim;
  string vnw, cn;
  int suc;

  victim=FindEnemyVictim(sinfo[SI_SKILLARG],caster,
         "Ueber wem willst Du einen Steinschlag niedergehen lassen?\n");
  if (!victim)
    return 0;
  if ((suc=SpellSuccess(caster,sinfo))<=0)
    return MISSERFOLG;
  if (suc < victim->SpellDefend(caster, sinfo))
  {
    tell_object(caster, victim->Name() + " wehrt Deinen Spruch ab.\n");
    return ERFOLG;
  }

  cn = caster->Name();
  vnw = victim->name(WEN, 2);
  say(sprintf("%s laesst kleine Kiesel auf %s fallen.\n",cn, vnw),
      victim);
  printf("Du konzentrierst Dich darauf, kleine Kiesel auf %s fallen zu lassen.\n", vnw);
  tell_object(victim,sprintf("%s laesst kleine Kiesel auf Dich fallen.\n",
                             cn));
  TryDefaultAttackSpell(victim,caster,sinfo,
            ([SP_NAME:"steinschlag", SP_PHYSICAL_ATTACK:1,SP_SHOW_DAMAGE:1]));
  return ERFOLG;
}

int
schaetz(object caster, mapping sinfo) {
   object victim;
   int hpdiff, wcdiff, acdiff;
   int hp, vhp, wc, vwc, ac, vac;
   string result;
   string vname, vnamegen;
   int suc;

   victim=FindLivingVictim(sinfo[SI_SKILLARG],caster,
                           "Wen moechtest Du einschaetzen?\n");
   if (!victim)
     return 0;
   if ((suc=SpellSuccess(caster,sinfo))<=0)
      return MISSERFOLG;
   if (suc < victim->SpellDefend(caster, sinfo))
   {
     tell_object(caster, victim->Name() + " wehrt Deinen Spruch ab.\n");
     return ERFOLG;
   }

   hp = caster->QueryProp(P_HP);    vhp = victim->QueryProp(P_HP);
   wc = caster->QueryProp(P_TOTAL_WC);  vwc = victim->QueryProp(P_TOTAL_WC);
   ac = caster->QueryProp(P_TOTAL_AC);  vac = victim->QueryProp(P_TOTAL_AC);
   hpdiff = hp - vhp;
   wcdiff = wc - vwc;
   acdiff = ac - vac;
   vname = victim->name(WER, 1);
   vnamegen = victim->name(WESSEN, 1);

   if (hpdiff > 10*vhp)
      result = capitalize(victim->name(WER, 1))+" sollte sich besser schon mal einen Sarg besorgen.\n";
   else if (hpdiff > 7*vhp)
      result = "Du bist " + victim->name(WEM, 1) + " haushoch ueberlegen.\n";
   else if (hpdiff > 4*vhp)
      result = "Du bist sehr viel staerker als " + vname + ".\n";
   else if (hpdiff > 2*vhp)
      result = "Du bist viel staerker als " + vname + ".\n";
   else if (2*hpdiff > 3*vhp)
      result = "Du bist spuerbar staerker als " + vname + ".\n";
   else if (hpdiff > vhp)
      result = "Du bist staerker als " + vname + ".\n";
   else if (hpdiff > vhp/5)
      result = "Du bist etwas staerker als " + vname + ".\n";
   else if (-hpdiff > 10*hp)
      result = "Besorg Dir besser schon mal einen Sarg.\n";
   else if (-hpdiff > 7*hp)
      result = capitalize(vname) + " ist Dir haushoch ueberlegen.\n";
   else if (-hpdiff > 4*hp)
      result = capitalize(vname) + " ist sehr viel staerker als Du.\n";
   else if (-hpdiff > 2*hp)
      result = capitalize(vname) + " ist viel staerker als Du.\n";
   else if (-2*hpdiff > 3*hp)
      result = capitalize(vname) + " ist spuerbar staerker als Du.\n";
   else if (-hpdiff > hp)
      result = capitalize(vname) + " ist staerker als Du.\n";
   else if (-hpdiff > hp/5)
      result = capitalize(vname) + " ist etwas staerker als Du.\n";
   else
      result = capitalize(vname) + " ist etwa gleich stark wie Du.\n";
   write(result);

   if (acdiff > 2*vac)
      result = "Deine Ruestung ist unglaublich viel besser als die "
     + vnamegen + ".\n";
   else if (acdiff > vac)
      result = "Deine Ruestung ist viel besser als die " + vnamegen + ".\n";
   else if (acdiff >vac/5)
      result = "Deine Ruestung ist besser als die " + vnamegen + ".\n";
   else if (-acdiff > 2*ac)
      result = "Die Ruestung " + vnamegen
     + " ist unglaublich viel besser als Deine.\n";
   else if (-acdiff > ac)
      result = "Die Ruestung " + vnamegen + " ist viel besser als Deine.\n";
   else if (-acdiff > ac/5)
      result = "Die Ruestung " + vnamegen + " ist besser als Deine.\n";
   else
      result = "Eure Ruestungen sind etwa gleich gut.\n";
   write(result);

   if (wcdiff > 2*vwc)
      result = "Deine Waffe ist eigentlich zu gut fuer diesen Gegner.\n";
   else if (wcdiff > vwc)
      result = "Deine Waffe ist viel besser als die " +vnamegen + ".\n";
   else if (wcdiff > vwc/5)
      result = "Deine Waffe ist besser als die " +vnamegen + ".\n";
   else if (-wcdiff > 2*wc)
      result = "Die Waffe " + vnamegen
     + " laesst Deine ganz mickrig aussehen.\n";
   else if (-wcdiff > wc)
      result = "Die Waffe " + vnamegen + " ist viel besser als Deine.\n";
   else if (-wcdiff > wc/5)
      result = "Die Waffe " + vnamegen + " ist besser als Deine.\n";
   else
      result = "Eure Waffen sind etwa gleich gut.\n";
   write(result);
   return ERFOLG;
}

int kampfschrei(object caster, mapping sinfo)
{
  object ob;
  string cmdline, meldung;
  int    suc, dauer;

  cmdline = this_player()->_unparsed_args();
  if (cmdline)
  {
    if (sscanf(cmdline, "meldung %s", meldung))
    {
      caster->Set("ab_kampfschrei", SAVE, F_MODE_AS);
      caster->SetProp("ab_kampfschrei", meldung);
      printf("Dein Kampfschrei ist jetzt: %s\n", meldung);
      return 0;
    }
  }
  ob = FindEnemyVictim(sinfo[SI_SKILLARG], caster,
          "Wem willst Du Deinen Kampfschrei entgegenschleudern?\n");

  if (!ob)
    return 0;

  if ((suc=SpellSuccess(caster, sinfo)) <= 0)
    return MISSERFOLG;
  if (suc < ob->SpellDefend(caster, sinfo))
  {
    tell_object(caster, ob->Name() + " wehrt Deinen Spruch ab.\n");
    return ERFOLG;
  }

  meldung = caster->QueryProp("ab_kampfschrei");
  if (!meldung)
    meldung = "Aaaaaaaiiiiieeeeeeeeeeeeeeeehhhhhhhhhhhhhhh!!!!!!!\n";

  write(break_string(meldung, 78, "Du kreischst: "));
  tell_room(environment(caster),
        break_string(meldung, 78, caster->Name()+" kreischt: "),
        ({caster}));
  tell_object(ob, "Du fuehlst Dich wie gelaehmt.\n");

  dauer = 1 + (suc/1000 + random(caster->QueryProp(P_LEVEL)/2))/2;
  if (dauer>25)
    dauer = 25;
  ob->ModifySkillAttribute(SA_SPEED, -50, dauer);

  return ERFOLG;
}

int ausweichen(object caster, mapping sinfo)
{
  if (!caster->InFight())
  {
    write("Ausweichen ausserhalb eines Kampfes ist ziemlich sinnlos.\n");
    return 0;
  }

  if (caster->QueryProp(P_TMP_DEFEND_HOOK))
  {
    write("Das geht momentan nicht, Du wunderst Dich wieso!\n");
    return 0;
  }

  if (SpellSuccess(caster,sinfo)<=0)
    return MISSERFOLG;

  caster->SetProp(P_TMP_DEFEND_HOOK, ({ time()+4, this_object(), "Deckung" }));
  return ERFOLG;
}

mixed Deckung(int dam, mixed dam_type, mixed spell, object enemy)
{
  if (!pointerp(dam_type))
    dam_type = ({ dam_type });
  if (sizeof(dam_type & m_indices(PHYSICAL_DAMAGE_TYPES)))
  {
    tell_object(previous_object(), "Du weichst gekonnt aus.\n");
    if (previous_object()->QueryProp(P_TMP_DEFEND_HOOK)[1] == this_object())
      previous_object()->SetProp(P_TMP_DEFEND_HOOK, 0);
    return 0;
  }
  tell_object(previous_object(), "Dein Ausweichversuch ist vergebens.\n");
  return ({ dam, dam_type, spell, enemy });
}

int
identifiziere(object caster, mapping sinfo) {
  object ob;
  string result, info;
  int suc;
  ob=FindVictim(sinfo[SI_SKILLARG], caster,
                "Was moechtest Du identifizieren?\n");
  if (!ob)
    return 0;

  if ((suc=SpellSuccess(caster,sinfo))<=0)
    return MISSERFOLG;
  if (suc < ob->SpellDefend(caster, sinfo))
  {
    tell_object(caster, ob->Name() + " wehrt Deinen Spruch ab.\n");
    return ERFOLG;
  }

  result="Du identifizierst "+ob->name(WEN,1)+". "
        +capitalize(ob->QueryPronoun())
        +" besteh"
        +(ob->QueryProp(P_PLURAL) ? "en" : "t")
        +" aus "
        +(ob->MaterialList(WEM, caster))+". ";
  if (info=ob->QueryProp(P_INFO))
    result+="Ausserdem bemerkst Du folgendes:\n"+info;
  else result+="Du kannst sonst nichts besonderes an "+ob->QueryPronoun(WEM)
              +" erkennen.";
  write(break_string(result, 78, 0, 1));
  return ERFOLG;
}

int
licht(object caster, mapping sinfo)
{
   object l;

   tell_object(caster, "Du machst eine magische Bewegung.\n");
   tell_room(environment(caster),
       sprintf("%s macht eine magische Bewegung.\n",
           capitalize(caster->name(WER))), ({caster}));
   
   int suc=SpellSuccess(caster,sinfo);
   if (suc<=0)
      return MISSERFOLG;

   l = clone_object(LICHTKUGEL);
   if (l->move(this_player()) > 0)
   {
      int lvl;
      // fuer Spruchrollen-Support.
      if (!sinfo[SI_USR] || !(lvl=sinfo[SI_USR][P_LEVEL]) )
        lvl = caster->QueryProp(P_LEVEL);
      lvl = min(lvl,42);
      // wenn der Spell nicht ganz so gut gelingt, ist die Kugel auch etwas
      // dunkler.
      if (suc<6000)
      {
        l->SetProp(P_LIGHT,1);
        tell_object(caster,
            "Wie aus dem Nichts erscheint eine leuchtende Kugel.\n");
      }
      else
        tell_object(caster,
            "Wie aus dem Nichts erscheint eine hell leuchtende Kugel.\n");
      l->start_remove(lvl * 20 * min(suc+3333,10000) / 10000);
   }
   else
   {
      l->remove();
      tell_object(caster,
          "Eine Lichtkugel erscheint, zerplatzt aber sofort mit einem sanften 'plopp'.\n");
   }

   return ERFOLG;
}

int
saeurestrahl(object caster, mapping sinfo) {
  object victim;
  string vnw;
  int suc;

  victim=FindEnemyVictim(sinfo[SI_SKILLARG],caster,
                     "Wen willst Du mit einem Saeurestrahl beschiessen?\n");
  if (!victim)
    return 0;
  if ((suc=SpellSuccess(caster,sinfo))<=0)
    return MISSERFOLG;
  if (suc < victim->SpellDefend(caster, sinfo))
  {
    tell_object(caster, victim->Name() + " wehrt Deinen Spruch ab.\n");
    return ERFOLG;
  }

  vnw = victim->name(WEN, 2);
  say(break_string(
   sprintf(
   "%s fuchtelt seltsam in der Luft herum und schiesst einen Saeurestrahl auf %s.\n",
       caster->Name(), vnw), 78), victim);
  printf("Du schiesst einen Saeurestrahl auf %s.\n", vnw);
  tell_object(victim, sprintf("%s schiesst einen Saeurestrahl auf Dich.\n",
                              caster->Name()));

  TryDefaultAttackSpell(victim,caster,sinfo,
            ([SP_NAME:"Saeurestrahl", SP_SHOW_DAMAGE:1]));

  return ERFOLG;
}

int
feuerball(object caster, mapping sinfo) {
  object victim;
  string vnw;
  int suc;

  victim=FindEnemyVictim(sinfo[SI_SKILLARG],caster,
                         "Auf wen willst Du einen Feuerball schleudern?\n");
  if (!victim)
    return 0;
  if ((suc=SpellSuccess(caster,sinfo))<=0)
    return MISSERFOLG;
  if (suc < victim->SpellDefend(caster, sinfo))
  {
    tell_object(caster, victim->Name() + " wehrt Deinen Spruch ab.\n");
    return ERFOLG;
  }

  vnw = victim->name(WEM, 2);
  say(sprintf("%s wirft einen Feuerball nach %s.\n",
              caster->Name(), vnw), victim);
  printf("Du wirfst einen Feuerball nach %s.\n", vnw);
  tell_object(victim, sprintf("%s wirft einen Feuerball nach Dir.\n",
                              caster->Name()));

  TryDefaultAttackSpell(victim,caster,sinfo,
            ([SP_NAME:"Feuerball", SP_SHOW_DAMAGE:1]));

  return ERFOLG;
}

int
pfeil(object caster, mapping sinfo) {
  object victim;
  string vnw, cn;
  int suc;

  victim=FindEnemyVictim(sinfo[SI_SKILLARG],caster,
                         "Nach wem willst Du einen magischen Pfeil werfen?\n");
  if (!victim)
    return 0;
  if ((suc=SpellSuccess(caster,sinfo))<=0)
    return MISSERFOLG;
  if (suc < victim->SpellDefend(caster, sinfo))
  {
    tell_object(caster, victim->Name() + " wehrt Deinen Spruch ab.\n");
    return ERFOLG;
  }

  cn = caster->Name();
  vnw = victim->name(WEN, 2);
  say(sprintf("%s feuert einen magischen Pfeil auf %s ab.\n",cn, vnw),
      victim);
  printf("Du feuerst einen magischen Pfeil auf %s ab.\n", vnw);
  tell_object(victim,sprintf("%s feuert einen magischen Pfeil auf Dich ab.\n",
                             cn));
  TryDefaultAttackSpell(victim,caster,sinfo,
            ([SP_NAME:"Pfeil", SP_SHOW_DAMAGE:1]));
  return ERFOLG;
}

int
schnell(object caster, mapping sinfo) {
  int dauer;

  if (SpellSuccess(caster,sinfo)<=0)
    return MISSERFOLG;
  write("Du fuehlst Dich ploetzlich deutlich schneller.\n");
  dauer = 2 * (caster->QueryAttribute(A_DEX) +
           random(sinfo[SI_SKILLABILITY]/1000));
  if (dauer>60)
    dauer = 60;
  caster->ModifySkillAttribute(SA_SPEED, 100, dauer);

  call_out(function void (object pl)
      {if (pl) tell_object(pl, "Du wirst wieder langsamer.\n"); },
        dauer-__HEART_BEAT_INTERVAL__, caster);

  return ERFOLG;
}
