/* 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>
#include <hook.h>

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

inherit "/std/spellbook";

public <int|<int|string*|mapping|object>*>* Deckung(object caster,
    int hookid, <int|string*|mapping|object>* data);

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 (SpellSuccess(caster,sinfo)<=0)
    return MISSERFOLG;

  int hres = caster->HRegisterToHook(
    H_HOOK_DEFEND,
    #'Deckung,
    H_HOOK_GUILDPRIO(0),
    H_HOOK_MODIFICATOR,
    4);
  if(hres != 1)
  {
    caster->ReceiveMsg(
      "Das geht momentan nicht, Du wunderst Dich wieso!",
      MT_NOTIFICATION,
      MA_SPELL);
    return 0;
  }

  return ERFOLG;
}

// Diese Funktion wird auch von d/inseln/tilly/volgonen/rooms/std/para_vulkan.c 
// verwendet und muss daher public sein.
public <int|<int|string*|mapping|object>*>* Deckung(object caster,
    int hookid, <int|string*|mapping|object>* data)
{
  if (sizeof(data[1] & m_indices(PHYSICAL_DAMAGE_TYPES)))
  {
    tell_object(caster, "Du weichst gekonnt aus.\n");
    caster->HUnregisterFromHook(H_HOOK_DEFEND, #'Deckung);
    return ({H_CANCELLED, data});
  }
  tell_object(caster, "Dein Ausweichversuch ist vergebens.\n");
  return ({H_NO_MOD, data});
}

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;
}
