Lpc Manpages

/std/statnpc.c

Monster, die Spielerattribute erhoehen sollen, koennen wie ganz normale
Monster programmiert werden, nur mit folgenden Unterschieden:

1)  inherit "/std/statnpc";    // anstelle von inherit "/std/npc";

2)  #include <sequence.h>

3)  In der Funktion create() muessen AddAttribute() und AddAttrSequence()
    nach folgendem Muster aufgerufen werden:

  AddAttribute( A_INT );

Damit wird das Monster fuer das Attribut "Intelligenz" zustaendig gemacht.
Alternativ koennen A_CON (Ausdauer), A_STR (Kraft) oder A_DEX
(Geschicklichkeit) angegeben werden. Es ist auch erlaubt, mehrere Attribute
als Array anzugeben oder diese Funktion mehrmals fuer verschiedene Attribute
aufzurufen.

  AddAttrSequence( A_INT,
     ([ SEQ_SEQUENCE:
        ({  3,
            "Dir wird ploetzlich ganz schwindelig, und du spuerst akute "
            "Gehirnleere.",
            4,
            "Allmaehlich kommt Dein Verstand zurueck...",
            3,
            "Du fuehlst Dich wieder praechtig! Du hast das Gefuehl, "
            "noch nie so intelligent gewesen zu sein wie jetzt." }) ]) );

Dieser Aufruf definiert eine Sequenz, die der Spieler erlebt, wenn das
Monster ihm das Attribut A_INT erhoeht. Im Mapping duerfen auch andere
Optionen ausser SEQ_SEQUENCE angegeben werden (alle Optionen von
StartSequence() stehen zur Verfuegung). Besonders abwechslungsreich wird ein
Attributen-NPC, wenn mehrere Sequenzen durch entsprechend haeufigen Aufruf
von AddAttrSequence() definiert sind; das Monster waehlt dann automatisch
bei Bedarf eine von ihnen zufaellig aus. Als grober Richtwert fuer die
Dauer der Attribut-Sequenzen gilt 15 bis 30 Sekunden, dies ist aber nicht
bindend.

Ein solches Attributenmonster wird aktiv, wenn man es nach dem betreffenden
Attribut fragt, und beginnt ggf. sofort mit der Erhoehung. Die Erhoehung
erfolgt immer nur um hoechstens 1 Punkt pro Anfrage. Die Entscheidung, ob
diese Erhoehung zulaessig ist, wird automatisch getroffen, ohne dass man
sich als Programmierer darum kuemmern muss. Wenn das Attribut des Spielers
erhoeht werden darf, aber die Summe seiner Attribute dadurch hoeher wuerde
als rechnerisch zulaessig, kann das Monster das gewuenschte Attribut
trotzdem erhoehen und im Gegenzug ein anderes Attribut absenken. In diesem
Fall wird der Spieler gefragt, ob er den vorgeschlagenen Tausch
befuerwortet. Man kann sich in diesem Fall uebrigens NICHT aussuchen,
WELCHES Attribut geopfert wird (nicht als Spieler und auch nicht als
Programmierer), sondern es ist immer dasjenige, das im Verhaeltnis zum
rechnerisch ermittelten Wert am deutlichsten zu hoch ist.

Der /std/statnpc hat bereits alle notwendigen Verwaltungsfunktionen
eingebaut; als Programmierer muss man ausser den genannten Aufrufen im
create() nichts machen. Wer in diese Verwaltung nicht weiter
eingreifen will, kann hier aufhoeren zu lesen.

Ausser den fest vorgegebenen Bedingungen zur Erhoehung von Attributen kann
man eigene Bedingungen zusaetzlich einprogrammieren, z. B. wenn ein NPC nur
Geschicklichkeiten bis zum Wert 10 erhoehen soll oder wenn der Spieler schon
seit mindestens 1 Woche spielen muss oder oder... Dazu muss die Funktion

  string PreventAdvancement (mapping present_attr,
                             string attr, string alt_attr)

