1620 lines
50 KiB
Plaintext
1620 lines
50 KiB
Plaintext
'********************************************************************************
|
|
'* *
|
|
'* G H O S T T O W N *
|
|
'* *
|
|
'* for the Gigatron TTL Computer System *
|
|
'* *
|
|
'* ported from TRS-80 *
|
|
'* *
|
|
'* by W A Bushby (January 2022) *
|
|
'* *
|
|
'* version 0.86 *
|
|
'* *
|
|
'* *
|
|
'* Based on Scott Adam's Source Code *
|
|
'* published in Byte magazine December 1980 *
|
|
'* *
|
|
'* *
|
|
'********************************************************************************
|
|
_runtimePath_ "../../runtime"
|
|
_runtimeStart_ &hFFFF
|
|
_arraysStart_ &hFFFF
|
|
_codeRomType_ ROMv5a
|
|
|
|
|
|
'audio fix for ROMv5a
|
|
POKE &h21, peek(&h21) OR 3
|
|
|
|
SOUND OFF
|
|
|
|
MODE 1
|
|
SET FGBG_COLOUR, &h3F00
|
|
CLS
|
|
|
|
'********************************************************************************
|
|
'* *
|
|
'* DATA DEFINITIONS FOR THE ADVENTURE *
|
|
'* *
|
|
'********************************************************************************
|
|
|
|
TITLE$ = "GHOST TOWN"
|
|
|
|
const IL = 78 ' Item Count
|
|
const CL = 237 ' Action Count
|
|
const NL = 239 ' Verb/Noun Count
|
|
const RL = 38 ' Room Count
|
|
const MX = 7 ' Maximum Carry Load Count
|
|
const AR = 1 ' Initial Room Number
|
|
const TT = 13 ' Treasure Count
|
|
const LN = 4 ' Used Command Word Length
|
|
const LT = 175 ' Light Time
|
|
const ML = 98 ' Message Count
|
|
const TR = 15 ' Treasure room
|
|
const OL = 7 ' One Letter Command Count
|
|
const LV = 25 ' LOOK verb
|
|
const IN = 62 ' INVENTORY noun
|
|
|
|
NoLineBreak = 0
|
|
|
|
Debug = 0
|
|
|
|
DIM NV(1)
|
|
DIM NT$(1)
|
|
DIM I2%(IL)
|
|
|
|
' Vocab, Condition(1-5),Action(1-2) Vocab = (Verb X 150) + Noun
|
|
'E V E N T S
|
|
|
|
DIM CA(CL,7) = {3,193,180,520,0,0,5472,11400, ' Random Events
|
|
100,1402,183,1400,0,0,8926,1647,
|
|
100,29,0,40,240,0,11923,12229,
|
|
0,120,0,0,0,0,12153,600,
|
|
0,20,500,60,3400,0,8779,12229,
|
|
0,140,480,220,0,0,12204,12054,
|
|
0,20,20,20,0,0,11937,8100,
|
|
100,20,140,0,0,0,12381,11027,
|
|
0,515,309,16,0,0,15720,0,
|
|
0,15,340,349,0,0,15806,11458,
|
|
0,140,60,60,0,0,12231,11631,
|
|
0,204,349,0,0,0,8626,0,
|
|
100,348,1414,224,192,1400,7950,0,
|
|
100,348,227,1414,1400,220,9300,0,
|
|
20,4516,120,0,0,0,8700,0,
|
|
0,0,0,0,0,0,0,0,
|
|
20,60,249,0,0,0,12223,0,
|
|
0,15,460,220,0,0,4229,9300,
|
|
0,15,600,80,200,80,11931,11931,
|
|
0,60,0,0,0,0,12150,0,
|
|
100,349,1413,1400,0,0,8850,0,
|
|
100,473,80,0,0,0,12227,10950,
|
|
0,15,460,0,0,0,8850,0, ' Random clear screen ? Changed 8920 to 8850
|
|
0,80,0,0,0,0,12150,0,
|
|
4,494,0,0,0,0,7551,0,
|
|
100,368,360,120,0,0,9081,11623,
|
|
0,15,280,840,0,0,10800,0,
|
|
0,120,0,0,0,0,12150,0,
|
|
100,1221,181,0,0,0,19176,9150,
|
|
0,0,0,0,0,0,0,0,
|
|
15,44,1434,1413,0,0,6160,21900,
|
|
100,721,706,720,0,0,8250,0, ' Hide 'which i am wearing' if hat is not held
|
|
100,328,320,180,0,0,9059,11400,
|
|
0,0,0,0,0,0,0,0,
|
|
100,901,0,0,0,0,18361,0,
|
|
0,0,0,0,0,0,0,0,
|
|
100,764,160,0,0,0,8700,0,
|
|
100,168,180,0,0,0,8700,0,
|
|
100,188,180,40,0,0,9073,12150,
|
|
0,40,0,0,0,0,2028,2181,
|
|
0,0,0,0,0,0,11716,9750,
|
|
100,168,0,0,0,0,9450,0,
|
|
100,40,0,0,0,0,12223,0,
|
|
0,128,60,120,0,0,12510,0,
|
|
0,48,60,40,0,0,12360,0,
|
|
0,68,200,60,0,0,12360,0,
|
|
0,108,20,100,0,0,12360,0,
|
|
0,40,0,0,0,0,12150,0,
|
|
6100,0,0,0,0,0,7200,0, ' Action Triggered Events
|
|
226,0,0,0,0,0,16200,0,
|
|
4507,40,40,40,0,0,12233,12221,
|
|
4650,160,180,0,0,0,8758,0,
|
|
5700,146,0,0,0,0,905,0,
|
|
5710,141,122,160,174,0,1060,7950,
|
|
1510,122,420,120,0,0,1351,7858,
|
|
257,0,0,0,0,0,7200,0,
|
|
6465,203,0,0,0,0,162,21600,
|
|
6000,163,203,223,160,200,223,8909,
|
|
0,220,240,0,0,0,8903,0,
|
|
0,1615,60,0,0,0,8700,0,
|
|
253,164,209,0,0,0,915,0,
|
|
253,164,208,200,0,0,204,10500,
|
|
6900,164,209,200,283,360,167,8758,
|
|
10971,302,0,0,0,0,2868,9150,
|
|
3771,302,0,0,0,0,187,0,
|
|
5067,1502,600,0,0,0,7342,8173,
|
|
0,2015,60,0,0,0,11458,0,
|
|
211,362,240,0,0,0,204,11400,
|
|
3772,383,403,0,0,0,171,3300,
|
|
193,42,229,0,0,0,923,0,
|
|
9176,462,0,0,0,0,930,0,
|
|
9900,462,240,460,480,40,8772,8731,
|
|
1531,482,745,0,0,0,4800,0,
|
|
193,42,228,260,1133,0,204,11400,
|
|
9600,482,269,0,0,0,183,1534,
|
|
9600,482,268,0,0,0,187,0,
|
|
7565,42,229,0,0,0,3625,0,
|
|
8723,42,229,403,220,0,10976,8809,
|
|
0,615,40,0,0,0,8700,0,
|
|
9175,443,544,860,874,0,18752,1553,
|
|
8700,42,229,0,0,0,12627,0,
|
|
7587,482,260,500,269,0,1535,8753,
|
|
6934,523,283,520,180,360,222,11458,
|
|
10384,183,520,180,0,0,222,11400,
|
|
10650,462,0,0,0,0,5550,0,
|
|
9175,443,0,0,0,0,178,7551,
|
|
8439,563,0,0,0,0,189,0,
|
|
192,642,300,0,0,0,204,11400,
|
|
10245,663,0,0,0,0,190,0,
|
|
7565,622,620,580,743,0,222,0,
|
|
215,582,280,0,0,0,204,11400,
|
|
7565,622,0,0,0,0,17100,0,
|
|
4800,180,0,0,0,0,8700,0,
|
|
159,82,100,0,0,0,8176,150,
|
|
214,62,220,0,0,0,8176,150,
|
|
3772,383,0,0,0,0,171,3000,
|
|
196,22,320,0,0,0,8176,150,
|
|
10650,0,0,0,0,0,191,1650,
|
|
8799,1203,1243,1240,1200,1180,8922,150,
|
|
11503,164,360,0,0,0,204,11400,
|
|
253,364,0,0,0,0,943,0,
|
|
11503,364,160,0,0,0,204,11400,
|
|
7598,0,0,0,0,0,5850,0,
|
|
6460,0,0,0,0,0,1356,0,
|
|
12068,703,754,740,40,0,8008,1535, ' 80/68 = SHAKE HAT
|
|
1531,743,740,0,0,0,7801,0, ' GET KEY
|
|
12518,701,720,0,0,0,11101,10950,
|
|
0,754,0,0,0,0,4960,6600,
|
|
12321,763,302,300,780,0,222,0,
|
|
10971,782,780,340,360,0,222,7950,
|
|
3818,703,0,0,0,0,152,6750,
|
|
213,102,380,0,0,0,204,11400,
|
|
16676,462,0,0,0,0,930,0,
|
|
16737,462,0,0,0,0,930,0,
|
|
13200,164,0,0,0,0,7200,0,
|
|
5744,143,464,814,800,0,7957,1573,
|
|
0,1615,60,0,0,0,8700,0,
|
|
10233,503,0,0,0,0,199,0,
|
|
223,823,480,0,0,0,204,11400,
|
|
225,322,500,0,0,0,204,11400,
|
|
1575,322,0,0,0,0,6306,16950,
|
|
173,322,500,0,0,0,204,11400,
|
|
6918,283,120,360,0,0,12223,8700,
|
|
0,0,0,0,0,0,15388,13200,
|
|
0,308,280,0,0,0,8626,8700,
|
|
0,288,0,0,0,0,13288,13200,
|
|
0,288,280,0,0,0,9056,11400,
|
|
0,120,0,0,0,0,12253,0,
|
|
5005,504,409,0,0,0,235,17700,
|
|
200,262,420,0,0,0,8454,11401,
|
|
13350,140,3500,140,0,0,12229,12223,
|
|
0,340,0,0,0,0,17460,13288,
|
|
0,524,0,0,0,0,17356,8626,
|
|
0,527,0,0,0,0,16111,0,
|
|
0,14,0,220,0,0,9300,0,
|
|
1505,524,540,0,0,0,204,11400,
|
|
202,862,520,0,0,0,204,11400,
|
|
203,882,560,0,0,0,204,11400,
|
|
8550,903,563,900,0,0,8888,16460,
|
|
9827,903,0,0,0,0,16650,0,
|
|
5700,903,0,0,0,0,16650,0,
|
|
5700,905,920,404,0,0,203,0,
|
|
164,922,580,0,0,0,204,11400,
|
|
9829,963,960,980,100,0,222,16858,
|
|
1531,1003,0,0,0,0,900,0,
|
|
13981,1054,0,0,0,0,161,7050,
|
|
13541,1023,1020,1040,0,0,222,10950,
|
|
0,615,60,0,0,0,8700,0,
|
|
13970,1020,1082,1034,1054,1074,203,0,
|
|
1520,1082,0,0,0,0,1013,0,
|
|
7520,1082,0,0,0,0,1014,0,
|
|
1541,1063,1060,0,0,0,7801,0,
|
|
13970,1082,0,0,0,0,150,0,
|
|
14025,322,0,0,0,0,17700,0,
|
|
5700,184,254,214,200,0,203,1060,
|
|
193,42,228,1134,260,0,7554,11446,
|
|
14639,1134,1120,1143,0,0,8000,16350,
|
|
14037,482,0,0,0,0,150,0,
|
|
1541,1023,1020,1060,0,0,8924,150,
|
|
7565,42,228,0,0,0,5850,0,
|
|
14700,900,140,900,140,0,12381,12531,
|
|
12517,681,0,0,0,0,150,0,
|
|
14850,0,0,0,0,0,7200,0,
|
|
3768,283,120,120,0,0,12228,17931,
|
|
11400,0,0,0,0,0,6300,0,
|
|
6933,283,360,500,503,0,8759,150,
|
|
6933,183,503,500,0,0,209,0,
|
|
6913,242,183,240,0,0,209,18750,
|
|
6913,242,283,360,240,0,8701,8975,
|
|
6913,1223,183,0,0,0,277,18961,
|
|
6913,1223,283,0,0,0,277,18961,
|
|
13981,1053,1002,0,0,0,19629,19273,
|
|
0,1223,0,0,0,0,19477,18961,
|
|
0,243,240,0,0,0,19475,8850,
|
|
5005,504,408,0,0,0,235,11090,
|
|
0,400,0,0,0,0,18741,9000,
|
|
0,720,320,0,0,0,8176,8850,
|
|
1562,0,0,0,0,0,9900,0,
|
|
9000,0,0,0,0,0,9900,0,
|
|
12750,0,0,0,0,0,900,0,
|
|
8713,1203,243,1200,240,1220,8922,150,
|
|
4950,0,0,0,0,0,235,0,
|
|
4350,0,0,0,0,0,900,0,
|
|
6900,283,0,0,0,0,17550,0,
|
|
6900,183,0,0,0,0,17550,0,
|
|
6900,0,0,0,0,0,905,0,
|
|
8550,563,0,0,0,0,188,0,
|
|
17250,681,504,600,1160,380,18654,9300,
|
|
2719,0,0,0,0,0,8,0,
|
|
9687,462,0,0,0,0,930,0,
|
|
15077,902,703,0,0,0,271,18361,
|
|
14002,862,760,389,380,0,203,8700,
|
|
171,0,0,0,0,0,1023,0,
|
|
15548,1183,1200,1180,1240,0,222,7950,
|
|
15548,1223,1200,1220,240,0,222,7950,
|
|
1513,243,0,0,0,0,7200,0,
|
|
9900,0,0,0,0,0,150,0,
|
|
14002,862,0,0,0,0,150,0,
|
|
13981,1263,1053,0,0,0,19580,10950,
|
|
0,1222,820,1280,1040,0,10927,8850,
|
|
0,242,240,0,0,0,8850,0,
|
|
0,0,0,0,0,0,12076,0,
|
|
13981,1263,1054,0,0,0,1697,0,
|
|
12101,0,0,0,0,0,19650,0,
|
|
10950,0,0,0,0,0,900,0,
|
|
225,504,0,0,0,0,20850,0,
|
|
3815,42,0,0,0,0,19800,0,
|
|
16650,0,0,0,0,0,161,7050,
|
|
12300,763,0,0,0,0,19977,0,
|
|
211,1162,620,0,0,0,204,11400,
|
|
255,1302,660,0,0,0,204,11534,
|
|
3858,664,1334,0,0,0,152,20250,
|
|
1609,1334,1320,1340,0,0,11153,150,
|
|
1609,1323,1320,0,0,0,7801,0,
|
|
211,1342,680,0,0,0,204,11400,
|
|
6545,163,0,0,0,0,162,20400,
|
|
269,1382,700,0,0,0,204,11400,
|
|
1505,604,100,0,0,0,204,11400,
|
|
15750,1402,1434,1420,0,0,224,5687,
|
|
15750,0,0,0,0,0,187,1697,
|
|
3770,1282,1454,1440,0,0,203,1060,
|
|
16500,1243,322,403,400,1463,209,10950,
|
|
0,1240,400,0,0,0,8908,0,
|
|
16500,322,1183,0,0,0,1038,0,
|
|
5700,141,0,0,0,0,1061,0,
|
|
265,1482,740,0,0,0,204,11400,
|
|
9266,1523,1514,1500,0,0,19177,8059,
|
|
9266,1523,1513,0,0,0,127,19050,
|
|
16500,322,0,0,0,0,910,21450,
|
|
9176,1502,0,0,0,0,930,0,
|
|
16148,1203,0,0,0,0,174,0,
|
|
3750,0,0,0,0,0,152,1726,
|
|
6000,0,0,0,0,0,910,21450,
|
|
173,504,0,0,0,0,20850,0,
|
|
17250,0,0,0,0,0,1697,0,
|
|
8700,0,0,0,0,0,984,4050,
|
|
160,0,0,0,0,0,1356,0,
|
|
0,0,0,0,0,0,0,0
|
|
}
|
|
|
|
|
|
|
|
const DIM OL$(OL) = "N","S","E","W","U","D","I","L"
|
|
|
|
const DIM NV$(NL) = {"AUTO", "ANY", "GO", "NORTH", "*WALK", "SOUTH", "*RUN", "EAST", "*CLIM", "WEST", "*ENTE", "UP", "*MOUN",
|
|
"DOWN", "*RIDE", "GAME", ".", "AROU", ".", "STAB", "GET", "MANU", "*TAKE", "*PILE", "PICK", "HILL", "*GRAB", "GUNP", "*COLL", "GRAV", "*LIFT",
|
|
"SULF", ".", "*POWD", ".", "CHAR", "DROP", "MATC", "*PUT", "ON", "*THRO", "SAFE", "*LEAV", "MIRR", "*REMO", "COMP", "*TOSS", "HORS", ".",
|
|
"*MAGN", "LOOK", "BELL", "*EXAM", "GHOS", "*DESC", "*FIGU", "*CHEC", "HAND", "HELP", "*FEET", "SAVE", "HEAD", "QUIT" , "KEY", "SCOR", "*KEYS", "SAY", "MAP",
|
|
"*YELL", "CAND", "*SCRE", "*LIGH", "*WHIS", "MUSI", "*SING", "BULL", "DIG", "STAB" , "*SHOV", "DERR", "MIX", "*GUN", "*MAKE", "WIRE", ".", "STOR", "SMEL", "JAIL", "*TAST",
|
|
"ROOF", "*EAT", "SIGN", "BURN", "BARB", "*IGNI", "TUMB", "*LIGH", "*SAGE", ".", "*BRUS", "OPEN", "MINE", "*UNLO", "*ENTR", "LOCK", "BED", ".",
|
|
"HOTE", "CLOS", "ROOM", "*SHUT", "GIDD", "LOAD", "*GITT", "SHOO", "*GIDY", "WITH", "*GITY", "*USE", "COIN", "INVE", "TOWN", "HIT", "HOLE", "*RING", "INVE", "*BEAT", "STAL", "PLAY", "SALO", "KILL", "DOOR", "CLAP",
|
|
"WIND", "*APPL", "SPUR", "READ", "HAT", "UNLI", "STRI", "*EXTI", "TAPE", "LIST", "*ROLL", "*HEAR", "WALL", "BREA", "TELE", "*SMAS", "*OFFI", "*BUST", "PAIN",
|
|
"JUMP", "SLEE", "*LEAP", "SNAK", "CUT", "*RATT", "*SLIC", "WORM", "SHAK", "*SLIM", "*WAVE", "SHOV", "TAPE", "BOX", "WEAR", "*CASH", "*PUTO", "ROAD", "FIND", "FORK", "*LOCA", "VAIN",
|
|
"*SEEK", "PIAN", "CROS", "$200", "SLEE", "GO", "CONN", "*BOAR", "*SPLI", "PATH", "*REPA", "HELL", "MOVE", "HI", "*PUSH", "FIEL", "*PRES", "CRYS",
|
|
"*TAP","GOLD","PASS","*NUGG", "WAIT", "KEG", "CLEA", "NAIL", "COVE", "FUSE", "", "TOPP", ".", "LOBB", "EMPT", "RAVI", "*SPIL", "*RIDG", "DANC", "SHAC",
|
|
"", "TRAI", "FILL", "MOUN", "", "FLOO", "", "PLAN", "SHOE", "PELT", "KNOX", "CUP", "*TOUC", "BAG", "*FEEL", "*DUST", "*KISS", "HAMM", "SPUR", "TEEP",
|
|
"*KICK", "TOM", "", "HOW", "", "NECK", "", "COUN"}
|
|
|
|
DIM RM%(RL,5) = {0, 0, 0, 0, 0, 0, 0, 0, 17, 2, 0, 0,
|
|
0, 0, 1, 3, 0, 0, 0, 0, 2, 4, 0, 0,
|
|
0, 0, 3, 6, 0, 0, 0, 4, 0, 0, 0, 0,
|
|
0, 0, 4, 7, 0, 0, 9, 8, 6, 0, 0, 0,
|
|
7, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 8, 0, 0, 2, 0, 0, 0, 0,
|
|
0, 0, 11, 0, 0, 0, 1, 0, 0, 0, 0, 0,
|
|
13, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
|
|
0, 1, 0, 0, 0, 0, 0, 0, 20, 1, 0, 0,
|
|
0, 0, 0, 32, 0, 0, 0, 5, 0, 0, 0, 0,
|
|
0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 10, 22,
|
|
0, 23, 0, 0, 21, 0, 22, 0, 0, 0, 0, 0,
|
|
0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0,
|
|
3, 0, 27, 0, 0, 0, 0, 0, 0, 0, 20, 0,
|
|
0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0,
|
|
0, 0, 18, 0, 0, 0, 0, 32, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 33, 0, 28, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0
|
|
}
|
|
|
|
const DIM RS$(RL) = {"", "GHOST TOWN", "GHOST TOWN", "GHOST TOWN", "GHOST TOWN",
|
|
"STABLE", "ROAD", "FORK IN THE ROAD",
|
|
"*I'M ON A RIDGE ABOVE A NARROW RAVINE. I SEE MOUNTAINS IN THE DISTANCE",
|
|
"LARGE FIELD", "RAVINE", "SALOON", "HIDDEN OFFICE", "JAIL",
|
|
"CELL", "DRY GOODS STORE", "BARBERSHOP", "ROAD",
|
|
"*I'M ON A RIDGE ABOVE A RAVINE", "STALL", "*I'M ON BOOT HILL",
|
|
"MINE", "MINE", "MINE", "TELEGRAPH OFFICE", "*I'M ON BACK OF 'OLE PAINT",
|
|
"WARM BED", "HOTEL ROOM", "LOBBY", "GRAVE",
|
|
"*I'M FLAT ON MY BACK IN A MANURE PILE", "STOREROOM", "MOUNTAIN TRAIL",
|
|
"LINE SHACK", "ROOT CELLAR", "*I'M BEHIND THE COUNTER",
|
|
"HIDDEN CANYON", "TEEPEE", "LOT OF ~TROUBLE~"
|
|
}
|
|
|
|
|
|
const DIM MS$(ML) = {"*** INVALID MESSAGE ***",
|
|
"OK",
|
|
"I SEE",
|
|
"WELCOME TO ADVENTURE 9 ~GHOST TOWN~",
|
|
"BY SCOTT ADAMS DEDICATED: THE CHERENS",
|
|
"I'VE NOTHING TO DO WITH THAT",
|
|
"SORRY I CAN'T",
|
|
"I FOUND",
|
|
"WEAR?",
|
|
"~BARF~",
|
|
"SOMETHING",
|
|
" NOTHING SPECIAL",
|
|
"REMINDS ME OF",
|
|
"YOU'VE MADE",
|
|
" ~BONUS~ POINTS OUT OF A POSSIBLE 50 IN",
|
|
"ITS FULL OF SAGE BRUSH, TUMBLEWEED AND IS IMPASSABLE",
|
|
" MOVES",
|
|
"THE DRY WASH IS BURNT CLEAR",
|
|
"FLYING GLASS SLICES ME UP",
|
|
"CRACK!",
|
|
" NORTH",
|
|
"ITS POINTING TO THE",
|
|
" HORSHOE",
|
|
"DOORS CLOSED, WINDOWS BARRED!",
|
|
"WITH WHAT?",
|
|
"INSIDE BOLT IS LATCHED!",
|
|
"MAGNET!",
|
|
" DOESN'T SEEM TO DO IT!",
|
|
"DING-DING",
|
|
"BELL RINGS SOMEWHERE",
|
|
"MY HAND PASSES THROUGH!",
|
|
"GHOST STANDS, BOWS, VANISHES!",
|
|
"SILLY, WRONG TYPE OF KEYS!",
|
|
"ODD",
|
|
"GOES THUNK!",
|
|
"FALLS OUT",
|
|
"CANDLE BLEW OUT!",
|
|
"VERY PRETTY",
|
|
"SHOOTS STREAM OF WATER",
|
|
"IT ALREADY IS",
|
|
"DROP *TREASURES* HERE, THEN SAY ~SCORE~",
|
|
"I HEAR",
|
|
"WHAT?",
|
|
"TOO STEEP!",
|
|
"FEELS STRANGE",
|
|
"ITS MY SIZE",
|
|
"DON'T COLLECT $200 THEN DON'T PASS GO! ~CONTRAPOSITIVE~",
|
|
"HAPPENS",
|
|
"HOW?",
|
|
"ITS MINE, DIG ROOF!",
|
|
"GHOSTLY VOICE WHISPERS: ",
|
|
"VAIN...",
|
|
"MATCH FLARES UP...",
|
|
"...AND THEN GOES OUT",
|
|
"ITS GETTING",
|
|
"SUNSET!",
|
|
"I FEEL REFRESHED",
|
|
"NIGHTS ARE COLD! I CAUGHT PNEUMONIA",
|
|
"TRY: ~SLEEP~",
|
|
"IT WORKED!",
|
|
"ITS GONE",
|
|
"SNAKE WON'T LET ME",
|
|
"THAT FELT GOOD",
|
|
"TOO BIG!",
|
|
"ITS LOCKED!",
|
|
"GOOD MORNING",
|
|
"GOOD NIGHT",
|
|
"ITS FIREPROOF",
|
|
"HE WON'T BUDGE",
|
|
" LEFT!",
|
|
"DARK!",
|
|
"THROUGH THE HAT!",
|
|
"I'M SNAKE BIT",
|
|
"I'M NOT ALICE!",
|
|
"HE BUCKS, I'M THROWN",
|
|
"WHOOSH!",
|
|
"~TOO CLOSE~! PIECES OF ME RAIN DOWN FOR DAYS!",
|
|
"~BOOM!~",
|
|
"... .... .- -.- . - --- .--. .--. . .-.",
|
|
"~SPARK!~ * * * * *",
|
|
"CLICK",
|
|
"IS HE A GHOST? ANYWAY WRONG IDEA",
|
|
"THERE'S NOT EVEN A KEYHOLE!",
|
|
"MASKING TAPE",
|
|
"FLOORBOARDS SURE ARE CREAKY",
|
|
"LOOSE PLANK HERE",
|
|
"SALT PETER",
|
|
"I WON A PROZE!",
|
|
"REACH A NAIL",
|
|
"MAY NEED TO SAY A MAGIC WORD HERE",
|
|
"AFTER A LONG RIDE",
|
|
"HE RIDES OFF WITHOUT ME",
|
|
"GERONIMO SAYS: ~ITS EASY! HAPPY LANDINGS!~",
|
|
"IS MISSING",
|
|
"ROTTEN EGGS",
|
|
".",
|
|
"IN SALOON",
|
|
"SCARED THEM OFF!",
|
|
"BUY A ~GIGATRON~ COMPUTER TODAY."
|
|
}
|
|
|
|
const DIM IA$(IL) = {"WORN OUT FIDDLE STRINGS/STRI/", "BARBERSHOP", "JAIL",
|
|
"SALOON", "STABLE", "STALL", "MANURE PILE", "SHOVEL/SHOV/", ' 8 items
|
|
"WHITE CRYSTALS/CRYS/", "LIT CANDLE/CAND/", "YELLOW POWDER/SULF/",
|
|
"SAGEBRUSH CHARCOAL/CHAR/", "PILE OF GUNPOWDER", "ENTRANCE TO A MINE",
|
|
"MATCHES/MATC/", "MIRROR", "'OLE PAINT", "BROKEN MIRROR",
|
|
"HOLE IN THE WALL", "COMPASS/COMP/", "HORSESHOE/HORS/",
|
|
"MALE COW MANURE/MANU/", "LARGE BELL/BELL/", ' 23 items
|
|
"WRAITHLIKE FIGURE PLAYING EQUALLY GHOSTLY PIANO",
|
|
"PIANO WITH SET OF KEYS", "MAP/MAP/", "UNLIT CANDLE/CAND/",
|
|
"*SILVER BULLET*/BULL/", "*GOLDEN DERRINGER*/DERR/", "OPEN DOOR",
|
|
"SIGN- ~RING FOR ROOM SERVICE~/SIGN/", "LOCKED DOOR", "DRY-GOODS STORE",
|
|
"SIGN/SIGN/", "*SILVER SPURS*/SPUR/", "STETSON HAT/HAT/",
|
|
"WHICH I'M WEARING", "SMALL KEY/KEY/", "ROLL OF TAPE/TAPE/",
|
|
"TAPED UP MIRROR", "*GOLD NUGGET*/GOLD/", "TELEGRAPH OFFICE",
|
|
"EMPTY MATCHBOOK/MATC/", "BED", "HOTEL", "RATTLESNAKE/SNAK/", ' 46 items
|
|
"OPEN GRAVE", "*GOLD COIN*/COIN/", "PURPLE WORM/WORM/",
|
|
"PURPLE SLIME/WORM/", "TELEGRAPH KEY", "2 LOOSE WIRES", "SPLICED WIRE",
|
|
"PIECES OF WIRE/WIRE/", "LARGE SAFE", "*CASHBOX*/BOX/",
|
|
"*$200*/$200/", "*ORIENTAL GO BOARD*/GO/", '58 items
|
|
"HOLE KICKED IN WALL AND BARE HOOF PRINT", "KEG OF NAILS/KEG/",
|
|
"EMPTY KEG/KEG/", "KEG OF GUNPOWDER/KEG/", "NAILS/NAIL/", "TELEGRAPH KEY",
|
|
"SMOKING OPEN SAFE", "LINE SHACK", "PLANK/PLAN/",
|
|
"HOLE IN FLOOR", "*PELTS*/PELT/", "COUNTER", "GHOSTLY SQUARE DANCE",
|
|
"*SILVER CUP*/CUP/", "*BAG GOLD DUST*/BAG/", "HAMMER/HAMM/", "TEEPEE", '75 ITEMS
|
|
"INDIAN GHOST", "*SACRED TOM TOM*/TOM/", "*TORQUOISE NECKLACE*/NECK/", '78 ITEMS
|
|
"A PAINTED MESSAGE THAT SAYS: PORTED TO ~GIGATRON~ BY W. BUSHBY (2022)"
|
|
}
|
|
|
|
DIM IA%(IL) = {0, 1, 1, 2, 4, 5, 5, 15, 0, 0, 0, 10, 0, 10, 15, 11, 19, 0, 0, 15, 19, 0, 11, 0, 0, 0, 22, 21, 13, 0,
|
|
35, 13, 2, 15, 25, 16, 0, 0, 0, 0, 0, 3, 0, 0, 3, 20, 0, 29, 29, 0, 24, 0, 0, 0, 24, 35, 0, 12, 0, 31, 0, 0, 0,
|
|
33, 0, 32, 0, 0, 34, 28, 0, 0, 0, 14, 36, 0, 37, 37, 34}
|
|
|
|
|
|
|
|
const HELD = 255
|
|
const NONSET = 255
|
|
|
|
'********************************************************************************
|
|
'* *
|
|
'* PROGRAM INITIALISATION *
|
|
'* *
|
|
'********************************************************************************
|
|
|
|
SET FG_COLOUR, 57
|
|
|
|
DIM Counters(16) = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|
DIM SpecialFlags%(32) = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|
DIM SavedRooms%(RL) = 0
|
|
|
|
Z$="I'VE TOO MUCH TOO CARRY. TRY -TAKE INVENTORY-"
|
|
|
|
UL$ = "========================="
|
|
|
|
FOR X=0 TO IL
|
|
I2(X)=IA(X)
|
|
NEXT X
|
|
|
|
GOTO SkipSave
|
|
|
|
'********************************************************************************
|
|
'* *
|
|
'* Introduction Screen *
|
|
'* *
|
|
'********************************************************************************
|
|
|
|
STARTSCREEN:
|
|
CLS
|
|
SET BG_COLOUR, 0
|
|
SET FG_COLOUR, 57
|
|
|
|
TL = 26-LEN(TITLE$)
|
|
AT (TL*6)/2, 0:PRINT TITLE$
|
|
PRINT
|
|
SET FG_COLOUR, 58
|
|
PRINT " Unless told differently you must find ";
|
|
SET FG_COLOUR, 11
|
|
PRINT "TREASURES";
|
|
SET FG_COLOUR, 58
|
|
PRINT " and return them to their proper place!"
|
|
PRINT:PRINT "I'm your puppet. give me English commands that consist of a noun and verb"
|
|
|
|
GOSUB WaitAnyKey
|
|
|
|
|
|
CLS
|
|
PRINT "Some examples..."
|
|
PRINT
|
|
PRINT "To find out what you're carrying you might say : ";
|
|
SET FG_COLOUR, 28
|
|
PRINT "TAKE INVENTORY"
|
|
SET FG_COLOUR, 58
|
|
PRINT "To go into a hole you might say : ";
|
|
SET FG_COLOUR, 28
|
|
PRINT "GO HOLE"
|
|
SET FG_COLOUR, 58
|
|
PRINT
|
|
PRINT "Directions, Inventory and Look can be used with the single first letters"
|
|
|
|
GOSUB WaitAnyKey
|
|
|
|
CLS
|
|
PRINT
|
|
PRINT "If you are stuck, type "
|
|
SET FG_COLOUR, 28
|
|
PRINT "HELP"
|
|
SET FG_COLOUR, 58
|
|
PRINT
|
|
PRINT "You will at times need special items to do things but I'm sure you'll be a good Adventurer";
|
|
PRINT " and figure these things out."
|
|
PRINT
|
|
PRINT "Happy Adventuring..."
|
|
|
|
GOSUB WaitEnter
|
|
|
|
CLS
|
|
|
|
RETURN
|
|
|
|
'********************************************************************************
|
|
'* *
|
|
'* PROGRAM LOGIC *
|
|
'* *
|
|
'********************************************************************************
|
|
|
|
SkipSave:
|
|
|
|
WaitCLS = 0
|
|
SavedRoom = AR
|
|
|
|
X%=0
|
|
Y%=0
|
|
Z%=0
|
|
KK%=0
|
|
R%=AR
|
|
V%=0
|
|
N%=0
|
|
LL%=0
|
|
F%=0
|
|
|
|
K$ = " "
|
|
TP$=K$
|
|
|
|
IP%=0
|
|
P%=0
|
|
LX%=LT
|
|
|
|
DF=0
|
|
DONEXT = 0
|
|
|
|
CURCOUNT = 0
|
|
|
|
FOR I=0 TO 16
|
|
Counters(I) = 0
|
|
NEXT I
|
|
|
|
FOR I=0 TO 32
|
|
SpecialFlags(I) = 0
|
|
NEXT I
|
|
|
|
FOR I=0 TO RL
|
|
SavedRooms(I) = 0
|
|
NEXT I
|
|
|
|
FOR X=0 TO IL
|
|
I2(X)=IA(X)
|
|
NEXT X
|
|
|
|
GOSUB STARTSCREEN
|
|
|
|
GOSUB WHEREAMI
|
|
|
|
GOTO SKIPINPUT
|
|
|
|
'********************************************************************************
|
|
'* *
|
|
'* INPUT AND PROCESS CONTROL *
|
|
'* *
|
|
'********************************************************************************
|
|
|
|
GETINPUT:
|
|
SET FG_COLOUR, 56
|
|
|
|
INPUT "TELL ME WHAT TO DO?";TP$
|
|
|
|
WaitCLS = 0
|
|
|
|
|
|
SET FG_COLOUR, 58
|
|
PRINT
|
|
GOSUB FINDCOMMAND
|
|
|
|
IF F <> 0
|
|
Text$ = "YOU USE WORD(S) I DON'T KNOW"
|
|
GOSUB PrintLine
|
|
GOTO GETINPUT
|
|
ENDIF
|
|
|
|
GOSUB ANALYSECOMMAND
|
|
|
|
IF IA(9) = HELD
|
|
LX=LX-1
|
|
IF LX=0
|
|
PRINT "LIGHT HAS RUN OUT"
|
|
IA(9) =0
|
|
ELSEIF LX<25
|
|
PRINT "LIGHT RUNS OUT IN " ;LX; " TURNS!"
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
SKIPINPUT:
|
|
NV(0)=0
|
|
GOSUB ANALYSECOMMAND
|
|
GOTO GETINPUT
|
|
|
|
'********************************************************************************
|
|
'* *
|
|
'* LOCATE COMMAND TABLE REFERENCE *
|
|
'* *
|
|
'********************************************************************************
|
|
|
|
FINDCOMMAND:
|
|
|
|
KK=0:XX=0
|
|
NT$(0)=" "
|
|
NT$(1)=" "
|
|
Verb$ = " "
|
|
Noun$ = " "
|
|
|
|
IF LEN(TP$) = 0 THEN RETURN
|
|
|
|
TP$=UCASE$(TP$)
|
|
|
|
' 1 Letter Commands
|
|
XX=NONSET
|
|
IF LEN(TP$) = 1
|
|
FOR X=0 TO OL
|
|
IF TP$=OL$(X) THEN XX=X:X=OL
|
|
NEXT X
|
|
ENDIF
|
|
|
|
IF XX <> NONSET
|
|
IF XX < 6 THEN NV(0) = 1:NT$(0) = "GO":NV(1) = XX+1:NT$(1) = NV$((XX+1)*2+1)
|
|
IF XX = 6 THEN NV(0) = 10:NT$(0) = "GET":NV(1) = IN:NT$(1) = NV$(IN*2+1)
|
|
IF XX = 7 THEN NV(0) = LV:NT$(0) = NV$(LV*2):NV(1) = 0
|
|
|
|
Verb$ = NT$(0)
|
|
Noun$ = NT$(1)
|
|
|
|
NT$(0) = LEFT$(NT$(0),LN)
|
|
NT$(1) = LEFT$(NT$(1),LN)
|
|
|
|
GOTO FindEnd
|
|
ENDIF
|
|
|
|
' Normal Command Processing
|
|
|
|
XX=0
|
|
FOR X=0 TO LEN(TP$)
|
|
K$=MID$(TP$, X, 1)
|
|
IF K$=" "
|
|
NT$(KK) = LEFT$(TP$,X)
|
|
XX=X+1
|
|
KK=1
|
|
ENDIF
|
|
NEXT X
|
|
|
|
NT$(KK) = RIGHT$(TP$,LEN(TP$)-XX)
|
|
|
|
Verb$ = NT$(0)
|
|
Noun$ = NT$(1)
|
|
|
|
NT$(0) = LEFT$(NT$(0),LN)
|
|
NT$(1) = LEFT$(NT$(1),LN)
|
|
|
|
FOR X=0 TO 1
|
|
NV(X)=0
|
|
IF NT$(X)=" "
|
|
GOTO NXTX
|
|
ELSE
|
|
FOR Y=0 TO ((NL-1)/2)
|
|
K$=NV$(Y*2+X)
|
|
IF LEFT$(K$,1)="*" THEN K$=RIGHT$(K$,LEN(K$)-1) ' CHECK RIGHT n-1 characters
|
|
ENDIF
|
|
|
|
IF X=1
|
|
IF Y<7
|
|
K$=LEFT$(K$, LN)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NT$(X)=K$
|
|
NV(X)=Y
|
|
ELSE
|
|
NEXT Y
|
|
GOTO NXTX
|
|
ENDIF
|
|
|
|
DROPSTAR: 'Drop alias and use main verb
|
|
IF LEFT$(NV$(NV(X)*2+X), 1) = "*"
|
|
NV(X)=NV(X)-1
|
|
GOTO DROPSTAR
|
|
ENDIF
|
|
NXTX:
|
|
NEXT X ' Line 230
|
|
|
|
FindEnd:
|
|
F = (NV(0)<1) OR ((LEN(NT$(1))>1) AND (NV(1)<1))
|
|
RETURN
|
|
|
|
'********************************************************************************
|
|
'* *
|
|
'* DISPLAY LOCATION DATA *
|
|
'* *
|
|
'********************************************************************************
|
|
|
|
WHEREAMI:
|
|
IF DF
|
|
IF (IA(9)<>HELD) AND (IA(9) <> R)
|
|
PRINT "I CAN'T SEE, ITS TOO DARK."
|
|
WAIT(100)
|
|
RETURN
|
|
ENDIF
|
|
ENDIF
|
|
|
|
KK=NONSET
|
|
|
|
SET FG_COLOUR, 19
|
|
IF LEFT$(RS$(R),1)="*"
|
|
LL = LEN(RS$(R))-1
|
|
Text$ = RIGHT$(RS$(R),LL)
|
|
ELSE
|
|
Text$ = "I'M IN A " + RS$(R)
|
|
ENDIF
|
|
|
|
GOSUB PrintLine
|
|
|
|
SET FG_COLOUR, 59
|
|
PRINT UL$
|
|
SET FG_COLOUR, 58
|
|
|
|
COM=NONSET
|
|
FOR Z=0 TO IL
|
|
IF KK <> 0
|
|
IF IA(Z)=R
|
|
SET FG_COLOUR, 28
|
|
PRINT "VISIBLE ITEMS HERE:"
|
|
SET FG_COLOUR, 58
|
|
KK=0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
GOTO PRINTITEMS
|
|
|
|
STRIPSLASH:
|
|
TP$=IA$(Z)
|
|
IF RIGHT$(TP$,1) = "/"
|
|
FOR W=1 TO LEN(IA$(Z))
|
|
IF MID$(IA$(Z),W,1) = "/"
|
|
W = LEN(IA$(Z))
|
|
ELSE
|
|
TP$ = LEFT$(IA$(Z),W+1)
|
|
NEXT W
|
|
ENDIF
|
|
ENDIF
|
|
RETURN
|
|
|
|
PRINTITEMS: ' Line 300
|
|
IF IA(Z)<>R
|
|
GOTO SKIPPRINTITEMS
|
|
ELSE
|
|
GOSUB STRIPSLASH
|
|
IF LEN(TP$)+3 > 63 THEN PRINT
|
|
ENDIF
|
|
|
|
IF COM <> NONSET THEN PRINT ", ";
|
|
Text$ = TP$
|
|
NoLineBreak = 1
|
|
|
|
GOSUB PrintLine
|
|
NoLineBreak = 0
|
|
|
|
COM=Z
|
|
|
|
|
|
SKIPPRINTITEMS:
|
|
NEXT Z
|
|
PRINT
|
|
|
|
KK=NONSET:
|
|
FOR Z=0 TO 5
|
|
IF KK <> 0
|
|
IF RM(R, Z) <> 0
|
|
SET FG_COLOUR, 28
|
|
PRINT "OBVIOUS EXITS: "
|
|
SET FG_COLOUR, 58
|
|
KK=0
|
|
ENDIF
|
|
ENDIF
|
|
IF RM(R,Z) <> 0 THEN PRINT NV$((Z+1)*2+1);" ";
|
|
NEXT Z
|
|
|
|
PRINT
|
|
PRINT
|
|
|
|
RETURN
|
|
|
|
'********************************************************************************
|
|
'* *
|
|
'* ANALYSE COMMAND AND PROCESS INSTRUCTIONS *
|
|
'* *
|
|
'********************************************************************************
|
|
|
|
ANALYSECOMMAND: ' Line 360
|
|
F2=NONSET
|
|
F=NONSET
|
|
F3=0
|
|
|
|
IF NV(0)=1 AND NV(1)<7 ' GO NORTH.....DOWN
|
|
GOTO J610
|
|
ELSE
|
|
FOR X=0 TO CL
|
|
V=CA(X, 0)/150
|
|
|
|
IF NV(0)=0
|
|
IF V<>0 THEN RETURN
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NV(0)<>V
|
|
GOTO DOLOOPX
|
|
ELSE
|
|
N=CA(X,0)-(V*150)
|
|
ENDIF
|
|
|
|
IF CA(X, 0)=0 AND DONEXT = 0 THEN GOTO DOLOOPX ' Added In Strange Odyssey to fix random Jumps to other rooms
|
|
|
|
IF NV(0)=0
|
|
F=0
|
|
RR=RND(100)
|
|
IF RR <= N
|
|
GOTO J400
|
|
ELSEIF DONEXT > 0
|
|
IF CA(X+1,0) <> 0 THEN DONEXT=0
|
|
GOTO J400
|
|
ELSE
|
|
GOTO DOLOOPX
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF N<>NV(1) AND N<>0
|
|
GOTO DOLOOPX
|
|
ENDIF
|
|
|
|
J400:
|
|
JP = 0
|
|
F2=NONSET: F=0: F3=NONSET
|
|
FOR Y=1 TO 4
|
|
W=CA(X,Y)
|
|
LL=W/20
|
|
KK=W-(LL*20)
|
|
F1=NONSET
|
|
|
|
ON KK+1 GOTO J9000,J550,J430,J450,J470,J490,J500,J510,J520,J530,J540,J410,J420,J440,J460,J480,J541,J542,J543,J544,J545 'KK=19 only
|
|
|
|
J410: ' (10)Carrying Somthing ?
|
|
F1=NONSET
|
|
FOR Z=0 TO IL
|
|
IF IA(Z)=HELD
|
|
GOTO J550
|
|
ELSE
|
|
NEXT Z
|
|
ENDIF
|
|
|
|
F1=0
|
|
GOTO J550
|
|
J420: ' (11)Not Carrying Anything ?
|
|
F1=0
|
|
FOR Z=0 TO IL
|
|
IF IA(Z)=HELD
|
|
GOTO J550
|
|
ELSE
|
|
NEXT Z
|
|
ENDIF
|
|
|
|
F1=NONSET
|
|
GOTO J550
|
|
J430: ' (1)Is Item Held ? () = KK
|
|
F1=(IA(LL)=HELD): GOTO J550
|
|
J440: ' (12)Is item not held and not here ?
|
|
F1=(IA(LL)<>HELD) AND (IA(LL)<>R):GOTO J550
|
|
J450: ' (2)Item in room
|
|
F1=(IA(LL)=R):GOTO J550
|
|
J460: ' (13)Item not hidden
|
|
F1=(IA(LL)<>0):GOTO J550
|
|
J470: ' (3)Is item held or in room ?
|
|
F1=(IA(LL)=R) OR (IA(LL)=HELD):GOTO J550
|
|
J480: ' (14) Item is hidden ?
|
|
F1=(IA(LL)=0): GOTO J550
|
|
J490: ' (4)Is it this room ?
|
|
F1=(R=LL):GOTO J550
|
|
J500: ' (5)Is Item not here ?
|
|
F1=(IA(LL)<>R):GOTO J550
|
|
J510: ' (6)Is Item not held ?
|
|
F1=(IA(LL)<>HELD):GOTO J550
|
|
J520: ' (7)Not this room ?
|
|
F1=(R<>LL)
|
|
GOTO J550
|
|
J530: ' (8)Specified Flag is TRUE (15 Flags) MUST SUPPORT 32 FLAGS
|
|
F1=SpecialFlags(LL)
|
|
F1=(F1<>0): GOTO J550
|
|
J540: ' (9)Specified Flag is FALSE (15 Flags) MUST SUPPORT 32 FLAGS
|
|
F1=SpecialFlags(LL)
|
|
F1=(F1=0): GOTO J550
|
|
|
|
J541: ' (15) Counter is > LL
|
|
F1=NONSET
|
|
IF CURCOUNT > LL THEN F1=0
|
|
GOTO J550
|
|
|
|
J542: ' (16) Counter is <= LL
|
|
F1=NONSET
|
|
IF CURCOUNT <= LL THEN F1=0
|
|
GOTO J550
|
|
|
|
J543: ' (17) Item LL is NOT in orginal location
|
|
IF IA(LL) = I2(LL) THEN F1=0
|
|
GOTO J550
|
|
|
|
J544: ' (18) Item LL is in original location
|
|
IF IA(LL) <> I2(LL) THEN F1=0
|
|
GOTO J550
|
|
|
|
J545: ' (19) Current Counter = LL
|
|
F1=(CURCOUNT=LL)
|
|
GOTO J550
|
|
|
|
|
|
J550:
|
|
F2=(F2 AND F1)
|
|
IF F2
|
|
GOTO DOLOOPY
|
|
ELSE
|
|
GOTO DOLOOPX
|
|
ENDIF
|
|
DOLOOPY:
|
|
NEXT Y
|
|
|
|
IP=0
|
|
FOR U=1 TO 4
|
|
KK=(U-1)/2+6
|
|
|
|
ON U GOTO J9000, J570, J580, J570, J580
|
|
|
|
J570:
|
|
IF X>CL THEN GOTO J960
|
|
AC=CA(X,KK) / 150: GOTO J590
|
|
J580:
|
|
IF X>CL THEN GOTO J960
|
|
AC=CA(X,KK) - ((CA(X,KK)/150)*150)
|
|
J590:
|
|
IF AC>101
|
|
GOTO J600
|
|
ELSEIF AC=0
|
|
GOTO J960
|
|
ELSEIF AC<52
|
|
Text$ = MS$(AC)
|
|
GOSUB PrintLine
|
|
|
|
WaitCLS = 1
|
|
|
|
GOTO J960
|
|
ELSE
|
|
IF (AC-51) > 38
|
|
PRINT "UNKNOWN COMMAND ROUTINE=";AC-51
|
|
GOTO J600
|
|
ENDIF
|
|
|
|
ON AC-51 GOTO J9000, C52, C53, C54, C55, C56, C57, C58, C59, C60, C61, C62, C63, C64, C65, C66, C67, C68, C69, C70, C71, C72, C73, C74, C75, C76, C77, C78, C79, C80, C81, C82, C83, J9000, C85, C86, C87, C88, C89
|
|
J600:
|
|
Text$ = MS$(AC-50)
|
|
GOSUB PrintLine
|
|
|
|
WaitCLS = 1
|
|
|
|
GOTO J960
|
|
ENDIF
|
|
J610: ' MOVE
|
|
L=DF
|
|
IF L THEN L = DF AND (IA(9) <> R) AND (IA(9) <> HELD)
|
|
IF L THEN PRINT "DANGEROUS TO MOVE IN THE DARK !"
|
|
WAIT(100)
|
|
|
|
IF NV(1)<1 THEN PRINT "GIVE ME A DIRECTION TOO.":GOTO J1040
|
|
KK=RM(R,NV(1)-1)
|
|
|
|
IF KK<1
|
|
IF L
|
|
PRINT "I FELL DOWN AND BROKE MY NECK.":KK=RL:DF=0
|
|
ELSE
|
|
Text$ = "I CAN'T GO IN THAT DIRECTION"
|
|
GOSUB PrintLine
|
|
GOTO J1040
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT L
|
|
if WaitCLS > 0 THEN WAIT(100):WaitCLS = 0
|
|
CLS
|
|
ENDIF
|
|
|
|
R=KK:GOSUB WHEREAMI:GOTO J1040
|
|
C52: ' (52) GET
|
|
L=0
|
|
FOR Z=1 TO IL
|
|
IF IA(Z)=HELD THEN L=L+1
|
|
NEXT Z
|
|
|
|
IF L>=MX
|
|
Text$ = Z$
|
|
GOSUB PrintLine
|
|
GOTO J970
|
|
ENDIF
|
|
|
|
GOSUB J1050
|
|
IA(P)=HELD
|
|
GOTO J960
|
|
|
|
C53: ' (53) DROP
|
|
GOSUB J1050
|
|
IA(P)=R
|
|
GOTO J960
|
|
C54: ' (54) MOVE ROOM
|
|
GOSUB J1050:
|
|
R=P
|
|
GOTO J960
|
|
C55:
|
|
C59: ' (59) Hide Item
|
|
GOSUB J1050
|
|
IA(P)=0
|
|
GOTO J960
|
|
C56: ' Set Dark
|
|
DF=NONSET:GOTO J960
|
|
C57: ' (57) Unset Dark
|
|
DF=0:GOTO J960
|
|
C58: ' (58)
|
|
GOSUB J1050
|
|
C58B: ' Set Bit Flag
|
|
SSF = SpecialFlags(P)
|
|
SpecialFlags(P) = 1
|
|
GOTO J960
|
|
C60: ' (60)
|
|
GOSUB J1050
|
|
C60B: ' Unset Bit Flag
|
|
SSF = SpecialFlags(P)
|
|
SpecialFlags(P) = 0
|
|
GOTO J960
|
|
C61:
|
|
PRINT "I'M DEAD...":R=RL:DF=0:GOTO C76
|
|
C62:
|
|
GOSUB J1050
|
|
L=P
|
|
GOSUB J1050
|
|
IA(L)=P
|
|
GOTO J960
|
|
C63: ' (63) game over message
|
|
INPUT "THE GAME IS OVER, ANOTHER?";K$
|
|
|
|
IF LEFT$(K$,1)="N" OR LEFT$(K$,1)="n"
|
|
END
|
|
ELSE
|
|
FOR X=0 TO IL
|
|
IA(X)=I2(X)
|
|
NEXT X
|
|
GOTO SkipSave
|
|
ENDIF
|
|
|
|
C64:
|
|
C76: ' (76) show room data
|
|
IF WaitCLS > 0 THEN WAIT(100):WaitCLS = 0
|
|
CLS
|
|
GOSUB WHEREAMI
|
|
GOTO J960
|
|
|
|
C65: ' Count Stored Treasure
|
|
L=0
|
|
FOR Z=1 TO IL
|
|
IF IA(Z)=TR
|
|
IF LEFT$(IA$(Z),1)="*" THEN L=L+1
|
|
ENDIF
|
|
NEXT Z:
|
|
|
|
TCL = GET("FG_COLOUR")
|
|
|
|
PRINT "I'VE STORED ";L;
|
|
|
|
SET FG_COLOUR, 11
|
|
PRINT " TREASURES";
|
|
SET FG_COLOUR, TCL
|
|
|
|
PRINT ". ON A SCALE OF 0 TO 100 THAT RATES AS ";
|
|
|
|
SET FG_COLOUR, 28
|
|
PRINT (L*100/TT)
|
|
SET FG_COLOUR, TCL
|
|
|
|
IF L=TT
|
|
PRINT "WELL DONE.": GOTO C63
|
|
ELSE
|
|
GOTO J960
|
|
ENDIF
|
|
|
|
C66: ' (66) Inventory
|
|
SET FG_COLOUR, 28
|
|
PRINT "I'M CARRYING:"
|
|
SET FG_COLOUR, 58
|
|
|
|
K$="NOTHING"
|
|
|
|
FOR Z=0 TO IL
|
|
IF IA(Z)<>HELD
|
|
GOTO C66B
|
|
ELSE
|
|
GOSUB STRIPSLASH
|
|
ENDIF
|
|
|
|
Text$=" "+TP$
|
|
GOSUB PrintLine
|
|
|
|
K$=" "
|
|
C66B:
|
|
NEXT Z
|
|
PRINT K$:GOTO J960
|
|
|
|
C67:
|
|
P=0:GOTO C58B
|
|
|
|
C68:
|
|
P=0:GOTO C60B
|
|
|
|
C69: 'Light Lamp
|
|
LX=LT:IA(9)=HELD:GOTO J960
|
|
|
|
C70: ' (70) Clear Screen
|
|
If WaitCLS > 0 THEN WAIT(100):WaitCLS = 0
|
|
|
|
CLS
|
|
GOTO J960
|
|
|
|
C71:
|
|
PRINT "GAMES CANNOT BE SAVED AT MOMENT"
|
|
GOTO J960
|
|
|
|
C72: ' (72) SWAP ITEM
|
|
GOSUB J1050:
|
|
L=P:GOSUB J1050:
|
|
Z=IA(P)
|
|
IA(P)=IA(L):IA(L)=Z:GOTO J960 ' EG: Tides on WAIT
|
|
|
|
C73: ' (73)
|
|
DONEXT=X+1
|
|
NV(0) = 0
|
|
GOTO J960
|
|
|
|
C74: ' (74)Auto Pickup Item
|
|
Redraw=0
|
|
GOSUB J1050
|
|
IF IA(P)=R THEN Redraw=1
|
|
IA(P)=HELD
|
|
IF Redraw THEN GOSUB WHEREAMI
|
|
GOTO J960
|
|
|
|
C75: ' (75) SWap Items in Room
|
|
Redraw = 0
|
|
|
|
GOSUB J1050:IONE=P
|
|
GOSUB J1050:ITWO=P
|
|
|
|
IF IA(IONE)=R THEN Redraw = 1
|
|
|
|
IA(IONE)=IA(ITWO)
|
|
|
|
IF IA(ITWO)=R THEN Redraw = 1
|
|
|
|
IF Redraw > 0 THEN GOSUB WHEREAMI
|
|
|
|
GOTO J960
|
|
|
|
C77: ' (77) Decement current counter
|
|
IF CURCOUNT > 0 THEN CURCOUNT=CURCOUNT-1
|
|
GOTO J960
|
|
|
|
C78: ' (78) Display Current Counter
|
|
SET FG_COLOUR, 28
|
|
PRINT CURCOUNT;
|
|
SET FG_COLOUR, 58
|
|
|
|
GOTO J960
|
|
|
|
C79: ' (79) Set Current Counter
|
|
GOSUB J1050
|
|
CURCOUNT = P
|
|
GOTO J960
|
|
|
|
C80: ' (80) Jump to save room and save old room
|
|
TEMP=R
|
|
R=SavedRoom
|
|
SavedRoom=TEMP
|
|
GOTO J960
|
|
|
|
C81: ' (81) Select a counter. Current counter is swapped with backup counter
|
|
GOSUB J1050
|
|
TEMP = CURCOUNT
|
|
CURCOUNT=Counters(P)
|
|
Counters(P)=TEMP
|
|
|
|
GOTO J960
|
|
|
|
C82: ' (82) Add Value to Current Counter
|
|
GOSUB J1050
|
|
CURCOUNT = CURCOUNT + P
|
|
GOTO J960
|
|
|
|
C83: ' (83) Subtract Value from current counter
|
|
GOSUB J1050
|
|
IF P <= CURCOUNT
|
|
CURCOUNT = CURCOUNT-P
|
|
ELSE
|
|
CURCOUNT = -1
|
|
ENDIF
|
|
GOTO J960
|
|
|
|
C85: ' (85) Output Noun
|
|
TCL = GET("FG_COLOUR")
|
|
SET FG_COLOUR, 7
|
|
PRINT Noun$
|
|
SET FG_COLOUR, TCL
|
|
GOTO J960
|
|
|
|
C86: ' (86) Print Carriage return
|
|
PRINT
|
|
GOTO J960
|
|
|
|
C87: ' (87) Swap current room with saved room
|
|
GOSUB J1050
|
|
|
|
TEMP=R
|
|
R=SavedRooms(P)
|
|
SavedRooms(P)=TEMP
|
|
GOTO J960
|
|
|
|
C88: ' (88) wait 2 seconds
|
|
WAIT(200)
|
|
GOTO J960
|
|
|
|
C89: ' (89) wait 5 seconds
|
|
WAIT(500)
|
|
GOTO J960
|
|
|
|
J960:
|
|
NEXT U
|
|
J970:
|
|
IF (DONEXT > 0) AND (CA(X+1,0) = 0) THEN GOTO DOLOOPX
|
|
IF NV(0) <> 0 THEN GOTO J990
|
|
DOLOOPX:
|
|
NEXT X
|
|
|
|
|
|
J990:
|
|
IF NV(0)=0 THEN GOTO J1040
|
|
GOSUB J1060
|
|
IF F THEN PRINT "I DON'T UNDERSTAND YOUR COMMAND" :GOTO J1040
|
|
IF F2=0 THEN PRINT "I CAN'T DO THAT YET" : GOTO J1040
|
|
J1040:
|
|
RETURN
|
|
|
|
J1050:
|
|
IP=IP+1
|
|
W=CA(X,IP)
|
|
P=W/20
|
|
M=W-(P*20)
|
|
IF M<>0
|
|
GOTO J1050
|
|
ELSE
|
|
RETURN
|
|
ENDIF
|
|
|
|
J1060:
|
|
IF (NV(0) <> 10) AND (NV(0) <> 18) OR F3 > 0 THEN GOTO J1230
|
|
|
|
IF NV(1)=0 THEN PRINT "WHAT?": GOTO J1180
|
|
IF NV(0) <> 10 THEN GOTO J1110
|
|
|
|
L=0
|
|
FOR Z=0 TO IL
|
|
IF IA(Z)=HELD THEN L=L+1
|
|
NEXT Z
|
|
IF L>=MX THEN PRINT Z$:GOTO J1180
|
|
|
|
J1110:
|
|
KK=0
|
|
FOR X=0 TO IL ' Find Usable Item
|
|
IF RIGHT$(IA$(X),1)<>"/" ' Can not be used
|
|
GOTO J1190
|
|
ELSE
|
|
LL=LEN(IA$(X))-1
|
|
TP$=MID$(IA$(X),0,LL)
|
|
FOR Y=2 TO LL:IF MID$(TP$,Y,1)<>"/" THEN NEXT Y: GOTO J1190
|
|
ENDIF
|
|
|
|
TP$=LEFT$(RIGHT$(TP$,LL-Y-1),LN)
|
|
IF RIGHT$(TP$,1)=" " THEN TP$=LEFT$(TP$,LN-1)
|
|
XX=NV(1) ' Can't use array as ref to array
|
|
|
|
LLL=LN ' To adjust for shorter commands
|
|
FOR I=0 TO LN-1
|
|
IF ASC(MID$(TP$,I,1))=0 THEN LLL=I
|
|
NEXT I
|
|
TP$=LEFT$(TP$,LLL)
|
|
|
|
IF TP$<>NV$(XX*2+1) THEN GOTO J1190 ' Above adjustment needed to make comparison work
|
|
|
|
IF NV(0)=10 THEN GOTO J1160
|
|
|
|
IF IA(X)<>HELD
|
|
KK=1
|
|
GOTO J1190
|
|
ELSE
|
|
IA(X)=R
|
|
KK=3
|
|
GOTO J1170
|
|
ENDIF
|
|
|
|
J1160:
|
|
IF IA(X)<>R
|
|
KK=2
|
|
GOTO J1190
|
|
ELSE
|
|
IA(X)=HELD
|
|
KK=3
|
|
ENDIF
|
|
J1170:
|
|
PRINT "OK "
|
|
J1180:
|
|
F=0: RETURN
|
|
|
|
J1190: ' Drop or get item
|
|
NEXT X
|
|
|
|
IF KK=1
|
|
PRINT "I'M NOT CARRYING IT"
|
|
ELSE
|
|
IF KK=2 THEN PRINT "I DON'T SEE IT HERE"
|
|
ENDIF
|
|
|
|
IF KK=0
|
|
IF NOT F3 THEN PRINT "ITS BEYOND MY POWER TO DO THAT":F=0
|
|
ENDIF
|
|
|
|
IF KK<>0 THEN F=0
|
|
|
|
J1230:
|
|
RETURN
|
|
|
|
'********************************************************************************
|
|
'* *
|
|
'* ENHANCED PRINT ROUTINE FOR COLOUR AND SPACING *
|
|
'* *
|
|
'********************************************************************************
|
|
|
|
PrintLine:
|
|
TCL = GET("FG_COLOUR")
|
|
|
|
HON = 0
|
|
IF LEN(Text$) < 26
|
|
FOR II=0 TO LEN(Text$)
|
|
IF MID$(Text$, II, 1) = "~"
|
|
IF HON = 0
|
|
SET FG_COLOUR, 7
|
|
HON=1
|
|
ELSE
|
|
SET FG_COLOUR, TCL
|
|
HON=0
|
|
ENDIF
|
|
ELSEIF MID$(Text$, II, 1) = "*"
|
|
IF HON = 0
|
|
SET FG_COLOUR, 11
|
|
HON=1
|
|
ELSE
|
|
SET FG_COLOUR, TCL
|
|
HON=0
|
|
ENDIF
|
|
ELSE
|
|
PRINT MID$(Text$, II, 1);
|
|
ENDIF
|
|
NEXT II
|
|
|
|
IF NoLineBreak = 0 THEN PRINT " "
|
|
|
|
RETURN
|
|
ENDIF
|
|
|
|
TP = 0
|
|
TX$=Text$
|
|
|
|
TXLoop:
|
|
TX$ = LEFT$(TX$, 25)
|
|
TL=25
|
|
WHILE RIGHT$(TX$,1)<>" "
|
|
TL = TL-1
|
|
TX$=LEFT$(TX$,TL)
|
|
WEND
|
|
|
|
FOR II=0 TO LEN(TX$)
|
|
IF MID$(TX$, II, 1) = "~"
|
|
IF HON = 0
|
|
SET FG_COLOUR, 7
|
|
HON=1
|
|
ELSE
|
|
SET FG_COLOUR, TCL
|
|
HON=0
|
|
ENDIF
|
|
ELSEIF MID$(TX$, II, 1) = "*"
|
|
IF HON = 0
|
|
SET FG_COLOUR, 11
|
|
HON=1
|
|
ELSE
|
|
SET FG_COLOUR, TCL
|
|
HON=0
|
|
ENDIF
|
|
ELSE
|
|
PRINT MID$(TX$, II, 1);
|
|
ENDIF
|
|
NEXT II
|
|
|
|
TX$ = RIGHT$(Text$, LEN(Text$)-(TP+TL))
|
|
|
|
IF LEN(TX$) < 26
|
|
FOR II=0 TO LEN(TX$)
|
|
IF MID$(TX$, II, 1) = "~"
|
|
IF HON = 0
|
|
SET FG_COLOUR, 7
|
|
HON=1
|
|
ELSE
|
|
SET FG_COLOUR, TCL
|
|
HON=0
|
|
ENDIF
|
|
ELSEIF MID$(TX$, II, 1) = "*"
|
|
IF HON = 0
|
|
SET FG_COLOUR, 11
|
|
HON=1
|
|
ELSE
|
|
SET FG_COLOUR, TCL
|
|
HON=0
|
|
ENDIF
|
|
ELSE
|
|
PRINT MID$(TX$, II, 1);
|
|
ENDIF
|
|
NEXT II
|
|
|
|
IF NoLineBreak = 0 THEN PRINT " "
|
|
|
|
RETURN
|
|
ENDIF
|
|
|
|
TP = TP+TL
|
|
GOTO TXLoop
|
|
|
|
RETURN
|
|
|
|
'********************************************************************************
|
|
'* *
|
|
'* KEYBOARD CONTROL *
|
|
'* *
|
|
'********************************************************************************
|
|
|
|
WaitAnyKeyNoMessage:
|
|
jj = 255
|
|
|
|
LOOPWaitAnyKeyNM:
|
|
j = GET("SERIAL_RAW")
|
|
IF jj = 255
|
|
if j<>255 THEN GOTO EndWaitAnyKeyNM
|
|
ENDIF
|
|
jj = j
|
|
GOTO LOOPWaitAnyKeyNM
|
|
|
|
EndWaitAnyKeyNM:
|
|
RETURN
|
|
|
|
|
|
WaitAnyKey:
|
|
SET FG_COLOUR, 58
|
|
PRINT:PRINT "Hit ";
|
|
SET FG_COLOUR, 28
|
|
PRINT "ANY KEY";
|
|
SET FG_COLOUR, 58
|
|
PRINT " to continue..."
|
|
|
|
jj = 255
|
|
|
|
LOOPWaitAnyKey:
|
|
j = GET("SERIAL_RAW")
|
|
IF jj = 255
|
|
if j<>255 THEN GOTO EndWaitAnyKey
|
|
ENDIF
|
|
jj = j
|
|
GOTO LOOPWaitAnyKey
|
|
|
|
EndWaitAnyKey:
|
|
RETURN
|
|
|
|
|
|
WaitEnter:
|
|
|
|
PRINT:PRINT "Hit ";
|
|
SET FG_COLOUR, 28
|
|
PRINT "ENTER";
|
|
SET FG_COLOUR, 58
|
|
PRINT " to start"
|
|
|
|
jj = 255
|
|
|
|
LOOPWaitEnter:
|
|
j = GET("SERIAL_RAW")
|
|
IF jj = 255
|
|
if j=10 THEN GOTO EndWaitEnter
|
|
ENDIF
|
|
jj = j
|
|
GOTO LOOPWaitEnter
|
|
|
|
EndWaitEnter:
|
|
|
|
RETURN
|
|
|
|
|
|
'********************************************************************************
|
|
'* *
|
|
'* DEBUGGING AID *
|
|
'* *
|
|
'********************************************************************************
|
|
|
|
J8000:
|
|
IF Debug=0
|
|
Debug=1
|
|
PRINT "Debug Mode is ON"
|
|
ELSE
|
|
Debug=0
|
|
PRINT "Debug Mode is OFF"
|
|
ENDIF
|
|
RETURN
|
|
|
|
|
|
J9000:
|
|
PRINT "FALSE GOTO = ";AC-51
|
|
END
|
|
|