/*
 * Dylizans made by Elvaron, poprawione przez Alfena
 *
 * Obiekt ten powinien byc dziedziczony czyli inherit
 * inne sposoby uzywania sa nie wskazane. Jezeli nie zamierzasz tego
 * obiektu inheritowac zapytaj sie najpierw swojego lorda.
 *
 * tutaj sa funkcje sluzace do konfiguracji obiektu
 *
 * void create_dylizans utworz ta funkcje aby skonfigurowac dylizans.
 *
 */


#include "local.h"
#include <pl.h>
#include <stdproperties.h>
#include <macros.h>
#include <filter_funs.h>

#define TP this_player()
#define TO this_object()

inherit "/std/container";
inherit "/lib/trade";


private static int price=0;
private static int jedzie=0;
private static int dr_poz=-1;
private static int dylizans_al_id=0;
private static mixed *droga=({}); 
private static float czas_ruchu=0.0;
private static float czas_postoju=0.0;
private static mixed wnetrze;
private static mixed events;
private int events_id;
private static float start_ev, repeat_ev;
private static object woznica;
private static string s_woznica;
private static int pojemnosc = 4;



/* predefinicje funkcji */
void ustaw_wnetrze_dylizansu(string s){wnetrze = s;
					if (!find_object(wnetrze))
					    LOAD_ERR(wnetrze);
				       wnetrze->ustaw_dylizans(TO);}
void ustaw_woznice(string s);
void ustaw_cene_biletu(int i);
void ustaw_trase_dylizansu(mixed tr);
void ustaw_czas_ruchu(int c);
void ustaw_czas_postoju(int c);
void set_events_on(int i);
void clear_events();
void add_event(string s);
void ustaw_zdarzenia_podczas_drogi();
void ustaw_zdarzenia_na_postoju();
void set_event_time(float s, float r);
void ustaw_pojemnosc_dylizansu(int p){pojemnosc = p;}
int ustaw_krotki_opis();

int query_pojemnosc_dylizansu(){return pojemnosc;}
object query_woznica(){return woznica;}
string query_wnetrze_dylizansu(){return wnetrze;}
float query_czas_postoju();
float query_czas_ruchu();
int query_cena_biletu();
mixed query_trasa_dylizansu();
int query_pozycja_dylizansu();
int query_jedzie(){return jedzie;}





void
ustaw_woznice(string s)
{
  s_woznica = s;
  woznica = clone_object(s);
}






/*
 * Funkcja:	ustaw_czas_ruchu
 * Argumenty:	c - czas przebywania dylizansu w lokacji
 * Opis:	Ustawia czas przebywania dylizansu w lokacji w sekundach
 */
void
ustaw_czas_ruchu(int c)
{
  czas_ruchu = itof(c);
}


void
ustaw_cene_biletu(int i)
{
  price = i;
  if (i < 1)
    price = 0;
}


int
query_cena_biletu()
{
  return price;
}



/*
 * Funkcja:	ustaw_trase_dylizansu
 * Argumenty:	tr - tablica zawierajaca stringi i int
 * Opis:	Ustawia trase, po ktorej bedzie podrozowal nasz
 *		dylizans. Tablica moze zawierac kierunki ruchu lub wywolanie
 *		VBFC. Liczby oznaczaja odpowiednio:
 *		0 : postoj
 *		>0 : opoznienie
 * Przyklad:	ustaw_trase_dylizansu(({0,"n","n",12,"n","
 *			pole",0}));
 *		ustaw_trase_dylizansu(({0,"@@rozdroze","n","e"}));
 *		ustaw_trase_dylizansu(({0,"ne","n",0});
 *		
 */
void
ustaw_trase_dylizansu(mixed tr)
{
  string *foo=({"n","s","e","w","u","d","ne","nw","se","sw"});
  string *kier = ({"polnoc","poludnie","wschod","zachod","gora","dol",
      "polnocny-wschod","polnocny-zachod","poludniowy-wschod",
      "poludniowy-zachod"});
  int i, index;
  droga = tr;
  if (tr)
    for (i=0; i < sizeof(droga); i++)
      if ((index=member_array(droga[i],foo))!=-1)
        droga[i] = kier[index];
}


/* Funkcja:	tellroom
 * Argumanty:	podobnie do tell_room
 * Opis:	funkcja pomocniczna 
 */
void
tellroom(mixed room, mixed str)
{
  tell_room(room,str);
}



/*
 * Funkcja:	query_trasa_dyzlizansu
 * Argumenty:
 * Opis:	Zwraca trase dylizansu
 */
mixed
query_trasa_dylizansu()
{
  return droga + ({});
}



