Space Station

This file is part of and Timex Sinclair Public Domain Library Tape 1005. Download the collection to get this file.
Developer(s): Tim Hartnell
Date: 198x
Type: Program
Platform(s): TS 1000

Space Station is a turn-based resource management simulation in which the player governs a space station, balancing oxygen, food, and money across multiple years. Each turn the player trades artefacts for cash, purchases food and oxygen, and then endures random population growth, maintenance costs, and occasional alien or rogue-human attacks that deplete resources and colonists. The initialisation subroutine at line 3000 randomises starting values for population, cash, food, oxygen costs, and per-person needs, giving each playthrough different economic conditions. A random attack event (subroutine 7000), triggered with roughly a 1-in-5 chance each year, subtracts casualties, oxygen, food, and repair costs. The game ends with looping PRINT statements when any critical resource is exhausted or the population collapses.


Program Analysis

Program Structure

The program is divided into several functional blocks:

  • Lines 0–50: Setup, initialisation call, and year-loop entry point.
  • Lines 50–700: Status report subroutine, including warning checks, resource display, and a decorative block-graphics line (lines 610–650).
  • Lines 710–2050: Main game turn — artefact trading, food purchase, oxygen purchase, event roll, resource accounting, and loop-back.
  • Lines 3010–3115: Initialisation subroutine — randomises all starting parameters.
  • Lines 7010–7100: Attack event subroutine — describes attackers, computes casualties and damage.
  • Lines 8010–8560: Termination handlers for each losing condition (oxygen, food, cash, population).

Initialisation and Randomisation

The subroutine starting at line 3010 (called via GOSUB 3000 — targeting a non-existent line, so execution falls through to 3010) randomises every economic parameter. Notable expressions include:

  • CASH=7*(700+INT(RND*800+1))/INT(RND*3+1) — divides by 1, 2, or 3, producing a wide cash range.
  • OXY=2000-INT(RND*1500)+1 — oxygen can start as low as ~502 units, creating immediately tight starts.
  • ARTPAY=30*INT(RND*ARTCOST)+1 — artefact pay scales with artefact cost but can be as low as 1 if RND rounds to 0.

Population Growth Formula

Line 30 computes annual population change:

FOLK=INT FOLK+FOLK/INT(((RND*18)+1)+2)-FOLK/INT(((RND*15)+1)+3)

This adds a birth fraction (population divided by a random integer 3–20) and subtracts a death fraction (population divided by a random integer 4–18). Because birth and death divisors overlap in range, population can grow, shrink, or stay stable each year in a biologically plausible but unpredictable way.

Main Turn Loop

The turn sequence follows this order each year:

  1. Increment YEAR (line 20).
  2. Compute population change (line 30).
  3. Display status and process player inputs for artefacts, food, and oxygen (lines 710–880).
  4. Roll for attack event — IF INT(RND*5)+1=2 THEN GOSUB 7000 — approximately 20% chance (line 900).
  5. Deduct food consumption, maintenance, oxygen purchase cost, and net oxygen (lines 2005–2040).
  6. GOTO 20 to restart the year cycle.

Resource Accounting Anomaly

Line 805 reads LET FOOD=FOOD+C*FOODCOST when it should logically read FOOD=FOOD+C. Multiplying units purchased by cost per unit and adding that to food stock means buying food inflates food stocks proportionally to price rather than quantity — a clear bug. The player pays correctly (line 810 subtracts C*FOODCOST from cash) but receives far more food units than intended when FOODCOST is greater than 1.

Attack Subroutine

Subroutine 7000 picks one of six named attacker types (lines 7014–7019), then computes:

  • Z=1+(FOLK/INT(RND*15+1)+1) — casualties as a function of population (line 7030).
  • ZZ — cash damage, £251–500 (line 7050).
  • ZZZ — oxygen loss, 1–300 units (line 7065).
  • ZZZZ=INT(RND*300*1) — food loss, 0–299 units (line 7066). The multiplication by 1 is redundant.

