summaryrefslogtreecommitdiff
path: root/app/misc-games/unknown/src/LINDWURM.ELA
blob: daf38cc8a54370861427d66ece97311c2dd6e8f9 (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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
PACKET lind wurm DEFINES lindwurm:
deklaration; 
LET max = 500,zeilen = 23,spalten = 77;
 
PROC kriech :
  speicher := stelle;
  REP
   putline(""1"Punkte:"+text(punkte + bonus) + ""6""0""30"Zeit:" + zeit);
   IF punkte <> 0 
      THEN ende INCR 1;
           IF ende > max THEN ende := 1 FI;
           laenge := laenge + 1 - zaehler;
           IF laenge > max THEN laenge := 1 FI;
           wurm(ende) := speicher;
           IF zaehler = 0 AND wurm(laenge) >= basis AND wurm(laenge) < (basis+(spalten*zeilen)) 
              THEN poke(wurm(laenge),leerzeichen) 
           FI;
           IF speicher >= basis AND speicher < (basis+(spalten*zeilen)) THEN 
              poke(speicher,char1)
           FI
      ELSE IF speicher >= basis AND speicher < (basis+(spalten*zeilen)) 
              THEN poke (speicher,leerzeichen)
           FI;
   FI;
   zaehler := 0;
   speicher INCR richtung;
   IF peek(speicher) <> leerzeichen THEN nahrung oder gift FI; 
   IF speicher >= basis AND speicher < (basis+(spalten*zeilen)) THEN poke(speicher,char2) FI;
   tastaturabfrage;
   IF punkte > begrenzung THEN x := int(zeit); index := 1 FI;
   IF zeit > stopzeit THEN index := 2 FI;
  UNTIL index <> 0 PER
ENDPROC kriech;

PROC nahrung oder gift :
     IF peek(speicher) <> char 3 THEN index := 3 
       ELSE punkte INCR 10; zaehler := 1
     FI;
ENDPROC nahrung oder gift;

PROC tastaturabfrage :
    taste := incharety(9 DIV geschwindigkeit);
    feuer := taste = ""13"";
    IF feuer THEN richtung := 0
    ELIF taste = ""10"" THEN richtung INCR spalten
    ELIF taste = ""8""  THEN richtung DECR 1 
    ELIF taste = ""2""  THEN richtung INCR 1
    ELIF taste = ""3""  THEN richtung DECR spalten
    FI
ENDPROC tastatur abfrage;

PROC bonus erreicht :
     x := (int(stopzeit)-x) * schwierigkeit;
     cspalte := 10;
     czeile  := 10;
     cursorpositionieren;
     putline("B O N U S ! ! !");
     line;
     putline(""15"          "+text(x)+" Punkte !!!"14"");
     bonus := bonus + punkte + x;
ENDPROC bonus erreicht;

PROC poke (INT CONST stelle,wert) :
     INT VAR x pos := 1 + ((stelle - basis) MOD spalten),
             y pos := 1 + ((stelle - basis) DIV spalten); 
     cursor(x pos,y pos);
     IF wert = 126 THEN out(""15""8""14"") ELSE
        out(code(wert));
     FI;
     bildschirm (x pos)(y pos) := wert;
ENDPROC poke;

INT PROC peek (INT CONST stelle) :
    INT VAR x pos := 1 + ((stelle - basis) MOD spalten),
            y pos := 1 + ((stelle - basis) DIV spalten);
    bildschirm (x pos)(y pos)
ENDPROC peek;

PROC cursorpositionieren :
     bildschirm zeile := basis + spalten*czeile;
     cursor(cspalte+1,czeile+1);
ENDPROC cursor positionieren;

PROC highscore und platznummer :
     punkte := punkte + bonus;
     bonus := 0;
     IF punkte > highscore THEN highscore := punkte FI;
     player counter INCR 1;
     q := player counter + 1;
     spieler punkte(playercounter) := punkte;
     FOR i FROM 1 UPTO playercounter REP
         IF punkte > spielerpunkte (i) THEN q DECR 1 FI;
     PER;
     c spalte :=10;
     czeile := 10;
     cursorpositionieren;
     putline("Hoechstpunktzahl "+text(highscore));line;
     putline("           Punkte :"+text(punkte));
     putline("           Platznr.:"+text(q-1));
     IF q-1 >= 10 THEN inchar(hilf)
        ELSE put("Name des Gewinners:");
        getline(hilf);
        disablestop;
        FOR i FROM playercounter DOWNTO q REP
            spielername(i+1) := spielername(i);
            IF iserror THEN clearerror; spielername(i+1) := "" FI;
        PER;
        enablestop;
        spielername(q-1) := "(" +text(punkte) + " Punkte: " + hilf+")";
     FI;
     page;
     putline("Die ersten 10 Gewinner :");
     disablestop;
     FOR i FROM 1 UPTO min(playercounter,10) REP
         putline(text(i)+"."+spielername(i));
         IF iserror THEN clearerror;spielername(i) := "" FI
     PER;
     enablestop;
     putline("Druecken Sie eine Taste");
     inchar(hilf);
ENDPROC highscore und platznummer;

PROC explosion :
   out(""7"");
   FOR i FROM ende DOWNTO laenge +1REP
       IF wurm (i) >= basis AND wurm(i) < (basis+spalten*zeilen) THEN poke(wurm(i),leerzeichen);
       FI;
   PER;
   highscore und platznummer
ENDPROC explosion;

PROC lindwurm :
   bonus := 0;

   REP
    clearscreen;
    out(""14""1""4"");
    IF bonus = 0 THEN neues spiel FI;
    IF bonus > 0 THEN bonusspiel FI;
    page;
    rahmen;
    lebensraum generieren;
    lindwurm kopf setzen;
    reset time;
    kriech;
    SELECT index OF 
       CASE 1 : bonus erreicht
       CASE 2 : highscore und platznummer
       CASE 3 : explosion
    ENDSELECT
  UNTIL bonus<= 0 COR no(""1""4""10""10"Noch ein Spiel") PER

ENDPROC lindwurm;

PROC neues spiel :
     basis := 0;
     stelle := basis + spalten*zeilen DIV 2;
     schwierigkeit := 4;
     geschwindigkeit :=9;
     char 1:= 126;
     char 2:= 79;
     char 3:= 42;
     char 4:= 124;
     leerzeichen := 32;
     index := 0;
     ende := 0;
     laenge := 0;
     richtung := 0;
     zaehler := 0;
     bonus := 0;
     punkte := 0;
     stopzeit :="3:00";
     vorwahl;
     begrenzung := 120 * schwierigkeit;
ENDPROC neues spiel;

PROC liste aller spieler :
     page;
     FOR i FROM 1 UPTO playercounter REP
        putline(text(i)+"."+spielername(i));
        IF i > 24 THEN pause(20) FI;
     PER;
     putline("ENDE");
     inchar(hilf);
     page;
ENDPROC liste aller spieler;


PROC vorwahl :
     spielregeln;
     page;
     REP
       out(""1"");
       putline(""142"                                    Lindwurm                               "143"");
       czeile :=12;
       cspalte:=3;
       cursorpositionieren;
       putline("Schwierigkeitsgrad (1/2) "+ text(schwierigkeit,3));
       czeile :=14;
       cspalte:=3;
       cursorpositionieren;
       putline("Geschwindigkeit    (3/4) "+ text(geschwindigkeit,3));
       czeile :=16;
       cspalte:=3;
       cursorpositionieren;
       putline("Liste aller Spieler (5)  ");
       czeile :=18;
       cspalte:=3;
       cursorpositionieren;
       putline("Start mit RETURN");
       x := 0;
       inchar(hilf);
       IF hilf = ""13""THEN LEAVE vorwahl
       ELIF hilf = "1" THEN schwierigkeit INCR 1
       ELIF hilf = "2" THEN schwierigkeit DECR 1
       ELIF hilf = "3" THEN geschwindigkeit INCR 1
       ELIF hilf = "4" THEN geschwindigkeit DECR 1
       ELIF hilf = "5" THEN liste aller spieler 
       ELSE out(""7"") 
       FI;
       IF schwierigkeit > 26 THEN schwierigkeit := 1 
       ELIF schwierigkeit < 1 THEN schwierigkeit := 26 FI; 
       IF geschwindigkeit > 9 THEN geschwindigkeit := 1 
       ELIF geschwindigkeit < 1 THEN geschwindigkeit := 9 FI; 
     PER

ENDPROC vorwahl;

PROC spielregeln :
     putline(code(char1)+" = Rahmen (Mauer)");
     line;
     putline(code(char2)+" = Lindwurmkopf");
     line;
     putline(code(char3)+" = Nahrung");
     line;
     putline(""15""8""14" = Lindwurm"); 
     line;
     putline(". = Gift");
     line;
     putline ("Ziel des Spiels ist es, den Wurm mit Nahrung zu versorgen. Gift ist tödlich.");
     line;
     putline ("Der Wurm kann mit den Pfeiltasten gesteuert werden. Wird eine Taste mehrmals");
     line;
     putline ("gedrückt, wird der Wurm schneller. Vorsicht: Der Wurm darf nicht auf eine");
     line;
     putline ("Mauer treffen. Mit jedem gefressenen Nahrungsteilchen wird der Wurm etwas");
     line;
     putline ("länger. Du hast 3 Minuten Zeit, den Wurm zu füttern.");
     line;
     putline ("Viel Erfolg. Bitte drücke jetzt eine Taste.");
     pause(6000);
ENDPROC spielregeln;

PROC bonusspiel :
    stelle := basis+zeilen*spaltenDIV2;
    index := 0;
    punkte := 0;
    richtung := 0;
    zaehler := 0;
    ende := 0;
    laenge := 0;
    schwierigkeit INCR 1;
    IF schwierigkeit > 26 THEN schwierigkeit := 26 FI;
    begrenzung := 120 * schwierigkeit 

ENDPROC bonusspiel;

PROC lebensraum generieren :
    FOR i FROM 1 UPTO 16 * schwierigkeit REP
        REP
           x := int(random * real((zeilen-2)*spalten) + real(spalten));
        UNTIL peek(basis+x) = leerzeichen PER;
        poke(basis+x,char3)
    PER;
    FOR i FROM 1 UPTO schwierigkeit REP
        REP
           x := int(random * real((zeilen-2)*spalten) + real(spalten));
        UNTIL peek(basis+x) = leerzeichen PER;
        poke(basis+x,46)
    PER;
ENDPROC lebensraum generieren;

PROC lindwurmkopf setzen :
    WHILE peek(stelle) <> leerzeichen REP stelle INCR 1 PER;
    poke(stelle,char2);
    out(""7"");

ENDPROC lindwurmkopf setzen;

PROC rahmen :
   FOR i FROM basis UPTO basis + spalten-1 REP
       poke(i,char4);
       poke(i+(zeilen-1)*spalten,char4);
   PER;
   i := basis + spalten;
   REP poke(i ,char4); 
       poke(i+spalten-1,char4);
       i INCR spalten
   UNTIL i >( basis + (zeilen-1)*spalten )PER

ENDPROC rahmen;

PROC clearscreen :
   INT VAR x,y;
       putline ("Nun markiert der Wurm sein Revier.");
       line ;
       put("Es ist");put(spalten);put("qm gross.");line;
       FOR x FROM 1 UPTO spalten REP
           cout(x);
           FOR y FROM 1 UPTO zeilen REP
               bildschirm(x)(y) := leerzeichen
           PER
       PER
ENDPROC clearscreen;

TEXT PROC zeit :
     subtext(time(clock(1)-uhr),5,8)
ENDPROC zeit;

PROC reset time :
     uhr := clock(1)
ENDPROC reset time;.

deklaration :
   ROW spalten ROW zeilen INT VAR bildschirm;
   ROW 300 INT VAR spielerpunkte;
   ROW 300 TEXT VAR spielername;
   ROW max INT VAR wurm;
   TEXT VAR hilf,taste,stopzeit;
   INT VAR basis:=0,playercounter:=0,highscore:=0,q:=0,i:=0,x:=0,y:=0,stelle:=1000,richtung,
           punkte:=0,bonus:=0,index:=0,cspalte,czeile,bildschirmzeile,zaehler:=0,ende:=0,
           laenge:=0,speicher:=1,leerzeichen:=32,begrenzung:=480,schwierigkeit:=4,
           geschwindigkeit:=9,c:=90,char1:=90,char2:=90,char3:=90,char4:=90;

   REAL VAR uhr;
   BOOL VAR feuer;
ENDPACKET lindwurm