inherit "/std/leftover";

#include <pl.h>
#include <macros.h>
#include <stdproperties.h>

/* -------------- Zmienne Ogolne ------------- */

static string animal;		// Zwierze z ktorego wycieto mieso w dopelniaczu
static string *Acts;		// Acty wyrzucane podczas pieczenia

static int  Roast_Alarm = 0;	// Id alarmu uzywanego przy pieczeniu
static int  Max_Time;		// Czas pieczenia

static string *Spices;		// Przyprawy w narzedniku

private int Counter;		// Odlicza czas pieczenia potrawy

object ognisko, piekacy;	// Zeby bylo wiadomo kto piecze na czym

int told;			// Czy juz powiedzielismy, ze mieso gotowe

/* -------------- Male funkcje --------------- */

int query_meat()		{return 1;}
public string *query_acts()	{return Acts;}
public string *query_spices()	{return Spices;}
public void set_time(int time) {Max_Time = time; Counter = 0;}
public void reset_meat() { }
public nomask void reset_heap() { reset_meat(); }
public int query_max_time() {return Max_Time;}
public int query_time() {return Max_Time-Counter;}
public int query_roasting() {if(Roast_Alarm==0) return 0; else return 1;}
public void add_act(string new_act){
    if(!sizeof(Acts)) Acts = ({});
    Acts += ({new_act});}
public void add_spice(string new_spice){
    if(!sizeof(Spices)) Spices = ({});
    Spices += ({new_spice});}
void remove_act(string new_act)
    { if(member_array(new_act, Acts)!=(-1)) Acts-=({new_act});}
void remove_spice(string new_spice)
    { if(member_array(new_spice, Spices)!=(-1)) Spices-=({new_spice});}
public string	query_animal()	{return animal;}
public void	set_animal(string an) {animal = an;}

/* Sprawdzamy, jak dobrze upieczone jest mieso */

public int
query_state()
{
    if((Max_Time/4)>Counter)			return 0;    // Surowe
    if((Max_Time/2)>Counter)			return 1;    // Niedopieczone
    if(Max_Time>Counter)			return 2;    // Dobre
    if((Max_Time+(Max_Time/2))>Counter)		return 3;    // Przypalone
    
    return 4;	// SPALONE
}

/* Funkcja konczaca pieczenie */

void
przestan_piec(object piekacy)
{
    string opis = "Jest to kawalek";

    remove_adj("pieczony");

    switch(query_state())
    {
	case 0:
	    opis+=" prawie surowego ";
	    dodaj_przym("surowy", "surowi");
	    break;
	case 1:
	    opis+=" niedopieczonego ";
	    dodaj_przym("niedopieczony", "niedopieczeni");
	    break;
	case 2:
	    opis+=" upieczonego ";
	    dodaj_przym("upieczony", "upieczeni");
	    break;
	case 3:
	    opis+=" mocno przypalonego ";
	    dodaj_przym("przypalony", "przypaleni");
	    break;
	default:
	    opis+=" zupelnie spalonego ";
	    dodaj_przym("spalony", "spaleni");
	    break;
    }
    odmien_short();
    odmien_plural_short();
    
    opis += "miesa. ";
    
    if(animal)	opis += "Wydaje ci sie, ze potrawa ta zrobiona jest z "+animal;
    else	opis += "Potrawa jest zrobiona z nieznanego ci zwierzecia";
	    
    if(!sizeof(Spices)) opis+=".\n";
    else opis+=" i zostala przyprawiona roznymi ziolami.\n";

    set_long(opis);

    set_amount(query_prop(OBJ_I_WEIGHT) / 3);
    
    odmien_short();
    odmien_plural_short();
    remove_alarm(Roast_Alarm);
    Roast_Alarm = 0;
    return;
}

void
create_meat()
{
    ustaw_nazwe(({"miesiwo", "miesiwa", "miesiwu",
		"miesiwo", "miesiwem", "miesiwie"}),
		({"miesiwa", "miesiw", "miesiwom",
		"miesiwa", "miesiwami", "miesiwach"}),
		PL_NIJAKI_NOS);
		
    dodaj_nazwy(({"mieso", "miesa", "miesie",
		"mieso", "miesem", "miesie"}),
		({"miesa", "mies", "miesom",
		"miesa", "miesami", "miesach"}),
		PL_NIJAKI_NOS);
		
    dodaj_przym("surowy", "surowi");
    
    set_long("@@dlugi_opis");
    
    add_act("Slyszysz syk palonego tluszczu.\n");
    add_act("Czujesz mily zapach pieczonego miesa.\n");
    add_act("Mieso przypala sie nieco.\n");
    add_act("Mieso opieka sie powoli w ogniu.\n");
}
 
