/*  Patrol dowolnych  obiektow (?!), napisane przez Alfena
*   obiekt dzidziczy po object.c
*   dowodca patrolu musi dziedziczyc po patrol.c
*/

#include "local.h"
#include "alfen.h"


private mixed *patrol=({});
private object dowodca=0;
private string str_dowodca=0;
private string *str_patrol=({});

private int p_czas=0;
private int patrol_w_ruchu=0;
private mixed p_trasa=({});
private mixed pocz_patrolu=({});



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();
mixed *query_grupa_patrolujaca();
mixed query_poczatek_patrolu();
int patrol_w_terenie();




int
patrol_w_terenie()
{
  return patrol_w_ruchu;
}


void
dodaj_patrolujacego(string s)
{
  object ob;
  
  seteuid(getuid());
  ob=clone_object(s);
  
  str_patrol+=({s});
  patrol+=({ob});
/*
  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)
{
  seteuid(getuid());
  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");
}


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(mixed s)
{
  int i;
  pocz_patrolu = s;
  if (dowodca)
  {
    dowodca -> set_patrol_time(p_czas);
    dowodca -> set_patrol_path(p_trasa);
    dowodca -> move_living("M",s);
  }
  if (!sizeof(patrol))
    return ;
  patrol->move_living("M",s);
}



mixed
query_poczatek_patrolu()
{
  return pocz_patrolu;
}


mixed *
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;
  
  seteuid(getuid());
  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_living("M",query_poczatek_patrolu());
    ok = 1;
  }
  
  for (i=0; i < sizeof(patrol); i++)
    if (!patrol[i])
    {
      log_file("patrol","brak patrolujacego\n");
      patrol[i] = clone_object(str_patrol[i]);
      dowodca -> team_join ( patrol[i]);
      patrol[i]->szykuj();
      patrol[i]->command("opusc bron");
      patrol[i]->move_living ("M",query_poczatek_patrolu());
    }
    else
      if (ok)
        dowodca->team_join(patrol[i]);
  
    if ((patrol_w_ruchu)&&ok)
      uruchom_patrol();
}


void
remove_patrol()
{
  if (dowodca)
    dowodca->remove_object();
  if (sizeof(patrol))
    patrol->remove_object();
}
