/* Plik:          monster.c
 * Autor:         Silvy
 * Data:          14.10.97
 * Last update:   14.11.97
 * Opis:          Standardowy npc w domenie Imperium
 * Update:	  Dodanie funkcji umozliwiajacych klonowanie
 *		  npcow o okreslonych porach dnia i roku
 * 15.07.98 Umozliwienie ucieczki na wiecej niz jedna lokacje
 *          Zamaskowane funkcje run_away i set_whimpy
 */

inherit "/std/monster.c";

#include <macros.h>
#include <money.h>
#include "/d/Imperium/sys/alarm.h"

#define IMPERIUM_LIVING_I_INTRODUCING "_imp_liv_i_intro"

private static string *bronie = ({});
private static string *zbroje = ({});
private static mixed kiedy_npc = ({});
private mixed stare_miejsce = VOID;

int czy_npc_nie_wystepuje(string pora_d, string pora_r);

string jak_zpw = " umyka w poplochu.";
string jak_ps  = " przybywa.";
string jak_z   = " znika w poplochu.";

int ile_uciekamy, czy_chowac_sie;

void
ustaw_stare_miejsce(mixed l)
{
  stare_miejsce = l;
}


mixed
query_stare_miejsce()
{
  return stare_miejsce;
}



void
szykuj()
{
/*
    int i;
    object ob;

    for ( i = 0; i < sizeof(zbroje); i++ )
    {
        ob = clone_object(zbroje[i]);
        if (objectp(ob))
        {
            ob -> move(this_object(), 1);
            this_object()->command("zaloz " + ob->query_nazwa(3));
        }
    } 
    for ( i = 0; i < sizeof(bronie); i++ )
    {
        ob = clone_object(bronie[i]);
        if (objectp(ob))
        {
            ob -> move(this_object(), 1);
            command("dobadz " + ob->query_nazwa(1));
        }
    }                                                    
*/
}    

/*
    
void
add_armour(string sciezka)
{
    zbroje+=({sciezka});
}



void
add_weapon(string sciezka)
{
    bronie+=({sciezka});
}

*/

void
dodaj_miedz(int ile)
{
    MONEY_MAKE_CC(ile)->move(this_object());
}


void
dodaj_srebro(int ile)
{
    MONEY_MAKE_SC(ile)->move(this_object());
}


void
dodaj_zloto(int ile)
{
    MONEY_MAKE_GC(ile)->move(this_object());
}



int
czy_npc_nie_wystepuje(string pora_d, string pora_r)
{
  int j=0, jl, i=0, il = sizeof(kiedy_npc);
  if (!il)
    return 0;

  while ((--il >= 0)&&(kiedy_npc[il][0] != pora_r));
  if (il<0) return 1;
  jl = sizeof(kiedy_npc[il][1]);
  while ((--jl >=0)&&(kiedy_npc[il][1][jl] != pora_d));
  if (jl<0) return 1;
  return 0;
}

void
jak_pojawiac_sie(string jak)
{
    jak_ps = jak;
}

void
jak_znikac(string jak)
{
    jak_z = jak;
}

void
jak_znikac_podczas_walki(string jak)
{
    jak_zpw = jak;
}            

void
pora_znikac(string pora_d, mixed skad)
{
  // powiadommy innych ze nasz npc sie zbiera ....
  // miejmy nadzieje, ze z nikim nie walczy
  if (!query_attack())
  {
    tell_room(environment(this_object()), QCIMIE(this_object(), PL_MIA) +
        jak_z + "\n");
  }
  else
  {
    tell_room(environment(this_object()), QCIMIE(this_object(), PL_MIA) +
        jak_zpw + "\n");    
  }
  // przesuwamy naszego npc'a do pustki
  this_object()->move(VOID);
}

void
pora_pojawic_sie(string pora_d, mixed gdzie)
{
  // zawiadamiamy istoty w lokacji do ktorej przybedziemy....
  tell_room(gdzie, QCIMIE(this_object(), PL_MIA) + jak_ps + "\n");
  this_object()->move(gdzie);
}

public void 
czas(string s)
{
  object ob = environment(this_object());
  
  if (czy_npc_nie_wystepuje(s, VOID->pora_roku()))
  {

    if ((ob != VOID)&&ob)
    {
      stare_miejsce = ob;
      pora_znikac(s, ob);
    }
  }
  else
  if((ob == VOID)&&ob)
  {
      pora_pojawic_sie(s, stare_miejsce);
      stare_miejsce = VOID;
  }
}

void
ustaw_czas_wystepowania(mixed kiedy)
{
    kiedy_npc = kiedy;
    if (sizeof(kiedy))
    ALARM->dodaj_obiekt(this_object());
}



int
remove_object()
{
  if (sizeof(kiedy_npc))
    ALARM -> usun_obiekt(this_object());
  return ::remove_object();
}


mixed
query_czas_wystepowania()
{
  return kiedy_npc;
}

int
query_czy_dni_noce()
{
  if(sizeof(kiedy_npc[0][1]) == 9) return 1;
  if(sizeof(kiedy_npc) != 4) return 0;
  if(sizeof(kiedy_npc[3][1]) == 5) return 1;
  if(sizeof(kiedy_npc[3][1]) == 4) return 1;
  return 0;
}

public void
run_away()
{
    int i;
    for(i = 0; i < ile_uciekamy; i++)
     ::run_away();
    if(czy_chowac_sie)
      command("schowaj sie");
}                                                            

// Pozwala na ucieczke na wiecej niz 1 lokacje

public void
ustaw_whimpy(int flag, int ile = 1, int czy = 0)
{
    ile_uciekamy = ile;
    czy_chowac_sie = czy;
    ::set_whimpy(flag);
}

ret_intro_przed(object kto)
{

}

ret_intro_po(object kto)
{

}

return_intro(object kto)
{
   if (!kto) return;
   ret_intro_przed(kto);
   command("przedstaw sie " + OB_NAME(kto));
   ret_intro_po(kto);
}    

add_introduced(string imie)
{
   if (query_prop(IMPERIUM_LIVING_I_INTRODUCING))
      set_alarm(2.0,0.0,&return_intro(find_player(imie)));
}