nomask void
create_leftover()
{
    add_prop(OBJ_I_WEIGHT, 500);
    add_prop(OBJ_I_VOLUME, 500);
    add_prop(OBJ_I_VALUE,    0);
    add_prop(OBJ_M_NO_SELL, "Nie prowadzimy skupu miesa!\n");
    
    set_time(query_prop(OBJ_I_VOLUME) / 10);

    create_meat();
}

/* 	Jesli mieso jest uzywanie jako leftover, to ustawiamy mu specjalnego
    longa, ktory bedzie opisywal z jakiego zwierzaka wycieto mieso, a ponadto
    ustawiamy wage, objetosc i czas pieczenia jedzenia. */

public void
leftover_init(string *lp, string *lmn, int rodzaj, string *rasa, int rodzaj_rasy = PL_MESKI_NOS_NZYW, int hard = 0)
{
    object cialo = previous_object();

    animal = rasa[PL_DOP];
    
    ::leftover_init(lp, lmn, rodzaj, rasa, rodzaj_rasy, 0, 1);
    
    add_prop(OBJ_I_WEIGHT, (cialo->query_prop(CONT_I_WEIGHT) / 8) );
    add_prop(OBJ_I_VOLUME, query_prop(OBJ_I_WEIGHT) );
    set_time( query_prop(OBJ_I_WEIGHT) / 10 );
    set_amount( query_prop(OBJ_I_WEIGHT) / 3);
}

string
dlugi_opis()
{
    string opis;
    int i;
    
    if(query_roasting())	opis = "Pieczesz wlasnie";
    else			opis = "Jest to";
    
    switch(query_state())
    {
	case 0:
	    opis+=" surowy kawalek miesa. ";
	    break;
	case 1:
	    opis+=" krwisty kawalek miesa. ";
	    break;
	case 2:
	    opis+=" soczysty kawalek miesa. ";
	    break;
	case 3:
	    opis+=" przypalony kawalek miesa. ";
	    break;
	default:
	    opis+=" kawalek miesa. ";
	    break;
    }

    if(animal)	opis += "Wydaje ci sie, ze zostal on wyciety z "+animal+".\n";
    else	opis += "\n";
	
    if(!sizeof(Spices)) return opis;
    
    opis+="Mieso zostalo przyprawione ";
    
    if(sizeof(Spices) == 1)
	{ opis+=(Spices[0]+".\n"); return opis; }
    if(sizeof(Spices) == 2)
	{ opis+=(Spices[0]+" i "+Spices[1]+".\n"); return opis; }
    
    for(i=0; i<sizeof(Spices)-2; i++) opis+=(Spices[i]+", ");
	opis+=(Spices[sizeof(Spices)-2]+" i "+Spices[sizeof(Spices)-1]+".\n");
	return opis;
}

public void			// Dodajemy komendy uzywane przez pieczen
init()
{
    ::init();

    add_action("roast_it", "upiecz");
    add_action("stop_it", "przestan");
}

int
stop_it(string str)
{
    notify_fail("Przestan co?\n");
    if(str!="piec") return 0;
    
    notify_fail("Alez ty niczego nie pieczesz!\n");
    if(Roast_Alarm==0) return 0;

    say(QCIMIE(this_player(), PL_MIA)+" przestaje piec "+
	this_object()->query_nazwa(PL_BIE)+".\n");
	
    write("Przestajesz piec "+this_object()->query_nazwa(PL_BIE)+".\n");

    przestan_piec(this_player());
    return 1;    
}

