Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/doc/beispiele/testobjekte/modifyskillspell_test.c b/doc/beispiele/testobjekte/modifyskillspell_test.c
new file mode 100644
index 0000000..3c58342
--- /dev/null
+++ b/doc/beispiele/testobjekte/modifyskillspell_test.c
@@ -0,0 +1,103 @@
+// ModifySkill-Beispiel fuer einem Spell. Erlaeuterung auf man-Page
+// und im Objekt selbst
+inherit "/std/thing";
+#include <new_skills.h>
+#include <properties.h>
+#include <wizlevels.h>
+#include <break_string.h>
+
+static int skillset(string str);
+static int skillunset(string str);
+
+void create() {
+  if(!clonep(this_object())) {
+    set_next_reset(-1);
+    return;
+  }
+
+  ::create();
+  set_next_reset(7200);
+
+  SetProp(P_NAME, "Skillbeispiel");
+  SetProp(P_SHORT, "Eine Skillbeispiel");
+  SetProp(P_LONG, break_string(
+    "Mit \"skillset\" kann man sich den Skill (eigentlich Spell) "
+    "\"fnrx\" setzen.\n"+
+    "Durch \"skillunset\" wird der Skill geloescht.\n"
+    "Das zaehlt deshalb als Spell, weil er kleingeschrieben und "
+    "damit direkt vom Spieler (also dir) als Kommando via UseSpell() "
+    "ausfuehrbar ist.", 78, 0, BS_LEAVE_MY_LFS));
+  SetProp(P_GENDER, NEUTER);
+  AddId(({"beispiel", "skillbeispiel", "spellbeispiel",
+          "skill", "spell"}));
+  
+  AddCmd("skillset", #'skillset);
+  AddCmd("skillunset", #'skillunset);
+}
+
+// Testfunktion, weil im Code dazu aufgefordert wird, das Objekt auch
+// mal zu wegzulegen. Spieler sollten nicht an sich herumfummeln.
+private static int _checkLearner(object pl) {
+  if(!IS_LEARNER(this_player())) {
+    notify_fail("Du bist kein Magier, deshalb geht das nicht.\n");
+    call_out(#'remove, 1);
+    return 0;
+  }
+  return 1;
+}
+
+static int skillset(string str) {
+  if(!_checkLearner(this_player()))
+    return 0;
+
+  if(this_player()->QuerySkill("fnrx")) {
+    notify_fail("Du kannst den Skill schon.\n");
+    return 0;
+  }
+
+  this_player()->ModifySkill("fnrx",
+    ([SI_CLOSURE: function int (object caster, string skill, mapping sinf) {
+            caster->LearnSkill("fnrx", 1);
+            tell_object(caster, "Peng! Dein Skillwert steigt auf "+
+                                caster->QuerySkillAbility("fnrx")+".\n");
+                    return 1;
+                  },
+      SI_SKILLABILITY: 8432]), 100, "ANY");
+  tell_object(this_player(), break_string(
+    "Der Skill ist gesetzt. Tipp doch ein paar Mal \"fnrx\" und schau den "
+    "Code unter "+load_name(this_object())+" an, damit du siehst, dass der "
+    "Skill jetzt nur aus einem Eintrag in dir und einer ueber UseSpell() "
+    "gerufenen Funktion in diesem Objekt besteht. Der Skill ist kein "
+    "Kommando in einem anderen Objekt.\n\n"
+    "Wenn du dieses Objekt weglegst, funktioniert also alles weiter. "
+    "Zerstoerst du aber das Objekt (oder dich mit \"ende\", funktioniert "
+    "die Skillfunktion nicht mehr.\n"
+    "Schau dir auch xeval this_player()->QuerySkill(\"fnrx\") an.", 78, 0,
+    BS_LEAVE_MY_LFS));
+  return 1;
+}
+
+// Here be dragons!
+// Bitte benutzt die folgende Art von Manipulation der Skills nur dann,
+// wenn ihr genau wisst, was ihr tut. In anderen Worten: NICHT MACHEN!
+// Und wenn, dann NUR AM EIGENEN MAGIEROBJEKT, NICHT AN SPIELERN!
+static int skillunset(string str) {
+  if(!_checkLearner(this_player()))
+    return 0;
+
+  // per Query() das Mapping an der _query_*-Fun vorbei direkt holen
+  mapping skills = this_player()->Query(P_NEWSKILLS);
+  // ... und manipulieren (wirkt sich wegen Referenz direkt aus)
+  if(mappingp(skills) && mappingp(skills["ANY"]) &&
+     member(skills["ANY"], "fnrx")) {
+    efun::m_delete(skills["ANY"], "fnrx");
+    tell_object(this_player(), "Erledigt.\n");
+  } else
+    tell_object(this_player(), "Nichts zu erledigen.\n");
+  
+  return 1;
+}
+
+void reset() {
+  remove();
+}