/*Plik: ork.c
 *Autor: Tigr
 *Data: 21.08.1998
 *Update: 21.08.1998
 *Opis: Ork z bandy
*/

inherit "/d/Imperium/std/monster";
#include <tigr.h>
#include <banda.h>
#include <composite.h>

#define WYGLAD ({ ({"krostowaty","krostowaci"}),({"zielony","zieloni"}),\
   		   ({"krzywonogi","krzywonodzy"}),({"strachliwy","strachliwi"}),\
   		   ({"smierdzacy","smierdzace"}),({"krzywonogi","krzywonodzy"}),\
   		   ({"dlugoreki","dlugorecy"}),/*({"niebezpieczny","niebezpieczni"})*/})
#define POSTURA ({ ({"cherlawy","cherlawi"}),({"niski","niscy"}),\
		   ({"niewysoki","niewysocy"}), ({"wysoki","wysocy"}),\
   		   ({"umiesniony","umiesnieni"}),({"potezny","potezni"}) })

#define SIZE_WYGL sizeof(WYGLAD)
#define SIZE_POST sizeof(POSTURA)

#define TO this_object()
#define ENTO environment(TO)

int post,k;
int stan,stan_byly;
int wal=0,dolacz=0;
mixed przym;
mixed ucieczka=({});
object banda;

mixed losuj_przym()
{
   post = random(SIZE_POST);
   
   k = random(SIZE_WYGL);
   
   if ((k==3)&(post>1)) k++; /* Potezny ork nie bedzie strachliwy;-) */
   
   return ({ POSTURA[post] , WYGLAD[k] });
}

dodaj_eq_zly()
{
   switch(random(6))
      {
         case 0: add_weapon(BR_PATH + "/miecz04");
         	 set_skill(SS_WEP_SWORD, 20 + post*2);
         	 break;
         case 1: add_weapon(BR_PATH + "/kord");
         	 set_skill(SS_WEP_SWORD, 20 + post*2);
         case 2: add_weapon(BR_PATH + "/szabla04");
         	 set_skill(SS_WEP_SWORD, 20 + post*2);
         	 break;
         case 3: add_weapon(BR_PATH + "/wlocznia01");
         	 set_skill(SS_WEP_POLEARM, 20 + post*2);
         	 break;
         case 4: add_weapon(BR_PATH + "/runka");
         	 set_skill(SS_WEP_POLEARM, 20 + post*2);
         	 break;
         case 5: add_weapon(BR_PATH + "/miecz01");
         	 set_skill(SS_WEP_SWORD, 20 + post*2);
         	 add_armour(ZB_PATH + "/tarcza02");
         	 set_skill(SS_SHIELD_PARRY, 10 + post*2);
         	 break;
      }
   switch(random(4))
      {
         case 0: add_armour(ZB_PATH + "/kirys01");
         	 break;
         case 1: add_armour(ZB_PATH + "/napiersnik03");
         	 break;
         case 2: add_armour(ZB_PATH + "/kurtka");
         	 break;
         case 3: add_armour(ZB_PATH + "/kurta");
         	 break;
      }
   
   if (!random(7)) add_armour(ZB_PATH + "/buty02");
   
   if (!random(11)) add_armour(ZB_PATH + "/helm01");
}

dodaj_eq_sredni()
{
   switch(random(6))
      {
         case 0: add_weapon(BR_PATH + "/korseka");
         	 set_skill(SS_WEP_POLEARM, 30 + post*2);
         	 break;
         case 1: add_weapon(BR_PATH + "/szabla01");
         	 set_skill(SS_WEP_SWORD, 30 + post*2);
         	 add_armour(ZB_PATH + "/tarcza02");
         	 set_skill(SS_SHIELD_PARRY, 20 + post*2);
         	 break;
         case 2: add_weapon(BR_PATH + "/morgenstern");
         	 set_skill(SS_WEP_CLUB, 30 + post*2);
         	 break;
         case 3: add_weapon(BR_PATH + "/daga");
         	 set_skill(SS_WEP_KNIFE, 30 + post*2);
         	 break;
         case 4: add_weapon(BR_PATH + "/wlocznia02");
         	 set_skill(SS_WEP_POLEARM, 30 + post*2);
         	 break;
         case 5: add_weapon(BR_PATH + "/palasz");
         	 set_skill(SS_WEP_SWORD, 30 + post*2);
         	 break;
      }
   switch(random(2))
      {
         case 0: add_armour(ZB_PATH + "/koszulka");
         	 break;
         case 1: add_armour(ZB_PATH + "/kirys02");
         	 if (!random(10)) add_armour(ZB_PATH + "/naramienniki01");
         	 break;
      }
   if (random(2)) add_armour(ZB_PATH + "/helm01");
   if (!random(4)) add_armour(ZB_PATH + "/buty02");
}

