home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume4 / conquer3 / part01 / display.c next >
C/C++ Source or Header  |  1988-06-16  |  10KB  |  358 lines

  1. /*Print and io subroutines for interactive game*/
  2.  
  3. /*conquer : Copyright (c) 1988 by Ed Barlow.
  4.  *  I spent a long time writing this code & I hope that you respect this.
  5.  *  I give permission to alter the code, but not to copy or redistribute
  6.  *  it without my explicit permission.  If you alter the code,
  7.  *  please document changes and send me a copy, so all can have it.
  8.  *  This code, to the best of my knowledge works well,  but it is my first
  9.  *  'C' program and should be treated as such.  I disclaim any
  10.  *  responsibility for the codes actions (use at your own risk).  I guess
  11.  *  I am saying "Happy gaming", and am trying not to get sued in the process.
  12.  *                                                Ed
  13.  */
  14.  
  15. /*include files*/
  16. #include <ctype.h>
  17. #include "header.h"
  18. #include "data.h"
  19.  
  20. /*Declarations*/
  21. extern struct s_sector sct[MAPX][MAPY];
  22. extern struct nation ntn[NTOTAL];   /* player nation stats */
  23.  
  24. /*offset of upper left hand corner*/
  25. extern short xoffset;
  26. extern short yoffset;
  27. /*current cursor postion (relative to 00 in upper corner)*/
  28. /*    position is 2*x,y*/
  29. extern short xcurs;
  30. extern short ycurs;
  31. /*redraw map in this turn if redraw is a 1*/
  32. extern short redraw;
  33. /*display state SEE data.h FOR CURRENT VALUES OF THESE */
  34. extern short hilmode;
  35. extern short dismode;
  36. /* nation id of owner*/
  37. extern short country;
  38.  
  39. /*make a map*/
  40. void
  41. makemap()
  42. {
  43.     register int x,y;
  44.     register int i,j;
  45.     short armynum,nvynum;
  46.  
  47.     /*can you see all?*/
  48.     if((magic(country,KNOWALL)==1)||(country==0)) {
  49.         for(x=0;x<SCREEN_X_SIZE;x++) {
  50.             for(y=0;y<(LINES-4);y++) {
  51.                 highlight(x,y);
  52.                 see(x,y);
  53.             }
  54.         }
  55.         if((hilmode==HI_ARMY)||(hilmode==HI_MOVE)||(hilmode==HI_YARM)) {
  56.             for(armynum=0;armynum<MAXARM;armynum++)
  57.             if((ASOLD>0)&&((AMOVE>0)||(hilmode!=4))){
  58.                 standout();
  59.                 see(AXLOC-xoffset,AYLOC-yoffset);
  60.             }
  61.         }
  62.     }
  63.     /*see as appropriate?*/
  64.     else {
  65.         for(x=0;x<SCREEN_X_SIZE;x++) for(y=0;y<(LINES-4);y++) {
  66.             if(sct[x+xoffset][y+yoffset].owner==country){
  67.                 for(i=x-LANDSEE;i<=x+LANDSEE;i++){
  68.                     for(j=y-LANDSEE;j<=y+LANDSEE;j++) {
  69.                         highlight(i,j);
  70.                         see(i,j);
  71.                     }
  72.                 }
  73.             }
  74.         }
  75.         for(nvynum=0;nvynum<MAXNAVY;nvynum++) if(NMER+NWAR>0){
  76.             for(i=NXLOC-xoffset-NAVYSEE;i<=NXLOC-xoffset+NAVYSEE;i++) for(j=NYLOC-yoffset-NAVYSEE;j<=NYLOC-yoffset+NAVYSEE;j++){
  77.                 highlight(i,j);
  78.                 see(i,j);
  79.             }
  80.         }
  81.         for(armynum=0;armynum<MAXARM;armynum++) if(ASOLD>0){
  82.             for(i=AXLOC-xoffset-ARMYSEE;i<=AXLOC-xoffset+ARMYSEE;i++) for(j=AYLOC-yoffset-ARMYSEE;j<=AYLOC-yoffset+ARMYSEE;j++) {
  83.                 highlight(i,j);
  84.                 see(i,j);
  85.             }
  86.         }
  87.         /*optimal method of highlighting your armies*/
  88.         if((hilmode==HI_YARM)||(hilmode==HI_MOVE)) {
  89.             for(armynum=0;armynum<MAXARM;armynum++)
  90.             if((ASOLD>0)&&((AMOVE>0)||(hilmode==HI_YARM))){
  91.                 standout();
  92.                 see(AXLOC-xoffset,AYLOC-yoffset);
  93.             }
  94.             for(nvynum=0;nvynum<MAXNAVY;nvynum++)
  95.             if((NWAR+NMER>0)&&((NMOVE>0)||(hilmode==HI_YARM))){
  96.                 standout();
  97.                 see(NXLOC-xoffset,NYLOC-yoffset);
  98.             }
  99.         }
  100.     }
  101.     move(ycurs,2*xcurs);
  102. }
  103.  
  104. void
  105. newdisplay()
  106. {
  107.     mvaddstr(LINES-4,0,"viewing options:  (d)esignation, (r)ace, (m)ove cost, (p)eople, (D)efense");
  108.     clrtoeol();
  109.         mvaddstr(LINES-3,0,"          (f)ood, (c)ontour, (v)egetation, (i)ron, (n)ation mark, (j)ewels");
  110.     clrtoeol();
  111.     mvaddstr(LINES-2,0,"highlight option: (o)wners, (a)rmy, (y)our Army, (M)ove left, (x)=none");
  112.     clrtoeol();
  113.     standout();
  114.     mvaddstr(LINES-1,0,"what display?:");
  115.     clrtoeol();
  116.     move(LINES-1,16);
  117.     standend();
  118.     refresh();
  119.     redraw=TRUE;
  120.     switch(getch()) {
  121.     case 'f':
  122.         dismode=DI_FOOD;
  123.         break;
  124.     case 'v':    /* vegetation map*/
  125.         dismode=DI_VEGE;
  126.         break;
  127.     case 'd':    /* designations map*/
  128.         dismode=DI_DESI;
  129.         break;
  130.     case 'c':    /* contour map of world */
  131.         dismode=DI_CONT;
  132.         break;
  133.     case 'n':    /* nations map*/
  134.         dismode=DI_NATI;
  135.         break;
  136.     case 'r':    /* race map*/
  137.         dismode=DI_RACE;
  138.         break;
  139.     case 'm':    /* move cost map*/
  140.         dismode=DI_MOVE;
  141.         break;
  142.     case 'D':
  143.         dismode=DI_DEFE;
  144.         break;
  145.     case 'p':
  146.         dismode=DI_PEOP;
  147.         break;
  148.     case 'j':
  149.         dismode=DI_GOLD;
  150.         break;
  151.     case 'i':
  152.         dismode=DI_IRON;
  153.         break;
  154.     case 'a':    /* armies hilighted map*/
  155.         prep(country);
  156.         hilmode=HI_ARMY;
  157.         break;
  158.     case 'o':    /* owners hilighted map*/
  159.         hilmode=HI_OWN;
  160.         break;
  161.     case 'x':    /*no highlighting*/
  162.         hilmode=HI_NONE;
  163.         break;
  164.     case 'y':    /* your armies hilighted map*/
  165.         prep(country);
  166.         hilmode=HI_YARM;
  167.         break;
  168.     case 'M':    /* your armies with moves left hilighted map*/
  169.         prep(country);
  170.         hilmode=HI_MOVE;
  171.         break;
  172.     default:
  173.         beep();
  174.         redraw=FALSE;
  175.     }
  176.     makebottom();
  177. }
  178.  
  179. /*see what is in xy as per display mode*/
  180. void
  181. see(x,y)
  182. {
  183.     int armbonus;
  184.     if((x<0)||(y<0)||(x>COLS-21)||(y>=LINES-4)) return;
  185.     if(((y+yoffset)<MAPY)&&((x+xoffset)<MAPX)) {
  186.  
  187.         if((magic(sct[x+xoffset][y+yoffset].owner,THE_VOID)==TRUE)
  188.         &&((dismode==DI_DEFE)||(dismode==DI_GOLD)||(dismode==DI_IRON)
  189.             ||(dismode==DI_PEOP)||(dismode==DI_FOOD))
  190.         &&(country!=sct[x+xoffset][y+yoffset].owner)
  191.         &&(country!=0)) {
  192.             standout();
  193.             mvaddch(y,2*x,' ');
  194.             standend();
  195.         } else {
  196.             switch(dismode){
  197.             case DI_FOOD:    /*food */
  198.                 if(tofood(sct[x+xoffset][y+yoffset].vegetation,country)==0)
  199.                 mvaddch(y,2*x,sct[x+xoffset][y+yoffset].vegetation);
  200.                 else
  201.                 mvprintw(y,2*x,"%d",tofood(sct[x+xoffset][y+yoffset].vegetation,country));
  202.                 break;
  203.             case DI_VEGE: /*vegetation*/
  204.                 mvaddch(y,2*x,sct[x+xoffset][y+yoffset].vegetation);
  205.                 break;
  206.             case DI_DESI: /*designation*/
  207.                 if(sct[x+xoffset][y+yoffset].owner==0){
  208.                     if(tofood(sct[x+xoffset][y+yoffset].vegetation,sct[x+xoffset][y+yoffset].owner)!=0) mvaddch(y,2*x,sct[x+xoffset][y+yoffset].altitude);
  209.                     else mvaddch(y,2*x,sct[x+xoffset][y+yoffset].vegetation);
  210.                 }
  211.                 else if((country==0)
  212.                 ||(sct[x+xoffset][y+yoffset].owner==country))
  213.                 mvaddch(y,2*x,sct[x+xoffset][y+yoffset].designation);
  214.                 else mvaddch(y,2*x,ntn[sct[x+xoffset][y+yoffset].owner].mark);
  215.                 break;
  216.             case DI_CONT: /*contour*/
  217.                 mvaddch(y,2*x,sct[x+xoffset][y+yoffset].altitude);
  218.                 break;
  219.             case DI_NATI: /*ownership*/
  220.                 if(sct[x+xoffset][y+yoffset].owner==0)
  221.                     mvaddch(y,2*x,sct[x+xoffset][y+yoffset].altitude);
  222.                 else mvaddch(y,2*x,ntn[sct[x+xoffset][y+yoffset].owner].mark);
  223.                 break;
  224.             case DI_RACE: /*race*/
  225.                 if(sct[x+xoffset][y+yoffset].owner==0)
  226.                     mvaddch(y,2*x,sct[x+xoffset][y+yoffset].altitude);
  227.                 else mvaddch(y,2*x,ntn[sct[x+xoffset][y+yoffset].owner].race);
  228.                 break;
  229.             case DI_MOVE:    /*movement cost map*/
  230.                 if(movecost[x+xoffset][y+yoffset]>=0) mvprintw(y,2*x,"%d",movecost[x+xoffset][y+yoffset]);
  231.                 else if(sct[x+xoffset][y+yoffset].altitude==WATER)
  232.                     mvaddch(y,2*x,WATER);
  233.                 else
  234.                     mvaddch(y,2*x,'X');
  235.                 break;
  236.             case DI_DEFE:   /*Defence*/
  237.                 if (sct[x+xoffset][y+yoffset].altitude==WATER)
  238.                     mvaddch(y,2*x,WATER);
  239.                 else if (movecost[x+xoffset][y+yoffset]<0)
  240.                     mvaddch(y,2*x,'*');
  241.                 else {
  242.  
  243.                     /*Racial combat bonus due to terrain (the faster you move the better)*/
  244.                     armbonus=0;
  245.                     armbonus+=5*(9-movecost[x+xoffset][y+yoffset]);
  246.  
  247.                     if(sct[x+xoffset][y+yoffset].altitude==MOUNTAIN) armbonus+=40;
  248.                     else if(sct[x+xoffset][y+yoffset].altitude==HILL) armbonus+=20;
  249.  
  250.                     if(sct[x+xoffset][y+yoffset].vegetation==JUNGLE)
  251.                         armbonus+=30;
  252.                     else if(sct[x+xoffset][y+yoffset].vegetation==FOREST)
  253.                         armbonus+=20;
  254.                     else if(sct[x+xoffset][y+yoffset].vegetation==WOOD)
  255.                         armbonus+=10;
  256.  
  257.             if((sct[x+xoffset][y+yoffset].designation==DCASTLE)
  258.             ||(sct[x+xoffset][y+yoffset].designation==DCITY)
  259.             ||(sct[x+xoffset][y+yoffset].designation==DCAPITOL))
  260.                         armbonus+=8*sct[x+xoffset][y+yoffset].fortress;
  261.  
  262.                     mvprintw(y,2*x,"%d",armbonus/20);
  263.                 }
  264.                 break;
  265.             case DI_PEOP:   /*People*/
  266.                 if (sct[x+xoffset][y+yoffset].altitude==WATER)
  267.                     mvaddch(y,2*x,WATER);
  268.                 else if (sct[x+xoffset][y+yoffset].people>=1000)
  269.                     mvaddch(y,2*x,'+');
  270.                 else if (sct[x+xoffset][y+yoffset].people>=450)
  271.                     mvaddch(y,2*x,'>');
  272.                 else if (sct[x+xoffset][y+yoffset].people==0)
  273.                     mvaddch(y,2*x,'0');
  274.                 else
  275.                     mvprintw(y,2*x,"%d",1+sct[x+xoffset][y+yoffset].people/50);
  276.                 break;
  277.             case DI_GOLD:  /*Gold*/
  278.                 if (sct[x+xoffset][y+yoffset].altitude==WATER)
  279.                     mvaddch(y,2*x,WATER);
  280.                 else if(tofood(sct[x+xoffset][y+yoffset].vegetation,country)==0)
  281.                     mvaddch(y,2*x,'X');
  282.                 else if((sct[x+xoffset][y+yoffset].owner!=0)
  283.                 &&(country!=0)
  284.                 &&(sct[x+xoffset][y+yoffset].owner!=country))
  285.                     mvaddch(y,2*x,'?');
  286.                 else if(sct[x+xoffset][y+yoffset].gold>=10)
  287.                     mvaddch(y,2*x,'+');
  288.                 else
  289.                     mvprintw(y,2*x,"%d",sct[x+xoffset][y+yoffset].gold);
  290.                 break;
  291.             case DI_IRON:  /*Iron*/
  292.                 if (sct[x+xoffset][y+yoffset].altitude==WATER)
  293.                     mvaddch(y,2*x,WATER);
  294.                 else if(tofood(sct[x+xoffset][y+yoffset].vegetation,country)==0)
  295.                     mvaddch(y,2*x,'X');
  296.                 else if((sct[x+xoffset][y+yoffset].owner!=0)
  297.                 &&(country!=0)
  298.                 &&(sct[x+xoffset][y+yoffset].owner!=country))
  299.                     mvaddch(y,2*x,'?');
  300.                 else if (sct[x+xoffset][y+yoffset].iron>=10)
  301.                     mvaddch(y,2*x,'+');
  302.                 else
  303.                     mvprintw(y,2*x,"%d",sct[x+xoffset][y+yoffset].iron);
  304.                 break;
  305.             default:
  306.                 break;
  307.             }
  308.         }
  309.     }
  310.     else mvaddch(y,2*x,' ');
  311.     standend();
  312. }
  313.  
  314. /*highlight what is in xy as per highlight mode*/
  315. void
  316. highlight(x,y)
  317. {
  318.     if((x<0)||(y<0)||(x>COLS-21)||(y>=LINES-4)) return;
  319.     if(((y+yoffset)<MAPY)&&((x+xoffset)<MAPX)) {
  320.         switch(hilmode){
  321.         case HI_OWN: /*ownership*/
  322.             if(country==0) {
  323.                 if(sct[x+xoffset][y+yoffset].owner>0)
  324.                     standout();
  325.             }
  326.             else if(sct[x+xoffset][y+yoffset].owner==country)
  327.                 standout();
  328.             break;
  329.         case HI_ARMY: /*army map*/
  330.             if(occ[x+xoffset][y+yoffset]!=0) standout();
  331.             break;
  332.         default:
  333.             break;
  334.         }
  335.     }
  336. }
  337.  
  338. /* check if cursor is out of bounds*/
  339. void
  340. coffmap()
  341. {
  342.     if((xcurs<1)||(ycurs<1)||(xcurs>=SCREEN_X_SIZE)
  343.     ||((ycurs>=SCREEN_Y_SIZE))||((XREAL)>=MAPX)
  344.     ||((YREAL)>=MAPY)) offmap();
  345.  
  346.     /*update map*/
  347.     if(redraw==TRUE) {
  348.         clear();
  349.         makemap(); /* update map*/
  350.         makebottom();
  351.         redraw=FALSE;
  352.     }
  353.     move(ycurs,2*xcurs);
  354.     makeside();  /*update side*/
  355.     move(ycurs,2*xcurs);
  356.     refresh();
  357. }
  358.