Main Program 7.1 Tour
The Main Program 7.1 Tour is an annotated listing of the BASIC code for version 7.1 of the Eamon Main Program which explains the operation and purpose of each important line. The original tour was written by Tom Zuchowski and published serially in the September 1994, December 1994, March 1995, and June 1995 issues of the Eamon Adventurer's Guild Newsletter. It was later collected by Matthew Clark into a single page at the Eamon Adventurer's Guild Online website.
The version below is based on Zuchowski's original annotations along with some added explanations and syntax highlighting of the original code. It's followed by a list of the variables used in the program.
For the non-annotated source code, see Source:Main Program 7.1.
Introductory remarks
The opening remarks present the adventure number, the name of the adventure, and the author, and also identifies the Main Program version being used. The block also commonly lists the date the program was last modified and gives the (now obsolete) contact information for the Eamon Adventurer's Guild. (John Nelson introduced the revision date addition in the January '85 newsletter.)
1 REM EAMON ADVENTURE #NNN
2 REM (NAME OF ADVENTURE)
3 REM
4 REM BY (YOUR NAME HERE)
5 REM
6 REM VERSION 7.1
7 REM MP56 1/15/95
8 REM
EAMON ADVENTURER'S GUILD
7625 HAWKHAVEN DR.
CLEMMONS, NC 27012
Begin
Before starting the game in earnest, the program uses the MAXFILES
command to reserve three file buffers for disk input and output. ( CHR$(4)
is the standard DOS command escape prefix.) The program then jumps to the fast start routine at line 33000.
10 PRINT CHR$ (4)"MAXFILES 3"
20 GOTO 33000
Common routines
These are a few basic routines commonly called from elsewhere in the game.
The first is a string print routine. Line 45 notes the top of free memory and reads in A$ from the disk. Line 50 performs a screen pause calculation for A$ length, prints A$, then recovers the memory that A$ occupied.
45 F1 = PEEK (111):F2 = PEEK (112): PRINT D$"READ"ED$",R"R: INPUT A$: PRINT D$
50 LL = ( LEN (A$) + CP - 1) / CP:L = L + LL: GOSUB 58: PRINT A$:L = L + LL * (L = 0): IF ( PEEK (109) + PEEK (110) * 256 + LEN (A$)) < (F1 + F2 * 256) THEN POKE 111,F1: POKE 112,F2
Next is a screen pause routine, used to suspend the display when a screen's worth of text has been shown and prevent the first lines from quickly scrolling out of sight. After printing a blank line, it increments the line counter (L
). If the line count is less than 23 (a full screen), it does nothing; if it reaches 23, then it pauses and prompts the user to press a key to continue.
51 PRINT
52 L = L + 1: GOTO 58
54 L = L + 1
56 L = L + 2: PRINT
58 IF L < 23 THEN RETURN
59 PRINT " (PRESS ANY KEY TO CONTINUE) ";: GET Q$: PRINT : VTAB PEEK (37): FOR L = 1 TO 39: PRINT " ";: NEXT : PRINT : VTAB PEEK (37):L = 0: RETURN
And finally, some command error messages:
91 PRINT : PRINT "YOU AREN'T CARRYING IT.": GOTO 99
92 PRINT : PRINT "YOU MUST FIRST OPEN IT.": GOTO 99
94 PRINT : PRINT "YOU CAN'T "C$(C)" "S$: GOTO 98
96 PRINT : PRINT "NOBODY HERE BY THAT NAME!": GOTO 99
98 GOSUB 54: GOTO 310
99 GOSUB 54
Main loop
You see
This section builds the description of what the player sees.
First the program checks the light source (LS
). If its counter has reached zero, it reports that it's gone out and sets the room's light level (LT
) to its natural level (NL
); if the counter is above zero but getting low, warning messages will appear.
100 REM
YOU SEE
110 GOSUB 56: IF LS THEN A%(LS,5) = A%(LS,5) - 1: IF A%(LS,5) = 0 THEN PRINT : PRINT "YOUR "A$(LS)" HAS GONE OUT!":LS = 0:LT = NL: GOTO 99
115 IF LS THEN IF A%(LS,5) < 10 THEN PRINT : PRINT "YOUR "A$(LS)" IS ALMOST OUT!": GOSUB 54: GOTO 120
117 IF LS THEN IF A%(LS,5) < 20 THEN PRINT : PRINT "YOUR "A$(LS)" GROWS DIM!": GOSUB 54
Next the program decrements the Speed counter (SP
) and checks to see if it's reached zero; if so, the spell has expired and the adventurer's agility (previously increased here) is reduced. Current spell abilities (S2%
) are compared to total spell abilities (SA%
) and may increase slightly.
120 IF SP THEN SP = SP - 1: IF NOT SP THEN M%(0,2) = M%(0,2) / 2: PRINT "YOUR SPEED SPELL HAS JUST EXPIRED!": GOSUB 56
122 FOR A = 0 TO 3: IF S2%(A) < SA%(A) THEN S2%(A) = S2%(A) * 1.1: IF S2%(A) > SA%(A) THEN S2%(A) = SA%(A)
123 NEXT
At this point the room name (RN$
) for the current room number (RO
) is displayed, assuming it's not too dark to see. If the room description flag (V%
) hasn't yet been set, the description is also displayed, and the flag set to indicate it's been seen and need not be shown again.
125 IF NOT LT THEN PRINT : PRINT "IT'S TOO DARK TO SEE.": GOSUB 52: GOTO 210
130 PRINT "YOU ARE ": PRINT " "RN$: GOSUB 54
135 IF NOT V%(RO) THEN R = RO: GOSUB 45:V%(RO) = 1
Next the program gets the number of monsters (NM
) in the current room (RO
) and checks each one's "seen" flag (M%(M,0)
). For unseen monsters it gives the description. For those the adventurer has already seen, the program just displays that the monster (M$(M)
) "is here"... or if there's more than one in the group (M%(M,3)
), the monsters "are here". (And finally on line 156, if a description was printed, it adds a blank line.)
140 B% = NM:D% = RO: FOR M = 1 TO NM:C% = M: & A,D%,M%(C%,5),C%,B%: IF NOT C% THEN M = 999: NEXT : GOTO 160
145 M = C%:M2 = 0: IF NOT M%(M,0) THEN GOSUB 51:M%(M,0) = 1:R = M + 600: GOSUB 45:M2 = 1: PRINT " - ";
150 IF M%(M,3) = 1 THEN PRINT M$(M)" IS HERE.": GOSUB 52: GOTO 156
154 PRINT M%(M,3)" "M$(M)"S ARE HERE.": GOSUB 52
156 IF M2 THEN GOSUB 51
159 NEXT
The program then does much the same for artifacts:
160 GOSUB 51:B% = NZ:D% = RO: FOR A = 1 TO NZ:C% = A: & A,D%,A%(C%,4),C%,B%: IF NOT C% THEN A = 999: NEXT : GOTO 190
165 A = C%:M2 = 0: IF NOT A%(A,0) THEN A%(A,0) = 1:R = A + 200: GOSUB 45:M2 = 1: PRINT " - ";
170 PRINT "YOU SEE "A$(A)".": GOSUB 52: IF M2 THEN GOSUB 51
175 C% = C% + 1: NEXT
It also displays whether your personal-weapon is in the room:
190 FOR A = NZ + 1 TO NA: IF A%(A,4) = RO THEN PRINT "YOUR "A$(A)" IS HERE.": GOSUB 52
Command parser
200 NEXT
205 REM
CMD
210 PRINT : GOSUB 56: INPUT " YOUR COMMAND?";A$:L = 0
220 IF LEFT$ (A$,1) = " " THEN A$ = MID$ (A$,2): GOTO 220
230 IF A$ = "" THEN A$ = CZ$: VTAB PEEK (37): HTAB 16: PRINT A$
235 PRINT : IF A$ = "" THEN 275
240 CZ$ = A$: FOR A = 2 TO LEN (A$): IF MID$ (A$,A,1) < > " " THEN NEXT
250 V$ = LEFT$ (A$,A - 1):S$ = MID$ (A$,A + 1)
260 IF LEFT$ (S$,1) = " " THEN S$ = MID$ (S$,2): GOTO 260
270 SL = LEN (V$): FOR A = 1 TO ND: IF LEFT$ (C$(A),SL) = V$ THEN C = A:A = 999: NEXT : GOTO 290
272 NEXT :F = 0: FOR A = ND + 1 TO NC: IF LEFT$ (C$(A),SL) = V$ THEN C = A:F = F + 1: IF C$(A) = V$ THEN F = 1:A = 999
273 NEXT
275 IF F < > 1 THEN PRINT : PRINT "I ONLY UNDERSTAND THESE COMMANDS-- ": PRINT : FOR C = 1 TO CC: HTAB 2: POKE 1403,10: PRINT C$(C);: HTAB 15: POKE 1403,30: PRINT C$(C + CC);: HTAB 28: POKE 1403,50: PRINT C$(C + 2 * CC): NEXT : GOTO 210
290 ON C GOTO 3000,3000,3000,3000,3000,3000,4000,5000,6500,6000,7000,8000,9000,10000,11000,12000,13000,14000,15000,16000,23000,17000,18000,19000,20000,21000,22000,24000,25000,26000,27000,28000
Pick a foe
300 REM
PICK FOE
305 GOSUB 51
310 IF NOT T(1) THEN 500
320 B% = NM:D% = RO: FOR M = 1 TO NM:C% = M: & A,D%,M%(C%,5),C%,B%: IF NOT C% THEN M = 999: NEXT : GOTO 500
330 M = C%: IF M%(M,11) = 2 THEN NEXT : GOTO 500
333 IF M%(M,3) = 1 THEN IF M%(M,13) / M%(M,1) * RND (1) * 100 > M%(M,4) THEN PRINT : PRINT M$(M)" FLEES!": GOSUB 54:M%(M,5) = 0:M2 = M: GOSUB 3600:M = M2: NEXT : GOTO 500
334 IF M%(M,3) = 1 THEN 340
335 IF (M%(M,12) - M%(M,3)) / M%(M,12) * RND (1) * 100 > M%(M,4) THEN MR% = RND (1) * M%(M,3) + 1: PRINT : PRINT MR%" "M$(M);
336 IF MR% THEN PRINT MID$ (" FLEES!S FLEE!",1 + (MR% > 1) * 7,7): GOSUB 54:M%(M,3) = M%(M,3) - MR%:M%(M,5) = M%(M,5) * (M%(M,3) > 0):M2 = M: GOSUB 3600:M = M2:MR% = 0: IF NOT M%(M,5) THEN NEXT : GOTO 500
340 MC = 1: IF M%(M,3) > 8 THEN MC = M%(M,3) - 8
350 OF = M:DF = 0: FOR MC = MC TO M%(M,3): IF M%(M,11) = 3 THEN 400
360 IF T(3) = M%(0,1) THEN 480
370 B% = NM:D% = RO: FOR M2 = 1 TO NM:C% = M2: & A,D%,M%(C%,5),C%,B%: IF NOT C% THEN M2 = 999: GOTO 380
375 M2 = C%: IF M%(M2,11) = 3 AND RND (1) < .25 THEN DF = M2:M2 = 999
380 NEXT : GOTO 480
400 C% = 1:B% = NM:D% = RO
410 & A,D%,M%(C%,5),C%,B%: IF M%(C%,11) < > 1 THEN C% = C% + 1: GOTO 410
415 DF = C%: IF DF = NM THEN 480
420 FOR M2 = DF + 1 TO NM:C% = M2: & A,D%,M%(C%,5),C%,B%: IF NOT C% THEN M2 = 999: GOTO 430
425 M2 = C%: IF M%(M2,11) = 1 AND RND (1) < .25 THEN DF = M2:M2 = 999
430 NEXT
480 GOSUB 7500
490 IF NOT T(1) THEN M = 999:MC = 999
495 NEXT : NEXT
Every-round special programming
500 REM
SPECIAL EVERY-ROUND STUFF
900 GOTO 100
Movement
Move
3000 REM
MOVE
3010 IF T(1) THEN PRINT : PRINT "YOU CAN'T TURN YOUR BACK HERE!": GOTO 99
3020 D = C
3030 R2 = RD%(D): IF R2 > 500 THEN 3400
3040 IF R2 > 0 AND R2 < = NR THEN 3500
3050 REM /// SPECIAL MOVES
3060 IF R2 = - 99 THEN PRINT : PRINT "YOU RETURN TO THE MAIN HALL.": GOTO 32000
3180 REM /// INSERT HERE SPECIAL ROOM MOVE CHECKING
3390 PRINT : PRINT "YOU CAN'T GO THAT WAY!":V%(RO) = 0: GOTO 99
Gates and doors
3400 REM
GATE/DOOR
3410 A = R2 - 500: IF A%(A,6) = 0 AND NOT A%(A,8) THEN R2 = A%(A,5): GOTO 3040
3420 IF A%(A,8) THEN R2 = 0: GOTO 3390
3430 PRINT : PRINT "THE "A$(A)" BLOCKS THE WAY!": GOTO 99
Go
3500 REM
GO
3530 R3 = RO:RO = R2: GOSUB 3600
3540 PRINT D$;"READ"ER$",R"RO:NX = 0: INPUT RN$: FOR X = 1 TO ND: INPUT RD%(X)
3550 IF RD%(X) > 0 AND RD%(X) < = NR THEN NX = NX + 1
3560 NEXT : INPUT NL: PRINT D$:LT = NL OR LS
3590 GOTO 100
Enemies
3600 REM
ENEMY?
3610 T(1) = 0:T(3) = M%(0,1):F(1) = 0:F(3) = M%(0,13)
3620 FOR M = 1 TO NM
3630 IF M%(M,5) = R3 THEN IF (M%(M,11) = 3 OR (M%(M,11) = 1) AND 200 * RND (1) < M%(M,4)) THEN M%(M,5) = RO: GOTO 3670
3640 IF M%(M,5) < > RO THEN NEXT : RETURN
3650 IF M%(M,11) > 100 THEN FR = M%(M,11) - 100 + (CH - 10) * 2:M%(M,11) = 1: IF FR > 100 * RND (1) THEN M%(M,11) = 2: IF FR > 200 * RND (1) THEN M%(M,11) = 3
3670 A = M%(M,11):F(A) = F(A) + M%(M,13) * M%(M,3):T(A) = T(A) + M%(M,1) * M%(M,3): NEXT : RETURN
Objects
Get
4000 REM
GET
4010 GOSUB 4900: IF S$ = "ALL" THEN 4200
4020 HA = RO: GOSUB 4805: IF NOT F THEN 94
4030 PRINT : IF A%(A,3) > 900 THEN PRINT "DON'T BE ABSURD.": GOTO 98
4040 IF WT + A%(A,3) > 10 * M%(0,1) THEN PRINT "IT IS TOO HEAVY.": GOTO 98
4050 IF A%(A,2) = 10 THEN PRINT A$(A)" IS TIED DOWN!": GOTO 98
4140 PRINT "GOT IT.": GOSUB 54:A%(A,4) = - 1:WT = WT + A%(A,3): IF M%(0,8) = - 1 THEN IF A%(A,2) = 2 OR A%(A,2) = 3 THEN 17100
4150 GOTO 300
4200 GOSUB 51:B% = NA:D% = RO: FOR A = 1 TO NA:C% = A: & A,D%,A%(C%,4),C%,B%: IF NOT C% THEN A = 999: NEXT : GOTO 300
4210 A = C%: PRINT A$(A);: IF A%(A,2) = 10 THEN PRINT " IS TIED DOWN!": GOTO 4240
4215 IF A%(A,3) > 900 THEN PRINT ": DON'T BE ABSURD.": GOTO 4240
4220 IF WT + A%(A,3) > 10 * M%(0,1) THEN PRINT " IS TOO HEAVY.": GOTO 4240
4230 PRINT " TAKEN.":A%(A,4) = - 1:WT = WT + A%(A,3)
4240 GOSUB 52: NEXT : GOTO 98
Synonyms
This section supports adding synonyms for artifacts or other objects of commands.
4600 REM
SYNONYMS
4610 SL = LEN (S$)
4620 REM PUT YOUR OWN SYNONYMS HERE. SEE MANUAL FOR DETAILS
4675 RETURN
4680 IF LEFT$ (SY$,SL) = S$ OR RIGHT$ (SY$,SL) = S$ THEN S$ = A$(SY): POP
4690 RETURN
Set SY$
to be the synonym, and SY
to the number of the artifact that you are checking for. The Dungeon Designer's Manual gives the following example: if a secret panel that happens to be artifact #3 is hidden in room #2, and a hint in the room description says that the wall looks funny, you can put a line like this in your program:
4620 IF RO = 2 THEN SY$ = "WALL":SY = 3: GOSUB 4680
With this line in place, the player can enter the command EXAMINE WALL
and the secret panel will appear in the room.
Monster search
4700 REM
MONS SEARCH
4705 WH = RO:HA = - 1
4710 F = 0:C% = 0:D% = 0: & S,S$,M$,C%: IF NOT C% THEN IF LEN (S$) > 1 THEN IF RIGHT$ (S$,1) = "S" THEN S$ = LEFT$ (S$, LEN (S$) - 1): GOTO 4710
4715 IF NOT C% THEN RETURN
4720 D% = C%:X = C%: IF M%(X,5) < > HA AND M%(X,5) < > WH THEN 4770
4750 F = F + 1: IF F = 1 THEN M = X
4760 IF S$ = M$(X) THEN M = X: RETURN
4770 & R: IF C% < > D% THEN 4720
4780 RETURN
Artifact search
4800 REM
ARTIF SEARCH
4801 HA = - 1:WH = HA:EM = HA: GOTO 4810
4804 HA = - 1
4805 WH = RO:EM = RO + 200
4810 GOSUB 4600:F = 0:C% = 0:D% = 0: & S,S$,A$,C%: IF NOT C% THEN RETURN
4820 FOR X = 1 TO NA
4830 D% = C%:A2 = A%(C%,4): IF A2 = WH OR A2 = HA OR A2 = EM THEN F = F + 1:A = C%: IF S$ = A$(C%) THEN X = 999: NEXT : RETURN
4850 & R: IF C% < > D% THEN NEXT : RETURN
4860 X = 999: NEXT : IF F > 1 THEN PRINT : PRINT "WHICH "S$" DO YOU WANT?":F = 0: POP : GOTO 99
4870 RETURN
Get S$
4900 REM
GET S$
4905 IF NOT LT THEN POP : GOTO 100
4910 IF S$ = "" THEN PRINT : PRINT C$(C)" WHO OR WHAT";: INPUT S$: GOTO 4900
4920 RETURN
Drop
5000 REM
DROP
5010 GOSUB 4900: IF S$ = "ALL" THEN 5100
5030 GOSUB 4801: IF NOT F THEN 91
5040 WT = WT - A%(A,3):A%(A,4) = RO: PRINT : PRINT A$(A)" DROPPED.": GOSUB 54
5042 IF A = LS THEN LS = 0:LT = NL: PRINT : PRINT "THE "A$(A)" GOES OUT.": GOSUB 54
5050 IF WT > 10 * M%(0,1) THEN PRINT "YOU SUDDENLY FIND YOU CANNOT CARRY ALL OF THE ITEMS YOU ARE CARRYING, AND THEY ALL FALL TO THE GROUND.":L = L + 3: GOTO 5100
5060 IF A = M%(0,8) THEN M%(0,8) = - 1
5070 GOTO 300
5100 GOSUB 51:B% = NA:D% = - 1: FOR A = 1 TO NA:C% = A: & A,D%,A%(C%,4),C%,B%: IF NOT C% THEN A = 999: GOTO 5150
5110 A = C%: PRINT A$(A)" DROPPED.":A%(A,4) = RO: GOSUB 52
5150 NEXT :WT = 0:M%(0,8) = - 1: GOTO 300
Descriptions
Examine
6000 REM
EXAMINE
6010 GOSUB 4900: GOSUB 4804: IF NOT F THEN 6040
6020 IF A%(A,4) = EM THEN A%(A,4) = RO
6032 IF A > NZ THEN PRINT : PRINT "THIS IS YOUR "A$(A)".": GOTO 98
6033 IF A%(A,2) = 8 THEN A%(A,8) = 0
6034 IF A%(A,2) = 6 THEN PRINT " - THERE ARE "A%(A,6)" SWALLOWS LEFT.": GOSUB 56
6035 R = A + 200: GOSUB 45:A%(A,0) = 1: GOTO 300
6040 GOSUB 4700: IF NOT F THEN PRINT : PRINT "YOU SEE NOTHING SPECIAL.": GOTO 98
6050 R = M + 600: GOSUB 45:DF = M: IF M%(M,3) > 1 AND M%(M,13) = 0 THEN PRINT "THEY ARE ";: GOSUB 7652: GOTO 300
6060 DF = M:D2 = 0: GOSUB 7637: GOTO 300
Look
6500 REM
LOOK
6510 V%(RO) = 0: GOTO 300
Combat
Attack
7000 REM
ATTACK
7010 IF M%(0,8) = - 1 THEN PRINT : PRINT "YOU HAVE NO WEAPON READY!": GOTO 100
7020 TA = 0: GOSUB 4900: GOSUB 4700: IF F THEN 7300
7030 HA = RO: GOSUB 4805: IF NOT F THEN 94
7040 IF A%(A,2) < > 8 AND A%(A,2) < > 4 THEN PRINT : PRINT "WHY WOULD YOU DO THAT?": GOTO 99
7050 D = M%(0,9):S = M%(0,10): IF TA = 1 THEN D = 2:S = 5
7060 SX = 7:K = 6: IF A%(A,2) = 4 THEN SX = SX - 1:K = K - 1
7070 D2 = 0: FOR X = 1 TO D:D2 = D2 + RND (1) * S - 1: NEXT :A%(A,SX) = A%(A,SX) - D2: IF A%(A,SX) < 1 THEN A%(A,SX) = 0:A%(A,K) = 0:A%(A,7) = 1: PRINT : PRINT "THE "A$(A)" SHATTERS!": GOTO 98
7075 IF A%(A,2) = 8 THEN A%(A,8) = 0
7080 PRINT : PRINT "WHAM!! YOU "; MID$ ("HITBLAST",TA * 3 + 1,3 + TA * 2);" THE "A$(A);"!": GOTO 98
7300 OF = 0:DF = M: GOSUB 7500: IF NOT HI THEN 7360
7310 IF HI THEN IF UP THEN WA%(W2) = WA%(W2) + 2
7360 IF M%(DF,11) = 1 OR DF = 0 THEN 300
7370 IF M%(DF,11) > 1 THEN M%(DF,11) = 1 + (M%(DF,11) = 3) * 150:R3 = RO: GOSUB 3600: GOTO 300
Pick up weapon
7400 REM
MONS P/U WEAP
7410 M2 = ABS (M%(OF,8) + 1): IF A%(M2,4) = RO THEN 7440
7420 M2 = 0: FOR A = 1 TO NA: IF A%(A,4) = RO THEN IF A%(A,2) = 2 OR A%(A,2) = 3 THEN A2 = A%(A,7) * A%(A,8): IF A2 > M2 THEN M2 = A
7430 NEXT
7440 IF M2 THEN PRINT M$(OF)" PICKS UP "A$(M2)".": PRINT :A%(M2,4) = - OF - 1:M%(OF,8) = M2
7450 GOTO 56
Do battle
7500 REM
DO BATTLE
7505 HI = 0:W = M%(OF,8): IF W < 0 THEN 7400
7507 WM = 50 + 2 * (M%(OF,2) - M%(DF,2) - M%(OF,7) + M%(DF,7)): IF W > 0 THEN WM = WM + A%(W,5) / 2: IF OF = 0 THEN WM = WM + WA%(W2) / 4 + EA
7510 A = A%(W,6) * (W > 0): PRINT M$(OF)" "BV$(A, RND (1) * 3)" AT "M$(DF)
7511 GOSUB 52:RL = 100 * RND (1): IF (RL < 5 OR RL < WM) AND RL < 97 THEN HI = 1: GOTO 7600
7515 A2 = 0: IF M%(DF,8) > 0 THEN A2 = A%(M%(DF,8),6)
7520 IF RL < 97 OR NOT W THEN PRINT " --"RB$(A2, RND (1) * 2)"!": GOTO 56
7525 PRINT " ..A FUMBLE!": GOSUB 52:R = 100 * RND (1): IF R < 41 THEN PRINT " FUMBLE RECOVERED.": GOTO 56
7530 IF R < 81 THEN PRINT " WEAPON DROPPED!":WT = WT - ((OF = 0) * A%(W,3)):A%(W,4) = RO:M%(OF,8) = - OF - 1: GOTO 56
7532 IF A%(W,2) = 3 THEN PRINT "SPARKS FLY FROM "A$(W)"!": GOTO 56
7535 IF R > 95 THEN 7545
7537 IF R < 91 THEN PRINT " WEAPON DAMAGED!":A%(W,8) = A%(W,8) - 1: IF A%(W,8) THEN 56
7540 PRINT " WEAPON BROKEN!":WT = WT - ((OF = 0) * A%(W,3)):A%(W,4) = 0::M%(OF,8) = - 1: IF RND (1) > .5 THEN 54
7545 PRINT " WEAPON HITS USER!": GOSUB 54:DF = OF: ON (R = 100) + 1 GOTO 7605,7610
7600 IF NOT OF THEN UP = (100 * RND (1) > WM + WA%(W2)): IF RND (1) * 100 < WA%(W2) THEN IF ABS (EA) > 10 * RND (1) AND AE < AC * AC THEN AE = AE + 2:EA = AE - AC * AC
7605 D = M%(OF,9):S = M%(OF,10): IF W THEN D = A%(W,7):S = A%(W,8)
7607 A = 1: PRINT MID$ (" ** ++",(DF > 0) * 3 + 1,3);: IF RL > 5 THEN PRINT "A HIT!": GOTO 7633
7610 PRINT "WELL STRUCK!": GOSUB 52:R2 = 100 * RND (1): IF R2 < 51 THEN A = 0: GOTO 7633
7615 RL = 1.5: IF R2 > 85 THEN RL = 2
7620 IF R2 > 95 THEN RL = 3
7625 IF R2 = 100 THEN RL = M%(DF,1)
7630 S = RL * S
7633 GOSUB 52:D2 = 0: FOR D3 = 1 TO D:D2 = D2 + S * RND (1): NEXT :D2 = INT (D2 - A * M%(DF,7)): IF D2 < 1 THEN IF NOT M%(DF,7) THEN PRINT " BLOW TURNED!": GOTO 56
7635 IF D2 < 1 THEN PRINT " BLOW GLANCES OFF ARMOR!": GOTO 56
7636 GOSUB 51
7637 GOSUB 52: IF M%(DF,3) > 1 THEN PRINT "ONE ";
7638 PRINT M$(DF)" IS ";
7640 A = M%(DF,11):F(A) = F(A) + D2:M%(DF,13) = M%(DF,13) + D2: IF M%(DF,13) > = M%(DF,1) THEN 7700
7650 ON M%(DF,13) * 5 / M%(DF,1) + 2 - (M%(DF,13) = 0) GOTO 7652,7655,7660,7665,7670,7675
7652 PRINT "IN PERFECT HEALTH.": GOTO 56
7655 PRINT "OK.": GOTO 56
7660 PRINT "HURT.": GOTO 56
7665 PRINT "BADLY HURT.": GOTO 56
7670 PRINT "GRAVELY INJURED.": GOTO 56
7675 PRINT "DYING.": GOTO 56
7700 REM
MONSTER DIES
7710 PRINT "DEAD!":F(A) = F(A) + M%(DF,1) - M%(DF,13): IF M%(DF,3) > 1 THEN M%(DF,3) = M%(DF,3) - 1:M%(DF,13) = 0: GOTO 56
7720 M%(DF,5) = 0:M%(DF,3) = M%(DF,12): FOR A2 = 1 TO NA: IF A%(A2,4) = - DF - 1 THEN A%(A2,4) = RO
7730 NEXT :M%(DF,8) = - 1
7735 REM A%(DF+X-1,4)=RO:REMREPLACE 'X' WITH ART. # OF FIRST DEAD MONS. IF YOU ARE USING DEAD MONS.
7740 IF DF = 0 THEN DI = 1: POP : GOTO 32000
7750 IF F(1) = > T(1) THEN T(1) = 0
7900 GOTO 56
Flee
8000 REM
FLEE
8010 IF NOT T(1) THEN PRINT : PRINT "THERE'S NOTHING TO FLEE FROM!": PRINT : GOTO 100
8020 IF NX = 0 THEN PRINT : PRINT "THERE'S NO PLACE TO GO!": GOTO 100
8030 IF S$ = "" THEN 8500
8040 SL = LEN (S$): FOR X = 1 TO ND: IF S$ = LEFT$ (C$(X),SL) THEN D = X:X = 99
8050 NEXT : GOTO 3030
8500 R2 = RD%(ND * RND (1) + 1): IF R2 < 1 OR R2 > NR THEN 8500
8510 GOTO 3500
Give
9000 REM
GIVE
9010 IF S$ THEN Q$ = " TO ":Q = 4: GOSUB 9800
9040 IF A$ = "" THEN INPUT "GIVE WHAT?";A$
9050 IF VAL (A$) = 0 THEN S$ = A$: GOSUB 4801: IF NOT F THEN 91
9060 IF B$ = "" THEN INPUT "TO WHOM?";B$
9070 S$ = B$: GOSUB 4700: IF NOT F THEN 96
9080 PRINT : PRINT "OKAY.": IF VAL (A$) > 0 THEN 9500
9090 IF A = M%(0,8) THEN M%(0,8) = - 1
9095 IF A%(A,2) = 6 THEN IF M%(M,13) AND A%(A,6) AND A%(A,7) THEN 9300
9100 WT = WT - A%(A,3):A%(A,4) = - M - 1
9110 IF M%(M,8) < 0 THEN IF A%(A,2) = 2 OR A%(A,2) = 3 THEN M%(M,8) = A
9115 IF M%(M,11) < 3 THEN M%(M,11) = 100 + M%(M,11) * (30 + A%(A,1) / 100)
9120 R3 = RO: GOSUB 3600: GOTO 5050
9300 PRINT : PRINT M$(M)" DRINKS THE "A$(A): PRINT " THEN RETURNS IT TO YOU.":L = L + 3: GOSUB 51: IF M%(M,11) < 3 THEN M%(M,11) = 140 + 60 * M%(M,13) / M%(M,1):A%(A,6) = A%(A,6) - 1
9320 M%(M,13) = M%(M,13) - A%(A,5):M%(M,13) = M%(M,13) * (M%(M,13) > 0):DF = M:D2 = 0: GOSUB 7637: GOTO 9120
9500 SL = VAL (A$): IF SL > GO THEN 91
9540 GO = GO - SL: IF M%(M,11) < 3 THEN M%(M,11) = 101 + M%(M,11) * SL / 100
9550 GOTO 9120
Parse
9800 REM
PARSE
9810 A$ = "":B$ = "": FOR X = 1 TO LEN (S$): IF MID$ (S$,X,Q) = Q$ AND X > 2 THEN B$ = MID$ (S$,X + Q):A$ = LEFT$ (S$,X - 1):X = 999
9820 NEXT : RETURN
Inventory
10000 REM
INVEN
10010 IF S$ = "" THEN M = 0:X = - 999: GOTO 10060
10020 IF NOT LT THEN 100
10030 GOSUB 4700: IF NOT F THEN 96
10040 IF M%(M,11) < > 3 THEN FOR M = M TO M: GOTO 15030
10050 X = - M - 1: GOTO 10100
10060 M2 = 0:B% = NA:D% = - 999: FOR A = 1 TO NA:C% = A: & A,D%,A%(C%,4),C%,B%: IF NOT C% THEN A = 999: GOTO 10090
10070 IF NOT M2 THEN M2 = 1: PRINT : PRINT M$(M)" IS WEARING:": GOSUB 54
10080 A = C%: PRINT " "A$(A)
10090 NEXT :X = - 1
10100 PRINT : PRINT M$(M)" IS CARRYING:": GOSUB 54
10110 LK = 0:B% = NA:D% = X: FOR A = 1 TO NA:C% = A: & A,D%,A%(C%,4),C%,B%: IF NOT C% THEN A = 999: GOTO 10130
10120 LK = 1:A = C%: PRINT " "A$(A);: IF A = M%(M,8) THEN PRINT " (READY WEAPON)";
10130 GOSUB 51: NEXT : IF NOT LK THEN PRINT " (NOTHING)": GOSUB 51
10140 IF NOT M THEN PRINT " ";GO;" GOLD PIECES.": GOSUB 54:DF = M:D2 = 0: GOSUB 7638
10150 GOTO 300
Magic spells
Blast
11000 REM
BLAST
11010 S = 0: GOSUB 11500: GOSUB 4900: GOSUB 4700: IF NOT F THEN TA = 1: GOTO 7030
11050 PRINT : PRINT "DIRECT HIT!": PRINT :L = L + 3:S = 5:D = 2:DF = M:A = 0: GOSUB 7635: PRINT : GOTO 300
11500 SU = 0: IF SA%(S) THEN RL = 100 * RND (1):SU = (((RL < S2%(S)) OR (RL < 5)) AND (RL < 95))
11505 IF RL = 100 THEN PRINT : PRINT "SPELL BACKLASH!! YOUR ABILITY TO CAST THIS SPELL TEMPORARILY DIMINISHES!":S2%(S) = S2%(S) / 10: POP : GOTO 98
11510 IF NOT SU THEN PRINT : PRINT "NOTHING HAPPENED.": POP : GOTO 98
11520 RL = 100 * RND (1): IF RL > S2%(S) THEN S2%(S) = S2%(S) + 2:SA%(S) = SA%(S) + 2
11530 S2%(S) = S2%(S) * .8
11540 RETURN
Heal
12000 REM
HEAL
12010 S = 1: GOSUB 11500:M = 0: IF S$ < > "" THEN GOSUB 4700
12040 GOSUB 56: IF M%(M,13) THEN PRINT M$(M)"'S HEALTH IMPROVES!"
12050 M%(M,13) = M%(M,13) - 3 - 10 * RND (1): IF M%(M,13) < 0 THEN M%(M,13) = 0
12060 DF = M:D2 = 0: GOSUB 7637: GOTO 300
Power
13000 REM
POWER
13010 S = 3: GOSUB 11500:RL = RND (1) * 100: IF RL < 11 AND M%(0,13) THEN PRINT : PRINT "YOUR WOUNDS HEAL!":M%(0,13) = 0: GOTO 98
13050 IF RL < 91 THEN PRINT : PRINT "YOU HEAR A VERY LOUD SONIC BOOM": PRINT " THAT ECHOES THROUGH THE TUNNELS.": PRINT : GOSUB 52: GOTO 98
13070 FOR M = 1 TO NM: IF M%(M,5) = RO THEN PRINT M$(M)" HEALS!": GOSUB 51:M%(M,13) = 0
13080 NEXT :R3 = RO: GOSUB 3600: GOTO 300
Speed
14000 REM
SPEED
14010 S = 2: GOSUB 11500
14020 IF SP THEN PRINT : PRINT "NOTHING HAPPENED": GOTO 98
14040 M%(0,2) = M%(0,2) * 2:SP = SP + 25 * RND (1) + 10: PRINT : PRINT "YOUR MOVEMENTS QUICKEN!": GOTO 98
Other commands
Smile
15000 REM
SMILE
15005 IF NOT LT THEN 100
15010 PRINT : FOR M = 1 TO NM: IF M%(M,5) < > RO THEN NEXT : GOTO 300
15030 GOSUB 52: PRINT M$(M);: IF M%(M,3) > 1 THEN PRINT "S";
15040 PRINT " "SM$(M%(M,11));: IF M%(M,3) = 1 THEN PRINT "S";
15050 PRINT " AT YOU."
15100 NEXT : GOSUB 51: GOTO 300
Say
16000 REM
SAY
16010 GOSUB 4900
16900 PRINT : PRINT "OKAY, " CHR$ (34)S$ CHR$ (34): PRINT : GOTO 98
Ready
17000 REM
READY
17010 GOSUB 4900: GOSUB 4801: IF NOT F THEN 91
17030 IF A%(A,2) < 2 OR A%(A,2) > 3 THEN PRINT : PRINT "THAT ISN'T A WEAPON!": GOTO 99
17100 M%(0,8) = A:M%(0,9) = A%(A,7):M%(0,10) = A%(A,8):W2 = A%(A,6): PRINT : PRINT A$(A)" READIED.": GOTO 98
Save
18000 REM
SAVE
18010 PRINT : PRINT "DO YOU WANT TO SAVE THIS GAME? ": PRINT "(Y/N) :";
18020 GET A$: IF A$ < > "Y" AND A$ < > "N" THEN 18020
18030 PRINT A$: IF A$ = "N" THEN 100
18040 PRINT D$"CLOSE":X = FRE (0): PRINT D$"BSAVE GAME.PTRS,A$69,L8"
18060 PRINT D$"BSAVE GAME.SVAR,A" PEEK (105) + PEEK (106) * 256",L" PEEK (109) + PEEK (110) * 256 - PEEK (105) - PEEK (106) * 256 + 1
18070 PRINT D$"BSAVE GAME.STR,A" PEEK (111) + PEEK (112) * 256",L" PEEK (115) + PEEK (116) * 256 - PEEK (111) - PEEK (112) * 256 + 1
18080 PRINT : PRINT "THE GAME IS NOW SAVED. YOU CAN BOOT THISDISKETTE, OR RUN THE PROGRAM 'MAIN PGM' TO RESTART THE GAME."
18090 PRINT : PRINT : INPUT "RESUME PLAY? ";A$: IF LEFT$ (A$,1) < > "N" THEN 29060
18100 END
Light
19000 REM
LIGHT
19010 GOSUB 4910: GOSUB 4801: IF NOT F THEN 91
19040 PRINT :LT = NL: IF A%(A,2) < > 5 OR A%(A,5) < 1 THEN PRINT "IT WON'T LIGHT!": GOTO 98
19050 LT = 1:LS = A: PRINT "YOU'VE MANAGED TO LIGHT THE "A$(A)".": GOTO 98
Open
20000 REM
OPEN
20010 GOSUB 4900: GOSUB 4804: IF NOT F THEN 20060
20020 IF A%(A,4) = RO + 200 THEN A%(A,4) = RO
20030 GOSUB 51:X = A%(A,2): IF X = 4 OR X = 6 OR X = 7 THEN 20100
20050 IF X = 8 THEN 20300
20060 IF S$ = "DOOR" OR S$ = "GATE" THEN PRINT "TRY GOING IN THAT DIRECTION.": GOTO 99
20070 PRINT "IT WON'T OPEN.": GOTO 99
20100 REM
OPENABLE
20110 IF A%(A,7) THEN IF X = 6 OR X = 7 THEN PRINT : PRINT "IT IS ALREADY OPEN.": GOTO 98
20120 IF X = 4 THEN A%(A,8) = 0: IF A%(A,5) AND A%(A%(A,5),4) < > - 1 THEN PRINT "IT'S LOCKED!": GOTO 99
20130 A%(A,7) = 1: PRINT : PRINT "OPENED.": IF X = 6 OR X = 7 THEN GOTO 98
20200 REM
CONT.
20220 GOSUB 54:LK = 0: FOR X = 1 TO NA: IF A%(X,4) = A + 500 THEN A%(X,4) = RO:LK = 1
20230 NEXT : PRINT "YOU FIND " MID$ ("NOSOME",LK * 2 + 1,2 + 2 * LK)"THING INSIDE.": GOTO 98
20300 REM
DOOR
20310 IF A%(A,6) > 0 THEN IF A%(A%(A,6),4) < > - 1 THEN PRINT "IT'S LOCKED!": GOTO 99
20330 A%(A,8) = 0:A%(A,6) = 0:A%(A,4) = RO: PRINT "YOU'VE OPENED THE "A$(A)".": FOR X = 1 TO ND: IF RD%(X) = A + 500 THEN RD%(X) = A%(A,5)
20340 NEXT : GOTO 98
Put
21000 REM
PUT
21010 IF S$ THEN Q$ = " IN ":Q = 4: GOSUB 9800: IF A$ = "" THEN Q$ = " ON ":Q = 4: GOSUB 9800
21040 IF A$ = "" THEN PRINT : INPUT "PUT WHAT?";A$: INPUT "PUT IN/ON WHAT?";B$
21100 S$ = A$:M = 0: GOSUB 4804: IF NOT F THEN 21150
21110 Z = A:S$ = B$: GOSUB 4804: IF A = Z OR NOT F THEN 21150
21120 IF A%(A,2) < > 4 THEN 21150
21130 IF NOT A%(A,7) THEN 92
21140 A%(Z,4) = A + 500: PRINT : PRINT "OKAY.": GOTO 98
21150 PRINT : PRINT "YOU CAN'T DO THAT.": GOTO 98
Drink
22000 REM
DRINK
22010 GOSUB 4900: GOSUB 4804: IF NOT F THEN 94
22020 IF A%(A,2) < > 6 THEN 94
22030 IF NOT A%(A,7) THEN 92
22110 IF A%(A,6) < 1 THEN PRINT : PRINT "THERE'S NONE LEFT.": GOTO 98
22130 A%(A,6) = A%(A,6) - 1:M%(0,13) = M%(0,13) - A%(A,5): PRINT : PRINT "YOU FEEL " MID$ ("BETTERWORSE",(A%(A,5) < 0) * 6 + 1,6)"!": IF M%(0,13) < 0 THEN M%(0,13) = 0
22140 GOSUB 54:DF = 0:D2 = 0: GOSUB 7638
22190 GOTO 300
Read
23000 REM
READ
23010 GOSUB 4900: GOSUB 4804: IF NOT F THEN 94
23020 IF A%(A,2) < > 7 THEN 94
23030 IF NOT A%(A,7) THEN 92
23040 PRINT : PRINT "IT SAYS:":L = L + 2
23210 PRINT : FOR X = 1 TO A%(A,6):R = A%(A,5) + 399 + X: GOSUB 45: NEXT : GOTO 300
Free
24000 REM
FREE
24010 GOSUB 4900: GOSUB 4804: IF NOT F THEN 94
24020 IF A%(A,2) < > 10 THEN 94
24030 M = A%(A,5):K = A%(A,6):G = A%(A,7)
24120 IF M%(G,5) = RO THEN PRINT : PRINT M$(G)" WON'T LET YOU DO THAT!": GOTO 98
24130 IF A%(K,4) < > - 1 AND K < > 0 THEN PRINT : PRINT "YOU DON'T HAVE THE KEY!": GOTO 100
24150 PRINT : PRINT "YOU HAVE FREED "M$(M)".":M%(M,5) = RO:A%(A,4) = 0:R3 = RO: GOSUB 3600: GOTO 98
Request
25000 REM
REQUEST
25010 IF S$ THEN Q$ = " FROM ":Q = 6: GOSUB 9800
25040 IF A$ = "" THEN GOSUB 4900:A$ = S$: INPUT "FROM WHOM?";B$
25050 S$ = B$: GOSUB 4700: IF NOT F THEN 96
25060 IF M%(M,11) < 2 THEN FOR M = M TO M: GOTO 15030
25070 S$ = A$:HA = ( - M - 1):WH = HA:EM = HA: GOSUB 4810: IF NOT F THEN PRINT : PRINT M$(M)" DOESN'T HAVE IT.": GOTO 98
25080 PRINT : PRINT "OKAY.": GOSUB 54:A%(A,4) = - 1:WT = WT + A%(A,3): IF A = M%(M,8) THEN M%(M,8) = - M - 1
25090 GOTO 5050
Wear
26000 REM
WEAR
26010 GOSUB 4900:HA = - 1:WH = RO:EM = - 999: GOSUB 4810: IF NOT F THEN 94
26015 IF A%(A,4) = EM THEN 26100
26020 IF A%(A,2) < > 11 THEN 94
26030 IF NOT A%(A,5) THEN 26080
26040 IF A%(A,5) = 1 AND SH THEN 26100
26050 IF A%(A,5) = 1 THEN SH = A:M%(0,7) = M%(0,7) + 1: GOTO 26080
26060 IF AR THEN 26100
26070 AR = A:M%(0,7) = M%(0,7) + AC / 2
26080 A%(A,4) = - 999: PRINT : PRINT A$(A)" WORN.": GOTO 98
26100 PRINT : PRINT "YOU'RE ALREADY WEARING ONE!": GOTO 98
Remove
27000 REM
REMOVE
27010 GOSUB 4900:HA = - 999:EM = HA:WH = HA: GOSUB 4810: IF NOT F THEN PRINT : PRINT "YOU AREN'T WEARING IT.": GOTO 99
27020 IF A = SH THEN M%(0,7) = M%(0,7) - 1:SH = 0
27030 IF A = AR THEN M%(0,7) = M%(0,7) - A%(A,5) / 2:AR = 0
27040 A%(A,4) = - 1: PRINT : PRINT A$(A)" REMOVED.": GOTO 98
Use
28000 REM
USE
28010 REM ///INSERT YOUR OWN SPECIAL STUFF HERE
28900 PRINT : PRINT "TRY ANOTHER COMMAND.": GOTO 98
Resume game
29000 REM
RESUME GAME
29005 POKE 216,0
29010 PRINT : PRINT "DO YOU WANT TO RESUME THE SAVED GAME?": PRINT " Y OR N:";
29020 GET A$: IF A$ < > "Y" AND A$ < > "N" THEN 29020
29030 PRINT A$: IF A$ = "N" THEN PRINT D$"DELETE GAME.PTRS": PRINT D$"DELETE GAME.SVAR": PRINT D$"DELETE GAME.STR": RUN
29040 PRINT CHR$ (4)"BLOAD GAME.PTRS": PRINT CHR$ (4)"BLOAD GAME.SVAR": PRINT CHR$ (4)"BLOAD GAME.STR"
29050 PRINT CHR$ (26)"1": PRINT CHR$ (21): HOME : IF CP = 80 THEN PRINT D$;"PR#3": PRINT CHR$ (12): HOME
29060 PRINT D$"OPEN"ED$",L242": PRINT D$"OPEN"ER$",L"LR
29070 F = 0:A$ = "":CZ$ = "": GOTO 100
Initialize
31000 REM
INIT
31005 ER$ = "EAMON.ROOMS":ED$ = "EAMON.DESC"
31010 POKE 216,0: PRINT D$"OPEN"ED$: PRINT D$"READ"ED$: INPUT NR,NZ,NE,NM,LR,LM,LA: PRINT D$"CLOSE"
31015 NA = NZ + 6: DIM A$(NA),A%(NA,8),M$(NM),M%(NM,13),V%(NR),SA%(3),S2%(3),SM$(3),BV$(5,2),RB$(5,1),WA%(5)
31020 PRINT D$"OPEN EAMON.ARTIFACTS,L"LA: FOR A = 1 TO NZ: PRINT D$"READ EAMON.ARTIFACTS,R"A: INPUT A$(A): FOR A2 = 1 TO 8: INPUT A%(A,A2): NEXT
31030 NEXT : PRINT D$"OPEN EAMON.MONSTERS,L"LM: FOR A = 1 TO NM: PRINT D$;"READ EAMON.MONSTERS,R"A: INPUT M$(A): FOR A2 = 1 TO 11: INPUT M%(A,A2)
31035 NEXT :M%(A,12) = M%(A,3):M = M%(A,6) * M%(A,3):M%(A,6) = 31000: IF M < M%(A,6) THEN M%(A,6) = M
31038 NEXT
31039 REM GOTO 33500:REMFAST.START
31040 PRINT D$"OPEN FRESH MEAT": PRINT D$"READ FRESH MEAT": INPUT RE: INPUT M$(0),M%(0,1),M%(0,2),CH: FOR A = 0 TO 3: INPUT SA%(A):S2%(A) = SA%(A): NEXT : FOR A = 1 TO 5: INPUT WA%(A): NEXT : INPUT AE,SE$,GO,BA,AC
31050 NA = NZ: FOR A = NZ + 1 TO NZ + 4: INPUT A$(A),A%(A,6),A%(A,5),A%(A,7),A%(A,8)
31052 IF A$(A) < > "NONE" THEN NA = NA + 1:A%(A,2) = 2 + (A%(A,7) * A%(A,8) > 25):A%(A,3) = 2:A%(A,4) = - 1:WT = WT + 2
31054 NEXT : PRINT D$"CLOSE"
31055 REM ?D$"DELETE FRESH MEAT"
31060 PRINT D$"OPEN"ED$",L242": PRINT D$"OPEN"ER$",L";LR:M%(0,8) = NZ + 1:M%(0,9) = A%(NZ + 1,7):M%(0,10) = A%(NZ + 1,8)
31080 FOR W2 = NZ + 1 TO NA
31090 FOR A = 1 TO NZ: IF A$(A) = A$(W2) THEN A$(A) = A$(A) + "#":A = 999: NEXT : GOTO 31090
31100 NEXT : NEXT :B% = AC / 2: IF B% THEN NA = NA + 1:AR = NA:A$(NA) = MID$ ("LEATHER CHAIN MAIL PLATE ARMOR",B% * 11 - 10,7 + 3 * (B% > 1) + B%( > 2)):A%(NA,2) = 11:A%(NA,3) = B% * 7:A%(NA,4) = - 999:WT = WT + B% * 7:A%(NA,5) = B% * 2
31110 SH = ( INT (AC / 2) < > AC / 2): IF SH THEN NA = NA + 1:SH = NA:A$(NA) = "SHIELD":A%(NA,2) = 11:A%(NA,3) = 10:A%(NA,4) = - 999:WT = WT + 10:A%(NA,5) = 1
31111 M%(0,7) = B% + (SH > 0):M%(0,11) = 3
31120 EA = 0: IF AE < AC * AC THEN EA = AE - AC * AC
31130 READ NC: DIM C$(NC + 3): FOR C = 1 TO NC: READ C$(C): NEXT :CC = INT (NC / 3) + 1:R2 = 1
31140 W2 = 0:RO = 1:ND = 6:FF$ = CHR$ (12)
31410 FOR A = 1 TO 3: READ SM$(A): NEXT
31420 FOR A = 0 TO 5: FOR A2 = 0 TO 2: READ BV$(A,A2): NEXT : NEXT : FOR A = 0 TO 5: FOR A2 = 0 TO 1: READ RB$(A,A2): NEXT : NEXT
31430 L = 50:CP = PEEK (768): IF CP < > 80 THEN CP = 40
31440 W2 = A%(M%(0,8),6)
31900 GOTO 3500
31910 DATA 32
31920 DATA NORTH,SOUTH,EAST,WEST,UP,DOWN,GET,DROP,LOOK,EXAMINE,ATTACK,FLEE,GIVE,INVENTORY,BLAST,HEAL,POWER,SPEED,SMILE,SAY,READ,READY,SAVE,LIGHT,OPEN,PUT,DRINK,FREE,REQUEST,WEAR,REMOVE,USE
31930 REM (INSERT ADDITIONAL COMMANDS HERE)
31940 DATA GROWL,LOOK,SMILE
31945 DATA LUNGES,TEARS,CLAWS,SWINGS,CHOPS,SWINGS,SHOOTS,SHOOTS,SHOOTS,SWINGS,SWINGS,SWINGS,STABS,LUNGES,JABS,SWINGS,CHOPS,STABS
31950 DATA MISSED,MISSED,PARRIED,MISSED,MISSED,MISSED,PARRIED,MISSED,PARRIED,MISSED,PARRIED,MISSED
Closing routines
32000 REM
DONE
32010 PRINT : POKE - 16368,0: GOSUB 59: PRINT
32020 PRINT D$"CLOSE": IF SP THEN M%(0,2) = M%(0,2) / 2
32030 IF DI THEN 32500
32040 DIM WP%(NA),WP$(NA): FOR W = 1 TO 4:WP$(W) = "NONE": NEXT :W2 = 0: FOR A = 1 TO NA: IF A%(A,4) = - 1 THEN IF A%(A,2) = 2 OR A%(A,2) = 3 THEN W2 = W2 + 1:WP$(W2) = A$(A):WP%(W2) = A:A%(A,4) = 0
32050 NEXT : IF W2 < 5 THEN 32300
32060 PRINT FF$: HOME : PRINT "AS YOU ENTER THE MAIN HALL, LORD WILLIAM CRANKHANDLE APPROACHES AND SAYS, 'YOU HAVE TOO MANY WEAPONS -- 4 IS THE LEGAL LIMIT.": PRINT : PRINT "YOUR WEAPONS ARE:"
32070 FOR W = 1 TO W2: PRINT SPC( 4);W;"--";WP$(W): NEXT : PRINT : PRINT "ENTER THE NUMBER OF THE WEAPON TO SELL (1-";W2;") "
32080 VTAB PEEK (37) + 1: INPUT A$:W5 = VAL (A$): IF W5 < 1 OR W5 > W2 THEN 32080
32090 A%(WP%(W5),4) = - 1:WP$(W5) = WP$(W2):WP%(W5) = WP%(W2):W2 = W2 - 1: IF W2 > 4 THEN 32060
32300 DIM WD%(4,4): FOR W = 1 TO 4: IF WP%(W) THEN A = WP%(W):WD%(W,1) = A%(A,6):WD%(W,2) = A%(A,5):WD%(W,3) = A%(A,7):WD%(W,4) = A%(A,8):A%(A,4) = 0
32310 NEXT : PRINT FF$: HOME : PRINT " YOU SELL YOUR GOODS TO THE LOCAL BUYER OF TREASURE (UNDER THE SIGN OF 3 BALLS). HE PAYS YOU ";
32315 A%(SH,4) = 0:A%(AR,4) = 0
32320 TP = 0: FOR A = 1 TO NA: IF A%(A,4) = - 1 THEN TP = TP + A%(A,1) * ((A%(A,2) < > 0) * CH / 10 + (A%(A,2) = 0))
32350 NEXT :TP = INT (TP): PRINT TP;" GOLD PIECES.": PRINT
32360 GO = GO + TP: IF GO < 0 THEN GO = 0
32370 PRINT : GOSUB 59: PRINT
32500 ONERR GOTO 32510
32505 PRINT CHR$ (26)"1": REM TURN OFF VIDEX 80-COL
32506 PRINT CHR$ (21): REM TURN OFF //E 80-COL
32510 HOME : VTAB 5: PRINT "(INSERT EAMON MASTER DISKETTE, THEN": PRINT " HIT THE 'C' KEY) ";: POKE - 16368,0
32520 GET A$: IF A$ < > "C" THEN 32520
32530 PRINT A$
32540 IF DI THEN PRINT D$"OPEN THE ADVENTURER": PRINT D$"DELETE THE ADVENTURER": GOTO 32900
32550 PRINT D$"OPEN CHARACTERS,L150": PRINT D$"WRITE CHARACTERS,R";RE: PRINT M$(0): PRINT M%(0,1): PRINT M%(0,2): PRINT CH: FOR A = 0 TO 3: PRINT SA%(A): NEXT
32555 AC = M%(0,7) * 2: IF SH THEN AC = AC - 1
32560 FOR A = 1 TO 5: PRINT WA%(A): NEXT : PRINT AE: PRINT SE$: PRINT GO: PRINT BA: PRINT AC: FOR A = 1 TO 4: PRINT WP$(A): FOR M = 1 TO 4: PRINT WD%(A,M): NEXT : NEXT
32570 PRINT D$"OPEN THE ADVENTURER": PRINT D$"WRITE THE ADVENTURER": PRINT M$(0): PRINT RE: PRINT D$"CLOSE"
32900 PRINT D$"RUN MAIN HALL"
Fast start
33000 REM
FAST START
33005 HM = PEEK (115) + PEEK (116) * 256:A = HM - 290:A2 = INT (A / 256): POKE 1014,A + 1 - A2 * 256: POKE 1015,A2: HIMEM: A:D$ = CHR$ (4): PRINT D$"BLOAD EAMON 7.1 SEARCH ROUTINE,A"A + 1
33010 ONERR GOTO 33020
33015 PRINT D$"VERIFY GAME.PTRS": GOTO 29000
33020 ONERR GOTO 31000
33025 PRINT D$"VERIFY FS.PARMS": PRINT D$"OPEN FS.PARMS": PRINT D$"READ FS.PARMS": INPUT A: INPUT B: PRINT D$"CLOSE"
33030 IF PEEK (105) + PEEK (106) * 256 = A AND PEEK (115) + PEEK (116) * 256 = B THEN PRINT CHR$ (4)"BLOAD FS.PTRS": PRINT CHR$ (4)"BLOAD FS.SVAR": PRINT CHR$ (4)"BLOAD FS.STR": POKE 216,0: GOTO 31040
33035 PRINT CHR$ (4)"DELETE FS.PARMS": GOTO 31000
33500 X = FRE (0):A = PEEK (105) + PEEK (106) * 256:M = PEEK (115) + PEEK (116) * 256: PRINT D$"OPEN FS.PARMS": PRINT D$"WRITE FS.PARMS": PRINT A: PRINT M: PRINT D$"CLOSE"
33510 PRINT D$"BSAVE FS.PTRS,A$69,L8"
33520 PRINT D$"BSAVE FS.SVAR,A"A",L" PEEK (109) + PEEK (110) * 256 - A + 1
33530 PRINT D$"BSAVE FS.STR,A" PEEK (111) + PEEK (112) * 256",L"M - PEEK (111) - PEEK (112) * 256 + 1
33540 GOTO 31040
Variables
Per the revised Eamon Dungeon Designer's Manual, the following are the variables used throughout the Main Program:
Variable | Description |
---|---|
A%(x,y)
|
Artifact data. x is the artifact number and y is one of the following:
|
AC
|
Armor. Initialized on line 32555. |
AR
|
Armor worn |
AE
|
Armor expertise |
A$(*)
|
Artifact names |
BA
|
Gold in bank |
BV$(*)
|
Battle verbs |
C
|
Number of command given |
C$(*)
|
Valid commands |
CH
|
Charisma |
CP
|
Columns (40 or 80) |
CZ$
|
Last command |
D2
|
Damage to defender |
DF
|
Defender |
Dl
|
1=Adventurer died |
D$
|
Control-D. Whenever the program runs a disk command, DOS requires that it be preceded by Control-D, invoked using CHR$(4) . Initialized on line 33005.
|
EA
|
Player armor factor |
ED$
|
"EAMON.DESC" |
ER$
|
"EAMON.ROOMS" |
F
|
"Found" flag used by search routines |
F(*)
|
Damage to each side in combat |
Fl , F2
|
Top of free memory |
FR
|
Fumble roll/friend rating |
GO
|
Player's gold |
HI
|
Hit in combat |
L
|
Line counter for screen pause |
LA
|
Record length of EAMON.ARTIFACTS |
LM
|
Record length of EAMON.MONSTERS |
LR
|
Record length of EAMON.ROOMS |
LL
|
String length |
LS
|
Artifact number of current light source |
LT
|
Light level of room (includes artificial light) |
M%(x,y)
|
Monster data: "x" is monster number, 2nd is:
|
M$(*)
|
Monster names |
MC
|
Counter for group monsters in battle |
MR%
|
Monster morale |
NA
|
Number of artifacts |
NC
|
Number of commands |
NE
|
Number of effects |
NL
|
Natural light level of room |
NM
|
Number of monsters |
NR
|
Number of rooms |
NW
|
Number of weapons |
NZ
|
Number of artifacts in EAMON.ARTIFACTS |
OF
|
Attacker |
R2
|
Room being moved to |
R3
|
Room just exited |
RB$(*)
|
Battle response verbs |
RD%(*)
|
Room connections |
RE
|
Adventurer record in char file on Master disk |
RL
|
Random number from 1 to 100 |
RN$
|
Name of current room |
RO
|
Number of room the adventurer is in |
S$
|
Object of command |
S2%(*)
|
Current spell ability |
SA%(*)
|
Total spell ability |
SE$
|
Sex (M/F) |
SH
|
Shield worn |
SL
|
String length |
SM$(*)
|
Smile verbs |
SP
|
Counter for speed spell |
SU
|
Spell succeeded |
SY
|
Artifact number of synonym match |
SY$
|
Synonym |
T(*)
|
Hardiness of each side in combat |
TP
|
Value of loot |
UP
|
Logical flag if weapon ability up |
V$
|
Verb of command |
V%(*)
|
Flag to print room description |
WA%(*)
|
Adventurer's weapon ability |
WA$(*)
|
Adventurer's weapons (exiting program) |
WD%(*,*)
|
Weapon data (exiting program) |
WP%(*)
|
Weapon pointer (exiting program) |
WT
|
Weight adventurer is carrying |
External links
- Main Program Tour at eamonag.org
- Peeks, Pokes, and Pointers by the Beagle Bros.
- Applesoft BASIC quick reference