dodaj_eq_dobry()
{
   switch(random(5))
      {
         case 0: add_weapon(BR_PATH + "/glewia");
         	 set_skill(SS_WEP_POLEARM, 30 + post*3);
         	 break;
         case 1: add_weapon(BR_PATH + "/trojzab");
         	 set_skill(SS_WEP_POLEARM, 30 + post*3);
         	 break;
         case 2: add_weapon(BR_PATH + "/szabla03");
         	 set_skill(SS_WEP_SWORD, 30 + post*3);
         	 add_armour(ZB_PATH + "/tarcza01");
         	 set_skill(SS_SHIELD_PARRY, 20 + post*2);
         	 break;
         case 3: add_weapon(BR_PATH + "/topor03");
         	 set_skill(SS_WEP_AXE, 30 + post*3);
         	 break;
         case 4: add_weapon(BR_PATH + "/kordelas");
         	 set_skill(SS_WEP_KNIFE, 30 + post*3);
         	 break;
      }
   switch(random(2))
      {
         case 0: add_armour(ZB_PATH + "/kolczuga01");
         	 break;
         case 1: add_armour(ZB_PATH + "/kirys02");
         	 add_armour(ZB_PATH + "/naramienniki01");
         	 break;
      }
   if (!random(4)) add_armour(ZB_PATH + "/helm02");
      else add_armour(ZB_PATH + "/helm01");
      
   if (!random(8)) add_armour(ZB_PATH + "/buty01");
}

dodaj_eq_b_dobry()
{
   switch(random(4))
      {
         case 0: add_weapon(BR_PATH + "/claymore02");
         	 set_skill(SS_WEP_SWORD, 40 + post*3);
         	 break;
         case 1: add_weapon(BR_PATH + "/mlot");
         	 set_skill(SS_WEP_WARHAMMER, 40 + post*3);
         	 break;
         case 2: add_weapon(BR_PATH + "/szabla02");
         	 set_skill(SS_WEP_SWORD, 40 + post*3);
         	 if (!random(4)) 
         	    {
         	       add_armour(ZB_PATH + "/d_tarcza");
         	       set_skill(SS_SHIELD_PARRY, 25 + post*2);
         	    }
         	 break;
         case 3: add_weapon(BR_PATH + "/berdysz");
         	 set_skill(SS_WEP_AXE, 40 + post*3);
         	 break;
      }
   switch(random(2))
      {
         case 0: add_armour(ZB_PATH + "/napiersnik02");
         	 add_armour(ZB_PATH + "/naramienniki02");
         	 break;
         case 1: add_armour(ZB_PATH + "/kolczuga02");
         	 break;
      }
   add_armour(ZB_PATH + "/helm02");
   
   if (!random(5)) add_armour(ZB_PATH + "/buty01");
}

