summaryrefslogtreecommitdiff
path: root/hamster/ls-Herbert und Robbi 1
diff options
context:
space:
mode:
Diffstat (limited to 'hamster/ls-Herbert und Robbi 1')
-rw-r--r--hamster/ls-Herbert und Robbi 1984
1 files changed, 0 insertions, 984 deletions
diff --git a/hamster/ls-Herbert und Robbi 1 b/hamster/ls-Herbert und Robbi 1
deleted file mode 100644
index 9b3ff72..0000000
--- a/hamster/ls-Herbert und Robbi 1
+++ /dev/null
@@ -1,984 +0,0 @@
-(*
-
- *********************************************************
- *********************************************************
- ** **
- ** 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;
-
-