Added public files
Roughly added all public files. Probably missed some, though.
diff --git a/obj/tools/explorer.c b/obj/tools/explorer.c
new file mode 100644
index 0000000..72da8ac
--- /dev/null
+++ b/obj/tools/explorer.c
@@ -0,0 +1,445 @@
+// MorgenGrauen MUDlib
+//
+// explorer.c -- Tool zur FP-Verwaltung
+//
+// $Id: explorer.c 8357 2013-02-09 11:16:14Z Zesstra $
+
+inherit "/std/secure_thing";
+
+#include <properties.h>
+#include <exploration.h>
+#include <wizlevels.h>
+
+create()
+{
+ if (!clonep(this_object())) return;
+ ::create();
+ SetProp(P_SHORT, "Der Erforscher");
+ SetProp(P_NAME, "Erforscher");
+ SetProp(P_GENDER, MALE);
+ SetProp(P_LONG, "Dies ist der beruehmte Erforscher des MorgenGrauens. Er\n"
+ +"stellt folgende Befehle zur Verfuegung:\n"
+ +" epadd <was>: <bonus> <typ> <keys>\n"
+ +" epchange <was>: <wie> <neu>\n"
+ +" epdel <was>\n"
+ +" epinfo <was>\n"
+ +" epcount <spielername> - Anzahl der EPs des Spielers\n"
+ +" epscan <spielername> [filenamenpattern] - Zeige dessen EPs gefiltert an\n"
+ +" eppladd <spielername> <ep-anzahl> - Gib ihm ep-anzahl EPs (zufaellig)\n"
+ +" eppldel <spielername> <ep-anzahl> - Loesche ihm ep-anzahl EPs (zufael.)\n"
+ +" epplset <spielername> <ep-nummer> - Setze ihm EP ep-nummer\n"
+ +" epplclr <spielername> <ep-nummer> - Loesche ihm EP ep-nummer\n"
+ +"Dabei bedeutet:\n"
+ +"<was> - Das Objekt (eine ID bei Objekten in der Naehe, hier oder\n"
+ +" here fuer den aktuellen Raum, oder ein Dateiname)\n"
+ +"<bonus> - n fuer normale EPs, b fuer Bonus-EPs (z.B. Para-EPs)\n"
+ +"<typ> - detail, rdetail, exit/ausgang, cmd/befehl/kommando, info, pub, misc,\n"
+ +" smell/geruch, sound/noise, taste/touch\n"
+ +"<key> - Liste der Schluesselwoerter, mit Kommata getrennt\n"
+ +"<wie> - obj, key, bonus oder typ 1\n"
+ +"<neu> - Je nach <wie>; siehe <was>, <key>, <typ>\n"
+ );
+ SetProp(P_NODROP, 1);
+ SetProp(P_NEVERDROP, 1);
+ SetProp(P_AUTOLOADOBJ,1);
+ AddId(({"explorer","erforscher"}));
+
+ AddCmd(({"epadd"}), "add");
+ AddCmd(({"epchange"}), "change");
+ AddCmd(({"epdel"}), "del");
+ AddCmd(({"epinfo"}), "info");
+ AddCmd(({"epcount"}), "epcount");
+ AddCmd(({"epscan"}), "epscan");
+ AddCmd(({"eppladd"}), "eppladd");
+ AddCmd(({"eppldel"}), "eppldel");
+ AddCmd(({"epplset"}), "epplset");
+ AddCmd(({"epplclr"}), "epplclr");
+}
+
+static string strArr(string *s)
+{
+ string ret;
+ int i;
+
+ ret = ("\"" + s[<1] + "\"");
+ for (i=sizeof(s)-2; i>=0; i--)
+ ret += (", \""+s[i]+"\"");
+
+ return ret;
+}
+
+static int getType(string s)
+{
+ switch(s[0..2]) {
+ case "det":
+ return EP_DETAIL;
+ case "rde":
+ return EP_RDET;
+ case "aus":
+ case "exi":
+ return EP_EXIT;
+ case "cmd":
+ case "bef":
+ case "kom":
+ return EP_CMD;
+ case "inf":
+ return EP_INFO;
+ case "pub":
+ return EP_PUB;
+ case "mis":
+ case "ver":
+ return EP_MISC;
+ case "sme":
+ case "ger":
+ return EP_SMELL;
+ case "sou":
+ case "noi":
+ return EP_SOUND;
+ case "tas":
+ case "tou":
+ return EP_TOUCH;
+ }
+ return -1;
+}
+
+static object getOb(string str)
+{
+ object ob;
+
+ if (str == "hier" || str == "here" )
+ return environment(this_player());
+
+ ob = present(str, environment(this_player()));
+ if (!ob)
+ ob = present(str, this_player());
+
+ if (!ob) {
+ str = "/secure/master"->_get_path(str, getuid(this_player()));
+ catch(call_other(str, "???"));
+ ob = find_object(str);
+ }
+ return ob;
+}
+
+static string *getKeys(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 string errMsg(int code)
+{
+ if (code >= 0 || code < EPERR_INVALID_ARG)
+ return "Unbekannter Fehler";
+
+ code = -(code+1);
+ return ({ "Du bist kein Erzmagier", "Ungueltiges Objekt",
+ "Objekt steht nicht in der Liste", "Ungueltiges Argument"})[code];
+}
+
+static int add(string str)
+{
+ string was, t, k, *keys, b;
+ int type, bonus;
+ object ob;
+
+ if( !ARCH_SECURITY ) {
+ notify_fail("Du bist kein Erzmagier!\n");
+ return 0;
+ }
+ notify_fail("Syntax: epadd <was>: <typ>\n");
+ if (!(str = this_player()->_unparsed_args()))
+ return 0;
+
+ if (sscanf(str, "%s: %s %s %s", was, b, t, k) !=4)
+ return 0;
+
+ if (!(ob = getOb(was))) {
+ printf("Kann '%s' nicht finden!\n", was);
+ return 1;
+ }
+ if ((type = getType(t)) < 0) {
+ write("Ungueltiger Typ!\n");
+ return 1;
+ }
+ if (b=="n") bonus=0; else if (b=="b") bonus=1;
+ else {
+ write("Ungueltige Bonusart!\n");
+ return 1;
+ }
+ keys = getKeys(k);
+
+ type = EPMASTER->AddEPObject(ob, keys, type, bonus);
+ if (type < 0)
+ printf("Fehler: %s\n", errMsg(type));
+ return 1;
+}
+
+static int change(string str)
+{
+ string was, wie, neu;
+ object ob;
+ int type;
+ mixed new;
+
+ if( !ARCH_SECURITY ) {
+ notify_fail("Du bist kein Erzmagier!\n");
+ return 0;
+ }
+
+ notify_fail("Syntax: epchange <was>: <wie> <neu>\n");
+ if (!(str = this_player()->_unparsed_args()))
+ return 0;
+
+ if (sscanf(str, "%s: %s %s", was, wie, neu) != 3)
+ return 0;
+
+ if (!(ob = getOb(was))) {
+ printf( "Kann '%s' nicht finden!\n", was);
+ return 1;
+ }
+ switch(wie[0..2]) {
+ case "obj":
+ type = CHANGE_OB;
+ new = getOb(neu);
+ if (!new) {
+ printf( "Kann '%s' nicht finden!\n", neu);
+ return 1;
+ }
+ break;
+ case "key":
+ type = CHANGE_KEY;
+ new = getKeys(neu);
+ break;
+ case "typ":
+ type = CHANGE_TYPE;
+ if ((new = getType(neu)) < 0) {
+ write("Ungueltiger Typ!\n");
+ return 1;
+ }
+ break;
+ case "bon":
+ type = CHANGE_BONUS;
+ if (neu=="n") new=0; else if (neu=="b") new=1;
+ else {
+ write("Ungueltige Bonusart!\n");
+ return 1;
+ }
+ break;
+ default:
+ write("Das laesst sich nicht aendern...\n");
+ return 1;
+ break;
+ }
+ type = EPMASTER->ChangeEPObject( ob, type, new );
+ if (type < 0)
+ printf("Fehler: %s\n",errMsg(type));
+
+ return 1;
+}
+
+static int del(string str)
+{
+ object ob;
+ int ret;
+
+ if( !ARCH_SECURITY ) {
+ notify_fail("Du bist kein Erzmagier!\n");
+ return 0;
+ }
+ if (!str) {
+ notify_fail("Syntax: epdel <was>\n");
+ return 0;
+ }
+ if (!(ob = getOb(str))) {
+ write("Kann das Objekt nicht finden!\n");
+ return 1;
+ }
+ ret = EPMASTER->RemoveEPObject(ob);
+ if (ret < 0)
+ printf("Fehler: %s\n", errMsg(ret));
+
+ return 1;
+}
+
+static int info(string str)
+{
+ object ob;
+ mixed info;
+
+ if( !ARCH_SECURITY ) {
+ notify_fail("Du bist kein Erzmagier!\n");
+ return 0;
+ }
+
+ if (!str) {
+ notify_fail("Syntax: epinfo <was>\n");
+ return 0;
+ }
+
+ if (!(ob = getOb(str))) {
+ write("Das finde ich leider nicht...\n");
+ return 1;
+ }
+ if (!(info = EPMASTER->QueryEPObject(ob)))
+ write ("Das Objekt ist nicht eingetragen!\n");
+ else
+ printf("Nummer: %d\nBonus: %d\nTyp: %s\nSchluessel: %s\n",
+ info[MPOS_NUM],
+ info[MPOS_TYPE+1],
+ ({ "Detail", "Ausgang", "Kommando", "Info", "Misc", "ReadDetail",
+ "Kneipe", "Geruch", "Geraeusch", "Tastdetail"})[info[MPOS_TYPE]],
+ strArr(info[MPOS_KEY] ));
+
+ return 1;
+}
+
+static object find_playerob( string name ) {
+ return find_player(name)||find_netdead(name);
+}
+
+static int epcount( string str ) {
+ object pl,epm;
+
+ if( !ARCH_SECURITY ) {
+ notify_fail("Du bist kein Erzmagier!\n");
+ return 0;
+ }
+
+ if (!str || str=="") {
+ notify_fail("Syntax: epcount <spielername>\n");
+ return 0;
+ }
+
+ printf( "%s hat %d von %d FPs. (Durchschnitt = %d)\n",
+ capitalize(str),
+ EPMASTER->QueryExplorationPoints(str),
+ EPMASTER->QueryMaxEP(),
+ EPMASTER->QueryAverage()
+ );
+ return 1;
+}
+
+static int epscan( string str ) {
+ object pl;
+ int erg;
+ string *astr;
+
+ if( !ARCH_SECURITY ) {
+ notify_fail("Du bist kein Erzmagier!\n");
+ return 0;
+ }
+
+ if (!str || str=="") {
+ notify_fail("Syntax: epscan <spielername> [Teil des Filenamens]\n");
+ return 0;
+ }
+
+ astr=old_explode(this_player()->_unparsed_args()," ");
+
+ if (sizeof(astr)<2)
+ erg = EPMASTER->ShowPlayerEPs(astr[0]);
+ else
+ erg = EPMASTER->ShowPlayerEPs(astr[0],astr[1]);
+ if (erg < 0)
+ printf("Fehler: %s\n",errMsg(erg));
+ return 1;
+}
+
+static eppldel( string str ) {
+ string player, rest;
+ int epnum;
+ object tmp;
+
+ if( !ARCH_SECURITY ) {
+ notify_fail("Du bist kein Erzmagier!\n");
+ return 0;
+ }
+
+ notify_fail( "eppldel <spieler> <anzahl_eps> <grund>\n" );
+ if( !str || sscanf( str, "%s %d %s", player, epnum, rest )<2 )
+ return 0;
+
+ if( epnum <= 0 ) {
+ write( "Anzahl der FPs <= 0 ?\n" );
+ return 1;
+ }
+ if( !rest || rest=="" ) {
+ write( "Bitte Grund angeben!\n" );
+ return 1;
+ }
+
+ printf( "%O %O %O\n", epnum, player, secure_level() );
+ epnum = "/secure/explorationmaster"->RemoveFP( epnum, player, rest );
+ printf( "Ergebnis (abgezogene EPs) = %O\n", epnum );
+ return 1;
+
+}
+
+static eppladd( string str ) {
+ string player, rest;
+ int epnum;
+ object pl,tmp;
+
+ if( !ARCH_SECURITY ) {
+ notify_fail("Du bist kein Erzmagier!\n");
+ return 0;
+ }
+
+ notify_fail( "eppladd <spieler> <anzahl_eps>\n" );
+ if( !str || sscanf( str, "%s %d", player, epnum )<2 )
+ return 0;
+
+ if( epnum <= 0 ) {
+ write( "Anzahl der FPs <= 0 ?\n" );
+ return 1;
+ }
+
+ epnum = "/secure/explorationmaster"->AddFP( epnum, player );
+ printf( "Ergebnis (hinzugefuegte FPs) = %O\n", epnum );
+ return 1;
+
+}
+
+static epplset( string str ) {
+ string player, rest;
+ int epnum;
+ object pl,tmp;
+
+ if( !ARCH_SECURITY ) {
+ notify_fail("Du bist kein Erzmagier!\n");
+ return 0;
+ }
+
+ notify_fail( "epplset <spieler> <ep-nummer>\n" );
+ if( !str || sscanf( str, "%s %d", player, epnum )<2 )
+ return 0;
+
+ epnum = "/secure/explorationmaster"->SetFP( epnum, player );
+ printf( "Ergebnis (gesetzter FP) = %O\n", epnum );
+ return 1;
+}
+
+static epplclr( string str ) {
+ string player, rest;
+ int epnum;
+ object pl,tmp;
+
+ if( !ARCH_SECURITY ) {
+ notify_fail("Du bist kein Erzmagier!\n");
+ return 0;
+ }
+
+ notify_fail( "epplclr <spieler> <ep-nummer>\n" );
+ if( !str || sscanf( str, "%s %d", player, epnum )<2 )
+ return 0;
+
+ epnum = "/secure/explorationmaster"->ClearFP( epnum, player );
+ printf( "Ergebnis (geloeschter FP) = %O\n", epnum );
+ return 1;
+}