Note that line 7066 uses *1 instead of +1, so food loss can be 0 (unlike the other damage values which use +1 to guarantee a minimum of 1).

Losing Conditions and Terminal Loops

Each game-over handler (lines 8010, 8100, 8200, 8500) prints a message and then loops forever with a GOTO back to its own PRINT statement, producing a repeating display. This is a common idiom for terminal game-over screens. The string A$="THE STATION IS DEAD" is set at line 3015 and prepended to every death message.

Low Population Path

Lines 97–100 handle near-extinction. If population drops below 2, the player is offered three choices at line 8310: instant death, a lingering death (which simply returns to the game loop via GOTO 20), or waiting for new colonists. The colonist option (line 8386) uses a 1-in-5 chance (NC=INT(5*RND)+1): only if NC=1 are population and cash boosted. The CTR counter (line 8391) tracks how many times this path has been taken; line 98 checks CTR=1 to trigger extinction on a second consecutive near-zero population.

Decorative Block Graphics

Lines 610–650 (inside the status subroutine) print a full row of 32 identical characters chosen randomly from the block-graphics range (CHR$ 128–159 plus a few extra, since INT(RND*11)+1+128 yields 129–139). This provides a simple visual separator between status screens.

Key Variables

VariableMeaning
FOLKCurrent population
CASHTreasury balance
OXYOxygen units in stock
FOODFood units in stock
OXYNEEDOxygen consumed per person per year
FOODNEEDFood consumed per person per year
OXYCOSTCost per oxygen unit
FOODCOSTCost per food unit
ARTCOSTOxygen used per artefact produced
ARTPAYCash earned per artefact traded
REPAIRAnnual maintenance charge
YEARCurrent simulation year
CTRCount of near-extinction events

Content

Appears On

Assembled by Tim Ward from many sources. Contains programs 10211 – 10251.

Related Products

Related Articles

Related Content

Image Gallery

Space Station

