/*
 * obj_step_1.c
 * Copyright (C) 2001, Kayleigh & Tody
 * written by Kayleigh & Tody, 15.11.2001
 * last changed by Kayleigh & Tody, 15.11.2001
 */

/*
  Was will dieser Kurs?
  Wie gehen wir vor?
  Was brauchen wir dafür?
*/

/* 
  Die folgende Zeile sollte zu Beginn jeder Datei stehen. Sie veranlasst den 
  Compiler penibler auf inhaltliche Form und den Programmierstil zu achten
*/
#pragma strong_types
/*
  in der Grund-Library von TubMUD (im folgenden nur noch lib genannt) sind für 
  bestimmte, immer wiederkehrende Programmieraufgaben Muster erstellt, die man
  weiterverwenden und gegebenenfalls erweitern kann. In diesem Fall nehmen wir
  uns aus der lib das Muster für einen Container, aus dem wir hier eine Kiste
  bauen. In diesem "Container" sind bestimmte Eigenschaften vorhanden, die wir
  nicht mehr selber programmieren brauchen. Eine Liste dieser Muster und ihrer
  Eigenschaften findet man unter /complex, /obj und einfachere sachen unter
  /basic. Inherit ist der Befehl, mit dem wir dem Compiler sagen, welches
  Muster verwendet werden soll
*/
inherit "complex/container";
/*
  es gibt in der lib ausserdem sogenannte Definitionen für Rooms, Npcs, Items 
  usw. Hier in diesem Fall haben wir die Definitionen P_INFLAMMABLE und 
  P_BURNABLE ausgewählt (siehe unten). P_BURNABLE bedeutet, dass unsere Chest
  60 Sekunden einer offenen Feuerquelle ausgesetzt sein kann, ohne dass sie 
  beginnt zu brennen. Nach dieser Zeit fängt sie an zu brennen. Die Zeit kann
  natürlich selbst festgelegt werden.
  
  Steht die Truhe in Flammen, erzeugt sie einen potentiellen Schaden beim Player
  von 20 hitpoints. Dieses Verhalten wird durch die Definition P_INFLAMMABLE 
  hervorgerufen

  generell gilt: alle durchgängig gross geschriebenen Wörter sind Definitionen
  eine Liste ist unter /sys mit allen Unterverzeichnissen zu finden
*/
#include <prop/elements.h>

/*
  in der Funktion configure wird das eigentliche Objekt, Npc, Raum usw. erzeugt
  der Aufruf der Funktion ist in allen Dateien gleich, egal ob Npc, Raum usw.
  durch void wird ausgedrückt, dass hier nur code ausgeführt wird. Es gibt auch
  noch die Möglichkeit, dass Zahlen (int), Texte (string) usw. von der Funktion
  zurückgegeben werden können, aber das später. Dies ist wieder ein 
  feststehender Bestandteil der so ersteinmal keiner Änderung bedarf.
*/
void configure()
/*
  Die Funktion configure wird durch ein geschweiftes Klammerpaar begrenzt.
  Sie beginnt bei { und endet bei } Sollte eine Klammer fehlen, werden 
  Fehlermeldungen erzeugt
*/
{
  /*
    in unserem Muster für Container befindet sich natürlich auch eine Funktion 
    zum erzeugen des Musters. Diese wird mit der nachfolgenden Zeile aufgerufen
    
    die syntax setzt sich immer folgendermassen zusammen: 
    muster_name::configure();
  */
  container::configure();
  /*
    wenn das Objekt nun erzeugt worden ist, braucht es einen Namen, durch den
    man sehen kann, um was für einen Container es sich handelt. In diesem Fall
    ist es halt keine bag oder bottle, sondern eine chest (der Player soll ja
    nicht erfahren, dass es intern ein "Container" ist)
    innerhalb der Anführungszeichen wird der Name angegeben, der dann auch 
    später im Mud sichtbar wird
  */
  set_name("chest");
  /*
    da unsere chest auch auf andere bezeichnungen als chest reagieren soll,
    geben wir ihr diese noch mit auf den Weg. Dies ist wichtig, um den Player
    den Spielspass nicht zu verderben, da der eine syntax a bevorzugt, während
    ein anderer Player auf einen anderen Syntax steht. z.B. wie bei look at 
    und examine
  */
  set_id(({"chest", "wooden chest", "box", "wooden box", "crate" }));
  /*
    dies ist die Kurzbeschreibung, die z.B. im Inventory des Players angezeigt 
    wird. Sie sollte möglichst kurz und aussagekräftig gehalten sein und einen 
    Artikel enthalten
  */
  set_short("a wooden chest");
  /*
    Die folgende Langbeschreibung wird bei look at und examine verwendet und 
    enthält die ausführliche Beschreibung unserer Chest. Hier kann man sich also
    richtig austoben. Alles was zwischen dem Anführungszeichen und dem \n steht 
    wird angezeigt.
  */
  set_long(
    "This is a beautiful wooden chest for testing purpouses. On its cover "
    "there is a metal handle to throw it away easier.\n");
  /*
    Hier wird das Gewicht der Truhe in Gramm festgelegt
    Echte Autoload-Objekte (z.B. Deine Clan Brooch, der Teddy usw.), Npcs und 
    Räume ausgenommen, muss eigentlich jedes Objekt ein bestimmtes Gewicht haben
    Hier sollte man darauf achten, dass Player mit geringen Stats bei hohen 
    Gewichten Schwierigkeiten haben könnten (evtl. macht man dies aber auch 
    extra...)
  */
  set_encumbrance(1000);
  /*
    der interne Wert unserer Chest (immer in copper coins), für den Player 
    sichtbar, wenn die chest verkauft wird (wobei der letztendliche Verkaufswert
    immer ein wenig tiefer liegt)
  */
  set_value(10);
  // siehe oben
  set_property(P_INFLAMMABLE, 20);
  set_property(P_BURNABLE,    60);
}

/*
führe ruhig mal folgende Befehle aus:
- clone /obj/torch
- put torch into chest
- i

Dadurch, dass wir das Muster Container verwandt haben, brauchten wir uns z.B.
um dieses hereinlegen der Torch nicht mehr kümmern, da es bereits im Muster
programmiert wurde
*/