├── tests ├── test.txt ├── test78.txt └── in75.txt ├── cmake └── execute.cmake ├── Makefile ├── .github └── workflows │ └── ci.yml ├── CMakeLists.txt ├── CMakePresets.json ├── LICENSE ├── README.md ├── oregon-trail-1978.bas ├── oregon-trail-1975.bas └── src └── oregon-trail-1975.f /tests/test.txt: -------------------------------------------------------------------------------- 1 | n 2 | 200 3 | 0 4 | 0 5 | 0 6 | 0 7 | 0 8 | 0 9 | 0 10 | 0 11 | -------------------------------------------------------------------------------- /tests/test78.txt: -------------------------------------------------------------------------------- 1 | n 2 | 0 3 | 200 4 | 0 5 | 0 6 | 0 7 | 0 8 | 3 9 | 0 10 | 0 11 | 0 12 | -------------------------------------------------------------------------------- /tests/in75.txt: -------------------------------------------------------------------------------- 1 | n 2 | 1 3 | 200 4 | 0 5 | 0 6 | 0 7 | 0 8 | 3 9 | n 10 | n 11 | n 12 | n 13 | -------------------------------------------------------------------------------- /cmake/execute.cmake: -------------------------------------------------------------------------------- 1 | execute_process(COMMAND ${exe} 2 | INPUT_FILE ${in_file} 3 | TIMEOUT 10 4 | COMMAND_ERROR_IS_FATAL ANY) 5 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .POSIX: 2 | .SUFFIXES: 3 | 4 | FC = gfortran 5 | CC = cc 6 | SRC = src/oregon.f 7 | TARGET = oregon 8 | 9 | .PHONY: all 10 | 11 | all: $(TARGET) 12 | 13 | $(TARGET): 14 | $(FC) $(FFLAGS) $(SRC) 15 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | 3 | on: 4 | push: 5 | paths: 6 | - "**.bas" 7 | - "**.f" 8 | - "**.f90" 9 | - "**.cmake" 10 | - "**/CMakeLists.txt" 11 | - ".github/workflows/ci.yml" 12 | 13 | jobs: 14 | 15 | linux: 16 | runs-on: ubuntu-latest 17 | steps: 18 | - uses: actions/checkout@v4 19 | 20 | - run: cmake --workflow --preset default 21 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.19) 2 | 3 | project(OregonTrail LANGUAGES Fortran) 4 | 5 | enable_testing() 6 | 7 | add_compile_options( 8 | "$<$:-Werror=line-truncation;-fimplicit-none>" 9 | ) 10 | 11 | add_executable(oregon_trail_1975 src/oregon-trail-1975.f) 12 | 13 | add_test(NAME Fortran1975 14 | COMMAND ${CMAKE_COMMAND} 15 | -Dexe:FILEPATH=$ 16 | -Din_file:FILEPATH=${CMAKE_CURRENT_SOURCE_DIR}/tests/in75.txt 17 | -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/execute.cmake 18 | ) 19 | 20 | find_program(basic_exe NAMES bwbasic) 21 | 22 | add_test(NAME Basic1975 23 | COMMAND ${CMAKE_COMMAND} 24 | -Dexe:FILEPATH=${basic_exe} 25 | -Din_file:FILEPATH=${CMAKE_CURRENT_SOURCE_DIR}/tests/test.txt 26 | -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/execute.cmake 27 | ) 28 | set_property(TEST Basic1975 PROPERTY DISABLED $>) 29 | 30 | file(GENERATE OUTPUT .gitignore CONTENT "*") 31 | -------------------------------------------------------------------------------- /CMakePresets.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 6, 3 | 4 | "configurePresets": [ 5 | { 6 | "name": "default", 7 | "binaryDir": "${sourceDir}/build", 8 | "cacheVariables": { 9 | "CMAKE_COMPILE_WARNING_AS_ERROR": true 10 | } 11 | } 12 | ], 13 | "buildPresets": [ 14 | { 15 | "name": "default", 16 | "configurePreset": "default" 17 | } 18 | ], 19 | "testPresets": [ 20 | { 21 | "name": "default", 22 | "configurePreset": "default", 23 | "output": { 24 | "outputOnFailure": true, 25 | "verbosity": "verbose" 26 | }, 27 | "execution": { 28 | "noTestsAction": "error", 29 | "scheduleRandom": true, 30 | "stopOnFailure": false, 31 | "timeout": 60 32 | } 33 | } 34 | ], 35 | "workflowPresets": [ 36 | { 37 | "name": "default", 38 | "steps": [ 39 | { 40 | "type": "configure", 41 | "name": "default" 42 | }, 43 | { 44 | "type": "build", 45 | "name": "default" 46 | }, 47 | { 48 | "type": "test", 49 | "name": "default" 50 | } 51 | ] 52 | } 53 | ] 54 | } 55 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Michael Hirsch, Ph.D., 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | 24 | Copyright (c) 2021, Philipp Engel 25 | 26 | Permission to use, copy, modify, and/or distribute this software for any purpose 27 | with or without fee is hereby granted, provided that the above copyright notice 28 | and this permission notice appear in all copies. 29 | 30 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 31 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 32 | FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 33 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS 34 | OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 35 | TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF 36 | THIS SOFTWARE. 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Oregon Trail 1975 & 1978 2 | 3 | [![Actions Status](https://github.com/fortran-gaming/oregon-trail-1975/workflows/ci_basic/badge.svg)](https://github.com/fortran-gaming/oregon-trail-1975/actions) 4 | 5 | ```basic 6 | REM MINNESOTA EDUCATIONAL COMPUTING CONSORTIUM STAFF 7 | REM PROGRAMMING REVISIONS BY DON RAWITSCH - 1975 8 | REM CURRENT VERSION - 3/27/75 9 | ``` 10 | 11 | Very lightly modified to work with modern platform-independent ANSI BASIC interpreter such as `bwbasic` 12 | 13 | ## Run 14 | 15 | ```sh 16 | apt install bwbasic 17 | ``` 18 | 19 | or other favorite BASIC interpreter. 20 | 21 | * 1975: `bwbasic oregon-trail-1975.bas` 22 | * 1978: `bwbasic oregon-trail-1978.bas` 23 | 24 | ## Provenance 25 | 26 | ### 1978 version 27 | 28 | From 29 | [Creative Computing 1978](https://ia800307.us.archive.org/3/items/creativecomputing-1978-05/Creative_Computing_v04_n03_1978_May-June.pdf) 30 | page 132ff. 31 | 32 | ```basic 33 | REM The program that follows is a reconstruction 34 | REM of the Oregon Trail game written for HP time-shared 35 | REM BASIC by Don Rawitsch and Bill Heinemann and Paul Dillenberger 36 | REM in 1971. Its source is an updated version published in the 37 | REM July-August 1978 issue of Creative Computing. 38 | 39 | 40 | 10 REM PROGRAM NAME - 0REGON VERSION:01/01/78 41 | 20 REM ORIGINAL PROGRAMMING BY BILL HEINEMANN - 1971 42 | 30 REM SUPPORT RESEARCH AND MATERIALS BY DON RAVITSCH 43 | 40 REM MINNESOTA EDUCATIONAL COMPUTING CONSORTIUM STAFF 44 | 50 REM CDC CYBER 70/73-26 BASIC 3-1 45 | ``` 46 | 47 | * OCR'd by [@clintmoyer](https://github.com/clintmoyer/oregon-trail), 48 | * tweaked by @scivision for ANSI BASIC compliance, 49 | 50 | Further corrected by contributors: 51 | 52 | * @pau101 53 | * @philjonas 54 | * @interkosmos 55 | 56 | ### 1975 version 57 | 58 | https://www.filfre.net/misc/oregon1975.bas 59 | 60 | ## Notes 61 | 62 | The BASIC dialect used is old 1970s unstructured style, which needed tweaks to run in a contemporary BASIC interpreter. 63 | To preserve in a modern reinterpretation of classic style, consider Fortran with a module dedicated to registers for game state. 64 | -------------------------------------------------------------------------------- /oregon-trail-1978.bas: -------------------------------------------------------------------------------- 1 | REM The program that follows is a reconstruction 2 | REM of the Oregon Trail game written for HP time-shared 3 | REM BASIC by Don Rawitsch and Bill Heinemann and Paul Dillenberger 4 | REM in 1971. Its source is an updated version published in the 5 | REM July-August 1978 issue of Creative Computing. 6 | 7 | 8 | 10 REM PROGRAM NAME - OREGON VERSION:01/01/78 9 | 20 REM ORIGINAL PROGRAMMING BY BILL HEINEMANN - 1971 10 | 30 REM SUPPORT RESEARCH AND MATERIALS BY DON RAVITSCH, 11 | 40 REM MINNESOTA EDUCATIONAL COMPUTING CONSORTIUM STAFF 12 | 50 REM CDC CYBER 70/73-26 BASIC 3.1 13 | 60 REM DOCUMENTATION BOOKLET 'OREGON' AVAILABLE FROM 14 | 61 REM MECC SUPPORT SERVICES 15 | 62 REM 2520 BROADWAY DRIVE 16 | 63 REM ST. PAUL, MN 55113 17 | 80 REM 18 | 150 REM *FOR THE MEANING OF THE VARIABLES USED, LIST LINES 6470-6790* 19 | 155 REM 20 | 21 | DIM C$(5) 22 | REM RANDOMIZE REMOVED 23 | INPUT "DO YOU NEED INSTRUCTIONS (y/n)"; C$ 24 | 200 IF C$="n" THEN 690 25 | 210 PRINT 26 | 220 PRINT 27 | 28 | REM ***INSTRUCTIONS*** 29 | 240 PRINT "THIS PROGRAM SIMULATES A TRIP OVER THE OREGON TRAIL FROM" 30 | 250 PRINT "INDEPENDENCE, MISSOURI TO OREGON CITY, OREGON IN 1847." 31 | 260 PRINT "YOUR FAMILY OF FIVE WILL COVER THE 2040 MILE OREGON TRAIL" 32 | 270 PRINT "IN 5-6 MONTHS --- IF YOU MAKE IT ALIVE." 33 | 280 PRINT 34 | 290 PRINT "YOU HAD SAVED $900 TO SPEND FOR THE TRIP, AND YOU'VE JUST" 35 | 300 PRINT " PAID $200 FOR A WAGON." 36 | 310 PRINT "YOU WILL NEED TO SPEND THE REST OF YOUR MONEY ON THE" 37 | 320 PRINT " FOLLOWING ITEMS:" 38 | 330 PRINT 39 | 340 PRINT " OXEN - YOU CAN SPEND $200-$300 ON YOUR TEAM" 40 | 350 PRINT " THE MORE YOU SPEND, THE FASTER YOU'LL GO" 41 | 360 PRINT " BECAUSE YOU'LL HAVE BETTER ANIMALS" 42 | 370 PRINT 43 | 380 PRINT " FOOD - THE MORE YOU HAVE, THE LESS CHANCE THERE" 44 | 390 PRINT " IS OF GETTING SICK" 45 | 400 PRINT 46 | 410 PRINT " AMMUNITION - 81 BUYS A BELT OF 50 BULLETS" 47 | 420 PRINT " YOU WILL NEED BULLETS FOR ATTACKS BY ANIMALS" 48 | 430 PRINT " AND BANDITS, AND FOR HUNTING FOOD" 49 | 440 PRINT 50 | 450 PRINT " CLOTHING - THIS IS ESPECIALLY IMPORTANT FOR THE COLD" 51 | 460 PRINT " WEATHER YOU WILL ENCOUNTER WHEN CROSSING" 52 | 470 PRINT " THE MOUNTAINS" 53 | 480 PRINT 54 | 490 PRINT " MISCELLANEOUS SUPPLIES - THIS INCLUDES MEDICINE AND" 55 | 500 PRINT " OTHER THINGS YOU WILL NEED FOR SICKNESS" 56 | 510 PRINT " AND EMERGENCY REPAIRS" 57 | 520 PRINT 58 | 530 PRINT 59 | 540 PRINT "YOU CAN SPEND ALL YOUR MONEY BEFORE YOU START YOUR TRIP -" 60 | 550 PRINT "OR YOU CAN SAVE SOME OF YOUR CASH TO SPEND AT FORTS ALONG" 61 | 560 PRINT "THE WAY WHEN YOU RUN LOW. HOWEVER, ITEMS COST MORE AT" 62 | 570 PRINT "THE FORTS. YOU CAN ALSO GO HUNTING ALONG THE WAY TO GET" 63 | 580 PRINT "MORE FOOD." 64 | 590 PRINT "WHENEVER YOU HAVE TO USE YOUR TRUSTY RIFLE ALONG THE WAY," 65 | 600 PRINT "YOU WILL BE TOLD TO TYPE IN A WORD (ONE THAT SOUNDS LIKE A" 66 | 610 PRINT "GUN SHOT). THE FASTER YOU TYPE IN THAT WORD AND HIT THE" 67 | 620 PRINT """RETURN"" KEY, THE BETTER LUCK YOU'LL HAVE WITH YOUR GUN." 68 | 630 PRINT 69 | 640 PRINT "AT EACH TURN, ALL ITEMS ARE SHOWN IN DOLLAR AMOUNTS" 70 | 650 PRINT "EXCEPT BULLETS" 71 | 660 PRINT "WHEN ASKED TO ENTER MONEY AMOUNTS, DON'T USE A ""$""." 72 | 670 PRINT 73 | 680 PRINT "GOOD LUCK!!!" 74 | 690 PRINT 75 | 700 PRINT 76 | 77 | 710 PRINT "HOW GOOD A SHOT ARE YOU WITH YOUR RIFLE?" 78 | 720 PRINT " (1) ACE MARKSMAN, (2) GOOD SHOT, (3) FAIR TO MIDDLIN'" 79 | 730 PRINT " (4) NEED MORE PRACTICE, (5) SHAKY KNEES" 80 | 740 PRINT "ENTER ONE OF THE ABOVE -- THE BETTER YOU CLAIM YOU ARE, THE" 81 | 750 PRINT "FASTER YOU'LL HAVE TO BE WITH YOUR GUN TO BE SUCCESSFUL." 82 | 760 INPUT D9 83 | 770 IF D9>5 THEN 790 84 | 780 GOTO 810 85 | 790 D9=0 86 | 87 | REM ***INITIAL PURCHASES*** 88 | 810 X1=-1 89 | 820 K8=S4=F1=F2=M=M9=D3=0 90 | 830 PRINT 91 | 840 PRINT 92 | 850 PRINT "HOW MUCH DO YOU WANT TO SPEND ON YOUR OXEN TEAM"; 93 | 860 INPUT A 94 | 870 IF A >= 200 THEN 900 95 | 880 PRINT "NOT ENOUGH" 96 | 890 GOTO 850 97 | 900 IF A <= 300 THEN 930 98 | 910 PRINT "TOO MUCH" 99 | 920 GOTO 850 100 | 930 PRINT "HOW MUCH DO YOU WANT TO SPEND ON FOOD"; 101 | 940 INPUT F 102 | 950 IF F >= 0 THEN 980 103 | 960 PRINT "IMPOSSIBLE" 104 | 970 GOTO 930 105 | 980 PRINT "HOW MUCH DO YOU WANT TO SPEND ON AMMUNITION"; 106 | 990 INPUT B 107 | 1000 IF B >= 0 THEN 1030 108 | 1010 PRINT "IMPOSSIBLE" 109 | 1020 GOTO 980 110 | 1030 PRINT "HOW MUCH DO YOU WANT TO SPEND ON CLOTHING"; 111 | 1040 INPUT C 112 | 1050 IF C >= 0 THEN 1080 113 | 1060 PRINT "IMPOSSIBLE" 114 | 1070 GOTO 1030 115 | 1080 PRINT "HOW MUCH DO YOU WANT TO SPEND ON MISCELLANEOUS SUPPLIES"; 116 | 1090 INPUT M1 117 | 1100 IF M1 >= 0 THEN 1130 118 | 1110 PRINT "IMPOSSIBLE" 119 | 1120 GOTO 1080 120 | 1130 T=700-A-F-B-C-M1 121 | 1140 IF T >= 0 THEN 1170 122 | 1150 PRINT "YOU OVERSPENT--YOU ONLY HAD $700 TO SPEND. BUY AGAIN" 123 | 1160 GOTO 830 124 | 1170 B=50*B 125 | 1180 PRINT "AFTER ALL YOUR PURCHASES, YOU NOW HAVE ";T;" DOLLARS LEFT" 126 | 1190 PRINT 127 | 1200 PRINT "MONDAY MARCH 29 1847" 128 | 1210 PRINT 129 | 1220 GOTO 1750 130 | 1230 IF M >= 2040 THEN 5430 131 | 132 | 1240 REM ***SETTING DATE*** 133 | 1250 D3=D3+1 134 | 1260 PRINT 135 | 1270 PRINT "MONDAY "; 136 | 1280 IF D3>10 THEN 1300 137 | 1290 ON D3 GOTO 1310, 1330, 1350, 1370, 1390, 1410, 1430, 1450, 1470, 1490 138 | 1300 ON D3-10 GOTO 1510, 1530, 1550, 1570, 1590, 1610, 1630, 1650, 1670, 1690 139 | 1310 PRINT "APRIL 12 "; 140 | 1320 GOTO 1720 141 | 1330 PRINT "APRIL 26 "; 142 | 1340 GOTO 1720 143 | 1350 PRINT "MAY 10 "; 144 | 1360 GOTO 1720 145 | 1370 PRINT "MAY 24 "; 146 | 1380 GOTO 1720 147 | 1390 PRINT "JUNE 7 "; 148 | 1400 GOTO 1720 149 | 1410 PRINT "JUNE 21 "; 150 | 1420 GOTO 1720 151 | 1430 PRINT "JULY 5 "; 152 | 1440 GOTO 1720 153 | 1450 PRINT "JULY 19 "; 154 | 1460 GOTO 1720 155 | 1470 PRINT "AUGUST 2 "; 156 | 1480 GOTO 1720 157 | 1490 PRINT "AUGUST 16 "; 158 | 1500 GOTO 1720 159 | 1510 PRINT "AUGUST 31 "; 160 | 1520 GOTO 1720 161 | 1530 PRINT "SEPTEMBER 13 "; 162 | 1540 GOTO 1720 163 | 1550 PRINT "SEPTEMBER 27 "; 164 | 1560 GOTO 1720 165 | 1570 PRINT "OCTOBER 11 "; 166 | 1580 GOTO 1720 167 | 1590 PRINT "OCTOBER 25 "; 168 | 1600 GOTO 1720 169 | 1610 PRINT "NOVEMBER 8 "; 170 | 1620 GOTO 1720 171 | 1630 PRINT "NOVEMBER 22 "; 172 | 1640 GOTO 1720 173 | 1650 PRINT "DECEMBER 6 "; 174 | 1660 GOTO 1720 175 | 1670 PRINT "DECEMBER 20 "; 176 | 1680 GOTO 1720 177 | 1690 PRINT "YOU HAVE BEEN ON THE TRAIL TOO LONG ------" 178 | 1700 PRINT "YOUR FAMILY DIES IN THE FIRST BLIZZARD OF WINTER" 179 | 1710 GOTO 5170 180 | 1720 PRINT "1847" 181 | 1730 PRINT 182 | 183 | 1740 REM ***BEGINNING EACH TURN*** 184 | 1750 IF F >= 0 THEN 1770 185 | 1760 F=0 186 | 1770 IF B >= 0 THEN 1790 187 | 1780 B=0 188 | 1790 IF C >= 0 THEN 1810 189 | 1800 C=0 190 | 1810 IF M1 >= 0 THEN 1830 191 | 1820 M1=0 192 | 1830 IF F >= 13 THEN 1850 193 | 1840 PRINT "YOU'D BETTER DO SOME HUNTING OR BUY FOOD AND SOON!!!!" 194 | 1850 F=INT(F) 195 | 1860 B=INT(B) 196 | 1870 C=INT(C) 197 | 1880 M1=INT(M1) 198 | 1890 T=INT(T) 199 | 1900 M=INT(M) 200 | 1910 M2=M 201 | 1920 IF S4=1 THEN 1950 202 | 1930 IF K8=1 THEN 1950 203 | 1940 GOTO 1990 204 | 1950 T=T-20 205 | 1960 IF T<0 THEN 5080 206 | 1970 PRINT "DOCTOR'S BILL IS $20" 207 | 1980 LET K8=S4=0 208 | 1990 IF M9=1 THEN 2020 209 | 2000 PRINT "TOTAL MILEAGE IS";M 210 | 2010 GOTO 2040 211 | 2020 PRINT "TOTAL MILEAGE IS 950" 212 | 2030 M9=0 213 | 2040 PRINT "FOOD","BULLETS","CLOTHING","MISC. SUPP.","CASH" 214 | 2050 PRINT F, B, C, M1, T 215 | 2060 IF X1=-1 THEN 2170 216 | 2070 X1=X1*(-1) 217 | 218 | 2080 PRINT "DO YOU WANT TO (1) STOP AT THE NEXT FORT, (2) HUNT, "; 219 | 2090 PRINT "OR (3) CONTINUE" 220 | 2100 INPUT X 221 | 2110 IF X>2 THEN 2150 222 | 2120 IF X<1 THEN 2150 223 | 2130 LET X=INT(X) 224 | 2140 GOTO 2270 225 | 2150 LET X=3 226 | 2160 GOTO 2270 227 | 228 | 2170 PRINT "DO YOU WANT TO (1) HUNT, OR (2) CONTINUE" 229 | 2180 INPUT X 230 | 2190 IF X=l THEN 2210 231 | 2200 LET X=2 232 | 2210 LET X=X+1 233 | 2220 IF X=3 THEN 2260 234 | 2230 IF B>39 THEN 2260 235 | 2240 PRINT "TOUGH---YOU NEED MORE BULLETS TO GO HUNTING" 236 | 2250 GOTO 2170 237 | 2260 X1=X1*(-1) 238 | 2270 ON X GOTO 2290,2540,2720 239 | 240 | REM ***STOPPING AT FORT*** 241 | 2290 PRINT "ENTER WHAT YOU WISH TO SPEND ON THE FOLLOWING" 242 | 2300 PRINT "FOOD"; 243 | 2310 GOSUB 2330 244 | 2320 GOTO 2410 245 | 2330 INPUT P 246 | 2340 IF P<0 THEN 2400 247 | 2350 T=T-P 248 | 2360 IF T >= 0 THEN 2400 249 | 2370 PRINT "YOU DON'T HAVE THAT MUCH--KEEP YOUR SPENDING DOWN" 250 | 2375 PRINT "YOU MISS YOUR CHANCE TO SPEND ON THAT ITEM" 251 | 2380 T=T+P 252 | 2390 P=0 253 | 2400 RETURN 254 | 2410 F=F+2/3*P 255 | 2420 PRINT "AMMUNITION"; 256 | 2430 GOSUB 2330 257 | 2440 LET B=INT(B+2/3*P*50) 258 | 2450 PRINT "CLOTHING"; 259 | 2460 GOSUB 2330 260 | 2470 C=C+2/3*P 261 | 2480 PRINT "MISCELLANEOUS SUPPLIES"; 262 | 2490 GOSUB 2330 263 | 2500 M1=M1+2/3*P 264 | 2510 M=M-45 265 | 2520 GOTO 2720 266 | 267 | REM ***HUNTING*** 268 | 2540 IF B>39 THEN 2570 269 | 2550 PRINT "TOUGH---YOU NEED MORE BULLETS TO GO HUNTING" 270 | 2560 GOTO 2080 271 | 2570 M=M-45 272 | 2580 GOSUB 6140 273 | 2590 IF B1 <= 1 THEN 2660 274 | 2600 IF 100*RND(-1)<13*B1 THEN 2710 275 | 2610 F=F+48-2*B1 276 | 2620 PRINT "NICE SHOT--RIGHT ON TARGET--GOOD EATIN' TONIGHT!!" 277 | 2630 B=B-10-3*B1 278 | 2640 GOTO 2720 279 | 280 | REM **BELLS IN LINE 2660** 281 | 2660 PRINT "RIGHT BETWEEN THE EYES---YOU GOT A BIG ONE!!!!" 282 | 2670 PRINT "FULL BELLIES TONIGHT!" 283 | 2680 F=F+52+RND(-1)*6 284 | 2690 B=B-10-RND(-1)*4 285 | 2700 GOTO 2720 286 | 2710 PRINT "YOU MISSED---AND YOUR DINNER GOT AWAY....." 287 | 2720 IF F >= 13 THEN 2750 288 | 2730 GOTO 5060 289 | 290 | REM ***EATING*** 291 | 2750 PRINT "DO YOU WANT TO EAT (1) POORLY (2) MODERATELY" 292 | 2760 PRINT "OR (3) WELL"; 293 | 2770 INPUT E 294 | 2780 IF E>3 THEN 2750 295 | 2790 If E<1 THEN 2750 296 | 2800 LET E=INT(E) 297 | 2810 LET F=F-8-5*E 298 | 2820 IF F >= 0 THEN 2860 299 | 2830 F=F+8+5*E 300 | 2840 PRINT "YOU CAN'T EAT THAT WELL" 301 | 2850 GOTO 2750 302 | 2860 LET M=M+200+(A-220)/5+10*RND(-1) 303 | 2870 L1=C1=0 304 | 305 | REM ***RIDERS ATTACK*** 306 | 2890 IF RND(-1)*10>((M/100-4)^2+72)/((M/100-4)^2+12)-1 THEN 3550 307 | 2900 PRINT "RIDERS AHEAD. THEY "; 308 | 2910 S5=0 309 | 2920 IF RND(-1)<.8 THEN 2950 310 | 2930 PRINT "DON'T "; 311 | 2940 S5=1 312 | 2950 PRINT "LOOK HOSTILE" 313 | 2960 PRINT "TACTICS" 314 | 2970 PRINT "(1) RUN (2) ATTACK (3) CONTINUE (4) CIRCLE WAGONS" 315 | 2980 IF RND(-1)>.2 THEN 3000 316 | 2990 S5=1-S5 317 | 3000 INPUT T1 318 | 3010 IF T1<1 THEN 2970 319 | 3020 IF T1>4 THEN 2970 320 | 3030 T1=INT(T1) 321 | 3040 IF S5=1 THEN 3330 322 | 3050 IF T1>1 THEN 3110 323 | 3060 M=M+20 324 | 3070 M1=M1-15 325 | 3080 B=B-150 326 | 3090 A=A-40 327 | 3100 GOTO 3470 328 | 3110 IF T1>2 THEN 3240 329 | 3120 GOSUB 6140 330 | 3130 B=B-B1*40-80 331 | 3140 IF B1>1 THEN 3170 332 | 3150 PRINT "NICE SHOOTING---YOU DROVE THEM OFF" 333 | 3160 GOTO 3470 334 | 3170 IF B1 <= 4 THEN 3220 335 | 3180 PRINT "LOUSY SHOT---YOU GOT KNIFED" 336 | 3190 K8=1 337 | 3200 PRINT "YOU HAVE TO SEE OL' DOC BLANCHARD" 338 | 3210 GOTO 3470 339 | 3220 PRINT "KINDA SLOW WITH YOUR COLT .45" 340 | 3230 GOTO 3470 341 | 3240 IF T1>3 THEN 3290 342 | 3250 IF RND(-1)>.8 THEN 3450 343 | 3260 LET B=B-150 344 | 3270 M1=M1-15 345 | 3280 GOTO 3470 346 | 3290 GOSUB 6140 347 | 3300 B=B-B1*30-80 348 | 3310 M=M-25 349 | 3320 GOTO 3140 350 | 3330 IF T1>1 THEN 3370 351 | 3340 M=M+15 352 | 3350 A=A-10 353 | 3360 GOTO 3470 354 | 3370 IF T1>2 THEN 3410 355 | 3380 M=M-5 356 | 3390 B=B-100 357 | 3400 GOTO 3470 358 | 3410 IF T1>3 THEN 3430 359 | 3420 GOTO 3470 360 | 3430 M=M-20 361 | 3440 GOTO 3470 362 | 3450 PRINT "THEY DID NOT ATTACK" 363 | 3460 GOTO 3550 364 | 3470 IF S5=0 THEN 3500 365 | 3480 PRINT "RIDERS WERE FRIENDLY, BUT CHECK FOR POSSIBLE LOSSES" 366 | 3490 GOTO 3550 367 | 3500 PRINT "RIDERS WERE HOSTILE--CHECK FOR LOSSES" 368 | 3510 IF B >= 0 THEN 3550 369 | 3520 PRINT "YOU RAN OUT OF BULLETS AND GOT MASSACRED BY THE RIDERS" 370 | 3530 GOTO 5170 371 | 372 | REM ***SELECTION OF EVENTS*** 373 | 3550 LET D1=0 374 | 3560 RESTORE 375 | 3570 R1=100*RND(-1) 376 | 3580 LET D1=D1+1 377 | 3590 IF D1=16 THEN 4670 378 | 3600 READ D 379 | 3610 IF R1>D THEN 3580 380 | 3620 DATA 6, 11, 13, 15, 17, 22, 32, 35, 37, 42, 44, 54, 64, 69, 95 381 | 3630 IF D1>10 THEN 3650 382 | 3640 ON D1 GOTO 3660, 3700, 3740, 3790, 3820, 3850, 3880, 3960, 4130, 4190 383 | 3650 ON D1-10 GOTO 4220, 4290, 4340, 4560, 4610, 4670 384 | 3660 PRINT "WAGON BREAKS DOWN--LOSE TIME AND SUPPLIES FIXING IT" 385 | 3670 LET M=M-15-5*RND(-1) 386 | 3680 LET M1=M1-8 387 | 3690 GOTO 4710 388 | 3700 PRINT "OX INJURES LEG---SLOWS YOU DOWN REST OF TRIP" 389 | 3710 LET M=M-25 390 | 3720 LET A=A-20 391 | 3730 GOTO 4710 392 | 3740 PRINT "BAD LUCK---YOUR DAUGHTER BROKE HER ARM" 393 | 3750 PRINT "YOU HAD TO STOP AND USE SUPPLIES TO MAKE A SLING" 394 | 3760 M=M-5-4*RND(-1) 395 | 3770 M1=M1-2-3*RND(-1) 396 | 3780 GOTO 4710 397 | 3790 PRINT "OX WANDERS OFF---SPEND TIME LOOKING FOR IT" 398 | 3800 M=M-17 399 | 3810 GOTO 4710 400 | 3820 PRINT "YOUR SON GETS LOST---SPEND HALF THE DAY LOOKING FOR HIM" 401 | 3830 M=M-10 402 | 3840 GOTO 4710 403 | 3850 PRINT "UNSAFE WATER--LOSE TIME LOOKING FOR CLEAN SPRING" 404 | 3860 LET M=M-10*RND(-1)-2 405 | 3870 GOTO 4710 406 | 3880 IF M>950 THEN 4490 407 | 3890 PRINT "HEAVY RAINS---TIME AND SUPPLIES LOST" 408 | 3910 F=F-10 409 | 3920 B=B-500 410 | 3930 M1=M1-15 411 | 3940 M=M-10*RND(-1)-5 412 | 3950 GOTO 4710 413 | 3960 PRINT "BANDITS ATTACK" 414 | 3970 GOSUB 6140 415 | 3980 B=B-20*B1 416 | 3990 IF B >= 0 THEN 4030 417 | 4000 PRINT "YOU RAN OUT OF BULLETS---THEY GET LOTS OF CASH" 418 | 4010 T=T/3 419 | 4020 GOTO 4040 420 | 4030 IF B1 <= 1 THEN 4100 421 | 4040 PRINT "YOU GOT SHOT IN THE LEG AND THEY TOOK ONE OF YOUR OXEN" 422 | 4050 K8=1 423 | 4060 PRINT "BETTER HAVE A DOC LOOK AT YOUR WOUND" 424 | 4070 M1=M1-5 425 | 4080 A=A-20 426 | 4090 GOTO 4710 427 | 4100 PRINT "QUICKEST DRAW OUTSIDE OF DODGE CITY!!!" 428 | 4110 PRINT "YOU GOT 'EM!" 429 | 4120 GOTO 4710 430 | 4130 PRINT "THERE WAS A FIRE IN YOUR WAGON--FOOD AND SUPPLIES DAMAGE!" 431 | 4140 F=F-40 432 | 4150 B=B-400 433 | 4160 LET M1=M1-RND(-1)*8-3 434 | 4170 M=M-15 435 | 4180 GOTO 4710 436 | 4190 PRINT "LOSE YOUR WAY IN HEAVY FOG---TIME IS LOST" 437 | 4200 M=M-10-5*RND(-1) 438 | 4210 GOTO 4710 439 | 4220 PRINT "YOU KILLED A POISONOUS SNAKE AFTER IT BIT YOU" 440 | 4230 B=B-10 441 | 4240 M1=M1-5 442 | 4250 IF M1 >= 0 THEN 4280 443 | 4260 PRINT "YOU DIE OF SNAKEBITE SINCE YOU HAVE NO MEDICINE" 444 | 4270 GOTO 5170 445 | 4280 GOTO 4710 446 | 4290 PRINT "WAGON GETS SWAMPED FORDING RIVER--LOSE FOOD AND CLOTHES" 447 | 4300 F=F-30 448 | 4310 C=C-20 449 | 4320 M=M-20-20*RND(-1) 450 | 4330 GOTO 4710 451 | 4340 PRINT "WILD ANIMALS ATTACK!" 452 | 4350 GOSUB 6140 453 | 4360 IF B>39 THEN 4410 454 | 4370 PRINT "YOU WERE TOO LOW ON BULLETS--" 455 | 4380 PRINT "THE WOLVES OVERPOWERED YOU" 456 | 4390 K8=1 457 | 4400 GOTO 5120 458 | 4410 IF B1>2 THEN 4440 459 | 4420 PRINT "NICE SHOOTIN' PARDNER---THEY DIDN'T GET MUCH" 460 | 4430 GOTO 4450 461 | 4440 PRINT "SLOW ON THE DRAW---THEY GOT AT YOUR FOOD AND CLOTHES" 462 | 4450 B=B-20*B1 463 | 4460 C=C-B1*4 464 | 4470 F=F-B1*8 465 | 4480 GOTO 4710 466 | 4490 PRINT "COLD WEATHER---BRRRRRRR!---YOU "; 467 | 4500 IF C>22+4*RND(-1) THEN 4530 468 | 4510 PRINT "DON'T "; 469 | 4520 C1=1 470 | 4530 PRINT "HAVE ENOUGH CLOTHING TO KEEP YOU WARM" 471 | 4540 IF C1=0 THEN 4710 472 | 4550 GOTO 6300 473 | 4560 PRINT "HAIL STORM---SUPPLIES DAMAGED" 474 | 4570 M=M-5-RND(-1)*10 475 | 4580 B=B-200 476 | 4590 M1=M1-4-RND(-1)*3 477 | 4600 GOTO 4710 478 | 4610 IF E=1 THEN 6300 479 | 4620 IF E=3 THEN 4650 480 | 4630 IF RND(-1)>.25 THEN 6300 481 | 4640 GOTO 4710 482 | 4650 IF RND(-1)<.5 THEN 6300 483 | 4660 GOTO 4710 484 | 4670 PRINT "HELPFUL INDIANS SHOW YOU WERE TO FIND MORE FOOD" 485 | 4680 F=F+14 486 | 4690 GOTO 4710 487 | 488 | REM ***MOUNTAINS*** 489 | 4710 IF M <= 950 THEN 1230 490 | 4720 IF RND(-1)*10>9-((M/100-15)^2+72)/((M/100-15)^2+12) THEN 4860 491 | 4730 PRINT "RUGGED MOUNTAINS" 492 | 4740 IF RND(-1)>.1 THEN 4780 493 | 4750 PRINT "YOU GOT LOST---LOSE VALUABLE TIME TRYING TO FIND TRAIL!" 494 | 4760 M=M-60 495 | 4770 GOTO 4860 496 | 4780 IF RND(-1)>.11 THEN 4840 497 | 4790 PRINT "WAGON DAMAGED!---LOSE TIME AND SUPPLIES" 498 | 4800 M1=M1-5 499 | 4810 B=B-200 500 | 4820 M=M-20-30*RND(-1) 501 | 4830 GOTO 4860 502 | 4840 PRINT "THE GOING GETS SLOW" 503 | 4850 M=M-45-RND(-1)/.02 504 | 4860 IF F1=1 THEN 4900 505 | 4870 F1=1 506 | 4880 IF RND(-1)<.8 THEN 4970 507 | 4890 PRINT "YOU MADE IT SAFELY THROUGH SOUTH PASS--NO SNOW" 508 | 4900 IF M<1700 THEN 4940 509 | 4910 IF F2=1 THEN 4940 510 | 4920 F2=1 511 | 4930 IF RND(-1)<.7 THEN 4970 512 | 4940 IF M>950 THEN 1230 513 | 4950 M9=1 514 | 4960 GOTO 1230 515 | 4970 PRINT "BLIZZARD IN MOUNTAIN PASS--TIME AND SUPPLIES LOST" 516 | 4980 L1=1 517 | 4990 F=F-25 518 | 5000 M1=M1-10 519 | 5010 B=B-300 520 | 5020 M=M-30-40*RND(-1) 521 | 5030 IF C<18+2*RND(-1) THEN 6300 522 | 5040 GOTO 4940 523 | 524 | REM ***DYING*** 525 | 5060 PRINT "YOU RAN OUT OF FOOD AND STARVED TO DEATH" 526 | 5070 GOTO 5170 527 | 5080 LET T=0 528 | 5090 PRINT "YOU CAN'T AFFORD A DOCTOR" 529 | 5100 GOTO 5120 530 | 5110 PRINT "YOU RAN OUT OF MEDICAL SUPPLIES" 531 | 5120 PRINT "YOU DIED OF "; 532 | 5130 IF K8=1 THEN 5160 533 | 5140 PRINT "PNEUMONIA" 534 | 5150 GOTO 5170 535 | 5160 PRINT "INJURIES" 536 | 5170 PRINT 537 | 5180 PRINT "DUE TO YOUR UNFORTUNATE SITUATION, THERE ARE A FEW" 538 | 5190 PRINT "FORMALITIES WE MUST GO THROUGH" 539 | 5200 PRINT 540 | 5210 PRINT "WOULD YOU LIKE A MINISTER?" 541 | 5220 INPUT C$ 542 | 5230 PRINT "WOULD YOU LIKE A FANCY FUNERAL?" 543 | 5240 INPUT C$ 544 | 5250 PRINT "WOULD YOU LIKE US TO INFORM YOUR NEXT OF KIN?" 545 | 5260 INPUT C$ 546 | 5270 IF C$="y" THEN GOTO 5310 547 | 5280 PRINT "BUT YOUR AUNT SADIE IN ST. LOUIS IS REALLY WORRIED ABOUT YOU" 548 | 5290 PRINT 549 | 5300 GOTO 5330 550 | 5310 PRINT "THAT WILL BE $4.50 FOR THE TELEGRAPH CHARGE." 551 | 5320 PRINT 552 | 5330 PRINT "WE THANK YOU FOR THIS INFORMATION AND WE ARE SORRY YOU" 553 | 5340 PRINT "DIDN'T MAKE IT TO THE GREAT TERRITORY OF OREGON" 554 | 5350 PRINT "BETTER LUCK NEXT TIME" 555 | 5360 PRINT 556 | 5370 PRINT 557 | 5380 PRINT TAB(30);"SINCERELY" 558 | 5390 PRINT 559 | 5400 PRINT TAB(17);"THE OREGON CITY CHAMBER OF COMMERCE" 560 | QUIT 561 | 562 | REM ***FINAL TURN*** 563 | 5430 F9=(2040-M2)/(M-M2) 564 | 5440 F=F+(1-F9)*(8+5*E) 565 | 5450 PRINT 566 | 567 | REM **BELLS IN LINES 5470, 5480** 568 | 5470 PRINT "YOU FINALLY ARRIVED AT OREGON CITY" 569 | 5480 PRINT "AFTER 2040 LONG MILES---HOORAY!!!!!" 570 | 5490 PRINT "A REAL PIONEER!" 571 | 5500 PRINT 572 | 5510 F9=INT(F9*14) 573 | 5520 D3=D3*14+F9 574 | 5530 F9=F9+1 575 | 5540 IF F9<8 THEN 5560 576 | 5550 F9=F9-7 577 | 5560 ON F9 GOTO 5570,5590,5630,5650,5670,5690 578 | 5570 PRINT "MONDAY "; 579 | 5580 GOTO 5700 580 | 5590 PRINT "TUESDAY "; 581 | 5600 GOTO 5700 582 | 5610 PRINT "WEDNESDAY "; 583 | 5620 GOTO 5700 584 | 5630 PRINT "THURSDAY "; 585 | 5640 GOTO 5700 586 | 5650 PRINT "FRIDAY "; 587 | 5660 GOTO 5700 588 | 5670 PRINT "SATURDAY "; 589 | 5680 GOTO 5700 590 | 5690 PRINT "SUNDAY "; 591 | 5700 IF D3>124 THEN 5740 592 | 5710 D3=D3-93 593 | 5720 PRINT "JULY ";D3;" 1847" 594 | 5730 GOTO 5920 595 | 5740 IF D3>155 THEN 5780 596 | 5750 D3=D3-124 597 | 5760 PRINT "AUGUST ";D3;" 1847" 598 | 5770 GOTO 5920 599 | 5780 IF D3>185 THEN 5820 600 | 5790 D3=D3-155 601 | 5800 PRINT "SEPTEMBER ";D3;" 1847" 602 | 5810 GOTO 5920 603 | 5820 IF D3>216 THEN 5860 604 | 5830 D3=D3-185 605 | 5840 PRINT "OCTOBER ";D3;" 1847" 606 | 5850 GOTO 5920 607 | 5860 IF D3>246 THEN 5900 608 | 5870 D3=D3-216 609 | 5880 PRINT "NOVEMBER ";D3;" 1847" 610 | 5890 GOTO 5920 611 | 5900 D3=D3-246 612 | 5910 PRINT "DECEMBER ";D3;" 1847" 613 | 5920 PRINT 614 | 5930 PRINT "FOOD","BULLETS","CLOTHING","MISC. SUPP.","CASH" 615 | 5940 IF B>0 THEN 5960 616 | 5950 LET B=0 617 | 5960 IF C>0 THEN 5980 618 | 5970 LET C=0 619 | 5980 IF M1>0 THEN 6000 620 | 5990 LET M1=0 621 | 6000 IF T>0 THEN 6020 622 | 6010 LET T=0 623 | 6020 IF F>0 THEN 6040 624 | 6030 LET F=0 625 | 6040 PRINT INT(F),INT(B),INT(C),INT(M1),INT(T) 626 | 6050 PRINT 627 | 6060 PRINT TAB(11); "PRESIDENT JAMES K. POLK SENDS YOU HIS" 628 | 6070 PRINT TAB(17); "HEARTIEST CONGRATULATIONS" 629 | 6080 PRINT 630 | 6090 PRINT TAB(11);"AND WISHES YOU A PROSPEROUS LIFE AHEAD" 631 | 6100 PRINT 632 | 6110 PRINT TAB(22);"AT YOUR NEW HOME" 633 | QUIT 634 | 635 | REM ***SHOOTING SUB-ROUTINE*** 636 | 6131 REM THE METHOD OF TIMING THE SHOOTING 637 | 6132 REM WILL VARY FROM SYSTEM TO SYSTEM. 638 | 6133 REM USERS WILL PROBABLY PREFER TO USE 639 | 6134 REM IF TIMING ON THE USER'S SYSTEM IS HIGHLY SUSCEPTIBLE 640 | 6135 REM TO SYSTEM RESPONSE TIME, THE FORMULA IN LINE 6240 CAN 641 | 6136 REM BE TAILORED TO ACCOMODATE THIS BY EITHER INCREASING 642 | 6137 REM OR DECREASING THE 'SHOOTING' TIME RECORDED BY THE SYSTEM. 643 | 6140 DIM S$(5) 644 | 6150 S$(1)="bang" 645 | 6160 S$(2)="blam" 646 | 6170 S$(3)="pow" 647 | 6180 S$(4)="wham" 648 | 6190 S6=INT(RND(-1)*4+1) 649 | 6200 PRINT "TYPE "; S$(S6) 650 | REM 6210 B3 = CLK(0) 651 | 6220 INPUT C$ 652 | REM 6230 B1 = CLK(0) 653 | 6240 B1=((B1-B3)*3600)-(D9-1) 654 | 6250 PRINT 655 | 6255 IF B1>0 THEN 6260 656 | 6257 B1=0 657 | 6260 IF C$=S$(S6) THEN GOTO 6280 658 | 6270 B1=9 659 | 6280 RETURN 660 | 661 | REM ***ILLNESS SUB-ROUTINE*** 662 | 6300 IF 100*RND(-1)<10+35*(E-1) THEN GOTO 6370 663 | 6310 IF 100*RND(-1)<100-(40/4^(E-1)) THEN GOTO 6410 664 | 6320 PRINT "SERIOUS ILLNESS---" 665 | 6330 PRINT "YOU MUST STOP FOR MEDICAL ATTENTION" 666 | 6340 M1=M1-10 667 | 6350 S4=1 668 | 6360 GOTO 6440 669 | 6370 PRINT "MILD ILLNESS---MEDICINE USED" 670 | 6380 M=M-5 671 | 6390 M1=M1-2 672 | 6400 GOTO 6440 673 | 6410 PRINT "BAD ILLNESS---MEDICINE USED" 674 | 6420 M=M-5 675 | 6430 M1=M1-5 676 | 6440 IF M1<0 THEN 5110 677 | 6450 IF L1=1 THEN 4940 678 | 6460 GOTO 4710 679 | 680 | REM ***IDENTIFICATION OF VARIABLES IN THE PROGRAM*** 681 | 6480 REM A = AMOUNT SPENT ON ANIMALS 682 | 6490 REM B = AMOUNT SPENT ON AMMUNITION 683 | 6500 REM B1 = ACTUAL RESPONSE TIME FOR INPUTTING "BANG" 684 | 6510 REM B3 = CLOCK TIME AT START OF INPUTTING "BANG" 685 | 6520 REM C = AMOUNT SPENT ON CLOTHING 686 | 6530 REM C1 = FLAG FOR INSUFFICIENT CLOTHING IN COLD WEATHER 687 | 6540 REM C$ = YES/NO RESPONSE TO QUESTIONS 688 | 6550 REM D1 = COUNTER IN GENERATING EVENTS 689 | 6560 REM D3 = TURN NUMBER FOR SETTING DATE 690 | 6570 REM D4 = CURRENT DATE 691 | 6580 REM D9 = CHOICE OF SHOOTING EXPERTISE LEVEL 692 | 6590 REM E = CHOICE OF EATING 693 | 6600 REM F = AMOUNT SPENT ON FOOD 694 | 6610 REM F1 = FLAG FOR CLEARING SOUTH PASS 695 | 6620 REM F2 = FLAG FOR CLEARING BLUE MOUNTAINS 696 | 6630 REM F9 = FRACTION OF 2 WEEKS TRAVELED ON FINAL TURN 697 | 6640 REM K8 = FLAG FOR INJURY 698 | 6650 REM L1 = FLAG FOR BLIZZARD 699 | 6660 REM M = TOTAL MILEAGE WHOLE TRIP 700 | 6670 REM M1 = AMOUNT SPENT ON MISCELLANEOUS SUPPLIES 701 | 6680 REM M2 = TOTAL MILEAGE UP THROUGH PREVIOUS TURN 702 | 6690 REM M9 = FLAG FOR CLEARING SOUTH PASS IN SETTING MILEAGE 703 | 6700 REM P = AMOUNT SPENT ON ITEMS AT FORT 704 | 6710 REM R1 = RANDOM NUMBER IN CHOOSING EVENTS 705 | 6720 REM S4 = FLAG FOR ILLNESS 706 | 6730 REM S5 = ""HOSTILITY OF RIDERS"" FACTOR 707 | 6740 REM S6 = SHOOTING WORD SELECTOR 708 | 6750 REM S$ = VARIATIONS OF SHOOTING WORD 709 | 6760 REM T = CASH LEFT OVER AFTER INITIAL PURCHASES 710 | 6770 REM T1 = CHOICE OF TACTICS WHEN ATTACKED 711 | 6780 REM X = CHOICE OF ACTION FOR EACH TURN 712 | 6790 REM X1 = FLAG FOR FORT OPTION 713 | END 714 | -------------------------------------------------------------------------------- /oregon-trail-1975.bas: -------------------------------------------------------------------------------- 1 | 8 REM MINNESOTA EDUCATIONAL COMPUTING CONSORTIUM STAFF 2 | 9 REM PROGRAMMING REVISIONS BY DON RAWITSCH - 1975 3 | 11 REM CURRENT VERSION - 3/27/75 4 | 15 REM **FOR THE MEANING OF THE VARIABLES USED, LIST LINES 4900-4960** 5 | 25 PRINT "DO YOU NEED INSTRUCTIONS (y/n)"; 6 | 30 DIM C$(5) 7 | 35 INPUT C$ 8 | 40 IF C$ = "n" THEN 400 9 | 10 | REM ***INSTRUCTIONS*** 11 | PRINT "THIS PROGRAM SIMULATES A TRIP OVER THE OREGON TRAIL FROM" 12 | PRINT "INDEPENDENCE, MISSOURI TO OREGON CITY, OREGON IN 1847." 13 | PRINT "YOUR FAMILY OF FIVE WILL COVER THE 2000 MILE OREGON TRAIL" 14 | PRINT "IN 5-6 MONTHS --- IF YOU MAKE IT ALIVE." 15 | 16 | PRINT "" 17 | 85 PRINT "YOU HAD SAVED $900 TO SPEND FOR THE TRIP, AND YOU'VE JUST" 18 | 90 PRINT " PAID $200 FOR A WAGON." 19 | 95 PRINT "YOU WILL NEED TO SPEND THE REST OF YOUR MONEY ON THE" 20 | 100 PRINT " FOLLOWING ITEMS:" 21 | 105 PRINT 22 | 110 PRINT " OXEN - YOU CAN SPEND $200-$300 ON YOUR TEAM" 23 | 115 PRINT " THE MORE YOU SPEND, THE FASTER YOU'LL GO" 24 | 120 PRINT " BECAUSE YOU'LL HAVE BETTER ANIMALS" 25 | 125 PRINT 26 | 130 PRINT " FOOD - THE MORE YOU HAVE, THE LESS CHANCE THERE" 27 | 135 PRINT " IS OF GETTING SICK" 28 | 140 PRINT 29 | 145 PRINT " AMMUNITION - $1 BUYS A BELT OF 50 BULLETS" 30 | 150 PRINT " YOU WILL NEED BULLETS FOR ATTACKS BY ANIMALS" 31 | 155 PRINT " AND BANDITS, AND FOR HUNTING FOOD" 32 | 156 PRINT 33 | 165 PRINT " CLOTHING - THIS IS ESPECIALLY IMPORTANT FOR THE COLD" 34 | 170 PRINT " WEATHER YOU WILL ENCOUNTER WHEN CROSSING" 35 | 175 PRINT " THE MOUNTAINS" 36 | 180 PRINT 37 | 185 PRINT " MISCELLANEOUS SUPPLIES - THIS INCLUDES MEDICINE AND" 38 | 190 PRINT " OTHER THINGS YOU WILL NEED FOR SICKNESS" 39 | 195 PRINT " AND EMERGENCY REPAIRS" 40 | 200 PRINT 41 | 210 PRINT "YOU CAN SPEND ALL YOUR MONEY BEFORE YOU START YOUR TRIP -" 42 | 215 PRINT "OR YOU CAN SAVE SOME OF YOUR CASH TO SPEND AT FORTS ALONG" 43 | 220 PRINT "THE WAY WHEN YOU RUN LOW. HOWEVER, ITEMS COST MORE AT" 44 | 225 PRINT "THE FORTS. YOU CAN ALSO GO HUNTING ALONG THE WAY TO GET" 45 | 230 PRINT "MORE FOOD." 46 | rem PRINT "WHENEVER YOU HAVE TO USE YOUR TRUSTY RIFLE ALONG THE WAY," 47 | rem PRINT "YOU WILL SEE THE WORDS: TYPE BANG. THE FASTER YOU TYPE" 48 | rem PRINT "IN THE WORD 'BANG' AND HIT THE 'RETURN' KEY, THE BETTER" 49 | rem PRINT "LUCK YOU'LL HAVE WITH YOUR GUN." 50 | 260 PRINT 51 | 262 PRINT "WHEN ASKED TO ENTER MONEY AMOUNTS, DON'T USE A '$'." 52 | 263 PRINT 53 | 265 PRINT "GOOD LUCK!!!" 54 | 300 PRINT 55 | 56 | REM ***INITIAL PURCHASES*** 57 | 400 X1 = -1 58 | 405 K8 = S4 = F1 = F2 = M = M9 = D3 = 0 59 | 410 print : print: print 60 | 415 PRINT "HOW MUCH DO YOU WANT TO SPEND ON YOUR OXEN TEAM"; 61 | 420 INPUT A 62 | 425 IF A >= 200 THEN 440 63 | 430 PRINT "NOT ENOUGH" 64 | 435 GOTO 415 65 | 440 IF A <= 300 THEN 455 66 | 445 PRINT "TOO MUCH" 67 | 450 GOTO 415 68 | 455 PRINT "HOW MUCH DO YOU WANT TO SPEND ON FOOD"; 69 | 460 INPUT F 70 | 470 IF F >= 0 THEN 485 71 | 475 PRINT "IMPOSSIBLE" 72 | 480 GOTO 455 73 | 485 PRINT "HOW MUCH DO YOU WANT TO SPEND ON AMMUNITION"; 74 | 490 INPUT B 75 | 495 IF B >= 0 THEN 510 76 | 500 PRINT "IMPOSSIBLE" 77 | 505 GOTO 485 78 | 510 PRINT "HOW MUCH DO YOU WANT TO SPEND ON CLOTHING"; 79 | 515 INPUT C 80 | 520 IF C >= 0 THEN 535 81 | 525 PRINT "IMPOSSIBLE" 82 | 530 GOTO 510 83 | 535 PRINT "HOW MUCH DO YOU WANT TO SPEND ON MISCELANEOUS SUPPLIES"; 84 | 540 INPUT M1 85 | 545 IF M1 >= 0 THEN 560 86 | 550 PRINT "IMPOSSIBLE" 87 | 555 GOTO 535 88 | 560 T = 700 - A - F - B - C - M1 89 | 565 IF T >= 0 THEN 580 90 | 570 PRINT "YOU OVERSPENT--YOU ONLY HAD $700 TO SPEND. BUY AGAIN" 91 | 575 GOTO 410 92 | 580 B = 50 * B 93 | 585 PRINT "AFTER ALL YOUR PURCHASES, YOU NOW HAVE"; T; "DOLLARS LEFT" 94 | 590 PRINT 95 | 595 PRINT "MONDAY MARCH 29 1847" 96 | 600 PRINT 97 | 605 GOTO 1000 98 | 700 IF M >= 2040 OR D3 > 17 THEN 4000 99 | 100 | REM ***SETTING DATE*** 101 | 710 D3 = D3 + 1 102 | 715 PRINT 103 | 720 PRINT "MONDAY "; 104 | 725 IF D3 > 10 THEN GOTO 735 105 | 106 | REM 730 GOTO D3 OF 740,750,760,770,780,790,800,810,820,830 107 | 730 SELECT CASE D3 108 | CASE 1 109 | GOTO 740 110 | CASE 2 111 | GOTO 750 112 | CASE 3 113 | GOTO 760 114 | CASE 4 115 | GOTO 770 116 | CASE 5 117 | GOTO 780 118 | CASE 6 119 | GOTO 790 120 | CASE 7 121 | GOTO 800 122 | CASE 8 123 | GOTO 810 124 | CASE 9 125 | GOTO 820 126 | CASE 10 127 | GOTO 830 128 | END SELECT 129 | 130 | REM 735 GOTO D3-10 OF 840,850,860,870,880,890,900 131 | 735 SELECT CASE D3 - 10 132 | CASE 1 133 | GOTO 840 134 | CASE 2 135 | GOTO 850 136 | CASE 3 137 | GOTO 860 138 | CASE 4 139 | GOTO 870 140 | CASE 5 141 | GOTO 880 142 | CASE 6 143 | GOTO 890 144 | CASE 7 145 | GOTO 900 146 | END SELECT 147 | 740 PRINT "APRIL 12 "; 148 | 744 GOTO 910 149 | 750 PRINT "APRIL 26 "; 150 | 755 GOTO 910 151 | 760 PRINT "MAY 10 "; 152 | 765 GOTO 910 153 | 770 PRINT "MAY 24 "; 154 | 775 GOTO 910 155 | 780 PRINT "JUNE 7 "; 156 | 785 GOTO 910 157 | 790 PRINT "JUNE 21 "; 158 | 795 GOTO 910 159 | 800 PRINT "JULY 5 "; 160 | 805 GOTO 910 161 | 810 PRINT "JULY 19 "; 162 | 815 GOTO 910 163 | 820 PRINT "AUGUST 2 "; 164 | 825 GOTO 910 165 | 830 PRINT "AUGUST 16 "; 166 | 835 GOTO 910 167 | 840 PRINT "AUGUST 31 "; 168 | 845 GOTO 910 169 | 850 PRINT "SEPTEMBER 13 "; 170 | 855 GOTO 910 171 | 860 PRINT "SEPTEMBER 27 "; 172 | 865 GOTO 910 173 | 870 PRINT "OCTOBER 11 "; 174 | 875 GOTO 910 175 | 880 PRINT "OCTOBER 25 "; 176 | 885 GOTO 910 177 | 890 PRINT "NOVEMBER 8 "; 178 | 895 GOTO 910 179 | 900 PRINT "NOVEMBER 22 "; 180 | 910 PRINT "1847" 181 | 915 PRINT 182 | 183 | REM ***BEGINNING EACH TURN*** 184 | 1000 IF F >= 0 THEN 1015 185 | 1010 F = 0 186 | 1015 IF B >= 0 THEN 1025 187 | 1020 B = 0 188 | 1025 IF C >= 0 THEN 1035 189 | 1030 C = 0 190 | 1035 IF M1 >= 0 THEN 1045 191 | 1040 M1 = 0 192 | 1045 IF F >= 12 THEN 1055 193 | 1050 PRINT "YOU'D BETTER DO SOME HUNTING OR BUY FOOD AND SOON!!!!" 194 | 1055 F = INT(F) 195 | 1060 B = INT(B) 196 | 1065 C = INT(C) 197 | 1070 M1 = INT(M1) 198 | 1075 T = INT(T) 199 | 1080 M = INT(M) 200 | 1085 M2 = M 201 | 1090 IF S4 = 1 THEN 1105 202 | 1095 IF K8 = 1 THEN 1105 203 | 1100 GOTO 1130 204 | 1105 T = T - 20 205 | 1110 IF T < 0 THEN 3520 206 | 1115 PRINT "DOCTOR'S BILL IS $20" 207 | 1120 LET K8 = S4 = 0 208 | 1130 IF M9 = 1 THEN 1145 209 | 1135 PRINT "TOTAL MILEAGE IS"; M 210 | 1140 GOTO 1160 211 | 1145 PRINT "TOTAL MILEAGE IS 950" 212 | 1150 M9 = 0 213 | 1160 PRINT "FOOD", "BULLETS", "CLOTHING", "MISC. SUPP.", "CASH" 214 | 1165 PRINT F, B, C, M1, T 215 | 1300 IF X1 = -1 THEN 1350 216 | 1305 X1 = X1 * -1 217 | 1310 PRINT "DO YOU WANT TO (1) STOP AT THE NEXT FORT, (2) HUNT, "; 218 | 1315 INPUT "OR (3) CONTINUE"; X 219 | 1325 IF X > 2 THEN 1340 220 | 1330 IF X < 1 THEN 1340 221 | 1332 LET X = INT(X) 222 | 1335 GOTO 1400 223 | 1340 LET X = 3 224 | 1345 GOTO 1400 225 | 1350 INPUT "DO YOU WANT TO (1) HUNT, OR (2) CONTINUE"; X 226 | 1360 IF X = 1 THEN 1370 227 | 1365 LET X = 2 228 | 1370 LET X = X + 1 229 | 1375 IF X = 3 THEN 1395 230 | 1380 IF B > 39 THEN 1395 231 | 1385 PRINT "TOUGH---YOU NEED MORE BULLETS TO GO HUNTING" 232 | 1390 GOTO 1350 233 | 1395 X1 = X1 * -1 234 | 235 | 1400 SELECT CASE X 236 | CASE 1 237 | GOTO 1500 238 | CASE 2 239 | GOTO 1700 240 | CASE 3 241 | GOTO 1800 242 | END SELECT 243 | 244 | REM 1400 GOTO X OF 1500,1700,1800 245 | 246 | REM ***STOPPING AT FORT*** 247 | 1500 PRINT "ENTER WHAT YOU WISH TO SPEND ON THE FOLLOWING" 248 | 1505 PRINT "FOOD"; 249 | 1510 GOSUB 1520 250 | 1515 GOTO 1555 251 | 1520 INPUT P 252 | 1525 IF P < 0 THEN 1550 253 | 1530 T = T - P 254 | 1535 IF T >= 0 THEN 1550 255 | 1537 PRINT "YOU DON'T HAVE THAT MUCH--KEEP YOUR SPENDING DOWN" 256 | 1540 T = T + P 257 | 1545 P = 0 258 | 1550 RETURN 259 | 1555 F = F + 2 / 3 * P 260 | 1560 PRINT "AMMUNITION"; 261 | 1565 GOSUB 1520 262 | 1570 LET B = INT(B + 2 / 3 * P * 50) 263 | 1575 PRINT "CLOTHING"; 264 | 1580 GOSUB 1520 265 | 1585 C = C + 2 / 3 * P 266 | 1590 PRINT "MISCELLANEOUS SUPPLIES"; 267 | 1595 GOSUB 1520 268 | 1600 M1 = M1 + 2 / 3 * P 269 | 1605 M = M - 45 270 | 1610 GOTO 1800 271 | 272 | REM ***HUNTING*** 273 | 1700 IF B > 39 THEN 1715 274 | 1705 PRINT "TOUGH---YOU NEED MORE BULLETS TO GO HUNTING" 275 | 1710 GOTO 1310 276 | 1715 M = M - 45 277 | 1720 GOSUB 4500 278 | 1725 IF B1 <= 1 THEN 1755 279 | 1730 IF 100 * RND(0) < 13 * B1 THEN 1780 280 | 1735 F = F + 48 - 2 * B1 281 | 1740 PRINT "NICE SHOT--RIGHT THROUGH THE NECK--FEAST TONIGHT!!" 282 | 1745 B = B - 10 - 3 * B1 283 | 1750 GOTO 1800 284 | 285 | REM **BELLS IN LINE 1755** 286 | 1755 PRINT "RIGHT BETWEEN THE EYES---YOU GOT A BIG ONE!!!!" 287 | 1765 F = F + 52 + RND(0) * 6 288 | 1770 B = B - 10 - RND(0) * 4 289 | 1775 GOTO 1800 290 | 1780 PRINT "SORRY---NO LUCK TODAY" 291 | 1800 IF F >= 13 THEN 1900 292 | 1805 GOTO 3500 293 | 294 | REM ***EATING*** 295 | 1900 PRINT "DO YOU WANT TO EAT (1) POORLY (2) MODERATELY" 296 | 1902 PRINT "OR (3) WELL"; 297 | 1905 INPUT E 298 | 1910 IF E > 3 THEN 1900 299 | 1915 IF E < 1 THEN 1900 300 | 1920 LET E = INT(E) 301 | 1930 LET F = F - 8 - 5 * E 302 | 1935 IF F >= 0 THEN 2000 303 | 1940 F = F + 8 + 5 * E 304 | 1945 PRINT "YOU CAN'T EAT THAT WELL" 305 | 1950 GOTO 1900 306 | 2000 LET M = M + 200 + (A - 220) / 5 + 10 * RND(0) 307 | 2005 L1 = C1 = 0 308 | 309 | REM ***RIDERS ATTACK*** 310 | 2100 IF RND(0) * 10 > ((M / 100 - 4) ^ 2 + 72) / ((M / 100 - 4) ^ 2 + 12) - 1 THEN 2500 311 | 2105 PRINT "RIDERS AHEAD. THEY "; 312 | 2110 S5 = 0 313 | 2115 IF RND(0) < .8 THEN 2130 314 | 2120 PRINT "DON'T "; 315 | 2125 S5 = 1 316 | 2130 PRINT "LOOK HOSTILE" 317 | 2135 PRINT "TACTICS" 318 | 2140 PRINT "(1) RUN (2) ATTACK (3) CONTINUE (4) CIRCLE WAGONS" 319 | 2145 PRINT "IF YOU RUN YOU'LL GAIN TIME BUT WEAR DOWN YOUR OXEN" 320 | 2150 PRINT "IF YOU CIRCLE YOU'LL LOSE TIME" 321 | 2155 IF RND(0) > .2 THEN 2165 322 | 2160 S5 = 1 - S5 323 | 2165 INPUT T1 324 | 2170 IF T1 < 1 THEN 2140 325 | 2175 IF T1 > 4 THEN 2140 326 | 2180 T1 = INT(T1) 327 | 2185 IF S5 = 1 THEN 2330 328 | 2190 IF T1 > 1 THEN 2220 329 | 2195 M = M + 20 330 | 2200 M1 = M1 - 15 331 | 2205 B = B - 150 332 | 2210 A = A - 40 333 | 2215 GOTO 2395 334 | 2220 IF T1 > 2 THEN 2285 335 | 2225 GOSUB 4500 336 | 2230 B = B - B1 * 40 - 80 337 | 2235 IF B1 > 1 THEN 2250 338 | 2240 PRINT "NICE SHOOTING---YOU DROVE THEM OFF" 339 | 2245 GOTO 2395 340 | 2250 IF B1 <= 4 THEN 2275 341 | 2255 PRINT "LOUSY SHOT---YOU GOT KNIFED" 342 | 2260 K8 = 1 343 | 2265 PRINT "YOU HAVE TO SEE OL' DOC BLANCHARD" 344 | 2270 GOTO 2395 345 | 2275 PRINT "KINDA SLOW WITH YOUR COLT .45" 346 | 2280 GOTO 2395 347 | 2285 IF T1 > 3 THEN 2310 348 | 2290 IF RND(0) > .8 THEN 2390 349 | 2295 LET B = B - 150 350 | 2300 M1 = M1 - 15 351 | 2305 GOTO 2395 352 | 2310 GOSUB 4500 353 | 2315 B = B - B1 * 30 - 80 354 | 2320 M = M - 25 355 | 2325 GOTO 2235 356 | 2330 IF T1 > 1 THEN 2350 357 | 2335 M = M + 15 358 | 2340 A = A - 10 359 | 2345 GOTO 2395 360 | 2350 IF T1 > 2 THEN 2370 361 | 2355 M = M - 5 362 | 2360 B = B - 100 363 | 2365 GOTO 2395 364 | 2370 IF T1 > 3 THEN 2380 365 | 2375 GOTO 2395 366 | 2380 M = M - 20 367 | 2385 GOTO 2395 368 | 2390 PRINT "THEY DID NOT ATTACK" 369 | 2392 GOTO 2500 370 | 2395 IF S5 = 0 THEN 2410 371 | 2400 PRINT "RIDERS WERE FRIENDLY, BUT CHECK FOR POSSIBLE LOSSES" 372 | 2405 GOTO 2500 373 | 2410 PRINT "RIDERS WERE HOSTILE--CHECK FOR LOSSES" 374 | 2415 IF B >= 0 THEN 2500 375 | 2420 PRINT "YOU RAN OUT OF BULLETS AND GOT MASSACRED BY THE RIDERS" 376 | 2425 GOTO 3600 377 | 378 | REM ***SELECTION OF EVENTS*** 379 | 2500 LET D1 = 0 380 | 2505 RESTORE 381 | PRINT "" 382 | print "" 383 | print "" 384 | 2510 R1 = 100 * RND(0) 385 | 2515 LET D1 = D1 + 1 386 | 2520 IF D1 = 16 THEN 3020 387 | 2525 READ D 388 | 2530 IF R1 > D THEN 2515 389 | 2535 DATA 6,11,13,15,17,22,32,35,37,42,44,54,64,69,95 390 | 2537 IF D1 > 10 THEN 2545 391 | 392 | REM 2540 GOTO D1 OF 2550,2570,2590,2615,2630,2645,2660,2690,2785,2810 393 | 2540 SELECT CASE D1 394 | CASE 1 395 | GOTO 2550 396 | CASE 2 397 | GOTO 2570 398 | CASE 3 399 | GOTO 2590 400 | CASE 4 401 | GOTO 2615 402 | CASE 5 403 | GOTO 2630 404 | CASE 6 405 | GOTO 2645 406 | CASE 7 407 | GOTO 2660 408 | CASE 8 409 | GOTO 2690 410 | CASE 9 411 | GOTO 2785 412 | CASE 10 413 | GOTO 2810 414 | END SELECT 415 | 416 | 417 | REM 2545 GOTO D1-10 OF 2825,2860,2885,2970,2990,3020 418 | 2545 SELECT CASE D1 - 10 419 | CASE 1 420 | GOTO 2825 421 | CASE 2 422 | GOTO 2860 423 | CASE 3 424 | GOTO 2885 425 | CASE 4 426 | GOTO 2970 427 | CASE 5 428 | GOTO 2990 429 | CASE 6 430 | GOTO 3020 431 | END SELECT 432 | 2550 PRINT "WAGON BREAKS DOWN--LOSE TIME AND SUPPLIES FIXING IT" 433 | 2555 LET M = M - 15 - 5 * RND(0) 434 | 2560 LET M1 = M1 - 8 435 | 2565 GOTO 3100 436 | 2570 PRINT "OX INJURES LEG---SLOWS YOU DOWN REST OF TRIP" 437 | 2575 LET M = M - 25 438 | 2580 LET A = A - 20 439 | 2585 GOTO 3100 440 | 2590 PRINT "BAD LUCK---YOUR DAUGHTER BROKE HER ARM" 441 | 2595 PRINT "YOU HAD TO STOP AND USE SUPPLIES TO MAKE A SLING" 442 | 2600 M = M - 5 - 4 * RND(0) 443 | 2605 M1 = M1 - 2 - 3 * RND(0) 444 | 2610 GOTO 3100 445 | 2615 PRINT "OX WANDERS OFF---SPEND TIME LOOKING FOR IT" 446 | 2620 M = M - 17 447 | 2625 GOTO 3100 448 | 2630 PRINT "YOUR SON GETS LOST---SPEND HALF THE DAY LOOKING FOR HIM" 449 | 2635 M = M - 10 450 | 2640 GOTO 3100 451 | 2645 PRINT "UNSAFE WATER--LOSE TIME LOOKING FOR CLEAN SPRING" 452 | 2650 LET M = M - 10 * RND(0) - 2 453 | 2655 GOTO 3100 454 | 2660 IF M > 950 THEN 2935 455 | 2665 PRINT "HEAVY RAINS---TIME AND SUPPLIES LOST" 456 | 2670 F = F - 10 457 | 2672 B = B - 500 458 | 2675 M1 = M1 - 15 459 | 2680 M = M - 10 * RND(0) - 5 460 | 2685 GOTO 3100 461 | 2690 PRINT "BANDITS ATTACK" 462 | 2700 GOSUB 4500 463 | 2705 B = B - 20 * B1 464 | 2715 IF B >= 0 THEN 2735 465 | 2720 PRINT "YOU RAN OUT OF BULLETS---THEY GET LOTS OF CASH" 466 | 2725 T = T / 3 467 | 2730 GOTO 2740 468 | 2735 IF B1 <= 1 THEN 2770 469 | 2740 PRINT "YOU GOT SHOT IN THE LEG AND THEY TOOK ONE OF YOUR OXEN" 470 | 2745 K8 = 1 471 | 2750 PRINT "BETTER HAVE A DOC LOOK AT YOUR WOUND" 472 | 2755 M1 = M1 - 5 473 | 2760 A = A - 20 474 | 2765 GOTO 3100 475 | 2770 PRINT "QUICKEST DRAW OUTSIDE OF DODGE CITY!!!" 476 | 2775 PRINT "YOU GOT 'EM!" 477 | 2780 GOTO 3100 478 | 2785 PRINT "THERE WAS A FIRE IN YOUR WAGON--FOOD AND SUPPLIES DAMAGED" 479 | 2790 F = F - 40 480 | 2792 B = B - 400 481 | 2795 LET M1 = M1 - RND(0) * 8 - 3 482 | 2800 M = M - 15 483 | 2805 GOTO 3100 484 | 2810 PRINT "LOSE YOUR WAY IN HEAVY FOG---TIME IS LOST" 485 | 2815 M = M - 10 - 5 * RND(0) 486 | 2820 GOTO 3100 487 | 2825 PRINT "YOU KILLED A POISONOUS SNAKE AFTER IT BIT YOU" 488 | 2830 B = B - 10 489 | 2835 M1 = M1 - 5 490 | 2840 IF M1 >= 0 THEN 2855 491 | 2845 PRINT "YOU DIE OF SNAKEBITE SINCE YOU HAVE NO MEDICINE" 492 | 2850 GOTO 3600 493 | 2855 GOTO 3100 494 | 2860 PRINT "WAGON GETS SWAMPED FORDING RIVER--LOSE FOOD AND CLOTHES" 495 | 2865 F = F - 30 496 | 2870 C = C - 20 497 | 2875 M = M - 20 - 20 * RND(0) 498 | 2880 GOTO 3100 499 | 2885 PRINT "WILD ANIMALS ATTACK!" 500 | 2887 GOSUB 4500 501 | 2889 IF B > 39 THEN 2895 502 | 2890 PRINT "YOU WERE TOO LOW ON BULLETS--" 503 | 2891 PRINT "THE WOLVES OVERPOWERED YOU" 504 | 2892 K8 = 1 505 | 2893 GOTO 3555 506 | 2895 IF B1 > 2 THEN 2910 507 | 2900 PRINT "NICE SHOOTIN' PARDNER---THEY DIDN'T GET MUCH" 508 | 2905 GOTO 2915 509 | 2910 PRINT "SLOW ON THE DRAW---THEY GOT AT YOUR FOOD AND CLOTHES" 510 | 2915 B = B - 20 * B1 511 | 2920 C = C - B1 * 4 512 | 2925 F = F - B1 * 8 513 | 2930 GOTO 3100 514 | 2935 PRINT "COLD WEATHER---BRRRRRRR!---YOU "; 515 | 2940 IF C > 22 + 4 * RND(0) THEN 2955 516 | 2945 PRINT "DON'T "; 517 | 2950 C1 = 1 518 | 2955 PRINT "HAVE ENOUGH CLOTHING TO KEEP YOU WARM" 519 | 2960 IF C1 = 0 THEN 3100 520 | 2965 GOTO 4700 521 | 2970 PRINT "HAIL STORM---SUPPLIES DAMAGED" 522 | 2975 M = M - 5 - RND(0) * 10 523 | 2977 B = B - 200 524 | 2980 M1 = M1 - 4 - RND(0) * 3 525 | 2985 GOTO 3100 526 | 2990 IF E = 1 THEN 4700 527 | 2995 IF E = 3 THEN 3010 528 | 3000 IF RND(0) > .25 THEN 4700 529 | 3005 GOTO 3100 530 | 3010 IF RND(0) < .5 THEN 4700 531 | 3015 GOTO 3100 532 | 3020 PRINT "HELPFUL INDIANS SHOW YOU WHERE TO FIND MORE FOOD" 533 | 3025 F = F + 14 534 | 3030 GOTO 3100 535 | 536 | REM ***MOUNTAINS*** 537 | 3100 IF M <= 950 THEN 700 538 | 3105 IF RND(0) * 10 > 9 - ((M / 100 - 15) ^ 2 + 72) / ((M / 100 - 15) ^ 2 + 12) THEN 3175 539 | 3110 PRINT "RUGGED MOUNTAINS" 540 | 3115 IF RND(0) > .1 THEN 3135 541 | 3120 PRINT "YOU GOT LOST---LOSE VALUABLE TIME TRYING TO FIND TRAIL!" 542 | 3125 M = M - 60 543 | 3130 GOTO 3175 544 | 3135 IF RND(0) > .11 THEN 3160 545 | 3140 PRINT "WAGON DAMAGED!---LOSE TIME AND SUPPLIES" 546 | 3145 M1 = M1 - 5 547 | 3147 B = B - 200 548 | 3150 M = M - 20 - 30 * RND(0) 549 | 3155 GOTO 3175 550 | 3160 PRINT "THE GOING GETS SLOW" 551 | 3165 M = M - 45 - RND(0) / .02 552 | 3175 IF F1 = 1 THEN 3195 553 | 3180 F1 = 1 554 | 3185 IF RND(0) < .8 THEN 3300 555 | 3190 PRINT "YOU MADE IT SAFELY THROUGH SOUTH PASS--NO SNOW" 556 | 3195 IF M < 1700 THEN 3215 557 | 3200 IF F2 = 1 THEN 3215 558 | 3205 F2 = 1 559 | 3210 IF RND(0) < .7 THEN 3300 560 | 3215 IF M > 950 THEN 700 561 | 3220 M9 = 1 562 | 3225 GOTO 700 563 | 3300 PRINT "BLIZZARD IN MOUNTAIN PASS--TIME AND SUPPLIES LOST" 564 | 3305 L1 = 1 565 | 3310 F = F - 25 566 | 3315 M1 = M1 - 10 567 | 3317 B = B - 300 568 | 3320 M = M - 30 - 40 * RND(0) 569 | 3325 IF C < 18 + 2 * RND(0) THEN 4700 570 | 3330 GOTO 3215 571 | 572 | REM ***DYING*** 573 | 3500 PRINT "YOU RAN OUT OF FOOD AND STARVED TO DEATH" 574 | 3505 GOTO 3600 575 | 3520 LET T = 0 576 | 3525 PRINT "YOU CAN'T AFFORD A DOCTOR" 577 | 3530 GOTO 3555 578 | 3550 PRINT "YOU RAN OUT MEDICAL SUPPLIES" 579 | 3555 PRINT "YOU DIED OF "; 580 | 3560 IF K8 = 1 THEN 3575 581 | 3565 PRINT "PNEUMONIA" 582 | 3570 GOTO 3600 583 | 3575 PRINT "INJURIES" 584 | 3600 PRINT 585 | 3602 PRINT "DO TO YOUR UNFORTUNATE SITUATION, THERE ARE A FEW" 586 | 3605 PRINT "FORMALITIES WE MUST GO THROUGH" 587 | 3610 PRINT 588 | 3615 PRINT "WOULD YOU LIKE A MINISTER?" 589 | 3620 INPUT C$ 590 | 3630 PRINT "WOULD YOU LIKE A FANCY FUNERAL?" 591 | 3635 INPUT C$ 592 | 3650 PRINT "WOULD YOU LIKE US TO INFORM YOUR NEXT OF KIN?" 593 | 3652 INPUT C$ 594 | 3654 IF C$ = "y" THEN 3670 595 | 3656 PRINT "YOUR AUNT NELLIE IN ST. LOUIS IS ANXIOUS TO HEAR" 596 | 3658 PRINT 597 | 3670 PRINT "WE THANK YOU FOR THIS INFORMATION AND WE ARE SORRY YOU" 598 | 3675 PRINT "DIDN'T MAKE IT TO THE GREAT TERRITORY OF OREGON" 599 | 3680 PRINT "BETTER LUCK NEXT TIME" 600 | 3685 PRINT 601 | 3690 PRINT 602 | 3695 PRINT TAB(30); "SINCERELY" 603 | 3700 PRINT 604 | 3705 PRINT TAB(17); "THE OREGON CITY CHAMBER OF COMMERCE" 605 | QUIT 606 | 607 | REM ***FINAL TURN*** 608 | 4000 F9 = (2040 - M2) / (M - M2) 609 | 4005 F = F + (1 - F9) * (8 + 5 * E) 610 | 4010 PRINT 611 | 4012 REM *BELLS IN LINES 4015, 4020* 612 | 4015 PRINT "YOU" '7" FINALLY ARRI"'7"VED AT ORE"'7"GON CITY"'7 613 | 4020 PRINT "AFTER" '7" 2040 LONG MILES"'7"---HOORAY!!"'7"!!!" 614 | 4025 PRINT 615 | 4030 F9 = INT(F9 * 14) 616 | 4035 D3 = D3 * 14 + F9 617 | 4040 F9 = F9 + 1 618 | 4045 IF F9 < 8 THEN 4055 619 | 4050 F9 = F9 - 7 620 | REM 4055 GOTO F9 OF 4060,4070,4080,4090,4100,4110,4120 621 | 4055 SELECT CASE F9 622 | CASE 1 623 | GOTO 4060 624 | CASE 2 625 | GOTO 4070 626 | CASE 3 627 | GOTO 4080 628 | CASE 4 629 | GOTO 4090 630 | CASE 5 631 | GOTO 4100 632 | CASE 6 633 | GOTO 4110 634 | CASE 7 635 | GOTO 4120 636 | END SELECT 637 | 4060 PRINT "MONDAY "; 638 | 4065 GOTO 4125 639 | 4070 PRINT "TUESDAY "; 640 | 4075 GOTO 4125 641 | 4080 PRINT "WEDNESDAY "; 642 | 4085 GOTO 4125 643 | 4090 PRINT "THURSDAY "; 644 | 4095 GOTO 4125 645 | 4100 PRINT "FRIDAY "; 646 | 4105 GOTO 4125 647 | 4110 PRINT "SATURDAY "; 648 | 4115 GOTO 4125 649 | 4120 PRINT "SUNDAY "; 650 | 4125 IF D3 > 124 THEN 4145 651 | 4130 D3 = D3 - 93 652 | 4135 PRINT "JULY "; D3; " 1847" 653 | 4140 GOTO 4215 654 | 4145 IF D3 > 155 THEN 4165 655 | 4150 D3 = D3 - 124 656 | 4155 PRINT "AUGUST "; D3; " 1847" 657 | 4160 GOTO 4215 658 | 4165 IF D3 > 185 THEN 4185 659 | 4170 D3 = D3 - 155 660 | 4175 PRINT "SEPTEMBER "; D3; " 1847" 661 | 4180 GOTO 4215 662 | 4185 IF D3 > 216 THEN 4205 663 | 4190 D3 = D3 - 185 664 | 4195 PRINT "OCTOBER "; D3; " 1847" 665 | 4200 GOTO 4215 666 | 4205 D3 = D3 - 216 667 | 4210 PRINT "NOVEMBER "; D3; " 1847" 668 | 4215 PRINT 669 | 4220 PRINT "FOOD", "BULLETS", "CLOTHING", "MISC. SUPP.", "CASH" 670 | 4230 IF B > 0 THEN 4240 671 | 4235 LET B = 0 672 | 4240 IF C > 0 THEN 4250 673 | 4245 LET C = 0 674 | 4250 IF M1 > 0 THEN 4260 675 | 4255 LET M1 = 0 676 | 4260 IF T > 0 THEN 4270 677 | 4265 LET T = 0 678 | 4270 IF F > 0 THEN 4285 679 | 4275 LET F = 0 680 | 4285 PRINT INT(F), INT(B), INT(C), INT(M1), INT(T) 681 | 4290 PRINT 682 | 4295 PRINT "PRESIDENT JAMES K. POLK SENDS YOU HIS" 683 | 4297 PRINT " HEARTIEST CONGRATULATIONS" 684 | 4300 PRINT 685 | 4305 PRINT TAB(11); "AND WISHES YOU A PROSPEROUS LIFE AHEAD" 686 | 4310 PRINT 687 | 4315 PRINT TAB(22); "AT YOUR NEW HOME" 688 | QUIT 689 | 690 | REM ***SHOOTING SUB-ROUTINE*** 691 | 4500 RBANG = RND(0) 692 | 4505 B2 = 7 693 | 4510 C$ = "" 694 | 4520 PRINT 695 | 4525 IF RBANG > 0.2 THEN 4535 696 | 4530 B1 = 7 697 | 4535 RETURN 698 | 699 | REM ***ILLNESS SUB-ROUTINE*** 700 | 4700 IF 100 * RND(0) < 10 + 35 * (E - 1) THEN 4740 701 | 4705 IF 100 * RND(0) < 100 - (40 / 4 ^ (E - 1)) THEN 4760 702 | 4715 PRINT "SERIOUS ILLNESS---" 703 | 4720 PRINT "YOU MUST STOP FOR MEDICAL ATTENTION" 704 | 4725 M1 = M1 - 10 705 | 4730 S4 = 1 706 | 4735 GOTO 4780 707 | 4740 PRINT "MILD ILLNESS---MEDICINE USED" 708 | 4745 M = M - 5 709 | 4750 M1 = M1 - 2 710 | 4755 GOTO 4780 711 | 4760 PRINT "BAD ILLNESS---MEDICINE USED" 712 | 4765 M = M - 5 713 | 4770 M1 = M1 - 5 714 | 4780 IF M1 < 0 THEN 3550 715 | 4785 IF L1 = 1 THEN 3215 716 | 4790 GOTO 3100 717 | 718 | REM ***IDENTIFICATION OF VARIABLES IN THE PROGRAM*** 719 | 4902 REM A = AMOUNT SPENT ON ANIMALS 720 | 4904 REM B = AMOUNT SPENT ON AMMUNITION 721 | 4906 REM B1 = ACTUAL RESPONSE TIME FOR INPUTING 'BANG' 722 | 4908 REM B2 = MAXIMUM RESPONSE TIME FOR INPUTING 'BANG' 723 | 4910 REM C = AMOUNT SPENT ON CLOTHING 724 | 4912 REM C1 = FLAG FOR INSUFFICIENT CLOTHING IN COLD WEATHER 725 | 4914 REM C$ = YES/NO RESPONSE TO QUESTIONS 726 | 4916 REM D1 = COUNTER IN GENERATING EVENTS 727 | 4918 REM D3 = TURN NUMBER FOR SETTING DATE 728 | 4920 REM D4 = CURRENT DATE 729 | 4922 REM E = CHOICE OF EATING 730 | 4924 REM F = AMOUNT SPENT ON FOOD 731 | 4926 REM F1 = FLAG FOR CLEARING SOUTH PASS 732 | 4928 REM F2 = FLAG FOR CLEARING BLUE MOUNTAINS 733 | 4930 REM F9 = FRACTION OF 2 WEEKS TRAVELED ON FINAL TURN 734 | 4932 REM K8 = FLAG FOR INJURY 735 | 4934 REM L1 = FLAG FOR BLIZZARD 736 | 4936 REM M = TOTAL MILEAGE WHOLE TRIP 737 | 4938 REM M1 = AMOUNT SPENT ON MISCELLANEOUS SUPPLIES 738 | 4940 REM M2 = TOTAL MILEAGE UP THROUGH PREVIOUS TURN 739 | 4942 REM M9 = FLAG FOR CLEARING SOUTH PASS IN SETTING MILEAGE 740 | 4944 REM P = AMOUNT SPENT ON ITEMS AT FORT 741 | 4946 REM R1 = RANDOM NUMBER IN CHOOSING EVENTS 742 | 4948 REM S4 = FLAG FOR ILLNESS 743 | 4950 REM S5 = 'HOSTILITY OF RIDERS' FACTOR 744 | 4952 REM T = CASH LEFT OVER AFTER INITIAL PURCHASES 745 | 4954 REM T1 = CHOICE OF TACTICS WHEN ATTACKED 746 | 4956 REM X = CHOICE OF ACTION FOR EACH TURN 747 | 4958 REM X1 = FLAG FOR FORT OPTION 748 | 5000 END 749 | 750 | -------------------------------------------------------------------------------- /src/oregon-trail-1975.f: -------------------------------------------------------------------------------- 1 | C ****************************************************************** 2 | C 3 | C THE OREGON TRAIL IN FORTRAN 77 4 | C 5 | C ****************************************************************** 6 | C 7 | C THIS PROGRAM IS A PORT OF THE 1978 VERSION OF "THE OREGON TRAIL" 8 | C TO ANSI FORTRAN 77, ORIGINALLY WRITTEN IN THE HP TIME-SHARED BASIC 9 | C BY DON RAWITSCH, BILL HEINEMANN, AND PAUL DILLENBERGER IN 1971. 10 | C 11 | C upgraded to Fortran 95 by Michael Hirsch 12 | C 13 | C ****************************************************************** 14 | C AUTHOR: PHILIPP ENGEL 15 | C DATE: 2021-04-12 16 | C VERSION: 1.0 17 | C LICENCE: ISC 18 | C ****************************************************************** 19 | module game75 20 | 21 | use, intrinsic :: iso_fortran_env, only : stdin=>input_unit 22 | 23 | implicit none 24 | 25 | 26 | C COMMON VARIABLES: 27 | C 28 | C EVNTS - ARRAY OF EVENT PROBABILITIES. 29 | C DATES - ARRAY OF DATE STRINGS. 30 | C WDAYS - ARRAY OF WEEKDAY STRINGS. 31 | C IAMMU - AMOUNT SPENT ON AMMUNITION. 32 | C IANIM - AMOUNT SPENT ON ANIMALS. 33 | C ICLTH - AMOUNT SPENT ON CLOTHING. 34 | C IFOOD - AMOUNT SPENT ON FOOD. 35 | C IMISC - AMOUNT SPENT ON MISCELLANEAOUS SUPPLIES. 36 | C IEVTC - COUNTER IN GENERATING EVENTS. 37 | C ICTRN - TURN NUMBER FOR SETTING DATE. 38 | C ILEVL - CHOICE OF SHOOTING EXPERTISE LEVEL. 39 | C IEATS - CHOICE OF EATING. 40 | C IF950 - FLAG FOR CLEARING SOUTH PASS IN SETTING MILEAGE. 41 | C IFPAS - FLAG FOR CLEARING SOUTH PASS. 42 | C IFMOU - FLAG FOR CLEARING BLUE MOUNTAINS. 43 | C IFFRT - FLAG FOR FORT OPTION. 44 | C IFILL - FLAG FOR ILLNESS 45 | C IFINJ - FLAG FOR INJURY. 46 | C ITMIL - TOTAL MILEAGE WHOLE TRIP. 47 | C ILMIL - TOTAL MILEAGE UP THROUGH PREVIOUS TURN. 48 | C ICASH - CASH LEFT AFTER INITIAL PURCHASE. 49 | C 50 | CHARACTER(17), parameter :: DATSTR(20) = [character(17) :: 51 | & 'MARCH 29 1847','APRIL 12 1847','APRIL 26 1847', 52 | & 'MAY 10 1847','MAY 24 1847','JUNE 7 1847','JUNE 21 1847', 53 | & 'JULY 5 1847','JULY 19 1847','AUGUST 2 1847','AUGUST 16 1847', 54 | & 'AUGUST 31 1847','SEPTEMBER 13 1847','SEPTEMBER 27 1847', 55 | & 'OCTOBER 11 1847','OCTOBER 25 1847','NOVEMBER 8 1847', 56 | & 'NOVEMBER 22 1847','DECEMBER 6 1847','DECEMBER 20 1847'] 57 | CHARACTER(10), parameter :: WKDSTR(7) = [character(10) :: 58 | & 'MONDAY,','TUESDAY,','WEDNESDAY,','THURSDAY,', 59 | & 'FRIDAY,','SATURDAY,','SUNDAY,'] 60 | INTEGER, parameter :: IEVENT(15) = [ 61 | & 6,11,13,15,17,22,32,35,37,42,44,54,64,69,95] 62 | 63 | integer :: ICTRN = 0, ITMIL = 0 64 | integer :: IFFRT = -1, IFILL = 0, IFINJ = 0, IF950 = 0, 65 | & IFPAS = 0, IFMOU = 0 66 | integer :: icash = 700 67 | 68 | integer :: iammu, ianim, iclth, ieats, ievtc, ifood, ilevl, 69 | & ilmil, imisc 70 | 71 | contains 72 | 73 | logical FUNCTION ASK() 74 | C 75 | C READS USER INPUT AND RETURNS .TRUE. IF INPUT STARTS WITH "Y" AND 76 | C .FALSE. IF WITH "N". 77 | C 78 | CHARACTER :: A 79 | integer :: N 80 | 81 | do 82 | READ(stdin, '(A1)', iostat=N) A 83 | if(IS_IOSTAT_END(N)) stop "thanks for playing" 84 | 85 | select case (A) 86 | case ('Y','y') 87 | ask = .true. 88 | exit 89 | case ('N','n') 90 | ask = .false. 91 | exit 92 | case default 93 | PRINT *,'PARDON?' 94 | end select 95 | end do 96 | END function ask 97 | C ****************************************************************** 98 | integer FUNCTION INPUT(MIN, MAX) 99 | C 100 | C READS INTEGER VALUE WITH GIVEN MINIUM AND MAXIMUM FROM USER INPUT. 101 | C 102 | INTEGER, intent(in) :: MIN, MAX 103 | INTEGER :: N 104 | 10 CONTINUE 105 | read(stdin, '(I5)', IOSTAT=N) INPUT 106 | if(IS_IOSTAT_END(N)) stop "thanks for playing" 107 | IF (N /= 0) THEN 108 | PRINT *,'INVALID.' 109 | GOTO 10 110 | END IF 111 | IF (INPUT < MIN ) THEN 112 | PRINT *,'TOO LOW.' 113 | GOTO 10 114 | ELSE IF (INPUT > MAX) THEN 115 | PRINT *,'TOO HIGH.' 116 | GOTO 10 117 | END IF 118 | END 119 | C ****************************************************************** 120 | integer FUNCTION LEVEL() 121 | C 122 | C RETURNS THE MARKSMANSHIP LEVEL (1 TO 5). 123 | C 124 | CHARACTER*1 Q 125 | Q = CHAR(39) 126 | PRINT *,'HOW GOOD A SHOT ARE YOU WITH YOUR RIFLE?' 127 | PRINT *,' ' 128 | PRINT *,' (1) ACE MARKSMAN, (2) GOOD SHOT, (3) FAIR TO MIDDLIN',Q 129 | PRINT *,' (4) NEED MORE PRACTICE, (5) SHAKY KNEES' 130 | PRINT *,' ' 131 | PRINT *,'ENTER ONE OF THE ABOVE -- THE BETTER YOU CLAIM YOU ARE,' 132 | PRINT *,'THE FASTER YOU',Q,'LL HAVE TO BE WITH YOUR GUN TO BE' 133 | PRINT *,'SUCCESSFUL.' 134 | LEVEL = INPUT(1, 5) 135 | END 136 | C ****************************************************************** 137 | impure elemental real FUNCTION RAND() 138 | call random_number(rand) 139 | end function rand 140 | 141 | integer function time() 142 | real :: r 143 | call cpu_time(r) 144 | time = floor(r) 145 | end function time 146 | C ****************************************************************** 147 | integer FUNCTION SHOOT(ILEVL) 148 | C 149 | C SHOOT STUFF BY LETTING THE PLAYER ENTER INSTANCES OF ONOMATOPOEIA. 150 | C 151 | INTEGER, intent(in) :: ILEVL 152 | CHARACTER(4) :: A 153 | integer :: N 154 | character(4), parameter :: S(4) = [character(4) :: 155 | & 'BANG','BLAM','POW','WHAM'] 156 | INTEGER R, T1, T2 157 | 158 | R = INT(RAND() * 4 + 1) 159 | PRINT *,'TYPE: ',S(R) 160 | T1 = TIME() 161 | read(stdin, '(A4)', iostat=N) A 162 | !! bad input will get shoot=9 163 | T2 = TIME() 164 | SHOOT = (ABS(T2 - T1) * 2) - ILEVL - 1 165 | CALL UPPER(A) 166 | IF (A /= S(R)) SHOOT = 9 167 | ! print *, "Trace: SHOOT: ", shoot, s(r), a, t2, t1, ilevl 168 | END 169 | C ****************************************************************** 170 | SUBROUTINE ARRIVE(ITMIL, ILMIL, ICTRN, ICASH, IAMMU, ICLTH, IFOOD, 171 | & IMISC, IEATS) 172 | C 173 | C FINAL TURN. 174 | C 175 | INTEGER ITMIL, ILMIL, ICTRN, ICASH 176 | INTEGER IAMMU, ICLTH, IFOOD, IMISC, IEATS 177 | INTEGER IFINL 178 | REAL FFRAC 179 | 180 | FFRAC = (2040.0 - ILMIL) / (ITMIL - ILMIL) 181 | IFOOD = IFOOD + (1 - INT(FFRAC)) * (8 + 5 * IEATS) 182 | PRINT *,' ' 183 | PRINT *,'YOU FINALLY ARRIVED AT OREGON CITY' 184 | PRINT *,'AFTER 2040 LONG MILES -- HOORAY!!' 185 | PRINT *,'A REAL PIONEER!' 186 | PRINT *,' ' 187 | IFINL = INT(FFRAC * 14) 188 | ICTRN = ICTRN * 14 + IFINL 189 | IFINL = IFINL + 1 190 | IF (IFINL > 7) IFINL = IFINL - 7 191 | IF (ICTRN <= 124) THEN 192 | ICTRN = ICTRN - 93 193 | PRINT *,WKDSTR(IFINL),' JULY ',ICTRN,' 1847' 194 | ELSE IF (ICTRN <= 155) THEN 195 | ICTRN = ICTRN - 124 196 | PRINT *,WKDSTR(IFINL),' AUGUST ',ICTRN,' 1847' 197 | ELSE IF (ICTRN <= 185) THEN 198 | ICTRN = ICTRN - 155 199 | PRINT *,WKDSTR(IFINL),' SEPTEMBER ',ICTRN,' 1847' 200 | ELSE IF (ICTRN <= 216) THEN 201 | ICTRN = ICTRN - 185 202 | PRINT *,WKDSTR(IFINL),' OCTOBER ',ICTRN,' 1847' 203 | ELSE IF (ICTRN <= 246) THEN 204 | ICTRN = ICTRN - 216 205 | PRINT *,WKDSTR(IFINL),' NOVEMBER ',ICTRN,' 1847' 206 | ELSE 207 | ICTRN = ICTRN - 246 208 | PRINT *,WKDSTR(IFINL),' DECEMBER ',ICTRN,' 1847' 209 | END IF 210 | PRINT *,'--------------------------------------------------------' 211 | PRINT *,'FOOD BULLETS CLOTHING MISC. SUPP. CASH' 212 | PRINT 100, IFOOD, IAMMU, ICLTH, IMISC, ICASH 213 | 100 FORMAT (I5, ' ', I7, ' ', I8, ' ', I11, ' ', I4) 214 | PRINT *,' ' 215 | PRINT *,' PRESIDENT JAMES K. POLK SENDS YOU HIS' 216 | PRINT *,' HEARTIEST CONGRATULATIONS' 217 | PRINT *,' ' 218 | PRINT *,' AND WISHES YOU A PROSPEROUS LIFE AHEAD' 219 | PRINT *,' AT YOUR NEW HOME' 220 | PRINT *,' ' 221 | STOP 222 | END 223 | C ****************************************************************** 224 | SUBROUTINE BLIZZ(ITMIL, IAMMU, ICLTH, IFOOD, IMISC, IFILL, IFINJ, 225 | & IEATS) 226 | C 227 | C BLIZZARD IN MOUNTAIN PASS. 228 | C 229 | INTEGER, intent(inout) :: ITMIL, IAMMU, IFOOD, IMISC, IFILL 230 | integer, intent(in) :: ICLTH, IFINJ, IEATS 231 | PRINT *,'BLIZZARD IN MOUNTAIN PASS -- TIME AND SUPPLIES LOST.' 232 | IFOOD = IFOOD - 25 233 | IMISC = IMISC - 10 234 | IAMMU = IAMMU - 300 235 | ITMIL = ITMIL - 30 - INT(40 * RAND()) 236 | IF (ICLTH < 18 + INT(2 * RAND())) THEN 237 | CALL SICK(IEATS, ITMIL, IMISC, IFILL, IFINJ) 238 | END IF 239 | END 240 | C ****************************************************************** 241 | SUBROUTINE DIE() 242 | C 243 | C READS FINAL INFORMATION AND STOPS GAME. 244 | C 245 | CHARACTER*1 Q 246 | LOGICAL L 247 | Q = CHAR(39) 248 | PRINT *,' ' 249 | PRINT *,'DUE TO YOUR UNFORTUNATE SITUATION, THERE ARE A FEW' 250 | PRINT *,'FORMALITIES WE MUST GO THROUGH:' 251 | PRINT *,' ' 252 | PRINT *,'WOULD YOU LIKE A MINISTER? (Y/N)' 253 | L = ASK() 254 | PRINT *,'WOULD YOU LIKE A FANCY FUNERAL? (Y/N)' 255 | L = ASK() 256 | PRINT *,'WOULD YOU LIKE US TO INFORM YOUR NEXT OF KIN? (Y/N)' 257 | IF (ASK()) THEN 258 | PRINT *,'THAT WILL BE $4.50 FOR THE TELEGRAPH CHARGE.' 259 | ELSE 260 | PRINT *,'BUT YOUR AUNT SADIE IN ST. LOUIS IS REALLY WORRIED' 261 | PRINT *,'ABOUT YOU.' 262 | END IF 263 | PRINT *,' ' 264 | PRINT *,'WE THANK YOU FOR THIS INFORMATION AND WE ARE SORRY YOU' 265 | PRINT *,'DIDN',Q,'T MAKE IT TO THE GREAT TERRITORY OF OREGON.' 266 | PRINT *,'BETTER LUCK NEXT TIME.' 267 | PRINT *,' ' 268 | PRINT *,' SINCERLY,' 269 | PRINT *,' THE OREGON CITY CHAMBER OF COMMERCE' 270 | PRINT *,' ' 271 | STOP 272 | END 273 | C ****************************************************************** 274 | SUBROUTINE DOCTOR(ICASH, IFILL, IFINJ) 275 | C 276 | C VISIT OL' DOC BLANCHARD. 277 | C 278 | INTEGER, intent(inout) :: ICASH, IFILL, IFINJ 279 | 280 | ICASH = ICASH - 20 281 | IF (ICASH < 0) THEN 282 | PRINT *,'YOU CAN',CHAR(39),'T AFFORD A DOCTOR.' 283 | IF (IFINJ == 1) THEN 284 | PRINT *,'YOU DIED OF INJURIES.' 285 | ELSE 286 | PRINT *,'YOU DIED OF PNEUMONIA.' 287 | END IF 288 | CALL DIE() 289 | END IF 290 | PRINT *,'DOCTOR',CHAR(39),'S BILL IS $20.' 291 | IFILL = 0 292 | IFINJ = 0 293 | END 294 | C ****************************************************************** 295 | SUBROUTINE EAT(IFOOD, IEATS) 296 | C 297 | C LETS THE PLAYER DECIDE HOW TO EAT. 298 | C 299 | INTEGER, intent(inout) :: IFOOD, IEATS 300 | INTEGER :: IAMOU 301 | 302 | 10 CONTINUE 303 | PRINT *,'DO YOU WANT TO EAT' 304 | PRINT *,'(1) POORLY (2) MODERATELY (3) WELL' 305 | IEATS = INPUT(1, 3) 306 | IAMOU = 8 + 5 * IEATS 307 | IF (IFOOD - IAMOU < 0) THEN 308 | PRINT *,'YOU CAN',CHAR(39),'T EAT THAT WELL.' 309 | GOTO 10 310 | END IF 311 | IFOOD = IFOOD - IAMOU 312 | END 313 | C ****************************************************************** 314 | SUBROUTINE FORT(ICASH, IFOOD, IAMMU, ICLTH, IMISC) 315 | C 316 | C YE OLDE FORT SHOPPE. 317 | C 318 | INTEGER, intent(inout) :: ICASH, IFOOD, IAMMU, ICLTH, IMISC 319 | INTEGER ISPND 320 | 321 | IF (ICASH <= 0) THEN 322 | PRINT *,'YOU DON',CHAR(39),'T HAVE ANY MONEY TO SPEND.' 323 | RETURN 324 | END IF 325 | PRINT *,'ENTER WHAT YOU WISH TO SPEND ON THE FOLLOWING:' 326 | PRINT *,'FOOD' 327 | ISPND = INPUT(0, ICASH) 328 | ICASH = ICASH - ISPND 329 | IFOOD = IFOOD + INT(2. / 3. * ISPND) 330 | PRINT *,'AMMUNITION' 331 | ISPND = INPUT(0, ICASH) 332 | ICASH = ICASH - ISPND 333 | IAMMU = IAMMU + INT(2. / 3. * ISPND * 50) 334 | PRINT *,'CLOTHING' 335 | ISPND = INPUT(0, ICASH) 336 | ICASH = ICASH - ISPND 337 | ICLTH = ICLTH + INT(2. / 3. * ISPND) 338 | PRINT *,'MISCELLANEOUS SUPPLIES' 339 | ISPND = INPUT(0, ICASH) 340 | ICASH = ICASH - ISPND 341 | IMISC = IMISC + INT(2. / 3. * ISPND) 342 | END 343 | C ****************************************************************** 344 | SUBROUTINE HUNT(IAMMU, ILEVL, IFOOD) 345 | C 346 | C HUNTING POOR WILDLIFE. 347 | C 348 | INTEGER IAMMU, ILEVL, IFOOD 349 | INTEGER IBANGT 350 | 351 | IF (IAMMU < 39) THEN 352 | PRINT *,'TOUGH -- YOU NEED MORE BULLETS TO GO HUNTING.' 353 | RETURN 354 | END IF 355 | IBANGT = SHOOT(ILEVL) 356 | IF (IBANGT <= 1) THEN 357 | PRINT *,'RIGHT BETWEEN THE EYES -- YOU GOT A BIG ONE!!' 358 | PRINT *,'FULL BELLIES TONIGHT!' 359 | IFOOD = IFOOD + 52 + INT(RAND() * 6) 360 | IAMMU = IAMMU - 10 - INT(RAND() * 4) 361 | ELSE IF (100 * RAND() < 13 * IBANGT) THEN 362 | PRINT *,'YOU MISSED -- AND YOUR DINNER GOT AWAY ...' 363 | ELSE 364 | PRINT *,'NICE SHOT -- RIGHT ON TARGET -- GOOD EATIN', 365 | & CHAR(39), ' TONIGHT!!' 366 | IFOOD = IFOOD + 48 - 2 * IBANGT 367 | IAMMU = IAMMU - 10 - 3 * IBANGT 368 | END IF 369 | END 370 | C ****************************************************************** 371 | SUBROUTINE INSTRU() 372 | C 373 | C OUTPUTS THE GAME INSTRUCTIONS. 374 | C 375 | CHARACTER, parameter :: Q = CHAR(39) 376 | integer :: N 377 | 378 | PRINT *,'THIS PROGRAM SIMULATES A TRIP OVER THE OREGON TRAIL FROM' 379 | PRINT *,'INDEPENDENCE, MISSOURI TO OREGON CITY, OREGON IN 1847.' 380 | PRINT *,'YOUR FAMILY OF FIVE WILL COVER THE 2040 MILE OREGON' 381 | PRINT *,'TRAIL IN 5-6 MONTHS -- IF YOU MAKE IT ALIVE.' 382 | PRINT *,' ' 383 | PRINT *,'YOU HAD SAVED $900 TO SPEND FOR THE TRIP, AND YOU',Q, 384 | & 'VE JUST' 385 | PRINT *,'PAID $200 FOR A WAGON.' 386 | PRINT *,' ' 387 | PRINT *,'YOU WILL NEED TO SPEND THE REST OF YOUR MONEY ON THE' 388 | PRINT *,'FOLLOWING ITEMS:' 389 | PRINT *,' ' 390 | PRINT *,'PRESS [RETURN] KEY.' 391 | read(stdin, '(1X)', iostat=N) 392 | PRINT *,' OXEN - YOU CAN SPEND $200-$300 ON YOUR TEAM. THE MORE' 393 | PRINT *,' YOU SPEND, THE FASTER YOU',Q,'LL GO BECAUSE' 394 | PRINT *,' YOU',Q,'LL HAVE BETTER ANIMALS.' 395 | PRINT *,' ' 396 | PRINT *,' FOOD - THE MORE YOU HAVE, THE LESS CHANCE THERE IS OF' 397 | PRINT *,' GETTING SICK.' 398 | PRINT *,' ' 399 | PRINT *,' AMMUNITION - $1 BUYS A BELT OF 50 BULLETS. YOU WILL' 400 | PRINT *,' NEED BULLETS FOR ATTACKS BY ANIMALS AND' 401 | PRINT *,' BANDITS, AND FOR HUNTING FOOD.' 402 | PRINT *,' ' 403 | PRINT *,' CLOTHING - THIS IS ESPECIALLY IMPORTANT FOR THE COLD' 404 | PRINT *,' WEATHER YOU WILL ENCOUNTER WHEN CROSSING THE' 405 | PRINT *,' MOUNTAINS.' 406 | PRINT *,' ' 407 | PRINT *,' MISCELLANEOUS SUPPLIES - THIS INCLUDES MEDICINE AND' 408 | PRINT *,' OTHER THINGS YOU WILL NEED FOR SICKNESS AND' 409 | PRINT *,' EMERGENCY REPAIRS.' 410 | PRINT *,' ' 411 | PRINT *,'PRESS [RETURN] KEY.' 412 | read(stdin, '(1X)', iostat=N) 413 | PRINT *,'YOU CAN SPEND ALL YOUR MONEY BEFORE YOU START YOUR' 414 | PRINT *,'TRIP -- OR YOU CAN SAVE SOME OF YOUR CASH TO SPEND AT' 415 | PRINT *,'FORTS ALONG THE WAY WHEN YOU RUN LOW. HOWEVER, ITEMS' 416 | PRINT *,'COST MORE AT THE FORTS. YOU CAN ALSO GO HUNTING ALONG' 417 | PRINT *,'THE WAY TO GET MORE FOOD.' 418 | PRINT *,' ' 419 | PRINT *,'WHENEVER YOU HAVE TO USE YOUR TRUSTY RIFLE ALONG THE ' 420 | PRINT *,'WAY, YOU WILL BE TOLD TO TYPE IN A WORD (ONE THAT SOUNDS' 421 | PRINT *,'LIKE A GUN SHOT). THE FASTER YOU TYPE IN THAT WORD AND' 422 | PRINT *,'THE [RETURN] KEY, THE BETTER LUCK YOU',Q,'LL HAVE WITH' 423 | PRINT *,'YOUR GUN.' 424 | PRINT *,' ' 425 | PRINT *,'AT EACH TURN, ALL ITEMS ARE SHOWN IN DOLLAR AMOUNTS' 426 | PRINT *,'EXCEPT BULLETS.' 427 | PRINT *,' ' 428 | PRINT *,'WHEN ASKED TO ENTER MONEY AMOUNTS, DON',Q,'T USE A $.' 429 | PRINT *,' ' 430 | PRINT *,'GOOD LUCK!!' 431 | PRINT *,' ' 432 | PRINT *,'PRESS [RETURN] KEY.' 433 | read(stdin, '(1X)', iostat=N) 434 | END 435 | C ****************************************************************** 436 | SUBROUTINE PLAY() 437 | C 438 | C INITIAL ROUTINE. GAME STARTS HERE. 439 | C 440 | INTEGER I, IBANGT, ISELEC 441 | REAL R 442 | CHARACTER, parameter :: Q = CHAR(39) 443 | 444 | ILEVL = LEVEL() 445 | CALL SHOP(ICASH, IANIM, IFOOD, IAMMU, ICLTH, IMISC) 446 | DO 10 I = 1, 20 447 | ICASH = MAX(0, ICASH) 448 | IAMMU = MAX(0, IAMMU) 449 | IANIM = MAX(0, IANIM) 450 | ICLTH = MAX(0, ICLTH) 451 | IFOOD = MAX(0, IFOOD) 452 | IMISC = MAX(0, IMISC) 453 | IF (ITMIL >= 2040) THEN 454 | CALL ARRIVE(ITMIL, ILMIL, ICTRN, ICASH, IAMMU, ICLTH, IFOOD, 455 | & IMISC,IEATS) 456 | END IF 457 | ICTRN = ICTRN + 1 458 | PRINT *,' ' 459 | PRINT *,'MONDAY, ',DATSTR(I) 460 | PRINT *,'--------------------------------------------------------' 461 | ILMIL = ITMIL 462 | IF (IFILL == 1 .OR. IFINJ == 1) THEN 463 | CALL DOCTOR(ICASH, IFILL, IFINJ) 464 | END IF 465 | IF (IF950 == 1) THEN 466 | IF950 = 0 467 | PRINT *,'TOTAL MILEAGE IS ',950 468 | ELSE 469 | PRINT *,'TOTAL MILEAGE IS',ITMIL 470 | END IF 471 | IF (IFOOD <= 13) THEN 472 | PRINT *,'YOU',Q,'D BETTER DO SOME HUNTING OR BUY FOOD AND ', 473 | & 'SOON!!' 474 | END IF 475 | PRINT *,' ' 476 | PRINT *,'FOOD BULLETS CLOTHING MISC. SUPP. CASH' 477 | PRINT 100, IFOOD, IAMMU, ICLTH, IMISC, ICASH 478 | 100 FORMAT (I5, ' ', I7, ' ', I8, ' ', I11, ' ', I4) 479 | PRINT *,' ' 480 | IF (IFFRT == -1) THEN 481 | PRINT *,'DO YOU WANT TO' 482 | PRINT *,'(1) STOP AT THE NEXT FORT (2) HUNT (3) CONTINUE' 483 | ISELEC = INPUT(1, 3) 484 | IF (ISELEC == 1) THEN 485 | CALL FORT(ICASH, IFOOD, IAMMU, ICLTH, IMISC) 486 | ITMIL = ITMIL - 45 487 | ELSE IF (ISELEC == 2) THEN 488 | CALL HUNT(IAMMU, ILEVL, IFOOD) 489 | ITMIL = ITMIL - 45 490 | END IF 491 | ELSE 492 | PRINT *,'DO YOU WANT TO' 493 | PRINT *,'(1) HUNT (2) CONTINUE' 494 | ISELEC = INPUT(1, 2) 495 | IF (ISELEC == 1) THEN 496 | CALL HUNT(IAMMU, ILEVL, IFOOD) 497 | ITMIL = ITMIL - 45 498 | END IF 499 | END IF 500 | IF (IFOOD >= 13) THEN 501 | CALL EAT(IFOOD, IEATS) 502 | ELSE 503 | PRINT *,'YOU RAN OUT OF FOOD AND STARVED TO DEATH.' 504 | CALL DIE() 505 | END IF 506 | ITMIL = ITMIL + 200 + INT((IANIM - 220) / 5 + 10 * RAND()) 507 | R = ((ITMIL/100 - 4)**2 + 72) / ((ITMIL/100 - 4)**2 + 12) - 1 508 | IF (RAND() * 10 <= R) THEN 509 | CALL RIDERS(ILEVL, ITMIL, IANIM, IAMMU, IMISC, IFINJ) 510 | END IF 511 | IEVTC = 0 512 | R = 100 * RAND() 513 | 20 IEVTC = IEVTC + 1 514 | IF (IEVTC < 16 .AND. R > IEVENT(IEVTC)) GOTO 20 515 | 516 | select case(IEVTC) 517 | case (1) 518 | PRINT *,'WAGON BREAKS DOWN -- LOSE TIME AND SUPPLIES FIXING IT.' 519 | ITMIL = ITMIL - 15 - INT(5 * RAND()) 520 | IMISC = IMISC - 8 521 | case (2) 522 | PRINT *,'OX INJURES LEG -- SLOWS YOU DOWN REST OF TRIP.' 523 | ITMIL = ITMIL - 25 524 | IANIM = IANIM - 20 525 | case (3) 526 | PRINT *,'BAD LUCK -- YOUR DAUGHTER BROKE HER ARM.' 527 | PRINT *,'YOU HAD TO STOP AND USE SUPPLIES TO MAKE A SLING.' 528 | ITMIL = ITMIL - 5 - INT(4 * RAND()) 529 | IMISC = IMISC - 2 - INT(3 * RAND()) 530 | case (4) 531 | PRINT *,'OX WANDERS OFF -- SPEND TIME LOOKING FOR IT.' 532 | ITMIL = ITMIL - 17 533 | case (5) 534 | PRINT *,'YOUR SON GETS LOST -- SPEND HALF THE DAY LOOKING FOR ', 535 | & 'HIM.' 536 | ITMIL = ITMIL - 10 537 | case (6) 538 | PRINT *,'UNSAFE WATER -- LOSE TIME LOOKING FOR CLEAN SPRING.' 539 | ITMIL = ITMIL - INT(10 * RAND()) - 2 540 | case (7) 541 | IF (ITMIL > 950) THEN 542 | PRINT *,'COLD WEATHER -- BRRRRRRR!' 543 | IF (ICLTH > 22 + 4 * RAND()) THEN 544 | PRINT *,'YOU HAVE ENOUGH CLOTHING TO KEEP YOU WARM.' 545 | ELSE 546 | PRINT *,'YOU DON',Q,'T HAVE ENOUGH CLOTHING TO KEEP YOU ', 547 | & 'WARM.' 548 | CALL SICK(IEATS, ITMIL, IMISC, IFILL, IFINJ) 549 | END IF 550 | ELSE 551 | PRINT *,'HEAVY RAINS -- TIME AND SUPPLIES LOST.' 552 | IFOOD = IFOOD - 10 553 | IAMMU = IAMMU - 500 554 | IMISC = IMISC - 15 555 | ITMIL = ITMIL - INT(10 * RAND()) - 5 556 | END IF 557 | case (8) 558 | PRINT *,'BANDITS ATTACK.' 559 | IBANGT = SHOOT(ILEVL) 560 | IAMMU = IAMMU - 20 * IBANGT 561 | IF (IAMMU < 0) THEN 562 | PRINT *,'YOU RAN OUT OF BULLETS -- THEY GET LOTS OF CASH.' 563 | ICASH = ICASH / 3 564 | END IF 565 | IF (IAMMU < 0 .OR. IBANGT > 1) THEN 566 | PRINT *,'YOU GOT SHOT IN THE LEG AND THEY TOOK ONE OF YOUR ', 567 | & 'OXEN.' 568 | IFINJ = 1 569 | PRINT *,'BETTER HAVE A DOC LOOK AT YOUR WOUND.' 570 | IMISC = IMISC - 5 571 | IANIM = IANIM - 20 572 | ELSE IF (IBANGT <= 1) THEN 573 | PRINT *,'QUICKEST DRAW OUTSIDE OF DODGE CITY!!' 574 | PRINT *,'YOU GOT ',Q,'EM!' 575 | END IF 576 | case (9) 577 | PRINT *,'THERE WAS A FIRE IN YOUR WAGON -- FOOD AND SUPPLIES ', 578 | & 'DAMAGE!' 579 | IFOOD = IFOOD - 40 580 | IAMMU = IAMMU - 400 581 | IMISC = IMISC - INT(RAND() * 8) - 3 582 | ITMIL = ITMIL - 15 583 | case (10) 584 | PRINT *,'LOSE YOUR WAY IN HEAVY FOG -- TIME IS LOST.' 585 | ITMIL = ITMIL - 10 - INT(5 * RAND()) 586 | case (11) 587 | PRINT *,'YOU KILLED A POISONOUS SNAKE AFTER IT BIT YOU.' 588 | IAMMU = IAMMU - 10 589 | IMISC = IMISC - 5 590 | IF (IMISC < 0) THEN 591 | PRINT *,'YOU DIE OF SNAKEBITE SINCE YOU HAVE NO MEDICINE.' 592 | CALL DIE() 593 | END IF 594 | case (12) 595 | PRINT *,'WAGON GETS SWAMPED FORDING RIVER -- LOSE FOOD AND ', 596 | & 'CLOTHES.' 597 | IFOOD = IFOOD - 30 598 | ICLTH = ICLTH - 20 599 | ITMIL = ITMIL - 20 - INT(20 * RAND()) 600 | case (13) 601 | PRINT *,'WILD ANIMALS ATTACK!!' 602 | IF (IAMMU <= 39) THEN 603 | PRINT *,'YOU WERE TOO LOW ON BULLETS -- THE WOLVES ', 604 | & 'OVERPOWERED YOU.' 605 | PRINT *,'YOU DIED OF INJURIES.' 606 | CALL DIE() 607 | END IF 608 | IBANGT = SHOOT(ILEVL) 609 | IF (IBANGT > 2) THEN 610 | PRINT *,'SLOW ON THE DRAW -- THEY GOT AT YOUR FOOD AND ', 611 | & 'CLOTHES.' 612 | ELSE 613 | PRINT *,'NICE SHOOTIN',Q,' PARDNER -- THEY DIDN',Q,'T ', 614 | & 'GET MUCH.' 615 | END IF 616 | IAMMU = IAMMU - 20 * IBANGT 617 | ICLTH = ICLTH - IBANGT * 4 618 | IFOOD = IFOOD - IBANGT * 8 619 | case (14) 620 | PRINT *,'HAIL STORM -- SUPPLIES DAMAGED.' 621 | ITMIL = ITMIL - 5 - INT(RAND() * 3) 622 | IAMMU = IAMMU - 200 623 | IMISC = IMISC - 4 - INT(RAND() * 3) 624 | case (15) 625 | IF ((IEATS == 1) .OR. 626 | & (IEATS == 2 .AND. RAND() > 0.25) .OR. 627 | & (IEATS == 3 .AND. RAND() < 0.5)) THEN 628 | CALL SICK(IEATS, ITMIL, IMISC, IFILL, IFINJ) 629 | END IF 630 | case (16) 631 | PRINT *,'HELPFUL INDIANS SHOW YOU WERE TO FIND MORE FOOD.' 632 | IFOOD = IFOOD + 14 633 | END select 634 | 635 | IF (ITMIL > 950) THEN 636 | R = 9 - ((ITMIL /100 - 15)**2 / ((ITMIL/100 - 15)**2 + 12)) 637 | IF (RAND() * 10 <= R) THEN 638 | PRINT *,'RUGGED MOUNTAINS.' 639 | IF (RAND() <= 0.1) THEN 640 | PRINT *,'YOU GOT LOST -- LOSE VALUABLE TIME TRYING TO ', 641 | & 'FIND TRAIL!' 642 | ITMIL = ITMIL - 60 643 | ELSE IF (RAND() <= 0.11) THEN 644 | PRINT *,'WAGON DAMAGED -- LOSE TIME AND SUPPLIES.' 645 | IMISC = IMISC - 5 646 | IAMMU = IAMMU - 200 647 | ITMIL = ITMIL - 20 - INT(30 * RAND()) 648 | ELSE 649 | PRINT *,'THE GOING GETS SLOW.' 650 | ITMIL = ITMIL - 45 - INT(RAND() / 0.02) 651 | END IF 652 | END IF 653 | IF (IFPAS /= 1) THEN 654 | IFPAS = 1 655 | IF950 = 1 656 | IF (RAND() >= 0.8) THEN 657 | PRINT *,'YOU MADE IT SAFELY THROUGH SOUTH PASS -- NO SNOW.' 658 | ELSE 659 | CALL BLIZZ(ITMIL, IAMMU, ICLTH, IFOOD, IMISC, IFILL, IFINJ, 660 | & IEATS) 661 | END IF 662 | END IF 663 | END IF 664 | IF (ITMIL >= 1700 .AND. IFMOU /= 1) THEN 665 | IFMOU = 1 666 | IF (RAND() >= 0.7) THEN 667 | CALL BLIZZ(ITMIL, IAMMU, ICLTH, IFOOD, IMISC, IFILL, IFINJ, 668 | & IEATS) 669 | END IF 670 | END IF 671 | IFFRT = -1 * IFFRT 672 | 10 CONTINUE 673 | PRINT *,'YOU HAVE BEEN ON THE TRAIL TOO LONG ...' 674 | PRINT *,'YOUR FAMILY DIES IN THE FIRST BLIZZARD OF WINTER.' 675 | CALL DIE() 676 | END 677 | C ****************************************************************** 678 | SUBROUTINE RIDERS(ILEVL, ITMIL, IANIM, IAMMU, IMISC, IFINJ) 679 | C 680 | C RIDERS ATTACK (OR NOT). 681 | C 682 | INTEGER ILEVL, ITMIL, IANIM, IAMMU, IMISC, IFINJ 683 | CHARACTER*1 Q 684 | INTEGER IBANGT, IHORF, ISELEC 685 | Q = CHAR(39) 686 | IHORF = 0 687 | IF (RAND() < .8) THEN 688 | PRINT *,'RIDERS AHEAD. THEY LOOK HOSTILE.' 689 | ELSE 690 | PRINT *,'RIDERS AHEAD. THEY DON',Q,'T LOOK HOSTILE.' 691 | IHORF = 1 692 | END IF 693 | PRINT *,'TACTICS' 694 | PRINT *,'(1) RUN (2) ATTACK (3) CONTINUE (4) CIRCLE WAGONS' 695 | IF (RAND() <= .2) IHORF = 1 - IHORF 696 | ISELEC = INPUT(1, 4) 697 | 698 | select case (iselec) 699 | case (1) 700 | IF (IHORF == 1) THEN 701 | ITMIL = ITMIL + 15 702 | IANIM = IANIM - 10 703 | ELSE 704 | ITMIL = ITMIL + 20 705 | IMISC = IMISC - 15 706 | IAMMU = IAMMU - 150 707 | IANIM = IANIM - 40 708 | END IF 709 | case (2,4) 710 | IBANGT = SHOOT(ILEVL) 711 | IF (ISELEC == 2) THEN 712 | IAMMU = IAMMU - IBANGT * 40 - 80 713 | ELSE 714 | IAMMU = IAMMU - IBANGT * 30 - 80 715 | ITMIL = ITMIL - 25 716 | END IF 717 | IF (IBANGT <= 1) THEN 718 | PRINT *,'NICE SHOOTING -- YOU DROVE THEM OFF.' 719 | ELSE IF (IBANGT > 1 .AND. IBANGT <= 4) THEN 720 | PRINT *,'KINDA SLOW WITH YOUR COLT .45.' 721 | ELSE IF (IBANGT > 5) THEN 722 | PRINT *,'LOUSY SHOT -- YOU GOT KNIFED.' 723 | PRINT *,'YOU HAVE TO SEE OL',Q,' DOC BLANCHARD.' 724 | IFINJ = 1 725 | END IF 726 | case (3) 727 | IF (RAND() > .8) THEN 728 | PRINT *,'THEY DID NOT ATTACK.' 729 | RETURN 730 | END IF 731 | IAMMU = IAMMU - 150 732 | IMISC = IMISC - 15 733 | END select 734 | 735 | IF (IHORF == 0) THEN 736 | PRINT *,'RIDERS WERE HOSTILE -- CHECK FOR LOSSES.' 737 | IF (IAMMU < 0) THEN 738 | PRINT *,'YOU RAN OUT OF BULLETS AND GOT MASSACRED BY ', 739 | & 'THE RIDERS.' 740 | CALL DIE() 741 | END IF 742 | ELSE 743 | PRINT *,'RIDERS WERE FRIENDLY, BUT CHECK FOR POSSIBLE LOSSES.' 744 | END IF 745 | END 746 | C ****************************************************************** 747 | SUBROUTINE SHOP(ICASH, IANIM, IFOOD, IAMMU, ICLTH, IMISC) 748 | C 749 | C SHOP VISIT IN MISSOURI. THE PLAYER HAS TO BUY AT LEAST OXEN FOR 750 | C $200 TO $300. 751 | C 752 | INTEGER, intent(inout) :: ICASH 753 | integer, intent(out) :: IANIM, IFOOD, IAMMU, ICLTH, IMISC 754 | PRINT *,'YOU HAVE ',ICASH,' DOLLARS LEFT.' 755 | PRINT *,'HOW MUCH DO YOU WANT TO SPEND ON YOUR OXEN TEAM?' 756 | IANIM = INPUT(200, 300) 757 | ICASH = ICASH - IANIM 758 | PRINT *,'YOU NOW HAVE ',ICASH,' DOLLARS LEFT.' 759 | PRINT *,'HOW MUCH DO YOU WANT TO SPEND ON FOOD?' 760 | IFOOD = INPUT(0, ICASH) 761 | ICASH = ICASH - IFOOD 762 | PRINT *,'YOU NOW HAVE ',ICASH,' DOLLARS LEFT.' 763 | PRINT *,'HOW MUCH DO YOU WANT TO SPEND ON AMMUNITION?' 764 | IAMMU = INPUT(0, ICASH) 765 | ICASH = ICASH - IAMMU 766 | IAMMU = IAMMU * 50 767 | PRINT *,'YOU NOW HAVE ',ICASH,' DOLLARS LEFT.' 768 | PRINT *,'HOW MUCH DO YOU WANT TO SPEND ON CLOTHING?' 769 | ICLTH = INPUT(0, ICASH) 770 | ICASH = ICASH - ICLTH 771 | PRINT *,'YOU NOW HAVE ',ICASH,' DOLLARS LEFT.' 772 | PRINT *,'HOW MUCH DO YOU WANT TO SPEND ON MISCELLANEOUS' 773 | PRINT *,'SUPPLIES?' 774 | IMISC = INPUT(0, ICASH) 775 | ICASH = ICASH - IMISC 776 | PRINT *,'AFTER ALL YOUR PURCHASES, YOU NOW HAVE ',ICASH, 777 | & ' DOLLARS LEFT.' 778 | END 779 | C ****************************************************************** 780 | SUBROUTINE SICK(IEATS, ITMIL, IMISC, IFILL, IFINJ) 781 | C 782 | C ILLNESS EVENTS. 783 | C 784 | integer, intent(inout) :: ITMIL, IMISC, IFILL 785 | INTEGER, intent(in) :: IEATS, IFINJ 786 | IF (100 * RAND() < 10 + 35 * (IEATS - 1)) THEN 787 | PRINT *,'MILD ILLNESS -- MEDICINE USED.' 788 | ITMIL = ITMIL - 5 789 | IMISC = IMISC - 2 790 | ELSE IF (100 * RAND() < 100 - (40 / 4**(IEATS - 1))) THEN 791 | PRINT *,'BAD ILLNESS -- MEDICINE USED.' 792 | ITMIL = ITMIL - 5 793 | IMISC = IMISC - 5 794 | ELSE 795 | PRINT *,'SERIOUS ILLNESS -- YOU MUST STOP FOR MEDICAL ', 796 | & 'ATTENTION.' 797 | ITMIL = ITMIL - 10 798 | IFILL = 1 799 | END IF 800 | IF (IMISC < 0) THEN 801 | PRINT *,'YOU RAN OUT OF MEDICAL SUPPLIES.' 802 | IF (IFINJ == 1) THEN 803 | PRINT *,'YOU DIED OF INJURIES.' 804 | ELSE 805 | PRINT *,'YOU DIED OF PNEUMONIA.' 806 | END IF 807 | CALL DIE() 808 | END IF 809 | END 810 | 811 | C ****************************************************************** 812 | pure SUBROUTINE UPPER(STR) 813 | !! CONVERTS A STRING TO UPPER CASE. 814 | CHARACTER(*), intent(inout) :: STR 815 | INTEGER :: I 816 | character :: c 817 | 818 | 819 | DO I = 1, LEN(STR) 820 | c = str(i:i) 821 | IF (c >= "a" .AND. c <= "z") then 822 | STR(I:I) = CHAR(ICHAR(c) - 32) 823 | endif 824 | end do 825 | 826 | END subroutine upper 827 | 828 | end module game75 829 | 830 | 831 | PROGRAM OREGON 832 | 833 | use game75, only : instru, ask, play 834 | implicit none 835 | 836 | CALL random_init(.false., .false.) 837 | PRINT *,'DO YOU NEED INSTRUCTIONS? (Y/N)' 838 | IF (ASK()) CALL INSTRU() 839 | CALL PLAY() 840 | 841 | END program 842 | --------------------------------------------------------------------------------