/* plik:         napad.c
 * autor:        Silvy
 * data:         3.06.98
 * update:       3.06.98
 * opis:         Standardowy plik administrujacy napadem
 */

#pragma strict_types
#pragma save_binary
 
inherit "/d/Imperium/std/room.c";
// Najwygodniej jak bedzie to pomieszczenie - zawsze bede mogl
// tam isc, movnac jakichs npcow itd.

void loop_zabawy(int del, int delloop);

void reset_bandy();

void query_banda();

void czekamy(int od, int dodd, int faza_nastepna, string gdzie);

void napadamy(int faza);

int czy_walka(object kto);

void wykoncz(string *kogo);

string *bandastr = allocate(15);
object *banda = allocate(15);

string startujemy = "";

string *kogo_wykanczamy = ({""});

int nrczlonka = 0;

int ktora_faza = 1;

string *patrol = ({});

/*

Przyklad:

void
create_napad() 
{
    loop_zabawy(random(5000)+1000,random(5000)+1000); // argumenty dla tej funkcji to
                                          // ilosc sekund do pierwszego uruchomienia
                                          // ilosc sekund do kolejnych uruchomien
    set_czlonek(HOME + "npc/troll.c");
    set_czlonek(HOME + "npc/ork.c");
    set_czlonek(HOME + "npc/ork.c");
    set_czlonek(HOME + "npc/ork.c");  // argumenty dla tej funkcji to
                                      // sciezka do pliku danego bandyty
                                      // uwaga: najlepiej jakby szef byl na poczatku

    set_patrol({"n","n","s","s"});
    set_startujemy(HOME + "lokacje/plac.c");
    set_kogo_wykanczamy(({"czlowieka","krasnoluda","krasnoludke","elfa","elfke",
        "halflinga","halflinke"}));  // argument dla tej funkcji to array
                                     // bierniki tego kogo ma napad wykanczac
}
*/

void
create_napad()
{
}

void
create_imperium_room()
{
    set_short("Serce Wioski");
    set_long("Witamy w Sercu Napadu. Czuj sie jak "+
        "u siebie w domu.\n");
    create_napad();
}

// Specjalne fajerwerki na poczatek i koniec napadu.

void
na_poczatek()
{
}

void
na_koniec()
{
}

void
loop_zabawy(int del, int delloop)
{ 
    float a,b;
    
    reset_bandy();
    a = itof(del);
    b = itof(delloop);
    set_alarm(a,b,&napadamy(0));
}    

void
set_startujemy(string gdzie)
{
    startujemy = gdzie;
}

string
query_startujemy()
{
    return startujemy;
}    

void
set_patrol(string *pat)
{
    patrol = pat;
}

string
*query_patrol()
{
    return patrol;
}

object
*query_banda()
{
    return banda;
}    

void
set_czlonek(string sciezka)
{
    bandastr[nrczlonka] = sciezka;
    banda[nrczlonka] = clone_object(sciezka);
    banda[nrczlonka] -> move(this_object());
    nrczlonka++;
}    

object
query_czlonek(int ktory)
{
    return banda[ktory];
}

int
query_nrczlonka()
{
    return nrczlonka;
}    

void
set_kogo_wykanczamy(string *kogo)
{
    kogo_wykanczamy = kogo;
}

string
*query_kogo_wykanczamy()
{
    return kogo_wykanczamy;
}        

void
napadamy(int faza)
{
    int i = 0;

    if(faza == 0) 
    {
      reset_bandy();

      while(i < nrczlonka)
      {
        banda[i] -> move_living("M",startujemy);
        i++;
      }
      na_poczatek();
      set_alarm(10.0,0.0,&napadamy(1));
      wykoncz(kogo_wykanczamy);

      return;
    }
    
    if(faza == 999)
    {
      na_koniec();
      ktora_faza = 1;
    
      while(i < nrczlonka)
      {
        banda[i] -> move_living("M",this_object());
        i++;
      }
      return;
    }
    
    // W innych przypadkach
    
    if(ktora_faza == sizeof(patrol)+1) 
    {
      set_alarm(10.0, 0.0, &napadamy(999));
      return;
    }      
    
    wykoncz(kogo_wykanczamy);
    czekamy(0,nrczlonka-1,ktora_faza+1,patrol[ktora_faza-1]);

    ktora_faza++;
}    


void
reset_bandy()
{
  int i = 0;
  
  while(i < nrczlonka)
  {
    if(banda[i]) banda[i] -> remove_object();
    if(!banda[i]) 
    {
      banda[i] = clone_object(bandastr[i]);
      banda[i] -> move(this_object());
    }  
    i++;
  }  
  ktora_faza = 1;
} 

int
czy_walka(object kto)
{
    if(kto->query_attack()) return 1;
    return 0;
}    

void
czekamy(int od, int dod, int faza_nastepna, string gdzie)
{
    int ktory = od;

    while(!banda[ktory]) 
    {
      ktory++;
      if(ktory == dod+1) return; 
    }  
    if(czy_walka(banda[ktory]))
    {
      set_alarm(20.0,0.0,&czekamy(od,dod,faza_nastepna,gdzie)); 
      return;
    } 

    ktory = od;
    while(ktory < dod+1)
    {
      banda[ktory]->command(gdzie);
      ktory++;
    }  
    set_alarm(20.0,0.0,&napadamy(faza_nastepna));
    wykoncz(kogo_wykanczamy);

    return;
}        

void
wykoncz(string *kogo)
{
    int i = 0;
    int j = 0;

    j = random(sizeof(kogo));

    while(i < nrczlonka)
    {
        banda[i]->command("zabij " + kogo[j]);
        i++;
    }
}   

