/*    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;
   }
}