summaryrefslogtreecommitdiff
path: root/app/gs.hamster/1.1/src/ls-Herbert und Robbi 1
blob: ed19e986a0ef0f63d4437c9e34cdda59418504d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
(* 
        
          ********************************************************* 
          ********************************************************* 
          **                                                     ** 
          **                ls-Herbert und Robbi 1               ** 
          **                                                     ** 
          **                     Version 1.1                     ** 
          **                                                     ** 
          **                  (Stand: 30.03.88)                  ** 
          **                                                     ** 
          **                                                     ** 
          **         Autor: Wolfgang Weber, Bielefeld            ** 
          **                                                     ** 
          **                                                     ** 
          ** Copyright (C) 1987, 1988 Eva Latta-Weber, Bielefeld ** 
          **                                                     ** 
          ** Copyright (C) 1988 ERGOS GmbH, Siegburg             ** 
          **                                                     ** 
          ********************************************************* 
          ********************************************************* 
 
                                                                           *) 
 
PACKET ls herbert und robbi 1  DEFINES{}       sei ein hamster, ist hamster,{}       sei ein roboter, ist roboter,{}       landschaft, arbeitsfeld,{}       vor, links um, nimm, gib,{}       korn da, werkstueck da,{}       backen leer, behaelter leer,{}       vorn frei, lauf,{}       hamsterinter, roboterinter,{}       geschwindigkeit, taste,{}       befehlssatz erweitern,{}       befehlssatz ist erweitert,{}       drucke landschaft,{}       hamster druckerstart einstellen,{}       hamster drucker xstart,{}
       hamster drucker ystart,{}       hamster landschaftsschrifttyp einstellen,{}       hamster landschaftsschrifttyp,{}       druckereinstellung fuer flaechenausdruck,{}       landschaftsauskunftstext,{}       testauskunftstext 1, testauskunftstext 2,{}       befehlsauskunftstext, laufauskunftstext,{}       kommandomodus, hamstermodus,{}       zeige landschaft, lege landschaft ab:{}TYPE LOCATION          = STRUCT (INT x, y);{}LET  menukarte         =  "ls-MENUKARTE:Herbert und Robbi",{}     richtung          =  ""3""8""10""2"",{}
     erscheinungsform  =           "A<V>",{}     praefix           =       "Flaeche:",{}     flaechentype      =             1007,{}     neutral           =                0,{}     erzeuge           =                1,{}     hamsterlauf       =                2,{}     interaktiv        =                3,{}     kommandostufe     =               99,{}     west              =            ""8"",{}     ost               =            ""2"",{}     cleol             =            ""5"",{}     piep              =            ""7"",{}
     mark ein          =           ""15"",{}     mark aus          =           ""14"",{}     escape            =           ""27"",{}     blank             =              " ",{}     niltext           =               "",{}     hindernis         =              "#",{}     korn              =              "o",{}     hinderniskachel   =             "##",{}     blankkachel       =             " .",{}     kornkachel        =             " o",{}     protokollname     =      "PROTOKOLL";{}LET    max x           =               40,{}
       max y           =               23;{}LET    FLAECHE         =  ROW max x ROW max y INT;{}LET    LANDSCHAFT      =  STRUCT (INT xpos, ypos, blickrichtung,{}                                      anzahl koerner, FLAECHE flaeche);{}LET    HAMSTER         =  STRUCT (LOCATION stelle, INT koerner, form);{}BOUND LANDSCHAFT VAR aktuelle landschaft;{}FLAECHE VAR land;{}HAMSTER VAR hamster;{}FILE VAR protokoll;{}INT  CONST besetzt                 ::             -1,{}           frei                    ::              0;{}
TEXT CONST kornsymbole             ::{}  "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";{}INT CONST maxkornzahl              ::   LENGTH kornsymbole;{}BOOL VAR   hamster eingestellt     ::           TRUE,{}           befehlssatz erweitert   ::          FALSE;{}TEXT VAR   eingabezeichen          ::        niltext,{}           archivlandschaftsname   ::        niltext,{}           hinderniszeichen        ::           "\#\#",{}           schrifttyp              ::        niltext;{}INT  VAR   verzoegerungsfaktor     ::              5,{}
           modus                   ::  kommandostufe,{}           a, b, c, d;{}REAL VAR   xstart                  ::            0.0,{}           ystart                  ::            0.0;{}WINDOW VAR fenster                 ::  window (1, 1, 79, 24);{}INITFLAG VAR in this task          ::  FALSE;{}OP := (LOCATION VAR l, LOCATION CONST r):{}   l.x := r.x; l.y := r.y{}END OP :=;{}PROC initialize hamstersystem:{}  IF NOT initialized (in this task){}     THEN install menu (menukarte);{}  FI{}END PROC initialize hamstersystem;{}
