/*  Zolnierz Imperium
 *  napisane przez Alfena, obiekt dziedziczy obiekt zol.c
 *
 */
 
#include <filter_funs.h>
#include "local.h"
#include <pl.h> 
#include "zol.h"
inherit LPATH + "zol.c";


int bron_zlozona_id;
int wielded_weapon_id;

private static mixed pamiec=({  ({}), ({}), ({}) });

int zapamietaj_gracza(object gracz, int poziom = 2);
int query_zapamietany(object ob);


#define LIVE_I_WIELDED_WEAPON "_live_i_wielded_weapon_"
#define LIVE_O_WIELDED_WEAPON "_live_o_wielded_weapon_"

#define G ({ ({"gwardzista", "gwardzisty", "gwardziscie", "gwardziste",\
	       "gwardzista", "gwardziscie"}),\
	     ({"gwardzisci", "gwardzistow", "gwardzistom", "gwardzistow",\
	       "gwardzistami", "gwardzistach"}) })
 
 
 void 
 create_zolnierz()
 {
   bron_zlozona_id = 0;
   ustaw_nazwe( G[0], G[1], PL_MESKI_OS);
   ustaw_krotki_opis ( G[0], G[1], PL_MESKI_OS);
   
   set_long ("Czlowiek ten nalezy do gwardii miejskiej. "+
     "Ubrany jest w kolczuge oraz nazucona na nia szara peleryne.\n");
	
   
 }
 
 
 int
 query_zapamietany(object ob)
 {
   string name = ob -> query_nazwa(PL_MIA);
   
   return (member_array(name, pamiec[0]));
 }
 
 
 int
 kto_atakuje(object ob)
 {
//   string s1, s2;
   object wr = ob->query_attack();
   int ok = 0;
#if 0   
   s1=function_exists("create_zolnierz", ob);
   s2=function_exists("create_zolnierz", wr);
#endif
   
   command("krzyknij Zaprzestac walki!! Rzucic bron!!");
   
#if 0   
   if (ob->query_prop(IMPERIUM_LIVE_I_NULN_CITIZEN))
   {
     if (wr->query_prop(IMPERIUM_LIVE_I_NULN_CITIZEN))
     {
       if ((s1)&&(s2))
       {
           command("krzyknij Natychmiast zaprzestac walki!");
           command("powiedz Gwardia winna dawac przyklad.");
       }
       else
       {
         if (s2)
           command("zabij " + ob->query_nazwa(PL_BIE));
         else
         {
           if (s1)
             command ("zabij " +wr->query_nazwa(PL_BIE));
           else
           {
             if (random(2))
               command("zabij " +ob->query_nazwa(PL_BIE));
             else
               command("zabij "+wr->query_nazwa(PL_BIE));
           }
         }
       }
     }
     else
     {
           command("zabij "+wr->query_nazwa(PL_BIE));
     }
   }
   else
#endif
   {
     if (wr->query_prop(IMPERIUM_LIVE_I_NULN_CITIZEN))
     {
       zapamietaj_gracza(ob, -1);
       ok = zaatakuj(ob);
       
//       command("zabij "+ob->query_nazwa(PL_BIE));
     }
     else
     {
       if (random(2))
       {
       		zapamietaj_gracza(wr, -1);
       		ok = zaatakuj(wr);
//             command("zabij "+wr->query_nazwa(PL_BIE));
       }
       else
       {
       		zapamietaj_gracza(ob, -1);
       		ok = zaatakuj(ob);
//             command("zabij "+ob->query_nazwa(PL_BIE));
       }
     }
   }
   return ok;
 }


 
 int
 dobyta_bron(object ob)
 {
     return sizeof(ob->query_weapon(-1));
 }
 
 
 void
 usun_z_pamieci(string name)
 {
   int index=member_array(name, pamiec[0]);
   
   if (index!=-1)
   {
     pamiec[0] = exclude_array(pamiec[0], index, index);
     pamiec[1] = exclude_array(pamiec[1], index, index);
     pamiec[2] = exclude_array(pamiec[2], index, index);
   }
 }
 
 
 int
 zapamietaj_gracza(object gracz, int poziom = 2)
 {
   int index;
   
   if ((index=member_array(gracz->query_nazwa(), pamiec[0]))==-1)
   {
     pamiec[0] += ({gracz->query_nazwa()});
     pamiec[1] += ({poziom});
     pamiec[2] += ({time()});
     index = (sizeof(pamiec[0])-1);
   }
   return index;
 }
 
 
 void
 bron_zlozona(object ob)
 {
   bron_zlozona_id =0;
   if (!dobyta_bron(ob))
   {
     ustaw_czy_walka(5.0);
     command("powiedz Prosze przestrzegac prawa.");
     return ;
   }
   command("krzyknij Zaraz Cie naucze przestrzegac prawa!");
   if (command("zabij "+ob->query_nazwa(PL_BIE)))
   {
     zaatakuj(ob);
     usun_z_pamieci(ob->query_nazwa());
   }
 }
 
 
 void
 wielded_weapon_al(object ob)
 {
   ob->remove_prop(LIVE_O_WIELDED_WEAPON);
 }
 
     
 int 
 zloz_bron(object ob)
 {
     int nr = ob->query_prop(LIVE_I_WIELDED_WEAPON);
     object pom = ob->query_prop(LIVE_O_WIELDED_WEAPON);
     int index;

     if ((pom != this_object())&&pom)
     {
       if (random(100, time()) < 20)
         zapamietaj_gracza(ob);
       return 0;
     }

     if (!pom)
     {
       ob->add_prop(LIVE_O_WIELDED_WEAPON, this_object());
       set_alarm(20.0, 0.0, "wielded_weapons_al", ob);
     }
     
     
     index = zapamietaj_gracza(ob);
     nr = pamiec[1][index]--;

   switch (nr)
   {
     case 2 : ob->add_prop(LIVE_I_WIELDED_WEAPON, 1); 
       command("powiedz "+ob->query_nazwa(PL_CEL)+
         " Prosze sie zastosowac do praw panujacych w tym miescie "+
         "i opuscic bron!"); 
       break;
     
     case 1 : ob->change_prop(LIVE_I_WIELDED_WEAPON,2);
       command("powiedz "+ob->query_nazwa(PL_CEL)+
         " Natychmiast opusc swoja bron!");
       break;
    
     case 0 : ob->remove_prop(LIVE_I_WIELDED_WEAPON);
       command ("powiedz " + ob->query_nazwa(PL_CEL) +
        " Natychmiast opusc swoja bron. Masz trzy sekundy.");
   
       set_alarm(3.0, 0.0, "bron_zlozona", ob); break;
     default:
       if (nr < 0)
       {
         command("krzyknij W miescie nie mam miejca dla mordercow !");
         zaatakuj(ob);
//         command("zabij " + ob->query_nazwa(PL_BIE));
       }
       ob->remove_prop(LIVE_I_WIELDED_WEAPON); break;
   }
   return (!nr);
 }
 
 
 int
 czy_obcy(object ob)
 {
   return (interactive(ob)&&!ob->query_prop(IMPERIUM_LIVE_I_NULN_CITIZEN)&&
     ob->check_seen(this_object()));
 } 
 
 
 void 
 czy_walka()
 {
   int tmp;
   int ok, i, ilosc, walka = 0;
   object *ob, pom;
   
   if (!objectp(pom =environment()))
     return ;
   
   ob = filter(all_inventory(pom), czy_obcy);

   ilosc = sizeof(ob);
   if (!ilosc)
     return 0;

   ok = 0;
   for(i=0; (i < ilosc)&&!ok; i++)
   {
     if (ob[i]->query_attack())
     { 
       ok = kto_atakuje(ob[i]);
     }
     else
     {
       if ((tmp=query_zapamietany(ob[i]))!=-1)
       {
         if (pamiec[1][tmp]<0)
         {
           command("krzyknij Morderco nie ujdziesz sprawiedliwosci !");
           ok = zaatakuj(ob[i]);
//           command("zabij "+ob[i]->query_nazwa(PL_BIE));
         }
       }
     }
     if (dobyta_bron(ob[i]))
     {
       zloz_bron(ob[i]);
     }
     else
     {
       if (ob[i]->query_prop(LIVE_I_WIELDED_WEAPON))
       {
         command("powiedz " + ob[i]->query_nazwa(PL_CEL)+
               " Dziekuje za zastosowanie sie do praw panujacych w "+
               "naszym miescie.");
         ob[i]->remove_prop(LIVE_I_WIELDED_WEAPON);
       } 
     }
   }
   if (!ok)
     ustaw_czy_walka(15.0);
 }
 
 
 