create_monster()
{
  przym=losuj_przym();
  
  set_gender(G_MALE);
  
  ustaw_odmiane_rasy(PL_ORK);
  
  dodaj_przym(przym[0][0],przym[0][1]);
    dodaj_przym(przym[1][0],przym[1][1]);
  
  set_long("@@dlugi_opis");
  
  add_prop(CONT_I_WEIGHT, 50000 + 10000*post);
  add_prop(CONT_I_HEIGHT, 135 + 15*post);
  add_prop(LIVE_I_NEVERKNOWN, 1);
  
  set_alignment(-200-(20*random(10)));
  
  set_stats( ({50+10*post,55-2*post,40+8*post,
               20+random(10),25+random(15),30+5*post}) );
  
  if (przym[1][0]=="strachliwy") set_whimpy(60);
  else set_whimpy(30);
  
  if (post>2) 
     {
        if (post==SIZE_POST-1&&!random(3)) dodaj_eq_b_dobry();
        else dodaj_eq_dobry();
     }
  else
     {
        if (post<2&&random(2)) dodaj_eq_zly();
        else dodaj_eq_sredni();
     }
  
  set_skill(SS_DEFENCE, 40 + 5*post);
  set_skill(SS_PARRY, 25 + 3*post);
  
  add_prop(NPC_I_NO_FEAR, 1);
  add_prop(IMPERIUM_I_CHAOS, 1);
   
}

string
dlugi_opis()
{
   string opis="Jest to " + przym[0][0] + " " + przym[1][0] + " ork, nalezacy " +
   	       "do jednej z band, walesajacych sie po Pustkowiach Chaosu. ";
   
   switch(post)
     {
       case 0: opis+="Jest slabowity, i sam nie stanowi zagrozenia dla " +
       		"doswiadczonego podroznika. Jednak razem ze swoja banda, " +
       		"ktora jest gdzies w poblizu, moze niezle namieszac. ";
       		break;
       case 1: opis+="Jest niewysoki, aczkolwiek moze sprawiac klopoty. ";
       		break;
       case 2: opis+="Jest sredniego wzrostu. ";
       		break;
       case 3: opis+="Jest wysoki jak na orka. ";
       		break;
       case 4: opis+="Jest dobrze zbudowany i dosc wysoki. ";
       		break;
       case 5: opis+="Jest bardzo wysoki i silny. ";
       		break;
     }
   
   switch(stan)
     {
       case BANDA_IDZIE: opis+="Razem z pozostalymi przemierza te Pustkowia.";
       			 break;
       case BANDA_ROZKLADA_OBOZ: opis+="Pomaga rozkladac oboz.";
       			 break;
       case BANDA_ODPOCZYWA: opis+="Odpoczywa, lezac na brudnej derce.";
       			 break;
       case BANDA_SZUKA_KOLEGOW:
       case BANDA_WALESA_SIE: opis+="Walesa sie po okolicy, niewatpliwie " +
       				    "jego banda jest gdzies w poblizu.";
       			 break;
       case BANDA_ZWIJA_OBOZ: opis+="Pomaga w zwijaniu obozu.";
       			 break;
       case BANDA_NA_CZATACH: opis+="Stoi na czatach, ochraniajac " +
       				"odpoczynek bandy.";
       			 break;
       case BANDA_CZEKA: opis+="Wyglada na zdenerwowanego.";
       			 break;
       case BANDA_WALCZY: opis+="";
       			 break;
     }
   
   return opis+"\n";
}

nie_ma_dowodcy()
{
  if (stan!=BANDA_WALESA_SIE)
     set_alarm(10.0,20.0,"walesac_sie");
  set_aggressive(1);
  remove_prop(NPC_I_NO_FEAR);
  if (stan==BANDA_SZUKA_KOLEGOW) 
     {
        stan=BANDA_WALESA_SIE;
        remove_alarm(dolacz);
        dolacz=0;
     }
  if (stan!=BANDA_WALCZY) stan==BANDA_WALESA_SIE;
  else stan_byly==BANDA_WALESA_SIE;
}

koniec_walki()
{
   if (!query_attack()) ustaw_stan(BANDA_WALESA_SIE);
}

walesac_sie()
{
  mixed lokacje = ENTO->query_exit_rooms();
  
  if (stan==BANDA_WALCZY) return;
  
  if (query_hp()<((query_whimpy()+20)*query_max_hp()/100))  return;
  
  ruch(lokacje);
}

ruch(mixed lokacje)
{
  int i = random(sizeof(lokacje));
  
  if (!sizeof(lokacje)) return;
  
  if (banda->moze_walesac_sie(lokacje[i]))
     {
        command(ENTO->query_exit()[3*i+1]);
     }
  else 
     {
        ruch(lokacje-({lokacje[i]}));
     }
}