PROC sei ein hamster:{}  hamster eingestellt := TRUE{}END PROC sei ein hamster;{}BOOL PROC ist hamster:{}   hamster eingestellt{}END PROC ist hamster;{}PROC sei ein roboter:{}  hamster eingestellt := FALSE{}END PROC sei ein roboter;{}BOOL PROC ist roboter:{}   NOT hamster eingestellt{}END PROC ist roboter;{}PROC hole landschaft (TEXT CONST name):{}   aktuelle landschaft := old (praefix + name);{}   land                := aktuelle landschaft.flaeche;{}   hamster.form        := aktuelle landschaft.blickrichtung;{}
   hamster.stelle.x    := aktuelle landschaft.xpos;{}   hamster.stelle.y    := aktuelle landschaft.ypos;{}   hamster.koerner     := aktuelle landschaft.anzahl koerner{}END PROC hole landschaft;{}PROC lege landschaft ab (TEXT CONST name):{}   IF exists (praefix + name){}      THEN forget (praefix + name, quiet){}   FI;{}   aktuelle landschaft                := new (praefix + name);{}   aktuelle landschaft.flaeche        := land;{}   aktuelle landschaft.blickrichtung  := hamster.form;{}   aktuelle landschaft.xpos           := hamster.stelle.x;{}
   aktuelle landschaft.ypos           := hamster.stelle.y;{}   aktuelle landschaft.anzahl koerner := hamster.koerner;{}   type( old(praefix + name), flaechentype){}END PROC lege landschaft ab;{}PROC hamstermodus:{}   modus := neutral{}END PROC hamstermodus;{}PROC kommandomodus:{}   modus := kommandostufe{}END PROC kommandomodus;{}PROC erzeugemodus:{}   modus := erzeuge{}END PROC erzeugemodus;{}PROC intermodus:{}   modus := interaktiv{}END PROC intermodus;{}PROC laufmodus:{}   modus := hamsterlauf{}
END PROC laufmodus;{}BOOL PROC vorn frei:{}  kontrolliere modus;{}  LOCATION VAR hier :: hamster.stelle;{}  SELECT hamster.form OF{}    CASE 1: IF hamster.stelle.y < 2       THEN protestiere FI;{}            hier.y DECR 1{}    CASE 2: IF hamster.stelle.x < 2       THEN protestiere FI;{}            hier.x DECR 1{}    CASE 3: IF hamster.stelle.y >= max y  THEN protestiere FI;{}            hier.y INCR 1{}    CASE 4: IF hamster.stelle.x >= max x  THEN protestiere FI;{}            hier.x INCR 1{}    OTHERWISE modus := kommandostufe;{}
              IF ist hamster{}                 THEN errorstop(nachricht( 7)){}                 ELSE errorstop(nachricht(14)){}              FI{}  END SELECT;{}  IF modus = erzeuge{}     THEN TRUE{}     ELSE land[hier.x] [hier.y] <> besetzt{}  FI{}END PROC vorn frei;{}BOOL PROC korn da:{}  kontrolliere modus;{}  kornzahl > 0{}END PROC korn da;{}INT PROC kornzahl:{}  land [hamster.stelle.x] [hamster.stelle.y]{}END PROC kornzahl;{}BOOL PROC werkstueck da:{}  korn da{}END PROC werkstueck da;{}BOOL PROC backen leer:{}
  kontrolliere modus;{}  hamster.koerner <= 0 AND (modus = hamsterlauf OR modus = interaktiv){}END PROC backen leer;{}BOOL PROC behaelter leer:{}  backen leer{}END PROC behaelter leer;{}PROC protestiere:{}  IF modus = erzeuge{}     THEN out(piep); eins zurueck{}     ELSE verzoegere 10 mal; zeige("X"); verzoegere 10 mal;{}          kommandomodus;{}          IF ist hamster{}             THEN errorstop(nachricht( 6)){}             ELSE errorstop(nachricht(13)){}          FI;{}  FI.{}  eins zurueck:{}
    SELECT hamster.form OF{}      CASE 1:   hamster.stelle.y INCR 1{}      CASE 2:   hamster.stelle.x INCR 1{}      CASE 3:   hamster.stelle.y DECR 1{}      CASE 4:   hamster.stelle.x DECR 1{}      OTHERWISE kommandomodus;{}                IF ist hamster{}                   THEN errorstop(nachricht( 7)){}                   ELSE errorstop(nachricht(14)){}                FI;{}     END SELECT.{}  verzoegere 10 mal:{}    INT VAR j;{}    FOR j FROM 1 UPTO 10 REP{}      verzoegere{}    PER{}END PROC protestiere;{}
