From 8c67d3079586762f8cab3f455219ea901074c6f6 Mon Sep 17 00:00:00 2001
From: cyan <>
Date: Sat, 28 Nov 2009 05:57:14 +0000
Subject: [PATCH] * Moved in from exec

---
 xtrn/kingdom/kingdom.js | 453 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 453 insertions(+)
 create mode 100644 xtrn/kingdom/kingdom.js

diff --git a/xtrn/kingdom/kingdom.js b/xtrn/kingdom/kingdom.js
new file mode 100644
index 0000000000..8d3c164285
--- /dev/null
+++ b/xtrn/kingdom/kingdom.js
@@ -0,0 +1,453 @@
+/* $Id$
+
+   Kingdom Gold - Ported to JavaScript by Randolph E. Sommerfeld <sysop@rrx.ca>
+
+   A simple game based on 'Sumer Game' or 'Hamurabi'
+   This software is released into the public domain.
+*/
+
+/* Constants */
+const QUIT = -1;
+const CR = -2;
+
+console.clear();
+
+printf("\r\n\r\n");
+printf("\1gWelcome to \1h\1yKingdom Gold\1n\1g v0.9b, ");
+printf("a simple door game for Synchronet BBS.\r\n\r\n");
+
+printf("This game was ported by Randy E. Sommerfeld from original ");
+printf("Commodore 64 software\r\n");
+printf("found to be in the public domain.  Hence, this game is also ");
+printf("released into the\r\n");
+printf("public domain.  The original 'Kingdom' game was released in ");
+printf("1973 by T. Voros\r\n");
+printf("and L. Schneider for the 8K Commodore PET.  That game was ");
+printf("based on a game\r\n");
+printf("called 'Sumer Game', created by Richard Merrill in 1969, and ");
+printf("is one of the\r\n");
+printf("oldest computer games in existence.\r\n");
+
+printf("\r\n");
+printf("You can press 'Q' at any prompt to exit the game.\r\n");
+
+printf("\r\n\r\n");
+
+var instr=(console.noyes("\1n\1mWould you like instructions"));
+if (!instr)
+	instructions();
+
+/* Globals */
+citizens = random(75)+75;
+acres = random(250)+250;
+bushels = random(3000)+2000;
+year = 0;
+price = 3;
+/* End Globals */
+
+var game_over = false;
+
+while (!game_over) {
+	console.clear();
+	printf("\r\n\r\n\1n\1g");
+
+	if (!year)
+		printf("In the beginning of your reign:");
+	else
+		printf("Report for \1h\1gYear %d\1n", year);
+	printf("\r\n\r\n");
+
+	printf("\1n\1g    Citizens in your kingdom: \1h\1y%d\r\n", citizens);
+	printf("\1n\1g         Acres of land owned: \1h\1y%d\r\n", acres);
+	printf("\1n\1g Bushels of grain in storage: \1h\1y%d\r\n", bushels);
+
+	printf("\r\n");
+
+	printf("\1n\1gThe price of land is \1h\1y%d\1n\1g ", price);
+	printf("bushels per acre.\r\n");
+
+	printf("\r\n");
+
+	var maxacres = Math.round((bushels/price)-1);
+	if (maxacres < 0)
+		maxacres = 0;
+	var buyacres = get_input("\1n\1mHow many acres to buy "
+		+ "[\1h\1y" + maxacres + "\1n\1m]? ", maxacres);
+	if (buyacres == QUIT)
+		break;
+	acres += buyacres;
+	bushels -= buyacres * price;
+
+	if (buyacres <= 0) {
+		var sellacres = get_input("\1n\1mHow many acres to sell "
+			+ "[\1h\1y" + acres + "\1n\1m]? ",acres);
+		if (sellacres == QUIT)
+			break;
+		acres -= sellacres;
+		bushels += sellacres * price;
+	}
+
+	printf("\r\n");
+
+	if ( (buyacres > 0) || (sellacres > 0) ) {
+		printf("\1n\1h\1cTransaction Results:\1n\r\n");
+		printf("\1n\1g    You now own \1h\1y%d\1n\1g acres of land, and "
+			,acres);
+		printf("\1h\1y%d\1n\1g bushels of grain.\r\n",bushels);
+		printf("\r\n");
+	}
+
+	var feed = get_input("\1n\1mHow many bushels of grain to feed to \1h\1y"
+		+ citizens + "\1n\1m people [\1h\1y" + bushels + "\1n\1m]? ",bushels);
+	if (feed == QUIT)
+		break;
+	bushels -= feed;
+
+	var bushels_for_seeding = Math.round(bushels / 3);
+	var citizens_for_seeding = Math.round(citizens / 2);
+	var max_seed = citizens_for_seeding;
+	if (bushels_for_seeding < citizens_for_seeding)
+		max_seed = bushels_for_seeding;
+	max_seed = Math.round(max_seed-1);
+	if (max_seed < 0)
+		max_seed = 0;
+	printf("\r\n");
+	seedacres = get_input("\1n\1mHow many acres do you wish to seed [\1h\1y"
+		+ max_seed + "\1n\1m]? ",max_seed);
+	if (seedacres == QUIT)
+		break;
+	bushels -= seedacres * 3;
+
+	printf("\r\n");
+	printf("\1n\1h\1cProduction Costs:\1n\r\n");
+	printf("\1g    A total of \1n\1h\1y%d\1n\1g ", seedacres);
+	printf("acres of land have been planted.\r\n");
+	printf("\r\n");
+
+	console.pause();
+
+	year++;
+
+	var arrived = 0;
+	var starving = Math.round(citizens - (feed/10));
+	var died = 0;
+
+	if (starving > 0) {
+		food_riots(starving);
+	} else if (starving < 0) {
+		arrived += food_surplus(starving);
+		starving = 0;
+	}
+
+	if ((random(100) - 10) <= 0)
+		died += plague();
+
+	if ((random(100) - 10) <= 0)
+		died += huns();
+		
+	if ((random(100) - 15) <= 0)
+		arrived += border_expansion();
+
+	citizens = citizens + arrived - died - starving;
+
+	if (citizens <= 0) {
+		console.clear();
+		printf("\r\n\r\n");
+		printf("\1h\1rDisaster!\1n\r\n\r\n");
+		printf("\1gThe population went zip!\r\n");
+		break;
+	}
+
+	var change = arrived - died - starving;
+
+	console.clear();
+	printf("\r\n\r\n\1n\1g");
+
+	printf("\1n\1h\1cVital Statistics:\1n\r\n");
+	printf("\1g    Births and Immigration: \1n\1h\1y%d\1n\r\n", arrived);
+	printf("\1g          Starved to Death: \1n\1h\1y%d\1n\r\n", starving);
+    printf("\1g    Died of Natural Causes: \1n\1h\1y%d\1n\r\n", died);
+	printf("\r\n");
+	printf("\1g             Census Change: \1n\1h");
+	if (change >= 0)
+		printf("\1g+");
+	else
+		printf("\1r");
+	printf("%d\1n\r\n\r\n",change);
+	console.pause();
+
+	if ((random(100) - 10) <= 0)
+		theft();
+
+	if ((random(100) - 10) <= 0)
+		earthquake();
+
+	if ((random(100) - 15) <= 0)
+		grain_shipment();
+
+	if ((random(100) - 15) <= 0)
+		drought();
+
+	if ((random(100) - 15) <= 0)
+		rain();
+
+	var hbush = price * seedacres;
+	var rats = Math.round(random(hbush/2));
+	var hnet = hbush - rats;
+
+	if (hnet > 0) {
+		printf("\1n\1h\1cHarvest Results:\1n\r\n");
+		printf("\1g           The Harvest Was: \1n\1h\1y%d\1n\1g ",price);
+		printf("bushels per planted acre.\r\n");
+		printf("\1g            For a Total of: \1n\1h\1y%d\1n\1g bushels.\r\n"
+			,hbush);
+		printf("\1g              Lost to Rats: \1n\1h\1y%d\1n\1g bushels.\r\n"
+			,rats);
+		printf("\r\n");
+		printf("\1g     Total Net Harvest Was: \1n\1h\1g%d\1n\1g bushels.\r\n"
+			,hnet);
+
+		bushels += hnet;
+
+		console.pause();
+	}
+}
+
+printf("\1n\1gYour reign lasted \1h\1y%d\1n\1g year", year);
+if (year != 1)
+	printf("s");
+printf(".\r\n\r\n");
+exit();
+
+/* End of main() */
+
+function border_expansion() {
+	console.clear();
+	printf("\r\n\r\n");
+
+	printf("\1h\1gBorder Expansion\1n\r\n\r\n");
+
+	var cit_gain = random(20)+10;
+	var acre_gain = random(citizens+250)+50;
+
+	acres += acre_gain;
+
+	printf("\1n\1gPopulation increase! ");
+	printf("You gained %d citizens and %d acres of land.\r\n"
+		,cit_gain,acre_gain);
+
+	printf("\r\n\r\n");
+	console.pause();
+
+	return(cit_gain);
+}
+
+function drought() {
+	console.clear();
+	printf("\r\n\r\n");
+
+	printf("\1h\1rDrought\1n\r\n\r\n");
+
+	price = random(3)+7;
+
+	printf("\1n\1g%d weeks of no water ",0);
+	printf("and the river is dry like the moat!\r\n");
+
+	printf("\r\n\r\n");
+	console.pause();
+}
+
+function earthquake() {
+	console.clear();
+	printf("\r\n\r\n");
+
+	printf("\1h\1rEarthquake!\1n\r\n\r\n");
+
+	var destroyed = Math.round(random(acres/10) + (acres/20));
+
+	printf("\1n\1g%d acres of land destroyed.\r\n",destroyed);
+
+	printf("\r\n\r\n");
+	console.pause();
+}
+
+function food_riots(starving) {
+	if ( (random(100) - (5*(starving-2))) > 0 )
+		return 0; /* No Riot */
+
+	console.clear();
+	printf("\r\n\r\n");
+
+	printf("\1h\1rFood Riots\1n\r\n\r\n");
+
+	var lost = Math.round(random( (starving * bushels) / (2 * citizens) ));
+	bushels -= lost;
+
+	printf("\1n\1g%d bushels of food lost.\r\n",lost);
+
+	printf("\r\n\r\n");
+	console.pause();
+}
+
+function food_surplus(starving) {
+	console.clear();
+	printf("\r\n\r\n");
+
+	printf("\1h\1gFood Surplus!\1n\r\n\r\n");
+
+	var increase = Math.round(random(3 - (starving/2)));
+
+	printf("\1gPopulation increase of \1h\1y%d\1n\1g.\r\n", increase);
+
+	printf("\r\n\r\n");
+	console.pause();
+
+	return(increase);
+}
+
+function grain_shipment() {
+	console.clear();
+	printf("\r\n\r\n");
+
+	printf("\1h\1gGrain Shipment Arrives!\1n\r\n\r\n");
+
+	var shipment = Math.round(random(100+(acres/100))+500);
+
+	printf("The shipment contains %d bushels of grain.\r\n",shipment);
+
+	bushels += shipment;
+	price = random(2)+1;
+
+	printf("\r\n\r\n");
+	console.pause();
+}
+
+function huns() {
+	console.clear();
+	printf("\r\n\r\n");
+
+	printf("\1h\1rHun Pillage!\1n\r\n\r\n");
+
+	var lost_cits = Math.round(random(citizens/5) + (citizens/5));
+	var lost_bush = Math.round(random(bushels/20) + (bushels/20));
+	var lost_acre = Math.round(random(acres/50));
+
+	bushels -= lost_bush;
+	acres -= lost_acre;
+
+	printf("\1n\1g%d citizens killed, %d bushels taken, %d acres destroyed.\r\n"
+		,lost_cits,lost_bush,lost_acre);
+
+	printf("\r\n\r\n");
+	console.pause();
+
+	return(lost_cits);
+}
+
+function plague() {
+	console.clear();
+	printf("\r\n\r\n");
+
+	printf("\1h\1rPlague\1n\r\n\r\n");
+
+	var died = Math.round((citizens/3) + random((citizens/2)+2));
+
+	printf("\1n\1gIn memory of the %d citizens who died in the plague.\r\n",died);
+
+	printf("\r\n\r\n");
+	console.pause();
+
+	return(died);
+}
+
+function rain() {
+	console.clear();
+	printf("\r\n\r\n");
+
+	printf("\1h\1gRain\1n\r\n\r\n");
+
+	price = random(4)+3;
+
+	printf("\1n\1gYour kingdom is blessed with %d days of rain.\r\n",price-3);
+
+	printf("\r\n\r\n");
+	console.pause();
+}
+
+function theft() {
+	console.clear();
+	printf("\r\n\r\n");
+
+	printf("\1h\1rTheft!\1n\r\n\r\n");
+
+	var stolen = Math.round(random(bushels/20) + (bushels/20));
+
+	printf("\1n\1g%d bushels of grain were stolen!\r\n",stolen);
+
+	bushels -= stolen;
+
+	printf("\r\n\r\n");
+	console.pause();
+}
+
+function get_input(str,max) {
+	var valid_keys = "0123456789";
+	var input_is_valid = false;
+	var myinput = "";
+	var myinput_int = 0;
+	while (!input_is_valid) {
+		printf("%s", str);
+		myinput = console.getstr("", 5);
+		if (myinput == "")
+			return max;
+		var fc = myinput[0].toUpperCase();
+		if ( (fc == "Q") || (fc == "X") )
+			return QUIT;
+		for (k in myinput) {
+			var myregexp = new RegExp('['+ myinput[k] +']', "g");
+			if (!valid_keys.match(myregexp)) {
+				break;
+			} else if (k == myinput.length-1) {
+				myinput_int = parseInt(myinput);
+				if ( (myinput_int < max) && (myinput_int > -1) )
+					input_is_valid = true;
+			}
+		}
+	}
+	return parseInt(myinput_int);
+}
+
+function instructions() {
+	console.clear();
+	printf("\r\n\r\n\1n\1g");
+	printf("In this game, you control a kingdom with three major resources:");
+	printf("\r\n    \1h\1yBUSHELS\1n\1g of food, used to feed your citizens ");
+	printf("and barter with other kingdoms\r\n");
+	printf("            to buy more acres of land.");
+	printf("\r\n      \1h\1yACRES\1n\1g of land, which you will use to grow ");
+	printf("bushels of food.  Land can also\r\n");
+	printf("            be traded to other kingdoms for bushels.");
+	printf("\r\n   \1h\1yCITIZENS\1n\1g, who work your acres of land.");
+	printf("\r\n\r\n");
+	printf("The object of the game is twofold: retain as many citizens and ");
+	printf("resources as\r\n");
+	printf("possible while making your kingdom last as long as it possibly ");
+	printf("can.  Natural\r\n");
+	printf("disasters, barbarian raids, fluctuating land prices, and citizen ");
+	printf("revolts will\r\n");
+	printf("make this somewhat difficult.\r\n");
+	printf("\r\n");
+	printf("Numbers to remember are that it takes a minimum of 10 bushels of ");
+	printf("food to feed\r\n");
+	printf("one citizen per year.  Optimally, a citizen should be fed 20 ");
+	printf("bushels of food\r\n");
+	printf("per year to encourage population growth.  An acre requires a ");
+	printf("minimum of 3\r\n");
+	printf("bushels to 'seed' properly for growth, and a single citizen is ");
+	printf("capable of\r\n");
+	printf("seeding 2 acres of land per year.  Starving your population will ");
+	printf("cause riots.\r\n");
+	printf("\r\n");
+	printf("Good luck!\r\n\r\n\1p");
+}
+
-- 
GitLab