Offline-TMs integrieren

Vaults koennen beim Kobold hinterlegt werden, d.h. Spieler koennen
die Funktionalitaet einschalten, bei Abwesenheit TMs zu empfangen.
Die Vaults werden beim Login abgerufen und in den 'online'-Kobold
und die TM-History uebertragen. Von dort werden sie letztendlich
wie alle anderen Nachrichten auch angezeigt.

Change-Id: Ib8e8b21304795dd9f0be057f9357c5f5239f260c
diff --git a/secure/kobold.c b/secure/kobold.c
index b1be5aa..f6f0584 100644
--- a/secure/kobold.c
+++ b/secure/kobold.c
@@ -8,11 +8,33 @@
 
 #include "/sys/player/comm.h"
 
-mapping vaults = ([]);
+/** vaults ist ein mapping, welches alle vaults enthaelt.
+ *
+ * Struktur: UID als Schluessel (string) und Vault (lwobject) als
+ * Wert.
+*/
+private nosave mapping vaults = ([]);
+
+#define MEMORY "/secure/memory"
+#ifndef DEBUG
+#define DEBUG(x)  if (find_player("zesstra"))\
+            tell_object(find_player("zesstra"),\
+                                      "kobold: "+x+"\n")
+#endif
 
 protected void create()
 {
-  // TODO: Speichern in MEMORY
+  seteuid(getuid());
+  mixed tmp = ({mapping})MEMORY->Load("Kobold");
+  if (mappingp(tmp)) {
+    vaults = tmp;
+    DEBUG("Daten aus MEMORY geladen.\n");
+  }
+  else {
+    DEBUG("Keine Daten in MEMORY vorhanden - reinitialisiere.\n");
+    if (({int})MEMORY->Save("Kobold", vaults) != 1)
+      raise_error("Konnte Daten nicht im Memory ablegen.\n");
+  }
 }
 
 // Einlagern von Vaults durch Spieler
@@ -42,7 +64,7 @@
 }
 
 // Pointer auf nen Vault vergessen.
-// Im Erfolgsfall wird das Vault zurueckgeben.
+// Im Erfolgsfall wird das Vault zurueckgeben, was wir nicht mehr speichern
 // Aufruf *nur* durch den Spieler mit der richtigen UUID selber.
 public lwobject "/std/player/comm_vault" ForgetVault()
 {
@@ -51,7 +73,8 @@
         lwobject "/std/player/comm_vault" vault = vaults[getuid(previous_object())];
         // Und noch pruefen, ob auch die UUID uebereinstimmt - es soll kein
         // neu angelegter Spieler das Vault von einem aelteren bekommen.
-        if (({string})vault.uuid() == getuuid(previous_object()))
+        if (vault &&
+            ({string})vault.uuid() == getuuid(previous_object()))
         {
             m_delete(vaults, getuid(previous_object()));
             return vault;
diff --git a/secure/memory_lib b/secure/memory_lib
index 06539b1..84a7ce5 100644
--- a/secure/memory_lib
+++ b/secure/memory_lib
@@ -7,3 +7,4 @@
 /p/daemon/channeld
 /p/daemon/traveld
 /secure/shadowmaster
+/secure/kobold