PROC verzoegere:{}  IF modus <> hamsterlauf{}     THEN LEAVE verzoegere{}  FI;{}  eingabezeichen := incharety (verzoegerungsfaktor);{}  IF   eingabezeichen = escape{}       THEN kommandomodus;{}            IF ist hamster{}               THEN errorstop(nachricht( 4)){}               ELSE errorstop(nachricht(11)){}            FI{}  ELIF eingabezeichen = "-" THEN verlangsame{}  ELIF eingabezeichen = "+" THEN beschleunige{}  ELIF eingabezeichen = "?" THEN boxinfo (fenster, laufauskunftstext,{}                                                   5, maxint, a, b, c, d);{}
                                 cursor on; zeige landschaft{}  ELIF pos ("0123456789", eingabezeichen) > 0{}        THEN geschwindigkeit (int (eingabezeichen)){}  FI.{}  verlangsame:{}    IF   verzoegerungsfaktor > 31 THEN  (* lass es dabei *){}    ELIF verzoegerungsfaktor < 1{}         THEN verzoegerungsfaktor INCR 1{}         ELSE verzoegerungsfaktor INCR verzoegerungsfaktor{}    FI.{}  beschleunige:{}    IF verzoegerungsfaktor < 1{}       THEN verzoegerungsfaktor := -1{}       ELSE verzoegerungsfaktor := verzoegerungsfaktor DIV 2{}
    FI{}END PROC verzoegere;{}PROC geschwindigkeit (INT CONST faktor):{}  SELECT faktor OF{}    CASE 0 :  verzoegerungsfaktor := 20000;{}    CASE 1 :  verzoegerungsfaktor :=    50;{}    CASE 2 :  verzoegerungsfaktor :=    20;{}    CASE 3 :  verzoegerungsfaktor :=    10;{}    CASE 4 :  verzoegerungsfaktor :=     8;{}    CASE 5 :  verzoegerungsfaktor :=     5;{}    CASE 6 :  verzoegerungsfaktor :=     2;{}    CASE 7 :  verzoegerungsfaktor :=     1;{}    CASE 8 :  verzoegerungsfaktor :=     0;{}    CASE 9 :  verzoegerungsfaktor :=    -1;{}
    OTHERWISE (*belasse es dabei*){}  END SELECT{}END PROC geschwindigkeit;{}PROC vor:{}  kontrolliere modus;{}  IF vorn frei{}     THEN zeige(kachel);{}          bilde neue hamsterkoordinaten;{}          zeige(erscheinungsform SUB hamster.form);{}          verzoegere{}     ELSE modus := kommandostufe;{}          zeige("X");{}          IF ist hamster{}             THEN errorstop(nachricht(1)){}             ELSE errorstop(nachricht(8)){}          FI{}  FI.{}  kachel:{}    INT CONST z :: land [hamster.stelle.x] [hamster.stelle.y];{}
    IF   z = besetzt THEN hinderniskachel{}    ELIF z = frei    THEN blankkachel{}                     ELSE kornkachel{}    FI.{}  bilde neue hamsterkoordinaten:{}    SELECT hamster.form OF{}      CASE 1    :hamster.stelle.y DECR 1{}      CASE 2    :hamster.stelle.x DECR 1{}      CASE 3    :hamster.stelle.y INCR 1{}      CASE 4    :hamster.stelle.x INCR 1{}      OTHERWISE  modus:=kommandostufe;{}                 IF ist hamster{}                    THEN errorstop(nachricht( 7)){}                    ELSE errorstop(nachricht(14)){}
                 FI{}    END SELECT.{}END PROC vor;{}PROC nimm:{}  kontrolliere modus;{}  IF korn da{}     THEN variiere kornzahl (-1);{}          IF kornzahl < 1 THEN zeige (ost + blank) FI{}     ELSE modus := kommandostufe;{}          zeige("X");{}          IF ist hamster{}             THEN errorstop(nachricht(2)){}             ELSE errorstop(nachricht(9)){}          FI{}  FI;{}  verzoegere{}END PROC nimm;{}PROC gib:{}  kontrolliere modus;{}  IF backen leer{}     THEN modus := kommandostufe;{}          zeige ("X");{}
          IF ist hamster{}             THEN errorstop(nachricht( 3)){}             ELSE errorstop(nachricht(10)){}          FI{}     ELSE variiere kornzahl (+1);{}          zeige(ost + korn){}  FI;{}  verzoegere{}END PROC gib;{}PROC links um:{}  kontrolliere modus;{}  hamster.form := hamster.form MOD 4 + 1;{}  (* da hamster.form der Werte 1,2,3,4 faehig ist und linksdreht *){}  zeige (subjekt);{}  verzoegere.{}  subjekt:{}    erscheinungsform SUB hamster.form.{}END PROC links um;{}PROC variiere kornzahl (INT CONST delta):{}
  IF delta * delta <> 1{}     THEN LEAVE variiere kornzahl{}  FI;   (* als delta kommen nur +1 und -1 vor *){}  INT VAR k;{}  IF kornzahl = -1 AND delta = 1{}     THEN k := 1{}     ELSE k := kornzahl + delta{}  FI;{}  IF k <= 0{}     THEN land [hamster.stelle.x] [hamster.stelle.y] := frei{}     ELSE land [hamster.stelle.x] [hamster.stelle.y] := min (k,maxkornzahl){}  FI;{}  IF modus = hamsterlauf OR modus = interaktiv{}     THEN hamster.koerner DECR delta{}  FI{}END PROC variiere kornzahl;{}PROC kontrolliere modus:{}
  initialize hamstersystem;{}  SELECT modus OF{}    CASE neutral    : erzeugemodus;{}                      landschaft;{}                      laufmodus{}    CASE erzeuge,{}         interaktiv,{}         hamsterlauf: (* nichts *){}    OTHERWISE         kommandomodus;{}                      line;{}                      IF ist hamster{}                         THEN sage(anwendungstext (21));pause(20);{}                              errorstop(nachricht( 5)){}                         ELSE sage(anwendungstext (22));pause(20);{}
                              errorstop(nachricht(12)){}                      FI{}  END SELECT{}END PROC kontrolliere modus;{}PROC zeige (TEXT CONST was):{}   cursor (2 * hamster.stelle.x - 1, hamster.stelle.y);{}   IF hamster.stelle.x >= max x  AND hamster.stelle.y > max y{}      THEN out ((was SUB 1)); out(west){}      ELSE out(was); (LENGTH was) TIMESOUT west{}   FI.{}END PROC zeige;{}PROC sage (TEXT CONST aussage):{}   cursor(1,24); out(aussage + cleol){}END PROC sage;{}TEXT PROC nachricht (INT CONST nummer):{}
   inv (text (anwendungstext (nummer), 65)) + piep{}END PROC nachricht;{}TEXT PROC inv (TEXT CONST text):{}  TEXT VAR aus :: mark ein + text + blank + mark aus;{}  aus{}END PROC inv;{}PROC zeige landschaft:{}  initialize hamstersystem;{}  INT VAR y;{}  FOR y FROM 1 UPTO max y REP{}     setze zeile zusammen;{}     cursor (1,y); out (zeile){}  PER;{}  cursor(1,24); out(cleol);{}  IF modus = interaktiv{}     THEN gib befehlszeile aus{}  FI;{}  zeige hamster; cursor on.{}  setze zeile zusammen:{}    TEXT VAR zeile :: niltext;{}
    INT VAR x;{}    FOR x FROM 1 UPTO max x REP{}       zeile CAT kachel{}    PER.{}  kachel:{}    INT CONST z :: land [x] [y];{}    IF   z = besetzt THEN hinderniskachel{}    ELIF z = frei    THEN blankkachel{}                     ELSE kornkachel{}    FI.{}   gib befehlszeile aus:{}     cursor(1,1); write(cleol); write (anwendungstext (62)){}END PROC zeige landschaft;{}PROC zeige hamster:{}   zeige (erscheinungsform SUB hamster.form){}END PROC zeige hamster;{}PROC landschaft (TEXT CONST kandidat):{}
  initialize hamstersystem;{}  archivlandschaftsname := kandidat;{}  IF   exists (praefix + kandidat){}         CAND type (old (praefix + kandidat)) = flaechentype{}       THEN behandle existierende landschaft{}  ELIF exists (praefix + kandidat){}       THEN forget (praefix + kandidat, quiet);{}            behandle neue landschaft{}  ELSE behandle neue landschaft{}  FI.{}  behandle existierende landschaft:{}    hole landschaft (kandidat);{}    SELECT modus OF{}      CASE hamsterlauf,{}           interaktiv,{}
           neutral       : zeige landschaft;{}                           laufmodus{}      CASE erzeuge       : modifiziere eventuell{}      CASE kommandostufe : modifiziere landschaft{}      OTHERWISE            errorstop (anwendungstext (15)){}    END SELECT.{}  behandle neue landschaft:{}    SELECT modus OF{}      CASE hamsterlauf,{}           interaktiv,{}           neutral,{}           erzeuge       : erschaffe landschaft;{}                           modifiziere landschaft;{}                           zeige landschaft;{}
                           laufmodus{}      CASE kommandostufe : erschaffe landschaft;{}                           modifiziere landschaft;{}      OTHERWISE            errorstop (anwendungstext (15)){}    END SELECT.{}  modifiziere eventuell:{}    IF ist hamster{}       THEN IF boxyes (fenster, anwendungstext (41), 5, a, b, c, d){}               THEN cursor on; modifiziere landschaft{}            FI{}       ELSE IF boxyes (fenster, anwendungstext (42), 5, a, b, c, d){}               THEN cursor on; modifiziere landschaft{}
            FI{}    FI;{}    zeige landschaft.{}  erschaffe landschaft:{}    INT VAR j;{}    FOR j FROM 1 UPTO max y REP{}      INT VAR k;{}      FOR k FROM 1 UPTO max x REP{}        land [k] [j] := frei{}      PER{}    PER;{}    hamster.form     :=   4;{}    hamster.stelle.x :=  20;{}    hamster.stelle.y :=  12;{}    hamster.koerner  :=   0.{}END PROC landschaft;{}PROC landschaft:{}  initialize hamstersystem;{}  IF ist hamster{}     THEN landschaft (erfragter landschaftsname (anwendungstext (36))){}
     ELSE landschaft (erfragter landschaftsname (anwendungstext (37))){}  FI{}END PROC landschaft;{}TEXT PROC erfragter landschaftsname (TEXT CONST satz):{}  TEXT VAR landschaftsname :: archivlandschaftsname;{}  REP{}    page; line (3); out (satz + cleol); line (2);{}    editget (landschaftsname);{}    landschaftsname := compress (landschaftsname);{}    IF landschaftsname = niltext{}       THEN line (2); out (anwendungstext (18) + piep);{}            line (2); out (anwendungstext (38)); pause{}    FI{}
  UNTIL landschaftsname <> niltext PER;{}  landschaftsname{}END PROC erfragter landschaftsname;{}PROC arbeitsfeld (TEXT CONST kandidat):{}  landschaft (kandidat){}END PROC arbeitsfeld;{}PROC arbeitsfeld:{}  landschaft{}END PROC arbeitsfeld;{}PROC modifiziere landschaft:{}  INT CONST modalibi :: modus;{}  erzeugemodus;{}  zeige landschaft;{}  informiere;{}  zeige hamster;{}  nimm ein eingabezeichen;{}  WHILE nicht endewunsch REP{}    erfuelle fortschreibungswunsch;{}    nimm ein eingabezeichen{}  PER;{}
  erfrage koernerzahl;{}  lege landschaft ab (archivlandschaftsname);{}  modus := modalibi.{}  nimm ein eingabezeichen:{}    inchar (eingabezeichen).{}  nicht endewunsch:{}    pos ("hH", eingabezeichen) = 0.{}  erfuelle fortschreibungswunsch:{}    INT CONST r :: pos (richtung, eingabezeichen){}    IF   r > 0{}         THEN IF hamster.form = r{}                 THEN vor{}                 ELSE hamster.form := r;{}                      zeige hamster{}              FI{}    ELIF eingabezeichen = "?" THEN boxinfo (fenster, landschaftsauskunftstext,{}
                                                     5, maxint, a, b, c, d);{}                                   cursor on; zeige landschaft; informiere{}    ELIF eingabezeichen = "k" THEN kopiere landschaft;{}                                   zeige landschaft; informiere{}    ELIF eingabezeichen = "g" THEN gib{}    ELIF eingabezeichen = "n" THEN IF korn da THEN nimm ELSE out (piep) FI{}    ELIF eingabezeichen = "z" THEN zeige (text (kornzahl, 2)){}    ELIF eingabezeichen = hindernis{}         THEN  land [hamster.stelle.x] [hamster.stelle.y] := besetzt; vor{}
    ELIF eingabezeichen = blank{}         THEN  land [hamster.stelle.x] [hamster.stelle.y] := frei;    vor{}    ELSE out (piep){}    FI.{}    kopiere landschaft:{}      TEXT VAR kopie;{}      IF NOT not empty (alle landschaften){}         THEN IF ist hamster{}                 THEN boxinfo (fenster, anwendungstext (196), 5, maxint){}                 ELSE boxinfo (fenster, anwendungstext (197), 5, maxint){}              FI{}         ELSE lasse original auswaehlen{}      FI.{}    lasse original auswaehlen:{}
      IF ist hamster{}         THEN kopie := boxone (fenster, alle landschaften,{}                               anwendungstext (23), anwendungstext (24),{}                               FALSE){}         ELSE kopie := boxone (fenster, alle landschaften,{}                               anwendungstext (25), anwendungstext (26),{}                               FALSE){}      FI;{}      cursor on; hole landschaft (kopie).{}    alle landschaften:{}      ohne praefix (infix namen (ALL myself, praefix, flaechentype), praefix).{}
    erfrage koernerzahl:{}      TEXT VAR eingabe; BOOL VAR ist ok; INT VAR zahl;{}      cursor (1,23); 79 TIMESOUT waagerecht;{}      REP{}        ist ok := TRUE;{}        IF ist hamster{}           THEN eingabe := boxanswer (fenster, anwendungstext (43),{}                                               text (hamster.koerner),{}                                               5, a, b, c, d){}           ELSE eingabe := boxanswer (fenster, anwendungstext (44),{}                                               text (hamster.koerner),{}
                                               5, a, b, c, d){}        FI;{}        disable stop;{}        IF eingabe = "" THEN eingabe := "0" FI;{}        zahl := int (eingabe);{}        IF zahl < 0 OR zahl > maxint THEN ist ok := FALSE FI;{}        IF is error THEN ist ok := FALSE; clear error FI;{}        enable stop;{}      UNTIL last conversion ok AND ist ok PER;{}      cursor on;{}      hamster.koerner := zahl.{}    informiere:{}      cursor (1,1);{}      IF ist hamster{}         THEN out (anwendungstext (27)){}
         ELSE out (anwendungstext (28)){}      FI{}END PROC modifiziere landschaft;{}PROC lauf (TEXT CONST dateiname):{}  initialize hamstersystem;{}  IF NOT exists (dateiname){}     THEN errorstop (anwendungstext (16) + dateiname + anwendungstext (17)){}  FI;{}  hamstermodus;{}  disable stop;{}  run (dateiname);{}  kommandomodus;{}  cursor (1, 24);{}  IF is error{}     THEN IF length (errormessage) > 1{}             THEN sage (errormessage); pause;{}          FI{}     ELSE sage (anwendungstext (29)); pause; konserviere landschaft{}
  FI;{}  clear error;{}  enable stop{}END PROC lauf;{}PROC lauf:{}  lauf (last param){}END PROC lauf;{}PROC konserviere landschaft:{}  TEXT VAR neuer landschaftsname;{}  IF ist hamster{}     THEN stelle landschaftsfrage{}     ELSE stelle arbeitsfeldfrage{}  FI; cursor on.{}  stelle landschaftsfrage:{}    IF boxyes (fenster, anwendungstext (45), 5){}       THEN bewahre landschaft auf{}    FI.{}  stelle arbeitsfeldfrage:{}    IF boxyes (fenster, anwendungstext (46), 5){}       THEN bewahre landschaft auf{}
    FI.{}  bewahre landschaft auf:{}    neuer landschaftsname := archivlandschaftsname + ".x";{}    lege landschaft ab (neuer landschaftsname);{}    gib hinweis auf neuen namen.{}  gib hinweis auf neuen namen:{}    IF ist hamster{}       THEN boxinfo (fenster, anwendungstext (30){}                     + inv (neuer landschaftsname), 5, maxint, a, b, c, d){}       ELSE boxinfo (fenster, anwendungstext (31){}                     + inv (neuer landschaftsname), 5, maxint, a, b, c, d){}    FI{}END PROC konserviere landschaft;{}
