Manager is a turn-based business simulation game in which the player runs a radio manufacturing company, making decisions each week about hiring, production targets, and pricing. The game tracks capital, stock, workforce, wages, selling price, and production capacity, and exposes the player to random events including union pay demands, storm flood damage, and supplier price rises. Sales volume is influenced by a cumulative price-increase resistance factor stored in variable z, which grows each time the player raises the selling price. The bankruptcy check at line 750 tests whether the combined value of capital plus stock has fallen to zero or below, while a million-dollar net worth triggers a winning condition. Starting values for most key variables are randomized to give each playthrough a different economic environment.
Modified from THE TIMEX SINCLAIR 2068 EXPLORED by Tim Hartnell.
Program Analysis
Program Structure
The program is organized as a collection of subroutines dispatched from a tight main loop beginning at line 40. Each iteration of the loop increments the week counter, then calls subroutines for display, personnel management, production, and sales before deducting the weekly payroll from capital and looping back.
1300– Title/intro screen (called once at startup)1160– Variable initialization (also called on winning condition reset)720– Factory report printout (called multiple times per loop)980– Hire/fire workforce management860– Set production target and manufacture radios600– Sales report and income calculation150– Random unpredictable events1110– Bankruptcy handler (jumped to, not called)140– Sound effect (beeps), used throughout as a shared audio subroutine
Main Loop
Lines 40–130 form the central game loop. After all subroutine phases complete, line 120 deducts wage*workforce from capital, then GO TO 40 restarts the cycle. There is no explicit exit from the loop; play ends only through bankruptcy or the million-dollar win condition.
Variable Initialization
All key game variables are randomized at lines 1170–1280, giving each game a unique starting state. A guard at line 1210 prevents the cost of production from exceeding the selling price at the start of the game by looping back to re-roll those values. The sales resistance variable z is initialized to 1 and only ever increases.
| Variable | Description | Initial Range |
|---|---|---|
capital | Available cash ($) | 500–999 |
stock | Unsold radios | 100–149 |
sellprice | Retail price per radio ($) | 10–14 |
cost | Manufacturing cost per radio ($) | 2–6 (capped below sellprice) |
workforce | Number of employees | 7–16 |
wage | Weekly wage per employee ($) | 12–(12+5*sellprice−1) |
produce | Radios produced per person per week | 5–10 |
z | Cumulative price-rise resistance factor | 1 |
Random Events (Lines 150–590)
The unpredictables subroutine tests three independent random thresholds to determine which events fire in a given week. Each event is gated by a separate RND check, so multiple events can occur in the same week.
- Union pay rise (line 170): 55% chance; raises
wageby a random 1–7%. - Storm flood (line 270): 15% chance; destroys up to half the current stock.
- Supplier price rise (line 360): 70% chance; increases
costby a random amount derived fromcost/7. - Price increase opportunity (line 480): fires if
RND >= 0.65ormake >= sellprice; the player can voluntarily raisesellpriceby any percentage, accumulating it intoz.
Sales Resistance Mechanic
Variable z accumulates each percentage price increase the player applies (line 550: LET z=z+a). In the production subroutine at line 910, actual output is reduced by a factor based on z: LET make=make-INT(RND*make/5*(z/100)). This means raising prices repeatedly causes increasing production shortfall as a proxy for reduced demand, creating a meaningful trade-off between revenue per unit and actual units available to sell.
Production Subroutine (Lines 860–970)
The player inputs a desired production quantity. Two guards enforce physical limits: line 880 checks that make*cost does not exceed available capital, and line 890 checks that make does not exceed produce*workforce. The sales resistance adjustment at line 910 then stochastically reduces the final output before it is added to stock and the cost is deducted from capital.
Workforce Management (Lines 980–1100)
The player is first asked how many people to hire (line 990); a positive entry is accepted directly. If the hire input is zero or negative, the player is then prompted to fire staff (line 1030). A union interference mechanic at line 1060 randomly reduces the number actually fired: LET a=INT(RND*a+1), so the player can never guarantee firing more than one person, as the random reduction can shrink the value to 1 regardless of the input.
Win and Loss Conditions
The display subroutine at line 750 checks capital+stock (stock is treated as a raw count, not a monetary value) against zero for the bankruptcy condition, and against 999999 for the million-dollar win. The bankruptcy branch at line 1110 prints the number of weeks survived and then executes RUN, restarting the program entirely. The win condition at line 760 branches directly to the variable initialization subroutine at line 1160, effectively starting a new game without the title screen.
Notable BASIC Idioms and Techniques
PAUSE NOT PI(lines 1150, 1320) evaluatesNOT PIas 0, makingPAUSE 0— an indefinite pause until a key is pressed. This is an efficient keypress-wait idiom.PAUSE VAL "100"and similar constructs throughout useVALon a string literal as a memory-saving technique to store the numeric argument more compactly.INK PI(lines 580, 1080) exploits the fact thatPItruncates to 3 when used as a color index, selecting INK 3 (magenta) without using the digit.PAPER PI(line 640) similarly selects PAPER 3.- The shared audio subroutine at line 140 uses two
BEEPcalls withRND*50for randomized pitch, then returns — usable mid-event for dramatic effect. - Line 910’s production penalty formula combines
RNDwith the accumulatedzfactor to create a smoothly scaling stochastic output reduction.
Bugs and Anomalies
- Sales quantity never computed: The sales subroutine at line 600 prints and deducts a variable
a(lines 670–700) that is never assigned a sales quantity within this subroutine. The value ofaat this point is whatever it was last set to — most likely from the unpredictables subroutine (e.g., the storm flood damage amount or price rise percentage). This means sales figures are effectively meaningless or coincidental each week. - Stock bankruptcy check: Line 750 uses
capital+stockwherestockis a unit count, not a dollar value, making the bankruptcy threshold inconsistent with the million-dollar check which similarly sums incompatible units. A more correct check would usecapital+stock*sellprice. - Negative hire input: The hire prompt at line 990 accepts negative values, which would silently reduce the workforce without going through the union interference mechanic at line 1060.
- Supplier price rise formula (line 400): The loop guard
IF a<.01 THEN GO TO 400re-rolls only the random component but recalculates using the current (possibly already-increased)cost, which is correct in intent but could loop many times ifcostis very small.
Content
Source Code
10 GO SUB 1300
20 REM Manager
30 GO SUB 1160: REM variables
40 LET week=week+1
50 GO SUB 720: REM print-out
60 GO SUB 980: REM people
70 GO SUB 720
80 GO SUB 860: REM make
90 GO SUB 720
100 GO SUB 600: REM sales
110 GO SUB 150
120 LET capital=capital-wage*workforce
130 GO TO 40
140 BEEP .5,RND*50: BEEP .4,RND*50: RETURN
150 REM unpredictables ***
160 CLS
170 IF RND<.45 THEN GO TO 270
180 LET a=INT (RND*7)+1
190 GO SUB 140
200 PRINT ''"Unions demand ";a;"% pay rise. "
210 LET wage=INT (100*(wage+(a*wage/100)))/100
220 PAUSE VAL "100"
230 PRINT '''"Pay per employee is now $";wage
240 PAUSE VAL "100"
250 GO SUB 140
260 CLS
270 IF RND<.85 THEN GO TO 360
280 PRINT ''' INK 2;"Storm flood ruins some of your stock.",,,,,,"Stand by for damage report:",
290 PAUSE VAL "100"
300 LET a=INT (RND*stock/2)+1
310 LET stock=stock-a
320 PRINT '' INK 4;"Total stock destroyed was ";a'"radios, worth $";a*sellprice;" retail."
330 PAUSE VAL "100"
340 PRINT ''"Stock on hand is now ";stock
350 PAUSE VAL "100"
360 IF RND>.3 THEN GO TO 480
370 CLS
380 PRINT ''"Supplier announces dramatic","price rise!"
390 PAUSE VAL "100"
400 LET a=INT ((RND*100*cost/7))/100
410 IF a<.01 THEN GO TO 400
420 PRINT ''"Cost of making radios","goes up by "; INK 2;"$";a; INK 0;" each. "
430 PAUSE VAL "100"
440 LET cost=cost+a
450 PRINT '' INK 7; PAPER 1;" It now costs "; INK 7; PAPER 0;"$";cost;" "
460 PRINT "to make each one."
470 PAUSE VAL "100"
480 IF RND<.65 AND make<sellprice THEN RETURN
490 CLS
500 GO SUB 140
510 PRINT ''"You have a chance to raise your price."
520 PRINT '"Radios now sell for $";sellprice
530 PAUSE VAL "100"
540 INPUT "What percentage increase? ";a
550 IF a>0 THEN LET z=z+a
560 LET sellprice=INT (100*(sellprice+a*sellprice/100))/100
570 PAUSE VAL "100"
580 PRINT ' INK PI;"Radios now sell for $";sellprice;" "
590 PAUSE VAL "100": RETURN
600 REM ** sales **
610 GO SUB 140
620 PRINT PAPER 5;'"Total stock is ";stock;" radios "
630 PAUSE VAL "100"
640 PRINT PAPER PI;'"Stand by for sales report..... "
650 PAUSE VAL "300"
660 BORDER 7: PAPER 7: CLS
670 PRINT '' INK 1;"Total radios sold: ";a
680 LET stock=stock-a
690 PRINT '"Income from sale: $";a*sellprice
700 LET capital=capital+a*sellprice
710 PAUSE VAL "100": RETURN
720 REM PRINT -out
730 FOR g=40 TO 50: BEEP .008,g: BEEP .008,60-2*g: NEXT g
740 CLS
750 IF capital+stock<1 THEN GO TO 1110: REM bankrupt
760 IF capital+stock>999999 THEN PRINT INK 2;"!! You have made a million !!": PAUSE VAL "500": GO TO 1160
770 PRINT AT 0,5;"FACTORY REPORT: WEEK ";week
780 PRINT '"Capital = $";capital
790 PRINT "Stock = ";stock;" radios, worth $";stock*sellprice
800 PRINT "Selling price = $";sellprice;" each"
810 PRINT "Cost = $";cost;" each"
820 PRINT "Employees = ";workforce;" people"
830 PRINT "Wages = $";wage;" per week"'"Payroll this week = $";wage*workforce
840 PRINT "Production = ";produce;" radios/person"'"Max production = ";produce*workforce;" radios"
850 RETURN
860 INPUT " How many radios do you want to make? ";make
870 IF NOT make THEN RETURN
880 IF make*cost>capital THEN PRINT AT 11,0; INK 2;"Not enough money": GO TO 860
890 IF make>produce*workforce THEN PRINT AT 11,0; INK 4;"Not enough people": GO TO 860
900 PRINT AT 11,0;"Target production = ";make;" "
910 LET make=make-INT (RND*make/5*(z/100))
920 PAUSE VAL "100"
930 PRINT AT 12,0;"Total made in week ";week;" was ";make;" "
940 LET stock=stock+make
950 LET capital=capital-cost*make
960 PAUSE VAL "50"
970 RETURN
980 REM people
990 INPUT "How many people do you want","to hire? ";a
1000 LET workforce=workforce+a
1010 PAUSE VAL "100": GO SUB 720
1020 IF a>0 THEN RETURN
1030 INPUT "How many people do you want","to "; INK 4;"fire? ";a
1040 IF a=0 THEN GO TO 1100
1050 IF a>workforce THEN GO TO 1030
1060 LET a=INT (RND*a+1)
1070 PAUSE VAL "100"
1080 PRINT INK PI;"Unions allow you to fire ";a
1090 LET workforce=workforce-a
1100 PAUSE VAL "100": RETURN
1110 REM bankruptcy
1120 PRINT ''TAB 8; INK 2;"!! BANKRUPT !!!!"
1130 PRINT ''"Oh, the shame of it!"
1140 PRINT ''"Still, you kept the business"
1150 PRINT ''"going for "; INK 1;week; INK 0;" weeks.";#0;"Press any key for another run": PAUSE NOT PI: RUN
1160 REM variables
1170 LET capital=500+INT (RND*500)
1180 LET stock=100+INT (RND*50)
1190 LET sellprice=10+INT (RND*5)
1200 LET cost=2+INT (RND*5)
1210 IF cost>sellprice THEN GO TO 1190
1220 LET workforce=7+INT (RND*10)
1230 LET wage=12+INT (RND*sellprice*5)
1240 LET produce=5+INT (RND*6)
1250 LET week=0
1260 REM z= sales resistance * factor *
1270 LET z=1
1280 PAPER 7: CLS : BORDER 7: INK 0: RETURN
1300 CLS : PRINT AT PI,12;"MANAGER"''''" Modified from page 138"'"THE TIMEX SINCLAIR 2068 EXPLORED by Tim Hartnell"
1310 PRINT ''''" A radio manufacturers game.... Good Luck!"''''" To begin press any key"
1320 PAUSE NOT PI: RETURN
1330 SAVE "manager" LINE 10
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.

