/* Gobierna la antigua Sumeria. Modificado por Mike Arnautov 1975. * Convertido de Basic a PR1ME Fortran (modo 32R) MLA 1979. * Rev.19.1, GGR version 14 Oct 83. MLA * Convertido a ANSI C en Diciembre de 2021. MLA */ #include <stdio.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 ("Por su excesivo corazón y"); if (reason) { printf ("%considerando ", reason == 3 ? 'C' : 'c'); puts ("el desorden en el que ha dejado la ciudad,"); puts ("ha sido comandado a permanecer en el puesto por"); puts ("otros diez años. Que su destino sirva le leccion"); puts ("y advertencia a las generaciones venideras."); } else { puts ("Hamurabe, eres un genio político económico"); puts ("o un bastardo con suerte. Pero para descifrar la cuestión"); puts ("se le ha solicitado que permanezca en el puesto"); puts ("por otros diez años."); } 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 ("Por este desastre administrativo has sido"); puts ("depuesto, flagelado en vida, y decapitado publicamente."); puts ("\nQue Ashtaroth preserve tu Ka.\n"); } else if (abort == 1) { puts ("\nHamurabe: Me encuentro imposibilitado de realizar tu deseo."); puts ("Deberas buscarte otro reino."); } if (abort != 2) puts ("\nQue Baal este contigo.\n"); exit (0); } void think_again (char *what, int quantity) { if (*what == 'l' || *what == 'g') printf ("Hamurabe, piensa mejor. "); if (*what == 'l') printf ("Posees %d hectareas de tierra.", quantity); else if (*what == 'g') printf ("Tienes solo %d carros de grano.", quantity); else printf ("Pero solo tienes %d personas para cultivar los campos.", population); puts (" Entonces,"); } 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, su orden no ha sido comprendida!"); } } 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 a ANSI C: MLA, Feb 2022]\n"); while (1) { printf ("Sabes como jugar? "); 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 ("\nMuy mal!\n"); break; } srand (time (NULL)); *(reply + sizeof (reply) - 1) = '\0'; puts ("Intenta gobernar la antigua Sumeria"); puts ("por un termino de diez años en tu puesto."); 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: Debo reportarle respetuosamente,"); printf ("En el año %d, ", year_abs); if (starved > 0) printf ("%ld", starved); else printf ("no"); printf (" %s hambreados, %ld llegaron a la ciudad.\n", starved <= 1 ? "persona" : "gente", immigration); if (plague >= 0.85) printf ("Una horrible plaga de desato! %d gente ha muerto.\n", plague_deaths); printf ("La población es ahora %ld.\n", population); printf ("La ciudad posee %ld hectareas.\n", acreage); printf ("Cosecho %ld carros por hectarea.\n", yield); printf ("Las ratas comiero %ld carros.\n", rat_food); printf ("Ahora tiene %ld carros en el granero.\n\n", stores); if (year_term == 11) break; rounded_price = price + 0.5; printf ("La tierra se comercia a %ld carros por hectarea.\n\n", rounded_price); while (1) { buy = query ("Cuantas hectareas desea comprar? "); if (rounded_price * buy <= stores) break; think_again ("grano", stores); } if (buy > 0) { acreage += + buy; stores -= rounded_price * buy; transaction = buy; } else { while (1) { sell = query ("Cuantas hectareas deseas vender? "); if (sell <= acreage) break; think_again ("tierra", acreage); } acreage -= sell; stores += rounded_price * sell; transaction = -sell; } putchar ('\n'); while (1) { food = query ("Cuantos carros deseas dar de alimento a tu pueblo? "); if (food <= stores) break; think_again ("grano", stores); } stores -= food; putchar ('\n'); while (1) { plant = query ("Cuantos hectareas deseas plantar con semillas? "); if (plant <= acreage && plant <= 2 * stores && plant <= 10 * population) break; if (plant > acreage) think_again ("tierra", acreage); else if (plant > 2 * stores) think_again ("grano", stores); else think_again ("gente", 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 ("\nHas hambreado %d personas en un año!\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 ("En tu termino de diez años en el puesto %d personas han sido hambreadas.\n", dead_total); printf ("Comenzaste con %0.2f hectareas y terminaste\n", acres_per_init); acres_per_head = (1.0 * acreage) / population; acres_per_init = acres_per_head; printf ("con %0.2f hectareas por persona.\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 ("Su desempeño con mano de hierro insulta a Nabuchodonoser"); puts ("a Asurbanipal II. La población sobreviviente le odia"); puts ("y es probable que su asesinato sea solo cuestión de"); puts ("tiempo."); terminate (0); } puts ("Consecuentemente, ha sido expulsado y puesto en desgracia"); puts ("y solo ha evitado un castigo público por las circunstancias"); puts ("que mitigan la pena. Mientras se ha admitido en privado"); puts ("qye tenía un negocio corrupto"); tmp_int = 3 * rnd(); if (tmp_int == 0) puts ("intente explicar eso a la chusma en busca de chivos expiatorios."); if (tmp_int == 1) puts ("la historia no está interesada en tales ridículas excusas."); if (tmp_int == 2) { puts ("deberia haber considerado tales riegos ocupacionales"); puts ("antes de pedir el puesto."); } terminate (0); if (acres_per_head < 7) { try_again (1); continue; } if (acres_per_head < 9) { puts ("Su actividad ha sido satisfactoria, y en la"); puts ("perspectiva de la historia, ha sido bastante buena."); if (rnd() >= 0.5) { puts ("Podra no ser popualr, pero acompañado por un buen"); puts ("guardaespaldas, no tendra nada por lo que preocuparse."); } 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, su nombre sera recordado a lo largo"); puts ("de la historia venidera con adminarcion y respeto.\n"); puts ("(De modo que se le perdonará!)"); } if (stores > 10 * population) terminate (0); puts ("\n SIN EMBARGO\n\n"); second_term = 0; try_again (2); continue; } }