/* 
 * Lokacja i jednoczesnie glowny obiekt teatru wedrownego.
 * Mithandir 19.09.1998r.
 */
 
#include "mith.h"

inherit "/d/Imperium/std/room";


string opis;
string sztuka;
string *sceny=({});
string *opisy=({});
float *czasy=({});
int scena=0;
int kurtyna=1, swiatlo=1;
string wyjscie;
int otwarte=1;
int licznik=0;
int lokacja=0;

string pokaz_scene();
string pokaz_kurtyne();
string long();
string ciemno();
 


create_imperium_room()
{
	set_short("Wnetrze teatru");
	set_long(long);

	add_item("scene",pokaz_scene);
	add_item("kurtyne",pokaz_kurtyne);

	add_item("namiot",long);


	add_prop(ROOM_S_DARK_LONG, ciemno);
	add_prop(ROOM_I_INSIDE, 1);

	init_teatr();
}

powiedz_wejsciu(string str)
{
	WEJSCIE->powiedz(str);
}

enter_inv(object what, object from)
{
	if (what->query_login_from()) // Gracz.
	{
		remove_exit("wyjscie");
		wyjscie=MASTER_OB(from);
		add_exit(wyjscie, "wyjscie");
	}
	::enter_inv(what, from);
}

string
pokaz_kurtyne()
{
   if (kurtyna)
      return "Kurtyna jest opuszczona i szczelnie zaslania scene.\n";
   else 
      return "Kurtyna jest podniesiona i przymocowana wysoko pod sufitem "+
         "namiotu.\n";
}

string 
pokaz_scene()
{   
	if (kurtyna)  
		return pokaz_kurtyne();

        if (opis)
              return opis;
        else return "Scena jest pusta, ale podniesiona kurtyna sugeruje, "+
                         "iz niebawem rozpocznie sie przedstawienie.\n ";
}

string
ciemno()
{
	return "W namiocie zgaszono swiatla, pozostawiajac tylko kilka "+
	    "pochodni, ktore dokladnie oswietlaja scene. "+
	    ((opis)?opis:"\n");
}

                                                      
string 
long()
{
	string str="Jestes w duzym namiocie, w ktorym odbywaja sie "+
	   "przedstawienia Wedrownej Trupy Hartmanna. Wieksza czesc namiotu "+
	   "stanowi widownia, skladajaca sie z wielu rzedow przeznaczonych "+
	   "dla widzow lawek. ";
	if (!swiatlo)
	{
		str+="Namiot zrobiony jest z ciemnego, nie przepuszczajacego "+
		  "swiatla plotna. Zgaszono wszystkie pochodnie, "+
		  "pozostawiajac tylko kilka oswietlajacych scene. ";
        }
	   
	str+="W jednym z rogow namiotu na drewnianym "+
	   "podwyzszeniu znajduje sie scena. ";
	if (kurtyna)
	{
		str+="W tym momencie jest ona szczelnie zaslonieta zwisajaca "+
		  "z sufitu kurtyna.\n";
	}
	else if (opis)
		str+=opis;
	     else str+="Scena jest pusta, ale podniesiona kurtyna sugeruje, "+
	        "iz niebawem rozpocznie sie przedstawienie.\n ";
	return str;
}

init_sztuka()
{
	string *sztuki=get_dir(SZTUKI);
	string *tmp;
	int i;
	float cz;
	
	if (!sizeof(sztuki)) 
		return write("Nie ma zadnych sztuk\n");
	sztuka=sztuki[random(sizeof(sztuki))];
	sztuka=read_file(SZTUKI+sztuka);
	sztuki=explode(sztuka, "##"); // uzyskujemy tablice elementow sztuki.
	sztuka=sztuki[0];
	sztuki-=sztuki[0..0];
	while(sizeof(sztuki)>0)
	{
		tmp=explode(sztuki[0], "#");
		if (sizeof(tmp)!=3)
			dump_array(tmp+({"Cholera, cos nie wyszlo"}));
		sceny+=tmp[0..0];
		if (tmp[1]=="") tmp[1]=0;
		opisy+=tmp[1..1];
		if (!sscanf(tmp[2], "%f", cz))
		   SAY("Wystapil powazny blad. Zglos go dyrekcji teatru.\n");
		czasy+=({cz});
		sztuki-=sztuki[0..0];
	}
}

