home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume13 / dominion / part14 / construct.c next >
C/C++ Source or Header  |  1992-02-11  |  7KB  |  293 lines

  1. /* construct.c -- routines dealing with construction */
  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. #include "army.h"
  27. #include "costs.h"
  28. #include "cur_stuff.h"
  29.  
  30. #include <stdio.h>
  31. #include <math.h>
  32.  
  33. extern Suser user;
  34. extern Sworld world;
  35. extern char help_tag[];
  36. extern WINDOW * sectw;
  37.  
  38. extern int (*wrapx)(), (*wrapy)();
  39.  
  40.   /* construct a constructible object */
  41. construct()
  42. {
  43.   WINDOW *cw;
  44.   char c;
  45.   int done=0;
  46.   Snation *np = user.np;
  47.   Ssector *sp =  &world.map[user.cursor.x][user.cursor.y];
  48.  
  49.   strcpy(help_tag, "Construction");
  50.  
  51.   if (user.xmode) {
  52.     cw = NULL;
  53.   } 
  54.   else {
  55.     cw = newwin(6, COLS/2+18, LINES-11, COLS/4-16);
  56.   }
  57.  
  58.   while (!done) {
  59.     if (cw != NULL) {
  60.       statline("", "construct");
  61.       mvwprintw(cw, 1, 1, "What type of object do you want to construct? ");
  62.       mvwprintw(cw, 2, 1, " [f]ortification, [r]oads, [b]ubble");
  63.       wmove(cw, 3, 1);
  64.       wclrtobot(cw);
  65.       box(cw, '|', '-');
  66.       wrefresh(cw);
  67.     }
  68.     else {            /* expert mode */
  69.       statline_prompt ("Construct: (f,r,b)", "construct");
  70.     }
  71.  
  72.     switch (c = mygetch()) {
  73.     case 'f':
  74.       construct_fortification(np, sp, cw);
  75.       break;
  76.     case 'r':
  77.       construct_roads(np, sp, cw);
  78.       break;
  79.     case 'b':
  80.       construct_bubble(np, sp, cw);
  81.       break;
  82.     case ' ':
  83.       done = 1;
  84.       break;
  85.     default:
  86.       break;
  87.     }
  88.   }
  89.  
  90.   if (cw != NULL) {
  91.     wrefresh(cw);
  92.     delwin(cw);
  93.   }
  94.  
  95.   touch_all_wins();
  96.   statline2("", "");
  97.   show_armies(sp);
  98.   return 1;
  99. }
  100.  
  101.   /* build fortification on a sector */
  102. construct_fortification(np, sp, w)
  103.      Snation *np;
  104.      Ssector *sp;
  105.      WINDOW *w;
  106. {
  107.   int fort_increase, ret, cost, cost_met;
  108.   char s[EXECLEN];
  109.   char c;
  110.  
  111.   if (sp->owner != user.id) {
  112.     statline2_err("hit space to go on", "hey dude, this sector is not yours");
  113.     return -1;
  114.   }
  115.   cost = (int) (pow(2.0, (double) sp->defense/10)*FORT_COST_MONEY);
  116.   cost_met = (int) (pow(2.0, (double) sp->defense/10)*FORT_COST_METAL);
  117.  
  118.   if (w != NULL) {
  119.     mvwprintw(w, 3, 1, "Current fort %d; cost for 10 more: %d sk., %d met.",
  120.           sp->defense, cost, cost_met);
  121.     mvwprintw(w, 4, 1, "Build ten more (y/n)? ");
  122.     box(w, '|', '-');
  123.     wrefresh(w);
  124.   }
  125.   else {
  126.     sprintf (s, "Current: %d, Cost +10 = %d sk., %d met. Build? ",
  127.          sp->defense, cost, cost_met);
  128.     statline2 (s, "con_fort");
  129.   }
  130.  
  131.   if ((c = getch()) != 'y' && c != 'Y') {
  132.     statline2 ("", "");
  133.     return -1;
  134.   }
  135.   if (w == NULL) {
  136.     statline2 ("", "");
  137.   }
  138.   fort_increase = 10;
  139.     /* now see if we can afford the construction */
  140.   if (cost > user.np->money) {
  141.     statline2_err("space to go on", "not enough money to construct");
  142.     return -1;
  143.   }
  144.   if (cost_met > user.np->metal) {
  145.     statline2_err("space to go on", "not enough metal to construct");
  146.     return -1;
  147.   }
  148.  
  149.   /* if we have reached this point, it means we can construct! */
  150.  
  151.   sp->defense += fort_increase;
  152.   np->money -= cost;
  153.   np->metal -= cost_met;
  154.     /* now prepare the exec string */
  155.   sprintf(s, "CFORT_SECTOR:%d:%d:%d\n", sp->loc.x, sp->loc.y, fort_increase);
  156.   gen_exec(s);
  157.   cmoney(np, -cost);
  158.   cmetal(np, -cost_met);
  159.  
  160.   return 1;
  161. }
  162.   /* build roads on a sector */
  163. construct_roads(np, sp, w)
  164.      Snation *np;
  165.      Ssector *sp;
  166.      WINDOW *w;
  167. {
  168.   int roads_increase, ret, cost, cost_met;
  169.   char s[EXECLEN];
  170.   char c;
  171.  
  172.   if (sp->owner != user.id) {
  173.     statline2_err("hit space to go on", "hey dude, this sector is not yours");
  174.     return -1;
  175.   }
  176.   cost = (int) (pow(2.0, (double) sp->roads)*ROADS_COST_MONEY);
  177.   cost_met = (int) (pow(2.0, (double) sp->roads)*ROADS_COST_METAL);
  178.  
  179.   if (w != NULL) {
  180.     mvwprintw(w, 3, 1,
  181.           "Current roads %d; cost %d sk., %d met.", sp->roads, cost, cost_met);
  182.     mvwprintw(w, 4, 1, "Build one more (y/n)? ");
  183.     box(w, '|', '-');
  184.     wrefresh(w);
  185.   }
  186.   else {
  187.     sprintf (s, "Current: %d, Cost +1 = %d sk., %d met. Build? ",
  188.          sp->roads, cost, cost_met);
  189.     statline2 (s, "con_roads");
  190.   }
  191.   if ((c = getch()) != 'y' && c != 'Y') {
  192.     statline2 ("", "");
  193.     return -1;
  194.   }
  195.  
  196.   if (w == NULL) {
  197.     statline2 ("", "");
  198.   }
  199.  
  200.   roads_increase = 1;
  201.     /* now see if we can afford the construction */
  202.   if (roads_increase*cost > user.np->money) {
  203.     statline2_err("space to go on", "not enough money to construct");
  204.     return -1;
  205.   }
  206.   if (roads_increase*cost_met > user.np->metal) {
  207.     statline2_err("space to go on", "not enough metal to construct");
  208.     return -1;
  209.   }
  210.  
  211.   /* if we have reached this point, it means we can construct! */
  212.  
  213.   sp->roads += roads_increase;
  214.   np->money -= roads_increase*cost;
  215.   np->metal -= roads_increase*cost_met;
  216.     /* now prepare the exec string */
  217.   sprintf(s, "CROADS_SECTOR:%d:%d:%d\n", sp->loc.x, sp->loc.y, roads_increase);
  218.   gen_exec(s);
  219.   cmoney(np, -roads_increase*cost);
  220.   cmetal(np, -roads_increase*cost_met);
  221.  
  222.   return 1;
  223. }
  224.  
  225.   /* build a bubble on a sector; allowing a
  226.      race to live in a sector below (or above)
  227.      water, when they normally could not.
  228.    */
  229. construct_bubble(np, sp, w)
  230.      Snation *np;
  231.      Ssector *sp;
  232.      WINDOW *w;
  233. {
  234.   int ret, cost, cost_met;
  235.   char s[EXECLEN];
  236.   char c;
  237.  
  238.   if (sp->owner != user.id) {
  239.     statline2_err("hit space to go on", "Hey dude, this sector is not yours");
  240.     return -1;
  241.   }
  242.   if (has_bubble(sp)) {
  243.     statline2_err("hit space to go on", "There already is a bubble!");
  244.   }
  245.   cost = BUBBLE_COST;
  246.   cost_met = BUBBLE_COST_METAL;
  247.  
  248.   if (w != NULL) {
  249.     mvwprintw(w, 3, 1, "Cost %d sk., %d met.", cost, cost_met);
  250.     mvwprintw(w, 4, 1, "Go ahead (y/n)? ");
  251.     box(w, '|', '-');
  252.     wrefresh(w);
  253.   }
  254.   else {
  255.     sprintf (s, "Cost = %d sk., %d met. Build? ",
  256.          cost, cost_met);
  257.     statline2 (s, "con_bubble");
  258.   }
  259.   if ((c = getch()) != 'y' && c != 'Y') {
  260.     statline2 ("", "");
  261.     return -1;
  262.   }
  263.   if (w == NULL) {
  264.     statline2 ("", "");
  265.   }
  266.  
  267.     /* now see if we can afford the construction */
  268.   if (cost > user.np->money) {
  269.     beep();
  270.     statline2_err("space to go on", "not enough money to construct");
  271.     return -1;
  272.   }
  273.   if (cost_met > user.np->metal) {
  274.     beep();
  275.     statline2_err("space to go on", "not enough metal to construct");
  276.     return -1;
  277.   }
  278.  
  279.   /* if we have reached this point, it means we can construct! */
  280.  
  281.   sp->flags |= SF_BUBBLE;
  282.   np->money -= cost;
  283.   np->metal -= cost_met;
  284.     /* now prepare the exec string */
  285.   sprintf(s, "FLAG_SET_SECTOR:%d:%d:%d\n", sp->loc.x, sp->loc.y, SF_BUBBLE);
  286.   gen_exec(s);
  287.   cmoney(np, -cost);
  288.   cmetal(np, -cost_met);
  289.  
  290.   return 1;
  291. }
  292.  
  293.