Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/p/daemon/traveld.c b/p/daemon/traveld.c
new file mode 100644
index 0000000..747fd38
--- /dev/null
+++ b/p/daemon/traveld.c
@@ -0,0 +1,285 @@
+/** Doku:
+public int AddRoute(string transporter, string* l_stops)
+  Beschreibung:
+    Setzt die aktuelle Route eines Transporters.
+    Die Route hier ist allerdings nur die Liste von Haltepunkten - nicht der
+    Rest, der in den Routen in den Transporter abgelegt ist.
+    Eine neue Route ersetzt immer die bisherige Route
+    Wird von /std/transport gerufen, wenn P_NO_TRAVELING nicht gesetzt ist.
+  Rueckgabewerte:
+    - 1: Transporter und Haltepunkt Eingetragen.
+    - 0: Transporter oder Haltepunkt kein string|string*.
+    - -1: Es wurde versucht einen Transporter in /p/ oder /players/
+          einzutragen 
+          und der Eintragende ist kein EM.
+
+public int RemoveTransporter(string|object transporter)
+public int RemoveStop(string|object stop)
+  Beschreibung:
+    Entfernt einen kompletten Transporter oder einen Haltepunkt aus dem
+    Daemon.
+  Rueckgabewerte:
+    - 1: Erfolg.
+    - 0: Transporter|Haltepunkt existiert nicht.
+    - -1: Keine Berechtigung.
+
+public varargs int|object* HasTransporter(object stop, string transporter_id)
+  Beschreibung:
+    Gibt eine Liste der Transporter aus, den den Haltepunkt anlaufen, oder
+    prueft auf einen bestimmten Transporter.
+  Rueckgabewerte:
+    - 0: Haltepunkt ist kein Objekt, dem Haltepunkt sind keine Transporter
+         zugeordnet,
+         die Transporter sind nicht geladen
+         oder, bei angabe von <transporter>: <transporter> faehrt den Hafen
+         nicht an.
+    - object*: Liste mit einem oder mehreren Transportern.
+  Bemerkung:
+    Auch bei der Angabe von <transporter_id> koennen mehrere Objekte
+    zurueckgegeben werden, es wird mittels id() gefiltert.
+
+public mixed RouteExists(object transporter, string dest)
+  Beschreibung:
+    Prueft auf korrekte Parameter und leitet die Anfrage an
+    /std/transport weiter.
+  Rueckgabewerte:
+    - 0: <transporter> ist kein Objekt oder <dest> ist kein String.
+    - Das Ergebnis von transporter->HasRoute(dest);
+
+public mapping QueryTransporters()
+public mapping QueryAllStops() 
+public mapping QueryTransporterByStop(string stop)
+public mapping QueryStopsByTransporter(string transporter)
+  Beschreibung:
+    Gibt das jewilige gefilterte oder ungefilterte Mapping aus.
+  Rueckgabewerte:
+    Mapping mit dem Ergebnis.
+*/
+
+#pragma strong_types,save_types,rtt_checks
+#pragma pedantic,range_check,warn_deprecated
+#pragma warn_empty_casts,warn_missing_return,warn_function_inconsistent
+#pragma no_clone,no_shadow
+
+#include <transport.h>
+#include <wizlevels.h>
+#include <daemon.h>
+
+#define TRANSPORTER 0
+#define STOP 1
+
+#define MEMORY "/secure/memory"
+
+// Key: string Schiff.
+// Value0: string* Haefen, die von <Schiff> angefahren werden.
+mapping transporters = ([]);
+// Key: string Hafen
+// Value0: string* Schiffe, die <Hafen> anfahren.
+mapping stops = ([]);
+
+protected void create()
+{
+  // Vom MEMORY die Daten abholen.
+  // Wenn keine da, war vermutlich Reboot, dann muessen wir warten, bis die
+  // Transporter sich wieder melden. Aber die Mappings muessen ins Memory
+  // geschrieben werden.
+  mapping tmp = MEMORY->Load("stops");
+  if (mappingp(tmp))
+  {
+    stops = tmp;
+  }
+  else
+  {
+    if (MEMORY->Save("stops",stops) != 1)
+      raise_error("Could not save memory to /secure/memory.");
+  }
+  tmp = MEMORY->Load("transporters");
+  if (mappingp(tmp))
+  {
+    transporters = tmp;
+  }
+  else
+  {
+    if (MEMORY->Save("transporters",transporters) != 1)
+      raise_error("Could not save memory to /secure/memory.");
+  }
+}
+
+varargs int remove(int s)
+{
+  destruct(this_object());
+  return 1;
+}
+
+// Loeschfunktion
+private int _remove_data(string|object key, int what)
+{
+  mapping first,second;
+  // Erstmal die Arbeitsmappings befuellen.
+  if(what==TRANSPORTER)
+  {
+    first=transporters;
+    second=stops;
+  }
+  else
+  {
+    first=stops;
+    second=transporters;
+  }
+
+  // Key auf einen String normalisieren.
+  if(objectp(key))
+  {
+    key=object_name(key);
+  }
+
+  if(!member(first,key))
+  {
+    return 0;
+  }
+
+  // Erstmal aus dem jeweils anderen Mapping austragen.
+  foreach(string s : first[key])
+  {
+    // Nicht existent oder nicht zugeordnet -> weiter.
+    if(!member(second,s) || member(second[s],key)==-1)
+    {
+      continue;
+    }
+    second[s]-=({key});
+    if (!sizeof(second[s]))
+      m_delete(second,s);
+  }
+  // Jetzt noch aus dem eigenen Mapping austragen.
+  m_delete(first,key);
+  return 1;
+}
+
+// Ein komplettes Schiff entfernen.
+public int RemoveTransporter(object|string transporter)
+{
+  if (extern_call() && !IS_ARCH(getuid(previous_object()))) return -1;
+  return _remove_data(transporter,TRANSPORTER);
+}
+
+// Entfernt einen kompletten Hafen aus dem Daemon
+public int RemoveStop(object|string stop)
+{
+  if (extern_call() && !IS_ARCH(getuid(previous_object()))) return -1;
+  return _remove_data(stop,STOP);
+}
+
+// Setzt die aktuelle Route eines Transporters.
+// Die Route hier ist allerdings nur die Liste von Haltepunkten - nicht der
+// Rest, der in den Routen in den Transporter abgelegt ist.
+// Wird von /std/transport gerufen, wenn P_NO_TRAVELING nicht gesetzt ist.
+public int AddRoute(string transporter, string* l_stops)
+{
+  if (!stringp(transporter) || !pointerp(l_stops) || !sizeof(l_stops))
+    return 0;
+
+  if ((transporter[0..2] == "/p/" || transporter[0..8] == "/players/")
+      && !IS_ARCH(getuid(previous_object()))) 
+  {
+    return -1;
+  }
+
+  // Damit sind alle Abfragen auf find_object(transporter|stop) ueberfluessig,
+  // im Zweifelsfall knallt es naemlich hier. ;-)
+  transporter = object_name(load_object(transporter));
+
+  // Wenn die route bereits existiert, austragen. Dies ist noetig, weil die
+  // Haltepunkte ja auch bereinigt werden muessen.
+  if (member(transporters, transporter))
+    RemoveTransporter(transporter);
+
+  // Transporter eintragen, die Route wird dabei immer ueberschrieben, wenn
+  // der Transporter schon bekannt ist. Ziel: hier ist immer die aktuell
+  // konfigurierte Route drin.
+  m_add(transporters, transporter, l_stops);
+
+  // Nach obigen Schema, nur diesmal Haltepunkte und zugehoerige Schiffe 
+  // eintragen.
+  foreach(string stop : l_stops)
+  {
+    if (!member(stops,stop))
+    {
+      m_add(stops, stop, ({transporter}));
+    }
+    else if (member(stops[stop],transporter) == -1)
+    {
+      stops[stop] += ({ transporter });
+    }
+  }
+  return 1;
+
+}
+
+// Abfrage ob ein Schiff einen Hafen anfaehrt.
+public varargs int|object* HasTransporter(object stop,
+                                          string transporter_id)
+{
+  if (!objectp(stop)) return 0;
+
+  <string|object>* trans=stops[object_name(stop)];
+  if (!pointerp(trans)) return 0;
+
+  // Eigentlich sollten sich Transporter ordentlich abmelden... Aber zur
+  // Sicherheit die nicht gefundenen Objekte ausfiltern.
+  trans = map(trans, #'find_object) - ({0});
+
+  // Wenn ne bestimmte ID gesucht wird, nur diese Transporter liefern.
+  if (stringp(transporter_id))
+    trans = filter_objects(trans, "id", transporter_id);
+
+  return sizeof(trans) ? trans : 0;
+}
+
+public mixed RouteExists(object transporter, string dest)
+{
+  if (!objectp(transporter) || !stringp(dest))
+  {
+    return 0;
+  }
+  return transporter->HasRoute(dest);
+}
+
+public mapping QueryTransporters()
+{
+  return deep_copy(transporters);
+}
+
+public mapping QueryAllStops()
+{
+  return deep_copy(stops);
+}
+
+// Liefert alle Transporter mit ihren Haltepunkten zurueck, die diesen Halt ansteuern.
+public mapping QueryTransportByStop(string stop)
+{
+  mapping res=m_allocate(4);
+  foreach(string s, string* arr : transporters)
+  {
+    if(member(arr,stop)!=-1)
+    {
+      m_add(res,s,arr);
+    }
+  }
+  return res;
+}
+
+// Liefert alle Haltepunkte mit ihren Transportern zurueck, die dieser
+// transporter ansteuert.
+public mapping QueryStopsByTransporter(string transporter)
+{
+  mapping res=m_allocate(4);
+  foreach(string s, string* arr : stops)
+  {
+    if(member(arr,transporter)!=-1)
+    {
+      m_add(res,s,arr);
+    }
+  }
+  return res;
+}
+