--- title: "Manager" id: 54997 type: "computer_media" slug: "manager" url: "http://localhost/computer_media/manager/" markdown_url: "http://localhost/computer_media/manager.md" published_at: "2024-06-10T01:44:45+00:00" modified_at: "2026-03-30T21:43:35+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2019/02/20230809-041332.jpg" excerpt: "Run a radio factory through weekly crises — union strikes, flood damage, and supplier hikes — balancing wages, workforce, and pricing to avoid bankruptcy." category: - name: "Archived Media" slug: "archived-media" taxonomy: "category" url: "http://localhost/category/archived-media/" post_tag: - name: "Downloadable" slug: "downloadable" taxonomy: "post_tag" url: "http://localhost/tag/downloadable/" - name: "TS 2068" slug: "ts2068" taxonomy: "post_tag" url: "http://localhost/tag/ts2068/" model: - name: "Timex/Sinclair 2068" slug: "ts-2068" taxonomy: "model" url: "http://localhost/model/ts-2068/" indiv: - name: "Tim Hartnell" slug: "tim-hartnell" taxonomy: "indiv" url: "http://localhost/indiv/tim-hartnell/" genre: - name: "Game" slug: "game" taxonomy: "genre" url: "http://localhost/type/game/" media_contents: - id: 54964 title: "ISTUG Public Domain Library 6" type: "computer_media" url: "http://localhost/computer_media/istug-public-domain-library-6/" media_type: "Program" programmers: - name: "Tim Hartnell" slug: "tim-hartnell" taxonomy: "indiv" url: "http://localhost/indiv/tim-hartnell/" mediadate: "198x" images: - url: "http://localhost/wp-content/uploads/2024/06/SCR-20260329-nysg.png" - url: "http://localhost/wp-content/uploads/2024/06/SCR-20260329-nyuk.png" related_content: - id: 20969 title: "The Timex Sinclair 2068 Explored" type: "book" url: "http://localhost/book/the-timex-sinclair-2068-explored/" media_type_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. | 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 `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. ## 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 make0 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 ```