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

  1. /* diplomacy.c - screen-oriented diplomacy routines */
  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 char *dip_status[];
  32.  
  33. char show_to_screen();
  34.  
  35. char diplo_report(nation)
  36.      Snation *nation;
  37. {
  38.   Sdiplo **diplo_matrix, **initial_diplo; /* structure containing all info */
  39.   Sdiplo **allocate_diplo();
  40.   FILE   *dfp;           /* file containing all info */
  41.   int i;
  42.   char c;
  43.  
  44. /*  statline2_err("diplo was not locked", "hit space"); */
  45.     /* read in the current diplomacy matrix, and also the
  46.        initial state (to see if the user wants to change
  47.        their status too much)
  48.      */
  49.   diplo_matrix = allocate_diplo(world.n_nations);
  50.   initial_diplo = allocate_diplo(world.n_nations);
  51.   read_initial_diplo(initial_diplo, world.n_nations);
  52.     /* if reading in the file fails, we must re-create it */
  53.   if (read_in_diplo(diplo_matrix, world.n_nations) == -1) {
  54.     statline2_err("Hit space to go on", "have to re-build diplo file");
  55.     init_diplo(1);
  56.     for (i = 2; i <= world.n_nations; ++i) {
  57.       Sdiplo **dm_old, **dm_new;
  58.       dm_old = allocate_diplo(i-1);
  59.       dm_new = allocate_diplo(i);
  60.       read_in_diplo(dm_old, i-1);
  61.       increase_diplo(dm_old, dm_new, i-1, &world.nations[i-1]);
  62.       dump_diplo(nation, dm_new, i);
  63.       free_diplo(dm_old, i-1);
  64.       free_diplo(dm_new, i);
  65.     }
  66.     update_diplo();        /* update it, since it was reset */
  67.     read_in_diplo(diplo_matrix, world.n_nations);
  68.   }
  69.  
  70.   c = show_to_screen(diplo_matrix, initial_diplo, nation);
  71.   free_diplo(diplo_matrix, world.n_nations);
  72.   return c;
  73. }
  74.  
  75. char show_to_screen(dm, initial_dm, nation)
  76.   Sdiplo **dm, **initial_dm;
  77.   Snation *nation;
  78. {
  79. /* this function will dynamically keep the window updated with 
  80.    the diplomacy information.
  81.  */
  82.  
  83.   WINDOW *dipw;          /* the diplomacy window */
  84.   int i, j, done=0, neigh_id=0, first_shown, n_shown;
  85.   char c;
  86.  
  87.   statline("hit space when done", "diplomacy report");
  88.  
  89.   dipw = newwin(LINES-2, COLS, 0, 0);  /* full screen window */
  90.   werase(dipw);
  91.   touchwin(dipw);
  92.   first_shown = 1;
  93.   n_shown = min(world.n_nations, LINES-9);
  94.   while (!done) {
  95.     wmove(dipw, 0, COLS/2-13);
  96.     wstandout(dipw);
  97.     wprintw(dipw, "Diplomacy for nation %s", nation->name);
  98.     wstandend(dipw);
  99.  
  100.   mvwprintw(dipw,1,3,"                                        TO  YOU        TO YOU  ");
  101.   mvwprintw(dipw,2,3," NATION                   BY YOU         (now)       (at start)");
  102.   mvwprintw(dipw,3,3," ======                   ======         ======      ==========");
  103.     wclrtobot(dipw);
  104.  
  105.     i=0;
  106.     for (j = 0; j < n_shown &&  j+first_shown < world.n_nations; ++j) {
  107.         /* j+first_shown is for nation ids, i is for lines printed */
  108.       wmove(dipw, 4+j, 3);
  109.       wclrtoeol(dipw);
  110.       ++i;
  111.       if (is_active_ntn(&world.nations[j+first_shown])) {
  112.     mvwprintw(dipw, 4+j, 3, "%2d. %-21s%c%-12s  %c%-12s  %-12s",
  113.           world.nations[j+first_shown].id,
  114.           world.nations[j+first_shown].name,
  115.           dm[nation->id][j+first_shown].status ==
  116.               initial_dm[nation->id][j+first_shown].status ? ' ' : '*',
  117.           dip_status[ dm[nation->id][j+first_shown].status ],
  118.           dm[j+first_shown][nation->id].status ==
  119.           initial_dm[j+first_shown][nation->id].status ? ' ' : '*',
  120.           dip_status[dm[j+first_shown][nation->id].status ],
  121.           dip_status[ initial_dm[j+first_shown][nation->id].status ]);
  122.       } else {
  123.     mvwprintw(dipw, 4+j, 3, "%2d. %-21s   ** DESTROYED **",
  124.           world.nations[j+first_shown].id,
  125.           world.nations[j+first_shown].name);
  126.       }
  127.     }
  128.     mvwprintw(dipw, LINES-4, 4,
  129.       "[c]hange diplomacy status, [<]/[,] previous page, [>]/[.] next page");  
  130.     mvwprintw(dipw, LINES-3, 4,
  131.       "    Other reports: [i]nfo, [b]udget, [p]roduction, [n]ations ");
  132.     wrefresh(dipw);    /* update the window, always before input */
  133.  
  134.     switch (c = getch()) {
  135.     case ' ':
  136.     case 'i':
  137.     case 'b':
  138.     case 'p':
  139.     case 'n':
  140.       done = 1;
  141.       break;
  142.     case '.':
  143.     case '>':
  144.       if (first_shown + n_shown < world.n_nations) {
  145.     first_shown += n_shown;
  146.       }
  147.       break;
  148.     case ',':
  149.     case '<':
  150.       if (first_shown > 1) {
  151.     first_shown -= n_shown;
  152.       }
  153.       break;
  154.     case 'c':
  155.         /* allow to change status */
  156.       mvwprintw(dipw, LINES-3, 3, "TO WHAT NATION: ");
  157.       wclrtoeol(dipw);
  158.       wget_number(dipw, &neigh_id);
  159.       if (!(have_met(dm, nation->id, neigh_id)) && user.id != 0) {
  160.     mvwprintw(dipw, LINES-4, 3, "Have not met that nation yet!!!");
  161.     mvwprintw(dipw, LINES-3, 3, "--- hit space to continue ---");
  162.     wrefresh(dipw);    /* update the window, always before input */
  163.     get_space();
  164.     wrefresh(dipw);    /* update the window, always before input */
  165.       } else if (diplo_is_locked()) {
  166.     statline2_err("Sorry, someone writing diplomacy file.", "hit space");
  167.       } else {
  168.     change_dip_status(dm, initial_dm, nation->id, neigh_id);
  169.     dump_diplo(nation, dm, world.n_nations);
  170.     touchwin(dipw);
  171.     wrefresh(dipw);    /* update the window, always before input */
  172.       }
  173.       break;
  174.     default:
  175.       bad_key();
  176.       break;
  177.     } /* end of switch (c) statement */
  178.   }   /* end of while(done ==0) loop */
  179.   
  180.   delwin(dipw);
  181. /*  touch_all_wins();
  182.   refresh();
  183.  */
  184.   return c;
  185. }
  186.  
  187. change_dip_status(dm, initial_dm, n1, n2)
  188.      Sdiplo **dm, **initial_dm;
  189.      int n1, n2;
  190. {
  191.   char cc;
  192.   int i,               /* for loops... */
  193.   New_St,              /* input for new status */
  194.   ind1=0, ind2=0;      /* indices of nations in array... */
  195.   WINDOW *chng_dipw;
  196.   
  197.   chng_dipw = newwin((LINES-3), (COLS/2), 3, (COLS/2));
  198.   touchwin(chng_dipw);
  199.   mvwprintw(chng_dipw, 0,3, "NEW STATUS");
  200.   mvwprintw(chng_dipw, 1,3, "==========");
  201.   for (i=JIHAD; i<= TREATY; i++) {
  202.     mvwprintw(chng_dipw, i,3, "[%c]. %s", dip_status[i][0], dip_status[i] );  
  203.   }      
  204.   mvwprintw(chng_dipw, i+1, 3, "Enter new status: ");
  205.   wrefresh(chng_dipw);    /* update the window, always before input */
  206. /*  wget_number(chng_dipw, &New_St); */
  207.  
  208.   cc = getch();            /* we want the first char of a status */
  209.   if (cc > 'Z') {
  210.     cc -= ('a'-'A');        /* go to upper case */
  211.   }
  212.  
  213.   for (New_St = JIHAD; New_St <= TREATY; New_St++) {
  214.     if (dip_status[New_St][0] == cc)
  215.       break;
  216.   }
  217.   
  218. /*  New_St++;   /* to compensate for numbers shown on screen */
  219.   if ((New_St < JIHAD) || (New_St > TREATY)) {
  220.     mvwprintw(chng_dipw, i+2, 3, "Illegal Input!");
  221.     mvwprintw(chng_dipw, i+3, 3,"--- hit space to continue ---");
  222.     wrefresh(chng_dipw);    /* update the window, always before input */
  223.     get_space();
  224.   } else if (user.id != 0 && abs(New_St - initial_dm[n1][n2].status) > 2) {
  225.     mvwprintw(chng_dipw, i+2, 3, "Can't change so much!!");
  226.     mvwprintw(chng_dipw, i+3, 3,"--- hit space to continue ---");
  227.     wrefresh(chng_dipw);    /* update the window, always before input */
  228.     get_space();
  229.   } else {
  230.     /* make the change in status!!! */
  231.     while(n1 != dm[ind1++][0].self_id)
  232.       ;
  233.     ind1--;
  234.     while(n2 != dm[ind1][ind2++].neighbor_id)
  235.       ;
  236.     ind2--;
  237.     dm[ind1][ind2].status = New_St;
  238.  
  239.     mvwprintw(chng_dipw, i+2, 3, "The change has been made.");
  240.     mvwprintw(chng_dipw, i+3, 3,"--- hit space to continue ---");
  241.     wrefresh(chng_dipw);    /* update the window, always before input */
  242.     get_space();
  243.   }
  244.  
  245.   wrefresh(chng_dipw);     /* update the window, always before input */
  246.   
  247.   delwin(chng_dipw);
  248. /*  touch_all_wins();
  249.   refresh();
  250.  */
  251. }
  252.  
  253.