Added public files
Roughly added all public files. Probably missed some, though.
diff --git a/secure/wahlmaschine.c b/secure/wahlmaschine.c
new file mode 100644
index 0000000..8705f87
--- /dev/null
+++ b/secure/wahlmaschine.c
@@ -0,0 +1,252 @@
+// da dieses Objekt in /secure liegt und ROOTID inne hat, muessen besondere
+// Sicherheitsvorkehrungen getroffen werden. Insbesondere duerfen keine Files
+// aus /std/ inheritet werden, da es fuer diese Files keiner ROOTID bedarf.
+
+#include <properties.h>
+#include <defines.h>
+#include "/secure/wizlevels.h"
+
+static string in_use;
+
+string thema;
+string *moeglichkeiten;
+string *ergebnis;
+
+#undef SAY
+
+private void SAY( string str )
+{
+ write ( str );
+ write_file("/log/WAHL", str);
+}
+
+void create()
+{
+ if (clonep(ME)) destruct(ME);
+ if (ergebnis) return;
+ seteuid(getuid());
+ in_use=0;
+ ergebnis=({({}),({})});
+ moeglichkeiten=({});
+ restore_object("wahl/wahl");
+ move_object(ME, "/gilden/abenteurer");
+}
+
+varargs string name(int casus, int demon)
+{
+ if (demon==RAW) return "Wahlmaschine";
+ switch(casus) {
+ case WEM:
+ case WESSEN:
+ if (demon==1)
+ return "der Wahlmaschine";
+ return "einer Wahlmaschine";
+ default:
+ if (demon==1)
+ return "die Wahlmaschine";
+ return "eine Wahlmaschine";
+ }
+}
+
+varargs string Name(int casus, int demon)
+{ return capitalize(name(casus, demon)); }
+
+
+public string QueryPronoun(int casus)
+{
+ switch(casus)
+ {
+ case WER:
+ return "sie";
+ break;
+ case WEM:
+ return "ihr";
+ }
+ return "sie";
+}
+
+string short()
+{ return "Eine Wahlmaschine.\n"; }
+
+string long()
+{
+ return "Eine Wahlmaschine. Mit ihr koennen geheime Wahlen durchgefuehrt werden.\n"+
+ "Aktuelles Thema: "+(stringp(thema) ? thema : "keines")+"\n";
+}
+
+mixed Query(mixed param)
+{
+ if (!stringp(param)) return 0;
+ switch (param) {
+ case P_NOGET: return 1;
+ case P_GENDER: return FEMALE;
+ case P_NAME: return "Wahlmaschine";
+ }
+ return 0;
+}
+
+mixed QueryProp(mixed param)
+{ return Query(param); }
+
+int Set(mixed param)
+{ return -1; }
+
+int SetProp(mixed param)
+{ return -1; }
+
+varargs int id(string str, int lvl)
+{ return (member(({"maschine", "waehler", "wahlmaschine"}), str)!=-1); }
+
+// ab hier kommt der eigentliche Code der Wahlmaschine
+
+void init()
+{
+ add_action("waehle", "waehl",1);
+ add_action("auswertung","auswertung");
+ add_action("wahlthema", "wahlthema");
+ add_action("moeglichkeit","moeglichkeit");
+}
+
+void save_me()
+{ save_object("wahl/wahl"); }
+
+static int waehle()
+{
+ int i;
+ mixed second;
+
+ if (!RPL) return 0;
+ if (RPL->QueryProp(P_LEVEL)<10) {
+ notify_fail("Man kann erst ab Stufe 10 mitwaehlen :(\n");
+ return 0;
+ }
+ if (RPL->QueryProp(P_TESTPLAYER)) {
+ notify_fail("Testspieler sind von der Wahl ausgeschlossen.\n");
+ return 0;
+ }
+ if ((second=RPL->QueryProp(P_SECOND)) &&
+ (!stringp(second) || (file_size("/save/"+lower_case(second[0..0])+"/"+lower_case(second)+".o")<=0))) {
+ notify_fail("Nicht richtig markierte Zweities sind von der Wahl ausgeschlossen.\n");
+ return 0;
+ }
+ if (in_use)
+ {
+ write(in_use+" waehlt gerade, warte also bitte einen Augenblick.\n");
+ return 1;
+ }
+ in_use=capitalize(getuid(RPL));
+ say(in_use+" tritt an die Wahlmaschine.\n");
+ write(long());
+ write("Das steht zur Auswahl:\n");
+ for (i=0;i<sizeof(moeglichkeiten);i++)
+ write(sprintf(" -- %d.) %s\n",i+1,moeglichkeiten[i]));
+ write("Triff nun Deine Wahl (sie ist UNSICHTBAR): ");
+ input_to("waehle_2",1);
+ return 1;
+}
+
+private int falsch()
+{
+ write("Diese Auswahl ist ungueltig. Versuchs bitte gleich nochmal.\n");
+ say(in_use+" hat ausgewaehlt.\n");
+ in_use=0;
+ return 1;
+}
+
+static int waehle_2(string str)
+{
+ int i;
+ mixed name;
+
+ if (!str) return falsch();
+
+ name=RPL->QueryProp(P_SECOND);
+ if (!stringp(name))
+ name=getuid(RPL);
+ else name=lower_case(name);
+
+ if (member_array(str, moeglichkeiten)==-1) {
+ if ( !sscanf( str, "%d", i ) ) return falsch();
+ if ( i<1 || i>sizeof(moeglichkeiten) ) return falsch();
+ ergebnis=insert_alist(name,moeglichkeiten[i-1],ergebnis);
+ }
+ else ergebnis=insert_alist(name,str,ergebnis);
+ write("Ok.\n");
+ save_me();
+ say(in_use+" hat ausgewaehlt.\n");
+ in_use=0;
+ return 1;
+}
+
+static int auswertung()
+{
+ int i,j,max,all;
+ mapping stimmen, data;
+ mixed names;
+
+ if (!ARCH_SECURITY || process_call()) return 0;
+
+ rm("/log/WAHL");
+
+ data = mkmapping(ergebnis[0], ergebnis[1]);
+ names = m_indices(data);
+ stimmen = ([]);
+
+ SAY("\n\n\nWahlergebnisse zum Thema: "+thema+"\n");
+ SAY("\nGewaehlt haben folgende Personen: \n");
+ SAY(break_string(CountUp(map(sort_array(names, #'>/*'*/), #'capitalize/*'*/)), 78));
+ SAY("\n");
+
+ while(sizeof(names)) {
+ stimmen[data[names[0]]]++;
+ names[0..0] = ({});
+ all++;
+ }
+
+ SAY("*****************************************\n");
+ SAY("Ergebnis:\n");
+ for (i=0;i<sizeof(moeglichkeiten);i++)
+ SAY(sprintf(" -- %2d.) %20s: %3d (%' '3.2f%%)\n", i+1, moeglichkeiten[i],
+ stimmen[moeglichkeiten[i]], 1.0 * stimmen[moeglichkeiten[i]] * 100.0 / (1.0 * all)));
+ SAY(sprintf("Gesamtstimmen: %d\n", sizeof(m_indices(data))));
+ return 1;
+}
+
+static int wahlthema(string str)
+{
+ if (!ARCH_SECURITY || process_call()) {
+ write("NOT allowed");
+ return 0;
+ }
+ if (!(str=this_interactive()->_unparsed_args())) return 0;
+ thema=str;
+ say(RPL->name(WER)+" setzt ein neues Abstimmungsthema fest.\n");
+ ergebnis=({({}),({})});
+ moeglichkeiten=({});
+ write("Ok.\n");
+ save_me();
+ return 1;
+}
+
+static int moeglichkeit(string str)
+{
+ if (!ARCH_SECURITY || process_call()) {
+ write("NOT allowed");
+ return 0;
+ }
+ if (!(str=RPL->_unparsed_args())) return 0;
+ if (member_array(str, moeglichkeiten) != -1) {
+ write("Schon drin.\n");
+ return 1;
+ }
+ moeglichkeiten+=({str});
+ write("Ok.\n");
+ save_me();
+ return 1;
+}
+
+mixed _internal()
+{
+ if (!ARCH_SECURITY || process_call()) return 0;
+ return ergebnis;
+}