/*
 *		Fajka Halfingow ze "Zgromadzenia"
 *
 *		Napisal : Mithandir ... 1999
 *
 */
 
inherit "/std/object.c";
inherit "/cmd/std/command_driver";

#include <cmdparse.h>
#include <macros.h>

#include <stdproperties.h>
#include <wa_types.h>
#include <pl.h>
#include "halfy.h"

#include "emoty_fajki.h"

#pragma no_inherit
#define ON environment(this_object())
#define DOZWOLONE ({"sp","i","inv","usmiech","usmiechnij","szepnij","powiedz","zgas"})
#define FULL 10


void dodaj_subloca();

int zapalona=0;
int ile_ziela=0;
object ziele;
int alarm;


create_object()
{
	ustaw_nazwe (
		({"fajka","fajki","fajce","fajke","fajka","fajce"}),
		({"fajki","fajek","fajkom","fajki","fajkami","fajkach"}),
		PL_ZENSKI);
	set_long("Jest to przepiekna fajka czlonka Zgromadzenia "+
		"Halflindzkiego. Niezbyt duza, zeby nie utrodniac "+
		"transportu, jest jednak doskonale zaprojektowana, "+
		"tak aby palenie ziela fajkowego uczynic jak najwieksza "+
		"przyjemnoscia.\n");


	add_prop (OBJ_I_WEIGHT, 150);
	add_prop (OBJ_I_VALUE, 100);

    add_prop(OBJ_M_NO_DROP,1);
    add_prop(OBJ_M_NO_STEAL,1);
    add_prop(OBJ_M_NO_SELL,1);
    add_prop(OBJ_M_NO_GIVE,1);
}

void
dodaj_subloca()
{
	ON->add_subloc(FAJKA_SUBLOC, this_object());
	move(ON, FAJKA_SUBLOC);
}

set_ziele(object nowe_ziele)
{
	ziele=nowe_ziele;
}

int pelna()
{	
	return ile_ziela;
}

void
remove_subloc()
{
	move(ON);
	ON->remove_subloc(FAJKA_SUBLOC);
}

string
show_subloc(string subloc, object on_obj, object for_obj)
{
    if (on_obj == for_obj && !on_obj->query_prop(TEMP_SUBLOC_SHOW_ONLY_THINGS))
        return "Na szyi zawieszona masz przepiekna fajke czlonka Zgromadzenia Halflindzkiego.\n";
    return "Na "+on_obj->query_zaimek(PL_DOP)+" szyi wisi przepiekna fajka czlonka Zgromadzenia Halflindzkiego.\n";
}

string 
query_auto_load()
{
        return MASTER_OB(this_object());
}

int
czy_kapciuch(object ob)
{
	return ob->id("kapciuch");
}


pali(string str)
{
	// Ta funkcja paralizuje gracza podczas palenia fajki.
	if (!zapalona) return 0;
	if (member_array(query_verb(), DOZWOLONE)>-1) return 0;
	if (strlen(query_verb())>=2 && query_verb()[0..1]=="zh") return 0; // emoty Zgromadzenia
	if (strlen(query_verb())>=1 && query_verb()[0..0]=="'") return 0; // Say...
	return !write("Nie mozesz tego zrobic podczas palenia fajki.\n");
}

pal()
{
	if (--ile_ziela==0) 
	{
		set_this_player(ON);
		say("Fajka "+QIMIE(TP, PL_DOP)+" gasnie.\n");
		write("Twoja fajka gasnie!.\n");
		zapalona=0;
		remove_alarm(alarm);
		return;
		set_ziele(0);
	}
	say("Z fajki "+QIMIE(TP,PL_DOP)+"wydobywa sie maly klebek dymu i "+
		"blyskawicznie rozprasza w powietrzu.\n");
	write("Z twojej fajki wydobywa sie maly klebek dymu i blyskawicznie "+
		"rozprasza w powietrzu.\n");
}


int
zapal(string str)
{
	object kapciuch=filter(all_inventory(TP), czy_kapciuch)[0];
	if (str!="fajke")
		return notify_fail("Co chcesz zapalic?\n");	
	if (zapalona)
		return notify_fail("Fajka juz jest zapalona!\n");
	if (TP->query_subloc(FAJKA_SUBLOC))
		TP->command("zdejmij fajke z szyi");
	if (!ile_ziela)
		return notify_fail("Fajka jest pusta! Musisz ja wczesniej "+
			"napelnic zielem fajkowym.\n");
	all("zapala fajke.");
	write("Zapalsz fajke.");
	ile_ziela--;
	zapalona=1;
	add_action (pali, "", 1);
	alarm=set_alarm( itof(( kapciuch->query_ziele() )->query_czas()) , itof(( kapciuch->query_ziele() )->query_czas()), pal);
	init_emoty_palenia();
	return 1;
}

