Added public files
Roughly added all public files. Probably missed some, though.
diff --git a/d/seher/haeuser/truhe.c b/d/seher/haeuser/truhe.c
new file mode 100644
index 0000000..3eab8ad
--- /dev/null
+++ b/d/seher/haeuser/truhe.c
@@ -0,0 +1,365 @@
+#include "haus.h"
+#include <properties.h>
+#include <moving.h>
+#include <wizlevels.h>
+
+inherit "/d/wueste/durian/behaelter";
+inherit "/p/service/wargon/mat_ed";
+inherit "/mail/nedit";
+
+static string owner;
+
+void create()
+{
+ if (!clonep(this_object())) return;
+
+ ::create();
+
+ Set(P_NAME, SAVE, F_MODE_AS);
+ Set(P_SHORT, SAVE, F_MODE_AS);
+ Set(P_LONG, SAVE, F_MODE_AS);
+ Set(P_GENDER, SAVE, F_MODE_AS);
+ Set(P_IDS, SAVE, F_MODE_AS);
+ Set(P_INVIS, SAVE, F_MODE_AS);
+ Set(P_NAME_ADJ, SAVE, F_MODE_AS);
+ Set(P_MATERIAL, SAVE, F_MODE_AS);
+ Set(H_DOORLSTAT, SAVE, F_MODE_AS);
+
+ SetProp( P_NAME, "Truhe" );
+ SetProp( P_SHORT, "Eine Truhe" );
+ SetProp( P_LONG,
+ "Eine stabile Holztruhe mit einem Sicherheitsschloss. Nur ausgewaehlte\n"
+ +"Personen duerfen die Truhe oeffnen und Sachen in ihr lagern oder aus\n"
+ +"ihr nehmen.\n" );
+ SetProp( P_GENDER, FEMALE );
+ SetProp( P_NOGET, 1 );
+ SetProp( P_IDS, ({ "truhe","holztruhe", TRUHE}) );
+ SetProp( P_MATERIAL, ([ MAT_MISC_WOOD : 100 ]) );
+ SetProp( H_DOORLSTAT, ({ "geschlossen", "geoeffnet"}) );
+
+ AddCmd( ({ "schieb","schiebe"}), "schieben" );
+ AddCmd( ({ "beschreib", "beschreibe" }), "beschreiben" );
+ AddCmd( ({ "aender", "aendere" }), "aendern" );
+}
+
+mixed
+_set_owner(string ow)
+{
+ string *na, *a;
+ int i;
+
+ if (ow && stringp(ow))
+ restore_object(HAUSSAVEPATH+ow+"truhe");
+
+ if ((na = QueryProp(P_NAME_ADJ)) && (i=sizeof(na))) {
+ for (a = ({ }), i-=1; i>=0; i--)
+ a += ({ DeclAdj(na[i], WER)[0..<2], DeclAdj(na[i], WEM)[0..<2], DeclAdj(na[i],WEN)[0..<2] });
+
+ a = m_indices(mkmapping(a));
+ if (sizeof(a))
+ AddAdjective(a);
+ }
+
+ SetZu();
+ return owner=ow;
+}
+
+string
+short()
+{
+ int open;
+ string sh, *stat;
+
+ open = (QueryProp(P_CNT_STATUS) == CNT_STATUS_OPEN);
+ sh = QueryProp(P_SHORT);
+ stat = QueryProp(H_DOORLSTAT);
+ if (!stat)
+ stat = ({ "", ""});
+ else if (strstr(sh, "%s") == -1)
+ sh += " (%s)";
+ if(QueryProp(P_INVIS)) return "";
+ return sprintf(sh, stat[offen])+".\n";
+}
+
+oeffne(string str)
+{
+ object env;
+
+ notify_fail("WAS moechtest Du oeffnen?\n");
+
+ // bin ich gemeint?
+ if (!str || present(str, environment()) != this_object())
+ return 0;
+
+ if ((env=environment()) && env->id("sehe\rhaus")) {
+ if (!env->allowed_check(this_player())) {
+ write("Du darfst "+name(WEN)+" nicht oeffnen!\n" );
+ return 1;
+ }
+ }
+ return ::oeffne(str);
+}
+
+int MayAddWeight(int w)
+{
+ return 0;
+}
+
+static int
+schieben(string richtung)
+{
+ string *aus;
+ mapping exits;
+
+ if (!environment() || (!environment()->id("sehe\rhaus")) ||
+ !environment()->tp_owner_check())
+ return 0;
+
+ notify_fail( "Syntax: schiebe <truhe> nach <richtung>\n");
+
+ if (!richtung || richtung == "")
+ return 0;
+
+ aus = old_explode(richtung, " ");
+ richtung = aus[<1];
+ if (sizeof(aus) < 3 || !id(implode(aus[0..<3]," ")))
+ return 0;
+
+ if (member(aus = m_indices(exits = environment()->QueryProp(P_EXITS)),richtung)==-1)
+ write( "Du kannst "+name(WEN,1)+" nicht nach '"+richtung+"' schieben!\n");
+ else if (!exits[richtung]->tp_owner_check())
+ write( "Du kannst "+name(WEN,1)+" nicht aus Deinem Haus hinausschieben!\n");
+ else {
+ write( "Du schiebst "+name(WEN,1)+" in einen anderen Raum. Dann kehrst\n"
+ +"Du wieder zurueck.\n");
+ say(capitalize(this_player()->name(WER))+" schiebt "+name(WEN)+" in einen anderen\n"
+ +"Raum, kehrt aber selber wieder.\n");
+ environment()->Set(H_CHEST,0);
+ environment()->Save();
+ move(exits[richtung], M_NOCHECK);
+ environment()->Set(H_CHEST,1);
+ environment()->Save();
+ }
+ return 1;
+}
+
+private string *brk(string str)
+{
+ int i;
+ string *t1, *t2;
+
+ t1 = regexplode(str, ", *");
+ for (t2 = ({}), i=sizeof(t1)-1; i>=0; i-=2)
+ t2 = ({t1[i]}) + t2;
+
+ return t2;
+}
+
+static void getShort();
+
+static int beschreiben(string str)
+{
+ string *x;
+
+ if (!str || getuid(this_player()) != owner)
+ return 0;
+
+ x = old_explode(str, " ");
+
+ if (x[<1] == "status" && !id(implode(x[0..<2]," ")))
+ return 0;
+ else if (!id(str) && (str != "truhe"))
+ return 0;
+
+ write( "Beschreibung "+name(WESSEN,1)+"\n"
+ +"Wenn die Vorgaben nicht geaendert werden sollen, einfach weiter\n"
+ +"mit <RETURN>.\n\n");
+ getShort();
+ return 1;
+}
+
+static void getShort()
+{
+ write("Geschlecht (m, w, s): ["
+ +({ "s","m","w" })[QueryProp(P_GENDER)]+"]\n]" );
+ input_to("gotGender");
+}
+
+static void gotGender(string str)
+{
+ int gen;
+ mixed name;
+
+ if (!str || str == "")
+ write("Geschlecht nicht geaendert.\n");
+ else if ((gen = member(({'s','m','w'}),str[0])) == -1) {
+ write( "Bitte nur 'm', 'w' oder 's' eingeben!\nGeschlecht:\n]");
+ input_to("gotGender");
+ return;
+ }
+ else {
+ SetProp(P_GENDER, gen);
+ write( "Das Geschlecht ist jetzt "+QueryGenderString()+".\n");
+ }
+
+ name = QueryProp(P_NAME);
+ write("Nun musst Du den Namen eingeben. Sollte der Name unregelmaessig dekliniert\n"
+ +"werden, musst Du den Namen in allen vier Faellen in der Reihenfolge Nomi-\n"
+ +"nativ, Genitiv, Dativ, Akkusativ und durch Kommata getrennt eingeben.\n"
+ +"Name: ["+(pointerp(name) ? implode(name, ", ") : name)+ "]\n]");
+ input_to("gotName");
+}
+
+static void gotName(string str)
+{
+ string *n;
+
+ if (!str || member(({ "", ".", "**", "~q"}), str) >= 0)
+ write("Name wurde nicht geaendert.\n");
+ else {
+ n = brk(str);
+
+ if (sizeof(n) == 1)
+ SetProp(P_NAME, n[0]);
+ else {
+ if (sizeof(n) > 4)
+ n = n[0..3];
+ else
+ while (sizeof(n) != 4)
+ n = n + ({ n[0] });
+ SetProp(P_NAME,n);
+ }
+ printf("Der Name ist jetzt '%s'\n", implode(n, ", "));
+ }
+ write("Du kannst jetzt noch Namensadjektive angeben. Hier darfst Du nur den Wort-\n"
+ +"stamm angeben, da die Adjektive automatisch dekliniert werden (also fuer\n"
+ +"eine 'alte Truhe' muesstest Du 'alt' angeben).\n"
+ +"Du kannst auch mehrere Adjektive, durch Kommata getrennt, angeben.\n"
+ +"Um alle Namensadjektive zu loeschen, gib bitte 'nix' ein.\n"
+ +"Namensadjektive: ["+implode(QueryProp(P_NAME_ADJ),", ")+"]\n");
+ input_to("gotAdj");
+}
+
+static void gotAdj(string str)
+{
+ string *n;
+
+ if (!str || member(({ "", ".", "**", "~q"}), str) >= 0)
+ write("Adjektive nicht geaendert.\n");
+ else {
+ n = brk(str);
+
+ if (member(n, "nix") == -1) {
+ SetProp(P_NAME_ADJ, n);
+ printf("Namensadjektive lauten %s.\n", implode(n,", "));
+ }
+ else {
+ SetProp(P_NAME_ADJ, ({}) );
+ write("Namensadjektive geloescht.\n");
+ }
+ }
+ SetProp(P_SHORT, capitalize(name(WER)));
+ write( "Die Kurzbeschreibung lautet damit:\n"+short());
+ write( "Falls das Ergebnis nicht Deinen Vorstellungen entspricht, gelangst Du\n"
+ +"mit 'n' wieder in die Geschlechtsabfrage, ansonsten geht es in der\n"
+ +"Beschreibunssequenz weiter.\n"
+ +"Stimmt die Kurzbeschreibung so? (j/n)\n]");
+ input_to("gotKurz");
+}
+
+static void gotKurz(string str)
+{
+ string art, nam, *p;
+ int gen;
+
+ if (str && sizeof(str) && str[0] == 'n') {
+ write( "Neues Spiel, neues Glueck... ;)\n");
+ getShort();
+ return;
+ }
+ write("\nIDs (durch Kommata getrennt):\n["+implode(QueryProp(P_IDS)-({TRUHE}), ",")+"]\n]");
+ input_to("gotIDs");
+}
+
+static void gotIDs(string str)
+{
+ if (!str || member( ({ "", ".", "**", "~q" }), str) >= 0 )
+ write("IDs nicht geaendert.\n");
+ else {
+ str = implode(old_explode(lower_case(str)," ")-({""})," ");
+ str = implode(old_explode(str,", "),",");
+ SetProp(P_IDS, old_explode(str, ",")+({TRUHE}));
+ write("OK, IDs lauten '"+str+"'\n");
+ }
+ write("\nBitte Langbeschreibung eingeben (Abbruch mit ~q, Ende mit . oder **):\n");
+ nedit("gotLang");
+}
+
+static void gotMat(mapping mat);
+
+static void gotLang(string str)
+{
+ if (!str || str == "")
+ write("Die Langbeschreibung wurde nicht veraendert.\n");
+ else
+ SetProp(P_LONG,implode(old_explode(str, "@@"),"**"));
+
+ write("\nBitte das Material "+name(WESSEN,1)+" bestimmen:\n"
+ "(<RETURN> falls nichts geaendert werden soll)\n\n");
+
+ EditMaterial(QueryProp(P_MATERIAL), #'gotMat, 0, ({MATGROUP_GAS,MATGROUP_EXPLOSIVE}));
+}
+
+static void gotMat(mapping mat)
+{
+ if (mappingp(mat)) {
+ SetProp(P_MATERIAL, mat);
+ write("OK.\n");
+ }
+ else
+ write("Das Material wurde nicht veraendert.\n");
+
+ save_object(HAUSSAVEPATH+owner+"truhe");
+}
+
+static int aendern(string str)
+{
+ if (getuid(this_player())!=owner || !id(str))
+ return 0;
+
+ write("Bitte Langbeschreibung aendern.\n(Abbruch mit ~q, Ende mit . oder **, Hilfe mit ~h)\n");
+ nedit("gotLang", QueryProp(P_LONG));
+ return 1;
+}
+
+void Save()
+{
+ save_object(HAUSSAVEPATH+owner+"truhe");
+}
+
+int SmartLog(string ofile, string typ, string msg, string date)
+{
+ object home;
+ string foo, bar;
+
+ write_file(REPFILE(owner), sprintf("%s von %s an der Truhe (%s):\n%s\n",
+ typ,
+ capitalize(getuid(this_player())),
+ date,
+ break_string(msg,78)));
+
+ if (IS_LEARNER(owner)) {
+ log_file("report/"+owner+".rep",
+ sprintf("MELDUNG von %s im Seherhaus, an der Truhe (%s):\n"
+ +"Bitte zur Kenntnis nehmen! (Mit dem Befehl 'meldungen') -Wargon\n",
+ capitalize(getuid(this_player())),
+ date));
+ }
+
+ home = load_object(RAUMNAME(owner,0));
+ home->Set(H_REPORT, home->Query(H_REPORT)+1);
+ home->Save();
+
+ return 1;
+}
+