public int
roast_it(string str)
{
    string vb=capitalize(query_verb());
    string *tab;
    
    object *okolica=all_inventory(environment(this_player()))-({this_player()});
    
    int i;
    int ok = 0;

    piekacy = this_player();
    
    notify_fail(vb+" co?\n");
    if (!str) return 0;
    
    tab = explode(str, " ");
    if (!id(tab[0], PL_BIE)) return 0;

/* Sprawdzamy, czy piekacy trzyma pieczen w rekach */

    notify_fail("Musisz miec "+(this_object()->query_nazwa(PL_BIE))+
		    " przy sobie, by zaczac pieczenie.\n");
    if(environment(this_object())!=piekacy) return 0;
    
/* Sprawdzamy, czy pieczen nie jest juz przypadkiem pieczona */
    
    notify_fail(capitalize(this_object()->query_nazwa(PL_MIA))+
			" juz sie piecze!\n");
    if(Roast_Alarm!=0) return 0;
    
/* Sprawdzamy, czy w okolicy jest plonace ognisko */
    
    notify_fail("Gdzies w okolicy musi byc plonace ognisko lub "+
		    "cos w tym stylu...\n");    
    for(i=0; i<sizeof(okolica); i++)
    {
	if((okolica[i]->query_burning_campfire())) 
	    {
	    ok = 1;
	    ognisko = okolica[i];
	    }
    }
    if (ok==0) return 0;
    else

/* Zaczynamy piec pieczen */    

    {
	piekacy->catch_msg("Zaczynasz piec "+
		    this_object()	->query_nazwa(PL_BIE)+" na "+
		    ognisko		->query_nazwa(PL_MIE)+".\n");
	
	filter(okolica, living);
		    
	for (i=0;i<sizeof(okolica);i++)
	{
	if(CAN_SEE_IN_ROOM(okolica[i]))
	    okolica[i]->catch_msg(QCIMIE(piekacy, PL_MIA)+" zaczyna piec "+
		    this_object()	->query_nazwa(PL_BIE)+" na "+
		    ognisko		->query_nazwa(PL_MIE)+".\n");
	}

	Counter+=5;
	
	remove_adj("surowy");
	remove_adj("niedopieczony");
	remove_adj("upieczony");
	remove_adj("przypalony");
	remove_adj("spalony");
	dodaj_przym("pieczony", "pieczeni");
	set_long("@@dlugi_opis");
	odmien_short();
	odmien_plural_short();
	
	Roast_Alarm = set_alarm(5.0, 5.0, "what_is_going_on");

	return 1;
    }
}

void
what_is_going_on()
{
    object *okolica=all_inventory(environment(this_player()))-({this_player()});
    int i;
    int ok = 0;

/* Sprawdzamy, czy piekacy nadal trzyma pieczen w rekach */

    if(environment(this_object())!=piekacy) 
    {
	piekacy->catch_msg("Hmm. Chyba zgubilo ci sie to, co piekles.\n");
	przestan_piec(piekacy);
	return;
    }
		
/* Sprawdzamy, czy w okolicy jest plonace ognisko */
    
    for(i=0; i<sizeof(okolica); i++)
    {
	if((okolica[i]->query_burning_campfire())) 
	    {
	    ok = 1;
	    ognisko = okolica[i];
	    }
    }
    
    if(ok==0)
    {
	piekacy->catch_msg("Przestajesz piec "+
    	    this_object()->query_nazwa(PL_DOP)+", bo nigdzie dookola "+
	    "nie ma odpowiedniego ognia.\n");
	przestan_piec(piekacy);
	return;
    }

/* Sprawdzamy czy juz sie upieklo */

    if(query_state()==2 && !told)
    {
	told = 1;
	piekacy->catch_msg(capitalize(this_object()->query_nazwa(PL_MIA))+
		    " wydaje ci sie gotow"+koncowka("y", "a", "e")+".\n");
    }
		    
/* Sprawdzamy, czy sie nie spalilo */

    if(query_state()==4)
    {
	piekacy->catch_msg(capitalize(this_object()->query_nazwa(PL_MIA))+
		    " spala sie w ogniu!.\n");
	destruct();	    
    }
    
/* A jesli wszystko w normie, dajemy jakies emote'y i pieczemy dalej */

    Counter+=5;
	if(random(2))
	    tell_room(environment(piekacy), Acts[random(sizeof(Acts))]);
    return;
}

string
stat_object()
{
    int i;
    string str = ::stat_object();
    
    if(animal)
	str += "Zwierze (dopelniacz):	"+animal+"\n";
    
    str += "Czas pieczenia:	"+query_max_time()+"\n";

    if(Roast_Alarm!=0)
	str += "Czas do upieczenia miesa:	"+query_time()+"\n";

    str += "Stan miesa:	"+query_state()+"\n";
    
    if(sizeof(Spices)==0) return str;
    
    str += "Przyprawy (dopelniacz):	";
    
    for(i=0; i<sizeof(Spices); i++)
	str += Spices[i]+" ";
	
    str += "\n";
    
    return str;
}

void
otruj_gracza()
{
    object trucizna;

    seteuid(getuid());

    trucizna = clone_object("/std/poison_effect.c");
    trucizna ->move(this_player());
    trucizna ->start_poison();
}

