This is a fur-trading survival game in which the player manages a pack-horse expedition, trading four types of furs (haggis, coyote, ocelot, and rabbit) at randomly located trading posts while managing hunger, rest, and money. Each game tick decrements both hunger and rest counters, and random robbery events can strip furs or cash with roughly a 1-in-25 chance per turn. Exchange rates are randomised per visit to a trading post and locked in until the deal is completed via the ERV flag. The computed GOTO A*1000 at line 200 dispatches to six distinct routines based on the player’s numeric menu choice, a common Sinclair BASIC dispatch idiom.
Program Analysis
Program Structure
The program is divided into functional blocks separated by line-number ranges. Initialisation runs from lines 6–17, the main command menu from 25–200, and the six command handlers occupy the 1000-series through 6000-series blocks. The game-tick engine lives at 7000–7250, death/end-game handling at 8000–8230, and error messages at 9000–9050.
| Line Range | Purpose |
|---|---|
| 6–17 | Variable initialisation and jump to game-tick at 7000 |
| 25–200 | Main menu display, input, and dispatch |
| 1000–1520 | Command 1: Search for trading post |
| 2000–2020 | Command 2: Sleep/rest |
| 3010–3040 | Command 3: Eat/drink from pack-horses |
| 4000–4140 | Command 4: Status check |
| 5000–5100 | Command 5: View exchange rates |
| 6000–6425 | Command 6: Buy and sell furs |
| 7000–7250 | Game tick: decrement counters, random robberies |
| 8000–8230 | Death screen and final net-worth calculation |
| 9000–9050 | Error/invalid-command messages |
Computed GOTO Dispatch
Line 200 uses GOTO A*1000 to jump directly to the handler for each of the six commands. Because BASIC evaluates the arithmetic expression, commands 1–6 map cleanly to lines 1000, 2000, 3000, 4000, 5000, and 6000 respectively. This is an efficient alternative to a chain of IF … THEN GOTO statements and is a well-known Sinclair BASIC technique.
Game-Tick Engine
Rather than driving the game loop through the menu itself, every action routes back to line 17 (GOTO 17), which immediately jumps to the tick routine at line 7000. This means every single player command—including merely checking status—costs one hunger point and one rest point. Lines 7005–7010 decrement D (rest counter) and H (hunger counter), then check for death conditions before processing random events.
Randomised Events
Two independent robbery checks occur on every turn. Each uses INT (RND*125)>5, giving approximately a 96/125 (≈77%) chance of no robbery — so roughly a 1-in-5 chance of being robbed each turn. Both fur robbery (line 7050–7110) and cash robbery (line 7210) steal a random fraction of up to half the player’s current holdings using INT (RND*(X/2)).
Exchange Rate Flag (ERV)
The variable ERV acts as a one-shot latch. When the player first views the exchange rates (command 5), prices are randomised and ERV is set to 1 at line 5095. Subsequent views of the rate screen reuse the same prices. After completing a deal (line 6420), ERV is reset to 0 so fresh prices are generated at the next post. Line 185 prevents the player from making a deal without first checking the rates, enforcing the intended flow.
Trading Post Availability
Command 1 (search for a trading post) succeeds if INT ((RND*10)+1) <= 6, giving a 60% success rate. On success, the flag T is set to 1, enabling commands 5 and 6. On failure or after completing a deal, T is cleared. There is also a 50% chance the player finds extra food on successfully locating a post (line 1025–1040).
Death and Net Worth
On death (starvation at line 8020, exhaustion at line 8000), lines 8112–8118 calculate the player’s final net worth by valuing all remaining furs at the last known exchange prices (HFP, CFP, OFP, RFP) and adding them to cash M. This requires that exchange rates have been seen at least once; if the player dies before ever visiting a trading post, these price variables will be uninitialised, which is a latent bug.
Key BASIC Idioms and Notable Techniques
PAUSE 32768is used as a wait-for-keypress on status and exchange-rate screens (lines 4130, 5090, 8220).INT A <> Aat line 170 validates that the menu input is a whole number, rejecting fractional entries.- Block graphic characters in line 2014 (
\:'\:' \':\': …) are used to display a row of bed bugs as an animation. - Input re-validation loops (e.g. lines 6050–6060, 6100–6110) use
GOTOback to theINPUTline rather than using aFOR/NEXTconstruct. - Inverse-video text in the error messages at lines 9000, 9020, and 9040 makes them visually distinct from normal output.
- Line 7250 jumps to line 20, which does not exist; this is used as an intentional fall-through to line 25 (the menu), a known BASIC technique where execution continues at the next higher line number.
Anomalies and Minor Issues
- Line 3 (
GOTO 7000) does not exist as line 3; the initialisation sequence at lines 6–17 ends withGOTO 7000at line 17, which is correct, but line 6 starts withLET ERV=0without a precedingCLS, so any screen content from a prior run will remain briefly visible. - At line 6195 the
INT Xtruncation is missing for rabbit fur purchase input, unlike all other fur-quantity inputs. This could allow fractional quantities. - The hunger counter
Hand rest counterDare only reset by eating (line 3015) and sleeping (line 2005) respectively, but their initial values of 7 mean the player has exactly 7 command turns before dying if they neither eat nor sleep. - Lines 9060–9080 (
CLEAR,SAVE,RUN) are unreachable dead code — no path in the program leads to line 9060.
Content
Source Code
6 LET ERV=0
7 CLS
8 LET HF=5
9 LET CF=50
10 LET OF=100
11 LET RF=200
12 LET H=7
13 LET D=7
14 LET F=5
15 LET M=100
16 LET T=0
17 GOTO 7000
25 CLS
30 PRINT AT 3,0;"YOUR COMMANDS ARE :"
40 PRINT
50 PRINT "<1> LOOK FOR TRADING POST."
60 PRINT "<2> GO TO BED."
70 PRINT "<3> EAT/DRINK FOOD AND WATER."
80 PRINT "<4> FOOD/HUNGER/REST/STORES CK."
90 PRINT
100 PRINT
110 PRINT "COMMANDS AT TRADING POST ONLY."
120 PRINT
130 PRINT "<5> SEE GOING EXCHANGE RATE."
140 PRINT "<6> MAKE A DEAL."
150 PRINT AT 21,0;"WHAT IS YOUR COMMAND ?"
160 INPUT A
170 IF INT A<>A OR A<1 OR A>6 THEN GOTO 9020
180 IF NOT T AND A>4 THEN GOTO 9040
185 IF A=6 AND ERV=0 THEN GOTO 9000
190 CLS
200 GOTO A*1000
\n1000 IF INT ((RND*10)+1)>6 THEN GOTO 1500
\n1010 LET T=1
\n1020 PRINT AT 8,0;"CONGRATULATIONS . YOU HAVE FOUND A TRADING POST."
\n1025 LET A=INT (RND*2)+1
\n1030 PRINT
\n1035 IF A=1 THEN LET F=F+1
\n1040 IF A=1 THEN PRINT "YOU ALSO MANAGED TO REFILL YOUR STORE OF FOOD ."
\n1045 PAUSE 300
\n1050 GOTO 17
\n1500 LET T=0
\n1510 PRINT AT 11,0;" BAD LUCK.YOU DID NOT MANAGE TO FIND A TRADING POST ANYWHERE ."
\n1515 PAUSE 300
\n1520 GOTO 17
\n2000 LET A=INT (RND*5)+1
\n2005 IF A<>1 THEN LET D=7
\n2010 PRINT AT 10,0;"NIGHT NIGHT.SLEEP TIGHT;MIND THE BUGS DON""T BITE."
\n2011 PAUSE 300
\n2012 IF A=1 THEN PRINT AT 15,0;"THE BED BUGS BIT AND YOU DID NOT MANAGE TO GET ANY SLEEP."
\n2013 IF A=1 THEN PRINT AT 17,0;""
\n2014 IF A=1 THEN PRINT AT 18,6;" \:'\:' \':\': \:'\:' \:'\:' \':\': \':\':"
\n2015 IF A=1 THEN PAUSE 300
\n2020 GOTO 17
\n3010 IF F<>0 THEN PRINT AT 11,0;"YOU HAVE NOW TAKEN THE LOAD OFF ONE PACKHORSE."
\n3015 IF F<>0 THEN LET H=7
\n3020 IF F=0 THEN PRINT AT 11,0;"BAD LUCK.THERE IS NO FOOD LEFT."
\n3030 IF F<>0 THEN LET F=F-1
\n3035 PAUSE 300
\n3040 GOTO 17
\n4000 PRINT "FOOD / HUNGER / REST / STORES CK"
\n4010 PRINT AT 3,0;"YOU HAVE ";HF;" HAGGIS FURS."
\n4020 PRINT
\n4030 PRINT "YOU HAVE ";CF;" COYOTE FURS."
\n4040 PRINT
\n4050 PRINT "YOU HAVE ";OF;" OCELOT FURS."
\n4060 PRINT
\n4070 PRINT "YOU HAVE ";RF;" RABBIT FURS."
\n4080 PRINT AT 12,0;"YOU CAN SURVIVE ";H;" COMMANDS WITHOUT ANY FOOD."
\n4090 PRINT
\n4100 PRINT "YOU HAVE ";F;" PACK-HORSES OF FOOD AND WATER."
\n4110 PRINT
\n4120 PRINT "YOU CAN SURVIVE ";D;" COMMANDS WITHOUT ANY REST."
\n4125 PRINT AT 21,0;"YOU NOW HAVE $";M
\n4130 PAUSE 32768
\n4140 GOTO 17
\n5000 IF ERV=1 THEN GOTO 5040
\n5005 LET HFP=INT (RND*40)+61
\n5010 LET CFP=INT (RND*30)+31
\n5020 LET OFP=INT (RND*20)+11
\n5030 LET RFP=INT (RND*10)+1
\n5040 PRINT TAB 9;"EXCHANGE RATE."
\n5050 PRINT AT 4,0;"HAGGIS FUR =$";HFP
\n5060 PRINT AT 8,0;"COYOTE FUR =$";CFP
\n5070 PRINT AT 12,0;"OCELOT FUR =$";OFP
\n5080 PRINT AT 16,0;"RABBIT FUR =$";RFP
\n5090 PAUSE 32768
\n5095 LET ERV=1
\n5100 GOTO 17
\n6000 PRINT AT 4,0;"YOU HAVE ";HF;" HAGGIS FURS"
\n6010 PRINT AT 8,0;"YOU HAVE ";CF;" COYOTE FURS"
\n6020 PRINT AT 12,0;"YOU HAVE ";OF;" OCELOT FURS"
\n6030 PRINT AT 16,0;"YOU HAVE ";RF;" RABBIT FURS"
\n6035 PRINT AT 0,0;"YOU NOW HAVE A TOTAL OF $";M
\n6040 PRINT AT 20,0;"HOW MANY HAGGIS FURS WOULD YOU LIKE TO SELL ?"
\n6045 IF HF<=0 THEN GOTO 6090
\n6050 INPUT X
\n6055 LET X=INT X
\n6060 IF X>HF OR X<0 THEN GOTO 6050
\n6070 LET M=M+(X*HFP)
\n6075 PRINT AT 0,25;M;" "
\n6080 LET HF=HF-X
\n6085 PRINT AT 4,9;HF;" "
\n6090 PRINT AT 20,9;"COYOTE FURS"
\n6095 IF CF<=0 THEN GOTO 6140
\n6100 INPUT X
\n6105 LET X=INT X
\n6110 IF X>CF OR X<0 THEN GOTO 6100
\n6120 LET M=M+(X*CFP)
\n6125 PRINT AT 0,25;M;" "
\n6130 LET CF=CF-X
\n6135 PRINT AT 8,9;CF;" "
\n6140 PRINT AT 20,9;"OCELOT FURS"
\n6145 IF OF<=0 THEN GOTO 6180
\n6150 INPUT X
\n6153 LET X=INT X
\n6155 IF X>OF OR X<0 THEN GOTO 6150
\n6160 LET M=M+(X*OFP)
\n6165 PRINT AT 0,25;M;" "
\n6170 LET OF=OF-X
\n6175 PRINT AT 12,9;OF;" "
\n6180 PRINT AT 20,9;"RABBIT FURS"
\n6185 IF RF<=0 THEN GOTO 6220
\n6190 INPUT X
\n6195 IF X>RF OR X<0 THEN GOTO 6190
\n6200 LET M=M+(X*RFP)
\n6205 PRINT AT 0,25;M;" "
\n6210 LET RF=RF-X
\n6215 PRINT AT 16,9;RF;" "
\n6220 PRINT AT 20,9;"HAGGIS FURS WOULD YOU LIKE TO BUY ? "
\n6225 IF M<HFP THEN GOTO 6270
\n6230 INPUT X
\n6235 LET X=INT X
\n6240 IF (X*HFP)>M OR X<0 THEN GOTO 6230
\n6250 LET M=M-(X*HFP)
\n6255 PRINT AT 0,25;M;" "
\n6260 LET HF=HF+X
\n6265 PRINT AT 4,9;HF;" "
\n6270 PRINT AT 20,9;"COYOTE FURS"
\n6275 IF M<CFP THEN GOTO 6320
\n6280 INPUT X
\n6285 LET X=INT X
\n6290 IF (X*CFP)>M OR X<0 THEN GOTO 6280
\n6300 LET M=M-(X*CFP)
\n6305 PRINT AT 0,25;M;" "
\n6310 LET CF=CF+X
\n6315 PRINT AT 8,9;CF;" "
\n6320 PRINT AT 20,9;"OCELOT FURS"
\n6325 IF M<OFP THEN GOTO 6370
\n6330 INPUT X
\n6335 LET X=INT X
\n6340 IF (X*OFP)>M OR X<0 THEN GOTO 6330
\n6350 LET M=M-(X*OFP)
\n6355 PRINT AT 0,25;M;" "
\n6360 LET OF=OF+X
\n6365 PRINT AT 12,9;OF;" "
\n6370 PRINT AT 20,9;"RABBIT FURS"
\n6375 IF M<RFP THEN GOTO 6420
\n6380 INPUT X
\n6385 LET X=INT X
\n6390 IF (X*RFP)>M OR X<0 THEN GOTO 6380
\n6400 LET M=M-(X*RFP)
\n6405 PRINT AT 0,25;M;" "
\n6410 LET RF=RF+X
\n6413 PRINT AT 16,9;RF;" "
\n6415 LET T=0
\n6420 LET ERV=0
\n6425 GOTO 17
\n7000 CLS
\n7005 LET D=D-1
\n7010 LET H=H-1
\n7020 IF H<0 THEN GOTO 8020
\n7030 IF D<0 THEN GOTO 8000
\n7040 IF INT (RND*125)>5 THEN GOTO 7200
\n7050 LET HF=HF-INT (RND*(HF/2))
\n7070 LET CF=CF-INT (RND*(CF/2))
\n7090 LET OF=OF-INT (RND*(OF/2))
\n7110 LET RF=RF-INT (RND*(RF/2))
\n7130 PRINT AT 9,0;" SOME ROBBERS HAVE JUST ROBBED YOUR PACK HORSES OF SOME OF YOUR FURS."
\n7140 PAUSE 300
\n7150 CLS
\n7200 IF INT (RND*125)>5 THEN GOTO 7250
\n7210 LET M=M-INT (RND*(M/2))
\n7220 PRINT AT 9,0;" SOME ROBBERS HAVE JUST ROBBED YOUR PACK HORSES OF SOME OF YOUR MONEY."
\n7230 PAUSE 300
\n7240 CLS
\n7250 GOTO 20
\n8000 PRINT "YOU DIED DUE TO A LACK OF REST."
\n8010 GOTO 8030
\n8020 PRINT "BAD LUCK.YOU STARVED TO DEATH."
\n8030 PRINT
\n8040 PRINT "YOU HAD ";F;" PACK-HORSES OF FOOD AND WATER LEFT"
\n8060 PRINT "YOU COULD HAVE SURVIVED ";D;" DAYS WITHOUT REST"
\n8080 PRINT "YOU COULD HAVE SURVIVED ";H;" DAYS WITHOUT FOOD/WATER"
\n8100 PRINT
\n8110 PRINT "IN YOUR WILL,YOU LEFT :"
\n8112 LET M=M+(HF*HFP)
\n8114 LET M=M+(CF*CFP)
\n8116 LET M=M+(OF*OFP)
\n8118 LET M=M+(RF*RFP)
\n8120 PRINT
\n8130 PRINT "A TOTAL OF $";M;" NET."
\n8140 PRINT
\n8150 PRINT "( ";HF;" HAGGIS FURS )"
\n8160 PRINT
\n8170 PRINT "( ";CF;" COYOTE FURS )"
\n8180 PRINT
\n8190 PRINT "( ";OF;" OCELOT FURS )"
\n8200 PRINT
\n8210 PRINT "( ";RF;" RABBIT FURS )"
\n8220 PAUSE 32768
\n8230 GOTO 7
\n9000 PRINT AT 17,0;"% % % % %W%H%A%T% %A%B%O%U%T% %C%O%M%M%A%N%D% %(%5%)% % % % % % "
\n9005 PAUSE 500
\n9010 GOTO 25
\n9020 PRINT AT 17,0;"%P%L%E%A%S%E% %E%N%T%E%R% %A% %C%O%R%R%E%C%T% %C%O%M%M%A%N%D% %."
\n9025 PAUSE 500
\n9030 GOTO 25
\n9040 PRINT AT 17,0;"% %Y%O%U% %A%R%E% %N%O%T% %A%T% %A% %T%R%A%D%I%N%G% %P%O%S%T% %."
\n9045 PAUSE 500
\n9050 GOTO 25
\n9060 CLEAR
\n9070 SAVE "1029%6"
\n9080 RUN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