run_away()
{
   string oldmin,oldmout;
   
   oldmin = query_m_in();
   oldmout = query_m_out();
   set_m_in("wbiega, drzac ze strachu.");
   set_m_out("w panice wybiega");
   
   zbieglem(ENTO->query_exit_rooms(),
            (100*query_hp()/query_max_hp()) < (query_whimpy()/2) );
   set_m_in(oldmin);
   set_m_out(oldmout);
}


zbieglem(mixed lokacje,int czy_bardzo_przerazony)
{
   int i = random(sizeof(lokacje));
   string gdzie = ENTO->query_exit()[3*i+1];
   
   if (!sizeof(lokacje))
   	{
   	  say(QCIMIE(TO,PL_MIA) + " sprobowal" +
   	  koncowka("","a") + " uciec, ale " +
   	  koncowka("mu","jej") + " sie to nie udalo.\n");
   	  return;
   	}
   
   if (czy_bardzo_przerazony)
      {
        if (!przeciwny(gdzie)) 
           {
              zbieglem(lokacje-({lokacje[i]}),1);
              seteuid("silvy");
              write_file("/d/Imperium/tigr/ORKERR.log",
              "Ork " +file_name(TO) + ", znajdowal sie w " +
              file_name(ENTO) + " i nie mogl zbiec " + gdzie + "\n");
           }
        ucieczka+=({gdzie});
        command(gdzie);
        ustaw_stan(BANDA_SZUKA_KOLEGOW);
      }
   else
      {
        if (lokacje[i]->query_prop(IMPERIUM_ROOM_I_NIE_DLA_BANDY))
           {
             command("emote popatrzyl ze strachem na " +
             (gdzie) + ".");
             zbieglem(lokacje-({lokacje[i]}),0);
           }
        else
           {
             if (!przeciwny(gdzie)) 
                {
                   zbieglem(lokacje-({lokacje[i]}),0);
                   seteuid("silvy");
                   write_file("/d/Imperium/tigr/ORKERR.log",
                   "Ork " +file_name(TO) + ", znajdowal sie w " +
                   file_name(ENTO) + " i nie mogl zbiec " + gdzie + "\n");
                }
             ucieczka+=({gdzie});
             command(gdzie);
             ustaw_stan(BANDA_SZUKA_KOLEGOW);
           }
      }
   
   
}

odpoczynek()
{
  if (banda->query_na_czatach(TO))
     {
       ustaw_stan(BANDA_NA_CZATACH);
       return;
     }
  
  if (random(10)>6) 
     {
  	ustaw_stan(BANDA_WALESA_SIE);
  	wal = set_alarm(10.0,20.0,"walesac_sie");
  	return;
     }
  
  ustaw_stan(BANDA_ODPOCZYWA);
}

wracamy()
{
   int i;
   object miejsce;
   
   miejsce=ENTO;
         
         if (miejsce!=(banda->gdzie_banda()))
            {
              for (i=0;i<sizeof(miejsce->query_exit_rooms());i++)
                  {
                    if (find_object((miejsce->query_exit())[3*i])==(banda->gdzie_banda()))
                       { 
                         command((miejsce->query_exit())[3*i+1]);
                         break;
                       }
                  }
               if (i==sizeof(miejsce->query_exit_rooms()))
                  ustaw_stan(BANDA_SZUKA_KOLEGOW);
            }
}

koniec_walesania_sie()
{
   if (wal) 
      {
   	 remove_alarm(wal);
   	 wal=0;
      }
   
   if (stan==BANDA_WALESA_SIE) 
      {
         wracamy();   
      }
   
   ustaw_stan(BANDA_ZWIJA_OBOZ);
}

