/*Plik: banda.c
 *Autor: Tigr
 *Data: 22.08.1998
 *Update: 22.08.1998
 *Opis: Obiekt, administrujacy banda orkow...
*/
inherit "/std/object";
#include "tigr.h"
#include "banda.h"
#include <composite.h>

#define DOWODCA PATH+"/npc/szef"
#define ORK PATH+"/npc/ork"
#define PLIK_NAMIOTU PATH+"/obj/namiot"
#define BANDA_LOG PATH + "/log/banda.log"
#define CZAS ctime(time())

#define CZAS_CHODZ (840.0 + itof(random(240)))
#define CZAS_ROZB_ZWI 30.0
#define CZAS_ODP (600.0 + itof(random(120)))

object *orkowie;
object namiot;
string start_loc=DEF_START_LOC;
object *czaty=({}),
       *wrogowie=({}),
       *wrog_tu=({});
float delay=0.0;
int id=0;

int
czy_jest_alarm()
{
   if (!id) return 0;
   return sizeof(get_alarm(id));
}

object
query_dowodca()
{
   if (!sizeof(orkowie)) return 0;
   if (!orkowie[0]) return 0;
   if (file_name(orkowie[0])==DOWODCA+"#"+OB_NUM(orkowie[0]))
      return orkowie[0];
   return 0;
}

object
gdzie_banda()
{
   if (!(query_dowodca())) return 0;
   return environment(query_dowodca());
}


create_object()
{
  ustaw_nazwe(  ({"banda","bandy","bandzie","bande","banda","bandzie"}),
  		({"bandy","band","bandom","bandy","bandami","bandach"}),
  		PL_ZENSKI);
  		
  set_long("@@dlugi_opis");
  
  add_prop(OBJ_I_WEIGHT, 1);
  add_prop(OBJ_I_VOLUME, 1);
  add_prop(OBJ_I_VALUE, 0);
  add_prop(OBJ_I_INVIS, 100);
  
  
}

orkowie_robia(object * ktorzy, string co)
{
   object *arr;
   int i;
   if (!sizeof(ktorzy)) return;
   if (!gdzie_banda()) return;
   
   arr=filter(all_inventory(gdzie_banda()),living);
   
   for (i=0;i<sizeof(arr);i++)
      {
         arr[i]->catch_msg(capitalize(FO_COMPOSITE_LIVE(ktorzy,arr[i],PL_MIA))
         	 + " " + co);
      }
}

ustaw_czaty()
{
   int ile,i;
   
   if (!orkowie) return;
   
   ile=sizeof(orkowie);
   
   if (!ile) return;
   
   i=1 + random(ile-1);
  
   czaty=({orkowie[i]});
   if (ile>6) 
      {
        if (i-1) 
           {
             czaty+=({orkowie[i-1]});
           }
        else 
           {
             czaty+=({orkowie[ile-1]});
           }
      }
}

clonuj_orkow()
{
  int ile,i;
  
  setuid();
  seteuid(getuid());
  
  ile = 4 + random(5);
  
  orkowie = allocate(ile);
  
  orkowie[0] = clone_object(DOWODCA);
  orkowie[0]->set_banda(this_object());
  
  for (i=1;i<ile;i++)
      {
         orkowie[i] = clone_object(ORK);
         orkowie[i]->set_banda(this_object());
         orkowie[0]->team_join(orkowie[i]);
      }
  ustaw_czaty();
  orkowie->ustaw_stan(BANDA_IDZIE);
  orkowie->szykuj();
  if (!czy_jest_alarm()) id = set_alarm(CZAS_CHODZ,0.0,"rozkladac_oboz");
  orkowie->move(start_loc,1);
  orkowie->command("emote przybywa.");
  write_file(BANDA_LOG, "Banda (" + file_name(TO) + ") utworzona: " + CZAS + "\n");
}

object
losuj_orka()
{
   if (!orkowie) return 0;
   if (sizeof(orkowie)<=1) return 0;
   return orkowie[1+random(sizeof(orkowie)-1)];
}

string
dlugi_opis()
{
   int i;
   string opis;
   
   if (!(this_player()->query_wiz_level())) return "Nie zauwazasz niczego takiego.\n";
   
   opis="Jest to obiekt administrujacy bandy orkow z Pustkowi Chaosu.\n";
   
   if (!sizeof(orkowie)) return opis+"W tej bandzie nie ma czlonkow.\n";
   
   opis+="W sklad tej bandy wchodza:\n";
   
   for (i=0;i<sizeof(orkowie);i++)
       {
          if (orkowie[i])
             { 
               opis+=capitalize(orkowie[i]->short(this_player(),PL_MIA)) + " ('" +
                   file_name(orkowie[i]) + "'),\n"
               +   "  jest w " + 
                   "'" + file_name(environment(orkowie[i])) + "', " + 
                   co_robi(orkowie[i]->query_stan()) + ".\n";
             }
             
       }
   
   return opis;
}

