/*  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;

#define IMPERIUM_I_BIJE_W_NULN "_imperium_i_bije_w_nuln"

//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 narzucona na nia szara peleryne.\n");
}
 
int
kto_atakuje(object ob)
{
   object wr = ob->query_attack();
   int ok = 0;

   if (wr->query_prop(IMPERIUM_LIVE_I_NULN_CITIZEN))
   {
       wr->add_prop(IMPERIUM_I_BIJE_W_NULN,3);
       ok = zaatakuj(ob);
   }
   else
   {
       if (random(2))
       {
           wr->add_prop(IMPERIUM_I_BIJE_W_NULN,3);
           ok = zaatakuj(wr, ob);
       }
       else
       {
           ob->add_prop(IMPERIUM_I_BIJE_W_NULN,3);
           ok = zaatakuj(ob, wr);
       }
   }
}


 
int
dobyta_bron(object ob)
{
     return sizeof(ob->query_weapon(-1));
}
 
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)))
   {
     ob->add_prop(IMPERIUM_I_BIJE_W_NULN,3);
     zaatakuj(ob);
   }
}
 

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)
      ob->add_prop(IMPERIUM_I_BIJE_W_NULN,ob->query_prop(IMPERIUM_I_BIJE_W_NULN)+1);       
      return 0;
    }

    if (!pom)
    {
      ob->add_prop(LIVE_O_WIELDED_WEAPON, this_object());
      set_alarm(20.0, 0.0, "wielded_weapons_al", ob);
    }
    
    
    nr = ob->query_prop(IMPERIUM_I_BIJE_W_NULN);

  switch (nr)
  {
    case 0 : ob->add_prop(LIVE_I_WIELDED_WEAPON, 1); 
      command("powiedz do "+ob->query_nazwa(PL_DOP)+
        " 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 do "+ob->query_nazwa(PL_DOP)+
        " Natychmiast opusc swoja bron!");
      break;
   
    case 2 : ob->remove_prop(LIVE_I_WIELDED_WEAPON);
      command ("powiedz do " + ob->query_nazwa(PL_DOP) +
       " Natychmiast opusc swoja bron. Masz trzy sekundy.");
  
      set_alarm(3.0, 0.0, "bron_zlozona", ob); break;
    default:
      if (nr = 3)
      {
        zaatakuj(ob);
      }
      ob->remove_prop(LIVE_I_WIELDED_WEAPON); break;
  }
      ob->add_prop(IMPERIUM_I_BIJE_W_NULN,ob->query_prop(IMPERIUM_I_BIJE_W_NULN)+1);       
  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(ob[i]->query_prop(IMPERIUM_I_BIJE_W_NULN) == 3)
      {
          ok = zaatakuj(ob[i]);
      }
    }
    if (dobyta_bron(ob[i]))
    {
      zloz_bron(ob[i]);
    }
    else
    {
      if (ob[i]->query_prop(LIVE_I_WIELDED_WEAPON))
      {
        command("powiedz do " + ob[i]->query_nazwa(PL_DOP)+
              " 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");
  ob->add_prop(IMPERIUM_I_BIJE_W_NULN,3);
  ::attack_object(ob);
}


void
attacked_by(object ob)
{
  command("dobadz broni");
  ob->add_prop(IMPERIUM_I_BIJE_W_NULN,3);
  ::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()
{
   reset_zolnierz();
}



void
do_die(object killer)
{
  object *ob = query_team();
  int i = sizeof(ob), pom;
  ::do_die(killer);
}

void
encounter(object ob)
{
    ::encounter(ob);
    ustaw_czy_walka(2.0);
}
