├── NAMESPACE ├── LICENSE ├── DESCRIPTION ├── README.md ├── man └── play.Rd ├── R └── otrail.R └── inst └── oregon-trail-1978.bas.txt /NAMESPACE: -------------------------------------------------------------------------------- 1 | export(play) 2 | 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | YEAR: 2020 2 | COPYRIGHT HOLDER: Thomas Lumley 3 | 4 | -------------------------------------------------------------------------------- /DESCRIPTION: -------------------------------------------------------------------------------- 1 | Package: OregonTrail 2 | Title: The Oregon Trail Game 3 | Version: 0.1 4 | Author: Thomas Lumley 5 | Description: A port of the famous 'Oregon Trail' game to R, by writing a very limited BASIC interpreter 6 | Encoding: UTF-8 7 | License: MIT + file LICENSEE 8 | Maintainer: Thomas Lumley 9 | 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OregonTrail 2 | Port of the 1978 'Oregon Trail' history game 3 | 4 | BASIC source code from 5 | https://github.com/fortran-gaming/oregon-trail-1975 6 | plus a very limited interpreter in R 7 | 8 | ``` 9 | REM The program that follows is a reconstruction 10 | REM of the Oregon Trail game written for HP time-shared 11 | REM BASIC by Don Rawitsch and Bill Heinemann and Paul Dillenberger 12 | REM in 1971. Its source is an updated version published in the 13 | REM July-August 1978 issue of Creative Computing. 14 | 15 | 10 REM PROGRAM NAME - 0REGON VERSION:01/01/78 16 | 20 REM ORIGINAL PROGRAMMING BY BILL HEINEMANN - 1971 17 | 30 REM SUPPORT RESEARCH AND MATERIALS BY DON RAVITSCH 18 | 40 REM MINNESOTA EDUCATIONAL COMPUTING CONSORTIUM STAFF 19 | 50 REM CDC CYBER 70/73-26 BASIC 3-1 20 | ``` 21 | 22 | **You are unlikely to be eaten by a grue.** 23 | -------------------------------------------------------------------------------- /man/play.Rd: -------------------------------------------------------------------------------- 1 | \name{play} 2 | \alias{play} 3 | %- Also NEED an '\alias' for EACH other topic documented here. 4 | \title{ 5 | The Oregon Trail game 6 | } 7 | \description{ 8 | Runs the 1978 BASIC Oregon Trail game using a very limited interpreter written in R 9 | } 10 | \usage{ 11 | play(debug = FALSE) 12 | } 13 | %- maybe also 'usage' for other objects documented here. 14 | \arguments{ 15 | \item{debug}{ 16 | If \code{TRUE}, gratuitous levels of debugging information are printed. 17 | } 18 | } 19 | \details{ 20 | THIS PROGRAM SIMULATES A TRIP OVER THE OREGON TRAIL FROM 21 | INDEPENDENCE, MISSOURI TO OREGON CITY, OREGON IN 1847. 22 | YOUR FAMILY OF FIVE WILL COVER THE 2040 MILE OREGON TRAIL 23 | IN 5-6 MONTHS --- IF YOU MAKE IT ALIVE. 24 | 25 | YOU HAD SAVED $900 TO SPEND FOR THE TRIP, AND YOU'VE JUST 26 | PAID $200 FOR A WAGON. 27 | YOU WILL NEED TO SPEND THE REST OF YOUR MONEY ON THE 28 | FOLLOWING ITEMS: 29 | 30 | OXEN - YOU CAN SPEND $200-$300 ON YOUR TEAM 31 | THE MORE YOU SPEND, THE FASTER YOU'LL GO 32 | BECAUSE YOU'LL HAVE BETTER ANIMALS 33 | 34 | FOOD - THE MORE YOU HAVE, THE LESS CHANCE THERE 35 | IS OF GETTING SICK 36 | 37 | AMMUNITION - 81 BUYS A BELT OF 50 BULLETS 38 | YOU WILL NEED BULLETS FOR ATTACKS BY ANIMALS 39 | AND BANDITS, AND FOR HUNTING FOOD 40 | 41 | CLOTHING - THIS IS ESPECIALLY IMPORTANT FOR THE COLD 42 | WEATHER YOU WILL ENCOUNTER WHEN CROSSING 43 | THE MOUNTAINS 44 | 45 | MISCELLANEOUS SUPPLIES - THIS INCLUDES MEDICINE AND 46 | OTHER THINGS YOU WILL NEED FOR SICKNESS 47 | AND EMERGENCY REPAIRS 48 | 49 | 50 | YOU CAN SPEND ALL YOUR MONEY BEFORE YOU START YOUR TRIP - 51 | OR YOU CAN SAVE SOME OF YOUR CASH TO SPEND AT FORTS ALONG 52 | THE WAY WHEN YOU RUN LOW. HOWEVER, ITEMS COST MORE AT 53 | THE FORTS. YOU CAN ALSO GO HUNTING ALONG THE WAY TO GET 54 | MORE FOOD. 55 | WHENEVER YOU HAVE TO USE YOUR TRUSTY RIFLE ALONG THE WAY, 56 | YOU WILL BE TOLD TO TYPE IN A WORD (ONE THAT SOUNDS LIKE A 57 | GUN SHOT). THE FASTER YOU TYPE IN THAT WORD AND HIT THE 58 | 'RETURN' KEY, THE BETTER LUCK YOU'LL HAVE WITH YOUR GUN. 59 | 60 | AT EACH TURN, ALL ITEMS ARE SHOWN IN DOLLAR AMOUNTS 61 | EXCEPT BULLETS 62 | WHEN ASKED TO ENTER MONEY AMOUNTS, DON'T USE A '$'. 63 | 64 | GOOD LUCK!!! 65 | 66 | } 67 | \value{ 68 | None 69 | } 70 | \references{ 71 | \url{https://github.com/fortran-gaming/oregon-trail-1975} 72 | } 73 | \author{ 74 | Thomas Lumley 75 | } 76 | 77 | 78 | 79 | %% ~Make other sections like Warning with \section{Warning }{....} ~ 80 | 81 | \examples{ 82 | \dontrun{play()} 83 | } 84 | -------------------------------------------------------------------------------- /R/otrail.R: -------------------------------------------------------------------------------- 1 | basic<-readLines(system.file(package="OregonTrail","oregon-trail-1978.bas.txt")) 2 | lineno<-as.numeric(gsub("^([0-9]*).*","\\1",basic)) 3 | command<-gsub("^[0-9]*[[:blank:]]*([[:alpha:]]+).*","\\1",basic) 4 | 5 | advance<-function(state){ 6 | if(state$debug) cat(state$counter) 7 | state$counter<-state$counter+1 8 | if (state$counter>length(basic)) stop('overrun') 9 | thiscmd<-command[state$counter] 10 | while(thiscmd==""){ 11 | state<-advance(state) 12 | thiscmd<-command[state$counter] 13 | } 14 | state 15 | } 16 | 17 | step<-function(state){ 18 | thisline<-basic[state$counter] 19 | thiscmd<-command[state$counter] 20 | if (state$debug) {cat(thisline);cat("\n");cat(thiscmd);cat("\n")} 21 | state<-switch(thiscmd, 22 | GOTO=GOTO(thisline, state), 23 | GOSUB=GOSUB(thisline, state), 24 | RETURN=RETURN(thisline, state), 25 | READ=READ(thisline, state), 26 | DATA=basic_DATA(thisline, state), 27 | RESTORE=RESTORE(thisline, state), 28 | PRINT=basic_PRINT(thisline, state), 29 | INPUT=INPUT(thisline,state), 30 | LET=LET(thisline,state), 31 | IF =basic_IF(thisline, state), 32 | ON = ON(thisline,state), 33 | QUIT={state$finished<-TRUE; state}, 34 | END={state$finished<-TRUE; state}, 35 | REM = advance(state), 36 | DIM = basic_DIM(thisline,state), 37 | assignment(thisline,state) 38 | ) 39 | 40 | state 41 | } 42 | 43 | GOTO<-function(thisline, state){ 44 | tolineno<-as.numeric(gsub("^.*GOTO[[:blank:]]([0-9]+)","\\1",thisline)[1]) 45 | codeline<-which(lineno==tolineno) 46 | if(length(codeline)!=1) 47 | stop(paste("GOTO considered harmful:",thisline)) 48 | state$counter<-codeline 49 | state 50 | } 51 | 52 | GOSUB<-function(thisline, state){ 53 | state$stack<-c(state$counter, state$stack) 54 | tolineno<-as.numeric(gsub("^.*GOSUB[[:blank:]]([0-9]+)","\\1",thisline)[1]) 55 | codeline<-which(lineno==tolineno) 56 | if(length(codeline)!=1) 57 | stop(paste("GOSUB considered harmful:",thisline)) 58 | state$counter<-codeline 59 | state 60 | } 61 | 62 | RETURN<-function(thisline,state){ 63 | if (length(state$stack)==0) 64 | stop(paste("Nowhere to RETURN from:",thisline)) 65 | state$counter<-state$stack[1] 66 | state$stack<-state$stack[-1] 67 | advance(state) 68 | } 69 | 70 | INPUT<-function(thisline, state){ 71 | 72 | if(grepl("INPUT[[:blank:]](\".+\")",thisline)){ 73 | prompt<-trimws(gsub("^.*INPUT[[:blank:]](\".+\")?; ([$A-Z0-9]+)","\\1",thisline)[1]) 74 | cat(prompt) 75 | } 76 | input<-readline("? ") 77 | variable<-trimws(gsub("^.*INPUT[[:blank:]](\".+\")?;? ?([$A-Z0-9]+)","\\2",thisline)[1]) 78 | is_string<-grepl("\\$",variable) 79 | 80 | if(is_string){ 81 | variable<-sub("$","_",fixed=TRUE, variable) 82 | state$variables[[variable]]<-input 83 | state<-advance(state) 84 | } else { 85 | x<-as.numeric(input) 86 | if(is.na(x)) { 87 | cat("?Redo from start\n") 88 | state<-INPUT(thisline, state) 89 | } else { 90 | state$variables[[variable]]<-as.numeric(input) 91 | state<-advance(state) 92 | } 93 | } 94 | if(state$debug) print(state$variables) 95 | state 96 | } 97 | 98 | 99 | inc_PRINT<-function(msg,newline, state){ 100 | if (trimws(msg)=="") { 101 | if (newline) cat("\n") 102 | return() 103 | } 104 | 105 | if (substr(msg,1,1)=="\""){ 106 | quoted_text<-sub("\"([^\"]+)\".*","\\1",msg) 107 | msg<-sub("\"([^\"]+)\"","",msg) 108 | cat(quoted_text) 109 | inc_PRINT(trimws(msg), TRUE, state) 110 | } else if(substr(msg,1,1)==";"){ 111 | cat(" ") 112 | msg<-trimws(substring(msg,2)) 113 | inc_PRINT(msg, FALSE, state) 114 | } else if(substr(msg,1,1)==","){ 115 | msg<-trimws(substring(msg,2)) 116 | cat("\t") 117 | inc_PRINT(msg, FALSE, state) 118 | } else { 119 | expr<-sub("^([^,; ]+)([,; ]+|$).*$","\\1",msg) 120 | msg<-sub("^([^,; ]+)([,; ]+|$)","\\2",msg) 121 | expr<-gsub("$","_",expr,fixed=TRUE) 122 | val<-eval(rewrite(parse(text=expr)[[1]]),state$variables) 123 | cat(val) 124 | inc_PRINT(trimws(msg),TRUE, state) 125 | } 126 | } 127 | 128 | basic_PRINT<-function(thisline, state){ 129 | if (grepl("^.*PRINT[[:blank:]]*$",thisline)) { 130 | cat("\n") 131 | } else { 132 | msg<-gsub("^.*PRINT (.*)$","\\1",thisline) 133 | inc_PRINT(trimws(msg),TRUE,state) 134 | } 135 | 136 | advance(state) 137 | } 138 | 139 | 140 | 141 | 142 | 143 | basic_DATA<-function(thisline,state){ 144 | advance(state) 145 | } 146 | 147 | 148 | RESTORE<-function(thisline,state){ 149 | state$datapointer<-c(line=0,value=0) 150 | advance(state) 151 | } 152 | 153 | ON<-function(thisline, state){ 154 | expr<-trimws(gsub("^.*ON(.+)GOTO.+","\\1",thisline)[1]) 155 | targets<-as.numeric(strsplit(gsub("^.*GOTO(.+)","\\1",thisline)[1],",")[[1]]) 156 | exprvalue<-eval(rewrite(parse(text=expr)[[1]]),state$variables) 157 | if (exprvalue>length(targets)) 158 | advance(state) 159 | else { 160 | codeline<-which(lineno==targets[exprvalue]) 161 | if(length(codeline)!=1) 162 | stop(paste("ON..GOTO considered harmful:",thisline)) 163 | state$counter<-codeline 164 | state 165 | } 166 | } 167 | 168 | LET<-function(thisline, state){ 169 | unlet<-gsub("LET ","",thisline) 170 | assignment(unlet, state) 171 | } 172 | 173 | 174 | 175 | 176 | 177 | basic_DIM<-function(thisline, state){ 178 | expr<-gsub("^[0-9]* ?DIM ","",thisline) 179 | expr<-gsub("$","_",expr,fixed=TRUE) 180 | 181 | target<-trimws(gsub("([A-Z0-9]+_?).*","\\1",expr)) 182 | len<-as.numeric(gsub(".+\\(([0-9]+)\\)","\\1",expr)) 183 | 184 | is_string<-grepl("_",target,fixed=TRUE) 185 | if (is_string){ 186 | state$variables[[target]]<-character(len) 187 | } else { 188 | state$variables[[target]]<-numeric(len) 189 | } 190 | advance(state) 191 | } 192 | 193 | 194 | ## recursive rewrite from BASIC to R 195 | rewrite<-function(expr){ 196 | if (length(expr)==2){ 197 | if (expr[[1]] == as.name("TAB") || 198 | expr[[1]] == as.name("RND") || 199 | expr[[1]] == as.name("CLK")|| 200 | expr[[1]] == as.name("INT") || 201 | expr[[1]] == as.name("(") || 202 | expr[[1]] == as.name("-")) 203 | { 204 | expr[[2]]<-rewrite(expr[[2]]) 205 | return(expr) 206 | } else{ 207 | expr[[2]]<-rewrite(expr[[2]]) 208 | expr<-bquote(.(expr[[1]])[.(expr[[2]])]) 209 | ##bquote(as.name("[")(.(expr[[1]]),.(expr[[2]]))) 210 | return(expr) 211 | } 212 | } 213 | 214 | if (length(expr)==1){ 215 | if (expr==as.name("=")) expr<-as.name("==") 216 | return(expr) 217 | } 218 | 219 | ## length=3 220 | expr[[1]]<-rewrite(expr[[1]]) 221 | expr[[2]]<-rewrite(expr[[2]]) 222 | expr[[3]]<-rewrite(expr[[3]]) 223 | return(expr) 224 | } 225 | 226 | 227 | 228 | assignment<-function(thisline, state){ 229 | expr<-gsub("^[0-9]* ","",thisline) 230 | 231 | target<-trimws(gsub("(.+)=.+","\\1",expr)) 232 | target<-gsub("$","_",target,fixed=TRUE) 233 | 234 | value_expr<-trimws(gsub(".+=(.+)","\\1",expr)) 235 | value_expr<- gsub("$","_",value_expr,fixed=TRUE) 236 | 237 | value_expr<-rewrite(parse(text=value_expr)[[1]]) 238 | target_expr<-rewrite(parse(text=target)[[1]]) 239 | 240 | state$variables<-eval(bquote(within(state$variables, .(target_expr)<-.(value_expr)))) 241 | 242 | if(state$debug) print(state$variables) 243 | advance(state) 244 | } 245 | 246 | basic_IF<-function(thisline, state){ 247 | 248 | expr<-trimws(gsub("^.* IF (.*) THEN .*$","\\1",thisline)) 249 | tolineno<-as.numeric(trimws(gsub("^.* IF .* THEN (GOTO )?(.*)$","\\2",thisline))) 250 | 251 | expr<-gsub("([A-Z0-9])\\$","\\1_",expr) 252 | 253 | exprvalue<-eval(rewrite(parse(text=expr)[[1]]),state$variables) 254 | 255 | if (exprvalue){ 256 | codeline<-which(lineno==tolineno) 257 | if(length(codeline)!=1) 258 | stop(paste("Out of cucumber error:",thisline)) 259 | state$counter<-codeline 260 | state 261 | } else { 262 | advance(state) 263 | } 264 | } 265 | 266 | READ<-function(thisline, state){ 267 | data_lines<-which((command=="DATA")) 268 | data_lines<-data_lines[data_lines>state$datapointer["line"]] 269 | 270 | data_text<-gsub("^.* DATA ([0-9, ]+)","\\1",basic[min(data_lines)]) 271 | datas<-strsplit(data_text, ",")[[1]] 272 | 273 | has_arrays<-grepl("(",thisline,fixed=TRUE) 274 | if(has_arrays) stop("READ not supported for arrays") 275 | 276 | reads<-gsub("$","_",trimws(strsplit(gsub("^.* READ ([A-Z0-9$])","\\1",thisline),",")[[1]]),fixed=TRUE) 277 | while(length(reads)>0){ 278 | thisvar<-reads[1] 279 | reads<-reads[-1] 280 | is_string<-grepl("_",thisvar) 281 | state$datapointer["value"]<-state$datapointer["value"]+1 282 | 283 | if(length(datas)state$datapointer["line"]] 287 | data_text<-gsub("^.* DATA ([0-9, ]+)","\\1",basic[min(data_lines)]) 288 | datas<-strsplit(data_text, ",")[[1]] 289 | } 290 | if(is_string) 291 | state$variables[[thisvar]]<-datas[state$datapointer["value"]] 292 | else 293 | state$variables[[thisvar]]<-as.numeric(datas[state$datapointer["value"]]) 294 | } 295 | advance(state) 296 | } 297 | 298 | 299 | INT<-function(x) trunc(x) 300 | RND<-function(x) runif(1) 301 | CLK<-function(x) proc.time()[3]/3600 302 | TAB<-function(x) paste0(rep(" ",x),collapse="") 303 | 304 | 305 | play<-function(debug=FALSE){ 306 | state<-list(counter=1, 307 | stack=numeric(0), 308 | variables=list(), 309 | datapointer=c(line=0,value=0), 310 | finished=FALSE,debug=debug) 311 | 312 | 313 | thisline<-basic[state$counter] 314 | while(!state$finished){ 315 | state<-step(state) 316 | } 317 | 318 | } 319 | -------------------------------------------------------------------------------- /inst/oregon-trail-1978.bas.txt: -------------------------------------------------------------------------------- 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=0 90 | S4=0 91 | F1=0 92 | F2=0 93 | M=0 94 | M9=0 95 | D3=0 96 | 830 PRINT 97 | 840 PRINT 98 | 850 PRINT "HOW MUCH DO YOU WANT TO SPEND ON YOUR OXEN TEAM"; 99 | 860 INPUT A 100 | 870 IF A >= 200 THEN 900 101 | 880 PRINT "NOT ENOUGH" 102 | 890 GOTO 850 103 | 900 IF A <= 300 THEN 930 104 | 910 PRINT "TOO MUCH" 105 | 920 GOTO 850 106 | 930 PRINT "HOW MUCH DO YOU WANT TO SPEND ON FOOD"; 107 | 940 INPUT F 108 | 950 IF F >= 0 THEN 980 109 | 960 PRINT "IMPOSSIBLE" 110 | 970 GOTO 930 111 | 980 PRINT "HOW MUCH DO YOU WANT TO SPEND ON AMMUNITION"; 112 | 990 INPUT B 113 | 1000 IF B >= 0 THEN 1030 114 | 1010 PRINT "IMPOSSIBLE" 115 | 1020 GOTO 980 116 | 1030 PRINT "HOW MUCH DO YOU WANT TO SPEND ON CLOTHING"; 117 | 1040 INPUT C 118 | 1050 IF C >= 0 THEN 1080 119 | 1060 PRINT "IMPOSSIBLE" 120 | 1070 GOTO 1030 121 | 1080 PRINT "HOW MUCH DO YOU WANT TO SPEND ON MISCELLANEOUS SUPPLIES"; 122 | 1090 INPUT M1 123 | 1100 IF M1 >= 0 THEN 1130 124 | 1110 PRINT "IMPOSSIBLE" 125 | 1120 GOTO 1080 126 | 1130 T=700-A-F-B-C-M1 127 | 1140 IF T >= 0 THEN 1170 128 | 1150 PRINT "YOU OVERSPENT--YOU ONLY HAD $700 TO SPEND. BUY AGAIN" 129 | 1160 GOTO 830 130 | 1170 B=50*B 131 | 1180 PRINT "AFTER ALL YOUR PURCHASES, YOU NOW HAVE ";T;" DOLLARS LEFT" 132 | 1190 PRINT 133 | 1200 PRINT "MONDAY MARCH 29 1847" 134 | 1210 PRINT 135 | 1220 GOTO 1750 136 | 1230 IF M >= 2040 THEN 5430 137 | 138 | 1240 REM ***SETTING DATE*** 139 | 1250 D3=D3+1 140 | 1260 PRINT 141 | 1270 PRINT "MONDAY "; 142 | 1280 IF D3>10 THEN 1300 143 | 1290 ON D3 GOTO 1310, 1330, 1350, 1370, 1390, 1410, 1430, 1450, 1470, 1490 144 | 1300 ON D3-10 GOTO 1510, 1530, 1550, 1570, 1590, 1610, 1630, 1650, 1670, 1690 145 | 1310 PRINT "APRIL 12 "; 146 | 1320 GOTO 1720 147 | 1330 PRINT "APRIL 26 "; 148 | 1340 GOTO 1720 149 | 1350 PRINT "MAY 10 "; 150 | 1360 GOTO 1720 151 | 1370 PRINT "MAY 24 "; 152 | 1380 GOTO 1720 153 | 1390 PRINT "JUNE 7 "; 154 | 1400 GOTO 1720 155 | 1410 PRINT "JUNE 21 "; 156 | 1420 GOTO 1720 157 | 1430 PRINT "JULY 5 "; 158 | 1440 GOTO 1720 159 | 1450 PRINT "JULY 19 "; 160 | 1460 GOTO 1720 161 | 1470 PRINT "AUGUST 2 "; 162 | 1480 GOTO 1720 163 | 1490 PRINT "AUGUST 16 "; 164 | 1500 GOTO 1720 165 | 1510 PRINT "AUGUST 31 "; 166 | 1520 GOTO 1720 167 | 1530 PRINT "SEPTEMBER 13 "; 168 | 1540 GOTO 1720 169 | 1550 PRINT "SEPTEMBER 27 "; 170 | 1560 GOTO 1720 171 | 1570 PRINT "OCTOBER 11 "; 172 | 1580 GOTO 1720 173 | 1590 PRINT "OCTOBER 25 "; 174 | 1600 GOTO 1720 175 | 1610 PRINT "NOVEMBER 8 "; 176 | 1620 GOTO 1720 177 | 1630 PRINT "NOVEMBER 22 "; 178 | 1640 GOTO 1720 179 | 1650 PRINT "DECEMBER 6 "; 180 | 1660 GOTO 1720 181 | 1670 PRINT "DECEMBER 20 "; 182 | 1680 GOTO 1720 183 | 1690 PRINT "YOU HAVE BEEN ON THE TRAIL TOO LONG ------" 184 | 1700 PRINT "YOUR FAMILY DIES IN THE FIRST BLIZZARD OF WINTER" 185 | 1710 GOTO 5170 186 | 1720 PRINT "1847" 187 | 1730 PRINT 188 | 189 | 1740 REM ***BEGINNING EACH TURN*** 190 | 1750 IF F >= 0 THEN 1770 191 | 1760 F=0 192 | 1770 IF B >= 0 THEN 1790 193 | 1780 B=0 194 | 1790 IF C >= 0 THEN 1810 195 | 1800 C=0 196 | 1810 IF M1 >= 0 THEN 1830 197 | 1820 M1=0 198 | 1830 IF F >= 13 THEN 1850 199 | 1840 PRINT "YOU'D BETTER DO SOME HUNTING OR BUY FOOD AND SOON!!!!" 200 | 1850 F=INT(F) 201 | 1860 B=INT(B) 202 | 1870 C=INT(C) 203 | 1880 M1=INT(M1) 204 | 1890 T=INT(T) 205 | 1900 M=INT(M) 206 | 1910 M2=M 207 | 1920 IF S4=1 THEN 1950 208 | 1930 IF K8=1 THEN 1950 209 | 1940 GOTO 1990 210 | 1950 T=T-20 211 | 1960 IF T<0 THEN 5080 212 | 1970 PRINT "DOCTOR'S BILL IS $20" 213 | 1980 LET K8=0 214 | S4=0 215 | 1990 IF M9=1 THEN 2020 216 | 2000 PRINT "TOTAL MILEAGE IS";M 217 | 2010 GOTO 2040 218 | 2020 PRINT "TOTAL MILEAGE IS 950" 219 | 2030 M9=0 220 | 2040 PRINT "FOOD","BULLETS","CLOTHING","MISC. SUPP.","CASH" 221 | 2050 PRINT F, B, C, M1, T 222 | 2060 IF X1=-1 THEN 2170 223 | 2070 X1=X1*(-1) 224 | 225 | 2080 PRINT "DO YOU WANT TO (1) STOP AT THE NEXT FORT, (2) HUNT, "; 226 | 2090 PRINT "OR (3) CONTINUE" 227 | 2100 INPUT X 228 | 2110 IF X>2 THEN 2150 229 | 2120 IF X<1 THEN 2150 230 | 2130 LET X=INT(X) 231 | 2140 GOTO 2270 232 | 2150 LET X=3 233 | 2160 GOTO 2270 234 | 235 | 2170 PRINT "DO YOU WANT TO (1) HUNT, OR (2) CONTINUE" 236 | 2180 INPUT X 237 | 2190 IF X=1 THEN 2210 238 | 2200 LET X=2 239 | 2210 LET X=X+1 240 | 2220 IF X=3 THEN 2260 241 | 2230 IF B>39 THEN 2260 242 | 2240 PRINT "TOUGH---YOU NEED MORE BULLETS TO GO HUNTING" 243 | 2250 GOTO 2170 244 | 2260 X1=X1*(-1) 245 | 2270 ON X GOTO 2290,2540,2720 246 | 247 | REM ***STOPPING AT FORT*** 248 | 2290 PRINT "ENTER WHAT YOU WISH TO SPEND ON THE FOLLOWING" 249 | 2300 PRINT "FOOD"; 250 | 2310 GOSUB 2330 251 | 2320 GOTO 2410 252 | 2330 INPUT P 253 | 2340 IF P<0 THEN 2400 254 | 2350 T=T-P 255 | 2360 IF T >= 0 THEN 2400 256 | 2370 PRINT "YOU DON'T HAVE THAT MUCH--KEEP YOUR SPENDING DOWN" 257 | 2375 PRINT "YOU MISS YOUR CHANCE TO SPEND ON THAT ITEM" 258 | 2380 T=T+P 259 | 2390 P=0 260 | 2400 RETURN 261 | 2410 F=F+2/3*P 262 | 2420 PRINT "AMMUNITION"; 263 | 2430 GOSUB 2330 264 | 2440 LET B=INT(B+2/3*P*50) 265 | 2450 PRINT "CLOTHING"; 266 | 2460 GOSUB 2330 267 | 2470 C=C+2/3*P 268 | 2480 PRINT "MISCELLANEOUS SUPPLIES"; 269 | 2490 GOSUB 2330 270 | 2500 M1=M1+2/3*P 271 | 2510 M=M-45 272 | 2520 GOTO 2720 273 | 274 | REM ***HUNTING*** 275 | 2540 IF B>39 THEN 2570 276 | 2550 PRINT "TOUGH---YOU NEED MORE BULLETS TO GO HUNTING" 277 | 2560 GOTO 2080 278 | 2570 M=M-45 279 | 2580 GOSUB 6140 280 | 2590 IF B1 <= 1 THEN 2660 281 | 2600 IF 100*RND(-1)<13*B1 THEN 2710 282 | 2610 F=F+48-2*B1 283 | 2620 PRINT "NICE SHOT--RIGHT ON TARGET--GOOD EATIN' TONIGHT!!" 284 | 2630 B=B-10-3*B1 285 | 2640 GOTO 2720 286 | 287 | REM **BELLS IN LINE 2660** 288 | 2660 PRINT "RIGHT BETWEEN THE EYES---YOU GOT A BIG ONE!!!!" 289 | 2670 PRINT "FULL BELLIES TONIGHT!" 290 | 2680 F=F+52+RND(-1)*6 291 | 2690 B=B-10-RND(-1)*4 292 | 2700 GOTO 2720 293 | 2710 PRINT "YOU MISSED---AND YOUR DINNER GOT AWAY....." 294 | 2720 IF F >= 13 THEN 2750 295 | 2730 GOTO 5060 296 | 297 | REM ***EATING*** 298 | 2750 PRINT "DO YOU WANT TO EAT (1) POORLY (2) MODERATELY" 299 | 2760 PRINT "OR (3) WELL"; 300 | 2770 INPUT E 301 | 2780 IF E>3 THEN 2750 302 | 2790 IF E<1 THEN 2750 303 | 2800 LET E=INT(E) 304 | 2810 LET F=F-8-5*E 305 | 2820 IF F >= 0 THEN 2860 306 | 2830 F=F+8+5*E 307 | 2840 PRINT "YOU CAN'T EAT THAT WELL" 308 | 2850 GOTO 2750 309 | 2860 LET M=M+200+(A-220)/5+10*RND(-1) 310 | 2870 L1=0 311 | C1=0 312 | 313 | REM ***RIDERS ATTACK*** 314 | 2890 IF RND(-1)*10>((M/100-4)^2+72)/((M/100-4)^2+12)-1 THEN 3550 315 | 2900 PRINT "RIDERS AHEAD. THEY "; 316 | 2910 S5=0 317 | 2920 IF RND(-1)<.8 THEN 2950 318 | 2930 PRINT "DON'T "; 319 | 2940 S5=1 320 | 2950 PRINT "LOOK HOSTILE" 321 | 2960 PRINT "TACTICS" 322 | 2970 PRINT "(1) RUN (2) ATTACK (3) CONTINUE (4) CIRCLE WAGONS" 323 | 2980 IF RND(-1)>.2 THEN 3000 324 | 2990 S5=1-S5 325 | 3000 INPUT T1 326 | 3010 IF T1<1 THEN 2970 327 | 3020 IF T1>4 THEN 2970 328 | 3030 T1=INT(T1) 329 | 3040 IF S5=1 THEN 3330 330 | 3050 IF T1>1 THEN 3110 331 | 3060 M=M+20 332 | 3070 M1=M1-15 333 | 3080 B=B-150 334 | 3090 A=A-40 335 | 3100 GOTO 3470 336 | 3110 IF T1>2 THEN 3240 337 | 3120 GOSUB 6140 338 | 3130 B=B-B1*40-80 339 | 3140 IF B1>1 THEN 3170 340 | 3150 PRINT "NICE SHOOTING---YOU DROVE THEM OFF" 341 | 3160 GOTO 3470 342 | 3170 IF B1 <= 4 THEN 3220 343 | 3180 PRINT "LOUSY SHOT---YOU GOT KNIFED" 344 | 3190 K8=1 345 | 3200 PRINT "YOU HAVE TO SEE OL' DOC BLANCHARD" 346 | 3210 GOTO 3470 347 | 3220 PRINT "KINDA SLOW WITH YOUR COLT .45" 348 | 3230 GOTO 3470 349 | 3240 IF T1>3 THEN 3290 350 | 3250 IF RND(-1)>.8 THEN 3450 351 | 3260 LET B=B-150 352 | 3270 M1=M1-15 353 | 3280 GOTO 3470 354 | 3290 GOSUB 6140 355 | 3300 B=B-B1*30-80 356 | 3310 M=M-25 357 | 3320 GOTO 3140 358 | 3330 IF T1>1 THEN 3370 359 | 3340 M=M+15 360 | 3350 A=A-10 361 | 3360 GOTO 3470 362 | 3370 IF T1>2 THEN 3410 363 | 3380 M=M-5 364 | 3390 B=B-100 365 | 3400 GOTO 3470 366 | 3410 IF T1>3 THEN 3430 367 | 3420 GOTO 3470 368 | 3430 M=M-20 369 | 3440 GOTO 3470 370 | 3450 PRINT "THEY DID NOT ATTACK" 371 | 3460 GOTO 3550 372 | 3470 IF S5=0 THEN 3500 373 | 3480 PRINT "RIDERS WERE FRIENDLY, BUT CHECK FOR POSSIBLE LOSSES" 374 | 3490 GOTO 3550 375 | 3500 PRINT "RIDERS WERE HOSTILE--CHECK FOR LOSSES" 376 | 3510 IF B >= 0 THEN 3550 377 | 3520 PRINT "YOU RAN OUT OF BULLETS AND GOT MASSACRED BY THE RIDERS" 378 | 3530 GOTO 5170 379 | 380 | REM ***SELECTION OF EVENTS*** 381 | 3550 LET D1=0 382 | 3560 RESTORE 383 | 3570 R1=100*RND(-1) 384 | 3580 LET D1=D1+1 385 | 3590 IF D1=16 THEN 4670 386 | 3600 READ D 387 | 3610 IF R1>D THEN 3580 388 | 3620 DATA 6, 11, 13, 15, 17, 22, 32, 35, 37, 42, 44, 54, 64, 69, 95 389 | 3630 IF D1>10 THEN 3650 390 | 3640 ON D1 GOTO 3660, 3700, 3740, 3790, 3820, 3850, 3880, 3960, 4130, 4190 391 | 3650 ON D1-10 GOTO 4220, 4290, 4340, 4560, 4610, 4670 392 | 3660 PRINT "WAGON BREAKS DOWN--LOSE TIME AND SUPPLIES FIXING IT" 393 | 3670 LET M=M-15-5*RND(-1) 394 | 3680 LET M1=M1-8 395 | 3690 GOTO 4710 396 | 3700 PRINT "OX INJURES LEG---SLOWS YOU DOWN REST OF TRIP" 397 | 3710 LET M=M-25 398 | 3720 LET A=A-20 399 | 3730 GOTO 4710 400 | 3740 PRINT "BAD LUCK---YOUR DAUGHTER BROKE HER ARM" 401 | 3750 PRINT "YOU HAD TO STOP AND USE SUPPLIES TO MAKE A SLING" 402 | 3760 M=M-5-4*RND(-1) 403 | 3770 M1=M1-2-3*RND(-1) 404 | 3780 GOTO 4710 405 | 3790 PRINT "OX WANDERS OFF---SPEND TIME LOOKING FOR IT" 406 | 3800 M=M-17 407 | 3810 GOTO 4710 408 | 3820 PRINT "YOUR SON GETS LOST---SPEND HALF THE DAY LOOKING FOR HIM" 409 | 3830 M=M-10 410 | 3840 GOTO 4710 411 | 3850 PRINT "UNSAFE WATER--LOSE TIME LOOKING FOR CLEAN SPRING" 412 | 3860 LET M=M-10*RND(-1)-2 413 | 3870 GOTO 4710 414 | 3880 IF M>950 THEN 4490 415 | 3890 PRINT "HEAVY RAINS---TIME AND SUPPLIES LOST" 416 | 3910 F=F-10 417 | 3920 B=B-500 418 | 3930 M1=M1-15 419 | 3940 M=M-10*RND(-1)-5 420 | 3950 GOTO 4710 421 | 3960 PRINT "BANDITS ATTACK" 422 | 3970 GOSUB 6140 423 | 3980 B=B-20*B1 424 | 3990 IF B >= 0 THEN 4030 425 | 4000 PRINT "YOU RAN OUT OF BULLETS---THEY GET LOTS OF CASH" 426 | 4010 T=T/3 427 | 4020 GOTO 4040 428 | 4030 IF B1 <= 1 THEN 4100 429 | 4040 PRINT "YOU GOT SHOT IN THE LEG AND THEY TOOK ONE OF YOUR OXEN" 430 | 4050 K8=1 431 | 4060 PRINT "BETTER HAVE A DOC LOOK AT YOUR WOUND" 432 | 4070 M1=M1-5 433 | 4080 A=A-20 434 | 4090 GOTO 4710 435 | 4100 PRINT "QUICKEST DRAW OUTSIDE OF DODGE CITY!!!" 436 | 4110 PRINT "YOU GOT 'EM!" 437 | 4120 GOTO 4710 438 | 4130 PRINT "THERE WAS A FIRE IN YOUR WAGON--FOOD AND SUPPLIES DAMAGE!" 439 | 4140 F=F-40 440 | 4150 B=B-400 441 | 4160 LET M1=M1-RND(-1)*8-3 442 | 4170 M=M-15 443 | 4180 GOTO 4710 444 | 4190 PRINT "LOSE YOUR WAY IN HEAVY FOG---TIME IS LOST" 445 | 4200 M=M-10-5*RND(-1) 446 | 4210 GOTO 4710 447 | 4220 PRINT "YOU KILLED A POISONOUS SNAKE AFTER IT BIT YOU" 448 | 4230 B=B-10 449 | 4240 M1=M1-5 450 | 4250 IF M1 >= 0 THEN 4280 451 | 4260 PRINT "YOU DIE OF SNAKEBITE SINCE YOU HAVE NO MEDICINE" 452 | 4270 GOTO 5170 453 | 4280 GOTO 4710 454 | 4290 PRINT "WAGON GETS SWAMPED FORDING RIVER--LOSE FOOD AND CLOTHES" 455 | 4300 F=F-30 456 | 4310 C=C-20 457 | 4320 M=M-20-20*RND(-1) 458 | 4330 GOTO 4710 459 | 4340 PRINT "WILD ANIMALS ATTACK!" 460 | 4350 GOSUB 6140 461 | 4360 IF B>39 THEN 4410 462 | 4370 PRINT "YOU WERE TOO LOW ON BULLETS--" 463 | 4380 PRINT "THE WOLVES OVERPOWERED YOU" 464 | 4390 K8=1 465 | 4400 GOTO 5120 466 | 4410 IF B1>2 THEN 4440 467 | 4420 PRINT "NICE SHOOTIN' PARDNER---THEY DIDN'T GET MUCH" 468 | 4430 GOTO 4450 469 | 4440 PRINT "SLOW ON THE DRAW---THEY GOT AT YOUR FOOD AND CLOTHES" 470 | 4450 B=B-20*B1 471 | 4460 C=C-B1*4 472 | 4470 F=F-B1*8 473 | 4480 GOTO 4710 474 | 4490 PRINT "COLD WEATHER---BRRRRRRR!---YOU "; 475 | 4500 IF C>22+4*RND(-1) THEN 4530 476 | 4510 PRINT "DON'T "; 477 | 4520 C1=1 478 | 4530 PRINT "HAVE ENOUGH CLOTHING TO KEEP YOU WARM" 479 | 4540 IF C1=0 THEN 4710 480 | 4550 GOTO 6300 481 | 4560 PRINT "HAIL STORM---SUPPLIES DAMAGED" 482 | 4570 M=M-5-RND(-1)*10 483 | 4580 B=B-200 484 | 4590 M1=M1-4-RND(-1)*3 485 | 4600 GOTO 4710 486 | 4610 IF E=1 THEN 6300 487 | 4620 IF E=3 THEN 4650 488 | 4630 IF RND(-1)>.25 THEN 6300 489 | 4640 GOTO 4710 490 | 4650 IF RND(-1)<.5 THEN 6300 491 | 4660 GOTO 4710 492 | 4670 PRINT "HELPFUL INDIANS SHOW YOU WERE TO FIND MORE FOOD" 493 | 4680 F=F+14 494 | 4690 GOTO 4710 495 | 496 | REM ***MOUNTAINS*** 497 | 4710 IF M <= 950 THEN 1230 498 | 4720 IF RND(-1)*10>9-((M/100-15)^2+72)/((M/100-15)^2+12) THEN 4860 499 | 4730 PRINT "RUGGED MOUNTAINS" 500 | 4740 IF RND(-1)>.1 THEN 4780 501 | 4750 PRINT "YOU GOT LOST---LOSE VALUABLE TIME TRYING TO FIND TRAIL!" 502 | 4760 M=M-60 503 | 4770 GOTO 4860 504 | 4780 IF RND(-1)>.11 THEN 4840 505 | 4790 PRINT "WAGON DAMAGED!---LOSE TIME AND SUPPLIES" 506 | 4800 MI=M1-5 507 | 4810 B=B-200 508 | 4820 M=M-20-30*RND(-1) 509 | 4830 GOTO 4860 510 | 4840 PRINT "THE GOING GETS SLOW" 511 | 4850 M=M-45-RND(-1)/.02 512 | 4860 IF F1=1 THEN 4900 513 | 4870 F1=1 514 | 4880 IF RND(-1)<.8 THEN 4970 515 | 4890 PRINT "YOU MADE IT SAFELY THROUGH SOUTH PASS--NO SNOW" 516 | 4900 IF M<1700 THEN 4940 517 | 4910 IF F2=1 THEN 4940 518 | 4920 F2=1 519 | 4930 IF RND(-1)<.7 THEN 4970 520 | 4940 IF M>950 THEN 1230 521 | 4950 M9=1 522 | 4960 GOTO 1230 523 | 4970 PRINT "BLIZZARD IN MOUNTAIN PASS--TIME AND SUPPLIES LOST" 524 | 4980 L1=1 525 | 4990 F=F-25 526 | 5000 M1=M1-10 527 | 5010 B=B-300 528 | 5020 M=M-30-40*RND(-1) 529 | 5030 IF C<18+2*RND(-1) THEN 6300 530 | 5040 GOTO 4940 531 | 532 | REM ***DYING*** 533 | 5060 PRINT "YOU RAN OUT OF FOOD AND STARVED TO DEATH" 534 | 5070 GOTO 5170 535 | 5080 LET T=0 536 | 5090 PRINT "YOU CAN'T AFFORD A DOCTOR" 537 | 5100 GOTO 5120 538 | 5110 PRINT "YOU RAN OUT OF MEDICAL SUPPLIES" 539 | 5120 PRINT "YOU DIED OF "; 540 | 5130 IF K8=1 THEN 5160 541 | 5140 PRINT "PNEUMONIA" 542 | 5150 GOTO 5170 543 | 5160 PRINT "INJURIES" 544 | 5170 PRINT 545 | 5180 PRINT "DUE TO YOUR UNFORTUNATE SITUATION, THERE ARE A FEW" 546 | 5190 PRINT "FORMALITIES WE MUST GO THROUGH" 547 | 5200 PRINT 548 | 5210 PRINT "WOULD YOU LIKE A MINISTER?" 549 | 5220 INPUT C$ 550 | 5230 PRINT "WOULD YOU LIKE A FANCY FUNERAL?" 551 | 5240 INPUT C$ 552 | 5250 PRINT "WOULD YOU LIKE US TO INFORM YOUR NEXT OF KIN?" 553 | 5260 INPUT C$ 554 | 5270 IF C$="y" THEN GOTO 5310 555 | 5280 PRINT "BUT YOUR AUNT SADIE IN ST. LOUIS IS REALLY WORRIED ABOUT YOU" 556 | 5290 PRINT 557 | 5300 GOTO 5330 558 | 5310 PRINT "THAT WILL BE $4.50 FOR THE TELEGRAPH CHARGE." 559 | 5320 PRINT 560 | 5330 PRINT "WE THANK YOU FOR THIS INFORMATION AND WE ARE SORRY YOU" 561 | 5340 PRINT "DIDN'T MAKE IT TO THE GREAT TERRITORY OF OREGON" 562 | 5350 PRINT "BETTER LUCK NEXT TIME" 563 | 5360 PRINT 564 | 5370 PRINT 565 | 5380 PRINT TAB(30);"SINCERELY" 566 | 5390 PRINT 567 | 5400 PRINT TAB(17);"THE OREGON CITY CHAMBER OF COMMERCE" 568 | QUIT 569 | 570 | REM ***FINAL TURN*** 571 | 5430 F9=(2040-M2)/(M-M2) 572 | 5440 F=F+(1-F9)*(8+5*E) 573 | 5450 PRINT 574 | 575 | REM **BELLS IN LINES 5470, 5480** 576 | 5470 PRINT "YOU FINALLY ARRIVED AT OREGON CITY" 577 | 5480 PRINT "AFTER 2040 LONG MILES---HOORAY!!!!!" 578 | 5490 PRINT "A REAL PIONEER!" 579 | 5500 PRINT 580 | 5510 F9=INT(F9*14) 581 | 5520 D3=D3*14+F9 582 | 5530 F9=F9+1 583 | 5540 IF F9<8 THEN 5560 584 | 5550 F9=F9-7 585 | 5560 ON F9 GOTO 5570,5590,5630,5650,5670,5690 586 | 5570 PRINT "MONDAY "; 587 | 5580 GOTO 5700 588 | 5590 PRINT "TUESDAY "; 589 | 5600 GOTO 5700 590 | 5610 PRINT "WEDNESDAY "; 591 | 5620 GOTO 5700 592 | 5630 PRINT "THURSDAY "; 593 | 5640 GOTO 5700 594 | 5650 PRINT "FRIDAY "; 595 | 5660 GOTO 5700 596 | 5670 PRINT "SATURDAY "; 597 | 5680 GOTO 5700 598 | 5690 PRINT "SUNDAY "; 599 | 5700 IF D3>124 THEN 5740 600 | 5710 D3=D3-93 601 | 5720 PRINT "JULY ";D3;" 1847" 602 | 5730 GOTO 5920 603 | 5740 IF D3>155 THEN 5780 604 | 5750 D3=D3-124 605 | 5760 PRINT "AUGUST ";D3;" 1847" 606 | 5770 GOTO 5920 607 | 5780 IF D3>185 THEN 5820 608 | 5790 D3=D3-155 609 | 5800 PRINT "SEPTEMBER ";D3;" 1847" 610 | 5810 GOTO 5920 611 | 5820 IF D3>216 THEN 5860 612 | 5830 D3=D3-185 613 | 5840 PRINT "OCTOBER ";D3;" 1847" 614 | 5850 GOTO 5920 615 | 5860 IF D3>246 THEN 5900 616 | 5870 D3=D3-216 617 | 5880 PRINT "NOVEMBER ";D3;" 1847" 618 | 5890 GOTO 5920 619 | 5900 D3=D3-246 620 | 5910 PRINT "DECEMBER ";D3;" 1847" 621 | 5920 PRINT 622 | 5930 PRINT "FOOD","BULLETS","CLOTHING","MISC. SUPP.","CASH" 623 | 5940 IF B>0 THEN 5960 624 | 5950 LET B=0 625 | 5960 IF C>0 THEN 5980 626 | 5970 LET C=0 627 | 5980 IF M1>0 THEN 6000 628 | 5990 LET M1=0 629 | 6000 IF T>0 THEN 6020 630 | 6010 LET T=0 631 | 6020 IF F>0 THEN 6040 632 | 6030 LET F=0 633 | 6040 PRINT INT(F),INT(B),INT(C),INT(M1),INT(T) 634 | 6050 PRINT 635 | 6060 PRINT TAB(11); "PRESIDENT JAMES K. POLK SENDS YOU HIS" 636 | 6070 PRINT TAB(17); "HEARTIEST CONGRATULATIONS" 637 | 6080 PRINT 638 | 6090 PRINT TAB(11);"AND WISHES YOU A PROSPEROUS LIFE AHEAD" 639 | 6100 PRINT 640 | 6110 PRINT TAB(22);"AT YOUR NEW HOME" 641 | QUIT 642 | 643 | REM ***SHOOTING SUB-ROUTINE*** 644 | 6131 REM THE METHOD OF TIMING THE SHOOTING 645 | 6132 REM WILL VARY FROM SYSTEM TO SYSTEM. 646 | 6133 REM USERS WILL PROBABLY PREFER TO USE 647 | 6134 REM IF TIMING ON THE USER'S SYSTEM IS HIGHLY SUSCEPTIBLE 648 | 6135 REM TO SYSTEM RESPONSE TIME, THE FORMULA IN LINE 6240 CAN 649 | 6136 REM BE TAILORED TO ACCOMODATE THIS BY EITHER INCREASING 650 | 6137 REM OR DECREASING THE 'SHOOTING' TIME RECORDED BY THE SYSTEM. 651 | 6140 DIM S$(5) 652 | 6150 S$(1)="bang" 653 | 6160 S$(2)="blam" 654 | 6170 S$(3)="pow" 655 | 6180 S$(4)="wham" 656 | 6190 S6=INT(RND(-1)*4+1) 657 | 6200 PRINT "TYPE "; S$(S6) 658 | 6210 B3 = CLK(0) 659 | 6220 INPUT C$ 660 | 6230 B1 = CLK(0) 661 | 6240 B1=((B1-B3)*3600)-(D9-1) 662 | 6250 PRINT 663 | 6255 IF B1>0 THEN 6260 664 | 6257 B1=0 665 | 6260 IF C$=S$(S6) THEN GOTO 6280 666 | 6270 B1=9 667 | 6280 RETURN 668 | 669 | REM ***ILLNESS SUB-ROUTINE*** 670 | 6300 IF 100*RND(-1)<10+35*(E-1) THEN GOTO 6370 671 | 6310 IF 100*RND(-1)<100-(40/4^(E-1)) THEN GOTO 6410 672 | 6320 PRINT "SERIOUS ILLNESS---" 673 | 6330 PRINT "YOU MUST STOP FOR MEDICAL ATTENTION" 674 | 6340 M1=M1-10 675 | 6350 S4=1 676 | 6360 GOTO 6440 677 | 6370 PRINT "MILD ILLNESS---MEDICINE USED" 678 | 6380 M=M-5 679 | 6390 M1=M1-2 680 | 6400 GOTO 6440 681 | 6410 PRINT "BAD ILLNESS---MEDICINE USED" 682 | 6420 M=M-5 683 | 6430 M1=M1-5 684 | 6440 IF M1<0 THEN 5110 685 | 6450 IF L1=1 THEN 4940 686 | 6460 GOTO 4710 687 | 688 | REM ***IDENTIFICATION OF VARIABLES IN THE PROGRAM*** 689 | 6480 REM A = AMOUNT SPENT ON ANIMALS 690 | 6490 REM B = AMOUNT SPENT ON AMMUNITION 691 | 6500 REM B1 = ACTUAL RESPONSE TIME FOR INPUTTING "BANG" 692 | 6510 REM B3 = CLOCK TIME AT START OF INPUTTING "BANG" 693 | 6520 REM C = AMOUNT SPENT ON CLOTHING 694 | 6530 REM C1 = FLAG FOR INSUFFICIENT CLOTHING IN COLD WEATHER 695 | 6540 REM C$ = YES/NO RESPONSE TO QUESTIONS 696 | 6550 REM D1 = COUNTER IN GENERATING EVENTS 697 | 6560 REM D3 = TURN NUMBER FOR SETTING DATE 698 | 6570 REM D4 = CURRENT DATE 699 | 6580 REM D9 = CHOICE OF SHOOTING EXPERTISE LEVEL 700 | 6590 REM E = CHOICE OF EATING 701 | 6600 REM F = AMOUNT SPENT ON FOOD 702 | 6610 REM F1 = FLAG FOR CLEARING SOUTH PASS 703 | 6620 REM F2 = FLAG FOR CLEARING BLUE MOUNTAINS 704 | 6630 REM F9 = FRACTION OF 2 WEEKS TRAVELED ON FINAL TURN 705 | 6640 REM K8 = FLAG FOR INJURY 706 | 6650 REM L1 = FLAG FOR BLIZZARD 707 | 6660 REM M = TOTAL MILEAGE WHOLE TRIP 708 | 6670 REM M1 = AMOUNT SPENT ON MISCELLANEOUS SUPPLIES 709 | 6680 REM M2 = TOTAL MILEAGE UP THROUGH PREVIOUS TURN 710 | 6690 REM M9 = FLAG FOR CLEARING SOUTH PASS IN SETTING MILEAGE 711 | 6700 REM P = AMOUNT SPENT ON ITEMS AT FORT 712 | 6710 REM R1 = RANDOM NUMBER IN CHOOSING EVENTS 713 | 6720 REM S4 = FLAG FOR ILLNESS 714 | 6730 REM S5 = ""HOSTILITY OF RIDERS"" FACTOR 715 | 6740 REM S6 = SHOOTING WORD SELECTOR 716 | 6750 REM S$ = VARIATIONS OF SHOOTING WORD 717 | 6760 REM T = CASH LEFT OVER AFTER INITIAL PURCHASES 718 | 6770 REM T1 = CHOICE OF TACTICS WHEN ATTACKED 719 | 6780 REM X = CHOICE OF ACTION FOR EACH TURN 720 | 6790 REM X1 = FLAG FOR FORT OPTION 721 | END 722 | 723 | --------------------------------------------------------------------------------