/*  Patrol dowolnych  obiektow (?!), napisane przez Alfena
*   obiekt dzidziczy po object.c
*   dowodca patrolu musi dziedziczyc po patrol.c
*/

#include "local.h"
#include "alfen.h"
//  #include "silvy.h"


inherit "/std/object.c";

object *patrol;
object dowodca;
string str_dowodca;
string *str_patrol;
int p_czas;
int patrol_w_ruchu;
mixed p_trasa;
string pocz_patrolu;

int patrol_id;


void ustaw_dowodce_patrolu(string s);
void dodaj_patrolujacego(string s);
void ustaw_czas_patrolowania(int czas);
void ustaw_trase_patrolu(mixed trasa);
void poczatek_patrolu(string s);

void uruchom_patrol();
void zatrzymaj_patrol();

mixed query_trasa_patrolu();
int query_czas_patrolowania();
object query_dowodca_patrolu();
string *query_grupa_patrolujaca();
string query_poczatek_patrolu();
int patrol_w_terenie();



void
create_patrol()
{
/*
  int i;
  
  ustaw_dowodce_patrolu(NPATH + "npc/oficer_gwardii.c");
  for (i=0; i<5; i++)
    dodaj_patrolujacego(NPATH + "npc/gwardzista.c");
  
  // przykladowa trasa - oczywiscie nie istnieje. liczba oznacza liczbe sekund
  // jaka patrol bedzie czekal na dane zdarzenie
  ustaw_trase_patrolu(({"n","n"}));
    
  ustaw_czas_patrolowania(40); //liczba sekund jaka patrol bedzie
    			       // znajdowal sie w lokacji
*/
}

void
create_object()
{
  int i;
  
  patrol_id = p_trasa =0;
  patrol = ({});
  patrol_w_ruchu = str_dowodca = 0;
  dowodca = 0;
  pocz_patrolu = p_czas =0;
  str_patrol = ({});
  seteuid(getuid());
  enable_reset();
  create_patrol();
  
}



int
patrol_w_terenie()
{
  return patrol_w_ruchu;
}


void
dodaj_patrolujacego(string s)
{
  str_patrol+=({s});
  patrol+=({clone_object(s)});
  log_file("patrol",sprintf("%O %O dodaj patrolujacego\n",this_object(), 
    patrol[sizeof(patrol)-1]));
  dowodca ->team_join(patrol[sizeof(patrol)-1]);
  patrol[sizeof(patrol)-1]->szykuj();
  patrol[sizeof(patrol)-1]->command("opusc bron");
}


void
ustaw_dowodce_patrolu(string s)
{
  str_dowodca=s;
  dowodca = clone_object(s);
  log_file("patrol", sprintf("%O %O ustaw_dowodce_patrolu\n",this_object(),
    dowodca));
  dowodca -> szykuj();
  dowodca -> command("opusc bron");
//  dowodca -> set_p(this_object());
}


object
query_dowodca_patrolu()
{
  return dowodca;
}


void
ustaw_czas_patrolowania(int czas)
{
  p_czas = czas;
  if (dowodca)
    dowodca->set_patrol_time(czas);
}


int
query_czas_patrolowania()
{
  return p_czas;
}


void
ustaw_trase_patrolu(mixed trasa)
{
  p_trasa = trasa;
  if (dowodca)
    dowodca -> set_patrol_path (trasa);
}


mixed
query_trasa_patrolu()
{
  return p_trasa;
}


void
poczatek_patrolu(string s)
{
  int i;
  pocz_patrolu = s;
  if (dowodca)
    dowodca -> move(s);
  if (!patrol)
    return ;
  patrol->move(s);
}



string
query_poczatek_patrolu()
{
  return pocz_patrolu;
}


object*
query_grupa_patrolujaca()
{
  return patrol;
}


void
uruchom_patrol()
{ 
  if (dowodca)
  {
    dowodca -> start_patrol();
    patrol_w_ruchu =1;
  }
}


void
zatrzymaj_patrol()
{
  if (dowodca)
  {
    dowodca->stop_patrol();
    patrol_w_ruchu = 0;
  }
}


void
reset_patrol()
{
  int i, ok;
  
  if (!pocz_patrolu)
    return ;
  ok = 0;
  if (!dowodca) {
    ustaw_dowodce_patrolu(str_dowodca);
    log_file("patrol","brak dowodcy\n");
    ustaw_trase_patrolu(query_trasa_patrolu());
    ustaw_czas_patrolowania(query_czas_patrolowania());
    dowodca -> szykuj();
    dowodca -> command("opusc bron");
    dowodca -> move(query_poczatek_patrolu());
  //  dowodca -> set_p(this_object());
    ok = 1;
  }
  
  for (i=0; i < sizeof(patrol); i++)
    if (!patrol[i])
    {
      log_file("patrol","brrak patrolujacego");
      patrol[i] = clone_object(str_patrol[i]);
      dowodca -> team_join ( patrol[i]);
      patrol[i]->szykuj();
      patrol[i]->command("opusc bron");
      patrol[i]->move(query_poczatek_patrolu());
    }
    else
      if (ok)
        dowodca->team_join(patrol[i]);
  
    if ((patrol_w_ruchu)&&ok)
      uruchom_patrol();
}


void
reset_object()
{
  reset_patrol();
}

void
remove_object()
{
  if (dowodca)
    dowodca->remove_object();
  if (sizeof(patrol))
    patrol->remove_object();
  ::remove_object();
}
