/*  Zolnierz Imperium
 *  napisane przez Alfena, obiekt dziedziczy obiekt zol.c
 *
 */
 
#include "alfen.h"
#include <filter_funs.h>
#include "local.h"
 
inherit LPATH + "zol.c";

int bron_zlozona_id;
int wielded_weapon_id;


#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");
   
   
 }
 
 
 void
 kto_atakuje(object ob)
 {
   string s1, s2;
   object wr = ob->query_attack();
   
   s1=function_exists("create_zolnierz", ob);
   s2=function_exists("create_zolnierz", wr);
   
   command("krzyknij Zaprzestac walki!! Rzucic bron!!");
   
   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
   {
     if (wr->query_prop(IMPERIUM_LIVE_I_NULN_CITIZEN))
     {
       command("zabij "+ob->query_nazwa(PL_BIE));
     }
     else
     {
       if (random(2))
       {
             command("zabij "+wr->query_nazwa(PL_BIE));
       }
       else
       {
             command("zabij "+ob->query_nazwa(PL_BIE));
       }
     }
   }
 }


 
 int
 dobyta_bron(object ob)
 {
   int i, ok, pom;
   object *inv = all_inventory(ob);
   
//   if (function_exists("create_zolnierz", ob))
//     return 0;
     

   if (!inv)
     return 0;
     
   pom = sizeof(inv);
   
   ok =0;
   for (i=0; (i < pom)&&!ok; i++)
     if (inv[i]->query_wielded())
     {
       ok=1;
     }
   return ok;
 }
 
 
 void
 bron_zlozona(object ob)
 {
   bron_zlozona_id =0;
   if (!dobyta_bron(ob))
   {
     command("powiedz Prosze przestrzegac prawa");
     return ;
   }
   command("krzyknij Zaraz Cie naucze przestrzegac prawa!");
   command("zabij "+ob->query_nazwa(PL_BIE));
 }
 
 
 void
 wielded_weapon_al(object ob)
 {
   ob->remove_prop(LIVE_O_WIELDED_WEAPON);
 }
 
     
 void 
 zloz_bron(object ob)
 {
   object pom=ob->query_prop(LIVE_O_WIELDED_WEAPON);

   if (pom)
     return 0;
   
   ob->add_prop(LIVE_O_WIELDED_WEAPON, this_object());
   set_alarm(10.0, 0.0, "wielded_weapon_al", ob);

   switch (ob->query_prop(LIVE_I_WIELDED_WEAPON))
   {
     case 0 : 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 2 : 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:
       ob->remove_prop(LIVE_I_WIELDED_WEAPON); break;
   }
 }
 
 
 int
 czy_obcy(object ob)
 {
   return !ob->query_prop(IMPERIUM_LIVE_I_NULN_CITIZEN);
 }
 
 
 void 
 czy_walka()
 {
   int ok, i, ilosc;
   object *ob, pom;
   
   if (!objectp(pom =environment()))
     return ;
   
   ob = FILTER_LIVE(all_inventory(pom));
   ob = filter(ob, czy_obcy);
   
   ob -= ({this_object()});
   if (query_team_others())
     ob -= ({query_team_others()});

   ilosc = sizeof(ob);
   if (!ilosc)
     return 0;

   ok =0;
   for(i=0; (i < ilosc)&&!ok; i++)
   {
     if (ob[i]->query_attack())
     { 
       ok = 1;
       kto_atakuje(ob[i]);
     }

     if (dobyta_bron(ob[i]))
     {
       zloz_bron(ob[i]);
     }
   }
    
 }
 
 
 
void 
walka_zakonczona()
{
   if (query_attack())
     return;

       
   usun_walka_zakonczona();
   ustaw_czy_walka();
   
   command ("opusc bron");
   command ("powiedz Rozejsc sie! Nie robic zbiegowiska!");
}


void
attack_object(object ob)
{
  command ("dobadz broni");
  ::attack_object(ob);
}


void
attacked_by(object ob)
{
  command("dobadz broni");
  ::attacked_by(ob);
}