-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathfallout.txt
508 lines (508 loc) · 29 KB
/
fallout.txt
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
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
1 REM vim: ft=basic
10 CLEAR 3072 : RANDOM
20 ON BREAK GOTO 39999: ' Compiler honors this, interpreter ignores it
100 REM ===== STARTUP SCREEN
110 INTEL% = 4
120 DIFF% = 1
130 CONTROL% = 0
140 INTWARN% = 0
150 CLS
160 PRINT @ 80 + 12, "Welcome to ROBCO Industries(TM) Termlink"
170 PRINT @ 80*3 + 12, "Terminal Hacking Trainer"
180 PRINT @ 80*7 + 33, "SELECT OPTIONS"
190 GOSUB 600
200 PRINT @ 80*17 + 27, "[Enter] or [Space] to begin";
210 PRINT @ 23*80, "";
400 KEYIN$ = INKEY$: IF KEYIN$ = "" THEN 400
410 IF KEYIN$ = CHR$(8) THEN GOSUB 550 ELSE IF KEYIN$ = "h" THEN GOSUB 550
420 IF KEYIN$ = CHR$(9) THEN GOSUB 500 ELSE IF KEYIN$ = "l" THEN GOSUB 500
430 IF KEYIN$ = CHR$(10) THEN CONTROL% = 1 ELSE IF KEYIN$ = "j" THEN CONTROL% = 1
440 IF KEYIN$ = CHR$(11) THEN CONTROL% = 0 ELSE IF KEYIN$ = "k" THEN CONTROL% = 0
450 IF KEYIN$ = CHR$(13) THEN 900 ELSE IF KEYIN$ = " " THEN 900
460 GOSUB 600: GOTO 400
500 REM handle go-right
510 IF CONTROL% = 0 THEN INTEL% = INTEL% + 1: IF INTEL% > 11 THEN INTEL% = 11
520 IF CONTROL% = 1 THEN DIFF% = DIFF% + 1: IF DIFF% > 4 THEN DIFF% = 4
530 IF DIFF% > 1 THEN IF INTEL% < 4 THEN INTEL% = 4: INTWARN% = 1: ' requires int 4 for hacker perks
540 RETURN
550 REM handle go-left
560 IF CONTROL% = 0 THEN INTEL% = INTEL% - 1: IF INTEL% < 1 THEN INTEL% = 1
570 IF CONTROL% = 1 THEN DIFF% = DIFF% - 1: IF DIFF% < 1 THEN DIFF% = 1
580 IF INTEL% < 4 THEN IF DIFF% > 1 THEN DIFF% = 1: INTWARN% = 1: ' requires int 4 for hacker perks
590 RETURN
600 REM Print the "Intelligence" line; highlight control if appropriate
610 PRINT @ 80*11 + 23, "Player Intelligence: "; CHR$(16);"<";CHR$(17);" ";
620 IF CONTROL% = 0 THEN PRINT CHR$(16);
630 IF INTEL% >= 10 THEN PRINT " "; ELSE PRINT " ";
640 PRINT STR$(INTEL%);" ";
650 IF CONTROL% = 0 THEN PRINT CHR$(17);
660 PRINT " ";CHR$(16);">";CHR$(17)
700 REM Print the "Difficulty" line; highlight control if appropriate
710 PRINT @ 80*13 + 23, "Terminal Difficulty: "; CHR$(16);"<";CHR$(17);" ";
720 IF CONTROL% = 1 THEN PRINT CHR$(16);
730 IF DIFF% = 1 THEN PRINT " Novice "; ELSE IF DIFF% = 2 THEN PRINT " Advanced "; ELSE IF DIFF% = 3 THEN PRINT " Expert "; ELSE PRINT " Master ";
740 IF CONTROL% = 1 THEN PRINT CHR$(17);
750 PRINT " ";CHR$(16);">";CHR$(17)
800 REM Print the INT warning if needed
810 IF INTWARN% = 1 THEN PRINT @ 80*15 + 15, "Higher difficulty terminals require at least 4 INT"; ELSE PRINT @ 80 * 15 + 15, STRING$(50, " ");
820 INTWARN% = 0
830 PRINT @ 23*80 + 12, "";
840 RETURN
900 REM ===== Print the top lines of the game UI
910 CLS
920 PRINT @ 80 + 12, "Welcome to ROBCO Industries (TM) Termlink"
930 PRINT @ 240 + 12, "Password Required"
940 PRINT @ 400 + 12, CHR$(16); " "; CHR$(17); CHR$(24);: ' fake cursor for compiled version
1000 REM ===== set up the vars representing the left and right text fields
1005 GUESSES% = 4
1010 GOSUB 60000: ' Populate the word list
1020 WL% = LEN(WORDS$(1))
1030 PWDIDX% = RND(WLL%)
1040 PWD$ = WORDS$(PWDIDX%)
1050 CW% = 0
1060 DIM OUTPUTLINES$(15): ' 15 lines because the bottom one we always do dynamically
1070 DIM PAPOS%(WLL%,WL%): ' (number of words, length)
1080 DIM LW2P%(WLL%, WL%), RW2P%(WLL%, WL%)
1090 DIM LP2W%(12*16), RP2W%(12*16)
1100 HEXADDR! = RND(32767-4096) + RND(32767) + 4096: IF HEXADDR! > 32767 THEN HEXADDR! = HEXADDR! - 65536!
1110 ISNUGGET% = 0
1120 DUD$ = STRING$(WL%, ".")
1130 REM GARBAGECHARS$ contains double of most things to make []{}()<> less likely
1140 GARBAGECHARS$ = "/\%@#$%^*-=+,.:;?_/\%@#$%^*-=+,.:;?_[]{}()<>"
1150 FOR I = 1 TO 50
1160 NEWCHAR$ = MID$(GARBAGECHARS$, RND(LEN(GARBAGECHARS$)), 1)
1170 IF NEWCHAR$ = LASTLCHAR$ THEN 1160 ELSE LASTLCHAR$ = NEWCHAR$
1180 LSIDE$ = LSIDE$ + NEWCHAR$
1190 NEXT
1200 LSIDE$ = LSIDE$ + LSIDE$ + LSIDE$ + LEFT$(LSIDE$, 42)
1210 RSIDE$ = RIGHT$(LSIDE$, 32) + LEFT$(LSIDE$, 160)
1300 REM ===== add nuggets explicitly, just sprinkle some of them in there and let them land where they may.
1310 NUGGSIDE% = 0
1320 FOR I = 13 TO 11*16 STEP 16
1330 I = I + RND(11) - 5: ' randomize locations a little
1340 NUGGIDX% = RND(4)
1350 NEWNUGGET$ = MID$("[{<(",NUGGIDX%,1) + MID$(LSIDE$, RND(LEN(LSIDE$)), RND(5)-1) + MID$("]}>)",NUGGIDX%,1)
1360 IF NUGGSIDE% = 0 THEN MID$(LSIDE$, I, LEN(NEWNUGGET$)) = NEWNUGGET$ ELSE MID$(RSIDE$, I, LEN(NEWNUGGET$)) = NEWNUGGET$
1370 NUGGSIDE% = 1 - NUGGSIDE%
1380 NEXT I
1500 REM ===== sprinkle the words into the text fields
1510 DIM LEFTP%(WLL%), RIGHTP%(WLL%)
1530 FOR I = 1 TO WLL%
1550 TESTPOS% = RND(12*16 - WLL%)
1560 ON RND(2) GOTO 1570,1700: ' randomly pick right or left side
1570 REM Left side
1580 IF LP2W%(TESTPOS%) > 0 THEN 1550: ' overlaps or abuts another word on the left
1590 IF TESTPOS% > 1 THEN IF LP2W%(TESTPOS%-1) > 0 THEN 1550: ' too close to another word on the left
1600 IF LP2W%(TESTPOS%+WL%) > 0 THEN 1550: ' overlaps or abuts another word on the right
1610 IF TESTPOS% < WL% THEN IF LP2W%(TESTPOS%+WL%+1) > 0 THEN 1550: ' too close to another word on the right
1620 LEFTP%(I) = TESTPOS%
1630 FOR J = 1 TO WL%
1640 LP2W%(LEFTP%(I)+J-1) = I
1650 LW2P%(I, J) = LEFTP%(I)+J-1
1660 MID$(LSIDE$, LEFTP%(I)+J-1) = MID$(WORDS$(I),J,1): ' do this in here because enhcomp demands it
1670 NEXT J
1680 GOSUB 41000
1690 GOTO 1820
1700 REM Right side
1710 IF RP2W%(TESTPOS%) > 0 THEN 1550: ' too close to another word on the left
1720 IF TESTPOS% > 1 THEN IF RP2W%(TESTPOS%-1) > 0 THEN 1550: ' too close to another word on the left
1730 IF RP2W%(TESTPOS%+WL%) > 0 THEN 1550: ' too close to another word on the right
1740 IF TESTPOS% < WL% THEN IF RP2W%(TESTPOS%+WL%+1) > 0 THEN 1550: ' too close to another word on the right
1750 RIGHTP%(I) = TESTPOS%
1760 FOR J = 1 TO WL%
1770 RP2W%(RIGHTP%(I)+J-1) = I
1780 RW2P%(I, J) = RIGHTP%(I)+J-1
1790 MID$(RSIDE$, RIGHTP%(I)+J-1) = MID$(WORDS$(I),J,1): ' do this in here because enhcomp demands it
1800 NEXT J
1810 GOSUB 42000
1820 NEXT I
10000 REM ===== print the text fields at the right place
10005 PRINT @ 400 + 12, " ";: ' clear the fake cursor
10020 FOR I = 0 TO 15
10030 PALOC% = (I+7) * 80 + 12
10040 PRINT @ PALOC%, "0x" ; HEX$(HEXADDR!) ; " " ; MID$(LSIDE$, I*12 + 1, 12) ; " 0x" ; HEX$(HEXADDR! + (12*16)) ; " " ; MID$(RSIDE$, I*12 + 1, 12);
10050 HEXADDR! = HEXADDR! + 12
10060 NEXT I
10070 GOSUB 47000: ' reprint "attempts remaining" line
10080 GOSUB 49040: ' print the prompt
20000 REM ===== Set up the initial cursor location
20010 CURX% = 1: CURY% = 1: CURSIDE% = 0: ' CURSIDE% 0 = LEFT, 1 = RIGHT
20020 GOSUB 40000
21000 REM ===== Do the input loop and dispatch appropriately
21010 KEYIN$ = INKEY$: IF KEYIN$ = "" THEN 21010
21020 IF KEYIN$ = CHR$(8) THEN GOSUB 40700 ELSE IF KEYIN$ = "h" THEN GOSUB 40700
21030 IF KEYIN$ = CHR$(9) THEN GOSUB 40800 ELSE IF KEYIN$ = "l" THEN GOSUB 40800
21040 IF KEYIN$ = CHR$(10) THEN GOSUB 40500 ELSE IF KEYIN$ = "j" THEN GOSUB 40500
21050 IF KEYIN$ = CHR$(11) THEN GOSUB 40600 ELSE IF KEYIN$ = "k" THEN GOSUB 40600
21060 IF KEYIN$ = CHR$(13) THEN IF CW% = -1 THEN GOSUB 51500 ELSE IF ISNUGGET% = 1 THEN GOSUB 51000 ELSE IF CW% > 0 THEN GOSUB 50000 ELSE GOSUB 51500
21070 IF KEYIN$ = " " THEN IF CW% = -1 THEN GOSUB 51500 ELSE IF ISNUGGET% = 1 THEN GOSUB 51000 ELSE IF CW% > 0 THEN GOSUB 50000 ELSE GOSUB 51500
21999 GOTO 21010
39999 CLS: PRINT "Terminal hacking training ended. Thank you for using ROBCO.": END
40000 REM ===== sub to DTRT with the current cursor location
40003 REM print / unhighlight our current thingie before we change around where CURPA points
40005 IF ISNUGGET% = 1 THEN PRINT @ CURPA%, GUESS$;: ISNUGGET% = 0 ELSE PRINT @ CURPA%, CURCHAR$;
40007 IF CW% > 0 THEN GOSUB 44000: CW% = 0
40010 CURPOS% = (CURY%-1) * 12 + CURX%
40020 IF CURSIDE% = 0 THEN CURPA% = (CURY%+6)*80 + 6 + CURX% + 12 ELSE CURPA% = (CURY%+6)*80 + 26 + CURX% + 12
40030 IF CURSIDE% = 0 THEN CURCHAR$ = MID$(LSIDE$, CURPOS%, 1) ELSE CURCHAR$ = MID$(RSIDE$, CURPOS%, 1)
40040 IF CURSIDE% = 0 THEN CW% = LP2W%(CURPOS%) ELSE CW% = RP2W%(CURPOS%)
40060 IF CW% > 0 THEN IF WORDS$(CW%) <> DUD$ THEN GOSUB 44000: GOSUB 43000 ELSE GOSUB 45000
40080 IF CW% <> -1 THEN IF CURCHAR$ = "{" THEN ENDCHAR$ = "}": GOSUB 46000: RETURN
40090 IF CW% <> -1 THEN IF CURCHAR$ = "[" THEN ENDCHAR$ = "]": GOSUB 46000: RETURN
40100 IF CW% <> -1 THEN IF CURCHAR$ = "<" THEN ENDCHAR$ = ">": GOSUB 46000: RETURN
40110 IF CW% <> -1 THEN IF CURCHAR$ = "(" THEN ENDCHAR$ = ")": GOSUB 46000: RETURN
40120 IF ASC(CURCHAR$) < 65 THEN GOSUB 45000: RETURN ELSE IF ASC(CURCHAR$) > 90 THEN GOSUB 45000: RETURN
40130 RETURN
40200 REM ===== SET CURY and CURX from CURPOS - this is for exiting a word to the right or left
40210 CURY% = INT(CURPOS% / 12) + 1
40220 CURX% = CURPOS% - ((CURY%-1) * 12)
40230 IF CURX% = 0 THEN CURX% = 12: CURY% = CURY% - 1
40240 RETURN
40500 REM ===== handle "cursor down"
40510 IF CURY% < 16 THEN CURY% = CURY% + 1
40520 GOSUB 40000
40530 RETURN
40600 REM ===== handle "cursor up"
40610 IF CURY% > 1 THEN CURY% = CURY% - 1
40620 GOSUB 40000
40630 RETURN
40700 REM ===== handle "cursor left"
40710 IF CW% > 0 THEN GOSUB 40900 ELSE 40720: ' check for split word
40715 IF ISSPLIT% = 0 THEN IF CURSIDE% = 0 THEN CURPOS% = LW2P%(CW%, 1): GOSUB 40200: GOTO 40720 ELSE CURPOS% = RW2P%(CW%, 1): GOSUB 40200: GOTO 40720
40716 REM ELSE ISSPLIT = 1 therefore
40717 IF WORDHALF% = 0 THEN MIDPOS% = 1 ELSE MIDPOS% = SPLITCHAR%+1
40718 IF CURSIDE% = 0 THEN CURPOS% = LW2P%(CW%, MIDPOS%): GOSUB 40200 ELSE CURPOS% = RW2P%(CW%, MIDPOS%): GOSUB 40200
40720 IF CURX% > 1 THEN CURX% = CURX% - 1 ELSE IF CURSIDE% = 1 THEN CURSIDE% = 0: CURX% = 12
40730 GOSUB 40000
40740 RETURN
40800 REM ===== handle "cursor right"
40810 IF CW% > 0 THEN GOSUB 40900 ELSE 40820: ' check for split word
40815 IF ISSPLIT% = 0 THEN IF CURSIDE% = 0 THEN CURPOS% = LW2P%(CW%, WL%): GOSUB 40200: GOTO 40820 ELSE CURPOS% = RW2P%(CW%, WL%): GOSUB 40200: GOTO 40820
40816 REM ELSE ISSPLIT = 1 therefore
40817 IF WORDHALF% = 0 THEN MIDPOS% = SPLITCHAR% ELSE MIDPOS% = WL%
40818 IF CURSIDE% = 0 THEN CURPOS% = LW2P%(CW%, MIDPOS%): GOSUB 40200 ELSE CURPOS% = RW2P%(CW%, MIDPOS%): GOSUB 40200
40820 IF CURX% < 12 THEN CURX% = CURX% + 1 ELSE IF CURSIDE% = 0 THEN CURSIDE% = 1: CURX% = 1
40830 GOSUB 40000
40840 RETURN
40900 REM ===== check for split word and set up ISSPLIT%, WORDHALF%, and SPLITCHAR%
40905 ISSPLIT% = 0: SPLITCHAR% = 0: WORDHALF% = 0
40907 REM TODO when we get rid of PAPOS, the algoritm here should be "if endchar mod 12 < startchar mod 12"
40910 IF PAPOS%(CW%,WL%) - PAPOS%(CW%, 1) > WL% THEN ISSPLIT% = 1 ELSE RETURN
40920 FOR J = 1 TO WL%
40930 IF CURSIDE% = 0 THEN IF SPLITCHAR% > 0 THEN IF CURPOS% = LW2P%(CW%, J) THEN WORDHALF% = 1
40940 IF CURSIDE% = 1 THEN IF SPLITCHAR% > 0 THEN IF CURPOS% = RW2P%(CW%, J) THEN WORDHALF% = 1
40950 IF J < WL% THEN IF PAPOS%(CW%, J+1) - PAPOS%(CW%,J) > 1 THEN SPLITCHAR% = J
40960 NEXT J
40970 RETURN
41000 REM ===== fill a two-dimensional array with lists of "print @" locations for LSIDE
41010 RAWPOS% = LEFTP%(I)
41020 CURROW% = INT(RAWPOS% / 12) + 7
41030 CURCOL% = (RAWPOS% - INT(RAWPOS% / 12) * 12)
41035 IF CURCOL% = 0 THEN CURCOL% = 12: CURROW% = CURROW% - 1
41040 FOR J = 1 TO WL%
41050 PAPOS%(I, J) = (CURROW% * 80) + 6 + CURCOL% + 12
41060 CURCOL% = CURCOL% + 1
41070 IF CURCOL% > 12 THEN CURCOL% = 1: CURROW% = CURROW% + 1
41080 NEXT J
41090 RETURN
42000 REM ===== fill a two-dimensional array with lists of "print @" locations for RSIDE
42010 RAWPOS% = RIGHTP%(I)
42020 CURROW% = INT(RAWPOS% / 12) + 7
42030 CURCOL% = (RAWPOS% - INT(RAWPOS% / 12) * 12)
42035 IF CURCOL% = 0 THEN CURCOL% = 12: CURROW% = CURROW% - 1
42040 FOR J = 1 TO WL%
42050 PAPOS%(I, J) = (CURROW% * 80) + 26 + CURCOL% + 12
42060 CURCOL% = CURCOL% + 1
42070 IF CURCOL% > 12 THEN CURCOL% = 1: CURROW% = CURROW% + 1
42080 NEXT J
42090 RETURN
43000 REM ===== highlight the word pointed to by CW% and put it lower-right
43010 PALOC% = (22 * 80) + 42 + 12
43020 PRINT @ PALOC%, " ";: ' clear the prompt area
43030 FOR J = 1 TO WL%
43040 PRINT @ PAPOS%(CW%, J), CHR$(16) + MID$(WORDS$(CW%), J, 1) + CHR$(17);
43050 PRINT @ PALOC%, MID$(WORDS$(CW%), J, 1);
43060 PALOC% = PALOC% + 1
43070 NEXT J
43080 PRINT @ PALOC%, CHR$(16); " "; CHR$(17); CHR$(24);: ' fake cursor for compiled version
43090 RETURN
44000 REM ===== UN-highlight the word pointed to by CW%
44005 IF CW% <= 0 THEN RETURN
44010 FOR J = 1 TO WL%
44020 PRINT @ PAPOS%(CW%, J), MID$(WORDS$(CW%), J, 1);
44030 NEXT J
44040 RETURN
45000 REM ===== Highlight a single character and clear any selected word
45010 PRINT @ CURPA%, CHR$(16); CURCHAR$; CHR$(17); CHR$(24);
45020 GUESS$ = CURCHAR$
45030 GOSUB 44000
45040 IF CW% > 0 THEN CW% = 0
45050 GOSUB 49040
45060 RETURN
46000 REM ===== Detect nuggets, make sure they're not already used, highlight them
46005 GOSUB 44000: ' unhighlight the last word we were on
46010 IF CURSIDE% = 0 THEN TESTWORD% = LP2W%(CURPOS%) ELSE TESTWORD% = RP2W%(CURPOS%)
46020 IF TESTWORD% = -1 THEN GOSUB 45000: RETURN: ' We have used this nugget already
46025 IF (CURPOS% - (INT(CURPOS% / 12) * 12)) = 0 THEN GOSUB 45000: RETURN:' started at EOL, bail out
46030 INCRX% = 1: TESTNUGG$ = CURCHAR$
46040 NPOS% = CURPOS% + INCRX%
46050 IF (NPOS% - (INT(NPOS% / 12) * 12)) = 1 THEN GOSUB 45000: RETURN:' hit EOL, bail out
46060 IF CURSIDE% = 0 THEN TESTCHAR$ = MID$(LSIDE$, NPOS%, 1) ELSE TESTCHAR$ = MID$(RSIDE$, NPOS%, 1)
46070 IF TESTCHAR$ = ENDCHAR$ THEN TESTNUGG$ = TESTNUGG$ + TESTCHAR$: GOSUB 46500 : RETURN: ' found end marker, append, highlight nugget
46080 IF ASC(TESTCHAR$) >= 65 THEN IF ASC(TESTCHAR$) <= 90 THEN GOSUB 45000: RETURN: ' hit a letter, bail out
46090 TESTNUGG$ = TESTNUGG$ + TESTCHAR$: ' OK, add the character and move to the next one
46100 INCRX% = INCRX% + 1
46110 GOTO 46040
46500 REM ===== Highlight detected nugget, push it into GUESS, update lower-right prompt
46510 GUESS$ = TESTNUGG$: ISNUGGET% = 1
46520 PRINT @ CURPA%, CHR$(16);GUESS$;CHR$(17);
46530 GOSUB 49040
46540 RETURN
47000 REM ===== print "attempts remaining" line
47010 PRINT @ 400 + 12, "Attempts Remaining: ";
47020 FOR J = 1 TO 4
47025 PALOC% = 417 + (J * 2) + 12
47030 IF J <= GUESSES% THEN PRINT @ PALOC%, " " ; CHR$(16) ; " " ; CHR$(17); ELSE PRINT @ PALOC%, " ";
47040 NEXT J
47050 RETURN
48000 REM ===== rotate / push the "stack" of right-hand output lines
48010 FOR J = 15 TO 2 STEP -1
48020 OUTPUTLINES$(J) = OUTPUTLINES$(J-1)
48030 NEXT J
48040 OUTPUTLINES$(1) = NEWLINE$
48050 RETURN
49000 REM ===== print the right-hand lines and the prompt
49010 FOR J = 1 TO 15
49015 PALOC% = ((22 - J) * 80) + 41 + 12
49020 IF OUTPUTLINES$(J) <> "" THEN PRINT @ PALOC%, OUTPUTLINES$(J);STRING$(15 - LEN(OUTPUTLINES$(J)), " ");
49030 NEXT
49040 REM ===== sometimes we GOSUB into the middle, here, if we just want to print the prompt
49050 PALOC% = 22*80 + 41 + 12
49060 PRINT @ PALOC%, "> ";: ' clear the line, then:
49070 PRINT @ PALOC%, ">" ; GUESS$; CHR$(16); " "; CHR$(17); CHR$(24);: ' fake cursor for compiled version
49090 RETURN
50000 REM ===== process a guess
50010 GUESS$ = WORDS$(CW%)
50020 IF CW% = PWDIDX% THEN YOUWON% = 1: NEWLINE$ = ">"+GUESS$: GOSUB 48000: GUESS$ = "Accepted.": GOSUB 49000: GOSUB 50200
50030 MATCHES% = 0
50040 FOR J = 1 TO LEN(GUESS$)
50050 IF MID$(GUESS$, J, 1) = MID$(PWD$, J, 1) THEN MATCHES% = MATCHES% + 1
50060 NEXT J
50070 NEWLINE$ = ">" + GUESS$
50080 GOSUB 48000
50090 NEWLINE$ = ">Entry denied."
50100 GOSUB 48000
50110 NEWLINE$ = ">Likeness=" + RIGHT$(STR$(MATCHES%), 1)
50120 GOSUB 48000
50130 GOSUB 49000: ' print the lines
50140 GUESSES% = GUESSES% - 1
50150 GOSUB 47000: ' reprint "attempts remaining" line
50160 GOSUB 49040: ' repoint the cursor to bottom right
50170 IF GUESSES% > 0 THEN RETURN
50180 REM ELSE we are out of guesses, just fall through to the next bit
50190 GUESS$ = "Init lockdown.": GOSUB 49040
50200 REM ===== print results, wait for input
50210 IF YOUWON% = 1 THEN PRINT @ 400 + 12, "*** HACKING SUCCESSFUL! *** " ELSE PRINT @ 400 + 12, "OUT OF ATTEMPTS! PWD WAS: " ; PWD$
50220 PALOC% = 22*80 + 41 + LEN(GUESS$) + 1 + 12: PRINT @ PALOC%, " ": ' clear fake cursor
50230 PRINT @ 23*80 + 12, "<ENTER> or <SPACE> for more training, <BREAK> to end.";
50240 KEYIN$ = INKEY$: IF KEYIN$ = "" THEN 50240
50250 IF KEYIN$ = CHR$(13) THEN RUN ELSE IF KEYIN$ = " " THEN RUN ELSE 50240
50500 RETURN
51000 REM ===== process a nugget
51010 NEWLINE$ = ">" + GUESS$
51020 GOSUB 48000: ' push line onto stack
51030 PRINT @ CURPA%, GUESS$;: ' un-highlight the nugget TODO the real game doesn't do this
51040 PRINT @ CURPA%, CHR$(16);CURCHAR$;CHR$(17);: ' re-highlight the current position TODO the real game doesn't do this
51050 IF CURSIDE% = 0 THEN LP2W%(CURPOS%) = -1 ELSE RP2W%(CURPOS%) = -1: ' tag this nugget as used
51060 IF RND(5) = 5 THEN GOSUB 52000 ELSE GOSUB 53000: ' 20% chance of replenish guesses vs 80% remove dud TODO play some fallout and get the right percentages
51070 GUESS$ = CURCHAR$
51080 CW% = -1
51090 GOSUB 49040: ' reprint the prompt with just the one character
51100 RETURN
51500 REM ===== "Error" on trying non-word character
51510 NEWLINE$ = ">" + GUESS$
51520 GOSUB 48000: ' push line onto stack
51530 NEWLINE$ = ">Error"
51540 GOSUB 48000: ' push line onto stack
51550 GOSUB 49000: ' print the right-side lines and re-prompt
51560 RETURN
52000 REM ===== Replenish guesses
52010 NEWLINE$ = ">Tries reset."
52020 GOSUB 48000: ' push line onto stack
52060 GUESSES% = 4
52070 GOSUB 47000: ' reprint "attempts remaining" line
52080 GUESS$ = CURCHAR$
52090 GOSUB 49000: ' print the right-side lines and prompt
52110 RETURN
53000 REM ===== Remove a dud
53010 DUD% = RND(WLL%): IF DUD% = PWDIDX% THEN 53010 ELSE IF WORDS$(DUD%) = DUD$ THEN 53010
53020 WORDS$(DUD%) = DUD$
53030 IF RIGHTP%(DUD%) > 0 THEN MID$(RSIDE$, RIGHTP%(DUD%),WL%) = DUD$ ELSE MID$(LSIDE$, LEFTP%(DUD%),WL%) = DUD$
53040 OLDCW% = CW%
53050 CW% = DUD%
53060 GOSUB 44000: ' un-highlight (and therefore re-display the now-DUD$) current word
53070 CW% = OLDCW%
53080 NEWLINE$ = ">Dud removed."
53090 GOSUB 48000: ' push line onto stack
53100 GOSUB 49000: ' reprint right-side lines and prompt
59999 RETURN
60000 REM ===== IMPORT WORD LIST - GOTO the correct word-length entry point
60010 ON DIFF% GOTO 60020,60030,60040,60170: ' dispatch to difficulty pickers or directly to Master
60020 ON RND(2) GOTO 60050,60070: ' four or five letter words for Novice
60030 ON RND(2) GOTO 60090,60110: ' six or seven letter words for Advanced
60040 ON RND(2) GOTO 60130,60150: ' eight or nine letter words for Expert
60050 ON RND(8) GOSUB 61010,61030,61050,61070,61090,61110,61130,61150: ' four-letter lists (Novice)
60060 GOTO 60500
60070 ON RND(8) GOSUB 61180,61200,61220,61240,61260,61280,61300,61320: ' five-letter lists (Novice)
60080 GOTO 60500
60090 ON RND(8) GOSUB 61350,61370,61390,61410,61430,61450,61470,61490: ' six-letter lists (Advanced)
60100 GOTO 60500
60110 ON RND(8) GOSUB 61520,61540,61560,61580,61600,61620,61640,61660: ' seven-letter lists (Advanced)
60120 GOTO 60500
60130 ON RND(8) GOSUB 61690,61710,61730,61750,61770,61790,61810,61830: ' eight letter lists (Expert)
60140 GOTO 60500
60150 ON RND(8) GOSUB 61860,61880,61900,61920,61940,61960,61980,62000: ' nine letter lists (Expert)
60160 GOTO 60500
60170 ON RND(8) GOSUB 62030,62050,62070,62090,62110,62130,62150,62170: ' ten letter lists (Master)
60180 GOTO 60500
60500 REM ===== DATA selected, import the DATA into WORDS$()
60510 READ AWLENGTH%
60520 DIM AW$(AWLENGTH%)
60530 FOR J = 1 TO AWLENGTH%
60540 READ AW$(J)
60550 NEXT J
60560 GOSUB 60800
60570 DIM WORDS$(WLL%)
60580 FOR J = 1 TO WLL%
60590 GWIDX% = RND(AWLENGTH%)
60600 IF AW$(GWIDX%) = "" THEN 60590
60610 WORDS$(J) = AW$(GWIDX%)
60620 AW$(GWIDX%) = ""
60630 NEXT J
60640 RETURN
60800 REM ===== GET WLL% BASED ON INTEL
60810 RESTORE 60830
60820 DIM DW%(11)
60830 DATA 20,18,17,15,14,12,11,9,8,6,6
60840 FOR J = 1 TO 11: READ DW%(J): NEXT J
60850 WLL% = DW%(INTEL%)
60860 RETURN
61000 REM ===== FOUR-LETTER WORD LISTS
61010 RESTORE 61020: RETURN
61020 DATA 20,POST,TALE,BELT,PLOT,SETS,JOIN,GATE,GAIN,EARN,PAID,SLID,NOTE,TALK,FOLD,WAKE,CASE,SIDE,WANE,BUSY,SASH
61030 RESTORE 61040: RETURN
61040 DATA 20,BUSY,SASH,DAIS,DEEP,SOUL,BEAM,LAKE,EACH,BEEN,FEET,IDEA,DECK,RAID,FULL,NEXT,SORT,SHOP,RELY,SAME,HUGE
61050 RESTORE 61060: RETURN
61060 DATA 20,SAME,HUGE,WALK,POST,SALT,CORN,IRON,GAIN,CODE,SHOT,RATE,SKIN,NAIL,WORD,HAIR,RARE,CARE,PAYS,SEND,CORE
61070 RESTORE 61080: RETURN
61080 DATA 20,SEND,CORE,MATE,GANG,DANK,GAVE,FOOD,GRAY,BONE,MAZE,SLUM,GLOW,SLID,CASE,SURE,DONE,SUNG,ABLE,CURE,PETS
61090 RESTORE 61100: RETURN
61100 DATA 20,CURE,PETS,MAKE,HUTS,WHEN,BEEN,JUST,HOME,GAME,SEEM,TILE,TARP,LAKE,TURN,EARN,PAIN,THIN,EYES,SAND,NEAR
61110 RESTORE 61120: RETURN
61120 DATA 20,SAND,NEAR,TEST,RATS,LAKE,EGOS,DUEL,LIES,ARMS,TALE,WEST,PUSH,FUSE,CAGE,TRAP,TYPE,LESS,BUNK,PICK,CAGE
61130 RESTORE 61140: RETURN
61140 DATA 20,PICK,CAGE,WARD,WOOD,CITY,WEAK,FIRE,HIGH,PETS,WERE,FIVE,SEEK,HERO,RUSE,NEWS,MASS,BALL,CORE,ADDS,PATH
61150 RESTORE 61160: RETURN
61160 DATA 20,ADDS,PATH,TALK,CALL,MANY,MAKE,POLE,PUSH,PANS,DENY,SETS,MAZE,BOSS,GUTS,COST,DUTY,PETS,ROLL,POST,TALE
61170 REM ===== FIVE-LETTER WORD LISTS
61180 RESTORE 61190: RETURN
61190 DATA 20,HIRED,PULLS,CLAWS,HILLS,CELLS,WORKS,TILES,HOLES,SANDS,RUMOR,SIDES,KINDS,SURGE,SENSE,HEART,JAMES,RAIDS,CRIED,BLAST,SPANS
61200 RESTORE 61210: RETURN
61210 DATA 20,BLAST,SPANS,DEMON,SWEPT,LIGHT,DEITY,TRIED,THROW,DIARY,LEVEL,TELLS,SPREE,LOVED,LISTS,HALLS,WIRES,RIVAl,MAKES,CANDY,MODEL
61220 RESTORE 61230: RETURN
61230 DATA 20,CANDY,MODEL,DRIED,IDEAS,SHEER,STAKE,HOLDS,RANGE,UPSET,LORDS,EAGER,STERN,RIVAL,CRUDE,SPEAR,TRACT,HORDE,FRUIT,FLASH,VALUE
61240 RESTORE 61250: RETURN
61250 DATA 20,FLASH,VALUE,CLOUD,CRUDE,TRIPS,BLEND,LOVES,ALLOW,HORDE,REPEL,LEAST,SPANS,MEATS,HOPES,CODES,OASIS,LIVES,BOOST,FARMS,FACES
61260 RESTORE 61270: RETURN
61270 DATA 20,FARMS,FACES,EARLY,HIDES,QUEST,BUILD,CARDS,FLUID,HOWLS,CASES,TYPED,TAKES,BOOKS,ENEMY,TANKS,HOLDS,WIRES,MAKES,DRAWN,LEAVE
61280 RESTORE 61290: RETURN
61290 DATA 20,DRAWN,LEAVE,HENCE,CLEAN,SPEND,ROCKY,PARTY,CANDY,CACHE,LOOMS,PLACE,CLOCK,AGREE,PICKS,GUARD,HOLDS,VENOM,PRONE,DARED,LIGHT
61300 RESTORE 61310: RETURN
61310 DATA 20,DARED,LIGHT,LASER,FOYER,LUCKY,TEAMS,THIEF,BOOTS,POWER,HANDS,TOXIC,TYPES,NEVER,MOVED,ROCKY,TIRED,HAVEN,TYPED,CAUSE,SEVER
61320 RESTORE 61330: RETURN
61330 DATA 20,CAUSE,SEVER,WROTE,SINCE,LUCKY,GOODS,LEAST,SEEMS,NEARS,AGAIN,TRASH,LASER,TELLS,WORDS,SEEDS,LANDS,CLUMP,ROOMS,HIRED,PULLS
61340 REM ===== SIX-LETTER WORD LISTS
61350 RESTORE 61360: RETURN
61360 DATA 15,DEMEAN,BUNKER,PROVED,THOUGH,ARGUED,HACKER,PREFER,MINUTE,WISHES,DAGGER,CHASED,BOOTHS,DIPPED,SIRENS,FENDED
61370 RESTORE 61380: RETURN
61380 DATA 15,GEIGER,MOSTLY,PATROL,BACKED,WANTED,CARVED,BREWER,MONGOL,BITTEN,LATEST,SUDDEN,PISTOL,ATTEND,MENIAL,BOTTLE
61390 RESTORE 61400: RETURN
61400 DATA 15,VISION,PROPER,JUSTIN,BETTER,PLENTY,ANSWER,MANNED,DENIES,FIERCE,FILTHY,FILLED,SLAVES,DEFEND,BOTTOM,CENTER
61410 RESTORE 61420: RETURN
61420 DATA 15,WEAKEN,KATANA,SQUARE,JACKET,TONGUE,SYSTEM,INTACT,MELTED,GENTLY,GLANCE,LEADER,NAILED,OPENLY,AFRAID,SONICS
61430 RESTORE 61440: RETURN
61440 DATA 15,WINTER,BROKEN,MODELS,EASIER,SPEARS,DEMEAN,GEIGER,UPROAR,KISSED,CREATE,STUFFS,CHOICE,SENSED,STONES,PLAYER
61450 RESTORE 61460: RETURN
61460 DATA 15,PREFER,CRIMES,CRAVEN,LOSING,REOPEN,MODELS,FORCES,LIGHTS,WEAPON,RADIOS,RESULT,CAUSED,FLOORS,KATANA,BEFELL
61470 RESTORE 61480: RETURN
61480 DATA 15,BROKEN,WANDER,FLUENT,LEADER,GARDEN,TUNNEL,JACKAL,INSULT,JACKET,FACING,LOCALS,BORDER,SECRET,KNIGHT,PRISON
61490 RESTORE 61500: RETURN
61500 DATA 15,WILDLY,SHOVEL,RUSTED,WANTED,BOOTED,LOCALS,SHELLS,HUNTED,NEARBY,HEALED,FORCES,NORMAL,CRATES,BORDER,BARBED
61510 REM ===== SEVEN-LETTER WORD LISTS
61520 RESTORE 61530: RETURN
61530 DATA 15,GENGHIS,RUNDOWN,TAKINGS,CARRIED,SKETCHY,TUNNELS,BROUGHT,ALREADY,WRITING,URANIUM,REMAINS,DRESSES,COMMITS,OVERRUN,KITCHEN
61540 RESTORE 61550: RETURN
61550 DATA 15,NOTICED,STARTED,PLOTTED,CONQUER,HANDLES,STAINED,STATING,CREATED,BUNDLED,SMARTER,FOREVER,BLESSED,ASSUMED,CRAFTED,RETIRED
61560 RESTORE 61570: RETURN
61570 DATA 15,KNIGHTS,TURRETS,BECOMES,CONTACT,TORCHES,SCRIBES,DAGGERS,CAREFUL,SIGNALS,PATTERN,LEGIONS,GANGERS,COUSINS,APPEARS,HARNESS
61580 RESTORE 61590: RETURN
61590 DATA 15,OPENING,TYRANNY,WHISPER,TATTOOS,ORLEANS,THEATRE,CREATED,BECAUSE,AFRRONT,THIEVES,OVERSEE,HOSTILE,INVADED,BARRENS,STAYING
61600 RESTORE 61610: RETURN
61610 DATA 15,ANNOYED,SECRETS,SUBJECT,COLLECT,PLAGUED,ESCORTS,TURRETS,QUALIFY,FILTERS,SOMEONE,MACHETE,CONSIST,ATTEMPT,NOTHING,INVOLVE
61620 RESTORE 61630: RETURN
61630 DATA 15,VARYING,FORBADE,BEEPING,MELISSA,ANYTIME,COPYING,KNIGHTS,TOWARDS,STORAGE,OFFICES,HANDLES,WEALTHY,CONFIRM,EXPRESS,PROCEED
61640 RESTORE 61650: RETURN
61650 DATA 15,EXACTLY,JUNGLES,OUTPOST,ATTENDS,OVERALL,BENEFIT,TALENTS,GREETED,BUNDLED,TRADING,HUNDRED,RAMPAGE,JOURNAL,BENCHES,FAVORED
61660 RESTORE 61670: RETURN
61670 DATA 15,INHUMAN,SMASHED,AMALGAM,INSTEAD,STREETS,CROWDED,POPULAR,COCHISE,ENABLES,EMBRACE,SECTION,RESIDES,MASSIVE,COPYING,REASONS
61680 REM ===== EIGHT-LETTER WORD LISTS
61690 RESTORE 61700: RETURN
61700 DATA 15,CHAMPION,SEARCHED,SPLINTER,CEREMONY,DESIGNED,POSSIBLY,PARANOIA,HALLWAYS,SHIELDED,CORRODED,COMPUTER,SOLITARY,STATUARY,SUFFERED,DUNGEONS
61710 RESTORE 61720: RETURN
61720 DATA 15,PROGRESS,MISSIONS,PROMISES,DESIGNED,PLOTTING,EXTENDED,RUSTLING,GOVERNOR,FORAGING,DESOLATE,TRAINING,CORRIDOR,LOCATION,TENSIONS,THOUSAND
61730 RESTORE 61740: RETURN
61740 DATA 15,FAMILIES,CONNECTS,DYNAMITE,NOWADAYS,CITADELS,PROMISES,JUNKTOWN,PORTIONS,DEFENDED,BONEYARD,LAUNCHER,INTRUDER,FOLLOWED,GRIEVOUS,CONQUERS
61750 RESTORE 61760: RETURN
61760 DATA 15,RANSACKS,HIDEAWAY,PATIENTS,BUSINESS,HIDEOUTS,AGREEING,CHEMICAL,GATHERED,FIREARMS,REPTILES,SHIELDED,RECEIVES,CONFINED,ACTIVELY,BELIEVES
61770 RESTORE 61780: RETURN
61780 DATA 15,KNEECAPS,REMUSTER,DECLARED,CARRYING,PROVIDES,LANGUAGE,PLEASURE,PAINTING,CANISTER,PRODUCED,MECHANIC,TWITCHES,ACTUALLY,ENGINEER,DISLIKED
61790 RESTORE 61800: RETURN
61800 DATA 15,WILDFIRE,LAUNCHER,BLINKING,BARRACKS,JUNKTOWN,HARDWARE,SHACKLES,STANDARD,STEALTHY,SOUTHERN,CONTENTS,SCORPION,STEMMING,NORTHERN,OVERSEES
61810 RESTORE 61820: RETURN
61820 DATA 15,CHAMPION,ARSENALS,ALTERING,DEBATING,PASSKEYS,TIAJUANA,CHAMBERS,COMPUTER,EGYPTIAN,MANSIONS,MATERIAL,STUNNERS,ANYWHERE,DISPROVE,SYNOPSIS
61830 RESTORE 61840: RETURN
61840 DATA 15,STRONGER,FIERCELY,PLEASANT,CHILDREN,IMPURITY,PRIORITY,FIREARMS,SCORPION,ELEMENTS,AGREEING,EXPANDED,LOYALIST,PURCHASE,RETRIEVE,CROSSBOW
61850 REM ===== NINE-LETTER WORD LISTS
61860 RESTORE 61870: RETURN
61870 DATA 15,FINALIZES,APOLOGIZE,RELIGIONS,DETERMINE,SEPARATED,VAPORIZES,UNDERWENT,SALVATION,FOOTSTEPS,OPERATION,TRAVELING,BELIEVING,BELONGING,RESIDENCE,STATIONED
61880 RESTORE 61890: RETURN
61890 DATA 15,AMBITIONS,PLUNDERED,TRAVELERS,DIFFERENT,SCATTERED,FLAVORING,PERSONNEL,FIREFIGHT,BELIEVING,SITUATION,HISTORIES,TRIUMPHED,GATHERING,BANDOLEER,TERRIFIED
61900 RESTORE 61910: RETURN
61910 DATA 15,WANDERING,MARAUDING,SHAMBLING,SOMETHING,SECLUSION,RETREATED,IMPORTANT,STUMBLING,BANDOLEER,ELSEWHERE,BATHROOMS,REPAIRING,CANISTERS,SANCTUARY,BELONGING
61920 RESTORE 61930: RETURN
61930 DATA 15,PROJECTOR,KNOWLEDGE,PRIMITIVE,MENTIONED,FORBIDDEN,OCCUPYING,PROLONGED,RADIATION,REALISTIC,THEREFORE,INVENTORS,IMPROVING,COLLECTED,REVERENCE,LOCKPICKS
61940 RESTORE 61950: RETURN
61950 DATA 15,SOMETHING,POSSESSES,CREATURES,BARTERING,INVENTORS,BATTERIES,WILLINGLY,WANDERING,PARTICLES,MUTATIONS,HURRIEDLY,PACIFISTS,MECHANISM,REPRESSED,BLOODSHED
61960 RESTORE 61970: RETURN
61970 DATA 15,GLADIATOR,DELIMITER,CLUSTERED,AGREEMENT,DEFENSIVE,STUMBLING,COURTYARD,CERTAINLY,RETURNING,ADDRESSED,DEVELOPED,REPRESSED,INITIATES,PLUNDERED,SECRETIVE
61980 RESTORE 61990: RETURN
61990 DATA 15,TELEPHONE,REARGUARD,LISTENING,ASCENSION,SOUTHWARD,WASTELAND,SOUTHEAST,SLITHERED,GRAPPLING,KNOWLEDGE,OVERTHROW,FLATTENED,REPRESSED,GLADIATOR,MICROWAVE
62000 RESTORE 62010: RETURN
62010 DATA 15,ELIMINATE,AUTOMATED,POISONING,COMPANIES,APOLOGIZE,EMERGENCY,GLADIATOR,INNOCENTS,MENTIONED,POSSESSES,PREPARING,PAINTINGS,BUILDINGS,ENCOUNTER,HAPPINESS
62020 REM ===== TEN-LETTER WORD LISTS
62030 RESTORE 62040: RETURN
62040 DATA 15,INITIATION,STARVATION,CHALLENGED,ADMIRATION,PROSPERITY,FUNCTIONAL,LEADERLESS,ACTIVITIES,CONTENDING,MEDITATION,SUNGLASSES,RESEMBLING,PEACEFULLY,SCANDALOUS,DOMINATION
62050 RESTORE 62060: RETURN
62060 DATA 15,SKYSCRAPER,RETALIATED,NECROPOLIS,VEGETABLES,OVERLOOKED,REPUTATION,EXPLOSIVES,SUSPICIOUS,FLOURISHED,CONSIDERED,CHALLENGED,ESPECIALLY,MECHANICAL,UNFAITHFUL,DESTROYING
62070 RESTORE 62080: RETURN
62080 DATA 15,POSSESSION,GENERATION,ARBITRATOR,CONTAINERS,CONSIDERED,REFERENCES,BOBBLEHEAD,STRETCHING,ACCUSATION,DISCIPLINE,ABSOLUTELY,APPROACHES,INITIATION,CONDUCTING,COMMISSION
62090 RESTORE 62100: RETURN
62100 DATA 15,RECRUITING,UNDERSTAND,CEREMONIES,RECUPERATE,HISTORICAL,AGGRESSIVE,DEFINITELY,APPROACHES,TECHNICIAN,PROCLAIMED,PROCESSION,ADMIRATION,THEMSELVES,ACTIVITIES,EXPLOSIVES
62110 RESTORE 62120: RETURN
62120 DATA 15,VEGETABLES,REASONABLY,CONTENDING,SUNGLASSES,SACRIFICES,ABSOLUTELY,SURROUNDED,THEREAFTER,HEIGHTENED,DECIMATING,BINOCULARS,DEPARTMENT,APPROACHES,FOOTPRINTS,ADVANTAGES
62130 RESTORE 62140: RETURN
62140 DATA 15,PROTECTIVE,DEPARTMENT,APPROACHES,UNDERSTAND,CROSSROADS,ENVISIONED,RECUPERATE,OBLITERATE,DELIVERING,TREATMENTS,HESITATION,REPUTATION,DETERMINED,WIDESPREAD,RESISTANCE
62150 RESTORE 62160: RETURN
62160 DATA 15,BUSINESSES,HYPERLIGHT,SURRENDERS,CONDUCTING,PERFORMERS,DESCENDENT,PROCESSING,REMEMBERED,QUANTITIES,SCAVENGING,BENEVOLENT,FUNCTIONAL,HEIGHTENED,MONITORING,VEGETABLES
62170 RESTORE 62180: RETURN
62180 DATA 15,CONTENTING,DISCOVERED,RANSACKING,POSSESSION,SPECIALIZE,DELIVERING,PERCENTAGE,SCAVENGING,SKYSCRAPER,SACRIFICES,OUTRAGEOUS,INTENTIONS,HISTORICAL,CASUALTIES,ABSOLUTELY