PROC hamsterinter (TEXT CONST landschaftsname):{}  initialize hamstersystem;{}  sei ein hamster;{}  steuere interaktiv (landschaftsname);{}  cursor on{}END PROC hamsterinter;{}PROC hamsterinter:{}  initialize hamstersystem;{}  hamsterinter (erfragter landschaftsname (anwendungstext (39))){}END PROC hamsterinter;{}PROC roboterinter (TEXT CONST landschaftsname):{}  initialize hamstersystem;{}  sei ein roboter;{}  steuere interaktiv (landschaftsname);{}  cursor on{}END PROC roboterinter;{}PROC roboterinter:{}
  initialize hamstersystem;{}  roboterinter (erfragter landschaftsname (anwendungstext (40))){}END PROC roboterinter;{}PROC steuere interaktiv (TEXT CONST landschaftsname):{}  forget (protokollname, quiet);{}  protokoll := sequential file (output, protokollname);{}  intermodus;{}  landschaft (landschaftsname);{}  TEXT VAR befehl :: niltext, letzter befehl :: niltext;{}  REP{}    arbeiten{}  PER.{}  arbeiten:{}    intermodus;{}    hole befehl;{}    fuehre befehl aus.{}  hole befehl:{}    TEXT VAR befehlszeichen;{}
    TEXT CONST befehlskette :: "vlngpeVLNGPE";{}    INT VAR befehlsposition;{}    zeige (hamsterform);{}    cursor (1,24);{}    IF ist hamster{}       THEN out (cleol + anwendungstext (32) + letzter befehl){}       ELSE out (cleol + anwendungstext (33) + letzter befehl){}    FI;{}    cursor(24,24);{}    inchar (befehlszeichen);{}    befehlsposition := pos(befehlskette,befehlszeichen);{}    IF befehlsposition = 0{}       THEN out(piep);{}            LEAVE arbeiten{}    FI;{}    SELECT befehlsposition OF{}
      CASE 1, 7: befehl := "vor";{}                           out("vor");{}                           letzter befehl := "vor"{}      CASE 2, 8: befehl := "links um";{}                           out("links um");{}                           letzter befehl := "links um"{}      CASE 3, 9: befehl := "nimm";{}                           out("nimm");{}                           letzter befehl := "nimm"{}      CASE 4,10: befehl := "gib";{}                           out("gib");{}                           letzter befehl := "gib"{}
      CASE 5,11: out("protokoll");{}                 letzter befehl := "protokoll";{}                 FILE VAR p :: sequential file (modify,protokollname);{}                 headline(p, protokollname + "  (Verlassen: <ESC><q>)");{}                 cursor on; show(p); cursor off;{}                 zeige landschaft; befehl := "";{}                 output(protokoll);{}                 LEAVE arbeiten{}      CASE 6,12: out("ende"); kommandomodus; befehl := "";{}                 LEAVE steuere interaktiv{}
    END SELECT.{}   hamsterform:{}     erscheinungsform SUB hamster.form.{}   fuehre befehl aus:{}     BOOL VAR korrekt;{}     disable stop;{}     do (befehl);{}     cursor (1,24);{}     korrekt := NOT is error;{}     IF is error{}        THEN IF errormessage > ""{}                THEN out (inv (text (errormessage, 65)) + piep);{}                     pause(30);{}             FI;{}             clear error{}     FI;{}     IF korrekt AND befehl <> ""{}        THEN protokolliere (befehl){}     FI;{}     enable stop;{}
