Beispieldateien

Eine auffüllbare Lichtquelle

----------



// Eine nachfüllbare Öllampe
// Für detailiertere Erklärungen schau bitte die 
// Beispielfackel an.

// Mohammed (09/96)  : nachfuellbare Lampe 
// 18.08.2002 Sunrise: komplett ueberarbeitet

inherit "lightsource";

#include <properties.h>
#include <lightsource.h>

// Dies ist ein Beispiel zum Generieren von Lichtquellen. Die Lampe kann
// nachgefüllt werden. Dazu muß das Propertie P_DO_DESTRUCT auf 0 gesetzt
// werden. Die Funktion lampe_fuellen realisiert das Auffüllen der Lampe.
// Dabei ist zu beachten, daß GetInhalt() eine Funktion in der Ölflasche
// ist, die lediglich eine Variable ausliest und zurückgibt. Die Funktion
// SetInhalt() setzt die Variable in der Ölflasche, falls beim Auffüllen
// nicht alles reingepaßt hat. Der Wert kann dann beim nächsten Füllen
// benutzt werden. Falls alles Oel in die Lampe paßte, wird die Ölflasche
// removed. Beim Ändern des Inhaltes (P_FUEL) SOLLTE NUR AddFuel() benutzt
// werden, um ein ordnungsgemässes Auffüllen zu gewährleisten.


// Deklaration der Funktionen:
int lampe_fuellen(string str);

void create()
{
  // Wenn wir kein Clone sind, abbrechen!
  if (!clonep()) return;

  ::create();

  SetProp(P_LONG,
    "Eine rostige Oellampe. Sie ist trotz Rost von guter "
    "Qualitaet und funktionstuechtig. Du kannst sie anzuenden "
    "und loeschen, und natuerlich auch nachfuellen.");

  SetProp(P_NAME, "Oellampe");
  SetProp(P_PLURAL, "Oellampen");
  SetProp(P_GENDER, FEMALE);
  SetProp(P_MAX_FUEL, 4000);         // Die Oellampe brennt max. 4000 sec.  
  SetProp(P_FUEL, 2000);             // Die Oellampe ist zu Beginn halb gefüllt
  SetProp(P_DO_DESTRUCT, 0);         // wird nach dem Abbrennen nicht removed
  SetProp(P_WEIGHT, 1125);
  SetProp(P_VALUE, 280);

  AddId(({"lampe","oellampe"}), ({"lampen","oellampen"}));

  AddCmd("fuelle|fuell", #'lampe_füllen);
}

int lampe_fuellen(string str) 
{
  string was;
  int wieviel, rest;
  object oel;

  // Unsere Fehlermeldung, die im Falle des Mißerfolgs ausgegeben wird, d.h.
  // wenn wir nicht zweifelsfrei das angesprochene Objekt waren
  // (Es könnten ja noch andere Objekte auf "fuelle" reagieren.)
  notify_fail("Was willst Du auffuellen?\n");

  // Der Spieler hat nur "fuelle" getippt
  if (!str || !stringp(str) || !strlen(str)) return 0;

  // Der Spieler hat eine falsche Syntax benutzt
  if (sscanf(str,"%s auf", was) != 1) return 0;

  // wir sind nicht gemeint
  if (!id(was)) return 0;

  // Hat der Spieler eine Oelflasche im Inventar?
  oel = present("oelflasche", this_player());

  // nein, er hat keine
  if (!oel) 
  {
    // Wir geben eine Fehlermeldung aus und beenden die Funktion mit 
    // return 1 - zwar war die Handlung für den Spieler nicht erfolgreich
    // aber sie wurde von uns richtig erkannt und abgearbeitet.
    write("Du hast keine Oelflasche zum auffuellen der Oellampe.\n");
    return 1;                                     
  }

  // Wieviel ist in der Oelflasche?
  wieviel = oel->GetInhalt();

  // Fülle alles in die Flasche;  der Rückgabewert gibt uns an, ob alles 
  // reingepaßt hat oder nicht; AddFuel ist eine Funktion der Std-Lichtquelle
  rest = AddFuel(wieviel);                        

  // Wenn kein rest besteht, hat alles reingepaßt
  if (!rest) 
  {                    
    // Wir geben eine Erfolgsmeldung an den Spieler aus
    write(break_string(
      "Du fuellst alles Oel aus der Flasche in die Lampe. "
      "Die leere Oelflasche zerfaellt zu Staub."));
    // Die Oelflasche ist leer und kann zerstört werden
    oel->remove();
    // Ende
    return 1;
  }

  // Wenn rest nicht null ist, kommen wir hier an
  // Wir geben eine differenzierte Erfolgsmeldung aus
  write(break_string(
    "Du fuellst etwas Oel aus der Flasche in die Lampe. "
    "Da nicht alles in die Oellampe passt, bleibt ein Rest "
    "in der Flasche."));
  // Der rest ist nun der neue Inhalt der Oelflasche
  oel->SetInhalt(rest);                      
  // Ende
  return 1;  
}