Opry99er Posted May 11, 2013 Share Posted May 11, 2013 So... I spent some time writing and converting the baseball game for the BBS. Now I have another itch--- An XB Adventure game which does not require the Adventure module... Primarily to run on the BBSes as well. Here's the plan: Come up with the premise, collect input from the members here on Atariage, write the game for the BBS, then get the "go-ahead" from the SysOp(s) to add it to the BBS as a playable door game. I had started work on a Beryl Reichardt adventure game, but scrapped it when I realized how inefficient the code was... I was able to read a book on Planet-99 which gave some very interesting insights into the development of the Adventure games and it really got me going! The methods described there are fascinatingly simple and straight forward and allow for a TON of stuff to be coded in with minimal duplicate code and minimal program space. Using a string variable array and TWO standard variable arrays is the key to having your map laid out AND having the ability to stock your world with the items you'll need to design the quest as you see fit. The key to the game is the parsing engine... How does the user communicate with the computer to TELL IT WHAT HE/SHE WANTS TO DO?!?! Well, as we all know, a computer doesn't speak english, and we cannot possibly code in every possible command. Therefore, we create a parsing engine which takes a noun and a verb (two separate string variables INPUT from the user) and attempts to read those from a list of acceptable nouns and verbs in the system. For instance, "OPEN DOOR" contains a verb and a noun. A successful parsing engine would read the noun (to determine if that thing (the door) is in the vicinity) and IF that noun IS legal, read the verb (to determine if the selected action can be performed on the noun)... For instance, "EAT BREAD" is cool if you have bread in your inventory. "EAT DOOR" does not work, even if DOOR is in the current "room." In this case you have a valid noun but an invalid verb to associate with that noun. This is the basis of the parser, and I have a much better understanding of it now than I did two days ago. With Willsy's permission, I will post a zipped pdf file of the book I'm referring to to this thread, once he gets on and allows it. =) Is anyone interested in participating in this development project? I will not be starting it immediately, as I have some pressing matters at hand writing some music and working with a couple suites... (ASLP by Hully and XB256 by Harry)... I would say that in the next week or two I will be returning my attention to this project. I just got my PEB set back up tonight and I'm picking up a monitor on Sunday, so I'll be hardware-active again this weekend.... WOOO HOOOO!!!!! That's an exciting thing for me. Quote Link to comment Share on other sites More sharing options...
matthew180 Posted May 11, 2013 Share Posted May 11, 2013 I'm always interested in support roles, and adventures interest me as well. As for the design, there are many ways to layout the data, and many ways you can accept input. I think a minimal system would not take a noun-verb pair, but rather just allow the user a fixed set of commands like N, S, E, W, Up, Down, Look, Take, Drop, and Use. The "maze" would be limited to those directions, and your inventory would be limited to one item so using an item is obvious. Once you start to want more features, the complexity goes up. Also, since adventures are typically based on stories and individual logic puzzles that unlock other puzzles, the games are typically designed as "engines" instead of hard-coded logic for each puzzle and possibility. Also, the line between hard-coded logic and an engine is very thin, and it does not take adding many features to realize a hard-coded logic solution is not going to work. As with any project, it is best to define the desired features and goals without trying to specify how the solution will be coded. Once you have the scope defined, then start to determine the coding methodology and adjust the features from there. Quote Link to comment Share on other sites More sharing options...
Opry99er Posted May 11, 2013 Author Share Posted May 11, 2013 ...it does not take adding many features to realize a hard-coded logic solution is not going to work. I ran into this in my baseball simulation/game. For a simulation, hard coded logic works great... Once it became a "game" with significant user input, that concept fell apart and I had to adjust quite a few elements in order to facilitate the changes in design. Yes, I like the ideas there. When I get the "ok" from Willsy, I'll post that book on here. It's 89 pages (IIRC), much of which is code. The majority of what you stated above is in there along with a bunch of other stuff. Of course what is NOT in there is tangible and flexible experience... That is what I'm hoping to find here, at the TI programming capital of the universe. =) I'll put some thought into it for a week or so while I get my hardware back up and going... I'm needing real hardware for a project I'm working on, so my focus this next week is to get a few things accomplished on that side, get some loose ends tied up with the baseball BBS game, and get some music composed... Any thoughts and ideas you've got, feel free to tack em onto this thread so we can start thinking about structure. =) Quote Link to comment Share on other sites More sharing options...
+InsaneMultitasker Posted May 11, 2013 Share Posted May 11, 2013 (edited) [/font][/color] Any thoughts and ideas you've got, feel free to tack em onto this thread so we can start thinking about structure. =) When I wrote Murder Motel (online, 25 player BBS game) I used an array to define the possible directions and the room each direction would lead to, 0 indicating an unavailable direction. DATA N,S,E,W,U,D !order of array DATA 2,0,0,0,0,0 !North to room 2 DATA 0,1,0,0,0,0 !South to room 1 Once the array was loaded, I could then modify the room exits/entrances for "special" occurences. If the right action was taken, I could allow the user to go UP to room 3 by recoding the "up" element to point to room 3 as an allowable entry. I am fairly certain I also compressed these direction arrays into a string array (6 characters per string) but would need to check the program to confirm. Regardless, the above code is easier to understand I handled inventory and user locations via a string. Each item or person is represented by its position in the string, as one character, which then tells the program where it resides or who is its owner. This was important to conserve space and to quickly identify items in a room. Using POS and SEG$, one can fairly quickly loop through the matching items without needing to test every data element. Strings also provide for quick and moderately efficient storage to disk, important for saving the game state in a multi-player game but perhaps less important for single user adventures. Common commands like Inventory, Map, Quit are often easy to parse and execute as they are useable in any room. The complexity rises with your strategy and puzzle complexity. If you need to complete five steps in sequence, you need a method to track those steps to ensure the user does them in the right order. Defining the items (door) and verbs (eat) with their possible actions may be one good way to cut down on the parsing and action testing. Many of the XB games I have encountered are written with a basic parser that relies upon the actions and items being 3-4 unique characters long. Some require you to type the entire word or direction -- I usually avoid these games or modify them to accept shorter phrases The parsing is usually pretty easy to accomplish. Determining the actions based on what your parser finds is where your coding usually requires more effort. To paraphrase Matthew, knowing what you want to do and the scope of the game is a good first step. Edited May 11, 2013 by InsaneMultitasker Quote Link to comment Share on other sites More sharing options...
Opry99er Posted May 17, 2013 Author Share Posted May 17, 2013 This is a nice little gem I found while cruising some BBSes last night. It would take minimal customization to port this to work on the TI and with some creative "find and replace" stuff, could run on Heat Wave or the Reef. Enjoy. **BTW, you can play this game by telnetting into Telehack.com (or use their browser feature---but what's the fun in that? =)) **They have about 50-60 BASIC programs there which you can play via the built-in interpreter. =) [/font][/color] 10 REM THE PROGRAM THAT FOLLOWS IS A RECONSTRUCTION 20 REM OF THE OREGON TRAIL GAME WRITTEN FOR HP TIME-SHARED 30 REM BASIC BY DON RAWITSCH AND BILL HEINEMANN AND PAUL DILLENBERGER 40 REM IN 1971. ITS SOURCE IS AN UPDATED VERSION PUBLISHED IN THE 45 REM JULY-AUGUST 1978 ISSUE OF CREATIVE COMPUTING AND POSTED BY 47 REM DESERTHAT TO HIS BLOG AT 48 REM HTTP://DESERTHAT.WORDPRESS.COM/2010/11/07/OREGION-TRAIL-VER-3-BASIC-3 50 REM THAT VERSION WAS DESIGNED FOR THE CDC CYBER 70/73-26 RUNNING BASIC 3. 60 REM THIS VERSION HAS BEEN PORTED BACK TO HP TIME-SHARED BASIC. 61 REM THE BASIC USED HERE IS FAIRLY STANDARD, AND SHOULD RUN ON MANY OTHER 63 REM SYSTEMS WITH JUST A BIT OF CUSTOMIZATION. IF PORTING IT TO ANOTHER BA 80 REM DO TAKE NOTE OF HP TIME-SHARED BASIC'S IDIOSYNCRATIC "GOTO <VAR> OF" 150 REM STATEMENT, USED IN PLACE OF THE "ON" STATEMENT OF MANY OTHER BASICS. 153 REM ALSO PAY ATTENTION TO THE RANDOMIZATION ROUTINES (RND), WHICH WORK 154 REM SOMEWHAT UNUSUALLY IN TIME-SHARED BASIC. 155 REM LINES 6130 THROUGH 6280, WHICH HANDLE THE TIMED SHOOTING SEQUENCES, 156 REM WILL CERTAINLY NEED TO BE CUSTOMIZED TO YOUR BASIC PLATFORM. 157 REM FOR MORE INFORMATION ON HOW THIS PORT CAME TO BE SEE 158 REM HTTP://WWW.FILFRE.NET/TAG/THE-OREGON-TRAIL 159 REM -- JIMMY MAHER, APRIL 3, 2011 160 PRINT "DO YOU NEED INSTRUCTIONS (YES/NO)" 170 REM DIM C$[5] 180 REM RANDOMIZE REMOVED 190 INPUT C$ 200 IF C$="NO" THEN 690 210 PRINT 220 PRINT 230 REM ***INSTRUCTIONS*** 240 PRINT "THIS PROGRAM SIMULATES A TRIP OVER THE OREGON TRAIL FROM" 250 PRINT "INDEPENDENCE MISSOURI TO OREGON CITY, OREGON IN 1847." 260 PRINT "YOUR FAMILY OF FIVE WILL COVER THE 2040 MILE OREGON TRAIL" 270 PRINT "IN 5-6 MONTHS --- IF YOU MAKE IT ALIVE." 280 PRINT 290 PRINT "YOU HAD SAVED $900 TO SPEND FOR THE TRIP, AND YOU'VE JUST" 300 PRINT " PAID $200 FOR A WAGON." 310 PRINT "YOU WILL NEED TO SPEND THE REST OF YOUR MONEY ON THE" 320 PRINT " FOLLOWING ITEMS:" 330 PRINT 340 PRINT " OXEN . YOU CAN SPEND $200-$300 ON YOUR TEAM" 350 PRINT " THE MORE YOU SPEND, THE FASTER YOU'LL GO" 360 PRINT " BECAUSE YOU'LL HAVE BETTER ANIMALS" 370 PRINT 380 PRINT " FOOD . THE MORE YOU HAVE, THE LESS CHANCE THERE" 390 PRINT " IS OF GETTING SICK" 400 PRINT 410 PRINT " AMMUNITION - $1 BUYS A BELT OF 50 BULLETS" 420 PRINT " YOU WILL NEED BULLETS FOR ATTACKS BY ANIMALS" 430 PRINT " AND BANDITS, AND FOR HUNTING FOOD" 440 PRINT 450 PRINT " CLOTHING . THIS IS ESPECIALLY IMPORTANT FOR THE COLD" 460 PRINT " WEATHER YOU WILL ENCOUNTER WHEN CROSSING" 470 PRINT " THE MOUNTAINS" 480 PRINT 490 PRINT " MISCELLANEOUS SUPPLIES . THIS INCLUDES MEDICINE AND" 500 PRINT " OTHER THINGS YOU WILL NEED FOR SICKNESS" 510 PRINT " AND EMERGENCY REPAIRS" 520 PRINT 530 PRINT 540 PRINT "YOU CAN SPEND ALL YOUR MONEY BEFORE YOU START YOUR TRIP -" 550 PRINT "OR YOU CAN SAVE SOME OF YOUR CASH TO SPEND AT FORTS ALONG" 560 PRINT "THE WAY WHEN YOU RUN LOW. HOWEVER, ITEMS COST MORE AT" 570 PRINT "THE FORTS. YOU CAN ALSO GO HUNTING ALONG THE WAY TO GET" 580 PRINT "MORE FOOD." 590 PRINT "WHENEVER YOU HAVE TO USE YOUR TRUSTY RIFLE ALONG THE WAY," 600 PRINT "YOU WILL BE TOLD TO TYPE IN A WORD (ONE THAT SOUNDS LIKE A" 610 PRINT "GUN SHOT). THE FASTER YOU TYPE IN THAT WORD AND HIT THE" 620 PRINT "**RETURN** KEY, THE BETTER LUCK YOU'LL HAVE WITH YOUR GUN." 630 PRINT 640 PRINT "AT EACH TURN, ALL ITEMS ARE SHOWN IN DOLLAR AMOUNTS" 650 PRINT "EXCEPT BULLETS" 660 PRINT "WHEN ASKED TO ENTER MONEY AMOUNTS, DON'T USE A **$**." 670 PRINT 680 PRINT "GOOD LUCK!!!" 690 PRINT 700 PRINT 710 PRINT "HOW GOOD A SHOT ARE YOU WITH YOUR RIFLE?" 720 PRINT " (1) ACE MARKSMAN, (2) GOOD SHOT, (3) FAIR TO MIDDLIN'" 730 PRINT " (4) NEED MORE PRACTICE, (5) SHAKY KNEES" 740 PRINT "ENTER ONE OF THE ABOVE . THE BETTER YOU CLAIM YOU ARE, THE" 750 PRINT "FASTER YOU'LL HAVE TO BE WITH YOUR GUN TO BE SUCCESSFUL." 760 INPUT D9 770 IF D9>5 THEN 790 780 GOTO 810 790 D9=0 800 REM ***INITIAL PURCHASES*** 810 X1=-1 820 K8=S4=F1=F2=M=M9=D3=0 830 PRINT 840 PRINT 850 PRINT "HOW MUCH DO YOU WANT TO SPEND ON YOUR OXEN TEAM"; 860 INPUT A 870 IF A >= 200 THEN 900 880 PRINT "NOT ENOUGH" 890 GOTO 850 900 IF A <= 300 THEN 930 910 PRINT "TOO MUCH" 920 GOTO 850 930 PRINT "HOW MUCH DO YOU WANT TO SPEND ON FOOD"; 940 INPUT F 950 IF F >= 0 THEN 980 960 PRINT "IMPOSSIBLE" 970 GOTO 930 980 PRINT "HOW MUCH DO YOU WANT TO SPEND ON AMMUNITION"; 990 INPUT B 1000 IF B >= 0 THEN 1030 1010 PRINT "IMPOSSIBLE" 1020 GOTO 980 1030 PRINT "HOW MUCH DO YOU WANT TO SPEND ON CLOTHING"; 1040 INPUT C 1050 IF C >= 0 THEN 1080 1060 PRINT "IMPOSSIBLE" 1070 GOTO 1030 1080 PRINT "HOW MUCH DO YOU WANT TO SPEND ON MISCELLANEOUS SUPPLIES"; 1090 INPUT M1 1100 IF M1 >= 0 THEN 1130 1110 PRINT "IMPOSSIBLE" 1120 GOTO 1080 1130 T=700-A-F-B-C-M1 1140 IF T >= 0 THEN 1170 1150 PRINT "YOU OVERSPENT.YOU ONLY HAD $700 TO SPEND. BUY AGAIN" 1160 GOTO 830 1170 B=50*B 1180 PRINT "AFTER ALL YOUR PURCHASES, YOU NOW HAVE ";T;" DOLLARS LEFT" 1190 PRINT 1200 PRINT "MONDAY MARCH 29 1847" 1210 PRINT 1220 GOTO 1750 1230 IF M >= 2040 THEN 5430 1240 REM ***SETTING DATE**** 1250 D3=D3+1 1260 PRINT 1270 PRINT "MONDAY "; 1280 IF D3>10 THEN 1300 1290 ON D3 GOTO 1310,1330,1350,1370,1390,1410,1430,1450,1470,1490 1300 ON D3-10 GOTO 1510,1530,1550,1570,1590,1610,1630,1650,1670,1690 1310 PRINT "APRIL 12 "; 1320 GOTO 1720 1330 PRINT "APRIL 26 "; 1340 GOTO 1720 1350 PRINT "MAY 10 "; 1360 GOTO 1720 1370 PRINT "MAY 24 "; 1380 GOTO 1720 1390 PRINT "JUNE 7 "; 1400 GOTO 1720 1410 PRINT "JUNE 21 "; 1420 GOTO 1720 1430 PRINT "JULY 5 "; 1440 GOTO 1720 1450 PRINT "JULY 19 "; 1460 GOTO 1720 1470 PRINT "AUGUST 2 "; 1480 GOTO 1720 1490 PRINT "AUGUST 16 "; 1500 GOTO 1720 1510 PRINT "AUGUST 31 "; 1520 GOTO 1720 1530 PRINT "SEPTEMBER 13 "; 1540 GOTO 1720 1550 PRINT "SEPTEMBER 27 "; 1560 GOTO 1720 1570 PRINT "OCTOBER 11 "; 1580 GOTO 1720 1590 PRINT "OCTOBER 25 "; 1600 GOTO 1720 1610 PRINT "NOVEMBER 8 "; 1620 GOTO 1720 1630 PRINT "NOVEMBER 22 "; 1640 GOTO 1720 1650 PRINT "DECEMBER 6 "; 1660 GOTO 1720 1670 PRINT "DECEMBER 20 "; 1680 GOTO 1720 1690 PRINT "YOU HAVE BEEN ON THE TRAIL TOO LONG ------" 1700 PRINT "YOUR FAMILY DIES IN THE FIRST BLIZZARD OF WINTER" 1710 GOTO 5170 1720 PRINT "1847" 1730 PRINT 1740 REM ***BEGINNING EACH TURN*** 1750 IF F >= 0 THEN 1770 1760 F=0 1770 IF B >= 0 THEN 1790 1780 B=0 1790 IF C >= 0 THEN 1810 1800 C=0 1810 IF M1 >= 0 THEN 1830 1820 M1=0 1830 IF F >= 13 THEN 1850 1840 PRINT "YOU'D BETTER DO SOME HUNTING OR BUY FOOD AND SOON!!!!" 1850 F=INT(F) 1860 B=INT(B) 1870 C=INT(C) 1880 M1=INT(M1) 1890 T=INT(T) 1900 M=INT(M) 1910 M2=M 1920 IF S4=1 THEN 1950 1930 IF K8=1 THEN 1950 1940 GOTO 1990 1950 T=T-20 1960 IF T<0 THEN 5080 1970 PRINT "DOCTOR'S BILL IS $20" 1980 LET K8=S4=0 1990 IF M9=1 THEN 2020 2000 PRINT "TOTAL MILEAGE IS";M 2010 GOTO 2040 2020 PRINT "TOTAL MILEAGE IS 950" 2030 M9=0 2040 PRINT "FOOD","BULLETS","CLOTHING","MISC. SUPP.","CASH" 2050 PRINT F,B,C,M1,T 2060 IF X1=-1 THEN 2170 2070 X1=X1*(-1) 2080 PRINT "DO YOU WANT TO (1) STOP AT THE NEXT FORT, (2) HUNT, "; 2090 PRINT "OR (3) CONTINUE" 2100 INPUT X 2110 IF X>2 THEN 2150 2120 IF X<1 THEN 2150 2130 LET X=INT(X) 2140 GOTO 2270 2150 LET X=3 2160 GOTO 2270 2170 PRINT "DO YOU WANT TO (1) HUNT, OR (2) CONTINUE" 2180 INPUT X 2190 IF X=1 THEN 2210 2200 LET X=2 2210 LET X=X+1 2220 IF X=3 THEN 2260 2230 IF B>39 THEN 2260 2240 PRINT "TOUGH---YOU NEED MORE BULLETS TO GO HUNTING" 2250 GOTO 2170 2260 X1=X1*(-1) 2270 ON X GOTO 2290,2540,2720 2280 REM ***STOPPING AT FORT*** 2290 PRINT "ENTER WHAT YOU WISH TO SPEND ON THE FOLLOWING" 2300 PRINT "FOOD"; 2310 GOSUB 2330 2320 GOTO 2410 2330 INPUT P 2340 IF P<0 THEN 2400 2350 T=T-P 2360 IF T >= 0 THEN 2400 2370 PRINT "YOU DON'T HAVE THAT MUCH -- KEEP YOUR SPENDING DOWN" 2380 T=T+P 2390 P=0 2400 RETURN 2410 F=F+2/3*P 2420 PRINT "AMMUNITION"; 2430 GOSUB 2330 2440 LET B=INT(B+2/3+P*50) 2450 PRINT "CLOTHING"; 2460 GOSUB 2330 2470 C=C+2/3*P 2480 PRINT "MISCELLANEOUS SUPPLIES"; 2490 GOSUB 2330 2500 M1=M1+2/3*P 2510 M=M-45 2520 GOTO 2720 2530 REM ***HUNTING*** 2540 IF B>39 THEN 2570 2550 PRINT "TOUGH---YOU NEED MORE BULLETS TO GO HUNTING" 2560 GOTO 2080 2570 M=M-45 2580 GOSUB 6140 2590 IF B1 <= 1 THEN 2660 2600 IF 100*RND(0)<13*B1 THEN 2710 2620 PRINT "NICE SHOT.RIGHT ON TARGET.GOOD EATIN' TONIGHT!!" 2630 B=B-10-3*B1 2640 GOTO 2720 2650 REM **BELLS IN LINE 2660** 2660 PRINT "RIGHT BETWEEN THE EYES---YOU GOT A BIG ONE!!!!" 2670 PRINT "FULL BELLIES TONIGHT!" 2680 F=F+52+RND(0)*6 2690 B=B-10-RND(0)*4 2700 GOTO 2720 2710 PRINT "YOU MISSED---AND YOUR DINNER GOT AWAY....." 2720 IF F >= 13 THEN 2750 2730 GOTO 5060 2740 REM ***EATING*** 2750 PRINT "DO YOU WANT TO EAT (1) POORLY (2) MODERATELY" 2760 PRINT "OR (3) WELL"; 2770 INPUT E 2780 IF E>3 THEN 2750 2790 IF E<1 THEN 2750 2800 LET E=INT(E) 2810 LET F=F-8-5*E 2820 IF F >= 0 THEN 2860 2830 F=F+8+5*E 2840 PRINT "YOU CAN'T EAT THAT WELL" 2850 GOTO 2750 2860 LET M=M+200+(A-220)/5+10*RND(0) 2870 L1=C1=0 2880 REM ***RIDERS ATTACK*** 2890 IF RND(0)*10>((M/100-4)*27+72)/((M/100-4)*2+12)-1 THEN 3550 2900 PRINT "RIDERS AHEAD. THEY "; 2910 S5=0 2920 IF RND(0)<.8 THEN 2950 2930 PRINT "DON'T "; 2940 S5=1 2950 PRINT "LOOK HOSTILE" 2960 PRINT "TACTICS" 2970 PRINT "(1) RUN (2) ATTACK (3) CONTINUE (4) CIRCLE WAGONS" 2980 IF RND(0)>.2 THEN 3000 2990 S5=1-S5 3000 INPUT T1 3010 IF T1<1 THEN 2970 3020 IF T1>4 THEN 2970 3030 T1=INT(T1) 3040 IF S5=1 THEN 3330 3050 IF T1>1 THEN 3110 3060 M=M+20 3070 M1=M1-15 3080 B=B-150 3090 A=A-40 3100 GOTO 3470 3110 IF T1>2 THEN 3240 3120 GOSUB 6140 3130 B=B-B1*40-80 3140 IF B1>1 THEN 3170 3150 PRINT "NICE SHOOTING---YOU DROVE THEM OFF" 3160 GOTO 3470 3170 IF B1 <= 4 THEN 3220 3180 PRINT "LOUSY SHOT---YOU GOT KNIFED" 3190 K8=1 3200 PRINT "YOU HAVE TO SEE OL' DOC BLANCHARD" 3210 GOTO 3470 3220 PRINT "KINDA SLOW WITH YOUR COLT .45" 3230 GOTO 3470 3240 IF T1>3 THEN 3290 3250 IF RND(0)>.8 THEN 3450 3260 LET B=B-150 3270 M1=M1-15 3280 GOTO 3470 3290 GOSUB 6140 3300 B=B-B1*30-80 3310 M=M-25 3320 GOTO 3140 3330 IF T1>1 THEN 3370 3340 IF T1>3 THEN 3390 3350 A=A-10 3360 GOTO 3470 3370 IF T1>2 THEN 3410 3380 M=M-5 3390 B=B-100 3400 GOTO 3470 3410 IF T1>3 THEN 3430 3420 GOTO 3470 3430 M=M-20 3440 GOTO 3470 3450 PRINT "THEY DID NOT ATTACK" 3460 GOTO 3550 3470 IF S5=0 THEN 3500 3480 PRINT "RIDERS WERE FRIENDLY, BUT CHECK FOR POSSIBLE LOSSES" 3490 GOTO 3550 3500 PRINT "RIDERS WERE HOSTILE--CHECK FOR LOSSES" 3510 IF B >= 0 THEN 3550 3520 PRINT "YOU RAN OUT OF BULLETS AND GOT MASSACRED BY THE RIDERS" 3530 GOTO 5170 3540 REM ***SELECTION OF EVENTS*** 3550 LET D1=0 3560 RESTORE 3570 R1=100*RND(0) 3580 LET D1=D1+1 3590 IF D1=16 THEN 4670 3600 READ D 3610 IF R1>D THEN 3580 3620 DATA 6,11,13,15,17,22,32,35,37,42,44,54,64,69,95 3630 IF D1>10 THEN 3650 3640 ON D1 GOTO 3660,3700,3740,3790,3820,3850,3880,3960,4130,4190 3650 ON D1-10 GOTO 4220,4290,4340,4650,4610,4670 3660 PRINT "WAGON BREAKS DOWN--LOSE TIME AND SUPPLIES FIXING IT" 3670 LET M=M-15-5*RND(0) 3680 LET M1=M1-8 3690 GOTO 4710 3700 PRINT "OX INJURES LEG---SLOWS YOU DOWN REST OF TRIP" 3710 LET M=M-25 3720 LET A=A-20 3730 GOTO 4710 3740 PRINT "BAD LUCK---YOUR DAUGHTER BROKE HER ARM" 3750 PRINT "YOU HAD TO STOP AND USE SUPPLIES TO MAKE A SLING" 3760 M=M-5-4*RND(0) 3770 M1=M1-2-3*RND(0) 3780 GOTO 4710 3790 PRINT "OX WANDERS OFF---SPEND TIME LOOKING FOR IT" 3800 M=M-17 3810 GOTO 4710 3820 PRINT "YOUR SON GETS LOST---SPEND HALF THE DAY LOOKING FOR HIM" 3830 M=M-10 3840 GOTO 4710 3850 PRINT "UNSAFE WATER--LOSE TIME LOOKING FOR CLEAN SPRING" 3860 LET M=M-10*RND(0)*-2 3870 GOTO 4710 3880 IF M>950 THEN 4490 3890 PRINT "HEAVY RAINS---TIME AND SUPPLIES LOST" 3910 F=F-10 3920 B=B-500 3930 M1=M1-15 3940 M=M-10*RND(0)-5 3950 GOTO 4710 3960 PRINT "BANDITS ATTACK" 3970 GOSUB 6140 3980 B=B-20*B1 3990 IF B >= 0 THEN 4030 4000 PRINT "YOU RAN OUT OF BULLETS -- THEY GET LOTS OF CASH" 4010 T=T/3 4020 GOTO 4040 4030 IF B1 <= 1 THEN 4100 4040 PRINT "YOU GOT SHOT IN THE LEG AND THEY TOOK ONE OF YOUR OXEN" 4050 K8=1 4060 PRINT "BETTER HAVE A DOC LOOK AT YOUR WOUND" 4070 M1=M1-5 4080 A=A-20 4090 GOTO 4710 4100 PRINT "QUICKEST DRAW OUTSIDE OF DODGE CITY!!!" 4110 PRINT "YOU GOT 'EM!" 4120 GOTO 4710 4130 PRINT "THERE WAS A FIRE IN YOUR WAGON--FOOD AND SUPPLIES DAMAGE!" 4140 F=F-40 4150 B=B-400 4160 LET M1=M1-RND(0)*68-3 4170 M=M-15 4180 GOTO 4710 4190 PRINT "LOSE YOUR WAY IN HEAVY FOG---TIME IS LOST" 4200 M=M-10-5*RND(0) 4210 GOTO 4710 4220 PRINT "YOU KILLED A POISONOUS SNAKE AFTER IT BIT YOU" 4230 B=B-10 4240 M1=M1-5 4250 IF M1 >= 0 THEN 4280 4260 PRINT "YOU DIE OF SNAKEBITE SINCE YOU HAVE NO MEDICINE" 4270 GOTO 5170 4280 GOTO 4710 4290 PRINT "YOUR WAGON GETS SWAMPED FORDING RIVER--LOSE FOOD AND CLOTHES" 4300 F=F-30 4310 C=C-20 4320 M=M-20-20*RND(0) 4330 GOTO 4710 4340 PRINT "WILD ANIMALS ATTACK!" 4350 GOSUB 6140 4360 IF B>39 THEN 4410 4370 PRINT "YOU WERE TOO LOW ON BULLETS--" 4380 PRINT "THE WOLVES OVERPOWERED YOU" 4390 K8=1 4400 GOTO 5120 4410 IF B1>2 THEN 4440 4420 PRINT "NICE SHOOTIN' PARDNER---THEY DIDN'T GET MUCH" 4430 GOTO 4450 4440 PRINT "SLOW ON THE DRAW---THEY GOT AT YOUR FOOD AND CLOTHES" 4450 B=B-20*B1 4460 C=C-B1*4 4470 F=F-B1*8 4480 GOTO 4710 4490 PRINT "COLD WEATHER -- BRRRRRR! -- YOU "; 4500 IF C>22+4*RND(0) THEN 4530 4510 PRINT "DON'T "; 4520 C1=1 4530 PRINT "HAVE ENOUGH CLOTHING TO KEEP WARM" 4540 IF C1=0 THEN 4710 4550 GOTO 6300 4560 PRINT "HAIL STORM---SUPPLIES DAMAGED" 4570 M=M-5-RND(0)*10 4580 B=B-200 4590 M1=M1-4-RND(0)*3 4600 GOTO 4710 4610 IF E=1 THEN 6300 4620 IF E=3 THEN 4650 4630 IF RND(0)>.25 THEN 6300 4640 GOTO 4710 4650 IF RND(0)<.5 THEN 6300 4660 GOTO 4710 4670 PRINT "HELPFUL INDIANS SHOW YOU WHERE TO FIND MORE FOOD" 4680 F=F+14 4690 GOTO 4710 4700 REM ***MOUNTAINS*** 4710 IF M <= 950 THEN 1230 4720 IF RND(0)*10>9-((M/100-15) ** 2+72)/((M/100-15) ** 2+12) THEN 4560 4730 PRINT "RUGGED MOUNTAINS" 4740 IF RND(0)>.1 THEN 4780 4750 PRINT "YOU GOT LOST---LOSE VALUABLE TIME TRYING TO FIND TRAIL!" 4760 M=M-60 4770 GOTO 4560 4780 IF RND(0)>.11 THEN 4840 4790 PRINT "WAGON DAMAGED!---LOSE TIME AND SUPPLIES" 4800 M1=M1-5 4810 B=B-200 4820 M=M-20-30*RND(0) 4830 GOTO 4860 4840 PRINT "THE GOING GETS SLOW" 4850 M=M-45-RND(0)/.02 4860 IF F1=1 THEN 4900 4870 F1=1 4880 IF RND(0)<.8 THEN 4970 4890 PRINT "YOU MADE IT SAFELY THROUGH SOUTH PASS--NO SNOW" 4900 IF M<1700 THEN 4940 4910 IF F2=1 THEN 4940 4920 F2=1 4930 IF RND(0)<.7 THEN 4970 4940 IF M>950 THEN 1230 4950 M9=1 4960 GOTO 1230 4970 PRINT "BLIZZARD IN MOUNTAIN PASS--TIME AND SUPPLIES LOST" 4980 L1=1 4990 F=F-25 5000 M1=M1-10 5010 B=B-300 5020 M=M-30-40*RND(0) 5030 IF C<18+2*RND(0) THEN 6300 5040 GOTO 4940 5050 REM ***DYING*** 5060 PRINT "YOU RAN OUT OF FOOD AND STARVED TO DEATH" 5070 GOTO 5170 5080 LET T=0 5090 PRINT "YOU CAN'T AFFORD A DOCTOR" 5100 GOTO 5120 5110 PRINT "YOU RAN OUT OF MEDICAL SUPPLIES" 5120 PRINT "YOU DIED OF "; 5130 IF K8=1 THEN 5160 5140 PRINT "PNEUMONIA" 5150 GOTO 5170 5160 PRINT "INJURIES" 5170 PRINT 5180 PRINT "DUE TO YOUR UNFORTUNATE SITUATION, THERE ARE A FEW" 5190 PRINT "FORMALITIES WE MUST GO THROUGH" 5200 PRINT 5210 PRINT "WOULD YOU LIKE A MINISTER?" 5220 INPUT C$ 5230 PRINT "WOULD YOU LIKE A FANCY FUNERAL?" 5240 INPUT C$ 5250 PRINT "WOULD YOU LIKE US TO INFORM YOUR NEXT OF KIN?" 5260 INPUT C$ 5270 IF C$="YES" THEN 5310 5280 PRINT "BUT YOUR AUNT SADIE IN ST. LOUIS IS REALLY WORRIED ABOUT YOU" 5290 PRINT 5300 GOTO 5330 5310 PRINT "THAT WILL BE $4.50 FOR THE TELEGRAPH CHARGE." 5320 PRINT 5330 PRINT "WE THANK YOU FOR THIS INFORMATION AND WE ARE SORRY YOU" 5340 PRINT "DIDN'T MAKE IT TO THE GREAT TERRITORY OF OREGON" 5350 PRINT "BETTER LUCK NEXT TIME" 5360 PRINT 5370 PRINT 5380 PRINT TAB(30);"SINCERELY" 5390 PRINT 5400 PRINT TAB(17);"THE OREGON CITY CHAMBER OF COMMERCE" 5410 STOP 5420 REM ***FINAL TURN*** 5430 F9=(2040-M2)/(M-M2) 5440 F=F+(1-F9)*(8+5*E) 5450 PRINT 5460 REM **BELLS IN LINES 5470,5480** 5470 PRINT "YOU FINALLY ARRIVED AT OREGON CITY" 5480 PRINT "AFTER 2040 LONG MILES---HOORAY!!!!!" 5490 PRINT "A REAL PIONEER!" 5500 PRINT 5510 F9=INT(F9*14) 5520 D3=D3*14+F9 5530 F9=F9+1 5540 IF F9<5 THEN 5560 5550 F9=F9-7 5560 ON F9 GOTO 5570,5590,5610,5630,5650,5670,5690 5570 PRINT "MONDAY "; 5580 GOTO 5700 5590 PRINT "TUESDAY "; 5600 GOTO 5700 5610 PRINT "WEDNESDAY "; 5620 GOTO 5700 5630 PRINT "THURSDAY "; 5640 GOTO 5700 5650 PRINT "FRIDAY "; 5660 GOTO 5700 5670 PRINT "SATURDAY "; 5680 GOTO 5700 5690 PRINT "SUNDAY "; 5700 IF D3>124 THEN 5740 5710 D3=D3-93 5720 PRINT "JULY ";D3;" 1847" 5730 GOTO 5920 5740 IF D3>155 THEN 5780 5750 D3=D3-124 5760 PRINT "AUGUST ";D3;" 1847" 5770 GOTO 5920 5780 IF D3>165 THEN 5820 5790 D3=D3-155 5800 PRINT "SEPTEMBER ";D3;" 1847" 5810 GOTO 5920 5820 IF D3>216 THEN 5860 5830 D3=D3-185 5840 PRINT "OCTOBER ";D3;" 1847" 5850 GOTO 5920 5860 IF D3>246 THEN 5900 5870 D3=D3-216 5880 PRINT "NOVEMBER ";D3;" 1847" 5890 GOTO 5920 5900 D3=D3-246 5910 PRINT "DECEMBER ";D3;"1847" 5920 PRINT 5930 PRINT "FOOD","BULLETS","CLOTHING","MISC. SUPP.","CASH" 5940 IF B>0 THEN 5960 5950 LET B=0 5960 IF C>0 THEN 5980 5970 LET C=0 5980 IF M1>0 THEN 6000 5990 LET M1=0 6000 IF T>0 THEN 6020 6010 LET T=0 6020 IF F>0 THEN 6040 6030 LET F=0 6040 PRINT INT(F),INT(B),INT(C),INT(M1),INT(T) 6050 PRINT 6060 PRINT TAB(11);"PRESIDENT JAMES K. POLK SENDS YOU HIS" 6070 PRINT TAB(17);"HEARTIEST CONGRATULATIONS" 6080 PRINT 6090 PRINT TAB(11);"AND WISHES YOU A PROSERPOUS LIFE AHEAD" 6100 PRINT 6110 PRINT TAB(22);"AT YOUR NEW HOME" 6120 STOP 6130 REM ***SHOOTING SUB-ROUTINE*** 6131 REM THE METHOD OF TIMING THE SHOOTING (LINES 6130-6280) 6132 REM WILL VARY FROM SYSTEM TO SYSTEM. 6140 REM DIM S$[4] 6143 S6=INT(RND(0)*4+1) 6145 ON S6 GOTO 6150,6160,6170,6180 6150 S$="BANG" 6155 GOTO 6200 6160 S$="BLAM" 6165 GOTO 6200 6170 S$="POW" 6175 GOTO 6200 6180 S$="WHAM" 6200 PRINT "TYPE ";S$ 6210 REM ENTER 255,B1,C$ 6211 B1=INT(RND(0)*4+1): INPUT C$ 6240 REM B1=B1-(D9-1) 6250 PRINT 6255 IF B1>0 THEN 6260 6257 B1=0 6260 IF C$=S$ THEN 6280 6270 B1=100 6280 RETURN 6290 REM ***ILLNESS SUB-ROUTINE*** 6300 IF 100*RND(0)<10+35*(E-1) THEN 6370 6310 IF 100*RND(0)<100-(40/4*(E-1)) THEN 6410 6320 PRINT "SERIOUS ILLNESS---" 6330 PRINT "YOU MUST STOP FOR MEDICAL ATTENTION" 6340 M1=M1-10 6350 S4=1 6360 GOTO 6440 6370 PRINT "MILD ILLNESS---MEDICINE USED" 6380 M=M-5 6390 M1=M1-2 6400 GOTO 6440 6410 PRINT "BAD ILLNESS---MEDICINE USED" 6420 M=M-5 6430 M1=M1-5 6440 IF M1<0 THEN 5110 6450 IF L1=1 THEN 4940 6460 GOTO 4710 6470 REM ***IDENTIFICATION OF VARIABLES IN THE PROGRAM*** 6480 REM A = AMOUNT SPENT ON ANIMALS 6490 REM B = AMOUNT SPENT ON AMMUNITION 6500 REM B1 = ACTUAL RESPONSE TIME FOR INPUTTING "BANG" 6510 REM B3 = CLOCK TIME START OF INPUTTING "BANG" 6520 REM C = AMOUNT SPENT ON CLOTHING 6530 REM C1 = FLAG FOR INSUFFICIENT CLOTHING IN COLD WEATHER 6540 REM C$ = YES/NO RESPONSE TO QUESTIONS 6550 REM D1 = COUNTER IN GENERATING EVENTS 6560 REM D3 = TURN NUMBER FOR SETTING DATE 6570 REM D4 = CURRENT DATE 6580 REM D9 = CHOICE OF SHOOTING EXPERTISE LEVEL 6590 REM E = CHOICE OF EATING 6600 REM F = AMOUNT SPENT ON FOOD 6610 REM F1 = FLAG FOR CLEARING SOUTH PASS 6620 REM F2 = FLAG FOR CLEARING BLUE MOUNTAINS 6630 REM F9 = FRACTION OF 2 WEEKS TRAVELED ON FINAL TURN 6640 REM X5 = FLAG FOR INJURY 6650 REM L1 = FLAG FOR BLIZZARD 6660 REM M = TOTAL MILEAGE WHOLE TRIP 6670 REM M1 = AMOUNT SPENT ON MISCELLANEOUS SUPPLIES 6680 REM M2 = MILEAGE UP THROUGH PREVIOUS TURN 6690 REM M9 = FLAG FOR CLEARING SOUTH PASS IN SETTING MILEAGE 6700 REM P = AMOUNT SPENT ON ITEMS AT FORT 6710 REM R1 = RANDOM NUMBER IN CHOOSING EVENTS 6720 REM S4 = FLAG FOR ILLNESS 6730 REM S5 = ""HOSTILITY OF RIDERS"" FACTOR 6740 REM S6 = SHOOTING WORD SELECTOR 6750 REM S$ = VARIATIONS OF SHOOTING WORD 6760 REM T = CASH LEFT OVER AFTER INITIAL PURCHASES 6770 REM T1 = CHOICE OF TACTICS WHEN ATTACKED 6780 REM X = CHOICE OF ACTION FOR EACH TURN 6790 REM X1 = FLAG FOR FORT OPTION 6800 END 9000 REM http://www.youtube.com/watch?v=CHps2SecuDk > Quote Link to comment Share on other sites More sharing options...
+adamantyr Posted May 17, 2013 Share Posted May 17, 2013 Text adventures can be implemented in a variety of ways in BASIC and Extended BASIC. One technique I read in an old Rainbow magazine (The TRS-80 Color Computer's magazine) was to store your noun/verb sets into very long strings. Then you use the POS function to immediately find out if the noun/verb exists in the vocabulary. If you're going with 4-character limits on noun/verb preciseness, you can just divide the returned position by 4 to indicate a verb/noun match. I would definitely use strings over numeric variables in a text adventure, especially if you are using the 32k memory expansion. A single character takes only 1 byte, while a numeric variable takes 8 bytes. The amount of extra code to process strings over numerics won't unbalance the code size at all, and while it may run a LITTLE slower, text adventures aren't supposed to be that fast anyway... Adamantyr Quote Link to comment Share on other sites More sharing options...
+InsaneMultitasker Posted May 17, 2013 Share Posted May 17, 2013 Text adventures can be implemented in a variety of ways in BASIC and Extended BASIC. One technique I read in an old Rainbow magazine (The TRS-80 Color Computer's magazine) was to store your noun/verb sets into very long strings. Then you use the POS function to immediately find out if the noun/verb exists in the vocabulary. If you're going with 4-character limits on noun/verb preciseness, you can just divide the returned position by 4 to indicate a verb/noun match. /snip/ Adamantyr Great technique. Perhaps very useful together with an ON x GOTO or two. I recall one game that tested words via a loop (slow). What I liked was if the word or phrase was not found, the program displayed some random quip telling the user the request was not understood - in a comical fashion not unlike Infocom. Ahh Infocom. Quote Link to comment Share on other sites More sharing options...
Opry99er Posted May 17, 2013 Author Share Posted May 17, 2013 (edited) Ahh Infocom. Here's some humor for ya... Edited May 17, 2013 by Opry99er Quote Link to comment Share on other sites More sharing options...
+Gemintronic Posted May 17, 2013 Share Posted May 17, 2013 I almost got this to compile for the Sega Genesis. The dialect of BASIC is just different enough to cause problems. Er, then I realised that text input on a joystick isn't going to be fun Quote Link to comment Share on other sites More sharing options...
Opry99er Posted May 17, 2013 Author Share Posted May 17, 2013 heh... That's awesome. I'd sure love to see it run on the ol' Sega. =) I don't have time to port it to the TI right now, but it wouldn't be hard... just a few changes necessary LINES 6130 to 6280 specifically. The handling of the "shooting" Quote Link to comment Share on other sites More sharing options...
Tursi Posted May 17, 2013 Share Posted May 17, 2013 On my old game 'Stranger' (http://harmlesslion.com/software/stranger), I didn't use any kind of formal parser at all.. each 'scene' is at a different location in code and the parser just looks for keywords relevant to that area. It means that the input is pretty freeform (both verb/noun and full sentences tend to work as long as the words are present), but you wouldn't want to do a really large story that way. Quote Link to comment Share on other sites More sharing options...
+mizapf Posted May 18, 2013 Share Posted May 18, 2013 Remembering Infocom ... the parser even recognized object references, something like GET THE KEY AND UNLOCK THE DOOR WITH IT. I think there were different versions of the parser; the earlier ones were less powerful. I still have the original Zork II, III, and Deadline packages here. There were still a lot of games I always wanted to play but never got them. My absolute favorites were Planetfall and Stationfall. I can still remember the scenes, although they were in my head only. And, who of you did not hesitate to get the PC games Return to Zork, Zork Nemesis, and Zork Grand Inquisitor? Quote Link to comment Share on other sites More sharing options...
Bones-69 Posted May 20, 2013 Share Posted May 20, 2013 The key to the game is the parsing engine... How does the user communicate with the computer to TELL IT WHAT HE/SHE WANTS TO DO?!?! Well, as we all know, a computer doesn't speak english, and we cannot possibly code in every possible command. Therefore, we create a parsing engine which takes a noun and a verb (two separate string variables INPUT from the user) and attempts to read those from a list of acceptable nouns and verbs in the system. For instance, "OPEN DOOR" contains a verb and a noun. A successful parsing engine would read the noun (to determine if that thing (the door) is in the vicinity) and IF that noun IS legal, read the verb (to determine if the selected action can be performed on the noun)... For instance, "EAT BREAD" is cool if you have bread in your inventory. "EAT DOOR" does not work, even if DOOR is in the current "room." I had some ideas that were working very well with an adventure game I started writing. Right from the start the environment was huge, which probably killed off the later enthusiasm because although everything was working as I hoped - It ended up just going on and on and I ran out of energy. It just never ended! But anyway, because of the size it was always designed to use huge disk files. Because I used a lot of disk access the basic program ended up being surprisingly small. So anyway... Right from the start I decided to limit commends to one or two words only. The first thing that was checked is that more than one space did not exist in the command. I pulled it right up there so down the track I had some control. To start, every verb I could think of I put into maximum strings (stored in arrays), in a form like this; V$(A)="#GO-01#GET-12#JUMP-02#KILL-78#OPEN-15#LOOK-03#EAT-32#SWIM-17....etc " And I made the strings as long as possible. To confirm a verb was valid I would search for the term in the strings (I found this better than assigning every verb its own unique array value and searching for a match - especially as the number of verbs grew). The hash prevents finding partial words within other words as I always forced the search criteria by VERB$=HASH CHAR & COMMAND$. The "-" acted as a marker for the end of the word and the 2 digit number gave the verb a value. This value could then be inserted into inventory or objects to create the illusion of a huge response vocabulary . For instance you might say - "eat key". "eat" would be identified as having a value of 32 in this example. The key would have variables that confirmed things like if it was visible or hidden, if it was steel or plastic, would it burn, would it break, could it be eaten... etc. I stored these values in single strings which I read/wrote to files so the values were somewhat dynamic. I would create more strings for the environment and ALL objects. For instance you are in a room with the key (every item has its own location value), and attached to the key is a string with stuff that might look like this; "#12-455#03-322#01-122-#32-555.... etc". In the instance of EAT (32), I would search for #32. When/if found,I would then read the next 3 digits which referenced a disk record where the response could be retrieved. I found this worked very well, it was extremely easy to edit/add/change on the fly. This is a pretty quick overview of the method I was using. Quote Link to comment Share on other sites More sharing options...
Bones-69 Posted May 20, 2013 Share Posted May 20, 2013 >Command me: EAT KEY >OK. >YOU BEGIN EATING IT AND START TO CHOKE. YOU SELF HEIMLICH AND PUKE IT BACK UP. YOU DON'T FEEL VERY WELL" Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.