Initial upload of work-in-progress
This commit is contained in:
parent
4b8f4ee834
commit
2824e22b26
201
hammurabi.c
Normal file
201
hammurabi.c
Normal file
@ -0,0 +1,201 @@
|
||||
/*
|
||||
* hammurabi - ancient Sumerian city-state resource management game
|
||||
*
|
||||
* Copyright 2020 David Meyer <papa@sdf.org> +JMJ
|
||||
*
|
||||
*/
|
||||
#include <u.h>
|
||||
#include <libc.h>
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define MAXYEARS 10
|
||||
#define INITPOP 100
|
||||
#define INITGRAIN 2800
|
||||
#define INITLAND 1000
|
||||
|
||||
typedef enum {FALSE, TRUE} Boolean;
|
||||
|
||||
char MSGDIV[] =
|
||||
"------------------------------<<<<>>>>-----------------------------------\n";
|
||||
|
||||
char MSGHELP[] =
|
||||
"Help text here\n\
|
||||
Land price varies between 17 and 26 bushels of grain per acre.\n\
|
||||
Planting two acres requires one bushel of grain.\n\
|
||||
One person can farm ten acres of land.\n\
|
||||
One person needs to eat 20 bushels of grain per year to stay healthy.\n\
|
||||
";
|
||||
|
||||
char MSGSPLASH[] =
|
||||
" ___ ___ ___. .__ \n\
|
||||
/ | \\_____ _____ _____ __ ______________ \\_ |__ |__|\n\
|
||||
/ ~ \\__ \\ / \\ / \\| | \\_ __ \\__ \\ | __ \\| |\n\
|
||||
\\ Y // __ \\| Y Y \\ Y Y \\ | /| | \\// __ \\| \\_\\ \\ |\n\
|
||||
\\___|_ /(____ /__|_| /__|_| /____/ |__| (____ /___ /__|\n\
|
||||
\\/ \\/ \\/ \\/ \\/ \\/ \n\
|
||||
,.__.,\n\
|
||||
/,',.`.\\\n\
|
||||
____|:|db|:|____\n\
|
||||
___//\"\"\"|:|88|:|\"\"\"\\\\___\n\
|
||||
_____//\":=_=_=_=|--|=_=_=_=:\"\\\\_____\n\
|
||||
__/.-._//__|L_L_L_L|--|L_L_L_L|__\\\\_.-.\\__\n\
|
||||
//\"||m|:.-. .-. .-.,.__.,.-. .-. .-.:|m||\"\\\\\n\
|
||||
// ||8||: : L_L_L_/.',.`.\\_L_L_L : :||8|| \\\\\n\
|
||||
/'=======\"L.='.::'`:|:|db|:|:'`::.`=.L\"=======`\\\n\
|
||||
| .---. .--. |_:==' |:|88|:| `==:_| .--. .---. |\n\
|
||||
| | : |_.='/=======|:--:|=======\\`=._| : | |\n\
|
||||
| | _,=' ||==.=.==|:--:|==.=.==|| `=._ | |\n\
|
||||
|_:='_______|| || || |:--:| || || ||_______`=:_|\n\
|
||||
|| || || |:--:| || || ||\n\
|
||||
''-------|:--:|-------''\n\
|
||||
':==:'\n\
|
||||
";
|
||||
|
||||
#define MAXHONOR 9
|
||||
char *HONORIFIC[] = {"Great", "Mighty", "Wise", "Benevolent", "Merciful", "Just", "Sublime",
|
||||
"Glorious", "Serene", "Majestic"};
|
||||
|
||||
Boolean planyear(void);
|
||||
void printgreeting(void);
|
||||
void printlandprice(void);
|
||||
void printstatus(void);
|
||||
void printyearrept(void);
|
||||
Boolean scanyes(char *prompt);
|
||||
void setlandprice(void);
|
||||
|
||||
int Year = 0;
|
||||
int Population = INITPOP;
|
||||
int Grain = INITGRAIN;
|
||||
int Land = INITLAND;
|
||||
|
||||
int consctl;
|
||||
|
||||
int foodgrain, landsale, plantland;
|
||||
|
||||
int harvyield, landprice, newpop, plaguedeath, popfed, ratgrain, starvedeath, starvepct, year;
|
||||
|
||||
int totstarved = 0, totstarvepct = 0;
|
||||
|
||||
void
|
||||
main(void)
|
||||
{
|
||||
consctl = open("/dev/consctl", OWRITE);
|
||||
if(consctl == -1) exits("can't open consctl: %r\n");
|
||||
srand(time(0));
|
||||
|
||||
print(MSGSPLASH);
|
||||
if(scanyes("Would you like instructions?") == TRUE) print(MSGHELP);
|
||||
|
||||
printgreeting();
|
||||
printstatus();
|
||||
setlandprice();
|
||||
printlandprice();
|
||||
|
||||
for(year = 1; year <= MAXYEARS; ++ year)
|
||||
{
|
||||
if(planyear() == TRUE)
|
||||
{
|
||||
Grain = Grain + (landsale * landprice) - (plantland / 2) - foodgrain;
|
||||
Land = Land - landsale;
|
||||
|
||||
harvyield = nrand(5) + 1;
|
||||
switch(nrand(5)+1)
|
||||
{
|
||||
case 1:
|
||||
ratgrain = Grain;
|
||||
break;
|
||||
case 3:
|
||||
ratgrain = Grain / 3;
|
||||
break;
|
||||
case 5:
|
||||
ratgrain = Grain / 5;
|
||||
break;
|
||||
default:
|
||||
ratgrain = 0;
|
||||
}
|
||||
Grain = Grain + (plantland * harvyield) - ratgrain;
|
||||
|
||||
newpop = (nrand(5) + 1) * (20 * Land + Grain) / Population / 100 + 1;
|
||||
popfed = foodgrain / 20;
|
||||
starvedeath = ((popfed < Population) ? (Population - popfed) : 0);
|
||||
totstarved = totstarved + starvedeath;
|
||||
starvepct = 100 * starvedeath / Population;
|
||||
totstarvepct = totstarvepct + starvepct;
|
||||
Population = Population + newpop - starvedeath;
|
||||
plaguedeath = ((nrand(100) < 15) ? (Population / 2) : 0);
|
||||
Population = Population - plaguedeath;
|
||||
|
||||
/* impeachement check */
|
||||
|
||||
printgreeting();
|
||||
printyearrept();
|
||||
}
|
||||
else break;
|
||||
}
|
||||
print("The end\n");
|
||||
exits(0);
|
||||
}
|
||||
|
||||
Boolean
|
||||
planyear(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
printgreeting(void)
|
||||
{
|
||||
print(MSGDIV);
|
||||
print("O %s One, I beg to report,\n", HONORIFIC[nrand(MAXHONOR + 1)]);
|
||||
}
|
||||
|
||||
void
|
||||
printlandprice(void)
|
||||
{
|
||||
print("The price of land is %d bushels of grain per acre.\n", landprice);
|
||||
}
|
||||
|
||||
void
|
||||
printstatus(void)
|
||||
{
|
||||
print("The population is %d.\n", Population);
|
||||
print("You own %d acres.\n", Land);
|
||||
print("You have %d bushels of grain.\n", Grain);
|
||||
}
|
||||
|
||||
void
|
||||
printyearrept(void)
|
||||
{
|
||||
print("In Year %d,\n", year);
|
||||
print("%d bushels were harvested per acre, for a total harvest of %d bushels.\n",
|
||||
harvyield, plantland * harvyield);
|
||||
if(ratgrain > 0) print("Rats ate %d bushels of grain.\n", ratgrain);
|
||||
if(newpop > 0) print("The population increased by %d.\n", newpop);
|
||||
|
||||
}
|
||||
|
||||
Boolean
|
||||
scanyes(char *prompt)
|
||||
{
|
||||
int in = 0;
|
||||
|
||||
if(write(consctl, "rawon", 5) != 5) exits("\ncan't turn off echo\n");
|
||||
while(in != 'y' && in != 'n')
|
||||
{
|
||||
print("%s [y/n] ", prompt);
|
||||
in = getchar();
|
||||
if(in == EOF) exits("\nerror reading terminal input\n");
|
||||
print("%c\n", in);
|
||||
}
|
||||
if(write(consctl, "rawoff", 6) != 6) exits("\ncan't turn on echo\n");
|
||||
print("\n");
|
||||
return (in == 'y' ? TRUE : FALSE);
|
||||
}
|
||||
|
||||
void
|
||||
setlandprice(void)
|
||||
{
|
||||
landprice = nrand(10) + 17;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user