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

  1. /* trademenu.c - displays trade board and allows buying and selling of items */
  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. #ifdef TRADEMENU
  24.  
  25. #include "dominion.h"
  26. #include "misc.h"
  27. #include <stdio.h>
  28. #include <ctype.h>
  29.  
  30. extern Sworld world;
  31. extern Suser user;
  32. extern struct item_map tradeitems[];
  33. FILE *trades, *bids;
  34.  
  35. struct trade { int natn, item1, amt1, item2, amt2, priv; };
  36.  
  37. trade_menu(nation)
  38. {
  39.   WINDOW *tw;
  40.   char c;
  41.   int done=0, done2=0, start, curn, i, num_trades;
  42.   int num, amt;
  43.   struct trade tlist[MAXTRADES], tr;
  44.   int blist[MAXTRADES];
  45.   
  46.   while (!done) {
  47.     num_trades = read_trades(tlist, blist);
  48.     statline("hit space when done", "trade board");
  49.     tw = newwin(LINES-2, COLS, 0, 0);
  50.     wmove(tw, 0, COLS/2-10);
  51.     wstandout(tw);
  52.     wprintw(tw, "Trade Board for nation %s", world.nations[user.id].name);
  53.     wstandend(tw);
  54.     
  55.     mvwprintw(tw, 2, 1, "T# | NATION           ITEM FOR SALE     |     MINIMUM BID       | YOUR BID");
  56.     mvwprintw(tw, 3, 1, "== | ============  ==================== | ===================== | ========");
  57.     
  58.     start = 0;
  59.     for (i = 0; i < (num_trades-start); i++) {
  60.       tr = tlist[i+start];
  61.       mvwprintw(tw, i+4, 0, "%3d | %-12s %8d %-12s | %8d %-12s | %8d",
  62.         i+start, world.nations[tr.natn].name, tr.amt1,
  63.         tradeitems[tr.item1].name, tr.amt2,
  64.         tradeitems[tr.item2].name, blist[i+start]);
  65.     }
  66.     mvwprintw(tw, 19, 2, "Do you wish to (s)ell an item, or (b)uy an item? ");
  67.     wrefresh(tw);
  68.     
  69.     done2 = 0;
  70.     while (!done2) {
  71.       c = getch();
  72.       c = isupper(c) ? tolower(c) : c;
  73.       switch(c) {
  74.       case ' ':
  75.     done = done2 = 1;
  76.     break;
  77.       case 's':
  78.     tr.natn = user.id;
  79.     tr.item1 = tr.item2 = tr.amt1 = tr.amt2 = tr.priv = 0;
  80.     sell_what(tw, &tr);    /* find what to sell and amount */
  81.     append_sale(tw, tr, num_trades);  /* write new trade to trade file */
  82.     done2 = 1;
  83.     break;
  84.       case 'b':
  85.     buy_what(tw, &num, &amt);    /* get users bid */
  86.     append_bid(tw, num, amt); /* write new bid to bids file */
  87.     done2 = 1;
  88.     break;
  89.       default:
  90.     bad_key();
  91.     break;
  92.       }
  93.     }
  94.   }
  95.   delwin(tw);
  96.   touch_all_wins();
  97.   refresh();
  98. }
  99.  
  100.  
  101. /* reads the list of current trades from the trades file into an array. */
  102. int read_trades(list, list2)
  103.      struct trade list[];
  104.      int list2[];
  105. {
  106.   int n, i, t, a, nt;
  107.  
  108.   trades = fopen(TRADES_FILE, "r");
  109.   i = 0;
  110.   if (trades) {
  111.     while (!feof(trades)) {
  112.       fscanf(trades, "%d", &n);
  113.       fscanf(trades, "%d %d %d %d %d %d\n", &list[n].natn, &list[n].item1,
  114.          &list[n].amt1, &list[n].item2, &list[n].amt2, &list[n].priv);
  115.       i++;
  116.     }
  117.     fclose(trades);
  118.   }
  119.   nt = i;
  120.  
  121.   for (i = 0; i < MAXTRADES; i++)
  122.     list2[i] = 0;
  123.   bids = fopen(BIDS_FILE, "r");
  124.   if (bids) {
  125.     while (!feof(bids)) {
  126.       fscanf(bids, "%d %d %d\n", &t, &n, &a);
  127.       if (n == user.id)
  128.     list2[t] = a;
  129.     }
  130.     fclose(bids);  
  131.   }
  132.   return(nt);
  133. }
  134.  
  135.  
  136. sell_what(tw, desc)
  137.      WINDOW *tw;
  138.      struct trade *desc;
  139. {
  140.   char str[80], ic1, ic2;
  141.   int i, it1, am1, it2, am2, ret;
  142.  
  143.   i = 0;
  144.   str[0] = '\0';
  145.  
  146.   while (strncmp(tradeitems[i].name, "END", 3)) {
  147.     sprintf(&str[strlen(str)], "(%c) %s, ", tradeitems[i].mark, tradeitems[i].name);
  148.     i++;
  149.   }
  150.   mvwprintw(tw, 19, 2, "%s", str);
  151.   echo();
  152.   mvwprintw(tw, 21, 2, "Which item type do you wish to sell? ");
  153.   wrefresh(tw);
  154.   ic1 = getch();
  155.   it1 = whichitem(ic1);
  156.   if (ret > 0) {
  157.     mvwprintw(tw, 21, 2, "How much %s to sell? ", tradeitems[it1].name);
  158.     wclrtoeol(tw);
  159.     nocbreak();
  160.     wrefresh(tw);
  161.     ret = wscanw(tw, "%d", &am1);
  162.     if (ret > 0) {
  163.       mvwprintw(tw, 21, 2, "Which item do you want in return? ");
  164.       wclrtoeol(tw);
  165.       cbreak();
  166.       wrefresh(tw);
  167.       ic2 = getch();
  168.       it2 = whichitem(ic2);
  169.       if (ret > 0) {
  170.     mvwprintw(tw, 21, 2, "Minimum %s you will accept? ", tradeitems[it2].name);
  171.     wclrtoeol(tw);
  172.     nocbreak();
  173.     ret = wscanw(tw, "%d", &am2);
  174.     if (ret > 0) {
  175.       desc->item1 = it1;
  176.       desc->amt1 = am1;
  177.       desc->item2 = it2;
  178.       desc->amt2 = am2;
  179.       desc->priv = 0;
  180.     }
  181.       }
  182.     }
  183.   }
  184.   noecho();
  185.   cbreak();
  186. }
  187.  
  188.  
  189. int whichitem(ch)
  190.      char ch;
  191. {
  192.   int i=0;
  193.  
  194.   while (tradeitems[i].mark != ch) i++;
  195.   return i;
  196. }
  197.  
  198.  
  199. buy_what(tw, t, a)
  200.      WINDOW *tw;
  201.      int *t, *a;
  202. {
  203.   int num, am, ret;
  204.  
  205.   wmove(tw, 19, 2);
  206.   wclrtoeol(tw);
  207.   mvwprintw(tw, 19, 2, "Which trade item do you wish to bid on? ");
  208.   echo();
  209.   nocbreak();
  210.   wrefresh(tw);
  211.   ret = wscanw(tw, "%d", &num);
  212.   if (ret > 0) {
  213.     mvwprintw(tw, 19, 2, "How much do you wish to bid? ");
  214.     wclrtoeol(tw);
  215.     ret = wscanw(tw, "%d", &am);
  216.     if (ret > 0) {
  217.       *t = num;
  218.       *a = am;
  219.     }
  220.   }
  221.   noecho();
  222.   cbreak();
  223. }
  224.  
  225.  
  226. append_sale(tw, desc, number)
  227.      WINDOW *tw;
  228.      struct trade desc;
  229.      int number;
  230. {
  231.   if ((trades = fopen (TRADES_FILE, "a")) == NULL)
  232.   {
  233.     fprintf(stderr,"Error: Cannot write to file %s\n",TRADES_FILE);
  234.     clean_exit();
  235.     exit(1);
  236.   }
  237.   fprintf(trades, "%d %d %d %d %d %d %d\n", number, desc.natn,
  238.       desc.item1, desc.amt1, desc.item2, desc.amt2, desc.priv);
  239.   fclose(trades);
  240. }
  241.  
  242.  
  243. append_bid(tw, num, amt)
  244.      int num, amt;
  245. {
  246.   if ( (bids = fopen(BIDS_FILE, "a") ) == NULL)
  247.   {
  248.     fprintf(stderr,"Error: Cannot write to file %s\n",BIDS_FILE);
  249.     clean_exit();
  250.     exit(1);
  251.   }
  252.   fprintf(bids, "%d %d %d\n", num, user.id, amt);
  253.   fclose(bids);
  254. }
  255. #endif /* TRADEMENU */
  256.