{
  Beispielprogramm fuer die Textopia-Toolbox
  Kapitel 6.2
}
PROGRAM demo5;
USES TSTRING,TIO,TMAIN;

CONST
  forest_id   = 10;
  sword_id    = 11;
  rucksack_id = 12;
  horse_id    = 13;
  hill_id     = 14;
  grave_id    = 15;
  chamber_id  = 16;
  cave_id     = 17;
  sarko_id    = 18;
  stone_id    = 19;
  bone_id     = 20;
  key_id      = 21;
  link1_id    = 22;
  link2_id    = 23;
  link3_id    = 24;
  link4_id    = 25;

TYPE
  TnRoom = OBJECT(TRoom)
             FUNCTION  BeforeAction(event : TEvent) : BOOLEAN; VIRTUAL;
             PROCEDURE MyText; VIRTUAL;
           END;
  PnRoom = ^TnRoom;
  TnItem = OBJECT(TItem)
             PROCEDURE MyText; VIRTUAL;
           END;
  PnItem = ^TnItem;

VAR
  room   : PnROOM;
  item   : PnItem;
  lock   : PLock;
  link   : PLink;
  player : PPLAYER;
  game   : PGAME;

FUNCTION TnRoom.BeforeAction(event : TEvent) : BOOLEAN;
VAR
  ok : BOOLEAN;
BEGIN
  ok:=t;
  WITH event DO
  BEGIN
    CASE action OF
      go_ev : IF ToDir=down THEN
              BEGIN
                ok:=player^.GetContainer=NIL;
                IF NOT(ok) THEN
                   Print('Mit dem Pferd können Sie hier nicht hinein.\n');
              END;
    END;
  END;
  BeforeAction:=ok;
END;

PROCEDURE TnRoom.MyText;
BEGIN
  CASE GetID OF
    hill_id : BEGIN
                Print('Ein kleiner Hügel erhebt sich in der Mitte einer'+
                      ' Lichtung über das Grab eines Zwergenkönigs. ');
                IF gate[down]^.lock^.GetState=closed THEN
                   Print('Ein steinernes Tor in der Nordseite versperrt'+
                         ' Ihnen den Weg ins Innere.\n')
                   ELSE Print('Das steinerne Tor in der Nordseite steht'+
                              ' offen. Dahinter führt eine Treppe in '+
                              'das Grab hinab.\n');
              END;
  END;
END;

PROCEDURE TnItem.MyText;
BEGIN
  CASE GetID OF
    sarko_id : BEGIN
                 Print('In der Ihnen unbekannten Zwergensprache ist ein '+
                       'Text in die Seiten des Sarkophags gemeißelt. Die '+
                       'schwere Steinplatte, die den Sarkophag einmal '+
                       'verschloß, ist halb zur Seite geschoben. ');
                 IF Contains(Adr(bone_id)) THEN
                    Print('Im Sarkophag liegt ein einzelner Knochen.\n')
                    ELSE Print('Von dem Zwergenkönig ist im Sarkophag '+
                               'nichts mehr zu entdecken.\n');
               END;

  END;
END;

