home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume13 / dominion / part27 / techno.c < prev    next >
C/C++ Source or Header  |  1992-02-11  |  5KB  |  179 lines

  1.   /* techno.c -- updates technology for a nation in dominion */
  2.  
  3. /*
  4.  * Copyright (C) 1990 Free Software Foundation, Inc.
  5.  * Written by the dominion project.
  6.  *
  7.  * This file is part of dominion.
  8.  *
  9.  * dominion is free software; you can redistribute it and/or
  10.  * modify it under the terms of the GNU General Public License as published
  11.  * by the Free Software Foundation; either version 1, or (at your option)
  12.  * any later version.
  13.  *
  14.  * This software is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this software; see the file COPYING.  If not, write to
  21.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  22.  */
  23.  
  24. #include "dominion.h"
  25. #include "misc.h"
  26.  
  27. #include <stdio.h>
  28. #include <math.h>
  29.  
  30. extern int debug;
  31. extern Suser user;
  32.  
  33. #define METAL_TECH_POWER (3.0/4.0)
  34.  
  35.   /* this routine calculates the new tech_skill for a nation */
  36. new_tech_skill(np)
  37.      Snation *np;
  38. {
  39.   int increase;
  40.  
  41.   increase =
  42.     (int) (((np->race.intel + univ_intel(np)) / 100.0) *
  43.        (sqrt(1.0 * (calc_revenue(np)*np->tech_r_d/100.0 +
  44.             np->money * np->cur_tech_r_d / 100))
  45.         * TECH_MONEY_FACTOR +  pow((double)(calc_metal (np) *
  46.              (np->tech_r_d_metal / 100.0) + np->metal * 
  47.               np->cur_tech_r_d_metal / 100),METAL_TECH_POWER) 
  48.                * TECH_METAL_FACTOR));
  49.   return np->tech_skill + increase;
  50. }
  51.  
  52.   /* this routine sees if the user should get a new
  53.      technology level, by comparing its old and new tech skills
  54.    */
  55. get_new_techno(np, old_skill, new_skill, mailfile)
  56.      Snation *np;
  57.      int old_skill, new_skill;
  58.      FILE *mailfile;
  59. {
  60.   FILE *fp, *fopen();
  61.   int level;
  62.   char name[NAMELEN], line[EXECLEN], execstr[EXECLEN];
  63.   int done = 0;
  64.  
  65.   if ((fp = fopen(TECHNO_FILE, "r")) == NULL) {
  66.     printf("could not open technology file %s\n", TECHNO_FILE);
  67.     return -1;
  68.   }
  69.  
  70.   while (!done) {
  71.     if (fgets(line, EXECLEN, fp) == NULL) {
  72.       done = 1;
  73.       break;            /* we are done */
  74.     }
  75.     if (line[0] != '#') {
  76.       sscanf(line, "%s%d", name, &level);
  77.       if (debug) {
  78.     printf("name = <%s>, level = %d\n", name, level);
  79.       }
  80.       if ((level > old_skill) && (level <= new_skill)) {
  81.     if (debug) {
  82.       printf("deserves a new tech: old_skill=%d, new_skill=%d\n",
  83.          old_skill, new_skill);
  84.     }
  85.     if (mailfile) fprintf(mailfile,
  86.         "You get technology power <%s>, level %d, which gives you:\n",
  87.         name, level);
  88.     get_tech_entry(fp, np, mailfile);
  89.       } else {
  90.     skip_tech_entry(fp);
  91.       }
  92.     }
  93.   }
  94.   fclose(fp);
  95. }
  96.  
  97.   /* read in a specific tech entry, delimited by begin
  98.      and end, and add it to the nation's ability.  this routine
  99.      should only be called if the nation *deserves* the new tech
  100.      power.
  101.    */
  102. get_tech_entry(fp, np, mailfile)
  103.      FILE *fp;
  104.      Snation *np;
  105.      FILE *mailfile;
  106. {
  107.   char line[EXECLEN], *line2;
  108.   struct argument exec_args[N_EXEC_ARGS];
  109.  
  110.   do {
  111.     fgets(line, EXECLEN, fp);
  112.   } while ((strlen(line) == 0) && (line[0] == '#')); /* skip blank lines */
  113.   if (strncmp(line, "begin", strlen("begin")) != 0) {
  114.     printf("syntax error:  did not find a begin\n");
  115.   } else {
  116.     if (debug) {
  117.       printf("got a begin\n");
  118.     }
  119.   }
  120.   for (;;) {
  121.     fgets(line, EXECLEN, fp);
  122.     if (line[strlen(line)-1] == '\n') {
  123.       line[strlen(line)-1] = '\0';
  124.     }
  125.     line2 = line;
  126.     while (*line2 == ' ') {    /* skip spaces at start */
  127.       ++line2;
  128.     }                /* now line2 is ready for exec parsing */
  129.     if (strncmp(line2, "end", strlen("end")) == 0) {
  130.       if (debug) {
  131.     printf("got an end\n");
  132.       }
  133.       break;
  134.     }
  135.       /* if that was not the end, we can parse the exec command */
  136.     if (debug) {
  137.       printf("line = <%s>, line2 = <%s>, ABOUT TO PARSE\n", line, line2);
  138.     }
  139.     if (mailfile) fprintf(mailfile, "%s\n", line);
  140.     if (line2[0] != '#') {
  141.       parse_exec_line(line2, exec_args);
  142.       run_exec_line(np, exec_args);
  143.     }
  144.   }
  145. }
  146.  
  147.   /* wait for an "end" in the techno file */
  148. skip_tech_entry(fp)
  149.      FILE *fp;
  150. {
  151.   char line[EXECLEN];
  152.   do {
  153.     fgets(line, EXECLEN, fp);
  154.   } while (strncmp(line, "end", strlen("end")) != 0);
  155. }
  156.  
  157.   /* this is the routine actually called by the update program */
  158. dotechno(np, mailfile)
  159.      Snation *np;
  160.      FILE *mailfile;
  161. {
  162.   int old_skill, new_skill;
  163.  
  164.   old_skill = np->tech_skill;
  165.   new_skill = new_tech_skill(np);
  166.  
  167.   if (debug) {
  168.     printf("nation %s has old_skill = %d, new_skill = %d\n",
  169.        np->name, old_skill, new_skill);
  170.   }
  171.   if (mailfile) fprintf(mailfile,
  172.     "Your skill in technology has increased from %d to %d\n",
  173.     old_skill, new_skill);
  174.   get_new_techno(np, old_skill, new_skill, mailfile);
  175.   np->tech_skill = new_skill;    /* save the change */
  176.  
  177. /*  np->tech_skill = 0; */
  178. }
  179.