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 ifRNDrounds 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:
- Increment
YEAR(line 20). - Compute population change (line 30).
- Display status and process player inputs for artefacts, food, and oxygen (lines 710–880).
- Roll for attack event —
IF INT(RND*5)+1=2 THEN GOSUB 7000— approximately 20% chance (line 900). - Deduct food consumption, maintenance, oxygen purchase cost, and net oxygen (lines 2005–2040).
GOTO 20to 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
| Variable | Meaning |
|---|---|
FOLK | Current population |
CASH | Treasury balance |
OXY | Oxygen units in stock |
FOOD | Food units in stock |
OXYNEED | Oxygen consumed per person per year |
FOODNEED | Food consumed per person per year |
OXYCOST | Cost per oxygen unit |
FOODCOST | Cost per food unit |
ARTCOST | Oxygen used per artefact produced |
ARTPAY | Cash earned per artefact traded |
REPAIR | Annual maintenance charge |
YEAR | Current simulation year |
CTR | Count of near-extinction events |
Content
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.
