home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / volume13 / dominion / part23 < prev    next >
Encoding:
Internet Message Format  |  1992-02-10  |  60.6 KB

  1. Path: uunet!zephyr.ens.tek.com!master!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v13i059:  dominion - a multi-player world simulation game, Part23/28
  5. Message-ID: <2462@masterCNA.TEK.COM>
  6. Date: 11 Feb 92 18:27:19 GMT
  7. Sender: news@masterCNA.TEK.COM
  8. Lines: 2202
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: rosalia@dirac.physics.sunysb.edu (Mark Galassi)
  12. Posting-number: Volume 13, Issue 59
  13. Archive-name: dominion/Part23
  14. Environment: Unix, curses
  15.  
  16.  
  17.  
  18. #! /bin/sh
  19. # This is a shell archive.  Remove anything before this line, then unpack
  20. # it by saving it into a file and typing "sh file".  To overwrite existing
  21. # files, type "sh file -c".  You can also feed this as standard input via
  22. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  23. # will see the following message at the end:
  24. #        "End of archive 23 (of 28)."
  25. # Contents:  THE_STORY budget.c commands.c reports.c
  26. # Wrapped by billr@saab on Tue Feb 11 10:14:57 1992
  27. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  28. if test -f 'THE_STORY' -a "${1}" != "-c" ; then 
  29.   echo shar: Will not clobber existing file \"'THE_STORY'\"
  30. else
  31. echo shar: Extracting \"'THE_STORY'\" \(5116 characters\)
  32. sed "s/^X//" >'THE_STORY' <<'END_OF_FILE'
  33. XSo you want to know how this all got started?
  34. X
  35. XWell, Keith Messing and Mark Galassi each decided to attend
  36. XSUNY at Stony Brook in the fall of 1987.  Keith was a first semester
  37. Xundergraduate of electrical engineering, and Mark was a first semester
  38. Xgraduate student of the Institute for Theoretical Physics (ITP).
  39. X
  40. XIt must have been fate (kismet, etc) that brought them together in
  41. XPhysics 101, section 13 (a lucky number, no doubt).  This was the
  42. XIntroduction to Classical Physics (a requirement for e.e. majors)
  43. Xthat had its disgustingly boring lab section on Thursday nights.
  44. X
  45. XMark, was the instructor of that Thursday night lab section.  He
  46. Xwas interesting/weird, yet very friendly all at the same time...
  47. XJust the kind a guy you would want to get to know.
  48. XWell one week, Keith was way behind in his work (truly uncharacteristic
  49. Xbehavior) and he was not going to be able to submit his lab report
  50. Xon time.  He timidly approached Mark, and asked for an extension.
  51. XMark obliged, and yet expressed a concern for what seemed like
  52. Xa terrible lack of motivation on Keith's part.
  53. X
  54. XOn that day, and after an extensive conversation, their friendship was
  55. Xborn.  In no time, Mark showed Keith around the ITP and introduced
  56. Xhim to all these great computers that they had.
  57. X
  58. XThen there was this game.
  59. X
  60. XIt was called Conquer.
  61. X
  62. XMark had put "his nation" on the screen for him to see, but all Keith could
  63. Xsee were a bunch of characters... letters and dashes and squiggles all over
  64. Xthe place, and none of it really made any sense.... but
  65. Xby the way Mark talked about it, it fascinated him!
  66. X
  67. XKeith was interested, although he didn't know why.  Mark offered to add him
  68. Xto the game, and therefore also give him an account on the machine.
  69. XAs a freshman, he had never dreamed of having access to these machines,
  70. Xor knowing the super-user of them personally.
  71. X
  72. XHe watched as Mark became the superuser and added his account.
  73. XHE ACTUALLY GOT TO CHOOSE my login name.  Wow!!!!
  74. XFor lack of any other creative name, he asked for 'keith'.
  75. XSoon after, Mark created Keith's nation to be added to the conquer
  76. Xworld.
  77. X
  78. XHe played nation "The_Bronx", and his leader was Randolph.....
  79. X
  80. XLittle did he realize that he was playing Conquer version 2.
  81. XLittle did he realize that this incident would come back to haunt
  82. Xhim two years later.
  83. X
  84. X==================
  85. X
  86. XTwo years later....
  87. X
  88. XIt was late in the fall of 1989.  Mark and Keith are still friends,
  89. Xalthough they don't often find much time to spend together.
  90. XAt some point late in the fall, Keith approached Mark with the idea
  91. Xof porting the latest version of Conquer and playing it campus wide
  92. Xon the new HP system.
  93. X
  94. XMark enthusiastically supported his idea, and said they would do it.
  95. X
  96. XThus began the adventure and trauma.  There was FIRST_EARTH,
  97. Xthe first attempt at playing the game.  This featured nations like
  98. XRochelle, Belegost, Theorland, Nightmare, Avalon, and many more....
  99. XAvalon had two consecutive peasant revolts!!!  And then the world
  100. Xcrashed, because some evil High School student wanted to be added to the
  101. Xgame.  UGH!
  102. XMeanwhile, Avalon, had gone wimpering off to start his own game....
  103. XThis became known as SECOND_EARTH.  But Dave Buksbaum learned little
  104. Xfrom the tragedy of FIRST_EARTH.  He did not back up his world, and it
  105. Xtoo crashed!
  106. X
  107. XTHEN THERE WAS THIRD EARTH!
  108. X
  109. XWe all know it well. The personalities that were there in that dimension
  110. Xwill long be remembered.  Ender of Skighton, Lapu-Lapu of Pilipinas,
  111. XMattingly of Rochelle, Jubel of Uruz, Durin of Belegost, Geiserich of
  112. XPthor, and Antryg Windrose of Nimiria were all dominating forces.
  113. XWhat a glorious world it was........
  114. X
  115. XBut meanwhile, back in reality, Mark and Keith, now joined by a host
  116. Xof other awesome dudes, were getting really fed up with the crippling
  117. Xnature of all the bugs in Conquer.
  118. X
  119. X- There was Alan and Mike that had a "groo" and a "brok" for no apparent
  120. X  reason.
  121. X- There was Mark and Jon that lost 200000 talons for breaking treaties
  122. X  that the computer forced them to break.
  123. X- There was the turn that the trade board exploded and everyone
  124. X  got everybody elses commodities....
  125. X- Oh, and don't forget the NOMADS that appeared in Tim's nation out
  126. X  of  nowhere...
  127. X- Not to mention that the conquer world was flat and was a quadragon.
  128. X- Selling sectors, and getting all the people on them even of a different
  129. X  race.
  130. X- Jungles, next to deserts, next to tundra.
  131. X- Some nations had many leaders born, some had none.
  132. X- Relocating people that don't exist.
  133. X- And what did terror, popularity, and poverty really do?
  134. X- Who would want to spend hundreds of thousands of jewels just to
  135. X  suddenly be able to draft Cavalry from your population?
  136. X- Who wanted Mercs that always ran away?
  137. X
  138. XAnd hundreds of other inconsistencies, annoyances and flat out BUGS,
  139. Xthat drove all who played crazy!
  140. X
  141. XMark was most fed up of all!  He knew that we could do something about
  142. Xthis.  He knew that we did not have to stand by and watch as poor
  143. Xinnocent hackers and gamers got ulcers as they had to deal with someone's
  144. X"first C program!"
  145. X
  146. XIt was Mark who inspired us, united us under a common goal:
  147. XHow can we rewrite Conquer?
  148. X
  149. XSBW WAS BORN!
  150. X
  151. END_OF_FILE
  152. if test 5116 -ne `wc -c <'THE_STORY'`; then
  153.     echo shar: \"'THE_STORY'\" unpacked with wrong size!
  154. fi
  155. # end of 'THE_STORY'
  156. fi
  157. if test -f 'budget.c' -a "${1}" != "-c" ; then 
  158.   echo shar: Will not clobber existing file \"'budget.c'\"
  159. else
  160. echo shar: Extracting \"'budget.c'\" \(16603 characters\)
  161. sed "s/^X//" >'budget.c' <<'END_OF_FILE'
  162. X/* budget.c -- modify budget, etc. */
  163. X
  164. X/*
  165. X * Copyright (C) 1990 Free Software Foundation, Inc.
  166. X * Written by the dominion project.
  167. X *
  168. X * This file is part of dominion.
  169. X *
  170. X * dominion is free software; you can redistribute it and/or
  171. X * modify it under the terms of the GNU General Public License as published
  172. X * by the Free Software Foundation; either version 1, or (at your option)
  173. X * any later version.
  174. X *
  175. X * This software is distributed in the hope that it will be useful,
  176. X * but WITHOUT ANY WARRANTY; without even the implied warranty of
  177. X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  178. X * GNU General Public License for more details.
  179. X *
  180. X * You should have received a copy of the GNU General Public License
  181. X * along with this software; see the file COPYING.  If not, write to
  182. X * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  183. X */
  184. X
  185. X#include "dominion.h"
  186. X#include "misc.h"
  187. X#include <stdio.h>
  188. X#include <ctype.h>
  189. X
  190. Xextern Sworld world;
  191. Xextern Suser user;
  192. Xextern WINDOW *sectw;
  193. Xextern char *libdir;
  194. Xextern char help_tag[];
  195. X#ifdef BSD
  196. X extern char current_dir[];
  197. X#else /* BSD */
  198. X extern char *current_dir;
  199. X#endif
  200. X
  201. X#define ALL_CUR_PER (np->cur_tech_r_d + np->cur_mag_r_d + np->cur_spy_r_d)
  202. X#define ALL_NEXT_PER (np->mag_r_d + np->spy_r_d + np->charity + np->tech_r_d)
  203. X
  204. X/* char budget_report (Snation *); */
  205. X
  206. X/* Internal functions, should NOT be called outside of this file */
  207. X
  208. X/* do_tech_budget (WINDOW *, Snation *); */
  209. X/* do_magic_budget (WINDOW *, Snation *); */
  210. X/* void storage_budget (Snation *); */
  211. X
  212. X/* a nation's budget report */
  213. X
  214. Xchar budget_report(np)
  215. X     Snation *np;
  216. X{
  217. X  WINDOW *w;
  218. X  char s[EXECLEN];
  219. X  char c, spych;
  220. X  int new_value, done = 0, percent_expend, ret, got=0, bad_number;
  221. X  int semidone = 0, tmp;
  222. X  FILE *diplock;
  223. X
  224. X  strcpy(help_tag, "Budget Report");
  225. X  strcpy(s, "");
  226. X
  227. X  w = newwin(LINES-2, COLS, 0, 0); /* full screen */
  228. X
  229. X  touchwin(w);
  230. X  while (!done) {
  231. X    semidone = 0;
  232. X    bad_number = 0;
  233. X    statline("type space when done, or F to dump to a file", "budget_report");
  234. X    statline2("","");
  235. X
  236. X    draw_budget_screen (w, np);
  237. X
  238. X    got = 0;
  239. X    do {
  240. X      c = getch();
  241. X    } while (strchr(" stTMSFipndL?", c) == NULL && c != CTL('L'));
  242. X    switch (c) {
  243. X    case ' ':
  244. X    case 'i':
  245. X    case 'p':
  246. X    case 'n':
  247. X    case 'd':
  248. X      done = 1;
  249. X      break;
  250. X    case 's':
  251. X      storage_budget (np);
  252. X      draw_budget_screen (w, np);
  253. X      semidone = 1;
  254. X      break;
  255. X    case 'T':
  256. X      do_tech_budget (w, np);
  257. X      draw_budget_screen (w, np);
  258. X      semidone = 1;
  259. X      break;
  260. X    case 'M':
  261. X      do_magic_budget (w, np);
  262. X      draw_budget_screen (w, np);
  263. X      semidone = 1;
  264. X      break;
  265. X    case CTL('L'):
  266. X      wclear (w);
  267. X      draw_budget_screen (w, np);
  268. X      semidone = 1;
  269. X      break;
  270. X    case 'F':
  271. X      /* should also give thon in default file name */
  272. X      dump_current_screen(w, "budget_report");
  273. X      break;
  274. X    case '?':
  275. X      online_info();
  276. X      break;
  277. X    default:
  278. X      break;
  279. X    }
  280. X    
  281. X    if (!done && !semidone) {
  282. X      /* here prepare for getting the new value */
  283. X      wmove(w, LINES-3, 0);
  284. X      wclrtoeol(w);
  285. X      mvwprintw(w, LINES-3, 0, "      give new value: ");
  286. X
  287. X      ret = wget_number(w, &new_value);
  288. X      if (ret > 0) {    /* only do this if the user actually gave a number */
  289. X    if (new_value < 0 || new_value > 100) {
  290. X      statline2_err ("Bad value for a percentage (hit space)", "");
  291. X    } else {
  292. X      strcpy(s, "");
  293. X
  294. X      switch (c) {
  295. X      case 't':
  296. X        np->taxes = new_value;
  297. X        sprintf(s, "TAXRATE:%d\n", np->taxes);
  298. X        break;
  299. X/* Charity doesn't work right now... */
  300. X/*      case 'c':
  301. X        np->charity = n;
  302. X        sprintf(s, "CHARITY:%d\n", n);
  303. X        break;
  304. X*/
  305. X      case 'S':
  306. X        if (next_thon_money (np) >= 0) {
  307. X          np->spy_r_d = new_value;
  308. X          sprintf (s, "SPYR&Dmoney:%d\n", new_value);
  309. X        }
  310. X        else bad_number = 1;
  311. X        break;
  312. X      default:
  313. X        bad_number = 1;
  314. X        break;
  315. X      }
  316. X      if (bad_number) {
  317. X        statline2_err ("hit space", "bad number");
  318. X      }        
  319. X      else gen_exec(s);
  320. X    }
  321. X      }
  322. X    }
  323. X  }
  324. X  delwin(w);
  325. X
  326. X  return c;
  327. X}
  328. X
  329. X/* Does the sub-budget for magic */
  330. X
  331. Xdo_magic_budget (w, np)
  332. X
  333. XWINDOW * w;
  334. XSnation * np;
  335. X{
  336. X  char ch;
  337. X  int new_value;
  338. X  char exec [EXECLEN];
  339. X  int bad_number = 0;
  340. X  int old_value_tmp;
  341. X
  342. X  wmove (w, LINES-3, 0);
  343. X  wclrtoeol (w);
  344. X  mvwprintw (w, LINES-3, 0, "Change %% of [M]oney or [j]ewels invested?");
  345. X  wrefresh (w);
  346. X  ch = getch ();
  347. X
  348. X  if (strchr ("Mj", ch) == NULL) { ; }
  349. X  else {
  350. X    mvwprintw (w, LINES-3, 0, " enter new value (as %%): ");
  351. X    wclrtoeol (w);
  352. X    wrefresh (w);
  353. X    
  354. X    if (wget_number (w, &new_value) <= 0) {
  355. X      bad_number = 1;
  356. X    }
  357. X     
  358. X    if (new_value > 100 || new_value < 0) {
  359. X      bad_number = 1;
  360. X    }
  361. X
  362. X    /* What I do next is simple - calc_expend uses np->mag_r_d(_jewels)
  363. X       to calculate jewels, so I save the old value of np->mag_r_d
  364. X       and then copy the new value in, and if the new value is too
  365. X       large, then copy the old value back in. This way, you can change
  366. X       calc_expend however you want to, and it will work */    
  367. X
  368. X    switch (ch) {
  369. X    case 'j':
  370. X      old_value_tmp = np->mag_r_d_jewels; /* Do the old swaperoo */
  371. X      np->mag_r_d_jewels = new_value;
  372. X
  373. X      if (next_thon_jewels(np) >= 0 && !bad_number) {
  374. X    sprintf (exec, "MAGR&Djewels:%d\n", np->mag_r_d_jewels);
  375. X    gen_exec (exec);
  376. X      }
  377. X      else { bad_number = 1; np->mag_r_d_jewels = old_value_tmp; }
  378. X      break;
  379. X    case 'M':
  380. X      old_value_tmp = np->mag_r_d; /* Do the old swaperoo! */
  381. X      np->mag_r_d = new_value;
  382. X
  383. X      if (next_thon_money(np) >= 0 && !bad_number &&
  384. X      ALL_NEXT_PER <= 100) {      
  385. X    sprintf (exec, "MAGR&Dmoney:%d\n", np->mag_r_d);
  386. X    gen_exec (exec);
  387. X    break;
  388. X      }
  389. X      else { bad_number = 1; np->mag_r_d = old_value_tmp; }
  390. X      break;
  391. X    default:
  392. X      break;
  393. X    }
  394. X    if (bad_number) {  /* Print an error message if it was a bad number */
  395. X      statline2_err ("hit space", "bad number");
  396. X    }
  397. X  }
  398. X}
  399. X
  400. Xdo_tech_budget (w, np)
  401. X
  402. XWINDOW * w;
  403. XSnation * np;
  404. X{
  405. X  char ch;
  406. X  int new_value;
  407. X  char exec [EXECLEN];
  408. X  int bad_number = 0;
  409. X  int old_value_tmp;
  410. X
  411. X  wmove (w, LINES-3, 0);
  412. X  wclrtoeol (w);
  413. X  mvwprintw (w, LINES-3, 0, "Change %% of [M]oney or [m]etal invested?");
  414. X  wrefresh (w);
  415. X  ch = getch ();
  416. X
  417. X  if (strchr ("Mm", ch) == NULL) { ; }
  418. X  else {
  419. X    mvwprintw (w, LINES-3, 0, " enter new value (as %%): ");
  420. X    wclrtoeol (w);
  421. X    wrefresh (w);
  422. X
  423. X    if (wget_number (w, &new_value) <= 0) {
  424. X      bad_number = 1;
  425. X    }
  426. X    
  427. X    if (new_value > 100 || new_value < 0) {
  428. X      bad_number = 1;
  429. X    }
  430. X
  431. X    /* What I do next is simple - calc_expend uses np->mag_r_d(_jewels)
  432. X       to calculate jewels, so I save the old value of np->mag_r_d
  433. X       and then copy the new value in, and if the new value is too
  434. X       large, then copy the old value back in. This way, you can change
  435. X       calc_expend however you want to, and it will work */    
  436. X
  437. X    switch (ch) {
  438. X    case 'm':
  439. X      old_value_tmp = np->tech_r_d_metal; /* Do the old swaperoo */
  440. X      np->tech_r_d_metal = new_value;
  441. X
  442. X      if (next_thon_metal(np) >= 0 && !bad_number) {
  443. X    sprintf (exec, "TECHR&Dmetal:%d\n", np->tech_r_d_metal);
  444. X    gen_exec (exec);
  445. X      }
  446. X      else { bad_number = 1; np->tech_r_d_metal = old_value_tmp; }
  447. X      break;
  448. X    case 'M':
  449. X      old_value_tmp = np->tech_r_d; /* Do the old swaperoo! */
  450. X      np->tech_r_d = new_value;
  451. X
  452. X      if (next_thon_money(np) >= 0 && !bad_number &&
  453. X      ALL_NEXT_PER <= 100) {
  454. X    sprintf (exec, "TECHR&Dmoney:%d\n", np->tech_r_d);
  455. X    gen_exec (exec);
  456. X    break;
  457. X      }
  458. X      else { bad_number = 1; np->tech_r_d = old_value_tmp; }
  459. X      break;
  460. X    default:
  461. X      break;
  462. X    }
  463. X    if (bad_number) {  /* Print an error message if it was a bad number */
  464. X      statline2_err ("hit space", "bad number");
  465. X    }
  466. X  }
  467. X}
  468. X
  469. X/* */
  470. X
  471. Xdraw_budget_screen (w, np)
  472. X
  473. XWINDOW * w;
  474. XSnation * np;
  475. X{
  476. X  char s [EXECLEN];
  477. X
  478. X  sprintf(s, "Budget Report for Nation %s", np->name);
  479. X
  480. X  wmove(w, 0, (COLS-strlen(s))/2); /* make the string centered */
  481. X  wstandout(w);
  482. X  waddstr (w, s);
  483. X  wclrtoeol(w);
  484. X  wstandend(w);
  485. X
  486. X      /* now a tedious list of stuff */
  487. X  wclrtobot(w);
  488. X  mvwprintw(w, 2, 0, "  Item");
  489. X  mvwprintw(w, 3, 0, "--------");
  490. X  mvwprintw(w, 2, COLS/5-2, "This Thon (%d)", world.turn);
  491. X  mvwprintw(w, 3, COLS/5-2, "---------", world.turn);
  492. X  mvwprintw(w, 2, (2*COLS)/5-3, "Revenue");
  493. X  mvwprintw(w, 3, (2*COLS)/5-3, "-------");
  494. X  mvwprintw(w, 2, (3*COLS)/5, "Expenditure");
  495. X  mvwprintw(w, 3, (3*COLS)/5, "-----------");
  496. X  mvwprintw(w, 2, (4*COLS)/5, "Next Thon (%d)", world.turn + 1);
  497. X  mvwprintw(w, 3, (4*COLS)/5, "---------", world.turn + 1);
  498. X  mvwprintw(w, 4, 0, "Treasury");
  499. X  mvwprintw(w, 5, 0, "Metal");
  500. X  mvwprintw(w, 6, 0, "Jewels");
  501. X  mvwprintw(w, 7, 0, "Food");
  502. X  /* this turn */
  503. X  mvwprintw(w, 4, COLS/5-2, "%d", user.init_money);
  504. X  mvwprintw(w, 5, COLS/5-2, "%d", user.init_metal);
  505. X  mvwprintw(w, 6, COLS/5-2, "%d", user.init_jewels);
  506. X  mvwprintw(w, 7, COLS/5-2, "%d", user.init_food);
  507. X
  508. X  /* revenue */
  509. X  mvwprintw(w, 4, (2*COLS)/5-3, "%d (%d%% tax)        ",
  510. X        calc_revenue(np), np->taxes);
  511. X  mvwprintw(w, 5, (2*COLS)/5-3, "%d   ", calc_metal(np));
  512. X  mvwprintw(w, 6, (2*COLS)/5-3, "%d   ", calc_jewels(np));
  513. X  mvwprintw(w, 7, (2*COLS)/5-3, "%d   ", calc_food(np));
  514. X
  515. X  /* expenses */
  516. X  mvwprintw(w, 4, (3*COLS)/5, "%d    ",
  517. X        calc_expend(np) + user.init_money - np->money +
  518. X        (cur_expend(np)));
  519. X  mvwprintw(w, 5, (3*COLS)/5, "%d    ",
  520. X        calc_expend_metal(np) + user.init_metal - np->metal
  521. X        + cur_expend_metal(np));
  522. X  mvwprintw(w, 6, (3*COLS)/5, "%d    ",
  523. X        calc_expend_jewels(np) + user.init_jewels - np->jewels
  524. X        + cur_expend_jewels(np));
  525. X  mvwprintw(w, 7, (3*COLS)/5, "%d    ",
  526. X        calc_expend_food(np) + user.init_food - np->food);
  527. X
  528. X  /* next turn */
  529. X  mvwprintw(w, 4, (4*COLS)/5, "%d    ",
  530. X        next_thon_money(np));
  531. X  mvwprintw(w, 5, (4*COLS)/5, "%d    ",
  532. X        next_thon_metal(np));
  533. X  mvwprintw(w, 6, (4*COLS)/5, "%d    ",
  534. X        next_thon_jewels(np));
  535. X  mvwprintw(w, 7, (4*COLS)/5, "%d    ",
  536. X        np->food + calc_food(np) - calc_expend_food(np));
  537. X
  538. X
  539. X  /* now for the modifiable stuff */
  540. X  strcpy(s, "**Breakdown of Expenditures**");
  541. X  mvwaddstr(w, 9, (COLS-strlen(s))/2, s);
  542. X  
  543. X  mvwprintw(w, 11, 0, "MONEY:");
  544. X  mvwprintw(w, 11, 8, "Charity:     %3d%% -> %d      ",
  545. X        np->charity, (np->charity*calc_revenue(np))/100);
  546. X  mvwprintw(w, 12, 8, "Tech R&D:    %3d%% -> %d      ",
  547. X        np->tech_r_d, ((np->tech_r_d*calc_revenue(np)) / 100));
  548. X  mvwprintw(w, 13, 8, "Magic R&D:   %3d%% -> %d      ",
  549. X        np->mag_r_d, np->mag_r_d*calc_revenue(np)/100);
  550. X  mvwprintw(w, 14, 8, "Spy R&D:     %3d%% -> %d      ",
  551. X        np->spy_r_d, (np->spy_r_d * calc_revenue (np)) / 100);
  552. X  mvwprintw(w, 15, 8, "Storage use: %3d%% -> %d",
  553. X        (np->cur_tech_r_d + np->cur_mag_r_d + np->cur_spy_r_d),
  554. X        (np->cur_tech_r_d + np->cur_mag_r_d + np->cur_spy_r_d) *
  555. X        np->money / 100);
  556. X  mvwprintw(w, 16, 8, "Military maint.:     %d      ", military_maint(np));
  557. X  mvwprintw(w, 17, 8, "Other:               %d      ",
  558. X        user.init_money + non_profit_maint(np) - np->money);
  559. X
  560. X  mvwprintw(w, 11, COLS/2, "METAL:");
  561. X  mvwprintw(w, 11, COLS/2+8, "Tech R&D:    %3d%% -> %d    ",
  562. X        np->tech_r_d_metal, ((np->tech_r_d_metal*calc_metal(np))/100));
  563. X  mvwprintw(w, 12, COLS/2+8, "Storage use: %3d%% -> %d",
  564. X        np->cur_tech_r_d_metal,
  565. X        (np->cur_tech_r_d_metal * np->metal) / 100);        
  566. X  mvwprintw(w, 13, COLS/2+8, "Other:               %d    ",
  567. X        user.init_metal - np->metal + military_maint_metal(np));
  568. X  
  569. X  mvwprintw(w, 15, COLS/2, "JEWELS:");
  570. X  mvwprintw(w, 15, COLS/2+8, "Magic R&D:   %3d%% -> %d    ",
  571. X        np->mag_r_d_jewels, ((np->mag_r_d_jewels*calc_jewels(np))/100));
  572. X  mvwprintw(w, 16, COLS/2+8, "Storage use: %3d%% -> %d",
  573. X        np->cur_mag_r_d_jewels,
  574. X        (np->cur_mag_r_d_jewels * np->jewels) / 100);
  575. X  mvwprintw(w, 17, COLS/2+8, "Other:               %d    ",
  576. X        user.init_jewels - np->jewels + military_maint_jewels(np));
  577. X  
  578. X  /* now the part where the user gets to decide HOW TO SPEND the money! */
  579. X  mvwaddstr(w, LINES-5, 0, "Choose which parameter to modify:");
  580. X  mvwaddstr(w, LINES-4, 8,
  581. X        "[t]ax rate, [T]ech R&D, [M]agic R&D, [S]py R&D, [s]torage");
  582. X  mvwaddstr(w, LINES-3, 0,
  583. X        "See report: [i]nfo, [p]roduction, [n]ations, [d]iplomacy");
  584. X  wclrtobot(w);
  585. X  wrefresh(w);
  586. X
  587. X}
  588. X
  589. X/* Storage report, budget */
  590. X
  591. Xstorage_budget (np)
  592. X
  593. XSnation * np;
  594. X{
  595. X  WINDOW * w;
  596. X  char s [EXECLEN];
  597. X  char ch;
  598. X  int bad_number, new_value;
  599. X
  600. X  w = newwin (11, 70, 8, 5);
  601. X
  602. X  while (1) {
  603. X    bad_number = 0;
  604. X    draw_storage_budget (w, np);
  605. X
  606. X    do { ch = getch (); } while (strchr (" TMS", ch) == NULL);
  607. X
  608. X    if (ch == ' ') return;
  609. X
  610. X    switch (ch) {
  611. X    case 'S':
  612. X      wmove (w, 9, 1);
  613. X      wclrtoeol (w);
  614. X      box (w, '|', '-');
  615. X      mvwprintw (w, 9, 2, "enter new value (percent): ");
  616. X      wrefresh (w);
  617. X      if (wget_number (w, &new_value) <= 0) {
  618. X    bad_number = 1;
  619. X      }
  620. X
  621. X      if (new_value < 0 || new_value > 100) bad_number = 1;
  622. X
  623. X      if (!bad_number && next_thon_money(np) >= 0 &&
  624. X       ((np->cur_tech_r_d + np->cur_mag_r_d + new_value) <= 100)) {
  625. X         
  626. X    sprintf (s, "CUR_SPYR&Dmoney:%d\n", new_value);
  627. X    np->cur_spy_r_d = new_value;
  628. X    gen_exec (s);
  629. X      }
  630. X      else bad_number = 1;
  631. X      break;
  632. X    case 'T':
  633. X      wmove (w, 9, 1);
  634. X      wclrtoeol (w);
  635. X      box (w, '|', '-');
  636. X      mvwprintw (w, 9, 3, "Change [M]oney or [m]etal? ");
  637. X      wrefresh (w);
  638. X
  639. X      do { ch = getch (); } while (strchr (" Mm", ch) == NULL);
  640. X
  641. X      if (ch != 'M' && ch != 'm') { break; }
  642. X      wmove (w, 9, 1);
  643. X      wclrtoeol (w);
  644. X      box (w, '|', '-');
  645. X      mvwprintw (w, 9, 3, "enter new value (percentage): ");
  646. X      wrefresh (w);
  647. X      if (wget_number (w, &new_value) <= 0) {
  648. X    bad_number = 1;
  649. X      }
  650. X      wmove (w);
  651. X      wclrtoeol (w);
  652. X      box (w, '|', '-');
  653. X
  654. X      if (new_value < 0 || new_value > 100) bad_number = 1;
  655. X
  656. X      switch (ch) {
  657. X      case 'M':
  658. X    if (next_thon_money(np) >= 0 && !bad_number &&
  659. X          ((new_value + np->cur_mag_r_d + np->cur_spy_r_d) <= 100)) {
  660. X
  661. X      np->cur_tech_r_d = new_value;
  662. X      sprintf (s, "CUR_TECHR&Dmoney:%d\n", new_value);
  663. X      gen_exec (s);
  664. X    }
  665. X    else bad_number = 1;
  666. X    break;
  667. X      case 'm':
  668. X    if (!bad_number && next_thon_metal(np) >= 0) {
  669. X      np->cur_tech_r_d_metal = new_value;
  670. X      sprintf (s, "CUR_TECHR&Dmetal:%d\n", new_value);
  671. X      gen_exec (s);
  672. X      break;
  673. X    }
  674. X    else bad_number = 1;
  675. X    break;
  676. X      default:
  677. X    break;
  678. X      }
  679. X      break;
  680. X    case 'M':
  681. X      wmove (w, 9, 1);
  682. X      wclrtoeol (w);
  683. X      box (w, '|', '-');
  684. X      mvwprintw (w, 9, 3, "Change [M]oney or [j]ewels? ");
  685. X      wrefresh (w);
  686. X
  687. X      do { ch = getch (); } while (strchr (" Mj", ch) == NULL);
  688. X
  689. X      if (ch != 'M' && ch != 'j') { break; }
  690. X      wmove (w, 9, 1);
  691. X      wclrtoeol (w);
  692. X      box (w, '|', '-');
  693. X      mvwprintw (w, 9, 3, "enter new value (percentage): ");
  694. X      wrefresh (w);
  695. X      if (wget_number (w, &new_value) <= 0) {
  696. X    bad_number = 1;
  697. X      }
  698. X      wmove (w);
  699. X      wclrtoeol (w);
  700. X      box (w, '|', '-');
  701. X
  702. X      if (new_value < 0 || new_value > 100) bad_number = 1;
  703. X
  704. X      switch (ch) {
  705. X      case 'M':
  706. X    if (next_thon_money(np) && !bad_number &&
  707. X    ((np->cur_tech_r_d + new_value + np->cur_spy_r_d) <= 100)) { 
  708. X
  709. X      np->cur_mag_r_d = new_value;
  710. X      sprintf (s, "CUR_MAGR&Dmoney:%d\n", new_value);
  711. X      gen_exec (s);
  712. X    }
  713. X    else bad_number = 1;
  714. X    break;
  715. X      case 'j':
  716. X    if (!bad_number && next_thon_jewels(np) >= 0) {
  717. X      np->cur_mag_r_d_jewels = new_value;
  718. X      sprintf (s, "CUR_MAGR&Djewels:%d\n", new_value);
  719. X      gen_exec (s);
  720. X      break;
  721. X    }
  722. X    else bad_number = 1;
  723. X    break;
  724. X      default:
  725. X    break;
  726. X      }
  727. X      break;
  728. X    default:
  729. X      break;
  730. X    }
  731. X    if (bad_number) {
  732. X      statline2_err ("hit space", "bad number");
  733. X    }
  734. X    werase (w);
  735. X  }
  736. X}
  737. X
  738. Xdraw_storage_budget (w, np)
  739. X
  740. XWINDOW * w;
  741. XSnation * np;
  742. X{
  743. X  char s [EXECLEN];
  744. X
  745. X  box (w, '|', '-');
  746. X
  747. X  sprintf (s, "Storage Usage Report");
  748. X  mvwprintw (w, 1, 35 - (strlen (s)) / 2, "%s", s);
  749. X  mvwprintw (w, 2, 35 - (strlen (s)) / 2, "--------------------");
  750. X
  751. X  mvwprintw (w, 4, 2, "MONEY:");
  752. X  mvwprintw (w, 5, 7, "Tech R&D:   %3d%% -> %d",
  753. X         np->cur_tech_r_d, (np->cur_tech_r_d * np->money / 100));
  754. X  mvwprintw (w, 6, 7, "Magic R&D:  %3d%% -> %d",
  755. X         np->cur_mag_r_d, (np->cur_mag_r_d * np->money / 100));
  756. X  mvwprintw (w, 7, 7, "Spy R&D:    %3d%% -> %d",
  757. X         np->cur_spy_r_d, (np->cur_spy_r_d * np->money / 100));
  758. X
  759. X  mvwprintw (w, 4, 36, "METAL:");
  760. X  mvwprintw (w, 5, 41, "Tech R&D:   %3d%% -> %d",
  761. X         np->cur_tech_r_d_metal, (np->cur_tech_r_d_metal * np->metal
  762. X                       / 100));
  763. X  mvwprintw (w, 6, 36, "JEWELS:");
  764. X  mvwprintw (w, 7, 41, "Magic R&D:  %3d%% -> %d",
  765. X         np->cur_mag_r_d_jewels, (np->cur_mag_r_d_jewels * np->jewels
  766. X                       / 100));
  767. X
  768. X  mvwprintw (w, 9, 12, "Modify: [M]agic R&D, [T]ech R&D, [S]py R&D");
  769. X
  770. X  wrefresh (w);
  771. X}
  772. END_OF_FILE
  773. if test 16603 -ne `wc -c <'budget.c'`; then
  774.     echo shar: \"'budget.c'\" unpacked with wrong size!
  775. fi
  776. # end of 'budget.c'
  777. fi
  778. if test -f 'commands.c' -a "${1}" != "-c" ; then 
  779.   echo shar: Will not clobber existing file \"'commands.c'\"
  780. else
  781. echo shar: Extracting \"'commands.c'\" \(17606 characters\)
  782. sed "s/^X//" >'commands.c' <<'END_OF_FILE'
  783. X  /* commands.c -- various commands in dominion */
  784. X
  785. X/*
  786. X * Copyright (C) 1990 Free Software Foundation, Inc.
  787. X * Written by the dominion project.
  788. X *
  789. X * This file is part of dominion.
  790. X *
  791. X * dominion is free software; you can redistribute it and/or
  792. X * modify it under the terms of the GNU General Public License as published
  793. X * by the Free Software Foundation; either version 1, or (at your option)
  794. X * any later version.
  795. X *
  796. X * This software is distributed in the hope that it will be useful,
  797. X * but WITHOUT ANY WARRANTY; without even the implied warranty of
  798. X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  799. X * GNU General Public License for more details.
  800. X *
  801. X * You should have received a copy of the GNU General Public License
  802. X * along with this software; see the file COPYING.  If not, write to
  803. X * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  804. X */
  805. X
  806. X#include "dominion.h"
  807. X#include "misc.h"
  808. X#include "army.h"
  809. X#include <stdio.h>
  810. X    /* many commands are kept in this file, except for those
  811. X       that depend on the graphics being used.
  812. X     */
  813. X
  814. Xextern Suser user;
  815. Xextern Sworld world;
  816. Xextern struct s_desig_map desig_map[];
  817. Xextern struct s_altitude_map altitude_map[];
  818. Xextern struct item_map climates[];
  819. Xextern struct item_map terrains[];
  820. Xextern WINDOW *sectw;
  821. Xextern char help_tag[];
  822. Xextern int (*wrapx)(), (*wrapy)();
  823. Xextern char *getenv();
  824. Xextern char libdir[], *current_dir;
  825. X
  826. Xquit()                /* cleanup and quit */
  827. X{
  828. X  clear();
  829. X  cleanup();
  830. X  clean_exit();
  831. X  exit(0);
  832. X}
  833. X
  834. Xhelp()
  835. X{
  836. X  start_help_win();
  837. X  show_help();
  838. X  end_help_win();
  839. X}
  840. X
  841. X  /* this routine sets certain parameters that must be
  842. X     set when the cursor has been moved
  843. X   */
  844. Xjust_moved()
  845. X{
  846. X  user.just_moved = 1;
  847. X}
  848. X
  849. Xup()                /* move the cursor; should look at topology */
  850. X{
  851. X  --user.cursor.y;
  852. X  just_moved();
  853. X}
  854. Xjup()
  855. X{
  856. X  user.cursor.y -= 8;
  857. X  just_moved();
  858. X}
  859. Xdown()
  860. X{
  861. X  ++user.cursor.y;
  862. X  just_moved();
  863. X}
  864. Xjdown()
  865. X{
  866. X  user.cursor.y += 8;
  867. X  just_moved();
  868. X}
  869. Xright()
  870. X{
  871. X  ++user.cursor.x;
  872. X  just_moved();
  873. X}
  874. Xjright()
  875. X{
  876. X  user.cursor.x += 8;
  877. X  just_moved();
  878. X}
  879. Xleft()
  880. X{
  881. X  --user.cursor.x;
  882. X  just_moved();
  883. X}
  884. Xjleft()
  885. X{
  886. X  user.cursor.x -= 8;
  887. X  just_moved();
  888. X}
  889. Xupright()
  890. X{
  891. X  up(); right();
  892. X  just_moved();
  893. X}
  894. Xupleft()
  895. X{
  896. X  up(); left();
  897. X  just_moved();
  898. X}
  899. Xdownright()
  900. X{
  901. X  down(); right();
  902. X  just_moved();
  903. X}
  904. Xdownleft()
  905. X{
  906. X  down(); left();
  907. X  just_moved();
  908. X}
  909. Xjhome()
  910. X{
  911. X  user.cursor.x = user.np->capital.x;
  912. X  user.cursor.y = user.np->capital.y;
  913. X  user.center = user.cursor;
  914. X  just_moved();
  915. X}
  916. X
  917. Xjpos()
  918. X{
  919. X  char s[100];
  920. X  int x,y;
  921. X
  922. X  statline2("  x postion to jump to ? : " , "position");
  923. X  move (LINES-2, strlen("  x position to jump to ? : "));
  924. X  if ( wget_number(stdscr, &x) < 1) {
  925. X    statline2("", "");
  926. X    return;
  927. X  }
  928. X  statline2("  y postion to jump to ? : " , "position");
  929. X  move (LINES-2, strlen("  y position to jump to ? : "));
  930. X  if ( wget_number(stdscr, &y) < 1) {
  931. X    statline2("", "");
  932. X    return;
  933. X  }
  934. X  user.cursor.x = (*wrapx)(user.np->capital.x + x,user.np->capital.y + y);
  935. X  user.cursor.y = (*wrapy)(user.np->capital.x + x,user.np->capital.y + y);
  936. X  user.center = user.cursor;
  937. X  just_moved();
  938. X  statline2("", "");
  939. X}
  940. X
  941. X#define ZX 70
  942. X#define ZY 18
  943. X
  944. X  /* zoom-in on a sector */
  945. Xzoom_sector()
  946. X{
  947. X  WINDOW *zoomw = NULL;
  948. X  char s[EXECLEN];
  949. X  char c;
  950. X  int x = user.cursor.x, y = user.cursor.y;
  951. X  Ssector *sp = &world.map[x][y];
  952. X  Snation *np;
  953. X  int done = 0, old_desig = sp->designation;
  954. X  int new_desig = sp->designation, quantity, fraction, total;
  955. X  int visibility = user.visible_sectors[x][y];
  956. X
  957. X  strcpy(help_tag, "Designations");
  958. X  if (user.id != 0) {
  959. X    np = user.np;
  960. X  } else {
  961. X    np = &world.nations[sp->owner]; /* for super user */
  962. X  }
  963. X  if (!user.xmode) {
  964. X    zoomw = newwin(ZY, ZX, 4, 5);
  965. X  }
  966. X  while (!done) {
  967. X    if (zoomw) {
  968. X      statline("type space when done", "zoom_sector");
  969. X
  970. X      if (strlen(sp->name) > 0 && (visibility & SEE_POPULATION)) {
  971. X    sprintf(s, "Detailed Evaluation of %s", sp->name);
  972. X      } else {
  973. X    sprintf(s, "Detailed Evaluation of Sector (%d,%d)",
  974. X        xrel(x, y, np->capital), yrel(x, y, np->capital));
  975. X      }
  976. X      wmove(zoomw, 1, 1);
  977. X      wclrtoeol(zoomw);
  978. X      wmove(zoomw, 1, (70-strlen(s))/2); /* make the string centered */
  979. X      wstandout(zoomw);
  980. X      waddstr(zoomw, s);
  981. X      wclrtoeol(zoomw);
  982. X      wstandend(zoomw);
  983. X
  984. X      if (sp->owner != 0 && (visibility & SEE_OWNER)) {
  985. X    mvwprintw(zoomw, 2, 2, "     Owner: %s",world.nations[sp->owner].name);
  986. X      } else {
  987. X    mvwprintw(zoomw, 2, 2, "     Owner: None");
  988. X      }
  989. X      if (strlen(sp->name) > 0 || !(visibility & SEE_POPULATION)) {
  990. X    mvwprintw(zoomw, 2, 1+ZX/2, "Location: (%d,%d)",xrel(x,y,np->capital),
  991. X          yrel(x,y,np->capital));
  992. X      }
  993. X      wclrtoeol(zoomw);
  994. X
  995. X      mvwprintw(zoomw, 3, 2, " Geography: ");
  996. X      if (visibility & SEE_LAND_WATER) {
  997. X    wprintw(zoomw, "%s ", terrains[sp->terrain - MIN_TERRAIN].name);
  998. X    if (sp->altitude > SEA_LEVEL) {
  999. X      wprintw(zoomw, "%s", altitude_map[map_alt(sp->altitude)].name);
  1000. X    }
  1001. X      } else {
  1002. X    wprintw(zoomw, "Unknown");
  1003. X      }
  1004. X      wclrtoeol(zoomw);
  1005. X
  1006. X      mvwprintw(zoomw, 4, 2, "   Climate: ");
  1007. X      if (visibility & SEE_LAND_WATER) {
  1008. X    wprintw(zoomw, "%s", climates[sp->climate].name);
  1009. X      } else {
  1010. X    wprintw(zoomw, "Unknown");
  1011. X      }
  1012. X      wclrtoeol(zoomw);
  1013. X
  1014. X      mvwprintw(zoomw, 5, 2, " Resources: ");
  1015. X      if (visibility & SEE_RESOURCES) {
  1016. X    wprintw(zoomw, "soil %d, metal %d, jewels %d", sp->soil, sp->metal,
  1017. X        sp->jewels);
  1018. X      } else {
  1019. X    wprintw(zoomw, "Unknown");
  1020. X      }
  1021. X      wclrtoeol(zoomw);
  1022. X
  1023. X      mvwprintw(zoomw, 6, 2, "Population: ");
  1024. X      if (sp->owner != 0) {
  1025. X    if (visibility & SEE_POPULATION) {
  1026. X      wprintw(zoomw, "%d people (%c); %d employed; %d%% unemp.",
  1027. X          sp->n_people, world.nations[sp->owner].race.mark,
  1028. X          n_workers(sp), sp->n_people ?
  1029. X          (100*(sp->n_people - n_workers(sp)))/sp->n_people : 0);
  1030. X    } else {
  1031. X      wprintw(zoomw, "Unknown people");
  1032. X    }
  1033. X    if ((visibility & SEE_ARMIES) && sp->alist != NULL) {
  1034. X      wprintw(zoomw, "; %d armies", sect_n_armies(sp));
  1035. X    }
  1036. X      } else {
  1037. X    wprintw(zoomw, "None");
  1038. X      }
  1039. X      wclrtoeol(zoomw);
  1040. X
  1041. X      mvwprintw(zoomw, 7, 2, "  Movecost: ");
  1042. X      if (visibility & SEE_LAND_WATER) {
  1043. X    wprintw(zoomw, "%d", get_generic_move_cost(np,sp));
  1044. X/*    wprintw(zoomw, "%d", get_move_cost(np,sp)); */
  1045. X      } else {
  1046. X    wprintw(zoomw, "Unknown");
  1047. X      }
  1048. X      wclrtoeol(zoomw);
  1049. X      mvwprintw(zoomw, 7, 1+ZX/4, "Roads: %d", sp->roads);
  1050. X      mvwprintw(zoomw, 7, 1+2*ZX/4, "Defense: %d", sp->defense);
  1051. X      mvwprintw(zoomw, 7, 1+3*ZX/4, " %s", has_bubble(sp) ? "Bubble" : "");
  1052. X
  1053. X      if (sp->owner == np->id || user.id == 0) {
  1054. X    mvwprintw(zoomw, 9, 2, "Sector Economy:");
  1055. X    wclrtoeol(zoomw);
  1056. X
  1057. X    mvwprintw(zoomw, 10, 2, "       Designation: %s (%c)",
  1058. X          desig_map[old_desig].name,
  1059. X          desig_map[old_desig].mark);
  1060. X    wclrtoeol(zoomw);
  1061. X
  1062. X    mvwprintw(zoomw, 11, 2, " Trial Designation: %s (%c)",
  1063. X          desig_map[new_desig].name,
  1064. X          desig_map[new_desig].mark);
  1065. X    wclrtoeol(zoomw);
  1066. X
  1067. X      /* now tell the user how much revenue this sector generates */
  1068. X    quantity=(desig_map[new_desig].revenue*np->taxes*n_workers(sp))/100;
  1069. X    if (calc_revenue(np) > 0) {
  1070. X      fraction = (100*quantity)/calc_revenue(np);
  1071. X    } else {
  1072. X      fraction = 100;
  1073. X    }
  1074. X
  1075. X    mvwprintw(zoomw, 12, 2, "Per capita revenue: %d    ",
  1076. X          desig_map[new_desig].revenue);
  1077. X    mvwprintw(zoomw, 13, 2,
  1078. X          "   Taxes collected: %d, %d%% of total income (%d)    ",
  1079. X          quantity, fraction, calc_revenue(np));
  1080. X    wclrtoeol(zoomw);
  1081. X
  1082. X    switch (desig_map[new_desig].mark) {
  1083. X    case 'm':
  1084. X      strcpy(s, "metal");
  1085. X      total = calc_metal(np);
  1086. X      quantity = sector_metal(sp);
  1087. X      break;
  1088. X    case 'j':
  1089. X      strcpy(s, "jewels");
  1090. X      total = calc_jewels(np);
  1091. X      quantity = sector_jewels(sp);
  1092. X      break;
  1093. X    case 'f':
  1094. X      strcpy(s, "food");
  1095. X      total = calc_food(np);
  1096. X      quantity = sector_food(sp);
  1097. X      break;
  1098. X    default:
  1099. X      strcpy(s, "");
  1100. X      quantity = -1;
  1101. X      fraction = 0;
  1102. X      break;
  1103. X    }
  1104. X    fraction = (total == 0) ? 100 : ((quantity * 100) / total);
  1105. X
  1106. X    wmove(zoomw, 14, 2);
  1107. X    if (quantity != -1) {
  1108. X      /* watch out for division by zero if there are zero workers */
  1109. X      wprintw(zoomw,
  1110. X               "Production of %s: %d; %d%% of total (%d); %5.2f per capita   ",
  1111. X      s, quantity, fraction, total,
  1112. X      ((double) quantity)/((double) (n_workers(sp) ? n_workers(sp) : 1)));
  1113. X    }
  1114. X    wclrtoeol(zoomw);
  1115. X      }
  1116. X
  1117. X      mvwaddstr(zoomw, 16, 1,
  1118. X        "Options: [N]ame sector, [t]rial redesignate, [r]edesignate");
  1119. X      box(zoomw, '|', '-');
  1120. X      wrefresh(zoomw);
  1121. X    } else {            /* else we must be in e[x]pert mode */
  1122. X      if (visibility & SEE_POPULATION) {
  1123. X    sprintf(s, "[N],[r],pop=%d,emp=%d,roads=%d,defense=%d", sp->n_people,
  1124. X        n_workers(sp), sp->roads, sp->defense);
  1125. X      } else {
  1126. X    sprintf(s, "[N],[r],pop=?,emp=?,roads%d,defense%d",
  1127. X        sp->roads, sp->defense);
  1128. X      }
  1129. X      statline_prompt(s, "sector zoom");
  1130. X    }
  1131. X    switch(c = mygetch()) {
  1132. X    case ' ':
  1133. X      done = 1;
  1134. X      break;
  1135. X    case 'N':
  1136. X      name_sector(zoomw);
  1137. X      break;
  1138. X    case 't':            /* redesignate without paying and saving */
  1139. X      if (zoomw) {            /* not in expert mode */
  1140. X    new_desig = redesignate(np, zoomw, 0);
  1141. X    sp->designation = new_desig;
  1142. X      }
  1143. X      break;
  1144. X    case 'r':            /* make a redesignation for sure, and pay */
  1145. X      new_desig = redesignate(np, zoomw, 2);
  1146. X      old_desig = new_desig;    /* permanent change!! */
  1147. X      sp->designation = new_desig;
  1148. X      break;
  1149. X    default:
  1150. X      break;
  1151. X    }
  1152. X  }
  1153. X  if (zoomw) {
  1154. X    delwin(zoomw);
  1155. X    touch_all_wins();
  1156. X    refresh();
  1157. X  }
  1158. X  sp->designation = old_desig;    /* make sure "trial" changes are temporary */
  1159. X}
  1160. X
  1161. X  /* change the name of a sector */
  1162. Xname_sector(w)
  1163. X     WINDOW *w;
  1164. X{
  1165. X  char name[NAMELEN];
  1166. X  int x = user.cursor.x, y = user.cursor.y;
  1167. X  Ssector *sp = &world.map[x][y];
  1168. X  char s[EXECLEN];
  1169. X  int ret;            /* for return values */
  1170. X
  1171. X  if (w) {
  1172. X    statline("name this sector", "name_sector");
  1173. X  }
  1174. X  if (sp->owner != user.id && user.id != 0) {
  1175. X    statline2_err("hit space", "sector not yours");
  1176. X  } else {
  1177. X    if (w) {
  1178. X      mvwaddstr(w, ZY-3, 2, "Enter name for the sector: ");
  1179. X      wclrtoeol(w);
  1180. X      wrefresh(w);
  1181. X    } else {
  1182. X      statline_prompt("Name this sector: ", "");
  1183. X    }
  1184. X    ret = wget_name(w, name);
  1185. X    if (ret > 0) {
  1186. X      strcpy(sp->name, name);
  1187. X        /* now generate the exec instruction */
  1188. X      sprintf(s, "SNAME:%d:%d:%s\n", x, y, name);
  1189. X      gen_exec(s);
  1190. X    }
  1191. X  }
  1192. X  if (w) {
  1193. X    wmove(w, ZY-3, 2);
  1194. X    wclrtoeol(w);
  1195. X  }
  1196. X  user.just_moved = 1;
  1197. X}
  1198. X
  1199. X  /* menu that allows you to redesignate a sector */
  1200. Xredesignate(np, w, confirm)
  1201. X     Snation * np;
  1202. X     WINDOW *w;
  1203. X     int confirm;
  1204. X{
  1205. X  char name[NAMELEN];
  1206. X  int x = user.cursor.x, y = user.cursor.y;
  1207. X  Ssector *sp = &world.map[x][y];
  1208. X  char s[EXECLEN];
  1209. X  char c;
  1210. X  int i, new_desig = sp->designation;
  1211. X
  1212. X  if (w) {
  1213. X    statline("choose a designation", "redesignate");
  1214. X  }
  1215. X  if (sp->owner != user.id && user.id != 0) {
  1216. X    statline2_err("type space to continue", "sector not yours");
  1217. X      /* a user cannot remove their capital, but Gamemaster can */
  1218. X  } else if (user.id != 0 && sp->designation == D_CAPITAL) {
  1219. X    statline2_err("type space to continue", "you cannot be without a capital");
  1220. X  } else {
  1221. X    if (w) {
  1222. X      wmove(w, ZY-5, 1);
  1223. X      wclrtoeol(w);
  1224. X      wmove(w, ZY-5, 1);
  1225. X      for (i = 0; i < D_MAX_DESIG; ++i) {
  1226. X    if (i % 4 == 0) {
  1227. X      wmove(w, ZY-5 + i/4, 1);
  1228. X      wclrtoeol(w);
  1229. X      wmove(w, ZY-5 + i/4, 1);
  1230. X    }
  1231. X    wprintw(w, "[%c]-%s  ", desig_map[i].mark, desig_map[i].name);
  1232. X      }
  1233. X      box(w,'|','-');
  1234. X      wrefresh(w);
  1235. X    } else {            /* expert mode */
  1236. X      statline_prompt("Give new designation: ", "");
  1237. X    }
  1238. X    c = getch();        /* get the new designation */
  1239. X
  1240. X    for (i = 0; i < D_MAX_DESIG; ++i) {
  1241. X      if (desig_map[i].mark == c) {
  1242. X    new_desig = i;
  1243. X    break;
  1244. X      }
  1245. X    }
  1246. X    /* make sure that user's capital is moved (if it is confirmed) */
  1247. X    if ((new_desig == D_CAPITAL) && confirm) {
  1248. X      move_capital(&world.nations[sp->owner], sp);
  1249. X    }
  1250. X  }
  1251. X  if (w) {
  1252. X    wmove(w, ZY-5, 0);
  1253. X    wclrtobot(w);
  1254. X    statline2("", "");
  1255. X  }
  1256. X  if (new_desig==D_CITY && sp->n_people < desig_map[new_desig].min_employed) {
  1257. X    sprintf(s, "need %d people for a city", desig_map[new_desig].min_employed);
  1258. X    statline2_err("type space to continue", s);
  1259. X    new_desig = sp->designation;
  1260. X    confirm = 0;
  1261. X  }
  1262. X
  1263. X  if (np->money < desig_map [new_desig].price && confirm && !(user.id == 0)) {
  1264. X    confirm = 0;
  1265. X    new_desig = sp->designation;
  1266. X    statline2_err ("space to continue", "not enough money");
  1267. X  }
  1268. X
  1269. X  /* only make the actual change if the confirm flag is set */
  1270. X  if ((new_desig != sp->designation) && confirm) {
  1271. X    sp->designation = new_desig;
  1272. X      /* now generate the exec instructions */
  1273. X    sprintf(s, "DESIG_SECTOR:%d:%d:%d\n", x, y, new_desig);
  1274. X    gen_exec(s);
  1275. X    user.np->money -= desig_map[i].price;
  1276. X    cmoney(user.np, -desig_map[new_desig].price);
  1277. X  }
  1278. X  user.just_moved = 1;
  1279. X  return new_desig;
  1280. X}
  1281. X
  1282. X  /* a couple of little routines that generate simple
  1283. X     exec lines, and are used all the time
  1284. X   */
  1285. Xcpeople_sector(sp, p)
  1286. X     Ssector *sp;
  1287. X     int p;
  1288. X{
  1289. X  char s[EXECLEN];
  1290. X
  1291. X  sprintf(s, "CPEOPLE_SECTOR:%d:%d:%d\n", sp->loc.x, sp->loc.y, p);
  1292. X  gen_exec(s);
  1293. X}
  1294. X
  1295. Xcmoney(np, m)
  1296. X     Snation *np;
  1297. X     int m;
  1298. X{
  1299. X  char s[EXECLEN];
  1300. X  sprintf(s, "CMONEY:%d:%d\n", np->id, m);
  1301. X  gen_exec(s);
  1302. X}
  1303. X
  1304. Xcmetal(np, m)
  1305. X     Snation *np;
  1306. X     int m;
  1307. X{
  1308. X  char s[EXECLEN];
  1309. X  sprintf(s, "CMETAL:%d:%d\n", np->id, m);
  1310. X  gen_exec(s);
  1311. X}
  1312. X
  1313. Xcjewels(np, j)
  1314. X     Snation *np;
  1315. X     int j;
  1316. X{
  1317. X  char s[EXECLEN];
  1318. X  sprintf(s, "CJEWELS:%d:%d\n", np->id, j);
  1319. X  gen_exec(s);
  1320. X}
  1321. X
  1322. Xcspell_pts(np, pts)
  1323. X     Snation *np;
  1324. X     int pts;
  1325. X{
  1326. X  char s[EXECLEN];
  1327. X
  1328. X  sprintf(s, "CSPELL_PTS:%d:%d\n", np->id, pts);
  1329. X  gen_exec(s);
  1330. X}
  1331. X
  1332. Xcfood(np, f)
  1333. X     Snation *np;
  1334. X     int f;
  1335. X{
  1336. X  char s[EXECLEN];
  1337. X  sprintf(s, "CFOOD:%d:%d\n", np->id, f);
  1338. X  gen_exec(s);
  1339. X}
  1340. X
  1341. Xctech_skill(np, change)
  1342. X     Snation *np;
  1343. X     int change;
  1344. X{
  1345. X  char s[EXECLEN];
  1346. X  sprintf(s, "CTECH_SKILL:%d:%d\n", np->id, change);
  1347. X  gen_exec(s);
  1348. X}
  1349. X
  1350. Xcmag_skill(np, change)
  1351. X     Snation *np;
  1352. X     int change;
  1353. X{
  1354. X  char s[EXECLEN];
  1355. X  sprintf(s, "CMAG_SKILL:%d:%d\n", np->id, change);
  1356. X  gen_exec(s);
  1357. X}
  1358. X
  1359. X  /* this ensures that the user has only one capital,
  1360. X     when he moves his over.
  1361. X   */
  1362. Xmove_capital(np, sp)
  1363. X     Snation *np;
  1364. X     Ssector *sp;
  1365. X{
  1366. X  char s[EXECLEN];
  1367. X    /* first make the old capital be a simple city */
  1368. X  if (user.id != 0) {
  1369. X    world.map[np->capital.x][np->capital.y].designation = D_CITY;
  1370. X    sprintf(s,"DESIG_SECTOR:%d:%d:%d\n", np->capital.x, np->capital.y, D_CITY);
  1371. X    gen_exec(s);
  1372. X      /* now make this sector be the new capital */
  1373. X  }
  1374. X  np->capital = sp->loc;
  1375. X}
  1376. X
  1377. X  /* dumps the map visible on the screen to a file */
  1378. Xdump_map()
  1379. X{
  1380. X  char s[80], filename[NAMELEN];
  1381. X  sprintf(s, "give a file name (default = \"%s\")", "map");
  1382. X  statline(s, "dump_map");
  1383. X  move(LINES-2, COLS/3);
  1384. X  addstr("> ");
  1385. X  echo();
  1386. X  if (wget_string(NULL,filename,18) <= 0) {
  1387. X    strcpy(filename, "map");
  1388. X  }
  1389. X  noecho();
  1390. X  move(LINES-2, COLS/3);
  1391. X  clrtoeol();
  1392. X  my_scr_dump(stdscr, filename);
  1393. X}
  1394. X
  1395. X  /* mail menu */
  1396. Xmail()
  1397. X{
  1398. X  char *mail_prog;
  1399. X
  1400. X  statline("do you want to (r)ead mail or (w)rite mail", "mail");
  1401. X  switch (getch()) {
  1402. X  case 'r':
  1403. X    refresh();
  1404. X    mail_read(user.id);
  1405. X    clear(); refresh();
  1406. X    user.just_moved = 1;
  1407. X    break;
  1408. X  case 'w':
  1409. X    mail_write();
  1410. X    user.just_moved = 1;
  1411. X    break;
  1412. X  default:
  1413. X    break;
  1414. X  }
  1415. X}
  1416. X
  1417. X/* This function takes care of players' sending mail to other nations.
  1418. X It does all the curses printing and scaning here (That's why it's a bit
  1419. X messy) and calls functions from mail for editing and sending and lock foo. */
  1420. X
  1421. Xmail_write()
  1422. X{
  1423. X  char s[EXECLEN];
  1424. X  int ret, id, done = 0;
  1425. X  char r_name[NAMELEN];
  1426. X  int c;
  1427. X  char tmp_fname[PATHLEN];
  1428. X  char subject[100];
  1429. X  char sender[NAMELEN*2+4],receiver[NAMELEN*2+4];
  1430. X  
  1431. X  clear();
  1432. X  statline("Sending mail","mail_write");
  1433. X  mvaddstr(1,0,"Enter name of recipient (Nation name) ");
  1434. X  ret = wget_name(stdscr,r_name);
  1435. X  if (ret > 0) {
  1436. X    id=get_nation_id(r_name);
  1437. X    if (id>=0) {
  1438. X      if (has_mail_lock(id)) {
  1439. X    mvaddstr(4,0,"The recipient's mailbox is active right now.");
  1440. X    mvaddstr(5,0,"Try sending you mail in a moment.");
  1441. X    refresh();
  1442. X    statline2_err("Press space to return","write_mail");
  1443. X    clear();
  1444. X      } else {
  1445. X    strcpy(tmp_fname, "/usr/tmp/domedXXXXXX");
  1446. X    if (mktemp(tmp_fname) == NULL) {
  1447. X      fprintf(stderr,"Error getting temp file name\n");
  1448. X      fflush(stderr);
  1449. X      return;
  1450. X    }
  1451. X    mvaddstr(4,0,"Subject: ");
  1452. X    refresh();
  1453. X    wget_name(stdscr, subject);
  1454. X    cleanup();
  1455. X    chdir("/usr/tmp");
  1456. X    edit(tmp_fname);
  1457. X    chdir(current_dir);
  1458. X    chdir(libdir);
  1459. X    {
  1460. X      initscr();
  1461. X      savetty();
  1462. X      nonl();
  1463. X      cbreak();
  1464. X      noecho();
  1465. X      clear();
  1466. X    }
  1467. X    mvaddstr(2, 0, "Choices: S)end mail or A)bort sending ");
  1468. X    refresh();
  1469. X    done = 0;
  1470. X    while(!done) {
  1471. X      switch(getch()){
  1472. X      case 'S':
  1473. X      case 's':
  1474. X/*        lock_mail(id); */
  1475. X        mvaddstr(3, 9, "Sending Mail...");
  1476. X          /* Check if mail is being used by/for this user right now */
  1477. X        if (has_mail_lock(id)) {
  1478. X          printf("Found a lock file for receiver %d\n", id);
  1479. X          fflush(stdout);
  1480. X          refresh();
  1481. X          sleep(2);
  1482. X          if(has_mail_lock(id)) {
  1483. X        printf("Found a lock file for receiver %d\n", id);
  1484. X        fflush(stdout);
  1485. X        refresh();
  1486. X        return(1);
  1487. X          }
  1488. X        }
  1489. X        lock_mail(id);
  1490. X        refresh();
  1491. X        mail_send(tmp_fname, user.id, id, subject);
  1492. X        unlock_mail(id);
  1493. X        mvaddstr(3, LINES, "done.");
  1494. X        refresh();
  1495. X        done = 1;
  1496. X        break;
  1497. X      case 'A':
  1498. X        mvaddstr(3, LINES-1, "OK. Aborting...");
  1499. X        refresh();
  1500. X        done = 1;
  1501. X        unlock_mail(id);
  1502. X        break;
  1503. X      }
  1504. X      unlink(tmp_fname);
  1505. X    }
  1506. X    cleanup();
  1507. X    init_screen();
  1508. X      } /* else */
  1509. X    } /* id >= 0 */
  1510. X    else {            /* else we got a bad nation name */
  1511. X      mvaddstr(7,0,"Invalid Nation Name");
  1512. X      statline2_err("Press <SPACE> to return", "Bad Nation Name");
  1513. X      clear();
  1514. X      refresh();
  1515. X    } /* else */
  1516. X  } /* ret > 0 */
  1517. X  clear(); refresh();
  1518. X} /* mail_write */
  1519. END_OF_FILE
  1520. if test 17606 -ne `wc -c <'commands.c'`; then
  1521.     echo shar: \"'commands.c'\" unpacked with wrong size!
  1522. fi
  1523. # end of 'commands.c'
  1524. fi
  1525. if test -f 'reports.c' -a "${1}" != "-c" ; then 
  1526.   echo shar: Will not clobber existing file \"'reports.c'\"
  1527. else
  1528. echo shar: Extracting \"'reports.c'\" \(17594 characters\)
  1529. sed "s/^X//" >'reports.c' <<'END_OF_FILE'
  1530. X /* reports.c -- all things from the 'r' menu */
  1531. X
  1532. X/*
  1533. X * Copyright (C) 1990 Free Software Foundation, Inc.
  1534. X * Written by the dominion project.
  1535. X *
  1536. X * This file is part of dominion.
  1537. X *
  1538. X * dominion is free software; you can redistribute it and/or
  1539. X * modify it under the terms of the GNU General Public License as published
  1540. X * by the Free Software Foundation; either version 1, or (at your option)
  1541. X * any later version.
  1542. X *
  1543. X * This software is distributed in the hope that it will be useful,
  1544. X * but WITHOUT ANY WARRANTY; without even the implied warranty of
  1545. X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1546. X * GNU General Public License for more details.
  1547. X *
  1548. X * You should have received a copy of the GNU General Public License
  1549. X * along with this software; see the file COPYING.  If not, write to
  1550. X * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  1551. X */
  1552. X
  1553. X#include "dominion.h"
  1554. X#include "misc.h"
  1555. X#include <stdio.h>
  1556. X#include <ctype.h>
  1557. X
  1558. Xextern Sworld world;
  1559. Xextern Suser user;
  1560. Xextern WINDOW *sectw;
  1561. Xextern char *libdir;
  1562. Xextern char help_tag[];
  1563. X#ifdef BSD
  1564. X extern char current_dir[];
  1565. X#else /* BSD */
  1566. X extern char *current_dir;
  1567. X#endif
  1568. Xextern int ruid, euid;
  1569. X
  1570. X  /* each report returns a char */
  1571. Xchar info_report(), production_report(), nations_report();
  1572. X
  1573. X
  1574. Xextern char diplo_report (), budget_report ();
  1575. X
  1576. Xreport_menu()        /* this gives a menu of possible report forms */
  1577. X{
  1578. X  WINDOW *repw;
  1579. X  char c, exit_c = ' ';
  1580. X  FILE *fp, *fopen(), *diplock;
  1581. X  int done = 0;
  1582. X  char filename[80];
  1583. X
  1584. X  strcpy(help_tag, "Reports");
  1585. X
  1586. X  if (user.xmode) {
  1587. X    repw = NULL;
  1588. X  } else {
  1589. X    repw = newwin(5, 60, LINES-7, 10);
  1590. X  }
  1591. X  while (!done) {
  1592. X    if (exit_c == ' ') {
  1593. X      touch_all_wins();
  1594. X
  1595. X      if (user.xmode) {
  1596. X    statline_prompt("Report: (i,b,p,n,d,v)", "report_menu");
  1597. X      } else {
  1598. X    statline("choose the form you want (space to exit)", "report_menu");
  1599. X    wmove(repw, 1, 1);
  1600. X    waddstr(repw, "your nation:       [i]nfo [b]udget [p]roduction");
  1601. X    wmove(repw, 2, 1);
  1602. X    waddstr(repw, "the whole world:   ");
  1603. X    waddstr(repw, "[n]ations [d]iplomacy");
  1604. X    wmove(repw, 3, 1);
  1605. X    waddstr(repw,
  1606. X        "  or type [v] to view a report that was saved to a file");
  1607. X    wclrtobot(repw);
  1608. X    box(repw, '|', '-');
  1609. X    wrefresh(repw);
  1610. X      }
  1611. X    }
  1612. X
  1613. X    if (exit_c != ' ') 
  1614. X      c = exit_c;
  1615. X    else
  1616. X      do { c = getch (); } while (strchr (" ibpndv", c) == NULL);
  1617. X
  1618. X    switch (c) {
  1619. X    case ' ':
  1620. X      done = 1;
  1621. X      break;
  1622. X    case 'v':
  1623. X#ifdef NO_FILE_ACCESS
  1624. X      statline2_err("Hit space", "File access is disabled");
  1625. X#else
  1626. X      if (user.xmode) {
  1627. X    statline_prompt("file you want to view: ", "reports_menu");
  1628. X      } else {
  1629. X    wmove (repw, 3, 4);
  1630. X    wclrtoeol (repw);
  1631. X    mvwaddstr(repw, 3, 4, "give file name you want to view: ");
  1632. X    box (repw, '|', '-');
  1633. X    wrefresh(repw);
  1634. X      }
  1635. X      if (wget_name(repw, filename) > 0) {
  1636. X    /*   erase();      /* now erase the screen so we can view the report */
  1637. X    werase(sectw);
  1638. X    if (!user.xmode) {
  1639. X      werase(repw);
  1640. X    }
  1641. X    /*      wrefresh(repw); */
  1642. X    /*      scr_restore(filename); */
  1643. X
  1644. X    if (my_scr_restore(filename) != -1) {
  1645. X    /*      doupdate(); */
  1646. X    }
  1647. X    if (!user.xmode) {
  1648. X      wclrtobot(repw);
  1649. X    }
  1650. X      }
  1651. X#endif NO_FILE_ACCESS
  1652. X      break;
  1653. X    case 'i':
  1654. X      exit_c = info_report(user.np);
  1655. X      break;
  1656. X    case 'b':
  1657. X      exit_c = budget_report(user.np);
  1658. X      break;
  1659. X    case 'p':
  1660. X      exit_c = production_report(user.np);
  1661. X      break;
  1662. X    case 'n':
  1663. X      exit_c = nations_report();
  1664. X      break;
  1665. X    case 'd':
  1666. X      exit_c = diplo_report(user.np);
  1667. X      break;
  1668. X    case '?':
  1669. X      online_info();
  1670. X      break;
  1671. X    }
  1672. X    if (!user.xmode) {
  1673. X      statline("choose the form you want (space to exit)", "report_menu");
  1674. X      touchwin(repw);
  1675. X    }
  1676. X  }
  1677. X  if (!user.xmode) {
  1678. X    delwin(repw);
  1679. X  }
  1680. X  touchwin(stdscr);
  1681. X  user.just_moved = 1;
  1682. X}
  1683. X
  1684. X  /* info about a specific nation */
  1685. Xchar info_report(np)
  1686. X     Snation *np;
  1687. X{
  1688. X  WINDOW *w;
  1689. X  FILE *diplock;
  1690. X  char s[80];
  1691. X  char c;
  1692. X  int done = 0;
  1693. X
  1694. X  strcpy(help_tag, "Information Report");
  1695. X  w = newwin(LINES-2, COLS, 0, 0); /* full screen */
  1696. X
  1697. X  touchwin(w);
  1698. X    /* now a tedious list of stuff */
  1699. X  while (!done) {
  1700. X    draw_info_screen(w, np);
  1701. X
  1702. X    statline("type space when done, or F to dump to a file", "info_report");
  1703. X
  1704. X    switch (c = getch()) {
  1705. X    case CTL('L'):
  1706. X      wclear (w);
  1707. X      draw_info_screen (w, np);
  1708. X      break;
  1709. X    case 'P':
  1710. X      change_passwd(np, w);
  1711. X      break;
  1712. X    case 'l':
  1713. X      change_leader(np, w);
  1714. X      break;
  1715. X    case 't':            /* rotate values for the npc flag */
  1716. X      np->npc_flag = (np->npc_flag + 1) % 3;
  1717. X      if (np->npc_flag) {
  1718. X    sprintf(s, "SET_NPC:%d\n", np->id);
  1719. X      } else {
  1720. X    sprintf(s, "CLEAR_NPC:%d\n", np->id);
  1721. X      }
  1722. X      gen_exec(s);
  1723. X      break;
  1724. X    case 'a':            /* set the aggressiveness paramter */
  1725. X      if (np->npc_flag) {
  1726. X    set_aggressiveness(np, w);
  1727. X      }
  1728. X      break;
  1729. X    case 'F':
  1730. X      dump_current_screen(w, "info_report");
  1731. X      break;
  1732. X    case ' ':
  1733. X    case 'b':            /* go to other reports */
  1734. X    case 'p':
  1735. X    case 'n':
  1736. X    case 'd':
  1737. X      done = 1;
  1738. X      break;
  1739. X    case '?':
  1740. X      online_info();
  1741. X      break;
  1742. X    default:
  1743. X      break;
  1744. X    }
  1745. X    wrefresh(w);
  1746. X    statline2("", "");
  1747. X  }
  1748. X  delwin(w);
  1749. X/*  touch_all_wins(); */
  1750. X/*  refresh(); */
  1751. X  return c;
  1752. X}
  1753. X
  1754. X/* */
  1755. Xdraw_info_screen (w, np)
  1756. X
  1757. XWINDOW * w;
  1758. XSnation * np;
  1759. X{
  1760. X  char s [EXECLEN];
  1761. X
  1762. X  sprintf(s, "Info Report for Nation %s", np->name);
  1763. X  wmove(w, 0, (COLS-strlen(s))/2 - 4); /* make the string centered */
  1764. X  wstandout(w);
  1765. X  waddstr(w, s);
  1766. X  wstandend(w);
  1767. X  mvwprintw(w, 1, COLS/3+7, "Thon %d", world.turn);
  1768. X  mvwprintw(w, 3, 0, "Nation:  %s", np->name);
  1769. X  switch(np->npc_flag) {
  1770. X  case NPC_NOMAIL:
  1771. X    mvwaddstr(w, 2, 8, " [npc]     ");
  1772. X    break;
  1773. X  case NPC_MAIL:
  1774. X    mvwaddstr(w, 2, 8, " [npc+mail]");
  1775. X    break;
  1776. X  case NOT_NPC:
  1777. X  default:
  1778. X    mvwaddstr(w, 2, 8, "           ");
  1779. X    break;
  1780. X  }
  1781. X/*
  1782. X  if (!np->npc_flag) {
  1783. X    waddstr(w, "           ");
  1784. X  } else if (np->npc_flag == 1) {
  1785. X/*    waddstr(w, " [npc: aggress. %d]", np->npc_agg); */
  1786. X/*    waddstr(w, " [npc]");
  1787. X  } else {            /* for npc_flag == 2 */
  1788. X/*    waddstr(w, " [npc+mail]");
  1789. X  }
  1790. X*/
  1791. X  mvwprintw(w, 4, 0, "Id:      %d", np->id);
  1792. X  mvwprintw(w, 5, 0, "Leader:  %s    ", np->leader);
  1793. X  mvwprintw(w, 6, 0, "Capital: (%d,%d)",
  1794. X        xrel(np->capital.x,np->capital.y,user.np->capital),
  1795. X        yrel(np->capital.x,np->capital.y,user.np->capital));
  1796. X  mvwprintw(w, 7, 0, "Race:    %s", np->race.name);
  1797. X  mvwprintw(w, 8, 0, "Mark:    %c", np->mark);
  1798. X  mvwprintw(w, 3, COLS/3, "Sectors:  %d", np->n_sects);
  1799. X  mvwprintw(w, 4, COLS/3, "Treasury: %d", np->money);
  1800. X  mvwprintw(w, 5, COLS/3, "Jewels:   %d", np->jewels);
  1801. X  mvwprintw(w, 6, COLS/3, "Metal:    %d", np->metal);
  1802. X  mvwprintw(w, 7, COLS/3, "Food:     %d", np->food);
  1803. X  mvwprintw(w,  3, (2*COLS)/3, "Birth rate:  %d%%", np->race.repro);
  1804. X  mvwprintw(w,  4, (2*COLS)/3, "Mortality:   %d%%", np->race.mortality);
  1805. X  mvwprintw(w,  5, (2*COLS)/3, "Strength:    %d", np->race.strength);
  1806. X  mvwprintw(w,  6, (2*COLS)/3, "Intel: %d + %d = %d", np->race.intel,
  1807. X        univ_intel(np), np->race.intel + univ_intel(np));
  1808. X  mvwprintw(w,  7, (2*COLS)/3, "Magic Apt: %d + %d = %d", np->race.mag_apt,
  1809. X        priestliness(np), np->race.mag_apt + priestliness(np));
  1810. X  mvwprintw(w,  8, (2*COLS)/3, "Speed:       %d", np->race.speed);
  1811. X  mvwprintw(w,  9, (2*COLS)/3, "Stealth:     %d", np->race.stealth);
  1812. X
  1813. X  mvwprintw(w, 11, (2*COLS)/3, "Civilians:     %d", get_n_civil(np));
  1814. X  mvwprintw(w, 12, (2*COLS)/3, "Soldiers:      %d", get_n_soldiers(np));
  1815. X  mvwprintw(w, 13, (2*COLS)/3, "Armies:        %d", np->n_armies);
  1816. X  mvwprintw(w, 14, (2*COLS)/3, "Attack bonus:  %d%%", np->attack);
  1817. X  mvwprintw(w, 15, (2*COLS)/3, "Defense bonus: %d%%", np->defense);
  1818. X  mvwprintw(w, 16, (2*COLS)/3, "Move points:   %d", basic_move_rate(np));
  1819. X
  1820. X  mvwprintw(w, 10, 0, "Initiated to the magical order %s", np->mag_order);
  1821. X  mvwprintw(w, 11, 0, "Magic skill:       %d", np->mag_skill);
  1822. X  mvwprintw(w, 12, 0, "Spell points:      %d (%d in maint)", np->spell_pts,
  1823. X        military_maint_spell_pts(np));
  1824. X  mvwprintw(w, 13, 0, "Technology skill:  %d", np->tech_skill);
  1825. X  mvwprintw(w, 14, 0, "Farming skill:     %d", np->farm_skill);
  1826. X  mvwprintw(w, 15, 0, "Mining skill:      %d", np->mine_skill);
  1827. X  mvwprintw(w, 16, 0, "Spy skill:         %d", np->spy);
  1828. X  mvwprintw(w, 17, 0, "Secrecy:           %d", np->secrecy);
  1829. X
  1830. X  mvwprintw(w, LINES-5, 4,
  1831. X        "Options: [P]assd change, [l]eader change, [t]oggle npc");
  1832. X  if (np->npc_flag) {
  1833. X    waddstr(w, ", [a]ggr.");
  1834. X  } else {
  1835. X    wclrtoeol(w);
  1836. X  }
  1837. X  mvwprintw(w, LINES-4, 4,
  1838. X        "Reports: [b]udget, [p]roduction, [n]ations, [d]iplomacy");
  1839. X  wclrtobot(w);
  1840. X  wrefresh(w);
  1841. X}
  1842. X
  1843. X  /* a nation's production report:  this gives detail on where
  1844. X     all the income comes from (mines, cities...) and so on
  1845. X   */
  1846. Xchar production_report(np)
  1847. X     Snation *np;
  1848. X{
  1849. X  WINDOW *w;
  1850. X  FILE *diplock;
  1851. X  char s[EXECLEN];
  1852. X  char c;
  1853. X  int n, done = 0, percent_expend, ret;
  1854. X
  1855. X  strcpy(help_tag, "Production Report");
  1856. X
  1857. X  w = newwin(LINES-2, COLS, 0, 0); /* full screen */
  1858. X  statline2 ("", "");
  1859. X  touchwin(w);
  1860. X
  1861. X  while (!done) {
  1862. X    draw_production_screen (w, np);
  1863. X
  1864. X    statline("type space when done, or F to dump to a file",
  1865. X         "production_report");
  1866. X
  1867. X    switch (c = getch()) {
  1868. X    case CTL('L'):
  1869. X      wclear (w);
  1870. X      draw_production_screen (w, np);
  1871. X      break;
  1872. X    case ' ':
  1873. X      done = 1;
  1874. X      break;
  1875. X    case 'F':
  1876. X      dump_current_screen(w, "production_report");
  1877. X      break;
  1878. X    case 'b':
  1879. X    case 'i':
  1880. X    case 'n':
  1881. X    case 'd':
  1882. X      done = 1;
  1883. X      break;
  1884. X    case '?':
  1885. X      online_info();
  1886. X      break;
  1887. X    default:
  1888. X      break;
  1889. X    }
  1890. X  }
  1891. X
  1892. X  delwin(w);
  1893. X/*  touch_all_wins(); */
  1894. X/*  refresh(); */
  1895. X  return c;
  1896. X}
  1897. X
  1898. Xdraw_production_screen (w, np)
  1899. X
  1900. XWINDOW * w;
  1901. XSnation * np;
  1902. X{
  1903. X  char s [EXECLEN];
  1904. X
  1905. X  int emp, emp_met, emp_jwl, emp_farm, emp_serv, n_civil;
  1906. X
  1907. X  emp = get_employed(np);
  1908. X  emp_met = get_emp_met(np);
  1909. X  emp_jwl = get_emp_jwl(np);
  1910. X  emp_farm = get_emp_farm(np);
  1911. X  emp_serv = get_emp_serv(np);
  1912. X  n_civil = get_n_civil(np);
  1913. X  
  1914. X  sprintf(s, "Production Report for Nation %s", np->name);
  1915. X  wmove(w, 0, (COLS-strlen(s))/2 - 4); /* make the string centered */
  1916. X  wstandout(w);
  1917. X  waddstr(w, s);
  1918. X  wstandend(w);
  1919. X  wclrtoeol(w);
  1920. X  /* now a tedious list of stuff */
  1921. X  mvwprintw(w, 2, 0, "  Job");
  1922. X  mvwprintw(w, 3, 0, "--------");
  1923. X  mvwprintw(w, 2, COLS/4-5, "# employed (unemp.)");
  1924. X  mvwprintw(w, 3, COLS/4-5, "-------------------", world.turn);
  1925. X  mvwprintw(w, 2, (2*COLS)/4-3, "Revenue");
  1926. X  mvwprintw(w, 3, (2*COLS)/4-3, "-------");
  1927. X  mvwprintw(w, 2, (3*COLS)/4-5, "prod/person");
  1928. X  mvwprintw(w, 3, (3*COLS)/4-5, "-----------");
  1929. X  mvwprintw(w, 4, 0, "General");
  1930. X  mvwprintw(w, 5, 0, "Metal miners");
  1931. X  mvwprintw(w, 6, 0, "Jewel miners");
  1932. X  mvwprintw(w, 7, 0, "Farmers");
  1933. X  mvwprintw(w, 8, 0, "Services");
  1934. X  /* number of people */
  1935. X  mvwprintw(w, 4, COLS/4-2, "%6d (%d)", emp, get_unemployed(np));
  1936. X  mvwprintw(w, 5, COLS/4-2, "%6d (%d)", emp_met, get_unemp_met(np));
  1937. X  mvwprintw(w, 6, COLS/4-2, "%6d (%d)", emp_jwl, get_unemp_jwl(np));
  1938. X  mvwprintw(w, 7, COLS/4-2, "%6d (%d)", emp_farm, get_unemp_farm(np));
  1939. X  mvwprintw(w, 8, COLS/4-2, "%6d (%d)", emp_serv, get_unemp_serv(np));
  1940. X  
  1941. X  /* revenue */
  1942. X  mvwprintw(w, 4, (2*COLS)/4-3, "%7d (%d%% tax)        ",
  1943. X        calc_revenue(np), np->taxes);
  1944. X  mvwprintw(w, 5, (2*COLS)/4-3, "%7d   ", calc_metal(np));
  1945. X  mvwprintw(w, 6, (2*COLS)/4-3, "%7d   ", calc_jewels(np));
  1946. X  mvwprintw(w, 7, (2*COLS)/4-3, "%7d   ", calc_food(np));
  1947. X  mvwprintw(w, 8, (2*COLS)/4-3, "%7d   ", calc_serv_revenue(np));
  1948. X  
  1949. X  /* revenue/person */
  1950. X  mvwprintw(w, 4, (3*COLS)/4-3, "%5.2f   sk.",
  1951. X        emp ? calc_revenue(np)/(1.0*emp) : 0, np->taxes);
  1952. X  mvwprintw(w, 5, (3*COLS)/4-3,"%5.2f   met.",
  1953. X        emp_met ? calc_metal(np)/(1.0*emp_met) : 0.0);
  1954. X  mvwprintw(w, 6, (3*COLS)/4-3,"%5.2f   jwl.",
  1955. X        emp_jwl ? calc_jewels(np)/(1.0*emp_jwl) : 0.0);
  1956. X  mvwprintw(w, 7, (3*COLS)/4-3,"%5.2f   food",
  1957. X        emp_farm ? calc_food(np)/(1.0*emp_farm) : 0.0);
  1958. X  mvwprintw(w, 8, (3*COLS)/4-3,"%5.2f   sk.",
  1959. X        emp_serv ? calc_serv_revenue(np)/(1.0*emp_serv) : 0.0);
  1960. X  
  1961. X  /* other statistics */
  1962. X  mvwprintw(w, 10, COLS/5, "Total people: %d  ",
  1963. X          n_civil + get_n_soldiers(np));
  1964. X    mvwprintw(w, 11, COLS/5, "Civilians:    %d  ", n_civil);
  1965. X    mvwprintw(w, 12, COLS/5, "Employed:     %d  ", get_employed(np));
  1966. X    mvwprintw(w, 13, COLS/5, "Unemployed:   %d  ", get_unemployed(np));
  1967. X    mvwprintw(w, 14, COLS/5, "Soldiers:     %d  ", get_n_soldiers(np));
  1968. X    mvwprintw(w, 15, COLS/5, "Unemp. rate:  %d%%  ", n_civil == 0 ? 0 :
  1969. X          (100*get_unemployed(np))/n_civil);
  1970. X
  1971. X    mvwprintw(w, 20, 4, "Reports: [b]udget, [i]info, [n]ations, [d]iplomacy");
  1972. X    wclrtobot(w);
  1973. X    wrefresh(w);
  1974. X}
  1975. X
  1976. X
  1977. X  /* this prompts for a file name and then dumps
  1978. X     the current screen to that file
  1979. X   */
  1980. Xdump_current_screen(w, def_filename)
  1981. X     WINDOW *w;
  1982. X     char def_filename[];
  1983. X{
  1984. X  char filename[80], s[80];
  1985. X
  1986. X#ifdef NO_FILE_ACCESS
  1987. X  statline2_err("Hit space", "File access disabled");
  1988. X#else  
  1989. X  sprintf(s, "give file name (default = \"%s%d\")", def_filename, world.turn);
  1990. X  statline2(s, "dump_current_screen");
  1991. X  move(LINES-3, 0);
  1992. X  clrtoeol();
  1993. X  move(LINES-3, COLS/3);
  1994. X  addstr("> ");
  1995. X  echo();
  1996. X  if (scanw("%18s", filename) < 1) {
  1997. X    strcpy(filename, def_filename);
  1998. X    sprintf(filename, "%s%d",  def_filename, world.turn);
  1999. X  }
  2000. X  noecho();
  2001. X  move(LINES-3, COLS/3);
  2002. X  clrtoeol();
  2003. X  statline2("", "");
  2004. X  my_scr_dump(w, filename);
  2005. X/*  scr_dump(filename); /* the curses scr_dump() isn't good enough */
  2006. X#endif
  2007. X}
  2008. X
  2009. X  /* the curses routine is not very nice, since it
  2010. X     can only be read-in by curses.  hence this.
  2011. X   */
  2012. Xmy_scr_dump(w, fname)
  2013. X     WINDOW *w;
  2014. X     char fname[];
  2015. X{
  2016. X  int x, y;
  2017. X  char c;
  2018. X  FILE *fp, *fopen();
  2019. X
  2020. X#ifdef UID_SECURITY
  2021. X  if (fork() == 0) {        /* child has fork() == 0 */
  2022. X      /* first change back to the user's current directory */
  2023. X    setuid(ruid);
  2024. X    chdir(current_dir);
  2025. X/*    printf("\r\nnow I am %d, changed to %s\n\r", ruid, current_dir); */
  2026. X      /* dilemma:  should we overwrite or append? */
  2027. X    if ((fp = fopen(fname, "w")) == NULL) {
  2028. X      exit(1);
  2029. X    }
  2030. X/*    printf("\r\n writing out the file %s in %s\n\r", fname, current_dir); */
  2031. X    for (y = 0; y < LINES; ++y) {
  2032. X      for (x = 0; x < COLS; ++x) {
  2033. X    wmove(w, y, x);
  2034. X    c=winch(w);
  2035. X    fputc(c, fp);
  2036. X      }
  2037. X      fputc('\n', fp);
  2038. X    }
  2039. X    fclose(fp);
  2040. X    exit(0);
  2041. X  }
  2042. X  wait(0);
  2043. X#else /* UID_SECURITY */
  2044. X    /* dilemma:  should we overwrite or append? */
  2045. X  if ((fp = fopen(fname, "w")) == NULL) {
  2046. X    return -1;
  2047. X  }
  2048. X  for (y = 0; y < LINES; ++y) {
  2049. X    for (x = 0; x < COLS; ++x) {
  2050. X      wmove(w, y, x);
  2051. X      c=winch(w);
  2052. X      fputc(c, fp);
  2053. X    }
  2054. X    fputc('\n', fp);
  2055. X  }
  2056. X  fclose(fp);
  2057. X#endif /* UID_SECURITY */
  2058. X  return 1;
  2059. X}
  2060. X
  2061. X  /* this restores a dump made with our custom screen dump routine */
  2062. Xmy_scr_restore(fname)
  2063. X     char fname[];
  2064. X{
  2065. X  int x, y;
  2066. X  char c;
  2067. X  FILE *fp, *fopen();
  2068. X  WINDOW *restw;
  2069. X
  2070. X
  2071. X#ifdef UID_SECURITY
  2072. X  if (fork() == 0) {
  2073. X    setuid(ruid);
  2074. X    chdir(current_dir);
  2075. X    if ((fp = fopen(fname, "r")) == NULL) {
  2076. X      exit(1);
  2077. X    }
  2078. X    restw = newwin(LINES, COLS, 0, 0);
  2079. X    werase(restw);
  2080. X    touchwin(restw);
  2081. X    for (y = 0; y < LINES; ++y) {
  2082. X      for (x = 0; x < COLS; ++x) {
  2083. X    c = fgetc(fp);
  2084. X    if ((c == '\n') || (c == '\r')) {
  2085. X      --x;
  2086. X      continue;        /* wow!!! a use for continue!!! */
  2087. X    }
  2088. X    mvwaddch(restw, y, x, c);
  2089. X      }
  2090. X      wclrtoeol(restw);
  2091. X    }
  2092. X    wclrtobot(restw);
  2093. X    wrefresh(restw);
  2094. X    fclose(fp);
  2095. X    statline2_err("type space to go on", "view_saved_report");
  2096. X    delwin(restw);
  2097. X    exit(0);
  2098. X  }                /* we close the "if (fork() == 0) {" */
  2099. X  wait(0);
  2100. X#else /* UID_SECURITY */
  2101. X  if ((fp = fopen(fname, "r")) == NULL) {
  2102. X    return -1;
  2103. X  }
  2104. X  restw = newwin(COLS, LINES, 0, 0);
  2105. X
  2106. X  for (y = 0; y < LINES; ++y) {
  2107. X    for (x = 0; x < COLS; ++x) {
  2108. X      c = fgetc(fp);
  2109. X      if ((c == '\n') || (c == '\r')) {
  2110. X    --x;
  2111. X    continue;        /* wow!!! a use for continue!!! */
  2112. X      }
  2113. X      mvwaddch(restw, y, x, c);
  2114. X    }
  2115. X    wclrtoeol(restw);
  2116. X  }
  2117. X  wclrtobot(restw);
  2118. X  fclose(fp);
  2119. X  delwin(restw);
  2120. X  statline2_err("type space to go on", "view_saved_report");
  2121. X#endif /* UID_SECURITY */
  2122. X  touch_all_wins();
  2123. X  refresh();
  2124. X  user.just_moved = 1;
  2125. X  return 1;
  2126. X}
  2127. X
  2128. X  /* let a nation change its password */
  2129. Xchange_passwd(np, w)
  2130. X     Snation *np;
  2131. X     WINDOW *w;
  2132. X{
  2133. X  char old_p[NAMELEN], try1[NAMELEN], try2[NAMELEN];
  2134. X
  2135. X  wmove(w, w->_maxy-3, 0);
  2136. X  wclrtobot(w);
  2137. X  wmove(w, w->_maxy-3, 6);
  2138. X  wrefresh(w);
  2139. X  /* if it is NOT the Gamemaster, then we have to make sure
  2140. X     this user knows the old password.  Gamemaster, instead,
  2141. X     can change passwds without knowing the old ones.
  2142. X   */
  2143. X  if (user.id != 0) {
  2144. X    get_crypt_pass("Old password: ", old_p, w, NULL);
  2145. X    wmove(w, w->_maxy-3, 6);
  2146. X    wrefresh(w);
  2147. X    if (strcmp(old_p, np->passwd) != 0) {
  2148. X      statline2_err("Hit space", "sorry");
  2149. X      wmove(w, w->_maxy-4, 0);
  2150. X      wclrtobot(w);
  2151. X      wrefresh(w);
  2152. X      return -1;
  2153. X    }
  2154. X  }
  2155. X  get_crypt_pass("New password:  ", try1, w, NULL);
  2156. X  wmove(w, w->_maxy-3, 6);
  2157. X  wrefresh(w);
  2158. X  get_crypt_pass("Type it again: ", try2, w, NULL);
  2159. X  while (strcmp(try1, try2) != 0) {
  2160. X    mvwprintw(w, 20, 6, "They don't match, try again");
  2161. X    wmove(w, w->_maxy-3, 6);
  2162. X    wrefresh(w);
  2163. X    get_crypt_pass("New password:  ", try1, w, NULL);
  2164. X    wmove(w, w->_maxy-3, 6);
  2165. X    wrefresh(w);
  2166. X    get_crypt_pass("Type it again: ", try2, w, NULL);
  2167. X  }
  2168. X  strcpy(np->passwd, try1);
  2169. X  cpass(np, try1);        /* generate the exec line */
  2170. X  wmove(w, w->_maxy-4, 0);
  2171. X  wclrtobot(w);
  2172. X}
  2173. X
  2174. X  /* allow a user to change their leader */
  2175. Xchange_leader(np, w)
  2176. X     Snation *np;
  2177. X     WINDOW *w;
  2178. X{
  2179. X  char name[NAMELEN], s[EXECLEN];
  2180. X
  2181. X  mvwprintw(w, 21, 6, "What is the new name of your leader? ");
  2182. X  if (wget_name(w, name) > 0) {
  2183. X    strcpy(np->leader, name);
  2184. X    sprintf(s, "NATION_LEADER:%d:%s\n", np->id, name);
  2185. X    gen_exec(s);
  2186. X  }
  2187. X}
  2188. END_OF_FILE
  2189. if test 17594 -ne `wc -c <'reports.c'`; then
  2190.     echo shar: \"'reports.c'\" unpacked with wrong size!
  2191. fi
  2192. # end of 'reports.c'
  2193. fi
  2194. echo shar: End of archive 23 \(of 28\).
  2195. cp /dev/null ark23isdone
  2196. MISSING=""
  2197. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ; do
  2198.     if test ! -f ark${I}isdone ; then
  2199.     MISSING="${MISSING} ${I}"
  2200.     fi
  2201. done
  2202. if test "${MISSING}" = "" ; then
  2203.     echo You have unpacked all 28 archives.
  2204.     echo "Now execute ./do_cat.sh to build doc files"
  2205.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2206. else
  2207.     echo You still need to unpack the following archives:
  2208.     echo "        " ${MISSING}
  2209. fi
  2210. ##  End of shell archive.
  2211. exit 0
  2212.