void
consume_text(object *arr, string vb)
{
    string przyprawy = "";
    int i, sol;
    int Type = query_state();

    ::consume_text(arr, vb);

    sol = 0;

    write("Mieso");

    /* Oddzielamy sol, jako niezbedna, od innych przypraw */

    if((sizeof(Spices)>0) && (member_array("sola", Spices)!=(-1)))
	{
	    sol = 1;
	    Spices -= ({"sola"});
	}
    /* Jesli mieso jest surowe, trujemy gracza */

    if(Type == 0)
    {
	write(" bylo bardzo mdle i zupelnie surowe, "+
	    "zjadanie go nie bylo najlepszym pomyslem.\n");
	otruj_gracza();
	return;
    }
    /* Jesli mieso jest spalone, przypraw nie uwzgledniamy */
    
    if(Type == 4)
    {
	write(" bylo zupelnie spalone! Zjadanie go nie bylo "+
	    "najlepszym pomyslem, chyba ze masz klopoty zoladkowe.\n");
	return;
    }

    /* Jesli mieso nie zostalo przyprawione */
    
    if(!sizeof(Spices) && sol == 0)
    {
	switch(Type)
	{
	    case 1:
		write(", nie dosc ze niedopieczone");
		break;
	    case 3:
		write(", nie dosc ze strasznie przypalone");
		break;
	}
	    write(" nie zostalo posolone, nie mowiac juz o innych "+
		    "przyprawach. Potrawa byla raczej paskudna w smaku.\n");
	return;
    }		

    /* Jesli zostalo tylko posolone */
    
    if(!sizeof(Spices) && sol != 0)
    {
	switch(Type)
	{
	    case 1:
		write(", choc niedopieczone");
		break;
	    case 3:
		write(", choc strasznie przypalone");
		break;
	}
	    write(" zostalo posolone, wiec da sie je jesc. Potrawie "+
		"bardzo brak jednak innych przypraw.\n");
	return;
    }
    
    /* Od tej chwili zacznie sie wymienianie przypraw, wiec przygotujemy
     * sobie stringa z ich kompletnym opisem
     */
     
    if(sizeof(Spices)>5) przyprawy = "bardzo wieloma przyprawami";
    else
    for(i=0; i<sizeof(Spices); i++)
    {
        if(i!=0)
    	    if(i==(sizeof(Spices)-1))
		przyprawy += " i ";
	    else
		przyprawy += ", ";
    
	przyprawy += Spices[i];
    }
    
    /* Jesli nie zostalo posolone */
    
    write(" jest");
    
    if(!sol)
    {
	switch(Type)
	{
	    case 1:
		write(" niedopieczone i"); 
		break;
	    case 3:
		write(" zupelnie spalone i");
		break;
	}
	write(	" zupelnie nieslone, ale za to zostalo przyprawione "+
		przyprawy+". Nieco popoprawia to smak potrawy, ale "+
		"nadal zostaje pewien niedosyt.\n");
	return;
    }
    else
    {
	switch(Type)
	{
	/* Sol jest, inne przyprawy tez, to opisy ciekawsze */
	    case 1:
		write(" nieco niedopieczone, ale odpowiednio slone i "+
		"przyprawione "+przyprawy+". Potrawa jest calkiem smaczna.\n");
		break;
	    case 3:
		write(" nieco przypalone, ale odpowiednio slone i "+
		"przyprawione "+przyprawy+". Potrawa jest bardzo smaczna.\n");
		break;
	    case 2:
		write(" swietnie wypieczone, odpowiednio slone");
		
		if(sizeof(Spices)==1)
		write(", ale przyprawione tylko "+przyprawy+". Mimo to, "+
		    "potrawa jest bardzo smaczna, choc daleko jej do "+
		    "arcydziela kucharskiego.\n");
		
		if(sizeof(Spices)==2)
		write(" i przyprawione "+przyprawy+". Potrawa jest wyborna, "+
		    "widac, ze przyrzadzal ja fachowiec.\n");
		
		if(sizeof(Spices)>=3 && sizeof(Spices)<=7)
		write(" i przyprawione "+przyprawy+". Potrawa jest absolutnie "+
		    "wspaniala, bije z niej kunszt mistrza kuchni, ktory "+
		    "ja przyrzadzal. Ach, chcialoby sie jadac czesciej "+
		    "tak wyborne potrawy, jak ta!\n");
		if(sizeof(Spices)>7)
		write(" i przyprawione "+przyprawy+". Potrawa jest bardzo "+
		    "smaczna, choc dodatkow jest zdecydowanie zbyt duzo i "+
		    "gryza sie one nieco ze soba.\n");
		break;
	}
	return;
    }		
}

int
query_spiceable()
{
	return 1;
}
	