Added public files
Roughly added all public files. Probably missed some, though.
diff --git a/std/room.c b/std/room.c
new file mode 100644
index 0000000..29ab503
--- /dev/null
+++ b/std/room.c
@@ -0,0 +1,239 @@
+// MorgenGrauen MUDlib
+//
+// room.c -- room base object
+//
+// $Id: room.c 9475 2016-02-19 21:16:17Z Zesstra $
+#pragma strong_types
+#pragma save_types
+#pragma range_check
+#pragma no_clone
+#pragma pedantic
+
+inherit "/std/thing/properties";
+inherit "/std/thing/language";
+inherit "/std/hook_provider";
+inherit "/std/room/light";
+inherit "/std/container/inventory";
+inherit "/std/room/moving";
+inherit "/std/room/restrictions";
+inherit "/std/room/description";
+inherit "/std/room/exits";
+inherit "/std/room/commands";
+inherit "/std/room/items";
+inherit "/std/room/doors";
+
+#include <thing/properties.h>
+#include <config.h>
+#include <properties.h>
+#include <rooms.h>
+#include <language.h>
+#include <wizlevels.h>
+#include <moving.h>
+#include <defines.h>
+#include <doorroom.h>
+#include <functionlist.h>
+
+void reset()
+{
+ items::reset();
+ exits::reset();
+ doors::reset();
+}
+
+static int
+_query_noget()
+{
+ return 1;
+}
+
+//#define DB(x) if (find_player("jof")) tell_object(find_player("jof"),x); else write(x)
+//#undef DB
+//#define DB(x)
+void maybe_replace_program()
+{
+ string *list, first;
+ object first_ob;
+
+// Debugkram auskommentiert, Zesstra, 04.11.06
+// DB("MAYBE_REPLACE_PROGRAM\n");
+// DB(sprintf("FILENAME: %O\n",object_name(this_object())));
+// DB(sprintf("FIRST_OB: %O\n",inherit_list(this_object())));
+// first_ob=find_object(first=(list=inherit_list(this_object()))[1]);
+// DB(sprintf("%O ?= %O\n",sizeof(list),1+sizeof(inherit_list(first_ob))));
+// DB(sprintf("%O ?= sizeof(%O)\n",1,list=functionlist(this_object(),RETURN_FUNCTION_NAME|NAME_INHERITED)));
+ if (object_name(this_object())=="/std/room" ||
+ !(first_ob=find_object(first=(list=inherit_list(this_object()))[1])) ||
+ (sizeof(list)!=1+sizeof(inherit_list(first_ob))) ||
+ (1!=sizeof(list=functionlist(this_object(),
+ RETURN_FUNCTION_NAME|NAME_INHERITED))) ||
+ list[0]!="create")
+ return;
+// DB("REPLACING\n");
+ replace_program(first);
+}
+
+protected void create()
+{
+ maybe_replace_program();
+ /* Set effective userid to userid */
+ /* so that we may clone other things */
+ seteuid(getuid(this_object()));
+ properties::create();
+ restrictions::create();
+ commands::create();
+ light::create();
+ description::create();
+ exits::create();
+ items::create();
+ doors::create();
+
+ SetProp(P_NAME,0);
+ SetProp(P_NAME_ADJ,({}));
+ Set(P_SHORT,0);
+ Set(P_LONG,0);
+ Set(P_TRANSPARENT,0);
+ Set(P_ADJECTIVES,({}));
+ Set(P_IDS,({}));
+ Set(P_WEIGHT,PROTECTED,F_MODE);
+ Set(P_TOTAL_WEIGHT,PROTECTED,F_MODE);
+ Set(" clean counter ",2);
+}
+
+protected void create_super() {
+ set_next_reset(-1);
+}
+
+private int
+check_clean_count()
+{
+ int cc;
+
+ cc=Query(" clean counter ");
+ if (--cc<=0)
+ return 1;
+ Set(" clean counter ",cc);
+ return 0;
+}
+
+int
+clean_up(int arg)
+{
+ mixed itema;
+
+ if(arg>1) return 1; // better not ;)
+
+ if (Query(" never clean ")) return 0;
+
+ // if there are any item we have produced ourselfes check them
+ if(pointerp(itema = QueryProp(P_ITEMS)))
+ {
+ mixed names;
+ int i;
+ i = sizeof(names = all_inventory(this_object()));
+ while(i--)
+ {
+ if (query_once_interactive(names[i]))
+ {
+ Set(" clean counter ",2);
+ return 1;
+ }
+ if(objectp(names[i])) names[i] = explode(object_name(names[i]),"#")[0];
+ }
+
+ for(i = sizeof(itema)-1; i >= 0; i--)
+ {
+ // Semantik:
+ // 1. Wenn RITEM_OBJECT ein array ist, kann evtl ge'clean'ed werden.
+ // 2. Wenn es ein REFRESH_NONE Item ist und es entweder nicht mehr
+ // existiert oder nicht in diesem Raum ist, kein clean_up (es wuerde
+ // beim neuladen des Raumes ja wieder erzeugt;
+ // falls es aber hier ist, wird es mitvernichtet, dann ists ok)
+ // 3. Wenn es ein REFRESH_DESTRUCT ist und noch existiert, aber nicht
+ // hier ist, KEIN clean_up.
+ if (!pointerp(itema[i][RITEM_OBJECT])
+ && ((itema[i][RITEM_REFRESH] == REFRESH_NONE
+ && (!itema[i][RITEM_OBJECT]
+ || environment(itema[i][RITEM_OBJECT])!=this_object()))
+ || (itema[i][RITEM_REFRESH] == REFRESH_DESTRUCT
+ && itema[i][RITEM_OBJECT]
+ && environment(itema[i][RITEM_OBJECT]) != this_object())))
+ return 1;
+ names -= (pointerp(itema[i][RITEM_FILE]) ?
+ itema[i][RITEM_FILE] : ({ itema[i][RITEM_FILE] }));
+ }
+ // if there are objects left in the room do not clean up but try again later
+ if(sizeof(names) && !check_clean_count()) return 1;
+ }
+ else
+ // is there any object lying around?
+ if(first_inventory(this_object()) && !check_clean_count()) return 2;
+
+ // do clean_up
+ //log_file("clean_up_log",sprintf(
+ // "%s:%s: %O\n",ctime(time())[11..18],__HOST_NAME__,this_object()));
+
+ remove();
+ // wenn der Raum sich im remove() nicht zerstoert, hat er dafuer vermutlich
+ // nen Grund. Evtl. klappts ja naechstes Mal.
+
+ return(1);
+}
+
+/* Instead of printing the exits with the long description, we implement */
+/* the command "exits" to show them. */
+int
+show_exits() {
+ mixed ex;
+ if( this_player()->CannotSee() ) return 1;
+ if ((ex=QueryProp(P_HIDE_EXITS)) && intp(ex)) return 1;
+ if (ex = GetExits(this_player())) write(ex);
+ return 1;
+}
+
+int
+toggle_exits(string str)
+{
+ int ex;
+
+ /* Nur das aktuelle Environment des Spielers ist zustaendig fuer die
+ Auflistung der Ausgaenge. Anderenfalls wird das Kommando von Raeumen
+ im Raum (z.B. Transportern) abgefangen und es werden dessen Ausgaenge
+ aufgelistet.
+ Sprich: keine Auflistung von Aussen. */
+ if (environment(this_player()) != this_object()) return 0;
+ if (!str) return show_exits();
+ if (str!="auto") return 0;
+ ex = this_player()->QueryProp(P_SHOW_EXITS);
+ this_player()->SetProp(P_SHOW_EXITS, !ex);
+ if (ex) write("Ausgaenge werden nicht mehr automatisch angezeigt.\n");
+ else write("Ausgaenge werden automatisch angezeigt.\n");
+ return 1;
+}
+
+void
+init()
+{
+ Set(" clean counter ",2);
+
+ exits::init();
+ commands::init();
+ description::init();
+ doors::init();
+
+ add_action("toggle_exits", "exits");
+ add_action("toggle_exits", "ausgang");
+ add_action("toggle_exits", "ausgaenge");
+ add_action("toggle_exits", "aus");
+}
+
+int _query_para(){
+ int re;
+ if(re=Query(P_PARA))return re;
+ if(sizeof(regexp(({object_name(this_object())}),".*\\^0$")))
+ return -1;
+ return to_int(
+ regreplace(object_name(this_object()),".*\\^\([1-9][0-9]*\)$","\\1",1));
+}
+
+//dies ist ein Raum, war gewuenscht von mehreren Leuten.
+status IsRoom() {return(1);}