HAMURABI Notes                                              -*-org-*-

Date: 2011/12/19

Annotated HAMURABI BASIC source (Twenex version line numbering).

* Variables

|------+------+-------------------------------------------|
| Var  | Init | Content                                   |
|------+------+-------------------------------------------|
| D1   |    0 | ?                                         |
| P1   |    0 | ?                                         |
| Z    |    0 | Report year                               |
| P    |   95 | Total population                          |
| S    | 2800 | Report bushels in storage                 |
| H    | 3000 | Total bushels harvested                   |
| E    |  200 | (H-S) Report grain loss to rats           |
| Y[*] |    3 | 235: Report yield (bsh./acre)             |
|      |      | 311: Current land price (bsh./acre)       |
|      |      | 515: Harvest yield (bsh./acre)            |
| A    | 1000 | (H/Y) Report acres                        |
| I    |    5 | Report immigrants                         |
| Q[*] |    1 | 227: <0 -> plague occurred in report year |
| D[*] |    0 | 221: Report starvation deaths             |
|      |      |                                           |
|------+------+-------------------------------------------|

[*] Variable is reused for multiple purposes.

* Source

** Banner

       10 PRINT TAB(32);"HAMURABI"
       20 PRINT TAB(15);"CREATIVE COMPUTING  MORRISTOWN, NEW JERSEY"
       30 PRINT
       31 PRINT
       32 PRINT
       80 PRINT "TRY YOUR HAND AT GOVERNING ANCIENT SUMERIA"
       90 PRINT "FOR A TEN-YEAR TERM OF OFFICE."
       91 PRINT

** Initialization

       95 D1=0
       96  P1=0
       100 Z=0
       101  P=95
       102 S=2800
       103  H=3000
       104  E=H-S
       110 Y=3
       111  A=H/Y
       112  I=5
       113  Q=1

** Annual loop

Reinitialize starvation death toll each year 20+ bushels per person
allocated for food.

       210 D=0

*** Annual report

       215 PRINT
       216 PRINT
       217 PRINT "HAMURABI
       218   I BEG TO REPORT TO YOU,"
       219 3 Z=Z+1
       220 REM 217-218 ==> 221-222
       221 PRINT "IN YEAR";Z;",";D;" PEOPLE STARVED,";I;" CAME TO THE CITY,"
       222 P=P+I
       227 IF Q>0 THEN 230
       228 P=INT(P/2)
       229 PRINT "A HORRIBLE PLAGUE STRUCK!  HALF THE PEOPLE DIED."
       230 PRINT "POPULATION IS NOW";P
       232 PRINT "THE CITY NOW OWNS ";A;" ACRES."
       235 PRINT "YOU HARVESTED";Y;" BUSHELS PER ACRE."
       250 PRINT "THE RATS ATE";E;" BUSHELS."
       260 PRINT "YOU NOW HAVE ";S;"  BUSHELS IN STORE."
       261  PRINT

Leave main loop after year 11 report.

       270 IF Z=11 THEN 860

*** Orders for coming year

**** Set land price

Land price is a random integer [17,26]

       310 C=INT(10*RND(1))
       311  Y=C+17

**** Land purchase

Purchase acres check: >= 0, <= <grain in storage> / <price>

       312 PRINT "LAND IS TRADING AT";Y;"  BUSHELS PER ACRE."
       320 PRINT "HOW MANY ACRES DO YOU WISH TO BUY";
       321 INPUT Q
       322  IF Q<0 THEN 850
       323 REM 322-324 ==> 324-326
       324 IF Y*Q<=S THEN 330
       325 GOSUB 710
       326 GOTO 320
       330 IF Q=0 THEN 340

Purchase results: Purch. acres added to owned land, grain in storage
reduced by <acres purchased> * <price>

       331 A=A+Q
       332  S=S-Y*Q
       333  C=0
       334 GOTO 400

**** Land sale

Sale acres check: >= 0, < acres owned

       340 PRINT "HOW MANY ACRES DO YOU WISH TO SELL";
       341 INPUT Q
       342  IF Q<0 THEN 850
       343 REM 342-344 ==> 344-346
       344 IF Q<A THEN 350
       345 GOSUB 720
       346 GOTO 340

Sale results: acres owned reduced by acres sold, grain in storage
increased by <acres sold> * <price>

       350 A=A-Q
       351  S=S+Y*Q
       352  C=0

**** Grain for food

Food bsh. check: >= 0, <= grain in storage

       400 PRINT
       410 PRINT "HOW MANY BUSHELS DO YOU WISH TO FEED YOUR PEOPLE";
       411 INPUT Q
       412 IF Q<0 THEN 850
       418 REM *** TRYING TO USE MORE GRAIN THAN IS IN SILOS?
       420 IF Q<=S THEN 430
       421 GOSUB 710
       422 GOTO 410

Food allocation result: grain in storage reduced by food allocation

       430 S=S-Q
       431  C=1

**** Acres to plant

       432  PRINT
       440 PRINT "HOW MANY ACRES DO YOU WISH TO PLANT WITH SEED";

Plant acres check: >= 0, <= acres owned, <= 2 * grain in storage,

       441 INPUT D
       442  IF D=0 THEN 511
       443 REM 442,444-447 ==> 444-448
       444 IF D<0 THEN 850
       445 REM *** TRYING TO PLANT MORE ACRES THAN YOU OWN?
       446 IF D<=A THEN 450
       447 GOSUB 720
       448 GOTO 440
       449 REM *** ENOUGH GRAIN FOR SEED?
       450 IF INT(D/2)<=S THEN 455
       452 GOSUB 710
       453 GOTO 440
       454 REM *** ENOUGH PEOPLE TO TEND THE CROPS?
       455 IF D<10*P THEN 510
       460 PRINT "BUT YOU HAVE ONLY";P;"  PEOPLE TO TEND THE FIELDS!  NOW THEN,"
       470 GOTO 440

