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

  1. /* budget.c -- modify budget, etc. */
  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 <stdio.h>
  27. #include <ctype.h>
  28.  
  29. extern Sworld world;
  30. extern Suser user;
  31. extern WINDOW *sectw;
  32. extern char *libdir;
  33. extern char help_tag[];
  34. #ifdef BSD
  35.  extern char current_dir[];
  36. #else /* BSD */
  37.  extern char *current_dir;
  38. #endif
  39.  
  40. #define ALL_CUR_PER (np->cur_tech_r_d + np->cur_mag_r_d + np->cur_spy_r_d)
  41. #define ALL_NEXT_PER (np->mag_r_d + np->spy_r_d + np->charity + np->tech_r_d)
  42.  
  43. /* char budget_report (Snation *); */
  44.  
  45. /* Internal functions, should NOT be called outside of this file */
  46.  
  47. /* do_tech_budget (WINDOW *, Snation *); */
  48. /* do_magic_budget (WINDOW *, Snation *); */
  49. /* void storage_budget (Snation *); */
  50.  
  51. /* a nation's budget report */
  52.  
  53. char budget_report(np)
  54.      Snation *np;
  55. {
  56.   WINDOW *w;
  57.   char s[EXECLEN];
  58.   char c, spych;
  59.   int new_value, done = 0, percent_expend, ret, got=0, bad_number;
  60.   int semidone = 0, tmp;
  61.   FILE *diplock;
  62.  
  63.   strcpy(help_tag, "Budget Report");
  64.   strcpy(s, "");
  65.  
  66.   w = newwin(LINES-2, COLS, 0, 0); /* full screen */
  67.  
  68.   touchwin(w);
  69.   while (!done) {
  70.     semidone = 0;
  71.     bad_number = 0;
  72.     statline("type space when done, or F to dump to a file", "budget_report");
  73.     statline2("","");
  74.  
  75.     draw_budget_screen (w, np);
  76.  
  77.     got = 0;
  78.     do {
  79.       c = getch();
  80.     } while (strchr(" stTMSFipndL?", c) == NULL && c != CTL('L'));
  81.     switch (c) {
  82.     case ' ':
  83.     case 'i':
  84.     case 'p':
  85.     case 'n':
  86.     case 'd':
  87.       done = 1;
  88.       break;
  89.     case 's':
  90.       storage_budget (np);
  91.       draw_budget_screen (w, np);
  92.       semidone = 1;
  93.       break;
  94.     case 'T':
  95.       do_tech_budget (w, np);
  96.       draw_budget_screen (w, np);
  97.       semidone = 1;
  98.       break;
  99.     case 'M':
  100.       do_magic_budget (w, np);
  101.       draw_budget_screen (w, np);
  102.       semidone = 1;
  103.       break;
  104.     case CTL('L'):
  105.       wclear (w);
  106.       draw_budget_screen (w, np);
  107.       semidone = 1;
  108.       break;
  109.     case 'F':
  110.       /* should also give thon in default file name */
  111.       dump_current_screen(w, "budget_report");
  112.       break;
  113.     case '?':
  114.       online_info();
  115.       break;
  116.     default:
  117.       break;
  118.     }
  119.     
  120.     if (!done && !semidone) {
  121.       /* here prepare for getting the new value */
  122.       wmove(w, LINES-3, 0);
  123.       wclrtoeol(w);
  124.       mvwprintw(w, LINES-3, 0, "      give new value: ");
  125.  
  126.       ret = wget_number(w, &new_value);
  127.       if (ret > 0) {    /* only do this if the user actually gave a number */
  128.     if (new_value < 0 || new_value > 100) {
  129.       statline2_err ("Bad value for a percentage (hit space)", "");
  130.     } else {
  131.       strcpy(s, "");
  132.  
  133.       switch (c) {
  134.       case 't':
  135.         np->taxes = new_value;
  136.         sprintf(s, "TAXRATE:%d\n", np->taxes);
  137.         break;
  138. /* Charity doesn't work right now... */
  139. /*      case 'c':
  140.         np->charity = n;
  141.         sprintf(s, "CHARITY:%d\n", n);
  142.         break;
  143. */
  144.       case 'S':
  145.         if (next_thon_money (np) >= 0) {
  146.           np->spy_r_d = new_value;
  147.           sprintf (s, "SPYR&Dmoney:%d\n", new_value);
  148.         }
  149.         else bad_number = 1;
  150.         break;
  151.       default:
  152.         bad_number = 1;
  153.         break;
  154.       }
  155.       if (bad_number) {
  156.         statline2_err ("hit space", "bad number");
  157.       }        
  158.       else gen_exec(s);
  159.     }
  160.       }
  161.     }
  162.   }
  163.   delwin(w);
  164.  
  165.   return c;
  166. }
  167.  
  168. /* Does the sub-budget for magic */
  169.  
  170. do_magic_budget (w, np)
  171.  
  172. WINDOW * w;
  173. Snation * np;
  174. {
  175.   char ch;
  176.   int new_value;
  177.   char exec [EXECLEN];
  178.   int bad_number = 0;
  179.   int old_value_tmp;
  180.  
  181.   wmove (w, LINES-3, 0);
  182.   wclrtoeol (w);
  183.   mvwprintw (w, LINES-3, 0, "Change %% of [M]oney or [j]ewels invested?");
  184.   wrefresh (w);
  185.   ch = getch ();
  186.  
  187.   if (strchr ("Mj", ch) == NULL) { ; }
  188.   else {
  189.     mvwprintw (w, LINES-3, 0, " enter new value (as %%): ");
  190.     wclrtoeol (w);
  191.     wrefresh (w);
  192.     
  193.     if (wget_number (w, &new_value) <= 0) {
  194.       bad_number = 1;
  195.     }
  196.      
  197.     if (new_value > 100 || new_value < 0) {
  198.       bad_number = 1;
  199.     }
  200.  
  201.     /* What I do next is simple - calc_expend uses np->mag_r_d(_jewels)
  202.        to calculate jewels, so I save the old value of np->mag_r_d
  203.        and then copy the new value in, and if the new value is too
  204.        large, then copy the old value back in. This way, you can change
  205.        calc_expend however you want to, and it will work */    
  206.  
  207.     switch (ch) {
  208.     case 'j':
  209.       old_value_tmp = np->mag_r_d_jewels; /* Do the old swaperoo */
  210.       np->mag_r_d_jewels = new_value;
  211.  
  212.       if (next_thon_jewels(np) >= 0 && !bad_number) {
  213.     sprintf (exec, "MAGR&Djewels:%d\n", np->mag_r_d_jewels);
  214.     gen_exec (exec);
  215.       }
  216.       else { bad_number = 1; np->mag_r_d_jewels = old_value_tmp; }
  217.       break;
  218.     case 'M':
  219.       old_value_tmp = np->mag_r_d; /* Do the old swaperoo! */
  220.       np->mag_r_d = new_value;
  221.  
  222.       if (next_thon_money(np) >= 0 && !bad_number &&
  223.       ALL_NEXT_PER <= 100) {      
  224.     sprintf (exec, "MAGR&Dmoney:%d\n", np->mag_r_d);
  225.     gen_exec (exec);
  226.     break;
  227.       }
  228.       else { bad_number = 1; np->mag_r_d = old_value_tmp; }
  229.       break;
  230.     default:
  231.       break;
  232.     }
  233.     if (bad_number) {  /* Print an error message if it was a bad number */
  234.       statline2_err ("hit space", "bad number");
  235.     }
  236.   }
  237. }
  238.  
  239. do_tech_budget (w, np)
  240.  
  241. WINDOW * w;
  242. Snation * np;
  243. {
  244.   char ch;
  245.   int new_value;
  246.   char exec [EXECLEN];
  247.   int bad_number = 0;
  248.   int old_value_tmp;
  249.  
  250.   wmove (w, LINES-3, 0);
  251.   wclrtoeol (w);
  252.   mvwprintw (w, LINES-3, 0, "Change %% of [M]oney or [m]etal invested?");
  253.   wrefresh (w);
  254.   ch = getch ();
  255.  
  256.   if (strchr ("Mm", ch) == NULL) { ; }
  257.   else {
  258.     mvwprintw (w, LINES-3, 0, " enter new value (as %%): ");
  259.     wclrtoeol (w);
  260.     wrefresh (w);
  261.  
  262.     if (wget_number (w, &new_value) <= 0) {
  263.       bad_number = 1;
  264.     }
  265.     
  266.     if (new_value > 100 || new_value < 0) {
  267.       bad_number = 1;
  268.     }
  269.  
  270.     /* What I do next is simple - calc_expend uses np->mag_r_d(_jewels)
  271.        to calculate jewels, so I save the old value of np->mag_r_d
  272.        and then copy the new value in, and if the new value is too
  273.        large, then copy the old value back in. This way, you can change
  274.        calc_expend however you want to, and it will work */    
  275.  
  276.     switch (ch) {
  277.     case 'm':
  278.       old_value_tmp = np->tech_r_d_metal; /* Do the old swaperoo */
  279.       np->tech_r_d_metal = new_value;
  280.  
  281.       if (next_thon_metal(np) >= 0 && !bad_number) {
  282.     sprintf (exec, "TECHR&Dmetal:%d\n", np->tech_r_d_metal);
  283.     gen_exec (exec);
  284.       }
  285.       else { bad_number = 1; np->tech_r_d_metal = old_value_tmp; }
  286.       break;
  287.     case 'M':
  288.       old_value_tmp = np->tech_r_d; /* Do the old swaperoo! */
  289.       np->tech_r_d = new_value;
  290.  
  291.       if (next_thon_money(np) >= 0 && !bad_number &&
  292.       ALL_NEXT_PER <= 100) {
  293.     sprintf (exec, "TECHR&Dmoney:%d\n", np->tech_r_d);
  294.     gen_exec (exec);
  295.     break;
  296.       }
  297.       else { bad_number = 1; np->tech_r_d = old_value_tmp; }
  298.       break;
  299.     default:
  300.       break;
  301.     }
  302.     if (bad_number) {  /* Print an error message if it was a bad number */
  303.       statline2_err ("hit space", "bad number");
  304.     }
  305.   }
  306. }
  307.  
  308. /* */
  309.  
  310. draw_budget_screen (w, np)
  311.  
  312. WINDOW * w;
  313. Snation * np;
  314. {
  315.   char s [EXECLEN];
  316.  
  317.   sprintf(s, "Budget Report for Nation %s", np->name);
  318.  
  319.   wmove(w, 0, (COLS-strlen(s))/2); /* make the string centered */
  320.   wstandout(w);
  321.   waddstr (w, s);
  322.   wclrtoeol(w);
  323.   wstandend(w);
  324.  
  325.       /* now a tedious list of stuff */
  326.   wclrtobot(w);
  327.   mvwprintw(w, 2, 0, "  Item");
  328.   mvwprintw(w, 3, 0, "--------");
  329.   mvwprintw(w, 2, COLS/5-2, "This Thon (%d)", world.turn);
  330.   mvwprintw(w, 3, COLS/5-2, "---------", world.turn);
  331.   mvwprintw(w, 2, (2*COLS)/5-3, "Revenue");
  332.   mvwprintw(w, 3, (2*COLS)/5-3, "-------");
  333.   mvwprintw(w, 2, (3*COLS)/5, "Expenditure");
  334.   mvwprintw(w, 3, (3*COLS)/5, "-----------");
  335.   mvwprintw(w, 2, (4*COLS)/5, "Next Thon (%d)", world.turn + 1);
  336.   mvwprintw(w, 3, (4*COLS)/5, "---------", world.turn + 1);
  337.   mvwprintw(w, 4, 0, "Treasury");
  338.   mvwprintw(w, 5, 0, "Metal");
  339.   mvwprintw(w, 6, 0, "Jewels");
  340.   mvwprintw(w, 7, 0, "Food");
  341.   /* this turn */
  342.   mvwprintw(w, 4, COLS/5-2, "%d", user.init_money);
  343.   mvwprintw(w, 5, COLS/5-2, "%d", user.init_metal);
  344.   mvwprintw(w, 6, COLS/5-2, "%d", user.init_jewels);
  345.   mvwprintw(w, 7, COLS/5-2, "%d", user.init_food);
  346.  
  347.   /* revenue */
  348.   mvwprintw(w, 4, (2*COLS)/5-3, "%d (%d%% tax)        ",
  349.         calc_revenue(np), np->taxes);
  350.   mvwprintw(w, 5, (2*COLS)/5-3, "%d   ", calc_metal(np));
  351.   mvwprintw(w, 6, (2*COLS)/5-3, "%d   ", calc_jewels(np));
  352.   mvwprintw(w, 7, (2*COLS)/5-3, "%d   ", calc_food(np));
  353.  
  354.   /* expenses */
  355.   mvwprintw(w, 4, (3*COLS)/5, "%d    ",
  356.         calc_expend(np) + user.init_money - np->money +
  357.         (cur_expend(np)));
  358.   mvwprintw(w, 5, (3*COLS)/5, "%d    ",
  359.         calc_expend_metal(np) + user.init_metal - np->metal
  360.         + cur_expend_metal(np));
  361.   mvwprintw(w, 6, (3*COLS)/5, "%d    ",
  362.         calc_expend_jewels(np) + user.init_jewels - np->jewels
  363.         + cur_expend_jewels(np));
  364.   mvwprintw(w, 7, (3*COLS)/5, "%d    ",
  365.         calc_expend_food(np) + user.init_food - np->food);
  366.  
  367.   /* next turn */
  368.   mvwprintw(w, 4, (4*COLS)/5, "%d    ",
  369.         next_thon_money(np));
  370.   mvwprintw(w, 5, (4*COLS)/5, "%d    ",
  371.         next_thon_metal(np));
  372.   mvwprintw(w, 6, (4*COLS)/5, "%d    ",
  373.         next_thon_jewels(np));
  374.   mvwprintw(w, 7, (4*COLS)/5, "%d    ",
  375.         np->food + calc_food(np) - calc_expend_food(np));
  376.  
  377.  
  378.   /* now for the modifiable stuff */
  379.   strcpy(s, "**Breakdown of Expenditures**");
  380.   mvwaddstr(w, 9, (COLS-strlen(s))/2, s);
  381.   
  382.   mvwprintw(w, 11, 0, "MONEY:");
  383.   mvwprintw(w, 11, 8, "Charity:     %3d%% -> %d      ",
  384.         np->charity, (np->charity*calc_revenue(np))/100);
  385.   mvwprintw(w, 12, 8, "Tech R&D:    %3d%% -> %d      ",
  386.         np->tech_r_d, ((np->tech_r_d*calc_revenue(np)) / 100));
  387.   mvwprintw(w, 13, 8, "Magic R&D:   %3d%% -> %d      ",
  388.         np->mag_r_d, np->mag_r_d*calc_revenue(np)/100);
  389.   mvwprintw(w, 14, 8, "Spy R&D:     %3d%% -> %d      ",
  390.         np->spy_r_d, (np->spy_r_d * calc_revenue (np)) / 100);
  391.   mvwprintw(w, 15, 8, "Storage use: %3d%% -> %d",
  392.         (np->cur_tech_r_d + np->cur_mag_r_d + np->cur_spy_r_d),
  393.         (np->cur_tech_r_d + np->cur_mag_r_d + np->cur_spy_r_d) *
  394.         np->money / 100);
  395.   mvwprintw(w, 16, 8, "Military maint.:     %d      ", military_maint(np));
  396.   mvwprintw(w, 17, 8, "Other:               %d      ",
  397.         user.init_money + non_profit_maint(np) - np->money);
  398.  
  399.   mvwprintw(w, 11, COLS/2, "METAL:");
  400.   mvwprintw(w, 11, COLS/2+8, "Tech R&D:    %3d%% -> %d    ",
  401.         np->tech_r_d_metal, ((np->tech_r_d_metal*calc_metal(np))/100));
  402.   mvwprintw(w, 12, COLS/2+8, "Storage use: %3d%% -> %d",
  403.         np->cur_tech_r_d_metal,
  404.         (np->cur_tech_r_d_metal * np->metal) / 100);        
  405.   mvwprintw(w, 13, COLS/2+8, "Other:               %d    ",
  406.         user.init_metal - np->metal + military_maint_metal(np));
  407.   
  408.   mvwprintw(w, 15, COLS/2, "JEWELS:");
  409.   mvwprintw(w, 15, COLS/2+8, "Magic R&D:   %3d%% -> %d    ",
  410.         np->mag_r_d_jewels, ((np->mag_r_d_jewels*calc_jewels(np))/100));
  411.   mvwprintw(w, 16, COLS/2+8, "Storage use: %3d%% -> %d",
  412.         np->cur_mag_r_d_jewels,
  413.         (np->cur_mag_r_d_jewels * np->jewels) / 100);
  414.   mvwprintw(w, 17, COLS/2+8, "Other:               %d    ",
  415.         user.init_jewels - np->jewels + military_maint_jewels(np));
  416.   
  417.   /* now the part where the user gets to decide HOW TO SPEND the money! */
  418.   mvwaddstr(w, LINES-5, 0, "Choose which parameter to modify:");
  419.   mvwaddstr(w, LINES-4, 8,
  420.         "[t]ax rate, [T]ech R&D, [M]agic R&D, [S]py R&D, [s]torage");
  421.   mvwaddstr(w, LINES-3, 0,
  422.         "See report: [i]nfo, [p]roduction, [n]ations, [d]iplomacy");
  423.   wclrtobot(w);
  424.   wrefresh(w);
  425.  
  426. }
  427.  
  428. /* Storage report, budget */
  429.  
  430. storage_budget (np)
  431.  
  432. Snation * np;
  433. {
  434.   WINDOW * w;
  435.   char s [EXECLEN];
  436.   char ch;
  437.   int bad_number, new_value;
  438.  
  439.   w = newwin (11, 70, 8, 5);
  440.  
  441.   while (1) {
  442.     bad_number = 0;
  443.     draw_storage_budget (w, np);
  444.  
  445.     do { ch = getch (); } while (strchr (" TMS", ch) == NULL);
  446.  
  447.     if (ch == ' ') return;
  448.  
  449.     switch (ch) {
  450.     case 'S':
  451.       wmove (w, 9, 1);
  452.       wclrtoeol (w);
  453.       box (w, '|', '-');
  454.       mvwprintw (w, 9, 2, "enter new value (percent): ");
  455.       wrefresh (w);
  456.       if (wget_number (w, &new_value) <= 0) {
  457.     bad_number = 1;
  458.       }
  459.  
  460.       if (new_value < 0 || new_value > 100) bad_number = 1;
  461.  
  462.       if (!bad_number && next_thon_money(np) >= 0 &&
  463.        ((np->cur_tech_r_d + np->cur_mag_r_d + new_value) <= 100)) {
  464.          
  465.     sprintf (s, "CUR_SPYR&Dmoney:%d\n", new_value);
  466.     np->cur_spy_r_d = new_value;
  467.     gen_exec (s);
  468.       }
  469.       else bad_number = 1;
  470.       break;
  471.     case 'T':
  472.       wmove (w, 9, 1);
  473.       wclrtoeol (w);
  474.       box (w, '|', '-');
  475.       mvwprintw (w, 9, 3, "Change [M]oney or [m]etal? ");
  476.       wrefresh (w);
  477.  
  478.       do { ch = getch (); } while (strchr (" Mm", ch) == NULL);
  479.  
  480.       if (ch != 'M' && ch != 'm') { break; }
  481.       wmove (w, 9, 1);
  482.       wclrtoeol (w);
  483.       box (w, '|', '-');
  484.       mvwprintw (w, 9, 3, "enter new value (percentage): ");
  485.       wrefresh (w);
  486.       if (wget_number (w, &new_value) <= 0) {
  487.     bad_number = 1;
  488.       }
  489.       wmove (w);
  490.       wclrtoeol (w);
  491.       box (w, '|', '-');
  492.  
  493.       if (new_value < 0 || new_value > 100) bad_number = 1;
  494.  
  495.       switch (ch) {
  496.       case 'M':
  497.     if (next_thon_money(np) >= 0 && !bad_number &&
  498.           ((new_value + np->cur_mag_r_d + np->cur_spy_r_d) <= 100)) {
  499.  
  500.       np->cur_tech_r_d = new_value;
  501.       sprintf (s, "CUR_TECHR&Dmoney:%d\n", new_value);
  502.       gen_exec (s);
  503.     }
  504.     else bad_number = 1;
  505.     break;
  506.       case 'm':
  507.     if (!bad_number && next_thon_metal(np) >= 0) {
  508.       np->cur_tech_r_d_metal = new_value;
  509.       sprintf (s, "CUR_TECHR&Dmetal:%d\n", new_value);
  510.       gen_exec (s);
  511.       break;
  512.     }
  513.     else bad_number = 1;
  514.     break;
  515.       default:
  516.     break;
  517.       }
  518.       break;
  519.     case 'M':
  520.       wmove (w, 9, 1);
  521.       wclrtoeol (w);
  522.       box (w, '|', '-');
  523.       mvwprintw (w, 9, 3, "Change [M]oney or [j]ewels? ");
  524.       wrefresh (w);
  525.  
  526.       do { ch = getch (); } while (strchr (" Mj", ch) == NULL);
  527.  
  528.       if (ch != 'M' && ch != 'j') { break; }
  529.       wmove (w, 9, 1);
  530.       wclrtoeol (w);
  531.       box (w, '|', '-');
  532.       mvwprintw (w, 9, 3, "enter new value (percentage): ");
  533.       wrefresh (w);
  534.       if (wget_number (w, &new_value) <= 0) {
  535.     bad_number = 1;
  536.       }
  537.       wmove (w);
  538.       wclrtoeol (w);
  539.       box (w, '|', '-');
  540.  
  541.       if (new_value < 0 || new_value > 100) bad_number = 1;
  542.  
  543.       switch (ch) {
  544.       case 'M':
  545.     if (next_thon_money(np) && !bad_number &&
  546.     ((np->cur_tech_r_d + new_value + np->cur_spy_r_d) <= 100)) { 
  547.  
  548.       np->cur_mag_r_d = new_value;
  549.       sprintf (s, "CUR_MAGR&Dmoney:%d\n", new_value);
  550.       gen_exec (s);
  551.     }
  552.     else bad_number = 1;
  553.     break;
  554.       case 'j':
  555.     if (!bad_number && next_thon_jewels(np) >= 0) {
  556.       np->cur_mag_r_d_jewels = new_value;
  557.       sprintf (s, "CUR_MAGR&Djewels:%d\n", new_value);
  558.       gen_exec (s);
  559.       break;
  560.     }
  561.     else bad_number = 1;
  562.     break;
  563.       default:
  564.     break;
  565.       }
  566.       break;
  567.     default:
  568.       break;
  569.     }
  570.     if (bad_number) {
  571.       statline2_err ("hit space", "bad number");
  572.     }
  573.     werase (w);
  574.   }
  575. }
  576.  
  577. draw_storage_budget (w, np)
  578.  
  579. WINDOW * w;
  580. Snation * np;
  581. {
  582.   char s [EXECLEN];
  583.  
  584.   box (w, '|', '-');
  585.  
  586.   sprintf (s, "Storage Usage Report");
  587.   mvwprintw (w, 1, 35 - (strlen (s)) / 2, "%s", s);
  588.   mvwprintw (w, 2, 35 - (strlen (s)) / 2, "--------------------");
  589.  
  590.   mvwprintw (w, 4, 2, "MONEY:");
  591.   mvwprintw (w, 5, 7, "Tech R&D:   %3d%% -> %d",
  592.          np->cur_tech_r_d, (np->cur_tech_r_d * np->money / 100));
  593.   mvwprintw (w, 6, 7, "Magic R&D:  %3d%% -> %d",
  594.          np->cur_mag_r_d, (np->cur_mag_r_d * np->money / 100));
  595.   mvwprintw (w, 7, 7, "Spy R&D:    %3d%% -> %d",
  596.          np->cur_spy_r_d, (np->cur_spy_r_d * np->money / 100));
  597.  
  598.   mvwprintw (w, 4, 36, "METAL:");
  599.   mvwprintw (w, 5, 41, "Tech R&D:   %3d%% -> %d",
  600.          np->cur_tech_r_d_metal, (np->cur_tech_r_d_metal * np->metal
  601.                        / 100));
  602.   mvwprintw (w, 6, 36, "JEWELS:");
  603.   mvwprintw (w, 7, 41, "Magic R&D:  %3d%% -> %d",
  604.          np->cur_mag_r_d_jewels, (np->cur_mag_r_d_jewels * np->jewels
  605.                        / 100));
  606.  
  607.   mvwprintw (w, 9, 12, "Modify: [M]agic R&D, [T]ech R&D, [S]py R&D");
  608.  
  609.   wrefresh (w);
  610. }
  611.