Manager

This file is part of and ISTUG Public Domain Library 6. Download the collection to get this file.
Developer(s): Tim Hartnell
Date: 198x
Type: Program
Platform(s): TS 2068
Tags: Game

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.

  1. 1300 – Title/intro screen (called once at startup)
  2. 1160 – Variable initialization (also called on winning condition reset)
  3. 720 – Factory report printout (called multiple times per loop)
  4. 980 – Hire/fire workforce management
  5. 860 – Set production target and manufacture radios
  6. 600 – Sales report and income calculation
  7. 150 – Random unpredictable events
  8. 1110 – Bankruptcy handler (jumped to, not called)
  9. 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.

VariableDescriptionInitial Range
capitalAvailable cash ($)500–999
stockUnsold radios100–149
sellpriceRetail price per radio ($)10–14
costManufacturing cost per radio ($)2–6 (capped below sellprice)
workforceNumber of employees7–16
wageWeekly wage per employee ($)12–(12+5*sellprice−1)
produceRadios produced per person per week5–10
zCumulative price-rise resistance factor1

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 wage by 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 cost by a random amount derived from cost/7.
  • Price increase opportunity (line 480): fires if RND >= 0.65 or make >= sellprice; the player can voluntarily raise sellprice by any percentage, accumulating it into z.

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) evaluates NOT PI as 0, making PAUSE 0 — an indefinite pause until a key is pressed. This is an efficient keypress-wait idiom.
  • PAUSE VAL "100" and similar constructs throughout use VAL on a string literal as a memory-saving technique to store the numeric argument more compactly.
  • INK PI (lines 580, 1080) exploits the fact that PI truncates 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 BEEP calls with RND*50 for randomized pitch, then returns — usable mid-event for dramatic effect.
  • Line 910’s production penalty formula combines RND with the accumulated z factor 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 of a at 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+stock where stock is 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 use capital+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 400 re-rolls only the random component but recalculates using the current (possibly already-increased) cost, which is correct in intent but could loop many times if cost is very small.

Content

Appears On

Library tape of the Indiana Sinclair Timex User’s Group.

Related Products

Related Articles

Related Content

Image Gallery

Manager

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.

Scroll to Top