rozkladac_oboz()
{
  if (gdzie_banda()->query_prop(IMPERIUM_ROOM_I_NIE_MOZNA_ROZBIC_OBOZU))
     {
        if (!czy_jest_alarm()) id = set_alarm(20.0,0.0,"rozkladac_oboz");
        return;
     }
  
  query_dowodca()->command("krzyknij Stac, lajzy! Tu rozbijamy oboz!");
  
  losuj_orka()->command("krzyknij Tak jest, szefie!");
  
  orkowie->ustaw_stan(BANDA_ROZKLADA_OBOZ);
  gdzie_banda()->add_prop(IMPERIUM_ROOM_I_NIE_MOZNA_ROZBIC_OBOZU,1);
  orkowie_robia(orkowie-({query_dowodca()}),
     "zaczyna" +
     ( sizeof(orkowie-({query_dowodca()}))==1?"":"ja") +
     " rozstawiac namiot.\n",orkowie);
  if (!czy_jest_alarm()) id = set_alarm(CZAS_ROZB_ZWI,0.0,"odpoczynek"); 
//  write_file(BANDA_LOG, "Banda rozlozyla oboz: " + CZAS + "\n");
}

odpoczynek()
{
   namiot=clone_object(PLIK_NAMIOTU);
   namiot->ustaw_bande(TO);
   namiot->move(gdzie_banda(),1);
   orkowie_robia(orkowie-({query_dowodca()}),
      "skonczyl" +
      ( sizeof(orkowie-({query_dowodca()}))==1?"":"i") +
      " rozbijac namiot.\n",orkowie);
   orkowie->odpoczynek();
   if (!czy_jest_alarm()) id = set_alarm(CZAS_ODP,0.0,"zwijac_oboz");
}

zwijac_oboz()
{
   query_dowodca()->command("krzyknij Zwijamy oboz!!");
   orkowie->koniec_walesania_sie();
   losuj_orka()->command("krzyknij Rozkaz, szefie!");
   orkowie_robia(orkowie-({query_dowodca()}), 
      "zaczyna" +
      ( sizeof(orkowie-({query_dowodca()}))==1?"":"ja") +
      " zbierac namiot.\n",orkowie);
   ustaw_czaty();
   
   if (!czy_jest_alarm()) id = set_alarm(CZAS_ROZB_ZWI,0.0,"marsz");
}

marsz()
{
   gdzie_banda()->remove_prop(IMPERIUM_ROOM_I_NIE_MOZNA_ROZBIC_OBOZU);
   
   namiot->remove_object();
   orkowie_robia(orkowie-({query_dowodca()}),
      "zlozyl" +
      ( sizeof(orkowie-({query_dowodca()}))==1?"":"i") +
      " namiot.\n",orkowie);
//   write_file(BANDA_LOG, "Banda zwinela oboz: " + CZAS + "\n");   
   orkowie->ustaw_stan(BANDA_IDZIE);
   if (czy_ktos_szuka()) {delay=CZAS_CHODZ; return;}
   
   if (!czy_jest_alarm()) id = set_alarm(CZAS_CHODZ,0.0,"rozkladac_oboz");
}

dowodca_zszedl()
{
   remove_alarm(id);id=0;
   czaty=({});
   orkowie->nie_ma_dowodcy();
   write_file(BANDA_LOG,"Dowodca bandy (" + file_name(TO) + ") zginal: " + CZAS + "\n");
}

int
czy_sa_tu(object kto)
{
   if (!gdzie_banda()) return 0;
   if (present(kto,gdzie_banda())) return 1;
   return 0;
}

int
szuka(object ob)
{
   return (ob->query_stan() == BANDA_SZUKA_KOLEGOW);
}

int
czy_ktos_szuka()
{
   return sizeof(filter(orkowie,szuka));
}

update_wrogow()
{
   mixed sa_tu;
   
   sa_tu=filter(wrogowie,czy_sa_tu);
   
   if (!sizeof(sa_tu))
      {
        orkowie->przywroc_stan();
        switch(query_dowodca()->query_stan())
          {
             case BANDA_IDZIE: if (!czy_jest_alarm()) id = set_alarm(delay,0.0,"rozkladac_oboz");
             			break;
             case BANDA_ODPOCZYWA: if (!czy_jest_alarm()) id = set_alarm(delay,0.0,"zwijac_oboz");
             			break;
             case BANDA_ZWIJA_OBOZ: if (!czy_jest_alarm()) id = set_alarm(delay,0.0,"marsz");
             			break;
             case BANDA_ROZKLADA_OBOZ: if (!czy_jest_alarm()) id = set_alarm(delay,0.0,"odpoczynek");
          }
      }
   else 
      {
         query_dowodca()->aggressive_attack(sa_tu[0]);
      }
} 

