
inherit "/d/Imperium/std/monster";

#include "../local.h"
#include <ss_types.h>
#include <const.h>

#define TO this_object()
#define TP this_player()
#define TE environment()

string *ucieczka;

int uciekajacy = 0;
float predkosc = 2.5;



// ==================== AKCJE ================

mixed  akcje=({});
int    *pora=({});
string *aktualna_sekwencja = ({ });
int    wykonany_element;

void
uciekaj()
{
    uciekajacy = 1;
}

void
losowo_uciekaj()
{
    uciekajacy = 2;
    set_whimpy(70);
}

public void
create_halfling()
{
}


string
czas(string time)
{
}


void
create_monster()
{
    add_prop(CONT_I_WEIGHT, 55000);
    add_prop(CONT_I_HEIGHT, 130+random(40));
    add_prop(ELVARON_I_ASYSTUJACY,1);

    set_skill(SS_DEFENCE,       5 + random(10));
    set_skill(SS_WEP_CLUB,      5 + random(15));
    set_skill(SS_UNARM_COMBAT,  5 + random(15));
    set_skill(SS_PARRY,         5 + random(10));
    set_skill(SS_AWARENESS,    30 + random(40));
    set_skill(SS_BLIND_COMBAT, 30 + random(30));
    set_skill(SS_HIDE, 	       40 + random(20));

    set_stats(({ 35 + random(15), 25 + random(25), 25 + random(14), 42, 34, 45}));

    set_default_answer(QCIMIE(TO,PL_MIA) + " mowi: Hmmm... ciekawe " +
        "pytanie, ale hmmm... moze cos zjemy?\n");

    add_ask("pogode", VBFC_ME("pogoda"));

    this_object()->create_halfling();

    czas(environment()->pora_dnia());
    
    if(query_gender() ==1) ustaw_odmiane_rasy(PL_HALFLINKA);
    else ustaw_odmiane_rasy(PL_HALFLING);
    
    set_alignment(400);

    dodaj_miedz(10+random(30));
    dodaj_srebro(random(15));
}

string
pogoda()
{
    string odp;
    object for_who;

    for_who = previous_object();

    command("powiedz A coz to mozna powiedziec o pogodzie...");
    odp = "Po chwili dodaje: ";
    switch (TE->pora_roku())
    {
    case "lato": odp += "Jak to latem - duszno i goraco."; 
      break;
      
    case "wiosna": odp += "Wreszcie mozna wygrzac swoje kosci na sloncu."; 
      break;
      
    case "zima": odp += "Jest zimno, zimno i do tego jeszcze spizarnia robi sie nam pusta."; 
      break;
      
    case "jesien": odp += "Co chwila cos siapi i do tego ten zimny wiatr..."; 
      break;
      
    default: return "";
    }
    
    odp += "\n";
    return odp;
}

//======================== funkcje akcji ===========================

/*
 * Kiedy :
 * 
 * xx: 0-zawsze 1 -wiosna 2-lato 3-jesien 4-zima 5-bez zimy
 */

void 
dodaj_sekwencje(string *sekwencja, int kiedy)
{
    akcje  += ({ sekwencja });
    pora   += ({ kiedy });
}


int 
*query_akcje()
{
    int *h = ({});
    int b;
    string cykl = environment()->pora_roku();
    
    b = sizeof(pora);

    // filtrowanie przez pory roku
    while (--b >= 0)
    {
        if (!cykl || pora[b] == 0)
            h += ({ b });
	else if(cykl == "wiosna" && member_array(pora[b], ({ 1, 5 }) ) >= 0) 
	    h += ({ b });
	else if(cykl == "lato" && member_array(pora[b], ({ 2, 5 }) ) >= 0) 
	    h += ({ b });
	else if(cykl == "jesien" && member_array(pora[b], ({ 3, 5 }) ) >= 0) 
	    h += ({ b });
	else if(cykl == "zima" && member_array(pora[b], ({ 4 }) ) >= 0) 
	    h += ({ b });
    }
    
    return h;
}

string *
query_sekwencja(int nr)
{
    int size;

    size = sizeof(akcje);

// Dwa testy na argument i rozmiar tablicy z sekwencjami, dla bezpieczenstwa.    
    if (!size)
        return ({ });
        
    if (nr > (size - 1))
        nr = 0;

    return akcje[nr];
}

string *
query_aktualna_sekwencja()
{
    return aktualna_sekwencja;
}

mixed
query_halfseq()
{
    int *dost_akcje;
    int size;
    
    if (!sizeof(aktualna_sekwencja))
    {
        // Skonczyla sie stara sekwencja, albo inicjalizacja.
    
        dost_akcje = query_akcje();
        size = sizeof(dost_akcje);
    
        if (!size)
             return 0;
             
// Ustawiamy losowo jedna z dostepnych sekwencji.
        aktualna_sekwencja = akcje[dost_akcje[random(size)]];
        
        wykonany_element = -1;
    }
    
    wykonany_element++;
    
    if (wykonany_element == sizeof(aktualna_sekwencja))
    {
        // Nowa sekwencja.
        
        aktualna_sekwencja = ({ });
        seq_addlast(STD_SEQ_NAME, ({ "@@query_halfseq" }) );
        return 3; // Czas przerwy miedzy sekwencjami
    }

    seq_addlast(STD_SEQ_NAME, ({ "@@query_halfseq" }));
    
    return aktualna_sekwencja[wykonany_element];
}

//============================= funkcje orbisu halflingow ==========



void 
do_strazy(string *droga)
{
    ucieczka = droga;
}



//==================== ucieczka ====================

public varargs void 
uciekam(int x)
{
    object *otoczenie;
    int i;
    
    if (x < sizeof(ucieczka))
    {
	command(ucieczka[x]);
        set_alarm(predkosc, 0.0, "uciekam", ++x);
    }
    else if (uciekajacy == 2)
    {
        run_away();
        set_alarm(0.5, 0.0, "command", "schowaj sie");
    }   
       
}

void 
attacked_by(object ob)
{
    int i;
    
    object *otoczenie;

    otoczenie = all_inventory(environment()) - ({ this_object() });
    
    switch(random(3))
    {
        case 0: command("krzyknij POMOCY!"); break;
        case 1: command("krzyknij RATUNKU! MORDERCA!"); break;
        case 2: command("krzyknij MORDERCA!! POMOOCYY!!"); break;
    }
    
    for (i = 0; i < sizeof(otoczenie); i++)
    	otoczenie[i]->pomoz_mi(ob);

    if (uciekajacy)
	set_alarm(predkosc, 0.0, "uciekam");

    ::attacked_by(ob);
}


void pomoz_mi(object ob)
{
    string imie;
    
    if (!query_prop(ELVARON_I_ASYSTUJACY))
    {
        command("krzyknij Lepiej uciekajmy!");
        set_alarm(1.0, 0.0, "uciekam");
        
        return ;
    }

    imie = ob->query_real_name(PL_BIE);

    command("powiedz Zaraz ci pomoge z tym draniem przyjacielu!");

    command("zabij " + imie);
    command("zabij " + imie);
    
    set_follow(ob,1.0);
}
