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
Here the program handles commands entered by the player. It first asks for a command and strips leading spaces. On 230 it checks if the command is just a RETURN; if it is, the last command (if any) is repeated. On 240 it then finds the end of the first word of the command, then on 250 assigns a command verb ($V) and object (S$). Line 260 strips off any leading spaces.
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
Next it checks whether the verb matches a direction command (N,S,E,W,U,D), and if not checks for a match to any others in the command list. If no match to any command is found, it prints the command list and jumps back to the command entry routine.
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
This block checks for enemies and handles whether the program should proceed to the battle routine.
It begins by seeing if any enemies are present; if not, it exits the routine. It then finds all the monsters, skipping any that are neutral. Lines 333 and 334 check a singular monster's courage level and determines whether it flees the room. Lines 335 and 336 do the same for group-monsters, determining if member(s) flee.
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
Next on 340 the program checks whether there's a monster-group with more than eight members, and if there is limits the number of combat rounds to eight. (Tom Zuchowski notes here that this is "on the theory that a max of eight monsters could get in a hit in one round.")
Line 350 assigns a monster as the attacker (OF) and determines if the attacker is a friend. If it is, we jump to line 400. If not, line 360 checks if the attacker is the only enemy in the room, and 370-380 finds a friendly defender (DF) for attack (which if found jumps us to 480).
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
The final section (400-430) finds an enemy defender for attack, and the program then proceeds to the DO BATTLE routine at 7500.
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