int
moze_walesac_sie(string lokacja)
{
   mixed lokacje = gdzie_banda()->query_exit_rooms();
   
   if (LOAD_ERR(lokacja) || lokacja->query_prop(IMPERIUM_ROOM_I_NIE_DLA_BANDY)) return 0;
   
   if (!query_dowodca()) return 1;
   
   return member_array(lokacja,lokacje)+1;
}

szukam_kolegow(object ork)
{
   if (gdzie_banda())
      (orkowie-({ork}))->czekaj();
}

dolaczylem(object ork)
{
   if (query_dowodca()->query_stan()==BANDA_WALCZY) 
      {
         ork->wspieraj(query_dowodca());
         return;
      }
   if (sizeof(filter(orkowie,szuka))) return ;
   orkowie->ustaw_stan(BANDA_IDZIE);
   if (!czy_jest_alarm()) id=set_alarm(delay,0.0,"rozkladac_oboz");
}

skasuj(object ork)
{
   int i;
   
   if ((i=member_array(ork,orkowie))==-1) return;
   
   if (ork==query_dowodca()) dowodca_zszedl();
   
   orkowie = orkowie - ({orkowie[i]});
   
   if (!sizeof(orkowie)) 
      {
        write_file(BANDA_LOG, "Banda (" + file_name(TO) + ") skonala: " + CZAS + "\n");
        remove_object();
      }
}

wspieramy(object kogo)
{
   (orkowie-({kogo}))->wspieraj(kogo);
}

int
czy_walczymy()
{
   return (sizeof(wrog_tu)>0);
}

zaatakowany(object ork,object wrog)
{
   
   if (member_array(ork,orkowie)>-1)
      {
         if (!query_dowodca()) return;
         //if (query_dowodca()->query_stan()==BANDA_WALCZY) return;
         write_file(BANDA_LOG,
              "Zaatakowany: " + file_name(ork) + " przez: " +
              capitalize(wrog->query_real_name(PL_BIE)) + "\n");
         if (environment(ork)==gdzie_banda())
            {
             if (id)
                {
                  if (sizeof(get_alarm(id)))
                     delay = get_alarm(id)[2];
                   else delay = 5.0;
                   orkowie->wracamy();
                   orkowie->zachowaj_stan();
                   remove_alarm(id);id=0;
                }
             set_alarm(0.5,0.0,&wspieramy(ork));
             //orkowie->ustaw_stan(BANDA_WALCZY);
             //ork->ustaw_stan(BANDA_WALCZY);
            }
         if (member_array(wrog,wrogowie)==-1)
            wrogowie += ({wrog});
         if (member_array(wrog,wrog_tu)==-1)
            wrog_tu+=({wrog});
      }
}



zabilem(object kogo)
{
   if (member_array(kogo,wrog_tu)==-1) return;
   if (!query_dowodca()) return;
   wrog_tu=(wrog_tu-({kogo}));
   wrogowie=(wrogowie-({kogo}));
   write_file(BANDA_LOG, "Banda (" + file_name(TO) + ") zabila\n" + 
       capitalize(kogo->query_real_name(PL_BIE)) +
       " (" + file_name(kogo) + ")\n");
   set_alarm(1.0,0.0,&update_wrogow());
}

zwial(object kto)
{
   if (member_array(kto,wrog_tu)==-1) return;   
   if (!query_dowodca()) return;   
   if (kto) write_file(BANDA_LOG, capitalize(kto->query_real_name(PL_MIA)) +
       " (" + file_name(kto) + ") uciekl\nbandzie (" + file_name(TO) + ") .\n");
   
   wrog_tu=(wrog_tu-({kto}));
   update_wrogow();
}

set_start_loc(string s)
{
   start_loc = s;
   
   if (find_object(s))
      {
         if (find_object(s)->query_prop(IMPERIUM_ROOM_I_NIE_DLA_BANDY))
            start_loc = DEF_START_LOC;
      }
}

string
query_start_loc()
{
  return start_loc;
}

mixed query_czaty()
{
  return czaty;
}

int query_na_czatach(object ork)
{
  return member_array(ork,czaty)+1;
}

remove_object()
{
   remove_alarm(id);id=0;
   orkowie->command("emote znika stad.");
   orkowie->ustaw_stan(BANDA_ZNIKA);
   orkowie->remove_object();
   
   ::remove_object();
}

mixed
query_orkowie()
{
   return orkowie;
}

int
query_stan(object ork)
{
   if (!ork) return -1;
   return ork->query_stan();
}

mixed
query_wrogowie()
{
   return wrogowie;
}
float
query_delay()
{
   return delay;
}

object
kto_ratuje()
{
   object *sa_tu;
   int i;
   
   sa_tu=filter(orkowie,czy_sa_tu)-({query_dowodca()});
   if (!sizeof(sa_tu)) return 0;
   i=random(sizeof(sa_tu));
   
   return sa_tu[i];
}

int
nasz_ork(object ork)
{
   return member_array(ork,orkowie)+1;
}