/*Plik: szef.c
 *Autor: Tigr
 *Data: 21.08.1998
 *Update: 21.08.1998
 *Opis: Przywodca bandy orkow
*/

inherit "/d/Imperium/std/monster";
#include "tigr.h"
#include "banda.h"

#define POSTURA ({ ({"niski","niscy"}), ({"krepy","krepi"}),\
		   ({"wysoki","wysocy"}),\
   		   ({"muskularny","muskularni"}),({"potezny","potezni"}) })

#define SIZE_POST sizeof(POSTURA)

#define TO this_object()
#define ENTO environment(TO)

int post,k;
int stan,stan_byly;
mixed przym;
object banda;
int id;

mixed losuj_przym()
{
   post = random(SIZE_POST);
   
   //k = random(SIZE_WYGL);
   
   return /*({*/ POSTURA[post] /* , WYGLAD[k] })*/;
}

dodaj_eq_dobry()
{
   switch(random(5))
      {
         case 0: 
           add_weapon(BR_PATH + "/topor02");
           set_skill(SS_WEP_AXE, 40 + post*3);
           break;
         case 1:
           add_weapon(BR_PATH + "/claymore01");
           set_skill(SS_WEP_SWORD, 40 + post*3);
           break;
         case 2:
           add_weapon(BR_PATH + "/flamberg");
           set_skill(SS_WEP_SWORD, 40 + post*3);
           break;
         case 3:
           add_weapon(BR_PATH + "/tasak");
           set_skill(SS_WEP_SWORD, 40 + post*3);
           add_armour(ZB_PATH + "/tarcza01");
           set_skill(SS_SHIELD_PARRY, 25 + post*2);
           break;
         case 4:
           add_weapon(BR_PATH + "/berdysz");
           set_skill(SS_WEP_AXE, 40 + post*3);
           break;
      }
   if (random(2))
      {
         add_armour(ZB_PATH + "/kolczuga02");
      }
   else
      {
         add_armour(ZB_PATH + "/napiersnik02");
         add_armour(ZB_PATH + "/naramienniki01");
      }
   
   if (random(10)>7)
      {
        add_armour(ZB_PATH + "/w_helm02");
      }
   else
      {
         add_armour(ZB_PATH + "/barbuta");
      }
   if (!random(4)) add_armour(ZB_PATH + "/rekawice01");
   if (!random(4)) add_armour(ZB_PATH + "/buty01");
}

dodaj_eq_b_dobry()
{
   switch(random(5))
      {
         case 0:
            add_weapon(BR_PATH + "/mlot");
            set_skill(SS_WEP_WARHAMMER, 50 + post*3);
            break;
         case 1:
            add_weapon(BR_PATH + "/topor01");
            set_skill(SS_WEP_AXE, 50 + post*3);
            break;
         case 2:
            add_weapon(BR_PATH + "/zdob_miecz");
            set_skill(SS_WEP_SWORD, 50 + post*3);
            break;
         case 3:
            add_weapon(BR_PATH + "/scimitar01");
            add_armour(ZB_PATH + "/d_tarcza");
            set_skill(SS_WEP_SWORD, 50 + post*3);
            set_skill(SS_SHIELD_PARRY, 25 + post*2);
            break;
         case 4:
            add_weapon(BR_PATH + "/szabla02");
            add_armour(ZB_PATH + "/d_tarcza");
            set_skill(SS_WEP_SWORD, 50 + post*3);
            set_skill(SS_SHIELD_PARRY, 25 + post*2);
            break;
      }
   if (random(2))
      {
         add_armour(ZB_PATH + "/kolczuga03");
      }
   else
      {
         add_armour(ZB_PATH + "/napiersnik01");
         add_armour(ZB_PATH + "/naramienniki02");
      }
   add_armour(ZB_PATH + "/w_helm01");
   if (!random(3)) add_armour(ZB_PATH + "/rekawice01");
   if (!random(3)) add_armour(ZB_PATH + "/buty01");
}

create_monster()
{
  przym=losuj_przym();
  
  dodaj_nazwy( ({"dowodca","dowodcy","dowodcy","dowodce","dowodca","dowodcy"}),
  	       ({"dowodcy","dowodcow","dowodcom","dowodcow","dowodcami","dowodcach"}),
  	       PL_MESKI_OS);
  
  set_gender(G_MALE);
  
  ustaw_odmiane_rasy(PL_ORK);
  
  dodaj_przym(przym[0],przym[1]);
  dodaj_przym("czarny","czarni");
  
  set_long("@@dlugi_opis");
  
  add_prop(CONT_I_WEIGHT, 60000 + 10000*post);
  add_prop(CONT_I_HEIGHT, 145 + 15*post);
  add_prop(LIVE_I_NEVERKNOWN, 1);
  
  set_alignment(-200-(20*random(10)));
  set_aggressive("@@czy_atakowac");
  
  set_whimpy(50);
  
  set_stats( ({75+10*post,65-2*post,55+8*post,
               20+random(10),25+random(15),80+5*post}) );
  
  set_skill(SS_DEFENCE, 40 + 5*post);
  set_skill(SS_PARRY, 35 + 3*post);
  set_skill(SS_AWARENESS, 60 + 3*random(10));
  
  if (random(post)>1)
     dodaj_eq_b_dobry();
  else
     dodaj_eq_dobry();
  
  add_prop(IMPERIUM_I_CHAOS, 1);
  add_prop(CONT_I_VOLUME, 70000 + 5000*post);
  add_prop(CONT_I_HEIGHT, 150 + 3*post);
  add_prop(CONT_I_WEIGHT, 70000 + 5000*post);
  
   
}