void
create_dylizans()
{

 ustaw_nazwe(({"dylizans","dylizansu","dylizansowi",
    "dylizans","dylizansem","dylizansie"}),
              ({"dylizanse","dylizansow","dylizansom",
    "dylizanse","dylizansami","dylizansach"}),PL_MESKI_NOS_NZYW);

 set_long("Imperialny Dylizans.\n");
 
 
 ustaw_krotki_opis();
 
 ustaw_wnetrze_dylizansu(LPATH + "wnetrze_dylizansu.c");
 ustaw_pojemnosc_dylizansu(4);
 ustaw_cene_biletu(10);
 
 ustaw_zdarzenia_na_postoju();
 
}


public nomask void
create_container()
{
  object ob;
 
 ::create_container();
 
 add_prop(OBJ_M_NO_GET,"Wziac dylizans ???????\n");
 
 add_prop(CONT_I_WEIGHT,500000);
 add_prop(CONT_I_VOLUME,1000000);
 add_prop(CONT_I_HIDDEN, 1);
 
 add_prop(CONT_I_MAX_WEIGHT,1000000);
 add_prop(CONT_I_MAX_VOLUME, 1500000);
 
 config_default_trade();
 create_dylizans();
}


int wsiadz(string str)
{
 int *res;
 object ob;
 
 if (!find_object(wnetrze))
    LOAD_ERR(wnetrze);
 notify_fail("Do czego pragniesz wsiasc?\n");
 
 if (!str)
   return 0;
 if (!parse_command(str,({TO})," 'do' %o:"+PL_DOP,ob))
   return 0;
 if(jedzie==1){
   notify_fail("Wolisz nie probowac wsiasc do jadace"+koncowka("go","j")+" "+
     query_nazwa(PL_DOP)+".\n");
   return 0;
 }
 if (sizeof(FILTER_LIVE(all_inventory(find_object(wnetrze))))>=pojemnosc)
 {
   notify_fail("Niestety nie ma juz wolnych miejsc.\n");
   return 0;
 }
 res=pay(price,TP,0,0,0,0,0);
 if(sizeof(res)==1){
    notify_fail("Nie masz tyle pieniedzy zeby zaplacic za podroz.\n");
    return 0;
 }
 write("Oplacasz podroz u woznicy i wsiadasz do "+
   short(PL_DOP)+".\n");
 say(QCIMIE(this_player(),PL_MIA)+" placi woznicy i wsiada do "+
   short(PL_DOP)+".\n");
 tell_room(wnetrze,QCIMIE(this_player(),PL_MIA) +" wsiada do dylizansu.\n");
 TP->move_living("M",wnetrze); 
 return 1;
}



void init()
{
  ::init();
  add_action(wsiadz,"wsiadz");
  add_action(wsiadz,"wejdz");
}



mixed
check_command(int add = 0)
{
    object cmdres;
    int tpos = dr_poz + add;

    if ((tpos >= sizeof(droga))||(tpos < 0))
	tpos = 0;

    cmdres = droga[tpos];

    if (stringp(cmdres))
	return this_object()->check_call(cmdres);
    else
	return cmdres;
}



void
dylizans_heart_beat()
{
  mixed destiny;
  mixed cmdres;
  
  if (!sizeof(droga))
    return ;
  
  if (!environment(TO)) return ;
    
  if (!find_object(wnetrze))
    LOAD_ERR(wnetrze);
  if (++dr_poz >= sizeof(droga))
    dr_poz = -1;
  
  cmdres = check_command();
  
  if (stringp(cmdres))
  {
    destiny = environment(TO)->query_exit_rooms()[member_array(
      droga[dr_poz],environment(TO)->query_exit_cmds())];
    if (destiny)
    {
      if (jedzie)
        tell_room(environment(TO), capitalize(short(PL_MIA))+" oddala sie na "+cmdres+", znikajac po"+
        	" chwili za widnokregiem.\n");
      else
      {
        tell_room(environment(TO),"Woznica gromkim glosem oznajmia:"+
          " Odjazd.\n"+capitalize(short(PL_MIA))+
        	" powoli rusza w droge, zmierzajac na "+cmdres+
        	".\n");
        tell_room(wnetrze, "Z zewnatrz slychac stlumiony glos woznicy "+
          "oznajmiajacy odjazd.\n");
        wnetrze->odjazd();
        ustaw_zdarzenia_podczas_drogi();
        dodaj_przym("pedzacy","pedzacy");
        ustaw_krotki_opis();
      }
      move(destiny);
      jedzie = 1;
      tell_room(destiny,"Z glosnym terkotem przybywa "+ 
          short(PL_MIA)+".\n");
    }
  }
  else
    if (intp(cmdres))
    {
      if (cmdres>0)
      {
        dylizans_al_id = set_alarm(itof(cmdres), 0.0, "dylizans_heart_beat");
        return ;
      }
      else
      {
        if (jedzie)
        {
          set_alarm(3.0, 0.0,
            "tellroom",wnetrze,"Z zewnatrz dochodzi stlumiony "+
              "glos woznicy: Postoj, "+
              lower_case(environment(TO)->query_short())+".\n");
          set_alarm(3.0, 0.0,
            "tellroom",environment(TO),"Woznica oznajmia gromkim glosem: "+
              "Postoj, "+
              lower_case(environment(TO)->query_short())+".\n");
          wnetrze->przyjazd();
          ustaw_zdarzenia_na_postoju();
          remove_adj("pedzacy");
          ustaw_krotki_opis();
          jedzie = 0;
          tell_room(environment(TO),capitalize(short(PL_MIA))+
        	" powoli zatrzymuje sie.\n");
        }
        dylizans_al_id = set_alarm(czas_postoju, 0.0,"dylizans_heart_beat");
        return ;
      }
    }
  dylizans_al_id = set_alarm(czas_ruchu, 0.0, "dylizans_heart_beat");
}



