250 lines
7.3 KiB
C
250 lines
7.3 KiB
C
#include <xolatile/xtandard.c>
|
|
|
|
enum { wheat, gold, wood, stone, resources };
|
|
enum { granary, mine, storehouse, quarry, constructions };
|
|
|
|
enum {
|
|
reply_quit, reply_help, reply_report, reply_status, reply_build, reply_train, reply_trade, reply_plant,
|
|
reply_turn,
|
|
replies
|
|
};
|
|
|
|
static int population = 0;
|
|
static int reputation = 0;
|
|
static int migration = 0;
|
|
|
|
static int resource [resources] = { 0 };
|
|
static int construction [constructions] = { 0 };
|
|
|
|
static char * resource_name [] = { "wheat", "gold", "wood", "stone" };
|
|
static char * construction_name [] = { "granary", "mine", "storehouse", "quarry" };
|
|
|
|
static char * reply_name [] = {
|
|
"quit", "help", "report", "status", "build", "train", "trade", "plant",
|
|
"turn"
|
|
};
|
|
|
|
static char * reply_text [] = {
|
|
"Quit game.",
|
|
"Print reply strings and their explanation, like this one.",
|
|
"Request a report from your court advisors about the state of your fortress.",
|
|
"Request a meeting with lords and merchants about affairs in your fiefdom.",
|
|
"Propose what kind of construction should be built this month to your architect.",
|
|
"Spend more time training with your warriors this entire month.",
|
|
"Discuss what goods should be sold or bought this month with merchant guild.",
|
|
"Order what kind of plants should your peasants harvest this month.",
|
|
"Submit your monthly strategy to the council and wait until next month."
|
|
};
|
|
|
|
static int construction_price [constructions] [resources] = {
|
|
{ 0, 10, 60, 30 },
|
|
{ 0, 120, 60, 10 },
|
|
{ 0, 30, 10, 60 },
|
|
{ 0, 60, 30, 10 }
|
|
};
|
|
|
|
static void separate (void) {
|
|
print ("/0------------------------------------------------------------------------------------------/-\n");
|
|
}
|
|
|
|
static int query (char * names [], int count) {
|
|
char input [1024] = "";
|
|
int index = reply_help;
|
|
|
|
requery: for (index = 0; index < 1024; ++index) {
|
|
in (& input [index], 1);
|
|
|
|
if (input [index] == '\n') {
|
|
break;
|
|
}
|
|
}
|
|
|
|
input [index] = '\0';
|
|
|
|
for (index = 0; index < count; ++index) {
|
|
if (string_compare (input, names [index]) == true) {
|
|
return (index);
|
|
}
|
|
}
|
|
|
|
print ("Incorrect /1reply/-, type '/4help/-' to list replies or look at message above.\n");
|
|
|
|
goto requery;
|
|
}
|
|
|
|
static void print_help (void) {
|
|
int index;
|
|
|
|
for (index = 0; index < replies; ++index) {
|
|
print ("/4%s/- /0<>/- %s\n", reply_name [index], reply_text [index]);
|
|
}
|
|
|
|
separate ();
|
|
}
|
|
|
|
static void print_resources (void) {
|
|
int index;
|
|
|
|
for (index = 0; index < resources; ++index) {
|
|
if (resource [index] == 0) {
|
|
print ("You don't have any /1%s/-.\n", resource_name [index]);
|
|
} else if (resource [index] == 1) {
|
|
print ("You have /41/- unit of /4%s/-.\n", resource_name [index]);
|
|
} else {
|
|
print ("You have /4%i/- units of type /4%s/-.\n", resource [index], resource_name [index]);
|
|
}
|
|
}
|
|
|
|
separate ();
|
|
}
|
|
|
|
static void print_constructions (void) {
|
|
int index;
|
|
|
|
for (index = 0; index < constructions; ++index) {
|
|
if (construction [index] == 0) {
|
|
print ("You don't have any construction of type /1%s/-.\n", construction_name [index]);
|
|
} else if (construction [index] == 1) {
|
|
print ("You have /41/- construction of type /4%s/-.\n", construction_name [index]);
|
|
} else {
|
|
print ("You have /4%i/- constructions of type /4%s/-.\n", construction [index], construction_name [index]);
|
|
}
|
|
}
|
|
|
|
separate ();
|
|
}
|
|
|
|
static void print_statistics (void) {
|
|
print ("Reputation = %i\n", reputation);
|
|
print ("Migration = %i\n", migration);
|
|
print ("Population = %i\n", population);
|
|
|
|
separate ();
|
|
}
|
|
|
|
static void build_construction (void) {
|
|
int index;
|
|
int reply;
|
|
|
|
for (index = 0; index < constructions; ++index) {
|
|
int price;
|
|
|
|
print ("/0->/- build /4%s/- (", construction_name [index]);
|
|
|
|
for (price = 0; price < resources; ++price) {
|
|
if (construction_price [index] [price] > 0) {
|
|
print ("%s ", resource_name [price]);
|
|
print ((resource [price] < construction_price [index] [price]) ? "/1" : "/2");
|
|
print ("%i/-", construction_price [index] [price]);
|
|
}
|
|
|
|
if ((price > 0) && (price < resources - 1)) {
|
|
print (", ");
|
|
}
|
|
}
|
|
|
|
print (");\n");
|
|
}
|
|
|
|
separate ();
|
|
|
|
reply = query (construction_name, constructions);
|
|
|
|
separate ();
|
|
|
|
for (index = 0; index < resources; ++index) {
|
|
if (resource [index] < construction_price [reply] [index]) {
|
|
print ("You don't have enough /1%s/-, need /1%i/- more.\n", resource_name [index], construction_price [reply] [index] - resource [index]);
|
|
print ("Your architect humbly refused to build /1%s/-.\n", construction_name [reply]);
|
|
separate ();
|
|
return;
|
|
}
|
|
}
|
|
|
|
for (index = 0; index < resources; ++index) {
|
|
resource [index] -= construction_price [reply] [index];
|
|
}
|
|
|
|
construction [reply] += 1;
|
|
|
|
print ("Construction of /2%s/- was completed successfully.\n", construction_name [reply]);
|
|
|
|
separate ();
|
|
}
|
|
|
|
static void compute_turn (void) {
|
|
char * problem [] = { "rats", "thieves", "rotting", "cracking" };
|
|
|
|
int index;
|
|
|
|
print ("Your strategy has been submitted to the council, now you can only wait...\n");
|
|
print ("One month later, your advisor brings your short report on activities in your fortress.\n");
|
|
|
|
for (index = 0; index < resources; ++index) {
|
|
int gained = construction [index] * 20;
|
|
int lost = random (1, 10);
|
|
|
|
resource [index] += gained - lost;
|
|
|
|
print ("Your fortress gained /2%i/- units of %s, but lost /1%i/- due to %s.\n", gained, resource_name [index], lost, problem [index]);
|
|
}
|
|
|
|
reputation += random (-3, 3) + resource [gold] / 120 + resource [wheat] / 60;
|
|
migration = random (0, 6) - resource [wheat] / 120;
|
|
population += migration;
|
|
resource [wheat] -= population / 3;
|
|
resource [gold] -= ((reputation < 0) ? -reputation : reputation) / 3;
|
|
|
|
print ("Beside that, /1%i/- units of wheat was spent on feeding the people.\n", population / 3);
|
|
print ("Also, only /1%i/- gold was spent inside castle.\n", ((reputation < 0) ? -reputation : reputation) / 3);
|
|
|
|
separate ();
|
|
}
|
|
|
|
int main (void) {
|
|
int index;
|
|
int reply;
|
|
|
|
reputation = random (0, 10);
|
|
migration = random (0, 10);
|
|
population = random (6, 12) * 20 + migration;
|
|
|
|
for (index = 0; index < resources; ++index) {
|
|
resource [index] = random (6, 12) * 20;
|
|
}
|
|
|
|
for (index = 0; index < constructions; ++index) {
|
|
construction [index] = random (1, 2);
|
|
}
|
|
|
|
separate ();
|
|
|
|
print ("/0-- Xerbia is clone of /7Sumerian Game/0, made for fun in readable and formatted ANSI C./-\n");
|
|
print ("/0-- Original game was designed by /7Mabel Addis/0 and programmed by /7William McKay/0 in 1964./-\n");
|
|
print ("/0-- /-\n");
|
|
print ("/0-- /4Ognjen 'xolatile' Milan Robovic/-\n");
|
|
|
|
for (reply = reply_help; reply != reply_quit; reply = query (reply_name, replies)) {
|
|
separate ();
|
|
|
|
switch (reply) {
|
|
case reply_help: print_help (); break;
|
|
case reply_report: print_resources (); break;
|
|
case reply_status: print_statistics (); break;
|
|
case reply_build: build_construction (); break;
|
|
case reply_turn: compute_turn (); break;
|
|
default: break;
|
|
}
|
|
}
|
|
|
|
separate ();
|
|
|
|
print_constructions ();
|
|
|
|
print ("/0The end!/-\n");
|
|
|
|
separate ();
|
|
|
|
return (log_success);
|
|
}
|