int
zgas(string str)
{
	if (str!="fajke")
		return notify_fail("Co chcesz zgasic.\n");
	if (!zapalona) 
		return notify_fail("Fajka nie jest zapalona.\n");
	zapalona=0;
	all("gasi fajke.");
	write("Gasisz fajke.\n");
	update_actions();
	return 1;
}

int
powies(string str)
{
	if (str!="fajke na szyi")
		return notify_fail("Co chcesz powiesic gdzie?\n");
	if (TP->query_subloc(FAJKA_SUBLOC))
		return notify_fail("Juz masz zawieszona fajke na szyi!\n");
	if (zapalona)
		return notify_fail("Wieszasz fajke na szyi. Auu!!! Moze "+
			"powinienes ja wczesniej zgasic?\n");
	all("wiesza fajke na szyi.");
	write("Wieszasz fajke na szyi.\n");
	dodaj_subloca();
	return 1;
}

int
zdejmij(string str)
{
	if (str!="fajke z szyi")
		return notify_fail("Co chcesz zdjac?\n");
	if (!TP->query_subloc(FAJKA_SUBLOC))
		return notify_fail("Nie masz zawieszonej na szyi zadnej "+
			"fajki!\n");
	all("zdejmuje fajke z szyi.");
	write("Zdejmujesz fajke z szyi.\n");
	remove_subloc();
	return 1;
}

int
napelnij_fajke_z_kapciucha()
{
	object *wszystko=all_inventory(TP);
	object kapciuch=filter(wszystko, czy_kapciuch)[0];
	int ile, max_ziela=kapciuch->query_max();
	object ziele_w_kapciuchu=kapciuch->query_ziele();
	if ((ziele_w_kapciuchu!=ziele) && (ile_ziela>0))
		return notify_fail("Ziele w kapciuchu rozni sie od tego w "+
			"twojej fajce. Musisz oproznic fajke, zanim bedziesz "+
			"mogl ja napelnic tym zielem.\n");
	ile=MIN(max_ziela, FULL-ile_ziela);
	ile_ziela+=ile;
	ziele=ziele_w_kapciuchu;
	kapciuch->odejmij(ile);
	all("napelnia fajke zielem z kapciucha.");
	write("Napelniasz fajke zielem z kapciucha.\n");
	return 1;
}

int
napelnij_fajke_od_kogos(object kto)
{
	int max_ziela, ile;
	object kapciuch, ziele_w_kapciuchu;
	if ((kto->query_prop(CZESTUJE)[0]!=TP) && 
		(kto->query_prop(CZESTUJE)[0]!="wszystkich"))
		return notify_fail(QCIMIE(kto,PL_MIA)+
			" wcale cie nie czestuje!\n");
	kapciuch=kto->query_prop(CZESTUJE)[1];
	max_ziela=kapciuch->query_max();
	ziele_w_kapciuchu=kapciuch->query_ziele();
	if ((ziele_w_kapciuchu!=ziele) && (ile>0))
		return notify_fail("Ziele w kapciuchu rozni sie od tego w "+
			"twojej fajce. Musisz oproznic fajke, zanim bedziesz "+
			"mogl ja napelnic tym zielem.\n");
	ile=MIN(max_ziela, FULL-ile_ziela);
	ile_ziela+=ile;
	ziele=ziele_w_kapciuchu;
	kapciuch->odejmij(ile);
	all2act("napelnia fajke zielem z kapciucha",({kto}), PL_DOP);
	target("napelnia fajke z twojego kapciucha",({kto}));
	actor("Napelniasz fajke z kapciucha",({kto}), PL_DOP);
	return 1;
}
	
int
napelnij(string str)
{
	string skad;
	object co, *od_kogo;
	parse_command(str, Env, "%o:"+PL_BIE + " z kapciucha %s", co, skad);
	TP->set_obiekty_zaimkow(({co}));
	if (co!=this_object())
		return notify_fail("Co chcesz napelnic?\n");
	if (zapalona)
		return notify_fail("Lepiej ja wczesniej zgas.\n");
	if (!skad)
	{
		return napelnij_fajke_z_kapciucha();
	}
	od_kogo=parse_this(skad, "%l:"+PL_DOP);
	if (sizeof(od_kogo)!=1)
		return notify_fail("Z czyjego kapciucha chcesz napelnic "+
		 	"fajke?\n");
	return napelnij_fajke_od_kogos(od_kogo[0]);
}
	
init()
{
	add_action(zapal,"zapal");
	add_action(zgas,"zgas");
	add_action(powies,"kpowies");
	add_action(zdejmij,"zdejmij");
	add_action(napelnij,"napelnij");
}

