Skip to content

Instantly share code, notes, and snippets.

@Pygmalion69
Created April 27, 2018 14:03
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Pygmalion69/a35f2892897cfe83dd74d0d662126af1 to your computer and use it in GitHub Desktop.
Save Pygmalion69/a35f2892897cfe83dd74d0d662126af1 to your computer and use it in GitHub Desktop.
/* Govern ancient Sumeria. Heavily modified by Mike Arnautov 1975.
* Converted from Basic to PR1ME Fortran (mode 32R) MLA 1979.
* Rev.19.1, GGR version 14 Oct 83. MLA
* Converted to ANSI C December 2001. MLA
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
int year_term;
int year_abs;
int percent_starved;
int dead_total;
int starved;
int population;
char reply [160];
void try_again (int reason)
{
if (reason == 1)
puts ("For the extreme folly of soft - heartedness and");
if (reason)
{
printf ("%considering ", reason == 3 ? 'C' : 'c');
puts ("the mess you would leave the city in,");
puts ("you are hereby commanded to remain in office for");
puts ("another ten years. May your fate be a lesson and");
puts ("a warning for generations to come.");
}
else
{
puts ("Hamurabe, you are either a politico-economic genius");
puts ("or just a lucky bastard. There being but one way to");
puts ("settle the question, you are hereby requested to stay");
puts ("in office for another ten years.");
}
year_term = 0;
year_abs--;
percent_starved = starved * 100.0 / population;
dead_total = starved;
}
float rnd (void)
{
return ((rand () % 1000) / 1000.0);
}
int iabs (int value)
{
return ((value >= 0) ? value : -value);
}
void terminate (int abort)
{
if (abort == 2)
{
puts ("For this extreme mismanagement you have been");
puts ("deposed, flayed alive and publicly beheaded.");
puts ("\nMay Ashtaroth preserve your Ka.\n");
}
else if (abort == 1)
{
puts ("\nHamurabe: I find myself unable to fulfil your wish.");
puts ("You will have to find yourself another kingdom.");
}
if (abort != 2)
puts ("\nMay Baal be with you.\n");
exit (0);
}
void think_again (char *what, int quantity)
{
if (*what == 'l' || *what == 'g')
printf ("Hamurabe, think again. ");
if (*what == 'l')
printf ("You own %d acres of land.", quantity);
else if (*what == 'g')
printf ("You have only %d bushels of grain.", quantity);
else
printf ("But you only have %d people to tend the fields.", population);
puts (" Now then,");
}
int query (char *prompt)
{
while (1)
{
int sign;
int value;
char * cptr;
printf (prompt);
fgets (reply, sizeof (reply) - 1, stdin);
value = 0;
sign = 1;
cptr = reply;
while (*cptr == ' ' || *cptr == '\t') cptr++;
if (*cptr == '-')
{
cptr++;
sign = -1;
}
if (*cptr == 'q' || *cptr == 'Q')
terminate (1);
while (*cptr && *cptr != '\n')
{
if (*cptr >= '0' && *cptr <= '9')
value = 10 * value + *cptr - '0';
else if (*cptr == '.')
break;
else if (*cptr != '.')
{
sign = 0;
break;
}
cptr++;
}
if (sign)
return (sign * value);
puts ("Hamurabe, your command has not been understood!");
}
}
int main ()
{
int acreage;
int immigration;
int second_term;
int dead_total;
int stores;
int harvest;
int rat_food;
int yield;
int rounded_price;
int sell;
int buy;
int plant;
int food;
int transaction;
int rats;
int plague_deaths;
int survived;
int dead_rats;
int tmp_int;
float price;
float breadline;
float provisions;
float plague;
float acres_per_head;
float acres_per_init;
float stores_per_head;
float rats_ate;
float rat_log;
float percent_starved;
float tmp_float;
printf ("[Sumeria (Primos) rev.19.1, GGR (MLA) version 14 Oct 83]\n");
puts ("[Conversion to ANSI C: MLA, Feb 2002]\n");
while (1)
{
printf ("Do you know how to play? ");
fgets (reply, sizeof(reply) - 1, stdin);
if (*reply == '\n') break;
*reply += (*reply < 'a') ? 'a' - 'A' : 0;
if (*reply == 'y') break;
if (*reply != 'n' && *reply != 'q') continue;
puts ("\nToo bad!\n");
break;
}
srand (time (NULL));
*(reply + sizeof (reply) - 1) = '\0';
puts ("Try your hand at governing ancient Sumeria");
puts ("for a ten year term of office.");
second_term = 0;
dead_total = 0;
percent_starved = 0;
year_term = 0;
year_abs = 0;
acres_per_init = 10;
population = 100;
stores = 2800;
harvest = 3000;
rat_food = 200;
yield = 3;
acreage = 1000;
immigration = 5;
transaction = 0;
price = 18 + 6 * rnd ();
breadline = 19 + 4 * rnd ();
provisions = breadline;
rats = 1000;
rat_log = 3;
plague = rnd () / 2;
starved = 0;
year_term = year_abs = 9;
while (1)
{
while (1)
{
year_term++;
year_abs++;
putchar ('\n');
acres_per_head = ((float) acreage) / population;
stores_per_head = ((float) stores) /population;
puts ("Hamurabe: I beg to report to you,");
printf ("In year %d, ", year_abs);
if (starved > 0)
printf ("%ld", starved);
else
printf ("no");
printf (" %s starved, %ld came to the city.\n",
starved <= 1 ? "person" : "people", immigration);
if (plague >= 0.85)
printf ("A horrible plague struck! %d people died.\n",
plague_deaths);
printf ("Population is now %ld.\n", population);
printf ("The city owns %ld acres.\n", acreage);
printf ("You harvested %ld bushels per acre.\n", yield);
printf ("Rats ate %ld bushels.\n", rat_food);
printf ("You now have %ld bushels in store.\n\n", stores);
if (year_term == 11)
break;
rounded_price = price + 0.5;
printf ("Land is trading at %ld bushels per acre.\n\n", rounded_price);
while (1)
{
buy = query ("How many acres do you wish to buy? ");
if (rounded_price * buy <= stores)
break;
think_again ("grain", stores);
}
if (buy > 0)
{
acreage += + buy;
stores -= rounded_price * buy;
transaction = buy;
}
else
{
while (1)
{
sell = query ("How many acres do you wish to sell? ");
if (sell <= acreage)
break;
think_again ("land", acreage);
}
acreage -= sell;
stores += rounded_price * sell;
transaction = -sell;
}
putchar ('\n');
while (1)
{
food = query ("How many bushels do you wish to feed your people? ");
if (food <= stores)
break;
think_again ("grain", stores);
}
stores -= food;
putchar ('\n');
while (1)
{
plant = query ("How many acres do you wish to plant with seed? ");
if (plant <= acreage && plant <= 2 * stores &&
plant <= 10 * population)
break;
if (plant > acreage)
think_again ("land", acreage);
else if (plant > 2 * stores)
think_again ("grain", stores);
else
think_again ("people", population);
}
stores -= plant / 2;
yield = 4 * rnd() + 1.65;
harvest = plant * yield;
rat_food = 0;
rats_ate = stores * (rat_log - 2.2) / 3.6;
dead_rats = rats - 4 * rats_ate;
rats = 3 * rats;
if (dead_rats > 0) rats = rats - dead_rats;
if (plague >= 0.3)
{
if (plague >= 0.85)
{
if (plague > 1) plague = 1;
rats = 500 + 5000 * (plague - 0.7);
}
else
rats *= 1.225 - 0.75 * plague;
}
if (rats < 500)
rats = 500;
rat_food = rats / 4;
if (rats_ate < rat_food)
rat_food = rats_ate;
rat_food *= 7;
if (rat_food <= 20)
rat_food = 20 + 30 * rnd();
stores += harvest - rat_food;
rat_log = log10 (1.0 * rats);
if (stores + stores <= harvest)
{
rat_food = harvest * (1 + rnd()) / 4.0;
stores = harvest - rat_food;
}
tmp_int = 100 + iabs (100 - population);
immigration = tmp_int * ((acres_per_head +
stores_per_head - 36) / 250.0 +
(provisions - breadline + 2.5) / 40) + .5;
if (immigration <= 0)
immigration = 5 * rnd() + 1;
survived = food / breadline;
provisions = (1.0 * food) / population;
plague = (2 * rnd() + rat_log - 3) / 3.0;
if (population < survived)
survived = population;
else
{
starved = population - survived;
if (starved >= 0.45 * population)
{
printf ("\nYou starved %d people in one year!\n", starved);
terminate (2);
}
percent_starved = ((year_term - 1) * percent_starved +
100.0 * starved / population) / year_term;
population = survived;
dead_total += starved;
}
population += immigration;
price = (price + 15 + (stores_per_head - acres_per_head) / 3) / 2 +
transaction / 50 + 3 * rnd() - 2;
if (price <1.0) price = 1.0;
if (plague >= 0.85)
{
plague_deaths = population * (0.429 * plague - 0.164);
population -= plague_deaths;
}
}
printf ("In your ten year term of office %d people starved.\n",
dead_total);
printf ("You started with %0.2f acres per person and ended\n",
acres_per_init);
acres_per_head = (1.0 * acreage) / population;
acres_per_init = acres_per_head;
printf ("with %0.2f acres per person.\n\n", acres_per_head);
tmp_float = 10 * acres_per_head / 3;
if (percent_starved > 25)
terminate (2);
if (percent_starved <= 7)
{
try_again (1);
continue;
}
if (tmp_float < 7)
terminate (2);
if (tmp_float > 10)
{
puts ("Your heavy handed performance smacks of Nabuchodonoser");
puts ("and Asurbanipal II. The surviving populace hates your");
puts ("guts and your eventual assasination is just a matter of");
puts ("time.");
terminate (0);
}
puts ("Consequently you have been deposed and disgraced");
puts ("and only avoided a public punishment because");
puts ("of mitigating circumstances. While it may be");
puts ("admitted in private that you had a rotten deal");
tmp_int = 3 * rnd();
if (tmp_int == 0)
puts ("try explaining that to a mob looking for scape-goats.");
if (tmp_int == 1)
puts ("history is not interested in such petty excuses.");
if (tmp_int == 2)
{
puts ("you should have considered such occupational hazards");
puts ("before applying for the job.");
}
terminate (0);
if (acres_per_head < 7)
{
try_again (1);
continue;
}
if (acres_per_head < 9)
{
puts ("Your performance has been satisfactory and, in the");
puts ("perspective of history, actually quite good.");
if (rnd() >= 0.5)
{
puts ("You may not be exactly popular, but given a good");
puts ("body-guard there is nothing to be really worried about.");
}
else
{
puts ("While not exactly loved, you are at least respected.");
puts ("What more can a realistic ruler ask for?");
}
}
else if (second_term == 0)
if (second_term == 0)
{
if (stores <= 10 * population)
{
try_again (3);
continue;
}
second_term = 1;
try_again (0);
continue;
}
else
{
puts ("Hamurabe, your name will be remembered through the");
puts ("ages to come with admiration and respect.\n");
puts ("(So you did get away with it you lucky sod!)");
}
if (stores > 10 * population)
terminate (0);
puts ("\n HOWEVER\n\n");
second_term = 0;
try_again (2);
continue;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment