inherit "/d/Imperium/std/monster";

#include <macros.h>
#include <pl.h>
#include <const.h>
#include <stdproperties.h>

#define TO this_object()
#define ENTO environment(TO)
#define LOG_ATAK "/d/Imperium/private/nuln.attack.log"

static int jak_daleko=1;
private int al_ucieka=0,al_wraca=0;
static int is_returning=0;

nomask void
ustaw_jak_daleko(int i)
{
   jak_daleko=i;
}

string pom_nazwa(object ob,int przyp=0)
{
   if (interactive(ob)) return ob->query_name(przyp);
   return ob->query_nonmet_name(przyp);
}

dump_to_tigr(mixed co)
{
   set_this_player(find_player("tigr"));
   dump_array(co);
}

/*
nomask void
ustaw_czy_wraca(int bool)
{
   is_returning=bool;
}
*/
public void
create_mieszczanin_nuln()
{
   ustaw_nazwe(({ "mieszczanin", "mieszczanina", "mieszczaninowi",
       "mieszczanina", "mieszczaninem", "mieszczaninie" }),
       ({ "mieszczanie", "mieszczan", "mieszczanom", "mieszczan",
       "mieszczanami", "mieszczanach" }), PL_MESKI_OS);
   
   set_long("Standardowy mieszkaniec Nuln.\n");
   
   set_stats(({100,100,100,100,100,100}));
   
   set_gender(G_MALE);
   ustaw_odmiane_rasy(PL_CZLOWIEK);
   
   ustaw_jak_daleko(5);
}

nomask void
create_monster()
{
   create_mieszczanin_nuln();
   set_whimpy(99);
}

prowadz(int i, string * droga, object wrog, object oficer)
{
   if (objectp(wrog)&&objectp(oficer)&&present(wrog,ENTO)&&CAN_SEE(TO,wrog))
      {
         command("krzyknij To " + wrog->query_zaimek(0) + "!");
         command("wskaz " + OB_NAME(wrog));
         
         oficer->patrol_zaslon(TO,({wrog}));
         write_file(LOG_ATAK, ctime(time()) + " : " + TO->query_nonmet_name() + 
	" zaprowadzil" + koncowka("","a","o") + " gwardie i ta zaatakowala " + pom_nazwa(wrog,3)+".\n");
      }
   else 
      {
       if (i>-1) 
          {
             command(droga[i]);
             set_alarm(0.5,0.0,&prowadz(i-1,droga,wrog,oficer));
          }
       else
          {
             if (objectp(wrog)&&objectp(oficer))
                {
                   command("powiedz Zbiegl...");
                   command("usmiech przepra do " + OB_NAME(oficer));
                   oficer->notify_enemy_gone();
                   write_file(LOG_ATAK, ctime(time()) + " : " + TO->query_nonmet_name() + 
	" zaprowadzil" + koncowka("","a","o") + " gwardie lecz wrog zwial.\n");
                }
          }
      }
}

wroc_z(object oficer, string * droga, object wrog)
{
   if (!wrog||ENTO!=environment(oficer)) return;
   if (!(oficer->query_attack())) 
      {
         oficer->stop_patrol();
         
         if (present(wrog,ENTO)&&CAN_SEE(TO,wrog))
            {
               oficer->patrol_zaslon(TO,({wrog}));
               write_file(LOG_ATAK, ctime(time()) + " : " + TO->query_nonmet_name() + 
     " znalazl" +koncowka("","a","o")+" gwardie.\n");
               return;
            }
         if (sizeof(droga))
            {
               command("powiedz do " + OB_NAME(oficer) + " Mordercy!!! Zaatakowano mnie!!!");
               command("powiedz Zaprowadze tam!");
               oficer->set_follow(TO,0.1);
            }
         set_alarm(0.5,0.0,&prowadz(sizeof(droga)-1,droga,wrog,oficer));
      }
   else
     if (oficer->query_attack()!=wrog)
        set_alarm(10.0,0.0,&wroc_z(oficer,droga,wrog));
}

object
szukaj_oficera()
{
   object * inv=filter(all_inventory(ENTO),living);
   int pom=member_array(1,inv->query_oficer_nuln());
   
   if (pom<0) return 0;
   else return inv[pom];
}

string * obetnij_c(string *arr)
{
   int i;
   for (i=0;i<sizeof(arr);i++)
       {
          if (arr[i][strlen(arr[i])-2..strlen(arr[i])-1]==".c")
             arr[i]=arr[i][0..strlen(arr[i])-3];
       }
   return arr;
}

ucieka(int i,string * tam_bylem, string * sciezka, object wrog)
{
   string *lokacje=obetnij_c(ENTO->query_exit_rooms())-tam_bylem, 
   	  *exits=obetnij_c(ENTO->query_exit_rooms()),
   	  *cmds=ENTO->query_exit_cmds();
   string lok=file_name(ENTO);
   int pom;
   object pom1;
   
   if (!i||!sizeof(lokacje))
      {
        if (is_returning) al_wraca=set_alarm(600.0,0.0,&prowadz(sizeof(sciezka)-1,sciezka,0,0));
        write_file(LOG_ATAK, ctime(time()) + " : " + TO->query_nonmet_name() + 
     " nie znalazl" + koncowka("","a","o") + " gwardii.\n");
        return;
      }
   
   pom=random(sizeof(lokacje));
   pom=member_array(lokacje[pom],exits);
   
   if (pom>-1) command(cmds[pom]); else return;
   
   pom=member_array(lok,obetnij_c(ENTO->query_exit_rooms()));
   /* Zauwazmy, ze to juz inny ENTO */
   
   if (pom>-1) sciezka+=({ENTO->query_exit_cmds()[pom]});
   
   if ((pom1=szukaj_oficera())) wroc_z(pom1, sciezka,wrog);
      else set_alarm(1.0,0.0,&ucieka(i-1,tam_bylem+({lok}),sciezka,wrog));
   
}

attacked_by(object wrog)
{
   object pom;
   if (sizeof(get_alarm(al_ucieka))) return;   
   seteuid("silvy");
   write_file(LOG_ATAK, ctime(time()) + " : " + pom_nazwa(wrog) + 
     " zaatakowal"+wrog->koncowka("","a","o")+" " +TO->query_nonmet_name(PL_BIE) + "\n");
   if (pom=szukaj_oficera()) wroc_z(pom,({}),wrog);
   else
      al_ucieka=set_alarm(1.0,0.0,&ucieka(jak_daleko,({}), ({}),wrog ));
   ::attacked_by(wrog);

}

run_away()
{
   object pom,wrog=query_attack();
   if (sizeof(get_alarm(al_ucieka))) return;
   if (pom=szukaj_oficera()) wroc_z(pom,({}),wrog);
   else al_ucieka=set_alarm(1.0,0.0,&ucieka(jak_daleko,({}), ({}),wrog ));
}

do_die(object killer)
{
   ::do_die();
   write_file(LOG_ATAK, ctime(time()) + " : " + pom_nazwa(killer) + " zabil" +
   killer->koncowka("","a","o") + " " + TO->query_nonmet_name(3)+".\n"); 
}