neu definiert (ueberschrieben) werden. Vor einer moeglichen Erhoehung wertet
der /std/statnpc diese Funktion aus und stellt beim Aufruf die
gegenwaertigen Attribute des Spielers und das zu erhoehende Attribut (A_...)
zur Verfuegung sowie ggf. das Attribut, das im Tausch gegen das neue
Attribut abgesenkt werden muesste (sonst ist alt_attr==0). Wenn die Funktion
einen String zurueckgibt, wird dieser als Antwort an den Spieler ausgegeben
(z. B. "Was, Du bist verheiratet? Bei so viel Dummheit kann ich Dir die
Intelligenz nicht erhoehen."), und die Erhoehung findet nicht statt.
Rueckgabewert 0 bedeutet, die Erhoehung wird freigegeben. Der /std/statnpc
benutzt diese Funktion NICHT fuer seine eigenen Bedingungen, sondern sie
steht komplett fuer selbstgeschriebene ZUSAETZLICHE Bedingungen zur
Verfuegung (also kein Einarbeiten von ::PreventAdvancement() noetig, sie
wuerde immer 0 liefern).

Die Funktionen, die bei Spielerfragen nach "attribute" oder nach einem
bestimmten Attribut aufgerufen werden, koennen ebenfalls ueberschrieben
werden:

  string CommonAttrAnswer()    // Frage nach "attribute"
  string SpecialAttrAnswer(string question)
                               // Frage nach einem beliebigen Attribut

Letztere wird auch dann ausgewertet, wenn das Monster das betreffende
Attribut gar nicht erhoehen kann (denn das wird erst IN dieser Funktion
abgefragt). Dadurch kann man z. B. die Frage abfangen:

  string SpecialAttrAnswer(string question)
  { 
    if (question=="intelligenz")
      return "Har, har! Also die suchst Du hier im AnderLand vergeblich! :-)";
    return ::SpecialAttrAnswer(question);
  }

Wem die vorgegebenen Standard-Meldungen des /std/statnpc nicht gefallen, der
kann die folgenden Funktionen nach eigenen Wuenschen ueberschreiben:

  string NotMyAttrAnswer(string attr)
     Antwort des Monsters, wenn man es nach einem Attribut fragt, fuer das
     es nicht zustaendig ist (z. B.: "Ausdauer kann ich nicht erhoehen.")

  string Answer(string attr, int possible_value, int real_value)
     Antwort des Monsters, wenn man es nach "seinem" Attribut fragt
     (z. B. "Deine Geschicklichkeit ist hoch genug." oder
     "Deine Geschicklichkeit ist ja deutlich zu niedrig! Das muss geaendert"
     "werden.")

  string ExchangeQuestion(string attr, string alt_attr)
     Rueckfrage des Monsters, wenn es im Gegenzug ein anderes Attribut
     absenken will; die Frage muss so formuliert sein, dass "ja" Zustimmung
     zu diesem Austausch bedeutet
     ("Ich muss dir gleichzeitig Deine Kraft absenken. OK? (ja/nein)")

  string ExchangeAnswer(string attr, string alt_attr)
     Kommentar des Monsters bei Zustimmung des Spielers zum Austausch
     ("Ok, wenn Du unbedingt willst...")

  string NoExchangeAnswer(string attr, string alt_attr)
     Kommentar des Monsters bei Ablehnung des Austausches
     ("Okeeee, dann eben niiiich.")

Den Funktionen wird das zu erhoehende Attribut im Makro-Format A_...
uebergeben (also nicht als Hauptwort ausgeschrieben), und ggf. als zweites
Argument dasjenige Attribut, das im Gegenzug abgesenkt werden muss. Damit
ist es moeglich, auf bestimmte Konstellationen unterschiedlich zu reagieren.
Wenn ein Ereignis keine Ausgabe erzeugen soll, muss die Funktion den
Leerstring "" zurueckgeben (nicht 0). Der String muss als reine Antwort des
Monsters ohne "<Monstername> sagt: " angegeben werden, und zwar fortlaufend
ohne Umbrueche. Die Formatierung geschieht automatisch. Diese Formatierung
mit "sagt: " kann nur umgangen werden, indem man die Ausgabe an
this_player() in der Funktion selbst durchfuehrt und nur einen Leerstring
"" zurueckgibt. Man beachte, dass diese Ausgabe in Monsterobjekten mit 
tell_object(this_player(),...) erfolgen muss und nicht etwa mit write(...).

Fuer alles Selbstgeschriebene stehen ausserdem folgende Funktionen zur
Anwendung bereit, hier mit Argumentbeispiel:

   AttrNoun( A_STR )         liefert  "Kraft"
   AttrAdjective( A_STR )    liefert  "stark"
   AttrComparative( A_STR )  liefert  "staerker"


SIEHE AUCH:
     AddAttribute(), AddAttrSequence(), StartSequence(), P_ATTRIBUTES,
     /std/statnpc.c, /doc/beispiele/monster/arnold.c

DOKUMENTIERT:
     18.06.97  Marita@AnderLand