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 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