string
dlugi_opis()
{
   string opis= "Jest to " + przym[0] + " czarny ork, ktory " +
   		"wydaje sie byc dowodca tej bandy. "+
   		"Caly czas pokrzykuje na swoich podwladnych, klnac przy tym " +
   		"niemilosiernie. ";
   
   switch(stan)
     {
       case BANDA_IDZIE: opis+="Znajduje sie na czele kolumny orkow.";
       			 break;
       case BANDA_ROZKLADA_OBOZ: opis+="Nadzoruje rozkladanie obozu.";
       			 break;
       case BANDA_ODPOCZYWA: opis+="Przechadza sie tam i z powrotem po obozie.";
       			 break;
       case BANDA_ZWIJA_OBOZ: opis+="Nadzoruje zwijanie obozu.";
       			 break;
       case BANDA_CZEKA: opis+="Jest bardzo zdenerwowany.";
       			 break;
       case BANDA_WALCZY: opis+="";
       			 break;
     }
   
   return opis+"\n";
}

int
czy_sa_tu(object kto)
{
   if (present(kto, ENTO)) return 1;
   return 0;
}

run_away()
{
   object ratownik,*wrogowie;
   ratownik=banda->kto_ratuje();
   if (!ratownik) return;
   wrogowie=query_enemy(-1);
   wrogowie=filter(wrogowie, czy_sa_tu);
   wrogowie->attack_object(ratownik);
   wrogowie->catch_msg(QCIMIE(TO,PL_MIA) + " wykrzykuje rozkaz i " +
   		QIMIE(ratownik,PL_MIA) + " zaslania go przed twymi ciosami!\n");   
   wrogowie->stop_fight(TO);
}


odpoczynek()
{
   ustaw_stan(BANDA_ODPOCZYWA);
}

koniec_walesania_sie()
{
   ustaw_stan(BANDA_ZWIJA_OBOZ);
}

set_banda(object b)
{
   banda=b;
}

object
query_banda()
{
   return banda;
}

ustaw_stan(int i)
{
   if (i==BANDA_IDZIE) 
      {
        if (banda->czy_ktos_szuka())
           {
              stan=BANDA_CZEKA;
              return;
           }
        else
           {
              ustaw_random_move(20.0);
           }
      }
   else
      {
        stop_rnd_move();
      }
   stan = i;
}

int
query_stan()
{
   return stan;
}

ustaw_random_move(float delay)
{
   if (!id) id = set_alarm(delay/4.0,delay,"ruch_bandy");
}

stop_rnd_move()
{
   remove_alarm(id);id=0;
}

ruch_bandy()
{
   mixed lokacje=ENTO->query_exit_rooms();
   
   if (stan==BANDA_WALCZY||banda->czy_walczymy()) return;
   
   ruch(lokacje);
}

ruch(mixed lokacje)
{
   int i=random(sizeof(lokacje));
   
   if (!sizeof(lokacje)) return;
   
   
   if (LOAD_ERR(lokacje[i])||lokacje[i]->query_prop(IMPERIUM_ROOM_I_NIE_DLA_BANDY))
      set_alarm(0.1,0.0,&ruch(lokacje-({lokacje[i]})) );
   else
      command(ENTO->query_exit()[3*i+1]); 
}

remove_object()
{
   if (stan!=BANDA_ZNIKA)
      banda->skasuj(this_object());
   ::remove_object();
}
attacked_by(object wrog)
{
   banda->zaatakowany(TO,wrog);
   ::attacked_by(wrog);
}

wspieraj(object kogo)
{
   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 Do ataku!");
         ustaw_stan(BANDA_WALCZY);
      }
}

aggressive_attack()
{
   object ob=(sizeof(query_to_attack())?query_to_attack()[0]:0);
   if (!ob||query_attack()==ob) return;
   
   ::aggressive_attack();
   if (query_attack()==ob)
      {
        command("krzyknij Do ataku!");
        banda->zaatakowany(TO,ob);
      }
}

czy_atakowac()
{
   return !TP->query_prop(IMPERIUM_I_CHAOS);
}
/*
init_living()
{
   if (!TP->query_prop(IMPERIUM_I_CHAOS)) set_alarm(1.3,0.0,&aggressive_attack(TP));
}*/

zachowaj_stan()
{
   if (stan!=BANDA_WALCZY)
   stan_byly = stan;
}

przywroc_stan()
{
   ustaw_stan(stan_byly);
}
czekaj()
{
   if (stan!=BANDA_WALCZY) ustaw_stan(BANDA_CZEKA);
}
notify_enemy_gone(object ob)
{
   banda->zwial(ob);
}
notify_you_killed_me(object ob)
{
   banda->zabilem(ob);
   command("wez monety z ciala");
}