Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/p/daemon/fishmaster.c b/p/daemon/fishmaster.c
new file mode 100644
index 0000000..3997584
--- /dev/null
+++ b/p/daemon/fishmaster.c
@@ -0,0 +1,165 @@
+/*Fisch-Master, (c) Vanion@MG, 26.05.02
+
+  Fische die im MG geangelt werden koennen, sollen nicht als endlose
+  Geldquelle dienen. Daher habe ich einen Master gebaut, der sich merkt
+  Welcher Spieler wieviel Fisch geangelt hat. Je mehr Fisch der Spieler
+  faengt, desto billiger wird der Fisch.
+
+  Schnittstelle:
+
+  Der Master hat abgesehen von Standard-Funktionen nur eine Schnittstelle
+
+  public int PriceOfFish(object player, object fish)
+
+  Der erste Parameter ist der Spieler, der den Fisch gecloned hat, der
+  zweite ist der Fisch, den der Spieler gefangen hat. Der Fisch muss
+  hierbei von Fraggles Standardfisch erben.
+
+  Der Preis des Fisches faellt linear je naeher der Spieler an die
+  Maximal-Grenze fuer Fisch kommt (Diese ist durch die Konstante MAX_FISH
+  festgelegt.) Der Master merkt sich ueber einen Zeitraum von FORGET_IT
+  Sekunden, dass der Spieler diesen Fisch gefangen hat. Ist der Zeitraum
+  vergangen, geht der Fisch nicht mehr in die Rechnung ein.
+ */
+
+#pragma strong_types, save_types, rtt_checks
+#pragma no_clone, no_shadow, no_inherit
+
+#define SAVE_FILE __DIR__+"save/fishes"
+
+#define FORGET_IT 1728000 // Nach 20 Tagen
+#define MAX_FISH  20000   // Wenn Spieler Max-Fish geholt hat, hat der
+                          // Fisch keinen Wert mehr. (Einheit Gramm)
+
+#include <properties.h>
+
+// Hier wird gespeichert, welcher Spieler wieviel Fisch gefangen hat.
+mapping fishes = m_allocate(0,1);
+static int save_me_soon;
+
+protected void create() {
+  // Ohne das darf dieses Objekt hier nicht schreiben.
+  seteuid(getuid());
+  // Globale Variablen einlesen/initialisieren.
+  restore_object(SAVE_FILE);
+  set_next_reset(4*3600);
+}
+
+static void CleanupData() {
+  int expire_date = time()-FORGET_IT;
+  // Ueber alle Spielernamen laufen.
+  foreach(string pl, mixed *fishlist: fishes) {
+    // Ueber alle Fischdaten aller Spieler laufen.
+    foreach(int *fish: fishlist) {
+      if (fish[0]<expire_date) {
+        fishlist-=({fish});
+        save_me_soon=1;
+      }
+    }
+    if ( !sizeof(fishlist) )
+      fishes = m_delete(fishes, pl);
+    else
+      fishes += ([pl:fishlist]);
+  }
+}
+
+//ZZ: man koennte hier ggf. das neue Gewicht bestimmen statt es bei jedem
+//ZZ:Abruf zu tun.
+// Fuegt einen neuen Fisch in die Liste mit Fischen ein
+static int AddFish(string player_id, int weight) {
+  // Fisch hinzufuegen
+  if ( member(fishes, player_id) )
+    fishes[player_id] +=  ({({ time(),weight})});
+  else 
+    fishes += ([ player_id: ({ ({time(),weight}) }) ]);
+  return 1;
+}
+
+// Hier wird das Gewicht des bereits gefangenen Fisches umgewandelt
+// in den Preis-Prozentsatz, den der Fisch noch kostet.
+static int WeightToPrice(int weight) {
+  if (weight >= MAX_FISH) return 0;
+  if (weight <= 0       ) return 100;
+  // Eine lineare Kurve. Je mehr Fisch geholt, desto billiger
+  // wird der. // Arathorn: Spannend, so eine lineare Kurve. :-)
+  return 100-(weight*100/MAX_FISH);
+}
+
+// Gibt das Gesamtgewicht des gefangenen Fisches zum Spieler zurueck
+static int QueryWeight(string player_id) {
+  int weight;
+  mixed list = fishes[player_id];
+
+  // Erstmal werden ungueltige Fische aus der Liste entfernt
+  //ZZ: ich finde, das muss nicht unbedingt bei jeden Abruf getan werden
+  //ZZ::und nicht fuer alle Spieler. reicht nicht einfach alle 4h? 
+  CleanupData();
+
+  // Zusammenzaehlen der Einzelgewichte der gueltigen Fische.
+  foreach(int *fish : fishes[player_id]) {
+    weight += fish[1];
+  }
+  return weight;
+}
+
+// Wenn ein Spieler einen neuen Fisch bekommt, wird der Preis fuer den
+// Fisch bestimmt. Dieser resultiert aus der Menge (Gewicht) des Fisch,
+// die der Spieler in letzter Zeit schon gefangen hat. Zurueckgegeben
+// wird der Preis in Teilen von 100.
+public int PriceOfFish(object player, object fish) {
+  string player_id;
+  int price_of_new_fish;
+
+  // Sind Spieler und Fisch uebergeben?
+  if ( !player || !fish ) return 0;
+
+  // Spieler-ID finden.
+  player_id = getuuid(player);
+
+  // Ist player ein echter Spieler?
+  // NPC clonen sich Fische, die 100% kosten.
+  if (member(users(),player)==-1) return 100;
+
+  // Is der Fisch ein Fisch von Fraggle?
+  if (member(inherit_list(fish), __PATH__(1)+"/fish.c")==-1)
+    return 0;
+
+  // Feststellen wieviel Fisch ein Spieler gefangen hat, und
+  // daraus den Preis berechnen.
+  price_of_new_fish = WeightToPrice(QueryWeight(player_id));
+
+  // Diesen Fisch in die Datenbank eintragen
+  AddFish(player_id, fish->QueryProp(P_WEIGHT));
+
+  // Ich bin neugierig.
+  /*DEBUG(player->Name()+" hat einen Fisch mit "+fish->QueryProp(P_WEIGHT)+
+        " g gefangen. Der Wert liegt bei "+price_of_new_fish+"%");*/
+
+  // Die Aenderung soll persistent sein.
+  save_me_soon=1;
+
+  // Rueckgabe des Fischpreises.
+  return price_of_new_fish;
+}
+
+// Speichern der globalen Variablen
+static void save() {
+  save_object(SAVE_FILE);
+  return;
+}
+
+// Da nichts geerbt wird, muss das destruct() selbst gemacht werden
+// Wir speichern auf jeden Fall.
+varargs int remove(int silent) {
+  save();
+  destruct(this_object());
+  return 1;
+}
+
+// Daten aufraeumen und ggf. wegspeichern
+void reset() {
+  CleanupData();
+  if ( save_me_soon )
+    save();
+  set_next_reset(4*3600); // alle 4 Stunden reicht.
+}