Added public files
Roughly added all public files. Probably missed some, though.
diff --git a/obj/tools/projekttool.c b/obj/tools/projekttool.c
new file mode 100644
index 0000000..f61a9dd
--- /dev/null
+++ b/obj/tools/projekttool.c
@@ -0,0 +1,212 @@
+//
+// Projecttool
+//
+
+#include "/p/service/mandragon/projektbrett/projectmaster.h"
+#include "/secure/wizlevels.h"
+#include <moving.h>
+
+inherit "/std/thing";
+string hilfe;
+static int changetime;
+static int suppressinfos;
+
+void create()
+{
+ if (!IS_CLONE(TO)) return;
+ ::create();
+ if (!find_object(PROJECTMASTER)) call_other(PROJECTMASTER,"???");
+
+ SetProp(P_NAME,"Schreibfeder");
+ SetProp(P_NODROP,"Du moechtest Deine Feder dann doch lieber behalten.\n");
+ SetProp(P_NEVERDROP,1);
+ SetProp(P_GENDER,FEMALE);
+ SetProp(P_SHORT,"Eine kleine magische Schreibfeder");
+ if (!changetime) changetime=1;
+ hilfe=BS("-----------------------------------------------------------------------------\n"
+ "Diese Feder ermoeglicht es Dir nicht nur, von ueberall her auf die "
+ "allseits beliebten Schwarzen Bretter fuer Projekte zuzugreifen, "
+ "sondern ermoeglicht es Dir auch, selber Projekte dort zu "
+ "veroeffentlichen.\n"
+ "Folgende Kommandos koennen Dir dabei helfen:\n\n"
+ "federhilfe - Diese Uebersicht\n"
+ "federdoku - Dokumentation aller Befehle\n"
+ "projekthilfe - Uebersicht ueber die Brettbefehle\n"
+ "AddProject - Projekt anlegen\n"
+ "RemoveProject <Nummer> - Projekt entfernen\n"
+ "ModifyProject <Nummer> - Projekt aendern\n"
+ "projektinfos ein|an|aus - Aenderungen (nicht mehr) anzeigen\n\n"
+ "Bei Fragen, Bugs und/oder Typos wende Dich bitte vertrauensvoll an den\n"
+ "Mandragon Deiner Wahl.\n"
+ "---------------------------------------------------------------------------");
+ SetProp(P_LONG,
+ BS("Diese kleine, weisse, magisch glaenzende Feder liegt sanft " +
+ "in Deiner Hand. Du spuerst foermlich, wie sie danach dringt, " +
+ "Neues zu schaffen und die Welt zu vergroessern.\n\n")+hilfe);
+ AddId(({"schreibfeder","feder","projekttool"}));
+ AddCmd("federhilfe","hilfe_fun");
+ AddCmd("projekthilfe","board_help");
+ AddCmd("projektliste","board_list");
+ AddCmd("federdoku","doku_fun");
+ AddCmd(({"projektdetail","projektdetails"}),"board_long");
+ AddCmd(({"addproject","AddProject","ap"}),"addproj_fun");
+ AddCmd(({"removeproject","RemoveProject","rp"}),"remproj_fun");
+ AddCmd(({"modifyproject","ModifyProject","mp"}),"modproj_fun");
+ AddCmd("projektinfos","watch_fun");
+ TO->move(TP,M_NOCHECK);
+ return;
+}
+
+void _set_autoloadobj(mixed val)
+{
+ if (intp(val)) changetime=time();
+ else if (pointerp(val)&&sizeof(val)==2)
+ {
+ changetime=val[0];
+ suppressinfos=val[1];
+ }
+ return;
+}
+
+int *_query_autoloadobj() { return ({ changetime, suppressinfos }); }
+
+int doku_fun(string arg)
+{
+ TP->More(PROJECTDOKU,1);
+ return 1;
+}
+
+int board_help(string arg)
+{
+ PROJECTMASTER->BoardHelp();
+ return 1;
+}
+
+int board_list(string arg)
+{
+ arg=TP->_unparsed_args(1);
+ if (!sizeof(arg)) (PROJECTMASTER)->ShowList();
+ else PROJECTMASTER->ParseArgs(arg);
+ changetime=time();
+ return 1;
+}
+
+int board_long(string arg)
+{
+ int number;
+ arg=TP->_unparsed_args(1);
+ notify_fail("Syntax: projektdetail <PROJEKTNUMMER>\n");
+ if (!sizeof(arg)) return 0;
+ if (!(number=to_int(arg))||(arg!=to_string(number))) return 0;
+ notify_fail("Projektnummern koennen nur Zahlen groesser Null sein.\n");
+ if (number<1) return 0;
+ PROJECTMASTER->ShowLong(number);
+ return 1;
+}
+
+int hilfe_fun(string arg)
+{
+ tell_object(TP,hilfe);
+ return 1;
+}
+
+int board_fun(string arg)
+{
+ PROJECTMASTER->ParseArgs(TP->_unparsed_args(1));
+ return 1;
+}
+
+int addproj_fun(string arg)
+{
+ if (!IS_LEARNER(TP))
+ {
+ tell_object(TP,"Wie bist DU denn an die Feder gekommen?\n");
+ TO->remove();
+ return 1;
+ }
+ PROJECTMASTER->ChangeData(0);
+ return 1;
+}
+
+int remproj_fun(string arg)
+{
+ if (!IS_LEARNER(TP))
+ {
+ tell_object(TP,"Wie bist DU denn an die Feder gekommen?\n");
+ TO->remove();
+ return 1;
+ }
+ notify_fail("Syntax: removeproject NUMMER\n");
+ if (!sizeof(arg)||!intp(to_int(arg))||(arg!=to_string(to_int(arg)))) return 0;
+ PROJECTMASTER->DeleteData(to_int(arg));
+ return 1;
+}
+
+int modproj_fun(string arg)
+{
+ if (!IS_LEARNER(TP))
+ {
+ tell_object(TP,"Wie bist DU denn an die Feder gekommen?\n");
+ TO->remove();
+ return 1;
+ }
+ notify_fail("Syntax: modifyproject NUMMER\n");
+ if (!arg||!intp(to_int(arg))||(arg!=to_string(to_int(arg)))) return 0;
+ notify_fail("Es gibt kein Projekt mit der Nummer 0.\n");
+ if (to_int(arg)==0) return 0;
+ PROJECTMASTER->ChangeData(to_int(arg));
+ return 1;
+}
+
+int watch_fun(string arg)
+{
+ if (!IS_LEARNER(TP))
+ {
+ tell_object(TP,"Wie bist DU denn an die Feder gekommen?\n");
+ TO->remove();
+ return 1;
+ }
+ if (!sizeof(arg))
+ {
+ tell_object(TP,BS(sprintf("Du bekommst derzeit %sInformationen "
+ "ueber Aenderungen am Projektbrett.",
+ suppressinfos?"keine ":"")));
+ return 1;
+ }
+ notify_fail("Syntax: projektinfos <ein|an|aus>\n");
+ if (arg!="ein"&&arg!="an"&&arg!="aus") return 0;
+ if (arg=="aus")
+ {
+ suppressinfos=1;
+ tell_object(TP,BS("Du wirst jetzt keine Meldungen mehr ueber "
+ "Aenderungen am Projektbrett erhalten.\n"));
+ return 1;
+ }
+ suppressinfos=0;
+ tell_object(TP,BS("Du bekommst ab sofort Meldungen ueber Aenderungen "
+ "am Projektbrett.\n"));
+ return 1;
+}
+
+void init()
+{
+ if (!IS_LEARNER(TP)) {
+ if (find_call_out("remove") == -1)
+ call_out("remove",0);
+ }
+ else ::init();
+ return;
+}
+
+void reset()
+{
+ if (!environment())
+ {
+ destruct(TO);
+ return;
+ }
+ if (!suppressinfos&&changetime<(PROJECTMASTER->ChangeTime()))
+ tell_object(environment(),"Intuitiv spuerst Du, dass sich "
+ "die Aushaenge am Projektbrett geaendert haben.\n");
+ return;
+}