blob: b39de0e00487973521bff60bb4bce69fa9ec643d [file] [log] [blame]
#include "../haus.h"
inherit "std/thing";
inherit "/p/service/wargon/sm/statemachine";
#include "/p/service/wargon/sm/statemachine.h"
#include <properties.h>
#include <moving.h>
#define STATE_IDLE 0
#define STATE_GENERATING 1
#define SIG_INIT 0
#define SIG_GENERATE 1
#define SIG_DONE 2
private string dump(int haus, int final);
private void enterGenerating(string ow, object env, int nr, int fin, int all);
private void doGenerating(string ow, object env, int nr, int fin, int all);
create()
{
if (!clonep(this_object())) return;
thing::create();
statemachine::create();
SetProp( P_NAME, "Hausmeister");
SetProp( P_SHORT, "Ein Hausmeister" );
SetProp( P_LONG,
"Dies ist der Hausmeister aller Seherhaeuser. Er hilft Wurzel bei der\n"
+"Verwaltung der Haeuser.\n"
+"Der Hausmeister hat einen blauen Kittel an und eine Abrissbirne gezueckt.\n" );
SetProp( P_GENDER,MALE);
SetProp( P_NOGET, 1);
AddId( "hausmeister" );
AddState(STATE_IDLE, 0, 0);
AddState(STATE_GENERATING, #'doGenerating, 0);
AddTransition(SM_INVALID, SIG_INIT, STATE_IDLE);
AddTransition(STATE_IDLE, SIG_GENERATE, STATE_GENERATING, #'enterGenerating);
AddTransition(STATE_GENERATING, SIG_GENERATE, STATE_GENERATING, #'enterGenerating);
AddTransition(STATE_GENERATING, SIG_DONE, STATE_IDLE);
StateTransition(SIG_INIT);
AddCmd( "generiere", "generieren" );
AddCmd( ({ "reiss", "reisse" }), "abreissen" );
AddCmd( "verlege", "verlegen" );
}
static int
bewege(mixed dest, int flags, string msg1, string msg2)
{
int ret;
tell_room(environment(), capitalize(name(WER))+" "+msg1+".\n");
if ((ret = move(dest, flags)) == 1)
tell_room(environment(), capitalize(name(WER))+" "+msg2+".\n");
return ret;
}
static int generieren(string str)
{
object env;
int nr, fin, all;
string ow, *parm;
env = environment(this_player());
notify_fail( "Syntax: generiere <name> [<nr>] [soft | ganz]\n" );
if (!str || str == "")
return 0;
parm = old_explode(str, " ");
fin = 1;
switch (sizeof(parm)) {
case 3:
if (parm[2] == "soft")
fin = 0;
case 2:
if (parm[1] == "soft")
fin = 0;
else if (parm[1] == "ganz") {
ow = parm[0];
nr = (VERWALTER)->HausProp(ow, HP_ROOMS);
str = ow+"raum"+nr;
all = 1;
break;
}
else {
nr = to_int(parm[1]);
str = parm[0]+"raum"+parm[1];
ow = parm[0];
break;
}
case 1:
ow = parm[0];
nr = -1;
str = ow+"haus";
break;
default:
return 0;
}
if (file_size(HAUSSAVEPATH+ow+".o")<0) {
write( "Es gibt kein '"+str+"'!\n");
return 1;
}
StateTransition(SIG_GENERATE, ({ow, env, nr, fin, all }) );
return 1;
}
static void enterGenerating(string ow, object env, int nr, int fin, int all)
{
string str;
if (nr >= 0)
str = ow+"raum"+nr;
else
str = ow+"haus";
bewege(PATH+str, M_NOCHECK, "geht zur Arbeit", "kommt an");
tell_room(environment(),
Name(WER)+" zueckt einen Block, sieht sich alles genau an und macht\n"
+"sich hin und wieder Notizen. Dann nickt er zufrieden und steckt seinen\n"
"Block wieder weg.\n" );
}
static void doGenerating(string ow, object env, int nr, int fin, int all)
{
object gen;
string str, out;
gen = clone_object(PATH+"tools/generator");
out = gen->dump(environment(), fin, ({ ow, env, nr, fin, all }));
if (nr >= 0)
str = ow+"raum"+nr;
else
str = ow+"haus";
bewege(env, M_NOCHECK, "geht zu seinem Auftraggeber zurueck", "kommt an");
write( "Der Hausmeister sagt: Ich habe '"+str+"' in die Datei\n"
+"Der Hausmeister sagt: '"+out+"' geschrieben, Chef!\n");
}
void
GenerationDone(string ow, object env, int nr, int fin, int all)
{
if (all)
{
if (nr > 0)
{
call_out("StateTransition", 1,
SIG_GENERATE, ({ ow, env, nr-1, fin, 1 }) );
}
else
{
call_out("StateTransition", 1,
SIG_GENERATE, ({ ow, env, -1, fin, 0 }) );
}
}
else
{
StateTransition(SIG_DONE, ({ ow, env, -1, fin, 0 }) );
}
}
static int abreissen(string str)
{
object haus, env;
string ich, msg;
if (!str || str == "" || sscanf(str, "%s ab",str) != 1) {
notify_fail( "Syntax: reisse <name> ab\n" );
return 0;
}
str = lower_case(str);
if (!(haus = VERWALTER->FindeHaus(str))) {
write( capitalize(str)+" hat kein Haus!\n" );
return 1;
}
ich = capitalize(name(WER));
env = environment();
bewege(environment(haus), M_NOCHECK, "geht zur Arbeit", "kommt an");
msg = haus->Name(WER);
if (VERWALTER->LoescheHaus(str) == -1) {
tell_room(environment(), ich+" versucht vergeblich, ein Haus abzureissen.\n" );
msg = "Der Abrissversuch ist fehlgeschlagen, Chef!\n";
}
else {
tell_room(environment(), ich+" betaetigt eine Sirene.\n"+msg+" wird von "+name(WEM)+" eingeebnet.\n");
msg = msg+" ist abgerissen, Chef!\n";
if (haus) haus->remove();
}
bewege(env, M_NOCHECK, "geht zu seinem Auftraggeber zurueck", "kommt an");
write( "Der Hausmeister sagt: "+msg);
return 1;
}
static int verlegen(string str)
{
string name, von, nach;
object haus;
int ret;
if (!str || sscanf(str, "%s nach %s", name, nach) != 2) {
notify_fail( "Syntax: verlege <name> nach <ziel>\n" );
return 0;
}
if (nach == "hier")
nach = object_name(environment(this_player()));
name = lower_case(name);
if (!(haus = VERWALTER->FindeHaus(name))) {
write( "Der Hausmeister sagt: "+capitalize(name)+" hat kein Haus!\n" );
return 1;
}
von = object_name(environment(haus));
ret = VERWALTER->VerlegeHaus(name, von, nach);
write( "Der Hausmeister sagt: " );
switch(ret) {
case -111:
write( "Das hast Du nicht zu bestimmen!\n" );
break;
case -3:
write( "Der Zielraum laesst sich nicht laden! Verlegen abgebrochen!\n" );
break;
case -4:
write( "Im Zielraum kann nicht gebaut werden!\n" );
break;
case -5:
write( "Im Haus von "+capitalize(name)+" gibt es noch Ausgaenge in andere Haeuser!\n");
break;
case 1:
write( "OK, Chef, ich habe das Haus verlegt!\n" );
break;
}
return 1;
}