END PROC steuere interaktiv;{}PROC protokolliere (TEXT CONST befehl):{}  putline (protokoll, befehl + ";"){}END PROC protokolliere;{}PROC drucke landschaft (TEXT CONST landschaftsname):{}  initialize hamstersystem;{}  ROW max y TEXT VAR drucklandschaft;{}  BOUND LANDSCHAFT VAR al;{}  INT VAR i, hamsterx, hamstery;{}  TEXT VAR hamsterzeichen;{}  landschaftsdatei holen;{}  drucklandschaft erzeugen;{}  hamster in drucklandschaft einsetzen;{}  druckdatei erzeugen;{}  disable stop;{}  TEXT VAR datname := std;{}
  do ("print (""druckdatei"")");{}  IF is error{}      THEN menuinfo (inv (errormessage));{}           clear error;{}  FI;{}  last param (datname);{}  enable stop;{}  druckdatei loeschen;{}  cursor on.{}  landschaftsdatei holen:{}    IF exists (praefix + landschaftsname) AND{}       (type (old (praefix + landschaftsname)) = flaechentype){}       THEN hole landschaft;{}       ELSE LEAVE drucke landschaft{}    FI.{}  hole landschaft:{}    al             := old (praefix + landschaftsname);{}    hamsterx       := al.xpos;{}
    hamstery       := al.ypos;{}    hamsterzeichen := erscheinungsform SUB al.blickrichtung.{}  drucklandschaft erzeugen:{}    TEXT VAR zeile; INT VAR  x;{}    FOR i FROM 1 UPTO max y REP{}        zeile := "";{}        FOR x FROM 1 UPTO maxx REP{}            zeile erzeugen{}        PER;{}        drucklandschaft[i] :=  zeile{}    PER.{}  zeile erzeugen:{}    INT CONST zeichen :: al.flaeche [x] [i];{}    IF   zeichen = besetzt THEN zeile CAT hinderniszeichen{}    ELIF zeichen = frei    THEN zeile CAT " ."{}
                           ELSE zeile CAT " o"{}    FI.{}  hamster in drucklandschaft einsetzen:{}    change (drucklandschaft [hamstery], hamsterx*2-1, hamsterx*2-1,{}            hamsterzeichen).{}  druckdatei erzeugen:{}    FILE VAR p::sequential file(output, "druckdatei");{}    INT VAR blankzahl;{}    line(p);{}    putline(p,"#type (""" + schrifttyp + """)#");{}    putline(p,"#start(" + text(xstart) + "," + text(ystart) + ")#");{}    putline(p,"#limit(20.8)#");{}    blankzahl := ( 80 - (8 + length (landschaftsname))) DIV 2;{}
    putline(p, blankzahl * " " + praefix + landschaftsname + " ");{}    putline(p, "  ");{}    FOR i FROM 1 UPTO maxy REP{}      putline(p, drucklandschaft[i] + " "){}    PER.{}  druckdatei loeschen:{}    forget("druckdatei", quiet){}END PROC drucke landschaft;{}PROC drucke landschaft:{}  initialize hamstersystem;{}  IF ist hamster{}     THEN drucke landschaft (erfragter landschaftsname (anwendungstext (36))){}     ELSE drucke landschaft (erfragter landschaftsname (anwendungstext (37))){}  FI;{}  cursor on{}
END PROC drucke landschaft;{}PROC druckereinstellung fuer flaechenausdruck:{}  initialize hamstersystem;{}  page;{}  IF ist hamster{}     THEN putline (center (invers (anwendungstext (71)))){}     ELSE putline (center (invers (anwendungstext (72)))){}  FI;{}  line (3);{}  put (anwendungstext (73));{}  editget (schrifttyp);{}  line (2);{}  schrifttyp := compress (schrifttyp);{}  putline (anwendungstext (74));{}  putline (anwendungstext (75)); line (2);{}  putline (anwendungstext (76) + text (xstart) + "," + text (ystart) +{}
           anwendungstext (77)); line;{}  put (anwendungstext (78)); get (xstart); line;{}  put (anwendungstext (79)); get (ystart); line (2);{}  IF yes (anwendungstext (80) + hinderniszeichen + anwendungstext (81)){}     THEN line;{}          put (anwendungstext (82)); inchar (hinderniszeichen); line (2);{}          hinderniszeichen CAT hinderniszeichen;{}          IF hinderniszeichen = "##"{}             THEN hinderniszeichen := "\#\#"{}          FI{}  FI;{}  line;{}  put (anwendungstext (83)){}END PROC druckereinstellung fuer flaechenausdruck;{}
PROC hamster druckerstart einstellen (REAL CONST xpos, ypos):{}  xstart := xpos; ystart := ypos{}END PROC hamster druckerstart einstellen;{}REAL PROC hamster drucker xstart:{}  xstart{}END PROC hamster drucker xstart;{}REAL PROC hamster drucker ystart:{}  ystart{}END PROC hamster drucker ystart;{}PROC hamster landschaftsschrifttyp einstellen (TEXT CONST typ):{}  schrifttyp := typ{}END PROC hamster landschaftsschrifttyp einstellen;{}TEXT PROC hamster landschaftsschrifttyp:{}  schrifttyp{}END PROC hamster landschaftsschrifttyp;{}
PROC drucke arbeitsfeld (TEXT CONST arbeitsfeldname):{}  drucke landschaft (arbeitsfeldname){}END PROC drucke arbeitsfeld;{}PROC drucke arbeitsfeld:{}  drucke landschaft{}END PROC drucke arbeitsfeld;{}TEXT PROC taste:{}  eingabezeichen{}END PROC taste;{}TEXT PROC landschaftsauskunftstext:{}  initialize hamstersystem;{}  IF ist hamster{}     THEN anwendungstext (52){}     ELSE anwendungstext (53){}  FI{}END PROC landschaftsauskunftstext;{}TEXT PROC laufauskunftstext:{}  initialize hamstersystem;{}
  anwendungstext (51){}END PROC  laufauskunftstext;{}TEXT PROC befehlsauskunftstext:{}  initialize hamstersystem;{}  IF ist hamster{}     THEN anwendungstext (54){}     ELSE anwendungstext (55){}  FI{}END PROC befehlsauskunftstext;{}TEXT PROC testauskunftstext 1:{}  initialize hamstersystem;{}  IF befehlssatz erweitert{}     THEN langer testauskunftstext{}     ELSE kurzer testauskunftstext{}  FI.{}  kurzer testauskunftstext:{}    IF ist hamster{}       THEN anwendungstext (56){}       ELSE anwendungstext (57){}
    FI.{}  langer testauskunftstext:{}    IF ist hamster{}       THEN anwendungstext (58){}       ELSE anwendungstext (60){}    FI.{}END PROC testauskunftstext 1;{}TEXT PROC testauskunftstext 2:{}  initialize hamstersystem;{}  IF befehlssatz erweitert{}     THEN eintragung{}     ELSE niltext{}  FI.{}  eintragung:{}    IF ist hamster{}       THEN anwendungstext (59){}       ELSE anwendungstext (61){}    FI{}END PROC testauskunftstext 2;{}PROC befehlssatz erweitern (BOOL CONST status):{}  befehlssatz erweitert := status{}
END PROC befehlssatz erweitern;{}BOOL PROC befehlssatz ist erweitert:{}  befehlssatz erweitert{}END PROC befehlssatz ist erweitert;{}END PACKET ls herbert und robbi 1;{}