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

  1.  /* reports.c -- all things from the 'r' menu */
  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. extern int ruid, euid;
  40.  
  41.   /* each report returns a char */
  42. char info_report(), production_report(), nations_report();
  43.  
  44.  
  45. extern char diplo_report (), budget_report ();
  46.  
  47. report_menu()        /* this gives a menu of possible report forms */
  48. {
  49.   WINDOW *repw;
  50.   char c, exit_c = ' ';
  51.   FILE *fp, *fopen(), *diplock;
  52.   int done = 0;
  53.   char filename[80];
  54.  
  55.   strcpy(help_tag, "Reports");
  56.  
  57.   if (user.xmode) {
  58.     repw = NULL;
  59.   } else {
  60.     repw = newwin(5, 60, LINES-7, 10);
  61.   }
  62.   while (!done) {
  63.     if (exit_c == ' ') {
  64.       touch_all_wins();
  65.  
  66.       if (user.xmode) {
  67.     statline_prompt("Report: (i,b,p,n,d,v)", "report_menu");
  68.       } else {
  69.     statline("choose the form you want (space to exit)", "report_menu");
  70.     wmove(repw, 1, 1);
  71.     waddstr(repw, "your nation:       [i]nfo [b]udget [p]roduction");
  72.     wmove(repw, 2, 1);
  73.     waddstr(repw, "the whole world:   ");
  74.     waddstr(repw, "[n]ations [d]iplomacy");
  75.     wmove(repw, 3, 1);
  76.     waddstr(repw,
  77.         "  or type [v] to view a report that was saved to a file");
  78.     wclrtobot(repw);
  79.     box(repw, '|', '-');
  80.     wrefresh(repw);
  81.       }
  82.  
  83.     }
  84.  
  85.     if (exit_c != ' ') 
  86.       c = exit_c;
  87.     else
  88.       do { c = getch (); } while (strchr (" ibpndv", c) == NULL);
  89.  
  90.     switch (c) {
  91.     case ' ':
  92.       done = 1;
  93.       break;
  94.     case 'v':
  95. #ifdef NO_FILE_ACCESS
  96.       statline2_err("Hit space", "File access is disabled");
  97. #else
  98.       if (user.xmode) {
  99.     statline_prompt("file you want to view: ", "reports_menu");
  100.       } else {
  101.     wmove (repw, 3, 4);
  102.     wclrtoeol (repw);
  103.     mvwaddstr(repw, 3, 4, "give file name you want to view: ");
  104.     box (repw, '|', '-');
  105.     wrefresh(repw);
  106.       }
  107.       if (wget_name(repw, filename) > 0) {
  108.     /*   erase();      /* now erase the screen so we can view the report */
  109.     werase(sectw);
  110.     if (!user.xmode) {
  111.       werase(repw);
  112.     }
  113.     /*      wrefresh(repw); */
  114.     /*      scr_restore(filename); */
  115.  
  116.     if (my_scr_restore(filename) != -1) {
  117.     /*      doupdate(); */
  118.     }
  119.     if (!user.xmode) {
  120.       wclrtobot(repw);
  121.     }
  122.       }
  123. #endif NO_FILE_ACCESS
  124.       break;
  125.     case 'i':
  126.       exit_c = info_report(user.np);
  127.       break;
  128.     case 'b':
  129.       exit_c = budget_report(user.np);
  130.       break;
  131.     case 'p':
  132.       exit_c = production_report(user.np);
  133.       break;
  134.     case 'n':
  135.       exit_c = nations_report();
  136.       break;
  137.     case 'd':
  138.       exit_c = diplo_report(user.np);
  139.       break;
  140.     case '?':
  141.       online_info();
  142.       break;
  143.     }
  144.     if (!user.xmode) {
  145.       statline("choose the form you want (space to exit)", "report_menu");
  146.       touchwin(repw);
  147.     }
  148.   }
  149.   if (!user.xmode) {
  150.     delwin(repw);
  151.   }
  152.   touchwin(stdscr);
  153.   user.just_moved = 1;
  154. }
  155.  
  156.   /* info about a specific nation */
  157. char info_report(np)
  158.      Snation *np;
  159. {
  160.   WINDOW *w;
  161.   FILE *diplock;
  162.   char s[80];
  163.   char c;
  164.   int done = 0;
  165.  
  166.   strcpy(help_tag, "Information Report");
  167.   w = newwin(LINES-2, COLS, 0, 0); /* full screen */
  168.  
  169.   touchwin(w);
  170.     /* now a tedious list of stuff */
  171.   while (!done) {
  172.     draw_info_screen(w, np);
  173.  
  174.     statline("type space when done, or F to dump to a file", "info_report");
  175.  
  176.     switch (c = getch()) {
  177.     case CTL('L'):
  178.       wclear (w);
  179.       draw_info_screen (w, np);
  180.       break;
  181.     case 'P':
  182.       change_passwd(np, w);
  183.       break;
  184.     case 'l':
  185.       change_leader(np, w);
  186.       break;
  187.     case 't':            /* rotate values for the npc flag */
  188.       np->npc_flag = (np->npc_flag + 1) % 3;
  189.       if (np->npc_flag) {
  190.     sprintf(s, "SET_NPC:%d\n", np->id);
  191.       } else {
  192.     sprintf(s, "CLEAR_NPC:%d\n", np->id);
  193.       }
  194.       gen_exec(s);
  195.       break;
  196.     case 'a':            /* set the aggressiveness paramter */
  197.       if (np->npc_flag) {
  198.     set_aggressiveness(np, w);
  199.       }
  200.       break;
  201.     case 'F':
  202.       dump_current_screen(w, "info_report");
  203.       break;
  204.     case ' ':
  205.     case 'b':            /* go to other reports */
  206.     case 'p':
  207.     case 'n':
  208.     case 'd':
  209.       done = 1;
  210.       break;
  211.     case '?':
  212.       online_info();
  213.       break;
  214.     default:
  215.       break;
  216.     }
  217.     wrefresh(w);
  218.     statline2("", "");
  219.   }
  220.   delwin(w);
  221. /*  touch_all_wins(); */
  222. /*  refresh(); */
  223.   return c;
  224. }
  225.  
  226. /* */
  227. draw_info_screen (w, np)
  228.  
  229. WINDOW * w;
  230. Snation * np;
  231. {
  232.   char s [EXECLEN];
  233.  
  234.   sprintf(s, "Info Report for Nation %s", np->name);
  235.   wmove(w, 0, (COLS-strlen(s))/2 - 4); /* make the string centered */
  236.   wstandout(w);
  237.   waddstr(w, s);
  238.   wstandend(w);
  239.   mvwprintw(w, 1, COLS/3+7, "Thon %d", world.turn);
  240.   mvwprintw(w, 3, 0, "Nation:  %s", np->name);
  241.   switch(np->npc_flag) {
  242.   case NPC_NOMAIL:
  243.     mvwaddstr(w, 2, 8, " [npc]     ");
  244.     break;
  245.   case NPC_MAIL:
  246.     mvwaddstr(w, 2, 8, " [npc+mail]");
  247.     break;
  248.   case NOT_NPC:
  249.   default:
  250.     mvwaddstr(w, 2, 8, "           ");
  251.     break;
  252.   }
  253. /*
  254.   if (!np->npc_flag) {
  255.     waddstr(w, "           ");
  256.   } else if (np->npc_flag == 1) {
  257. /*    waddstr(w, " [npc: aggress. %d]", np->npc_agg); */
  258. /*    waddstr(w, " [npc]");
  259.   } else {            /* for npc_flag == 2 */
  260. /*    waddstr(w, " [npc+mail]");
  261.   }
  262. */
  263.   mvwprintw(w, 4, 0, "Id:      %d", np->id);
  264.   mvwprintw(w, 5, 0, "Leader:  %s    ", np->leader);
  265.   mvwprintw(w, 6, 0, "Capital: (%d,%d)",
  266.         xrel(np->capital.x,np->capital.y,user.np->capital),
  267.         yrel(np->capital.x,np->capital.y,user.np->capital));
  268.   mvwprintw(w, 7, 0, "Race:    %s", np->race.name);
  269.   mvwprintw(w, 8, 0, "Mark:    %c", np->mark);
  270.   mvwprintw(w, 3, COLS/3, "Sectors:  %d", np->n_sects);
  271.   mvwprintw(w, 4, COLS/3, "Treasury: %d", np->money);
  272.   mvwprintw(w, 5, COLS/3, "Jewels:   %d", np->jewels);
  273.   mvwprintw(w, 6, COLS/3, "Metal:    %d", np->metal);
  274.   mvwprintw(w, 7, COLS/3, "Food:     %d", np->food);
  275.   mvwprintw(w,  3, (2*COLS)/3, "Birth rate:  %d%%", np->race.repro);
  276.   mvwprintw(w,  4, (2*COLS)/3, "Mortality:   %d%%", np->race.mortality);
  277.   mvwprintw(w,  5, (2*COLS)/3, "Strength:    %d", np->race.strength);
  278.   mvwprintw(w,  6, (2*COLS)/3, "Intel: %d + %d = %d", np->race.intel,
  279.         univ_intel(np), np->race.intel + univ_intel(np));
  280.   mvwprintw(w,  7, (2*COLS)/3, "Magic Apt: %d + %d = %d", np->race.mag_apt,
  281.         priestliness(np), np->race.mag_apt + priestliness(np));
  282.   mvwprintw(w,  8, (2*COLS)/3, "Speed:       %d", np->race.speed);
  283.   mvwprintw(w,  9, (2*COLS)/3, "Stealth:     %d", np->race.stealth);
  284.  
  285.   mvwprintw(w, 11, (2*COLS)/3, "Civilians:     %d", get_n_civil(np));
  286.   mvwprintw(w, 12, (2*COLS)/3, "Soldiers:      %d", get_n_soldiers(np));
  287.   mvwprintw(w, 13, (2*COLS)/3, "Armies:        %d", np->n_armies);
  288.   mvwprintw(w, 14, (2*COLS)/3, "Attack bonus:  %d%%", np->attack);
  289.   mvwprintw(w, 15, (2*COLS)/3, "Defense bonus: %d%%", np->defense);
  290.   mvwprintw(w, 16, (2*COLS)/3, "Move points:   %d", basic_move_rate(np));
  291.  
  292.   mvwprintw(w, 10, 0, "Initiated to the magical order %s", np->mag_order);
  293.   mvwprintw(w, 11, 0, "Magic skill:       %d", np->mag_skill);
  294.   mvwprintw(w, 12, 0, "Spell points:      %d (%d in maint)", np->spell_pts,
  295.         military_maint_spell_pts(np));
  296.   mvwprintw(w, 13, 0, "Technology skill:  %d", np->tech_skill);
  297.   mvwprintw(w, 14, 0, "Farming skill:     %d", np->farm_skill);
  298.   mvwprintw(w, 15, 0, "Mining skill:      %d", np->mine_skill);
  299.   mvwprintw(w, 16, 0, "Spy skill:         %d", np->spy);
  300.   mvwprintw(w, 17, 0, "Secrecy:           %d", np->secrecy);
  301.  
  302.   mvwprintw(w, LINES-5, 4,
  303.         "Options: [P]assd change, [l]eader change, [t]oggle npc");
  304.   if (np->npc_flag) {
  305.     waddstr(w, ", [a]ggr.");
  306.   } else {
  307.     wclrtoeol(w);
  308.   }
  309.   mvwprintw(w, LINES-4, 4,
  310.         "Reports: [b]udget, [p]roduction, [n]ations, [d]iplomacy");
  311.   wclrtobot(w);
  312.   wrefresh(w);
  313. }
  314.  
  315.   /* a nation's production report:  this gives detail on where
  316.      all the income comes from (mines, cities...) and so on
  317.    */
  318. char production_report(np)
  319.      Snation *np;
  320. {
  321.   WINDOW *w;
  322.   FILE *diplock;
  323.   char s[EXECLEN];
  324.   char c;
  325.   int n, done = 0, percent_expend, ret;
  326.  
  327.   strcpy(help_tag, "Production Report");
  328.  
  329.   w = newwin(LINES-2, COLS, 0, 0); /* full screen */
  330.   statline2 ("", "");
  331.   touchwin(w);
  332.  
  333.   while (!done) {
  334.     draw_production_screen (w, np);
  335.  
  336.     statline("type space when done, or F to dump to a file",
  337.          "production_report");
  338.  
  339.     switch (c = getch()) {
  340.     case CTL('L'):
  341.       wclear (w);
  342.       draw_production_screen (w, np);
  343.       break;
  344.     case ' ':
  345.       done = 1;
  346.       break;
  347.     case 'F':
  348.       dump_current_screen(w, "production_report");
  349.       break;
  350.     case 'b':
  351.     case 'i':
  352.     case 'n':
  353.     case 'd':
  354.       done = 1;
  355.       break;
  356.     case '?':
  357.       online_info();
  358.       break;
  359.     default:
  360.       break;
  361.     }
  362.   }
  363.  
  364.   delwin(w);
  365. /*  touch_all_wins(); */
  366. /*  refresh(); */
  367.   return c;
  368. }
  369.  
  370. draw_production_screen (w, np)
  371.  
  372. WINDOW * w;
  373. Snation * np;
  374. {
  375.   char s [EXECLEN];
  376.  
  377.   int emp, emp_met, emp_jwl, emp_farm, emp_serv, n_civil;
  378.  
  379.   emp = get_employed(np);
  380.   emp_met = get_emp_met(np);
  381.   emp_jwl = get_emp_jwl(np);
  382.   emp_farm = get_emp_farm(np);
  383.   emp_serv = get_emp_serv(np);
  384.   n_civil = get_n_civil(np);
  385.   
  386.   sprintf(s, "Production Report for Nation %s", np->name);
  387.   wmove(w, 0, (COLS-strlen(s))/2 - 4); /* make the string centered */
  388.   wstandout(w);
  389.   waddstr(w, s);
  390.   wstandend(w);
  391.   wclrtoeol(w);
  392.   /* now a tedious list of stuff */
  393.   mvwprintw(w, 2, 0, "  Job");
  394.   mvwprintw(w, 3, 0, "--------");
  395.   mvwprintw(w, 2, COLS/4-5, "# employed (unemp.)");
  396.   mvwprintw(w, 3, COLS/4-5, "-------------------", world.turn);
  397.   mvwprintw(w, 2, (2*COLS)/4-3, "Revenue");
  398.   mvwprintw(w, 3, (2*COLS)/4-3, "-------");
  399.   mvwprintw(w, 2, (3*COLS)/4-5, "prod/person");
  400.   mvwprintw(w, 3, (3*COLS)/4-5, "-----------");
  401.   mvwprintw(w, 4, 0, "General");
  402.   mvwprintw(w, 5, 0, "Metal miners");
  403.   mvwprintw(w, 6, 0, "Jewel miners");
  404.   mvwprintw(w, 7, 0, "Farmers");
  405.   mvwprintw(w, 8, 0, "Services");
  406.   /* number of people */
  407.   mvwprintw(w, 4, COLS/4-2, "%6d (%d)", emp, get_unemployed(np));
  408.   mvwprintw(w, 5, COLS/4-2, "%6d (%d)", emp_met, get_unemp_met(np));
  409.   mvwprintw(w, 6, COLS/4-2, "%6d (%d)", emp_jwl, get_unemp_jwl(np));
  410.   mvwprintw(w, 7, COLS/4-2, "%6d (%d)", emp_farm, get_unemp_farm(np));
  411.   mvwprintw(w, 8, COLS/4-2, "%6d (%d)", emp_serv, get_unemp_serv(np));
  412.   
  413.   /* revenue */
  414.   mvwprintw(w, 4, (2*COLS)/4-3, "%7d (%d%% tax)        ",
  415.         calc_revenue(np), np->taxes);
  416.   mvwprintw(w, 5, (2*COLS)/4-3, "%7d   ", calc_metal(np));
  417.   mvwprintw(w, 6, (2*COLS)/4-3, "%7d   ", calc_jewels(np));
  418.   mvwprintw(w, 7, (2*COLS)/4-3, "%7d   ", calc_food(np));
  419.   mvwprintw(w, 8, (2*COLS)/4-3, "%7d   ", calc_serv_revenue(np));
  420.   
  421.   /* revenue/person */
  422.   mvwprintw(w, 4, (3*COLS)/4-3, "%5.2f   sk.",
  423.         emp ? calc_revenue(np)/(1.0*emp) : 0, np->taxes);
  424.   mvwprintw(w, 5, (3*COLS)/4-3,"%5.2f   met.",
  425.         emp_met ? calc_metal(np)/(1.0*emp_met) : 0.0);
  426.   mvwprintw(w, 6, (3*COLS)/4-3,"%5.2f   jwl.",
  427.         emp_jwl ? calc_jewels(np)/(1.0*emp_jwl) : 0.0);
  428.   mvwprintw(w, 7, (3*COLS)/4-3,"%5.2f   food",
  429.         emp_farm ? calc_food(np)/(1.0*emp_farm) : 0.0);
  430.   mvwprintw(w, 8, (3*COLS)/4-3,"%5.2f   sk.",
  431.         emp_serv ? calc_serv_revenue(np)/(1.0*emp_serv) : 0.0);
  432.   
  433.   /* other statistics */
  434.   mvwprintw(w, 10, COLS/5, "Total people: %d  ",
  435.           n_civil + get_n_soldiers(np));
  436.     mvwprintw(w, 11, COLS/5, "Civilians:    %d  ", n_civil);
  437.     mvwprintw(w, 12, COLS/5, "Employed:     %d  ", get_employed(np));
  438.     mvwprintw(w, 13, COLS/5, "Unemployed:   %d  ", get_unemployed(np));
  439.     mvwprintw(w, 14, COLS/5, "Soldiers:     %d  ", get_n_soldiers(np));
  440.     mvwprintw(w, 15, COLS/5, "Unemp. rate:  %d%%  ", n_civil == 0 ? 0 :
  441.           (100*get_unemployed(np))/n_civil);
  442.  
  443.     mvwprintw(w, 20, 4, "Reports: [b]udget, [i]info, [n]ations, [d]iplomacy");
  444.     wclrtobot(w);
  445.     wrefresh(w);
  446. }
  447.  
  448.  
  449.   /* this prompts for a file name and then dumps
  450.      the current screen to that file
  451.    */
  452. dump_current_screen(w, def_filename)
  453.      WINDOW *w;
  454.      char def_filename[];
  455. {
  456.   char filename[80], s[80];
  457.  
  458. #ifdef NO_FILE_ACCESS
  459.   statline2_err("Hit space", "File access disabled");
  460. #else  
  461.   sprintf(s, "give file name (default = \"%s%d\")", def_filename, world.turn);
  462.   statline2(s, "dump_current_screen");
  463.   move(LINES-3, 0);
  464.   clrtoeol();
  465.   move(LINES-3, COLS/3);
  466.   addstr("> ");
  467.   echo();
  468.   if (scanw("%18s", filename) < 1) {
  469.     strcpy(filename, def_filename);
  470.     sprintf(filename, "%s%d",  def_filename, world.turn);
  471.   }
  472.   noecho();
  473.   move(LINES-3, COLS/3);
  474.   clrtoeol();
  475.   statline2("", "");
  476.   my_scr_dump(w, filename);
  477. /*  scr_dump(filename); /* the curses scr_dump() isn't good enough */
  478. #endif
  479. }
  480.  
  481.   /* the curses routine is not very nice, since it
  482.      can only be read-in by curses.  hence this.
  483.    */
  484. my_scr_dump(w, fname)
  485.      WINDOW *w;
  486.      char fname[];
  487. {
  488.   int x, y;
  489.   char c;
  490.   FILE *fp, *fopen();
  491.  
  492. #ifdef UID_SECURITY
  493.   if (fork() == 0) {        /* child has fork() == 0 */
  494.       /* first change back to the user's current directory */
  495.     setuid(ruid);
  496.     chdir(current_dir);
  497. /*    printf("\r\nnow I am %d, changed to %s\n\r", ruid, current_dir); */
  498.       /* dilemma:  should we overwrite or append? */
  499.     if ((fp = fopen(fname, "w")) == NULL) {
  500.       exit(1);
  501.     }
  502. /*    printf("\r\n writing out the file %s in %s\n\r", fname, current_dir); */
  503.     for (y = 0; y < LINES; ++y) {
  504.       for (x = 0; x < COLS; ++x) {
  505.     wmove(w, y, x);
  506.     c=winch(w);
  507.     fputc(c, fp);
  508.       }
  509.       fputc('\n', fp);
  510.     }
  511.     fclose(fp);
  512.     exit(0);
  513.   }
  514.   wait(0);
  515. #else /* UID_SECURITY */
  516.     /* dilemma:  should we overwrite or append? */
  517.   if ((fp = fopen(fname, "w")) == NULL) {
  518.     return -1;
  519.   }
  520.   for (y = 0; y < LINES; ++y) {
  521.     for (x = 0; x < COLS; ++x) {
  522.       wmove(w, y, x);
  523.       c=winch(w);
  524.       fputc(c, fp);
  525.     }
  526.     fputc('\n', fp);
  527.   }
  528.   fclose(fp);
  529. #endif /* UID_SECURITY */
  530.   return 1;
  531. }
  532.  
  533.   /* this restores a dump made with our custom screen dump routine */
  534. my_scr_restore(fname)
  535.      char fname[];
  536. {
  537.   int x, y;
  538.   char c;
  539.   FILE *fp, *fopen();
  540.   WINDOW *restw;
  541.  
  542.  
  543. #ifdef UID_SECURITY
  544.   if (fork() == 0) {
  545.     setuid(ruid);
  546.     chdir(current_dir);
  547.     if ((fp = fopen(fname, "r")) == NULL) {
  548.       exit(1);
  549.     }
  550.     restw = newwin(LINES, COLS, 0, 0);
  551.     werase(restw);
  552.     touchwin(restw);
  553.     for (y = 0; y < LINES; ++y) {
  554.       for (x = 0; x < COLS; ++x) {
  555.     c = fgetc(fp);
  556.     if ((c == '\n') || (c == '\r')) {
  557.       --x;
  558.       continue;        /* wow!!! a use for continue!!! */
  559.     }
  560.     mvwaddch(restw, y, x, c);
  561.       }
  562.       wclrtoeol(restw);
  563.     }
  564.     wclrtobot(restw);
  565.     wrefresh(restw);
  566.     fclose(fp);
  567.     statline2_err("type space to go on", "view_saved_report");
  568.     delwin(restw);
  569.     exit(0);
  570.   }                /* we close the "if (fork() == 0) {" */
  571.   wait(0);
  572. #else /* UID_SECURITY */
  573.   if ((fp = fopen(fname, "r")) == NULL) {
  574.     return -1;
  575.   }
  576.   restw = newwin(COLS, LINES, 0, 0);
  577.  
  578.   for (y = 0; y < LINES; ++y) {
  579.     for (x = 0; x < COLS; ++x) {
  580.       c = fgetc(fp);
  581.       if ((c == '\n') || (c == '\r')) {
  582.     --x;
  583.     continue;        /* wow!!! a use for continue!!! */
  584.       }
  585.       mvwaddch(restw, y, x, c);
  586.     }
  587.     wclrtoeol(restw);
  588.   }
  589.   wclrtobot(restw);
  590.   fclose(fp);
  591.   delwin(restw);
  592.   statline2_err("type space to go on", "view_saved_report");
  593. #endif /* UID_SECURITY */
  594.   touch_all_wins();
  595.   refresh();
  596.   user.just_moved = 1;
  597.   return 1;
  598. }
  599.  
  600.   /* let a nation change its password */
  601. change_passwd(np, w)
  602.      Snation *np;
  603.      WINDOW *w;
  604. {
  605.   char old_p[NAMELEN], try1[NAMELEN], try2[NAMELEN];
  606.  
  607.   wmove(w, w->_maxy-3, 0);
  608.   wclrtobot(w);
  609.   wmove(w, w->_maxy-3, 6);
  610.   wrefresh(w);
  611.   /* if it is NOT the Gamemaster, then we have to make sure
  612.      this user knows the old password.  Gamemaster, instead,
  613.      can change passwds without knowing the old ones.
  614.    */
  615.   if (user.id != 0) {
  616.     get_crypt_pass("Old password: ", old_p, w, NULL);
  617.     wmove(w, w->_maxy-3, 6);
  618.     wrefresh(w);
  619.     if (strcmp(old_p, np->passwd) != 0) {
  620.       statline2_err("Hit space", "sorry");
  621.       wmove(w, w->_maxy-4, 0);
  622.       wclrtobot(w);
  623.       wrefresh(w);
  624.       return -1;
  625.     }
  626.   }
  627.   get_crypt_pass("New password:  ", try1, w, NULL);
  628.   wmove(w, w->_maxy-3, 6);
  629.   wrefresh(w);
  630.   get_crypt_pass("Type it again: ", try2, w, NULL);
  631.   while (strcmp(try1, try2) != 0) {
  632.     mvwprintw(w, 20, 6, "They don't match, try again");
  633.     wmove(w, w->_maxy-3, 6);
  634.     wrefresh(w);
  635.     get_crypt_pass("New password:  ", try1, w, NULL);
  636.     wmove(w, w->_maxy-3, 6);
  637.     wrefresh(w);
  638.     get_crypt_pass("Type it again: ", try2, w, NULL);
  639.   }
  640.   strcpy(np->passwd, try1);
  641.   cpass(np, try1);        /* generate the exec line */
  642.   wmove(w, w->_maxy-4, 0);
  643.   wclrtobot(w);
  644. }
  645.  
  646.   /* allow a user to change their leader */
  647. change_leader(np, w)
  648.      Snation *np;
  649.      WINDOW *w;
  650. {
  651.   char name[NAMELEN], s[EXECLEN];
  652.  
  653.   mvwprintw(w, 21, 6, "What is the new name of your leader? ");
  654.   if (wget_name(w, name) > 0) {
  655.     strcpy(np->leader, name);
  656.     sprintf(s, "NATION_LEADER:%d:%s\n", np->id, name);
  657.     gen_exec(s);
  658.   }
  659. }
  660.