opusc_kurtyne()
{
	if (!kurtyna)
	{
		kurtyna=1;
		SAY("Poruszana niewidocznymi mechanizmami kurtyna zaczyna "+
		  "opadac, i po chwili szczelnie zaslania cala scene.\n");
	}
}

zapal_swiatlo()
{
	if (!swiatlo)
	{
		swiatlo=1;
		add_prop(ROOM_I_LIGHT,1);
		SAY("Wokol widowni rozblyskuja swiatla pochodni, "+
		   "rozpraszajac panujacy polmrok.\n");
  	}
}

podnies_kurtyne()
{
	if (kurtyna)
	{
		kurtyna=0;
		SAY("Powoli kurtyna unosi sie, odslaniajac pusta na razie "+
			"scene.\n");
	}
}

zgas_swiatlo()
{
	if (swiatlo)
	{
		swiatlo=0;
		add_prop(ROOM_I_LIGHT, -1);
		SAY("Wiszace wokol widowni luczywa gasna nagle, pograzajac "+
		    "ja w mroku. Tylko kilka oswietlajacych scene plonie "+
		    "nadal.\n");
	}
}

otworz()
{
	otwarte=1;
	powiedz_wejsciu("Bileter otwiera wejscie do namiotu, wypuszczajac widzow i staje przy wejsciu gotow do sprawdzania biletow.\n");
}

zamknij()
{
	otwarte=0;
	powiedz_wejsciu( "Bileter zamyka wejscie do namiotu, w ktorym wlasnie zaczyna sie sztuka.\n");
}

go_sztuka()
{
	if (!sizeof(sceny))
		return init_teatr();
	if (!sizeof(opisy))
		SAY("Cos sie zepsulo. Prosze powiadomic dyrekcje teatru.\n");
	if (!sizeof(czasy))
		SAY("Cos sie bardzo zepsulo. Prosze powiadomic dyrekcje teatru.\n");
	if (opisy[0]) opis=opisy[0];
	SAY(sceny[0]);
	set_alarm(czasy[0], 0.0, &go_sztuka());
	if (sizeof(sceny)>1) 
		sceny=sceny[1..-1];
	else sceny=({});
	if (sizeof(opisy))
		opisy=opisy[1..-1];
	else opisy=({});
	if (sizeof(czasy))
		czasy=czasy[1..-1];
	else czasy=({});
}

zacznij()
{
	zamknij();
	zgas_swiatlo();
	podnies_kurtyne();
	set_alarm(5.0,0.0,&go_sztuka());
}

idz_dalej()
{
	SAY("Pracownicy teatru grzecznie wypraszaja cie na zewnatrz, "+
		"tlumaczac swoje zachowanie potrzeba szybkiego zwiniecia "+
		"namiotu.\n");
	all_inventory(this_object())->move_living("na wyjscie", 
		WEJSCIE->otoczenie(), 1, 0);
	powiedz_wejsciu( "Pracownicy teatru szybko i sprawnie zwijaja namiot. Zaladowane po brzegi wozy ruszaja w dalsza droge.\n");
	WEJSCIE->remove_object();
	clone_object(WEDROWNY)->idz_w_swiat(lokacja++);
	remove_exit("wyjscie");
}

init_teatr()
{
	init_sztuka();
	opusc_kurtyne();
	zapal_swiatlo();
	opis=0;
	otworz();
	if (licznik++ >= ILOSC)
	{
		licznik=1;
		idz_dalej();
		set_alarm(ILE_ROZKLADA+90.0, 0.0, zacznij);
	}
	else set_alarm(90.0, 0.0, zacznij);
}

int
czy_mozna()
{
	return otwarte;
}

string
query_tytul()
{
	return sztuka;
}

int
brawo(string str)
{
	write("Bijesz entuzjastycznie brawo.\n");
	say(QCIMIE(this_player(), PL_MIA)+" bije entuzjastycznie brawo.\n");
	return 1;
}

int
pokaz(string str)
{
	if (member_array(query_verb(), ({"ob","obejrzyj"}))==-1) return 0;
	if (str=="scene") return !write(pokaz_scene());
	if (str=="kurtyne") return !write(pokaz_kurtyne());
}

init()
{
	::init();
	add_action(brawo,"brawo");
	add_action(pokaz, "ob",1);
}