void 
walka_zakonczona()
{
  int ran = random(3, time());
  
   if (query_attack())
   {
     ustaw_walka_zakonczona(5.0);
     return;
   }

       
   ustaw_czy_walka(5.0);
   
   command ("opusc bron");
   switch (ran)
   {
     case 0	:	command ("powiedz Rozejsc sie! Nie robic zbiegowiska!");
        		break;
     case 1	:	command("powiedz Rozejsc sie !");
     			break;
     case 2	:	command("powiedz Nie robic zbiegowiska !");
     			break;
     default:
        command("powiedz Koniec zabawy, rozejsc sie !");
   }
}


void
attack_object(object ob)
{
  command ("dobadz broni");
  ::attack_object(ob);
}


void
attacked_by(object ob)
{
  command("dobadz broni");
  ::attacked_by(ob);
}


void
init_living()
{
  ::init_living();
  if (walka_al && interactive(this_player()))
    ustaw_czy_walka(5.0);
}


void
reset_zolnierz()
{
}



void
reset_monster()
{
  int i, il = sizeof(pamiec[0]);
  
  i = time();
  while (--il>=0)
  {
    if ((i-pamiec[2][il])>(900))
      usun_z_pamieci(pamiec[0][il]);
  }
  reset_zolnierz();
}



void
do_die(object killer)
{
  object *ob = query_team();
  int i = sizeof(ob), pom;
/*
  if (i)
  {
  while(--i>=0)
    team_leave(ob);
  
  i = sizeof(ob);
  --i;
  pom = i;
  while (--i>=0)
    ob[pom]->team_join(ob[i]);
  ob[pom]->uruchom_czy_walka(1);
  }
  */
  ::do_die(killer);
}


void
notify_you_killed_my(object ob)
{
  usun_z_pamieci(ob->query_nazwa(PL_MIA));
}