BEGIN
  Prepare('grab',t);
  {
    --- Wald ---
  }
  NEW(room,Init(forest_id,'+W%ald#er'));
  WITH room^ DO
  BEGIN
    AddText('Fast undurchdringliches Unterholz läßt Sie nur mühsam '+
            'weiterkommen. Weiter westlich scheinen die Bäume weniger '+
            'dicht beieinander zu stehen.\n');
  END;
  {
    --- Lichtung mit Eingang ---
    Variable Beschreibung erfolgt in der überladenen Methode TnRoom.MyText
  }
  NEW(room,Init(hill_id,'-Lichtung#en'));
  {
    --- Grabkammer ---
  }
  NEW(room,Init(grave_id,'-Grabkammer#n'));
  WITH room^ DO
  BEGIN
    AddText('In der Mitte der engen Grabkammer steht ein Sarkophag. In '+
            'der Ostwand befindet sich eine schwere, mit Eisen beschlagene '+
            'Eichentür. Im Südwesten führt ein schmaler Gang weiter in '+
            'eine hinter der Grabkammer liegende Höhle.\n');
  END;
  {
    --- Schatzkammer ---
  }
  NEW(room,Init(chamber_id,'-Schatzkammer#n'));
  WITH room^ DO
  BEGIN
    AddText('In dieser Kammer lagerten die Grabbeigaben des Königs.\n');
  END;
  {
    --- Versteck des Hobgoblins ---
  }
  NEW(room,Init(cave_id,'-Höhle#n'));
  WITH room^ DO
  BEGIN
    AddText('Sie befinden sich in der kleinen Höhle im Südwesten der '+
            'Grabkammer. Diese Höhle wurde offensichtlich nicht von den '+
            'Zwergen angelegt, als sie das Grab schufen. Die Wand der '+
            'Grabkammer wurde für die Höhle durchbrochen und die Wände ');
    AddText('der Höhle sind mit scheußlichen Symbolen übersäht, die sich '+
            'stark von den Schriftzeichen der Zwerge auf dem Sarkophag '+
            'unterscheiden.\n');
  END;
  {
    --- Pferd ---
  }
  NEW(item,Init(horse_id,'Pferd#e',Adr(forest_id),t,1,10));
  WITH item^ DO
  BEGIN
    SetAttrib(enterable_at,t);
    SetAttrib(moveable_at,t);
    SetPraepos('auf');
  END;
  {
    --- Spieler ---
    Muss vor den Objekten definiert werden, die in seinem Inventar
    plaziert werden
  }
  NEW(player,Init(horse_id,sie,male,1,10));
  {
    --- Schwert ---
  }
  NEW(item,Init(sword_id,'Schwert#er',NIL,t,1,0));
  WITH item^ DO
  BEGIN
    SetAttrib(takeable_at,t);
    AddText('Das Schwert hat der Waffenschmied Ihnen kurz vor Ihrer '+
            'Abreise gegeben. Es schimmert und ist sehr scharf. Den '+
            'Schmied zu überreden, Ihnen das Schwert anzuschreiben, weil '+
            'Sie die nötigen Taler erst noch in den Gräbern finden '+
            'müßten, war nicht einfach.\n');
  END;
  {
    --- Rucksack ---
  }
  NEW(item,Init(rucksack_id,'+Rucks%ack#e',NIL,t,1,5));
  item^.SetAttrib(takeable_at,t);
  NEW(lock,Init(item,t,t,closed,NIL));
  {
    --- Sarkophag ---
  }
  NEW(item,Init(sarko_id,'+Sarkophag',Adr(grave_id),f,1,5));
  NEW(lock,Init(item,f,f,open,NIL));
  NEW(item,Init(stone_id,'-Steinplatte#n',Adr(grave_id),f,1,0));
  {
    --- Knochen ---
  }
  NEW(item,Init(bone_id,'+Knochen',Adr(sarko_id),t,1,0));
  WITH item^ DO
  BEGIN
    SetAttrib(takeable_at,t);
    AddText('Dies ist der einzige Knochen, der von dem hier bestatteten '+
            'König geblieben ist. Wenn Sie genau hinschauen, entdecken Sie '+
            'an dem Knochen tiefe Kratzer, die nur von sehr scharfen '+
            'Zähnen stammen können.\n');
  END;
  {
    Schluessel fuer Eichentuer
  }
  NEW(item,Init(key_id,'+Schlüssel',Adr(cave_id),t,1,0));
  item^.SetAttrib(takeable_at,t);
  {
    --- Verbindungen und Türen zwischen Raeumen ---
  }
  NEW(link,Init(link1_id,'',forest_id,west,hill_id,f));
  NEW(link,Init(link2_id,'Tor',hill_id,down,grave_id,f));  { Tor und }
  NEW(lock,Init(link,t,t,closed,NIL));  { zugehoeriges Schloss }
  NEW(link,Init(link3_id,'-Eichentür#en;-Tür#en',grave_id,east,chamber_id,f));
  NEW(lock,Init(link,t,t,locked,Adr(key_id)));
  NEW(link,Init(link4_id,'',grave_id,southwest,cave_id,f));
  {
    --- Spiel ---
  }
  NEW(game,Init(t,f,t,4));
  WITH game^ DO
  BEGIN
    AddProlog('Das Zwergengrab\nEine Texttopia-Demo von Oliver Berse\n\n'+
              'Drei Tage schon durchstreifen Sie abseits der Straßen den '+
              'alten Wald. Hier irgendwo liegen die mit Schätzen gefüllten '+
              'Gräber der Zwergenkönige, die einst diese Länder '+
              'beherrschten.\n\n');
    Run;
    Done;
  END;
END.
