home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / games / volume13 / dominion / part25 / root.c < prev   
C/C++ Source or Header  |  1992-02-11  |  11KB  |  443 lines

  1.   /* root.c -- special super-user commands */
  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.  
  26. #include <stdio.h>
  27.  
  28. extern Sworld world;
  29. extern Suser user;
  30.  
  31. root_edit()
  32. {
  33.   WINDOW *rew;
  34.   char s[EXECLEN];
  35.   int done = 0;
  36.  
  37.   rew = newwin(6, COLS-20, LINES/4, 10);
  38.   touchwin(rew);
  39.   while (!done) {
  40.     werase(rew);
  41.     sprintf(s, "Root Editing");
  42.     wmove(rew, 1, (COLS/2-20-strlen(s))/2);
  43.     wstandout(rew);
  44.     waddstr(rew, s);
  45.     wstandend(rew);
  46.     mvwaddstr(rew, 3, 3, "Edit [s]ector or [n]ation? ");
  47.     wrefresh(rew);
  48.     switch (getch()) {
  49.     case 's':
  50.       root_edit_sector();
  51.       break;
  52.     case 'n':
  53.       root_edit_nation();
  54.       break;
  55.     case ' ':
  56.       done = 1;
  57.       break;
  58.     default:
  59.       break;
  60.     }
  61.   }
  62.   delwin(rew);
  63.   touch_all_wins(stdscr);
  64. }
  65.  
  66. root_edit_sector()
  67. {
  68.   WINDOW *resw;
  69.   int pop_change, done = 0, new_owner, change;
  70.  
  71.   Ssector *sp = &world.map[user.cursor.x][user.cursor.y];
  72.  
  73.   resw = newwin(8, COLS-2, LINES-10, 1);
  74.   touchwin(resw);
  75.  
  76.   while (!done) {
  77.     werase(resw);
  78.     mvwaddstr(resw, 5, 2, "Change: [p]opulation, [o]wner ");
  79.     mvwaddstr(resw, 6, 2, "        [s]oil, [m]etal, [j]ewels, [a]ltitude");
  80. /*    box(resw, 'R', 'R'); */
  81.     wrefresh(resw);
  82.     switch (getch()) {
  83.     case 'p':
  84.       mvwprintw(resw, 1, 1, "Sector (%d,%d), pop=%d, what population change? ",
  85.         sp->loc.x, sp->loc.y, sp->n_people);
  86.       wrefresh(resw);
  87.       if (wget_number(resw, &pop_change) > 0) {
  88.     sp->n_people += pop_change;
  89.     cpeople_sector(sp, pop_change);
  90.       }
  91.       break;
  92.     case 'o':
  93.       mvwprintw(resw, 1, 1, "Sector (%d,%d), owner=%d, which new owner id? ",
  94.         sp->loc.x, sp->loc.y, sp->owner);
  95.       wrefresh(resw);
  96.       if (wget_number(resw, &new_owner) > 0 && new_owner <= world.n_nations) {
  97.       /* 1. remove from old owner's list
  98.          2. add to new owner's list
  99.        */
  100.     if (sp->owner != 0) {
  101.       subtsector(&world.nations[sp->owner], sp->loc.x, sp->loc.y);
  102.     }
  103.     sp->owner = new_owner;
  104.     cowner_sector(sp, new_owner);
  105.     if (new_owner != 0) {    /* nation 0 has no sector list */
  106.       addsector(&world.nations[new_owner], sp->loc.x, sp->loc.y);
  107.     }
  108.       }
  109.       break;
  110.     case 's':
  111.       mvwprintw(resw, 1, 1, "Sector (%d,%d), soil=%d, what soil change? ",
  112.         sp->loc.x, sp->loc.y, sp->soil);
  113.       wrefresh(resw);
  114.       if (wget_number(resw, &change) > 0) {
  115.     sp->soil += change;
  116.     csoil_sector(sp, change);
  117.       }
  118.       break;
  119.     case 'm':
  120.       mvwprintw(resw, 1, 1, "Sector (%d,%d), metal=%d, what metal change? ",
  121.         sp->loc.x, sp->loc.y, sp->metal);
  122.       wrefresh(resw);
  123.       if (wget_number(resw, &change) > 0) {
  124.     sp->metal += change;
  125.     cmetal_sector(sp, change);
  126.       }
  127.       break;
  128.     case 'j':
  129.       mvwprintw(resw, 1, 1, "Sector (%d,%d), jewels=%d, what jewels change? ",
  130.         sp->loc.x, sp->loc.y, sp->jewels);
  131.       wrefresh(resw);
  132.       if (wget_number(resw, &change) > 0) {
  133.     sp->jewels += change;
  134.     cjewels_sector(sp, change);
  135.       }
  136.       break;
  137.     case 'a':
  138.       mvwprintw(resw,1,1,"Sector (%d,%d), altitude=%d, what altitude change? ",
  139.         sp->loc.x, sp->loc.y, sp->altitude);
  140.       wrefresh(resw);
  141.       if (wget_number(resw, &change) > 0) {
  142.     sp->altitude += change;
  143.     caltitude_sector(sp, change);
  144.       }
  145.       break;
  146.     case ' ':
  147.       done = 1;
  148.       break;
  149.     default:
  150.       break;
  151.     }
  152.   }
  153.   delwin(resw);
  154.   touch_all_wins(stdscr);
  155.   refresh();
  156. }
  157.  
  158.   /* allows the game master to tinker with a nation */
  159. root_edit_nation()
  160. {
  161.   WINDOW *renw;
  162.   int done = 0, change, id;
  163.   Snation *np;
  164.   char name[NAMELEN], s[EXECLEN];
  165.   char c;
  166.  
  167.   Ssector *sp = &world.map[user.cursor.x][user.cursor.y];
  168.  
  169.   renw = newwin(9, COLS-2, LINES-12, 1);
  170.   touchwin(renw);
  171.   mvwaddstr(renw, 1, 3, "Which nation (id) do you want to change? ");
  172.   wrefresh(renw);
  173.   if (wget_number(renw, &id) < 0) {
  174.     return;
  175.   }
  176.   np = &world.nations[id];
  177.   while (!done) {
  178.     werase(renw);
  179.     mvwprintw(renw, 1, 6, "Editing nation %s [%c]", np->name, np->mark);
  180.     switch (np->npc_flag) {
  181.     case NPC_NOMAIL:
  182.       wprintw(renw, " [npc]     ");
  183.       break;
  184.     case NPC_MAIL:
  185.       wprintw(renw, " [npc+mail]");
  186.       break;
  187.     case NOT_NPC:
  188.     default:
  189.       wprintw(renw, "           ");
  190.       break;
  191.     }
  192. /*          np->npc_flag ? "npc" : "not npc"); */
  193.     mvwaddstr(renw, 4, 2,
  194.           "Change: [N]ame, [p]assword, [D]estroy, [t]oggle npc");
  195.     mvwaddstr(renw, 5, 2, "        [s]heckles, [m]etal, [j]ewels, [f]ood");
  196.     mvwaddstr(renw, 6, 2, "        [T]ech skill, [M]ag skill, [S]pell pts");
  197.     mvwaddstr(renw, 7, 2, "        [d]iplomacy, mag. [o]rder, nation mar[k]");
  198.     if (np->npc_flag) {
  199.       mvwaddstr(renw, 8, 2, "        [a]ggressiveness");
  200. /*      mvwaddstr(renw, 8, 2,
  201.         "[a]ggressiveness, [e]xpansionism, [i]solationism");
  202.  */
  203.     }
  204. /*    box(renw, 'R', 'R'); */
  205.     wrefresh(renw);
  206.     switch (getch()) {
  207.     case 'N':
  208.       mvwprintw(renw, 1, 1, "Give new name for nation: ");
  209.       wrefresh(renw);
  210.       if (wget_name(renw, name) > 0) {
  211.     strcpy(np->name, name);
  212.     sprintf(s, "NATION_NAME:%d:%s\n", np->id, name);
  213.     gen_exec(s);
  214.       }
  215.       break;
  216.     case 'p':
  217.       change_passwd(np, renw);
  218.       break;
  219.     case 'D':
  220.       root_destroy_nation(np, renw);
  221.       break;
  222.     case 't':            /* rotate values for the npc flag */
  223.       np->npc_flag = (np->npc_flag + 1) % 3;
  224. /*      np->npc_flag = !np->npc_flag; */
  225.       if (np->npc_flag) {
  226.     sprintf(s, "SET_NPC:%d\n", np->id);
  227.       } else {
  228.     sprintf(s, "CLEAR_NPC:%d\n", np->id);
  229.       }
  230.       gen_exec(s);
  231.       break;
  232.     case 's':
  233.       mvwprintw(renw, 1, 1, "Nation's money=%d;  what change? ", np->money);
  234.       wrefresh(renw);
  235.       if (wget_number(renw, &change) > 0) {
  236.     np->money += change;
  237.     cmoney(np, change);
  238.       }
  239.       break;
  240.     case 'm':
  241.       mvwprintw(renw, 1, 1, "Nation's metal=%d;  what change? ", np->metal);
  242.       wrefresh(renw);
  243.       if (wget_number(renw, &change) > 0) {
  244.     np->metal += change;
  245.     cmetal(np, change);
  246.       }
  247.       break;
  248.     case 'j':
  249.       mvwprintw(renw, 1, 1, "Nation's jewels=%d;  what change? ", np->jewels);
  250.       wrefresh(renw);
  251.       if (wget_number(renw, &change) > 0) {
  252.     np->jewels += change;
  253.     cjewels(np, change);
  254.       }
  255.       break;
  256.     case 'f':
  257.       mvwprintw(renw, 1, 1, "Nation's food=%d;  what change? ", np->food);
  258.       wrefresh(renw);
  259.       if (wget_number(renw, &change) > 0) {
  260.     np->food += change;
  261.     cfood(np, change);
  262.       }
  263.       break;
  264.     case 'T':
  265.       mvwprintw(renw, 1, 1, "Nation's tech skill=%d;  what change? ",
  266.         np->tech_skill);
  267.       wrefresh(renw);
  268.       if (wget_number(renw, &change) > 0) {
  269.     np->tech_skill += change;
  270.     ctech_skill(np, change);
  271.       }
  272.       break;
  273.     case 'M':
  274.       mvwprintw(renw, 1, 1, "Nation's mag skill=%d;  what change? ",
  275.         np->mag_skill);
  276.       wrefresh(renw);
  277.       if (wget_number(renw, &change) > 0) {
  278.     np->mag_skill += change;
  279.     cmag_skill(np, change);
  280.       }
  281.       break;
  282.     case 'S':
  283.       mvwprintw(renw, 1, 1, "Nation's spell pts=%d;  what change? ",
  284.         np->spell_pts);
  285.       wrefresh(renw);
  286.       if (wget_number(renw, &change) > 0) {
  287.     np->spell_pts += change;
  288.     cspell_pts(np, change);
  289.       }
  290.       break;
  291.     case 'o':            /* change magic order */
  292.       do {
  293.     mvwprintw(renw, 1, 1, "Give new magic order (currently %s) ",
  294.           np->mag_order);
  295.     wclrtoeol(renw);
  296.     wrefresh(renw);
  297.     wget_name(renw, name);
  298.       } while (!is_good_order(name));
  299.       strcpy(np->mag_order, name);
  300.       sprintf(s, "NATION_ORDER:%d:%s\n", np->id, name);
  301.       gen_exec(s);
  302.       break;
  303.     case 'k':            /* change nation mark */
  304.       mvwprintw(renw, 1, 1, "Give new nation mark ");
  305.       wclrtoeol(renw);
  306.       wrefresh(renw);
  307.       fflush(stdin);
  308.       do {
  309.     c = getchar();
  310.     putchar(c);
  311.       } while (!free_nation_mark(&world, c));
  312.       np->mark = c;
  313.       sprintf(s, "NATION_MARK:%d:%c\n", np->id, c);
  314.       gen_exec(s);
  315.       break;
  316.     case 'd':
  317.       diplo_report(np);
  318.       break;
  319.     case 'a':
  320.       if (np->npc_flag) {
  321.     set_aggressiveness(np, renw);
  322.       }
  323.       break;
  324.     case ' ':
  325.       done = 1;
  326.       break;
  327.     default:
  328.       break;
  329.     }
  330.   }
  331.   delwin(renw);
  332.   touch_all_wins();
  333.   refresh();
  334. }
  335.  
  336.   /* here are some exec lines available only to the Gamemaster */
  337. cowner_sector(sp, owner)
  338.      Ssector *sp;
  339.      int owner;
  340. {
  341.   char s[EXECLEN];
  342.  
  343.   sprintf(s, "COWNER_SECTOR:%d:%d:%d\n", sp->loc.x, sp->loc.y, owner);
  344.   gen_exec(s);
  345. }
  346.  
  347. csoil_sector(sp, change)
  348.      Ssector *sp;
  349.      int change;
  350. {
  351.   char s[EXECLEN];
  352.  
  353.   sprintf(s, "CSOIL_SECTOR:%d:%d:%d\n", sp->loc.x, sp->loc.y, change);
  354.   gen_exec(s);
  355. }
  356.  
  357. cmetal_sector(sp, change)
  358.      Ssector *sp;
  359.      int change;
  360. {
  361.   char s[EXECLEN];
  362.  
  363.   sprintf(s, "CMETAL_SECTOR:%d:%d:%d\n", sp->loc.x, sp->loc.y, change);
  364.   gen_exec(s);
  365. }
  366.  
  367. cjewels_sector(sp, change)
  368.      Ssector *sp;
  369.      int change;
  370. {
  371.   char s[EXECLEN];
  372.  
  373.   sprintf(s, "CJEWELS_SECTOR:%d:%d:%d\n", sp->loc.x, sp->loc.y, change);
  374.   gen_exec(s);
  375. }
  376.  
  377. caltitude_sector(sp, change)
  378.      Ssector *sp;
  379.      int change;
  380. {
  381.   char s[EXECLEN];
  382.  
  383.   sprintf(s, "CALTITUDE_SECTOR:%d:%d:%d\n", sp->loc.x, sp->loc.y, change);
  384.   gen_exec(s);
  385. }
  386.  
  387.   /* this is serious:  destroy a nation, interactively, as super user */
  388. root_destroy_nation(np, renw)
  389.      Snation *np;
  390.      WINDOW *renw;
  391. {
  392.   char c;
  393.   char s[EXECLEN];
  394.  
  395.   mvwaddstr(renw, 3, 4, "Are you quite sure?  This is serious!!! ");
  396.   wrefresh(renw);
  397.   if ((c = wgetch(renw)) == 'y' || c == 'Y') {
  398.     mvwaddstr(renw, 4, 6, "Confirm again, dude: ");
  399.     wrefresh(renw);
  400.     if ((c = wgetch(renw)) == 'y' || c == 'Y') {
  401.       destroy_nation(np->id);
  402.       sprintf(s, "DESTROY:%d\n", np->id);
  403.       gen_exec(s);
  404.     }
  405.   }
  406. }
  407.  
  408.   /* allow the nation's aggressiveness to be modified.  we
  409.      will make a new window so that this can be called from
  410.      various different places (such as the root editing and
  411.      the info report).
  412.    */
  413. set_aggressiveness(np, current_win)
  414.      Snation *np;
  415.      WINDOW *current_win;    /* for redrawing purposes */
  416. {
  417.   WINDOW *aggw;
  418.   int aggr;
  419.   char s[EXECLEN];
  420.  
  421.   aggw = newwin(8, 30, LINES-14, 10);
  422.   touchwin(aggw);
  423.   mvwprintw(aggw, 3, 3, "Current aggressiveness %d", np->npc_agg);
  424.   mvwprintw(aggw, 4, 3, "Give new value: ");
  425.   box(aggw, '|', '-');
  426.   wrefresh(aggw);
  427.   if (wget_number(aggw, &aggr) < 0) { /* if user types nothing or bad value */
  428.     delwin(aggw);
  429.     touchwin(current_win);
  430.     return;
  431.   }
  432.     /* set the new value and make sure we don't overflow */
  433.   np->npc_agg = aggr;
  434.   np->npc_agg = min(np->npc_agg, 100);
  435.   np->npc_agg = max(np->npc_agg, 0);
  436.   sprintf(s, "NPC_PARAM:%d:%d:%d:%d\n", np->id, np->npc_agg,
  437.       np->npc_exp, np->npc_iso);
  438.   gen_exec(s);
  439.   delwin(aggw);
  440.   touchwin(current_win);
  441.   return;
  442. }
  443.