public void
uruchom_dylizans()
{
  if (dylizans_al_id)
    remove_alarm(dylizans_al_id);
  dylizans_al_id = set_alarm(2.0, 0.0, "dylizans_heart_beat");
}



public void
zatrzymaj_dylizans()
{
  if (dylizans_al_id)
    remove_alarm(dylizans_al_id);
}


public void
ustaw_czas_postoju(int c)
{
  czas_postoju = itof(c);
}


public float
query_czas_postoju()
{
  return czas_postoju;
}


float
query_czas_ruchu()
{
  return czas_ruchu;
}


int
query_pozycja_dylizansu()
{
  return dr_poz;
}





void
ustaw_zdarzenia_na_postoju()
{
  clear_events();
  set_event_time(2.0, 30.0);
  add_event("Konie zarzaly niespokojnie.\n");
  add_event("Dylizans lekko sie zakolysal.\n");
  add_event("Dylizans lekko zaskrzypial.\n");
  add_event("Dylizans mocno zaskrzypial.\n");
  set_events_on(1);
}


void
ustaw_zdarzenia_podczas_drogi()
{
  clear_events();
  set_event_time(2.0, 30.0);
  add_event("Dylizans podskoczyl na wyboju.\n");
  add_event("Dylizans mocno sie zakolysal.\n");
  add_event("Resory dylizansu rozpaczliwie zaskrzypialy.\n");
  set_events_on(1); 
}


void
add_event(string txt)
{
  events+=({txt});
}


void
clear_events()
{
  events=({});
  if (events_id)
    remove_alarm(events_id);
}


void
set_events_on(int i)
{
  if (!i&&events_id)
    remove_alarm(events_id);
//  return;
//  if (i&&!events_id) ------ !!!!! ---- Wlasnie tu sie kopalo i eventy znikaly po pierwszym postoju
//                            Tanis ( nie wiem, dlaczego, ale teraz dziala poprawnie ;)
//                            "return;" linijke wyzej jest tez by me, zeby zachowac mniej wiecej kompatybilnosc !
    events_id = set_alarm(start_ev, 0.0,"do_events");
}


void
do_events()
{ 
  object *ob;
  int wsk;
  
  if (!environment(TO))
    return ;
    
  wsk = random(sizeof(events),time());
  if (!find_object(wnetrze))
    LOAD_ERR(wnetrze);
  if ((ob = all_inventory(find_object(wnetrze))))
    if (sizeof(FILTER_PLAYERS(ob)))
      tell_room(wnetrze,events[wsk]);
  if ( (ob = all_inventory(environment(TO))))
    if (sizeof(FILTER_PLAYERS(ob)))
      tell_room(environment(TO), events[wsk]);
  events_id = set_alarm(repeat_ev, 0.0,"do_events");
}


void
set_event_time(float s, float r)
{
  start_ev = s;
  repeat_ev = r;
}


int
ustaw_krotki_opis()
{
  string str, str_l, *tab, *tab_l;
  int i, ok=(sizeof(query_przym(1,0)));
  
  tab = allocate (6);
  tab_l = allocate (6);
  for (i=0; i < 6; i++)
  {
    str = "";
    str_l = "";
    if (ok)
    {
      str = implode(query_przym(1, i)," ") + " ";
      str_l = implode(query_pprzym(1, i), " ") + " ";
    }
    tab [i] = str + query_nazwa(i) + " ";
    tab_l [i] = str_l + query_pnazwa(i) + " ";
  }
  tab [0] += "zaprzezony";
  tab [1] += "zaprzezonego";
  tab [2] += "zaprzezonemu";
  tab [3] += "zaprzezony";
  tab [4] += "zaprzezonym";
  tab [5] += "zaprzezonym";
  
  tab_l [0] += "zaprzezone";
  tab_l [1] += "zaprzezonych";
  tab_l [2] += "zaprzezonym";
  tab_l [3] += "zaprzezone";
  tab_l [4] += "zaprzezonymi";
  tab_l [5] += "zaprzezonych";
  
  for (i=0; i<6; i++)
  {
    tab [i] += " w czworke czarnych koni";
    tab_l [i] += " w czworke czarnych koni";
  }
  
  return ustaw_shorty(tab, tab_l);
}

