REM Wizard's Castle
REM
REM By Joseph R. Power
REM
REM Recreational Computing Magazine, July 1980
REM
REM https://archive.org/details/1980-07-recreational-computing/page/n9
REM
REM Entered and commented by Brian "Beej Jorgensen" Hall <beej@beej.us>
REM
REM CAVEAT: This code has never been run. It has, however, been
REM extensively cross-checked with the other source, castle.bas,
REM and with the article.
REM Subroutine Index
REM
REM 2800: Take damage (exploding chests, monster hits)
REM 2840: Game over
REM 3200: Choose a random X,Y for a given Z until you find an empty room. Set that room to Q.
REM 3270: Print a horizontal rule of 64 `*`s
REM 3280: Print "YOUR CHOICE", input a string, return leftmost character in O$
REM 3290: Input a string, return the leftmost character in O$
REM 3300: Ask how many points to add to Z$. Sanitize input and make sure enough OT is left. Return result in Q.
REM 3350: Input a number from 1-8.
REM 3370: Prompt to purchase stat
REM 3380: Your Z$ (stat) is now Q
REM 3390: Prints "Here is a list of $Z you can buy"
REM 3400: Pretty print location X, Y, Z
REM No idea what this magic number does
10 REM "_(C2SLFF4
REM C$ names of all the castle contents
REM I$ abbreviations for all the possible castle contents
REM R$ names of the 4 races
REM W$ names of 4 weapons and 4 armor types
REM E$ names of the 8 recipes (for Orc Tacos, etc.)
20 CLEAR 60: DIM C$(34), I$(34), R$(4), W$(8), E$(8)
REM C location and status of the curses
REM T status flags of the treasures (1 = player owns)
REM O location of the Orb of Zot
REM R location of the Runestaff
30 DIM C(3,4), T(8), O(3), R(3): PRINT CHR$(12); "Creating Arrays"
REM Call machine code to get something for random seed??
40 POKE 260,218: POKE 261,1: T = USR(0): T = PEEK(-2049)
REM FND computes room location in memory
REM FNE tags a room as explored
50 DEF FND(Q) = Q*64 + X*8 + Y - 585 : DEF FNE(Q) = Q + 100 * (Q > 99)
REM CHR$(13) is newline
60 Y$ = CHR$(13) + "** ANSWER YES OR NO " + CHR$(13)
REM FNA produces a random number from 1 to Q
REM FNB causes wraparound at borders
70 DEF FNA(Q) = 1 + INT(RND(8)*Q): DEF FNB(Q) = Q + 8 * ((Q=9)-(Q=0))
REM Seed random number with time??
REM Read in names of castle contents and abbreviations for castle contents
80 Q = RND(-(2*T+1)): RESTORE: FOR Q = 1 TO 34: READ C$(Q), I$(Q): NEXT Q
REM Store unexplored empty rooms (101) for all locations
REM Read in the names of the 4 weapons and 4 armors, and 8 recipes
90 FOR Q = -512 TO 0: POKE Q, 101: NEXT Q: FOR Q = 1 TO 8: READ W$(Q), E$(Q): NEXT Q
REM Read in names of 4 races
REM FNC Limits Q to a max of 18
100 FOR Q = 1 TO 4: READ R$(Q): NEXT Q: DEF FNC(Q) = -Q * (Q < 19) - 18 * (Q > 18)
REM CHR$(12) clear screen
REM 3270 Print a horizontal rule of 64 *s
110 PRINT CHR$(12): GOSUB 3270: PRINT TAB(21) "THE WIZARD'S CASTLE": PRINT: GOSUB 3270
120 PRINT "Copyright (C) 1980 by Joseph R Power": PRINT
130 PRINT "Last Revised - 04/12/80 11:10 PM": PRINT
REM X,Y for positioning the entrance on line 150
140 PRINT:PRINT "PLEASE BE PATIENT - ";: X = 1: Y = 4
REM Any time you find POKE FND, it's storing a value in a room at the given level, X, and Y.
REM Put the entrance (2) at 1,4,1
REM 3200 Choose a random X,Y for a given Z until you find an empty room. Set that room to Q.
REM For each level 1-7, place 2 random stairs down. Place stairs up on the next level below.
150 POKE FND(1), 2: PRINT "IN";: FOR Z = 1 TO 7: FOR Q1 = 1 TO 2: Q = 104: GOSUB 3200
160 POKE FND(Z+1), 103: NEXT Q1: NEXT Z: PRINT "I";
REM For each level:
REM Place 1 of each monster
REM Place 3 of each item
REM Place 3 vendors
REM Print out the next letter of "TIALIZIN"
170 FOR Z = 1 TO 8: FOR Q = 113 TO 124: GOSUB 3200: NEXT Q: FOR Q1 = 1 TO 3
180 FOR Q = 105 TO 112: GOSUB 3200: NEXT Q: Q = 125: GOSUB 3200: NEXT Q1: READ O$: PRINT O$;: NEXT Z
REM Place the treasures in random locations
REM Finish printing "INITIALIZING"
190 FOR Q = 126 TO 133: Z = FNA(8): GOSUB 3200: NEXT Q: PRINT "G";
REM Add the curses as empty rooms, store their location, and mark them uncursed
200 Q = 101: FOR A = 1 TO 3: Z = FNA(8): GOSUB 3200: C(A,1) = X: C(A,2) = Y: C(A,3) = Z: C(A,4) = 0
REM Print " CA" then "S"
REM RC - Race (initialized to zero to indicate the user has not selected a player)
REM ST - Strength
REM Switch race 3 name temporarily from "HUMAN" to "MAN" so the user can select
REM it with "M" ("H" collides with "HOBBIT").
210 READ O$: PRINT O$;: NEXT A: PRINT "S";: RC = 0: ST = 2: DX = 14: R$(3) = "MAN"
REM Place an extra random monster on a random level
REM Record that monster's location as the Runestaff location
220 Q = 112 + FNA(12): Z = FNA(8): GOSUB 3200: R(1) = X: R(2) = Y: R(3) = Z
REM Place an extra warp on a random level
REM Record that warp's location as the Orb of Zot location
REM Finish printing "CASTLE"
REM Note: the following line originally had no quote mark at the end, but it is
REM included here to keep the syntax highlighting sane.
230 Q = 109: Z = FNA(8): GOSUB 3200: O(1) = X: O(2) = Y: O(3) = Z: PRINT "TLE"
REM BF - book-stuck-to-hands flag (1 = book stuck)
REM OT - amount of other points the player gets
REM AV - number of points your armor absorbs per hit
REM HT - last turn you ate a monster on
REM T - the turn counter
REM VF - Vendor-anger-flag (1 = Vendors angry)
REM LF - lamp-owned flag (1 = player owns it)
REM TC - total number of treasures you possess
REM GP - total number of gold pieces you possess
REM RF - Runestaff possession flag (1 = player owns it)
REM OF - Orb of Zot possession flag (1 = player owns it)
REM BL - blindness flag (1 = player is blind)
240 BF = 0: OT = 8: AV = 0: HT = 0: T = 1: VF = 0: LF = 0: TC = 0: GP = 60: RF = 0: OF = 0: BL = 0
REM IQ - current number of intelligence points
REM SX - sex (0 = female, 1 = male)
REM Mark all treasures unfound
250 IQ = 8: SX = 0: FOR Q = 1 TO 8: T(Q) = 0: NEXT Q: PRINT CHR$(12); "ALL RIGHT, BOLD ONE"
REM 3280 Print "YOUR CHOICE", return leftmost character in O$
260 PRINT: PRINT "YOU MAY BE AN ELF, DWARF, MAN, OR HOBBIT": GOSUB 3280
REM RC - race (1 = hobbit, 2 = elf, 3 = man, 4 = dwarf)
REM Strength bonus: add 2 * race
REM Dexterity penalty: subtract 2 * race
270 FOR Q = 1 TO 4: IF LEFT$(R$(Q), 1) = O$ THEN RC = Q: ST = ST + 2 * Q: DX = DX - 2 * Q
REM If user selected HOBBIT, subtract 4 "other allocation" points
REM Reset R$(3) name from "MAN" to "HUMAN" if the user selected a valid option
280 NEXT Q: PRINT: OT = OT + 4 * (RC=1): IF RC > 0 THEN R$(3) = "HUMAN": GOTO 300
290 PRINT "** THAT WAS INCORRECT. PLEASE TYPE E, D, M, OR H.": GOTO 260
REM 3290 Input a string, return the leftmost character in O$
300 PRINT: PRINT "SEX ";: GOSUB 3290: IF O$ = "M" THEN SX = 1: GOTO 320
310 IF O$ <> "F" THEN PRINT: PRINT "** CUTE "; R$(RC); ", REAL CUTE. TRY M OR F": GOTO 300
320 PRINT CHR$(12): PRINT "OK "; R$(RC); ", YOU HAVE THESE STATISTICS:": PRINT
330 PRINT "STRENGTH= "; ST; " INTELLIGENCE= "; IQ; " DEXTERITY= "; DX: PRINT
340 PRINT "AND "; OT; " OTHER POINTS TO ALLOCATE AS YOU WISH.": PRINT
REM 3300 Ask how many points to add to Z$. Sanitize input and make sure enough OT is left.
REM Allocate points to IQ
REM Allocate points to ST
REM Allocate points to DX
350 Z$ = "INTELLIGENCE ": GOSUB 3300: IQ = IQ + Q: IF OT = 0 THEN 370
360 Z$ = "STRENGTH ": GOSUB 3300: ST = ST + Q: IF OT THEN Z$ = "DEXTERITY ": GOSUB 3300: DX = DX + Q
370 PRINT CHR$(12): PRINT "OK, "; R$(RC); ", YOU HAVE 60 GOLD PIECES (GP's)": PRINT
REM 3390 Prints "Here is a list of $Z you can buy"
REM AV - number of points your armor absorbs per hit
REM WV - number of points of damage your weapon does
REM FL - total number of flares you possess
REM WC - turns left before a web breaks
380 Z$ = "ARMOR": GOSUB 3390: AV = 0: WV = 0: FL = 0: WC = 0
390 PRINT "PLATE<30> CHAINMAIL<20> LEATHER<10> NOTHING<0>"
REM 3280 Print "YOUR CHOICE", return leftmost character in O$
400 GOSUB 3280: IF O$ = "N" THEN 440
REM Compute armor value in AV:
REM
REM 1 - Leather
REM 2 - Chainmail
REM 3 - Plate
410 AV = -3 * (O$="P") - 2 * (O$="C") - (O$="L"): IF AV > 0 THEN 440
REM On bad input, insultingly call the player a monster
420 PRINT: PRINT "** ARE YOU A "; R$(RC); " OR "; C$(FNA(12)+12);
430 PRINT " ? TYPE P,C,L, OR N": PRINT: GOTO 380
REM AH - total number of hit points your armor has left
REM Subtract armor value from GP
REM Starting armor hit point values:
REM
REM 7 - Leather
REM 14 - Chainmail
REM 21 - Plate
440 AH = AV * 7: GP = GP - AV * 10: PRINT CHR$(12)
450 PRINT: PRINT "OK, BOLD "; R$(RC); ", YOU HAVE "; GP; " GP's LEFT": PRINT
REM 3390 Prints "Here is a list of $Z you can buy"
460 Z$ = "WEAPONS": GOSUB 3390
REM 3280 Print "YOUR CHOICE", return leftmost character in O$
470 PRINT "SWORD<30> MACE<20> DAGGER<10> NOTHING<0>": GOSUB 3280: IF O$ = "N" THEN 500
REM Compute number of hit points your weapon does in damage (WV)
REM
REM 1 - Dagger
REM 2 - Mace
REM 3 - Sword
480 WV = -3 * (O$="S") - 2 * (O$="M") - (O$="D"): IF WV > 0 THEN 500
490 PRINT: PRINT "** IS YOUR IQ REALLY "; IQ; "? TYPE S, M, D, OR N": PRINT: GOTO 460
REM Charge for weapon
500 GP = GP - WV * 10: PRINT CHR$(12): IF GP < 20 THEN 540
REM 3290 Input a string, return the leftmost character in O$
REM See if the player wants a lamp
510 PRINT "WANT TO BUY A LAMP FOR 20 GP's ";: GOSUB 3290
520 IF O$ = "Y" THEN LF = 1: GP = GP - 20: GOTO 540
REM If the player didn't enter Y or N, make them do so
530 IF O$ <> "N" THEN PRINT: PRINT Y$: PRINT: GOTO 510
REM Q - temp var for quantity of flares to buy
540 PRINT CHR$(12): IF GP < 1 THEN Q = 0: GOTO 600
550 PRINT: PRINT "OK, "; R$(RC); ", YOU HAVE "; GP; " GOLD PIECES LEFT": PRINT
560 INPUT "FLARES COST 1 GP EACH. HOW MANY DO YOU WANT "; O$
REM ASCII 48 = '0'
570 Q = VAL(O$): PRINT: IF Q > 0 OR ASC(O$) = 48 THEN 590
580 PRINT "** IF YOU DON'T WANT ANY JUST TYPE 0 (ZERO)": PRINT: GOTO 560
590 IF Q > GP THEN PRINT "** YOU CAN ONLY AFFORD "; GP: PRINT: GOTO 560
REM Add to flare count ??do you bank flares from prior games??
REM Set X,Y,Z to initial player position
600 FL = FL + Q: GP = GP - Q: PRINT CHR$(12): X = 1: Y = 4: Z = 1
REM 1670 (GOTO) Print location, stats, handle room actions
610 PRINT "OK "; R$(RC); ", YOU ENTER THE CASTLE AND BEGIN.": PRINT: GOTO 1670
REM START NEXT TURN
REM Increment turn counter
REM If you have the Runestaff or Orb of Zot, skip the curse effects
620 T = T + 1: IF RF + OF > 0 THEN 690
REM If we have Lethargy and no Ruby Red, increase turn counter by 1 extra
630 IF C(1,4) > T(1) THEN T = T + 1
REM If we have Leech and no Pale Pearl, lose up to 5 GP per turn
640 IF C(2,4) > T(3) THEN GP = GP - FNA(5): IF GP < 0 THEN GP = 0
REM If NOT(we have Forgetfulness and no Green Gem), skip the forgetting code
650 IF C(3,4) <= T(5) THEN 690
REM Apply forgetfulness
REM Save player position in A,B,C
REM Mark a random room unexplored
REM Restore player position from A,B,C
660 A = X: B = Y: C = Z: X = FNA(8): Y = FNA(8): Z = FNA(8)
670 POKE FND(Z), FNE(PEEK(FND(Z))) + 100: X = A: Y = B: Z = C
REM Test for curses
REM If we're in an empty room, check if it's a curse room
REM If it is, mark the curse as active
REM If it isn't, mark the curse as inactive (???)
REM
REM This seems like a bug. Shouldn't the curse stay active?
REM
REM As it is, it will clear the moment you step into another empty room.
REM
REM In Adam Biltcliffe's Inform port, he sets the curses active permanently
REM once encountered, and then ignores them if the cure treasure is held:
REM
REM https://ifarchive.org/if-archive/games/source/inform/wcastle.inf
REM
REM This makes sense, since you can sell treasures to vendors, and the
REM docs say the treasures nullify the effects of the curses--implying they
REM don't remove the curses.
680 IF PEEK(FND(Z)) = 1 THEN FOR Q = 1 TO 3: C(Q,4) = -(C(Q,1)=X) * (C(Q,2)=Y) * (C(Q,3)=Z): NEXT
REM 4/5 chance you'll skip the random ("STEPPED ON A FROG"-ish) message
690 IF FNA(5) > 1 THEN 790
REM Print a random message
REM BL - blindness flag (1 = player is blind)
REM If player not blind, choose a random message between 1 - 7.
REM If player is blind, choose a random message between 2 - 8.
REM If 8 chosen, show 4.
700 PRINT: PRINT "YOU ";: Q = FNA(7) + BL: IF Q > 7 THEN Q = 4
REM Q
REM
REM 1 - See a bat
REM 2 - Hear scream/footsteps/wumpus/thunder
REM 3 - Sneezed
REM 4 - Stepped on a frog
REM 5 - Smell a monster frying
REM 6 - Feel like you're being watched
REM 7 - Are playing Wizard's Castle
710 ON Q GOSUB 750, 730, 740, 720, 760, 770, 780: GOTO 790
720 PRINT "STEPPED ON A FROG": RETURN
730 PRINT "HEAR "; MID$("A SCREAM FOOTSTEPSA WUMPUS THUNDER", FNA(4) * 9 - 8, 9): RETURN
740 PRINT "SNEEZED": RETURN
750 PRINT "SEE A BAT FLY BY": RETURN
760 PRINT "SMELL "; C$(12+FNA(13)); " FRYING": RETURN
770 PRINT "FEEL LIKE YOU'RE BEING WATCHED": RETURN
780 PRINT "ARE PLAYING WIZARD'S CASTLE": RETURN
REM Cure blindness with The Opal Eye
790 IF BL + T(4) = 2 THEN PRINT: PRINT C$(29); " CURES YOUR BLINDNESS": BL = 0
REM Dissolve books with The Blue Flame
800 IF BF + T(6) = 2 THEN PRINT: PRINT C$(31); " DISSOLVES THE BOOK": BF = 0
REM Input a move
810 PRINT: PRINT: PRINT: INPUT "YOUR MOVE "; O$: IF LEFT$(O$,2) = "DR" THEN 1180
820 O$ = LEFT$(O$, 1): IF O$ = "N" THEN 940
830 IF (O$ = "S") OR (O$ = "W") OR (O$ = "E") THEN 950
840 IF O$ = "U" THEN 970
850 IF O$ = "D" THEN 990
860 IF O$ = "M" THEN 1010
870 IF O$ = "F" THEN ON 1 + BL GOTO 1070, 1010
880 IF O$ = "L" THEN ON 1 + BL GOTO 1110, 1010
890 IF O$ = "O" THEN 1310
900 IF O$ = "G" THEN ON 1 + BL GOTO 1480, 1010
910 IF O$ = "T" THEN PRINT: ON 1 + RF GOTO 1590, 1600
920 IF O$ = "Q" THEN 1640
930 PRINT: PRINT "** STUPID "; R$(RC); " THAT WASN'T A VALID COMMAND": GOTO 620
REM MOVE: NORTH
REM If we're at the entrance, handle that. Otherwise fall through to the
REM normal move handler.
940 IF PEEK(FND(Z)) = 2 THEN 2900
REM MOVE: N, S, W, E
950 X = X + (O$="N") - (O$="S"): Y = Y + (O$="W") - (O$="E")
REM Handle wrap
960 X = FNB(X): Y = FNB(Y): GOTO 1670
REM MOVE: UP
970 IF PEEK(FND(Z)) = 3 THEN Z = Z - 1: GOTO 1670
980 Z$ = "UP": GOTO 1000
REM MOVE: DOWN
990 Z$ = "DOWN": IF PEEK(FND(Z)) = 4 THEN Z = Z + 1: GOTO 1670
1000 PRINT: PRINT "** OH "; R$(RC); ", NO STAIRS GOING "; Z$; " IN HERE": GOTO 620
REM Insult player for being blind, or continue to print map otherwise
1010 IF BL = 1 THEN PRINT: PRINT "** YOU CAN'T SEE ANYTHING, DUMB "; R$(RC): GOTO 620
REM PRINT MAP
1020 PRINT: PRINT: A = X: B = Y: FOR X = 1 TO 8: FOR Y = 1 TO 8: Q = PEEK(FND(Z)): IF Q > 99 THEN Q = 34
1030 IF X = A AND Y = B THEN PRINT "<"; I$(Q); ">";: GOTO 1050
1040 PRINT " "; I$(Q); " ";
1050 NEXT Y: PRINT: PRINT: NEXT X: X = A: Y = B: GOTO 1100
REM ???
1060 PRINT ") LEVEL "; Z: GOTO 620
REM FLARE
1070 IF FL = 0 THEN PRINT: PRINT "** HEY BRIGHT ONE, YOU'RE OUT OF FLARES": GOTO 620
1080 PRINT: PRINT: FL = FL - 1: A = X: B = Y: FOR Q1 = A - 1 TO A + 1: X = FNB(Q1): FOR Q2 = B - 1 TO B + 1: Y = FNB(Q2)
1090 Q = FNE(PEEK(FND(Z))): POKE FND(Z), Q: PRINT I$(Q);" ";: NEXT Q2: PRINT: PRINT: NEXT Q1: X = A: Y = B
REM 3400 Pretty print X,Y,Z
1100 GOSUB 3400: GOTO 620
REM LAMP
1110 IF LF = 0 THEN PRINT: PRINT "** YOU DON'T HAVE A LAMP, "; R$(RC): GOTO 620
REM 3290: Input a string, return the leftmost character in O$
1120 PRINT: PRINT "WHERE DO YOU SHINE THE LAMP (N,S,E, OR W) ";: GOSUB 3290
1130 A = X: B = Y: X = FNB(X + (O$="N") - (O$="S")): Y = FNB(Y + (O$="W") - (O$="E"))
1140 IF A-X + B-Y = 0 THEN PRINT: PRINT "** TURKEY! THAT'S NOT A DIRECTION": GOTO 620
1150 PRINT: PRINT "THE LAMP SHINES INTO ("; X; ","; Y; ") LEVEL ";Z: PRINT
REM Mark as discovered, and print what's there
1160 POKE FND(Z), FNE(PEEK(FND(Z))): PRINT "THERE YOU WILL FIND ";C$(PEEK(FND(Z)))
1170 X = A: Y = B: GOTO 620
REM DRINK
1180 IF PEEK(FND(Z)) <> 5 THEN PRINT: PRINT "** IF YOU WANT A DRINK, FIND A POOL": GOTO 620
1190 Q = FNA(8): PRINT: PRINT "YOU TAKE A DRINK AND ";: IF Q < 7 THEN PRINT "FEEL ";
REM Q
REM
REM 1 - feel stronger (ST goes up 1-3 points, capped at 18)
REM 2 - feel weaker (ST goes down 1-3 points, if zero or less, player dies)
REM 3 - feel smarter (IQ goes up 1-3 points, capped at 18)
REM 4 - feel dumber (IQ goes down 1-3 points, if zero or less, player dies)
REM 5 - feel nimbler (DX goes up 1-3 points, capped at 18)
REM 6 - feel clumsier (DX goes down 1-3 points, if zero or less, player dies)
REM 7 - change race to something you're not
REM 8 - flip gender
1200 ON Q GOTO 1210, 1220, 1230, 1240, 1250, 1260, 1270, 1290
1210 ST = FNC(ST + FNA(3)): PRINT "STRONGER": GOTO 620
1220 ST = ST - FNA(3): PRINT "WEAKER": ON 1 - (ST < 1) GOTO 620, 2840
1230 IQ = FNC(IQ + FNA(3)): PRINT "SMARTER": GOTO 620
1240 IQ = IQ - FNA(3): PRINT "DUMBER": ON 1 - (IQ < 1) GOTO 620, 2840
1250 DX = FNC(DX + FNA(3)): PRINT "NIMBLER": GOTO 620
1260 DX = DX - FNA(3): PRINT "CLUMSIER": ON 1 - (DX < 1) GOTO 620, 2840
1270 Q = FNA(4): IF Q = RC THEN 1270
1280 RC = Q: PRINT "BECOME A "; R$(RC): GOTO 620
1290 SX = 1 - SX: PRINT "TURN INTO A ";: IF SX = 0 THEN PRINT "FE";
1300 PRINT "MALE "; R$(RC): GOTO 620
REM MOVE: OPEN (chest or book)
1310 IF PEEK(FND(Z)) = 6 THEN PRINT: PRINT "YOU OPEN THE CHEST AND": PRINT: GOTO 1430
1320 IF PEEK(FND(Z)) = 12 THEN PRINT: PRINT "YOU OPEN THE BOOK AND": PRINT: GOTO 1340
1330 PRINT: PRINT "** THE ONLY THING YOU OPENED WAS YOUR BIG MOUTH": GOTO 620
REM Open book
REM
REM 1 - player goes blind
REM 2 - Zot's poetry (no effect)
REM 3 - old copy of playhuman/dwarf/elf/hobbit (no effect)
REM 4 - manual of dexterity (set DX to 18)
REM 5 - manual of strength (set ST to 18)
REM 6 - book sticks to player's hands
1340 ON FNA(6) GOTO 1350, 1360, 1370, 1380, 1390, 1400
1350 PRINT "FLASH! OH NO! YOU ARE NOW A BLIND "; R$(RC): BL = 1: GOTO 1420
1360 PRINT "ITS ANOTHER VOLUME OF ZOT'S POETRY! - YEECH!": GOTO 1420
1370 PRINT "ITS AN OLD COPY OF PLAY";R$(FNA(4)): GOTO 1420
1380 PRINT "ITS A MANUAL OF DEXTERITY!": DX = 18: GOTO 1420
1390 PRINT "ITS A MANUAL OF STRENGTH !": ST = 18: GOTO 1420
1400 PRINT "THE BOOK STICKS TO YOUR HANDS -": PRINT
1410 PRINT "NOW YOU CAN'T DRAW YOUR WEAPON!": BF = 1
REM Remove the book/chest from the room (they vanish upon use)
1420 POKE FND(Z), 1: GOTO 620
REM Open chest
REM 1/4 chance of explosion
REM 1/4 chance of gas
REM 1/2 chance of finding treasure
REM Explosion:
REM
REM Take (d6 - AV) damage, clamped at zero.
REM Subtract damage from AH
REM Subtract damage from ST, as well (dying if necessary)
REM If AH < 0, the armor is destroyed
REM
REM Treasure:
REM
REM Collect d1000 GP
REM
REM Gas:
REM
REM Add 20 to turn counter
REM Choose a random cardinal direction and move there (as if the player had moved that way)
REM In all cases, the chest is removed from the room
1430 ON FNA(4) GOTO 1440, 1450, 1460, 1450
REM 2800 Take damage
1440 PRINT "KABOOM! IT EXPLODES": Q = FNA(6): GOSUB 2800: ON 1 - (ST < 1) GOTO 1420, 2840
1450 Q = FNA(1000): PRINT "FIND "; Q; " GOLD PIECES": GP = GP + Q: GOTO 1420
1460 PRINT "GAS! YOU STAGGER FROM THE ROOM"
1470 POKE FND(Z),1: T = T + 20: O$ = MID$("NSEW", FNA(4), 1): GOTO 950
REM GAZE into orb
REM 1 - See yourself in a bloody heap
REM Lose 1d2 ST
REM Room is marked empty
REM 2 - Yourself drinking from a pool and becoming [a monster]
REM 3 - [A monster] gazing back at you
REM 4 - An item at a location.
REM The room is marked as explored
REM 5 - The Orb of Zot at a location
REM 3/8 chance this is the actual location
REM 5/8 chance that it's a random location
REM 6 - A soap opera rerun
1480 IF PEEK(FND(Z)) <> 11 THEN PRINT: PRINT "** NO ORB - NO GAZE": GOTO 620
1490 PRINT: PRINT "YOU SEE ";: ON FNA(6) GOTO 1500, 1510, 1530, 1540, 1560, 1580
1500 PRINT "YOURSELF IN A BLOODY HEAP": ST = ST - FNA(2): ON 1 - (ST < 1) GOTO 620, 2840
1510 PRINT "YOURSELF DRINKING FROM A POOL AND BECOMING "; C$(12+FNA(13))
1520 GOTO 620
1530 PRINT C$(12 + FNA(13)); " GAZING BACK AT YOU": GOTO 620
1540 A = X: B = Y: C = Z: X = FNA(8): Y = FNA(8): Z = FNA(8): Q = FNE(PEEK(FND(Z))): POKE FND(Z), Q
1550 PRINT C$(Q); " AT ("; X; ","; Y; ") LEVEL "; Z: X = A: Y = B: Z = C: GOTO 620
1560 A = FNA(8): B = FNA(8): C = FNA(8): IF FNA(8) < 4 THEN A = O(1): B = O(2): C = O(3)
1570 PRINT "THE ORB OF ZOT AT ("; A; ","; B; ") LEVEL "; C: GOTO 620
1580 PRINT "A SOAP OPERA RERUN": GOTO 620
REM TELEPORT
1590 IF RF = 0 THEN PRINT: PRINT "** YOU CAN'T TELEPORT WITHOUT THE RUNESTAFF!": GOTO 620
1600 Z$ = "X-COORD (1=FAR NORTH 8=FAR SOUTH) ": GOSUB 3350: X = Q
1610 Z$ = "Y-COORD (1=FAR WEST 8=FAR EAST ) ": GOSUB 3350: Y = Q
1620 Z$ = "LEVEL (1=TOP 8=BOTTOM ) ": GOSUB 3350: Z = Q
REM O$ = "T" is the teleport flag, used when discovering the Orb of Zot
1630 O$ = "T": GOTO 1670
REM QUIT
1640 PRINT: PRINT "DO YOU REALLY WANT TO QUIT ";: GOSUB 3290: PRINT
1650 IF O$ <> "Y" THEN PRINT "** THEN DON'T SAY YOU DO": GOTO 620
REM 2940 Game over (defeat)
1660 PRINT: PRINT: GOTO 2940
REM PRINT STATUS
REM 3400 Pretty-print location (if not blind)
1670 PRINT: IF BL = 0 THEN GOSUB 3400: PRINT
1680 PRINT "ST= "; ST; " IQ= "; IQ; " DX= "; DX; " FLARES= "; FL; " GP's= "; GP
REM Print weapon and armor
1690 PRINT: PRINT W$(WV + 1); " / "; W$(AV + 5);: IF LF = 1 THEN PRINT " / A LAMP";
REM WC = turns left before a web breaks
REM "YOU HAVE " appears several times, below.
1700 PRINT: PRINT: WC = 0: Q = FNE(PEEK(FND(Z))): POKEFND(Z),Q: Z$ = "YOU HAVE "
REM PRINT ROOM DESCRIPTION
REM
REM If it's a no-effect room, head back to the main loop.
1710 PRINT "HERE YOU FIND "; C$(Q): IF (Q < 7) OR (Q = 11) OR (Q = 12) THEN 620
REM Gold in room. Add 1d10 to GP.
REM 1420: Mark room as empty
1720 IF Q = 7 THEN GP = GP + FNA(10): PRINT: PRINT Z$; GP: GOTO 1420
REM Flares in room. Add 1d5 to FL.
REM 1420: Mark room as empty
1730 IF Q = 8 THEN FL = FL + FNA(5): PRINT: PRINT Z$; FL: GOTO 1420
REM 9 is a Warp, so we have to test for Orb of Zot
1740 IF Q > 9 THEN 1770
REM 950 Regular move
REM 3050 Discovered Orb of Zot
1750 PRINT: IF (O(1) = X) AND (O(2) = Y) AND (O(3) = Z) THEN ON 1 - (O$ = "T") GOTO 950, 3050
REM Warp?? Who jumps here?
REM Random X, Y, Z
REM 1670 Show location
1760 X = FNA(8): Y = FNA(8): Z = FNA(8): GOTO 1670
REM Sinkhole
1770 IF Q = 10 THEN Z = FNB(Z + 1): GOTO 1670
REM Treasure
REM 1420: Mark room as empty
1780 IF Q > 25 AND Q < 34 THEN PRINT: PRINT "ITS NOW YOURS": T(Q - 25) = 1: TC = TC + 1: GOTO 1420
REM If facing a monster or an angry vendor, do battle (2300)
REM WC = turns left before a web breaks
REM A = monster number (kobold is 1, then counts up)
1790 A = PEEK(FND(Z)) - 12: WC = 0: IF (A < 13) OR (VF = 1) THEN 2300
REM Vendor behavior
1800 PRINT: PRINT "YOU MAY TRADE WITH, ATTACK, OR IGNORE THE VENDOR"
REM 3280 Print "YOUR CHOICE"
1810 GOSUB 3280: IF O$ = "I" THEN 620
REM 2300 Do battle
1820 IF O$ = "A" THEN VF = 1: PRINT: PRINT "YOU'LL BE SORRY YOU DID THAT": GOTO 2300
1830 IF O$ <> "T" THEN PRINT: PRINT "** NICE SHOT, "; R$(RC): GOTO 1800
REM Offer to buy treasures
REM Treasure price random: Min: 1, Max: treasure_number * 1500
1840 PRINT: FOR Q = 1 TO 8: A = FNA(Q * 1500): IF T(Q) = 0 THEN 1880
1850 PRINT: PRINT "DO YOU WANT TO SELL "; C$(Q+25); " FOR "; A; " GP's ";
REM 3290 Input string, return left-most character
1860 GOSUB 3290: IF O$ = "Y" THEN TC = TC - 1: T(Q) = 0: GP = GP + A: GOTO 1880
1870 IF O$ <> "N" THEN PRINT Y$: GOTO 1850
1880 NEXT Q
REM If you have less than 1000 GP, you can't trade.
1890 IF GP < 1E3 THEN PRINT: PRINT "YOU'RE TOO POOR TO TRADE, "; R$(RC): GOTO 620
1900 IF GP < 1250 THEN 2130
REM Print GP and current armor
1910 PRINT: PRINT "OK, "; R$(RC);", YOU HAVE "; GP; " GOLD PIECES AND "; W$(AV + 5)
REM 3390 Here is a list of Z$ you can buy
1920 PRINT: Z$ = "ARMOR": GOSUB 3390: PRINT "NOTHING<0> LEATHER<1250> ";
1930 IF GP > 1499 THEN PRINT "CHAINMAIL<1500> ";: IF GP > 1999 THEN PRINT "PLATE<2000>";
REM 3280 Print "YOUR CHOICE"
1940 PRINT: GOSUB 3280: PRINT: IF O$ = "N" THEN 2010
REM Buy leather
1950 IF O$ = "L" THEN GP = GP - 1250: AV = 1: AH = 7: GOTO 2010
REM Buy chainmail
1960 IF O$ = "C" AND GP < 1500 THEN PRINT "** YOU HAVEN'T GOT THAT MUCH CASH": GOTO 1920
1970 IF O$ = "C" THEN GP = GP - 1500: AV = 2: AH = 14: GOTO 2010
REM Buy plate
1980 IF O$ = "P" AND GP < 2000 THEN PRINT "** YOU CAN'T AFFORD PLATE": GOTO 1920
1990 IF O$ = "P" THEN GP = GP - 2000: AV = 3: AH = 21: GOTO 2010
2000 PRINT: PRINT "** DON'T BE SILLY. CHOOSE A SELECTION": GOTO 1940
2010 IF GP < 1250 THEN 2130
REM Buy weapons
2020 PRINT: PRINT "YOU HAVE "; GP; " GP's LEFT WITH "; W$(WV + 1); " IN HAND": PRINT
REM 3390 Here is a list of Z$ you can buy
2030 PRINT: Z$ = "WEAPON": GOSUB 3390: PRINT "NOTHING<0> DAGGER<1250> ";
2040 IF GP > 1499 THEN PRINT "MACE<1500> ";: IF GP > 1999 THEN PRINT "SWORD<2000>";
REM 3280 Print "YOUR CHOICE"
2050 PRINT: GOSUB 3280: PRINT: IF O$ = "N" THEN 2130
2060 IF O$ = "D" THEN GP = GP - 1250: WV = 1: GOTO 2130
2070 IF O$ = "M" AND GP < 1500 THEN PRINT "** SORRY SIR, I DON'T GIVE CREDIT": GOTO 2030
2080 IF O$ = "M" THEN GP = GP - 1500: WV = 2: GOTO 2130
2090 IF O$ = "S" AND GP < 2000 THEN PRINT "** DUNGEON EXPRESS CARD - ";
2100 IF O$ = "S" AND GP < 2000 THEN PRINT "YOU LEFT HOME WITHOUT IT!": GOTO 2030
2110 IF O$ = "S" THEN GP = GP - 2000: WV = 3: GOTO 2130
2120 PRINT "** TRY CHOOSING A SELECTION": GOTO 2050
2130 IF GP < 1000 THEN 620
REM Buy stats
REM
REM For each stat 1000 GP buys you 1d6 of a stat up to 18 max
REM 3370 Prompt to purchase stat
2140 Z$ = "STRENGTH": GOSUB 3370: IF O$ <> "Y" THEN 2160
REM 3380 Your Z$ (stat) is now Q
2150 GP = GP - 1E3: ST = FNC(ST + FNA(6)): Q = ST: GOSUB 3380: GOTO 2130
2160 IF O$ <> "N" THEN PRINT Y$: GOTO 2140
2170 IF GP < 1000 THEN 620
2180 Z$ = "INTELLIGENCE": GOSUB 3370: IF O$ <> "Y" THEN 2200
2190 GP = GP - 1E3: IQ = FNC(IQ + FNA(6)): Q = IQ: GOSUB 3380: GOTO 2170
2200 IF O$ <> "N" THEN PRINT Y$: GOTO 2180
2210 IF GP < 1000 THEN 620
2220 Z$ = "DEXTERITY": GOSUB 3370: IF O$ <> "Y" THEN 2240
2230 GP = GP - 1E3: DX = FNC(DX + FNA(6)): Q = DX: GOSUB 3380: GOTO 2210
2240 IF O$ <> "N" THEN PRINT Y$: GOTO 2220
2250 IF (GP < 1000) OR (LF = 1) THEN 620
REM Buy lamp?
2260 PRINT: PRINT "WANT A LAMP FOR 1000 GP's ";: GOSUB 3290: IF O$ <> "Y" THEN 2280
2270 GP = GP - 1000: LF = 1: PRINT: PRINT "ITS GUARANTEED TO OUTLIVE YOU!": GOTO 620
2280 IF O$ <> "N" THEN PRINT Y$: GOTO 2260
REM Back up to main loop
2290 GOTO 620
REM DO BATTLE
REM
REM You get the initiative UNLESS
REM You have Lethargy
REM You're Blind
REM DX < 2d9
REM
REM If you have the initiative, on the first round of battle you can try a bribe
REM
REM If your IQ > 14, then you can cast a spell
REM Q1 - Damage monster inflicts: 1 + monster_num // 2
REM Q2 - Monster HP
REM Q3 - 1 = can still bribe, 2 = can't bribe
REM
REM Monster HP:
REM
REM KOBOLD: 3
REM ORC: 4
REM WOLF: 5
REM GOBLIN: 6
REM OGRE: 7
REM TROLL: 8
REM BEAR: 9
REM MINOTAUR: 10
REM GARGOYLE: 11
REM CHIMERA: 12
REM BALROG: 13
REM DRAGON: 14
REM VENDOR: 15
2300 Q1 = 1 + INT(A / 2): Q2 = A + 2: Q3 = 1
REM If you have Lethargy or you're blind or DX < 2d9 then you lose initiative
2310 IF (C(1, 4) > T(1)) OR (BL = 1) OR (DX < FNA(9) + FNA(9)) THEN 2690
2320 PRINT: PRINT: PRINT "YOU'RE FACING "; C$(A + 12): PRINT: PRINT "YOU MAY ATTACK OR RETREAT";
2330 IF Q3 = 1 THEN PRINT ", OR BRIBE";: IF IQ > 14 THEN PRINT ", OR CAST A SPELL";
REM 3280 Print "YOUR CHOICE"
2340 PRINT: PRINT: PRINT "YOUR STRENGTH IS "; ST; " AND DEXTERITY IS "; DX: PRINT: GOSUB 3280
2350 IF O$ <> "A" THEN 2480
2360 IF WV = 0 THEN PRINT: PRINT "** POUNDING ON "; C$(12 + A); " WON'T HURT IT": GOTO 2690
2370 IF BF = 1 THEN PRINT: PRINT "** YOU CAN'T BEAT IT TO DEATH WITH A BOOK": GOTO 2690
REM To hit:
REM If blind: DX < 1d20 + 3
REM If not blind: DX < 1d20
REM
REM If you hit, the WV is subtracted from monster HP
2380 IF DX < FNA(20) + (BL * 3) THEN PRINT: PRINT " DRAT! MISSED": GOTO 2690
2390 PRINT: PRINT " YOU HIT THE LOUSY "; RIGHT$(C$(A + 12), LEN(C$(A + 12)) - 2): Q2 = Q2 - WV
REM If facing a Gargoyle or Dragon, there's a 1/8 chance your weapon breaks on a hit
2400 IF (A = 9 OR A = 12) AND FNA(8) = 1 THEN PRINT: PRINT "OH NO! YOUR "; W$(WV+1); " BROKE": WV = 0
2410 IF Q2 > 0 THEN 2690
REM Monster defeated
REM
REM Player gets the Runstaff (if here) and 1000 GPs
REM MC - ???? Monster count? Bug, or oversight since it doesn't appear elsewhere?
REM If 60 turns have elapsed, have a meal of the monster and reset the timer
REM (Note: H used uninitialized, starts at 0)
2420 PRINT: MC = MC - 1: PRINT C$(A + 12); " LIES DEAD AT YOUR FEET": IF H > T - 60 THEN 2440
2430 PRINT: PRINT "YOU SPEND AN HOUR EATING "; C$(A + 12);E$(FNA(8)): H = T
REM Check for Runestaff at this location
2440 IF X <> R(1) OR Y <> R(2) OR Z <> R(3) THEN ON 1-(A=13) GOTO 2460,3220
2450 PRINT: PRINT "GREAT ZOT! YOU'VE FOUND THE RUNESTAFF": R(1) = 0: RF = 1
2460 Q = FNA(1000): PRINT: PRINT "YOU NOW GET HIS HOARD OF "; Q; " GP's"
REM 1420 Mark room as empty
2470 GP = GP + Q: GOTO 1420
2480 IF O$ = "R" THEN 2690
REM CAST A SPELL
REM
REM To cast a spell, you must have an IQ of 15+, and you must have already attacked
REM the monster (bribe is no longer possible).
REM
REM Web (makes it so a monster can't attack):
REM Costs 1 point of ST
REM Lasts 1d6 + 1 turns (stored in WC)
REM
REM Fireball (causes damage):
REM Costs 1 point of ST
REM Costs 1 point of IQ
REM Does 2d7 damage
REM
REM Deathspell (causes death):
REM If IQ < 15 + 1d4, player dies
REM Otherwise monster dies
2490 IF (O$ <> "C") THEN 2610
2500 IF IQ < 15 OR Q3 > 1 THEN PRINT: PRINT "** YOU CAN'T CAST A SPELL NOW!": GOTO 2320
2510 PRINT: PRINT "WHICH SPELL (WEB, FIREBALL, OR DEATHSPELL) ";:GOSUB 3290: PRINT
2520 IF O$ <> "W" THEN 2540
2530 ST = ST - 1: WC = FNA(8) + 1 : ON 1 - (ST < 1) GOTO 2690, 2840
2540 IF O$ <> "F" THEN 2580
2550 Q = FNA(7) + FNA(7): ST = ST - 1: IQ = IQ - 1: IF (IQ < 1) OR (ST < 1) THEN 2840
2560 PRINT " IT DOES "; Q; " POINTS OF DAMAGE.": PRINT
2570 Q2 = Q2 - Q: GOTO 2410
2580 IF O$ <> "D" THEN PRINT: PRINT "** TRY ONE OF THE OPTIONS GIVEN": GOTO 2320
2590 PRINT "DEATH - - - ";: IF IQ < 15 + FNA(4) THEN PRINT "YOURS": IQ = 0: GOTO 2840
2600 PRINT "HIS": PRINT: Q2 = 0: GOTO 2420
REM BRIBE
REM
REM You can bribe if you have a treasure, otherwise the monster just attacks
REM A random treasure you possess is chosen
REM If you agree to the bribe, the treasure is removed from your inventory
REM If you bribe a Vendor, all Vendors cease being mad at you
2610 IF O$ <> "B" OR Q3 > 1 THEN PRINT: PRINT "** CHOOSE ONE OF THE LISTED OPTIONS": GOTO 2320
2620 IF TC = 0 THEN PRINT: PRINT "'ALL I WANT IS YOUR LIFE!'": GOTO 2690
2630 Q = FNA(8): IF T(Q) = 0 THEN 2630
2640 PRINT: PRINT "I WANT "; C$(Q + 25); ", WILL YOU GIVE IT TO ME ";
2650 GOSUB 3290: IF O$ = "N" THEN 2690
2660 IF O$ <> "Y" THEN PRINT Y$: GOTO 2640
2670 T(Q) = 0: TC = TC - 1: PRINT: PRINT "OK, JUST DON'T TELL ANYONE"
2680 VF = VF + (PEEK(FND(Z)) = 25): GOTO 620
REM Monster attacks
REM
REM Bribe no longer possible (Q3 = 2)
REM
REM Monster hits on:
REM If blind: DX < 3d7 + 3
REM If not blind: DX < 3d7
REM
REM If a monster hits, handle
2690 Q3 = 2: IF WC > 0 THEN WC = WC - 1: IF WC = 0 THEN PRINT: PRINT "THE WEB JUST BROKE!"
2700 Z$ = RIGHT$(C$(12 + A), LEN(C$(12 + A)) - 2): IF WC <= 0 THEN 2720
2710 PRINT: PRINT "THE "; Z$; " IS STUCK AND CAN'T ATTACK": GOTO 2750
2720 PRINT: PRINT "THE "; Z$; " ATTACKS": IF DX < FNA(7) + FNA(7) + FNA(7) + BL * 3 THEN 2740
2730 PRINT: PRINT " HAH! HE MISSED YOU": GOTO 2750
REM 2800 Take damage
2740 PRINT: PRINT " OUCH! HE HIT YOU": Q = Q1: GOSUB 2800: IF ST < 1 THEN 2840
2750 IF O$ <> "R" THEN 2320
REM RETREAT
REM
REM If the user selects Retreat, they automatically succeed
2760 PRINT: PRINT "YOU HAVE ESCAPED": PRINT
2770 PRINT "DO YOU GO NORTH, SOUTH, EAST, OR WEST ";: GOSUB 3290
2780 IF (O$ = "N") OR (O$ = "S") OR (O$ = "E") OR (O$ = "W") THEN 950
2790 PRINT: PRINT "** DON'T PRESS YOUR LUCK "; R$(RC): PRINT: GOTO 2770
REM Take damage
REM
REM This is used with:
REM Exploding chests
REM Monster damage
REM Q is damage
REM
REM AH decreases by Q, clamped at or below AV
REM ST decreases by Q - AV, clamped at or above 0
REM
REM In other words:
REM
REM AH decreases by MIN(Q, AV)
REM ST decreases by MAX(Q - AV, 0)
REM
REM if AH < 0, armor is destroyed
REM if ST < 0, player is killed
2800 IF AV = 0 THEN 2830
2810 Q = Q - AV: AH = AH - AV: IF Q < 0 THEN AH = AH - Q: Q = 0
2820 IF AH < 0 THEN AH = 0: AV = 0: PRINT: PRINT "YOUR ARMOR IS DESTROYED - GOOD LUCK"
2830 ST = ST - Q: RETURN
REM Game Over
2840 FOR Q = 1 TO 750: NEXT Q: PRINT CHR$(12): GOSUB 3270
2850 PRINT "A NOBLE EFFORT, OH FORMERLY LIVING "; R$(RC): PRINT
2860 PRINT "YOU DIED FROM A LACK OF ";:IF ST < 1 THEN PRINT "STRENGTH"
2870 IF IQ < 1 THEN PRINT "INTELLIGENCE"
2880 IF DX < 1 THEN PRINT "DEXTERITY"
2890 PRINT: PRINT: Q3 = 1: PRINT "WHEN YOU DIED YOU HAD:": PRINT: GOTO 2970
2900 Q3 = 0: PRINT: PRINT "YOU LEFT THE CASTLE WITH";: IF OF = 0 THEN PRINT "OUT";
2910 PRINT " THE ORB OF ZOT": PRINT: IF OF = 0 THEN 2940
2920 PRINT: PRINT "A GLORIOUS VICTORY!": PRINT
2930 PRINT "YOU ALSO GOT OUT WITH THE FOLLOWING:": PRINT: GOTO 2960
2940 PRINT: PRINT "A LESS THAN AWE-INSPIRING DEFEAT."
2950 PRINT: PRINT "WHEN YOU LEFT THE CASTLE YOU HAD:": PRINT
2960 IF Q3 = 0 THEN PRINT "YOUR MISERABLE LIFE"
2970 FOR Q = 1 TO 8: IF T(Q) = 1 THEN PRINT C$(Q+25)
2980 NEXT Q: PRINT W$(WV+1): PRINT W$(AV+5) : IF LF = 1 THEN PRINT "A LAMP"
2990 PRINT FL; " FLARES": PRINT GP; " GP's": IF RF = 1 THEN PRINT "THE RUNESTAFF"
3000 PRINT: PRINT "AND IT TOOK YOU "; T; " TURNS!": PRINT
3010 PRINT: PRINT: PRINT "PLAY AGAIN ";: GOSUB 3290: PRINT
3020 IF O$ = "Y" THEN PRINT "SOME "; R$(RC); "S NEVER LEARN": PRINT: PRINT: GOTO 80
3030 IF O$ <> "N" THEN PRINT Y$: GOTO 3010
3040 PRINT "MAYBE DUMB "; R$(RC); " NOT SO DUMB AFTER ALL": PRINT: END
REM FOUND THE ORB OF ZOT
REM
REM The Runestaff vanishes
3050 PRINT: PRINT "GREAT UNMITIGATED ZOT!": PRINT
3060 PRINT "YOU JUST FOUND THE ORB OF ZOT!": PRINT
3070 PRINT "THE RUNESTAFF IS GONE": RF = 0: OF = 1: O(1) = 0: GOTO 1420
REM ROOM CONTENTS
REM
REM Value+100 means the room is unexplored
REM
REM 1 - AN EMPTY ROOM, .
REM 2 - THE ENTRANCE, E
REM 3 - STAIRS GOING UP, U
REM 4 - STAIRS GOING DOWN, D
REM 5 - A POOL, P
REM 6 - A CHEST, C
REM 7 - GOLD PIECES, G
REM 8 - FLARES, F
REM 9 - A WARP, W
REM 10 - A SINKHOLE, S
REM 11 - A CRYSTAL ORB, O
REM 12 - A BOOK, B
REM 13 - A KOBOLD, M
REM 14 - AN ORC, M
REM 15 - A WOLF, M
REM 16 - A GOBLIN, M
REM 17 - AN OGRE, M
REM 18 - A TROLL, M
REM 19 - A BEAR, M
REM 20 - A MINOTAUR, M
REM 21 - A GARGOYLE, M
REM 22 - A CHIMERA, M
REM 23 - A BALROG, M
REM 24 - A DRAGON, M
REM 25 - A VENDOR, V
REM 26 - THE RUBY RED, T
REM 27 - THE NORN STORN, T
REM 28 - THE PALE PEARL, T
REM 29 - THE OPAL EYE, T
REM 30 - THE GREEN GEM, T
REM 31 - THE BLUE FLAME, T
REM 32 - THE PALINTIR, T
REM 33 - THE SILMARIL T
REM 34 - X, "?"
REM Treasure numbers in the T() array
REM
REM 1 - THE RUBY RED
REM 2 - THE NORN STORN
REM 3 - THE PALE PEARL
REM 4 - THE OPAL EYE
REM 5 - THE GREEN GEM
REM 6 - THE BLUE FLAME
REM 7 - THE PALINTIR
REM 8 - THE SILMARIL
REM WEAPONS AND ARMOR
REM
REM 1 - NO WEAPON
REM 2 - DAGGER
REM 3 - MACE
REM 4 - SWORD
REM 5 - NO ARMOR
REM 6 - LEATHER
REM 7 - CHAINMAIL
REM 8 - PLATE
REM RECIPES
REM
REM 1 - WICH
REM 2 - STEW
REM 3 - SOUP
REM 4 - BURGER
REM 5 - ROAST
REM 6 - MUNCHY
REM 7 - TACO
REM 8 - PIE
REM RACES
REM
REM 1 - HOBBIT
REM 2 - ELF
REM 3 - MAN
REM 4 - DWARF
REM Curses in the C() array, first index
REM
REM 1 - Lethargy
REM 2 - Leech
REM 3 - Forgetfullness
3080 DATA AN EMPTY ROOM, ., THE ENTRANCE, E, STAIRS GOING UP, U
3090 DATA STAIRS GOING DOWN, D, A POOL, P, A CHEST, C, GOLD PIECES, G
3100 DATA FLARES, F, A WARP, W, A SINKHOLE, S, A CRYSTAL ORB, O
3110 DATA A BOOK, B, A KOBOLD, M, AN ORC, M, A WOLF, M, A GOBLIN, M, AN OGRE, M
3120 DATA A TROLL, M, A BEAR, M, A MINOTAUR, M, A GARGOYLE, M, A CHIMERA, M
3130 DATA A BALROG, M, A DRAGON, M, A VENDOR, V, THE RUBY RED, T
3140 DATA THE NORN STONE, T, THE PALE PEARL, T, THE OPAL EYE, T
3150 DATA THE GREEN GEM, T, THE BLUE FLAME, T, THE PALANTIR, T, THE SILMARIL
3160 DATA T, X, "?", NO WEAPON, WICH
3170 DATA DAGGER, " STEW", MACE, " SOUP", SWORD, " BURGER", NO ARMOR, " ROAST"
3180 DATA LEATHER, " MUNCHY", CHAINMAIL, " TACO", PLATE, " PIE"
3190 DATA HOBBIT, ELF, MAN, DWARF, T, I, A, L, I, Z, I, N, " ", C, A
REM Set a random, empty, undiscovered room to value Q
3200 X = FNA(8): Y = FNA(8): IF PEEK(FND(Z)) <> 101 THEN 3200
3210 POKE FND(Z), Q: RETURN
REM Defeated a Vendor
REM
REM Player gets:
REM Plate armor
REM A sword
REM A strength potion (Add 1d6 to ST, capped at 18)
REM An intelligence potion (Add 1d6 to IQ, capped at 18)
REM A dexterity potion (Add 1d6 to DX, capped at 18)
REM If the player doesn't have a lamp, they get a lamp
3220 PRINT: PRINT "YOU GET ALL HIS WARES:": PRINT: PRINT "PLATE ARMOR": AV = 3: AH = 21
3230 PRINT "A SWORD": WV = 3: PRINT "A STRENGTH POTION": ST = FNC(ST + FNA(6))
3240 PRINT "AN INTELLIGENCE POTION": IQ = FNC(IQ + FNA(6))
3250 PRINT "A DEXTERITY POTION": DX = FNC(DX + FNA(6)): IF LF = 0 THEN PRINT "A LAMP": LF = 1
REM 2460 "You now get his hoard of..."
3260 GOTO 2460
REM Print a horizontal rule of asterisks
3270 FOR Q = 1 TO 64: PRINT "*";:NEXT Q: PRINT: PRINT: RETURN
REM Ask for a player choice
REM Return the first letter of the choice in O$
3280 PRINT: PRINT "YOUR CHOICE ";
3290 INPUT O$: O$ = LEFT$(O$, 1): RETURN
REM Ask how many points the player wants to add to a stat
REM (value returned in Q)
3300 PRINT "HOW MANY POINTS DO YOU ADD TO "; Z$;: INPUT O$: PRINT
3310 Q = VAL(O$): IF (Q = 0) AND (ASC(O$) <> 48) THEN Q = -1
3320 IF (Q < 0) OR (Q > OT) OR (Q <> INT(Q)) THEN PRINT "** ";: GOTO 3300
3330 OT = OT - Q: RETURN
REM Input an integer number
REM Return the number in Q
3340 INPUT O$: Q = INT(VAL(O$)): RETURN
REM Prompt in Z$, input a number between 1-8, inclusive
3350 PRINT: PRINT Z$;: INPUT O$: Q = INT(VAL(O$)): IF (Q > 0) AND (Q < 9) THEN RETURN
3360 PRINT: PRINT "** TRY A NUMBER FROM 1 TO 8": GOTO 3350
REM Buy stat potions from Vendor
3370 PRINT: PRINT "WANT TO BUY A POTION OF "; Z$; " FOR 1000 GP's ";: GOTO 3290
REM Print out your new stat value
3380 PRINT: PRINT "YOUR "; Z$; " IS NOW "; Q: RETURN
REM Prompt to buy weapons or armor
3390 PRINT "HERE IS A LIST OF "; Z$; " YOU CAN BUY (WITH COST IN <>)": PRINT: RETURN
3400 PRINT "YOU ARE AT ("; X; ","; Y; ") LEVEL "; Z: RETURN