*** Determine results for coming year

**** Starvation deaths



       510 S=S-INT(D/2)

**** Grain harvest

       511 GOSUB 800
       512 REM *** A BOUNTIFUL HARVEST!
       515 Y=C
       516  H=D*Y
       517  E=0

**** Loss to rats

       521 GOSUB 800

Rat infestation occurs with 40% chance (C, random [1,5] is even).

       522 IF INT(C/2)<>C/2 THEN 530
       523 REM *** RATS ARE RUNNING WILD!!
       525 E=INT(S/C)
       530 S=S-E+H

**** Population growth

       531 GOSUB 800
       532 REM *** LET'S HAVE SOME BABIES
       533 I=INT(C*(20*A+S)/P/100+1)

**** Food ration population

       539 REM *** HOW MANY PEOPLE HAD FULL TUMMIES?
       540 C=INT(Q/20)

**** Chance of plague

       541 REM *** HORROS, A 15% CHANCE OF PLAGUE
       542 Q=INT(10*(2*RND(1)-.3))

Loop if no starvation deaths

       550 IF P<C THEN 210

*** Collect starvation death statistics

       551 REM *** STARVE ENOUGH FOR IMPEACHMENT?
       552 D=P-C

Impeachment and end game if starvation death toll for year > 45% of
population.

       553  IF D>.45*P THEN 560
       554 REM 553,555 ==> 555-556
       555 P1=((Z-1)*P1+D*100/P)/Z
       556 P=C
       557  D1=D1+D

Loop without reinitializing starvation deaths

       558  GOTO 215

** Subroutines

*** Impeachment before 10th year message (fall-through)

       560 PRINT
       561  PRINT "YOU STARVED";D;"  PEOPLE IN ONE YEAR!!!"

*** Fink-level (1/4) performance message

Avg. annual starvation rate > 33% or acres per person < 7
OR starved more than 45% of pop. in any year (impeachment)

       565 PRINT "DUE TO THIS EXTREME MISMANAGEMENT YOU HAVE NOT ONLY"
       566 PRINT "BEEN IMPEACHED AND THROWN OUT OF OFFICE BUT YOU HAVE"
       567 PRINT "ALSO BEEN DECLARED NATIONAL FINK!!!!"
       568  GOTO 990

*** Attempt to use more grain than in storage message

For land purch., feed people, planting

       710 PRINT "HAMURABI: THINK AGAIN.  YOU HAVE ONLY"
       712 REM 711-712 ==> 713-714
       713 PRINT S;"  BUSHELS OF GRAIN.  NOW THEN,"
       714 RETURN

*** Attempt to use more land than owned message

For land sale, planting

       720 PRINT "HAMURABI
       721   THINK AGAIN.  YOU OWN ONLY";A;" ACRES.  NOW THEN,"
       730 RETURN

*** Set C to random integer [1-5]

       800 C=INT(RND(1)*5)+1
       801 RETURN

*** Negative input error message -> end program

       850 PRINT
       851  PRINT "HAMURABI: I CANNOT DO WHAT YOU WISH."
       855 PRINT "GET YOURSELF ANOTHER STEWARD!!!!!"
       857 GOTO 990

*** Final summary report

       860 PRINT "IN YOUR 10-YEAR TERM OF OFFICE,";P1;" PERCENT OF THE"
       862 PRINT "POPULATION STARVED PER YEAR ON THE AVERAGE, I.E. A TOTAL OF"
       865 PRINT D1;"  PEOPLE DIED!!"

Calculate land acres per person.

       866  L=A/P
       870 PRINT "YOU STARTED WITH 10 ACRES PER PERSON AND ENDED WITH"
       875 PRINT L;"  ACRES PER PERSON."
       876  PRINT

Determine performance level.

       880 IF P1>33 THEN 565
       885 IF L<7 THEN 565
       890 IF P1>10 THEN 940
       892 IF L<9 THEN 940
       895 IF P1>3 THEN 960
       896 IF L<10 THEN 960

*** Charlemagne-level (4/4) performance message

Average starvation deaths per year <= 3% or acres per person >= 10

       900 PRINT "A FANTASTIC PERFORMANCE!!!  CHARLEMANGE, DISRAELI, AND"
       905 PRINT "JEFFERSON COMBINED COULD NOT HAVE DONE BETTER!"
       906 GOTO 990

*** Nero-level (2/4) performance message

Average starvation deaths per year > 10% or acres per person < 9

       940 PRINT "YOUR HEAVY-HANDED PERFORMANCE SMACKS OF NERO AND IVAN IV."
       945 PRINT "THE PEOPLE (REMIANING) FIND YOU AN UNPLEASANT RULER, AND,"
       950 PRINT "FRANKLY, HATE YOUR GUTS!!"
       951 GOTO 990

*** Mid-level (3/4) performance message

Average starvation deaths per year > 3% or acres per person < 9

       960 PRINT "YOUR PERFORMANCE COULD HAVE BEEN SOMEWHAT BETTER, BUT"
       965 PRINT "REALLY WASN'T TOO BAD AT ALL. ";INT(P*.8*RND(1));"PEOPLE"
       970 PRINT "WOULD DEARLY LIKE TO SEE YOU ASSASSINATED BUT WE ALL HAVE OUR"
       975 PRINT "TRIVIAL PROBLEMS."

** Program termination

       990 PRINT
       991  FOR N=1 TO 10
       992  PRINT CHR$(7);
       993 REM 991 ==> 994
       994 NEXT N
       995 PRINT "SO LONG FOR NOW."
       996  PRINT
       999 END