Source Code

   0 REM "SPACE STATION"                  TIM HARTNELL
   2 FAST 
   3 RAND 
   4 CLS 
   5 LET CTR=0
  10 GOSUB 3000
  20 LET YEAR=YEAR+1
  30 LET FOLK=INT FOLK+FOLK/INT (((RND*18)+1)+2)-FOLK/INT (((RND*15)+1)+3)
  40 GOTO 710
  50 PRINT "COMPUTER REPORT:"
  60 PRINT 
  70 IF OXY<OXYNEED*FOLK THEN GOTO 8000
  80 IF FOOD<FOODNEED*FOLK THEN GOTO 8100
  90 IF CASH<1 THEN GOTO 8200
  97 IF FOLK<1 THEN GOTO 8500
  98 IF FOLK<2 AND CTR=1 THEN GOTO 8500
 100 IF FOLK<2 THEN GOTO 8300
 110 IF FOLK<13 THEN PRINT "WARNING - POPULATION IS","NEARING EXTINCTION"
 120 IF OXY<2*OXYNEED*FOLK THEN PRINT "WARNING - OXYGEN SUPPLIES LOW"
 130 IF FOOD<2*FOODNEED*FOLK THEN PRINT "WARNING - FOOD STOCKS LOW"
 140 IF CASH<2000 THEN PRINT "WARNING - MONEY RUNNING LOW"
 150 PRINT "%*%*THERE ARE ";INT FOLK;" PEOPLE ON"
 160 PRINT "THE SPACE STATION IN YEAR ";YEAR;"%*%*"
 170 PRINT 
 180 PRINT "MONEY CREDIT IS £";CASH
 190 PRINT "ANNUAL MAINTENANCE:  £";REPAIR
 200 PRINT "OXYGEN TANKS HOLD  ";(INT (OXY*100)/100);" UNITS"
 210 PRINT "OXYGEN COSTS £";OXYCOST;" PER UNIT"
 220 PRINT "OXYGEN NEED PER PERSON:  ";OXYNEED
 230 PRINT 
 240 PRINT "FOOD STOCKS STAND AT ";(INT (FOOD*100)/100)
 610 LET U=INT ((RND*11)+1)+128
 620 FOR J=1 TO 32
 630 PRINT CHR$ (U);
 640 NEXT J
 650 PRINT 
 700 RETURN 
 710 GOSUB 50
 712 PRINT "ARTEFACTS - HOW MANY WILL YOU",,"MAKE AND TRADE?"
 714 PRINT "THEY USE UP ";ARTCOST;" UNITS OF"
 718 PRINT "OXYGEN AND SELL FOR £";ARTPAY 
 720 INPUT B
 730 IF B*ARTCOST>OXY THEN PRINT "NOT ENOUGH OXYGEN"
 740 IF B*ARTCOST>OXY THEN GOTO 720
 745 LET CASH=CASH+B*ARTPAY
 750 LET OXY=OXY-B*ARTCOST
 755 CLS 
 760 GOSUB 50
 762 PRINT "FOOD COSTS £";FOODCOST;" PER UNIT"
 763 PRINT "EACH PERSON NEEDS ";FOODNEED;" UNITS"
 764 PRINT "(£";FOODCOST*FOODNEED;" EACH, £";(INT (FOLK*FOODCOST*FOODNEED)*10)/10;" FOR STATION)"
 766 PRINT "THIS WILL LAST ";(INT (FOOD/(FOODNEED*FOLK)*10)/10);" YEARS        AT THE PRESENT POPULATION"
 770 PRINT "HOW MUCH FOOD WILL YOU BUY?"
 780 INPUT C
 790 IF C*FOODCOST>CASH  THEN PRINT "NOT ENOUGH MONEY"
 800 IF C*FOODCOST>CASH  THEN GOTO 780
 805 LET FOOD=FOOD+C*FOODCOST
 810 LET CASH=CASH-C*FOODCOST
 820 CLS 
 830 GOSUB 50
 850 PRINT "HOW MUCH OXYGEN WILL YOU BUY?"
 855 PRINT "(CURRENT STOCKS WILL LAST FOR   ";(INT (OXY/(OXYNEED*FOLK)*10)/10);" YEARS AT THE PRESENT          POPULATION)"
 860 INPUT D
 870 IF D*OXYCOST>CASH THEN PRINT "NOT ENOUGH MONEY"
 880 IF D*OXYCOST>CASH THEN GOTO 860
 890 CLS 
 900 IF INT (RND*5)+1=2 THEN GOSUB 7000
