Jump to content
IGNORED

XB Adventure game (no interpreter)


Opry99er

Recommended Posts

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

 

=)

Link to comment
Share on other sites

[/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 by InsaneMultitasker
Link to comment
Share on other sites

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
>




 

 

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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"

Link to comment
Share on other sites

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. :)

 

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...