-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathzx81.bas
345 lines (345 loc) · 5.49 KB
/
zx81.bas
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
338
339
340
341
342
343
344
345
_1:
' RANDOMIZATION ROUTINE
PRINT "PRESS ENTER:"
INPUT A$
RAND 0
' VARIABLES
LET Z=0
LET Y=1
LET A=Z
LET T=Z
LET V=13
LET C=44
LET D=Z
LET E=Z
LET R=Z
LET X=2
LET I=Z
LET J=Z
DIM A(45)
LET G=100
LET H=4
LET K=512
LET L=32
LET U=16
LET N=255
LET O=99
LET F=65535
LET Q=6
LET S=3841
LET B=4096
LET M=39
LET P=Y
LET W=Z
GOTO _2520
_315:
CLS
PRINT "WELCOME TO THE BATTLE SYSTEM TEST."
PRINT
PRINT
_350:
PRINT "TWO SOLDIERS APPROACH."
PRINT
PRINT "PRESS A KEY TO CONTINUE."
SLOW
LET A$=INKEY$
IF A$="" THEN GOTO _870
FAST
_370:
' MAIN LOOP
IF A((V*A)+Y)=Z THEN GOTO _420
PRINT "PRESS A KEY TO CONTINUE."
SLOW
_383:
LET A$=INKEY$
IF A$="" THEN GOTO _383
FAST
CLS
IF A=Z THEN GOTO _780
LET T=Z
GOTO _1190
_420:
' ITERATE ATTACKER
IF A(Y)=Z THEN GOTO _2410
LET A=A+Y
IF A<>Z THEN LET T=Z
IF A((V*A)+Y)=Z THEN LET A=A+Y
IF A>X THEN LET A=Z
LET D=Z
IF A((V*Y)+Y)=Z THEN LET D=D+Y
IF A((V*X)+Y)=Z THEN LET D=D+Y
IF D=X THEN GOTO _530
GOTO _370
_530:
' NEW GAME
PRINT "YOU ARE VICTORIOUS."
PRINT
LET W=W+Y
LET A=Z
LET T=Z
IF W>=10 THEN GOSUB _690
FOR I=Y TO X
LET A((I*V)+Y)=A((I*V+Y)+Y)
NEXT I
GOSUB _2090
IF R<12.5 THEN PRINT "YOU OBTAINED A POTION."
IF R<12.5 THEN PRINT
IF R<12.5 THEN LET P=P+Y
IF P>O THEN LET P=O
GOTO _350
_690:
' INCREASE DIFFICULTY
GOSUB _2090
IF R>=25 THEN RETURN
FOR I=V TO M-Y
LET A(I+Y)=A(I+Y)*1.5
NEXT I
PRINT "THE ENEMIES HAVE POWERED UP."
PRINT
RETURN
_780:
' MENU LOOP
PRINT
CLS
PRINT A(Y);"/";A(X);" HP"
PRINT A(3);"/";A(H);" MP"
PRINT
PRINT "(A) ATTACK"
PRINT "(M) MAGIC"
PRINT "(I) ITEMS"
PRINT "(Q) QUIT"
SLOW
_870:
LET A$=INKEY$
IF A$="" THEN GOTO _870
FAST
IF A$="A" OR A$="A" THEN GOTO _930
IF A$="M" OR A$="M" THEN GOTO _990
IF A$="I" OR A$="I" THEN GOTO _1100
IF A$="Q" OR A$="Q" THEN GOTO _2480
GOTO _780
_930:
' ATTACK INPUT ROUTINE
GOSUB _2120
IF C=Z THEN GOTO _780
IF C>X THEN GOTO _930
IF C<Z THEN GOTO _930
GOTO _1190
_990:
' MAGIC INPUT ROUTINE
PRINT
PRINT "(1) LIGHTNING - ";A(M+Y);" MP"
PRINT "(2) CURE - ";A(M+H);" MP"
PRINT "WHICH SPELL DO YOU WANT TO CAST?"
PRINT "TYPE (0) TO GO BACK."
SLOW
_1050:
LET A$=INKEY$
IF A$="" THEN GOTO _1050
LET C=VAL A$
FAST
CLS
IF C=Y THEN GOTO _1630
IF C=X THEN GOTO _1850
IF C=Z THEN GOTO _780
GOTO _990
_1100:
' ITEM ROUTINE
PRINT
PRINT "(1) POTION - ";P
PRINT "WHICH ITEM DO YOU WISH TO USE?"
PRINT "TYPE (0) TO GO BACK."
SLOW
_1150:
LET A$=INKEY$
IF A$="" THEN GOTO _1150
LET C=VAL A$
FAST
CLS
IF C=Y THEN GOTO _1980
IF C=Z THEN GOTO _780
GOTO _1100
_1190:
' ATTACK ROUTINE
LET C=((A((A*V+10)+Y)/H)+(A((A*V+5)+Y)))+A((A*V+7)+Y)-A((T*V+7)+Y)
GOSUB _2090
LET I=A((A*V+11)+Y)
GOSUB _2270
IF D>R THEN LET C=N
LET I=A((T*V+11)+Y)
GOSUB _2270
IF D>R THEN LET C=N
IF R<C THEN GOTO _1330
IF T>Z THEN PRINT "YOUR ATTACK MISSED."
IF T=Z THEN PRINT "SOLDIER ";A;" MISSED YOU."
PRINT
GOTO _420
_1330:
' PHYSICAL DAMAGE ROUTINE
LET D=A((A*V+H)+Y)
LET E=A((A*V+12)+Y)
LET C=D+((D+E)/L)*((D*E)/L)
LET D=((U*(K-A((T*V+Q)+Y)))*C)/(U*K)
LET C=(A((A*V+11)+Y)+A((A*V+12)+Y)-A((T*V+12)+Y))/H
GOSUB _2300
IF R<=C THEN GOTO _1420
GOTO _1440
_1420:
' CRITICAL HIT DAMAGE
LET TE=D*X
LET D=INT TE
_1440:
' RANDOM DAMAGE VARIATION
LET TE=D*(S+(RND*N))/B
LET D=INT TE
IF D=Z THEN LET D=Y
LET A((T*V)+Y)=A((T*V)+Y)-D
IF A((T*V)+Y)<=Z THEN LET A((T*V)+Y)=Z
IF A<>Z THEN GOTO _1560
PRINT "YOU HIT SOLDIER ";T;" FOR ";D;" HP."
PRINT
IF A((T*V)+Y)<>Z THEN GOTO _1550
PRINT "YOU DEFEATED SOLDIER ";T
PRINT
_1550:
GOTO _420
_1560:
IF D>Z THEN GOSUB _2330
PRINT "SOLDIER ";A;" HIT YOU FOR ";D;" HP."
PRINT
IF A(Y)<>Z THEN GOTO _1620
PRINT "YOU DIED."
PRINT
_1620:
GOTO _420
_1630:
' LIGHTNING ROUTINE
LET E=Z
LET D=Z
IF A(M+Y)>A(3) THEN GOTO _1810
LET A(3)=A(3)-A(M+Y)
GOSUB _2120
IF C=Z THEN GOTO _990
IF C>X THEN GOTO _1630
IF C<Z THEN GOTO _1630
LET C=A(M+3)+A((A*V+12)+Y)-((A((T*V+12)+Y))/X)-Y
GOSUB _2090
IF R<C THEN GOSUB _2380
IF R>C THEN GOTO _1770
LET D=(A(M+X)*(K-A((T*V+9)+Y))*C)/(U*K)
_1770:
IF D>Z THEN GOTO _1440
PRINT "YOUR SPELL MISSED."
PRINT
GOTO _420
_1810:
' NOT ENOUGH MP ROUTINE
PRINT
PRINT "YOU DON,T HAVE ENOUGH MP TO CAST THAT SPELL."
GOTO _990
_1850:
' CURE ROUTINE
LET E=3
IF A(M+H)>A(3) THEN GOTO _1810
LET A(3)=A(3)-A(M+H)
GOSUB _2380
LET D=C+22*A(M+Y+E+Y)
LET TE=D*(S+(RND*N))/B
LET D=INT TE
PRINT
PRINT "YOU HAVE BEEN HEALED FOR ";D;" HP."
PRINT
LET A(Y)=A(Y)+D
IF A(Y)>A(X) THEN LET A(Y)=A(X)
GOTO _420
_1980:
' ITEM ROUTINE
IF P=Z THEN PRINT
IF P=Z THEN PRINT "YOU HAVE NO POTIONS."
IF P=Z THEN GOTO _780
LET A(Y)=A(Y)+G
IF A(Y)>A(X) THEN LET A(Y)=A(X)
LET P=P-Y
PRINT
PRINT "YOU HAVE BEEN HEALED FOR 100 HP."
PRINT
GOTO _420
_2090:
' RANDOM 100 ROUTINE
LET TE=RND*G
LET R=INT TE
RETURN
_2120:
' SHARED INPUT ROUTINE
PRINT
FOR I=Y TO X
IF A((V*I)+Y)>Z THEN PRINT "(";I;")";" SOLDIER ";I
NEXT I
PRINT "WHICH ENEMY DO YOU WANT TO TARGET?"
PRINT "(0) TO GO BACK."
SLOW
_2190:
LET A$=INKEY$
IF A$="" THEN GOTO _2190
LET C=VAL A$
FAST
CLS
IF C=Z THEN RETURN
LET E=Z
IF A((V*C)+Y)<=Z THEN LET E=N
IF E=N THEN GOTO _2120
LET T=C
PRINT
RETURN
_2270:
' LUCKY HIT ROUTINE
LET D=I/H
RETURN
_2300:
' RANDOM 65535 ROUTINE
LET R=((RND*F)*O/F)+Y
RETURN
_2330:
' DING ROUTINE
FOR J=Z TO G
NEXT J
' DING.
RETURN
_2380:
' MAGIC DAMAGE ROUTINE
LET C=Q*(A(9)+A(V))
RETURN
_2410:
' GAME OVER ROUTINE
PRINT
PRINT "GAME OVER"
PRINT
FOR I=Z TO Y
GOSUB _2330
NEXT I
_2480:
PRINT
PRINT "YOU WON ";W;" TIMES."
PRINT
STOP
_2520:
LET D$="314,314,54,54,38,96,24,1,21,17,6,14,6,30,30,0,0,6,1,4,1,1,1,50,4,2,30,30,0,0,6,1,4,1,1,1,50,4,2,4,8,100,5,5,255,"
LET C=Z
LET E=Y
LET I=45
_2550:
LET T$=""
_2560:
LET C=C+Y
IF D$(C)="," THEN GOTO _2600
LET T$=T$+D$(C)
GOTO _2560
_2600:
LET A(E)=VAL T$
LET E=E+Y
IF E>I THEN GOTO _315
GOTO _2550
SAVE "BATLTEST"
GOTO _1
#data
#enddata