dolaczaj()
{
   int i;
   if (ENTO==banda->gdzie_banda())
      {
         remove_alarm(dolacz);dolacz=0;
         ucieczka=({});
         ustaw_stan(BANDA_CZEKA);
         banda->dolaczylem(TO);
         return;
      }
   if (query_hp()<((query_whimpy()+20)*query_max_hp()/100)) 
      {
         return ;
      }
   remove_alarm(dolacz);
   dolacz=0;
   for (i=sizeof(ucieczka);i>0;i--)
       {
          command(przeciwny(ucieczka[i-1]));
          if (ENTO==banda->gdzie_banda())
             {
                ucieczka=({});
                ustaw_stan(BANDA_CZEKA);
                banda->dolaczylem(TO);
                return;
             }
       }
   
   if (ENTO!=banda->gdzie_banda())
      {
         seteuid("silvy");
         write_file("/d/Imperium/tigr/ORKERR.log",
            "Ork " + file_name(TO) + " nie znalazl bandy " +
            file_name(banda) + " w miejscu, gdzie ja zostawil.\n" +
            "Ucieczka wygladala tak: " +COMPOSITE_WORDS(ucieczka) + ".\n");
      }
      
   
   ucieczka=({});
   ustaw_stan(BANDA_CZEKA);
   banda->dolaczylem(TO);
}

set_banda(object b)
{
  banda = b;
}

object
query_banda()
{
  return banda;
}

ustaw_stan(int i)
{
   if (stan==BANDA_SZUKA_KOLEGOW&&dolacz) return;
   if (i==BANDA_IDZIE)
   {
      if (banda->czy_ktos_szuka())
         {
            stan=BANDA_CZEKA;
            return;
         }
   }
   if (i==BANDA_ODPOCZYWA)
      {
         command("wejdz do namiotu");
      }
   else
     {
        if (stan==BANDA_ODPOCZYWA)
           {
              command("wyjscie");
           }
     }
   stan  = i;
   if (stan==BANDA_SZUKA_KOLEGOW) 
      {
         if (dolacz) return;
         if (!banda->query_dowodca()) return;
          banda->szukam_kolegow(TO);
         dolacz=set_alarm(60.0,60.0,"dolaczaj");
      }
}

query_stan()
{
   return stan;
}

remove_object()
{
   if (stan!=BANDA_ZNIKA)
       banda->skasuj(this_object());
   ::remove_object();
}
attacked_by(object wrog)
{
   if (stan==BANDA_WALESA_SIE)
      if (banda->gdzie_banda()) 
       {
         set_alarm(1.0,0.0,"zaatak");
         
         return ::attacked_by(wrog);
       }
   if (member_array(wrog,banda->query_wrogowie())==-1)
      banda->zaatakowany(TO,wrog);
   ustaw_stan(BANDA_WALCZY);
   ::attacked_by(wrog);
}
zaatak()
{
   wracamy();
   command("powiedz do dowodcy Ktos mnie zaatakowal!");
   ustaw_stan(BANDA_ODPOCZYWA);
}
wspieraj(object kogo)
{
   if (!kogo) return;
   if (query_attack()==(kogo->query_attack())) return;
   if (ENTO==environment(kogo)&&kogo->query_attack())
      {
       command("wesprzyj " + OB_NAME(kogo));
       if (member_array(query_attack(),kogo->query_enemy(-1))+1)
          command("krzyknij Smierc ci!");
       ustaw_stan(BANDA_WALCZY);
      }
}

notify_you_killed_me(object kogo)
{
   if (banda->query_dowodca())
      banda->zabilem(kogo);
   else {set_alarm (1.0,0.0,&koniec_walki());}
   command("wez monety z ciala");
}

notify_enemy_gone(object wrog)
{
   if (banda->query_dowodca())
      banda->zwial(wrog);
   else {set_alarm(1.0,0.0,&koniec_walki());}
}
zachowaj_stan()
{
   if (stan!=BANDA_WALCZY)
   stan_byly = stan;
}
przywroc_stan()
{
  if (stan==BANDA_SZUKA_KOLEGOW) return;
  ustaw_stan(stan_byly);
}
czekaj()
{
   if (stan!=BANDA_WALCZY) ustaw_stan(BANDA_CZEKA);
}

aggressive_attack(object ob)
{
   ::aggressive_attack(ob);
   if (query_attack()) ustaw_stan(BANDA_WALCZY);
}