\n2005 LET FOOD=FOOD-FOLK*FOODNEED
\n2030 LET CASH=CASH-REPAIR-D*OXYCOST
\n2040 LET OXY=OXY+D-FOLK*OXYNEED
\n2050 GOTO 20
\n3010 LET YEAR=0
\n3015 LET A$="THE STATION IS DEAD"
\n3020 LET FOLK=INT (80+INT (RND*40)+1)
\n3030 LET CASH=7*(700+INT (RND*800+1))/INT (RND*3+1)
\n3040 LET FOODCOST=INT (RND*7+1)
\n3050 LET ARTCOST=1+INT (RND*3)+1
\n3055 LET FOOD=2000+INT (RND*500)+1
\n3060 LET OXY=2000-INT (RND*1500)+1
\n3070 LET OXYCOST=INT (RND*7)+1
\n3080 LET ARTPAY=30*INT (RND*ARTCOST)+1
\n3090 LET REPAIR=200+INT (RND*400+1)
\n3100 LET FOODNEED=1+INT (RND*5+1)
\n3105 LET OXYNEED=2+INT (RND*3+1)
\n3115 RETURN 
\n7010 CLS 
\n7012 LET J=INT (RND*6+1)
\n7013 PRINT "THE STATION WAS ATTACKED BY"
\n7014 IF J=1 THEN PRINT "A FLEET OF SYRIAN SHIPS"
\n7015 IF J=2 THEN PRINT "RENEGADE EARTHLINGS"
\n7016 IF J=3 THEN PRINT "MARTIAN SPACE PILOTS"
\n7017 IF J=4 THEN PRINT "VYRILLIEX OUTWORLDERS"
\n7018 IF J=5 THEN PRINT "A LONE SHIP, APPARENTLY UNDER",,"ROBOT CONTROL"
\n7019 IF J=6 THEN PRINT "A PARRALEXIAN ESCORT VESSEL"
\n7020 PRINT 
\n7025 PRINT 
\n7027 PRINT 
\n7030 LET Z=1+(FOLK/INT (RND*15+1)+1)
\n7040 PRINT "THERE WERE ";INT Z;" PEOPLE KILLED"
\n7045 PRINT 
\n7050 LET ZZ=250+INT (RND*250+1)
\n7060 PRINT "DAMAGE WAS £";ZZ
\n7062 PRINT 
\n7065 LET ZZZ=INT (RND*300+1)
\n7066 LET ZZZZ=INT (RND*300*1)
\n7067 PRINT "AND FOOD STOCKS HAVE FALLEN",,"BY ";ZZZZ
\n7069 LET FOOD=FOOD-ZZZZ
\n7070 LET FOLK=FOLK-Z
\n7075 LET OXY=OXY-ZZZ
\n7080 LET CASH=CASH-ZZ
\n7085 PRINT 
\n7090 PRINT ,,"PRESS <ENTER>"
\n7092 INPUT U$
\n7095 CLS 
\n7100 RETURN 
\n8010 PRINT A$
\n8020 PRINT "YOU RAN OUT OF OXYGEN IN YEAR ";YEAR
\n8040 GOTO 8020
\n8100 PRINT A$
\n8110 PRINT "FOOD SUPPLIES WERE EXHAUSTED IN YEAR ";YEAR
\n8120 GOTO 8100
\n8200 PRINT A$
\n8210 PRINT "THE TREASURY RAN DRY IN YEAR ";YEAR
\n8220 GOTO 8210
\n8310 PRINT "YOUR POPULATION HAS FALLEN"
\n8320 PRINT "TO ";INT (FOLK);".  DO YOU WANT TO"
\n8330 PRINT "COMMIT SUICIDE PAINLESSLY"
\n8340 PRINT "NOW (1), AWAIT A SAD AND"
\n8350 PRINT "LINGERING DEATH (2), OR"
\n8355 PRINT "WAIT AND HOPE FOR NEW COLONISTS"
\n8356 PRINT "(3)?"
\n8360 INPUT B
\n8365 CLS 
\n8366 PRINT "I HOPE YOU HAVE CHOSEN WELL"
\n8367 FOR H=1 TO 50
\n8368 NEXT H
\n8370 IF B=1 THEN GOTO 8400
\n8384 IF B=2 THEN GOTO 8395
\n8386 IF B=3 THEN LET NC=INT (5*RND)+1
\n8387 IF NC=1 THEN LET FOLK=FOLK+INT (RND*26+1)
\n8388 IF NC=1 THEN LET CASH=CASH+INT (RND*300+1)
\n8389 IF NC>1 THEN GOTO 8390
\n8391 LET CTR=CTR+1
\n8395 GOTO 20
\n8400 PRINT A$
\n8401 PRINT "YOU MADE IT TO YEAR ";YEAR+1
\n8402 PRINT "GOODBYE"
\n8410 GOTO 8402
\n8500 PRINT A$
\n8510 PRINT "ALL COLONISTS HAVE DIED"
\n8520 PRINT "YOU MADE IT TO YEAR ";YEAR+1
\n8530 GOTO 8402
\n8550 STOP 
\n8560 REM RAND USR 14336
\n8570 REM SAVE "SPASTA.B1"
\n8575 SAVE "1021%5"
\n8580 RUN 

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.

Scroll to Top