Path: utzoo!attcan!uunet!lll-winken!lll-tis!ames!ll-xn!mit-eddie!uw-beaver!tektronix!tekgen!tekred!games From: games@tekred.TEK.COM Newsgroups: comp.sources.games Subject: v04i048: conquer3 - middle earth multi-player game (V3), Part07/08 Message-ID: <2657@tekred.TEK.COM> Date: 16 Jun 88 21:39:59 GMT Sender: billr@tekred.TEK.COM Lines: 2029 Approved: billr@saab.CNA.TEK.COM Submitted by: ihnp4!homxc!smile Comp.sources.games: Volume 4, Issue 48 Archive-name: conquer3/Part07 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh forms.c <<'END_OF_forms.c' X/*conquer : Copyright (c) 1988 by Ed Barlow. X * I spent a long time writing this code & I hope that you respect this. X * I give permission to alter the code, but not to copy or redistribute X * it without my explicit permission. If you alter the code, X * please document changes and send me a copy, so all can have it. X * This code, to the best of my knowledge works well, but it is my first X * 'C' program and should be treated as such. I disclaim any X * responsibility for the codes actions (use at your own risk). I guess X * I am saying "Happy gaming", and am trying not to get sued in the process. X * Ed X */ X X/* screen subroutines */ X X/*include files*/ X#include X#include "header.h" X#include "data.h" X Xextern FILE *fexe; Xextern short country; Xextern FILE *fnews; X Xvoid Xshowscore() X{ X int i; X int done=FALSE; X int position; X int count; /*number of time through the loop on this screen*/ X int nationid; /*current nation id */ X X nationid=1; X while((done==FALSE)&&(nationid=2) mvprintw(7,position,"NPC"); X else mvprintw(7,position,"%s",*(Class+ntn[nationid].class)); X mvprintw(8,position,"%ld",ntn[nationid].score); X mvprintw(9,position,"%ld",ntn[nationid].tgold); X mvprintw(10,position,"%ld",ntn[nationid].tmil); X mvprintw(11,position,"%ld",ntn[nationid].tciv); X mvprintw(12,position,"%d",ntn[nationid].tsctrs); X count++; X } X nationid++; X } X standout(); X mvaddstr(18,(COLS/2)-12,"HIT ANY KEY TO CONTINUE"); X mvaddstr(19,(COLS/2)-9,"HIT SPACE IF DONE"); X standend(); X refresh(); X if (getch()==' ') done=TRUE; X } X} X Xvoid Xdiploscrn() X{ X int i; X char k; X char tempifile[30]; X short nation, offset, count, olddip, oldnat, temp; X FILE *fp, *fopen(); X short isgod=FALSE; X if(country==0) { X isgod=TRUE; X clear(); X mvaddstr(0,0,"WHAT NATION NUMBER:"); X refresh(); X country = get_number(); X } X while(1){ X count=1; X offset=0; X clear(); X standout(); X mvaddstr(0,(COLS/2)-10,"NATION DIPLOMACY SUMMARY"); X standend(); X mvaddstr(2,0," BY YOU, TO YOU"); X for(i=1;i0)&&(i!=country)) { X if(count%14==0) { X offset+=40; X mvaddstr(2,40," BY YOU, TO YOU"); X count++; X } X mvprintw(count%14+2,offset, "%d. %s",i,ntn[i].name); X if((ntn[country].dstatus[i]==WAR) X ||(ntn[country].dstatus[i]==JIHAD)) standout(); X mvprintw(count%14+2,offset+14, "=> %s",*(diploname+ntn[country].dstatus[i])); X standend(); X if((ntn[i].dstatus[country]==WAR) X ||(ntn[i].dstatus[country]==JIHAD)) standout(); X mvprintw(count%14+2,offset+28, "=> %s",*(diploname+ntn[i].dstatus[country])); X standend(); X count++; X } X standout(); X mvaddstr(17,0,"HIT RETURN KEY TO CHANGE STATUS"); X mvprintw(18,0,"HIT 'B' KEY TO BRIBE WARRING NPC NATION (%ld GOLD/level)",BRIBE); X mvaddstr(19,0,"ANY OTHER KEY TO CONTINUE:"); X standend(); X refresh(); X k=getch(); X if((k!='\n')&&(k!='B')) { X if(isgod==TRUE) country=0; X return; X } X if(k=='B'){ X if(ntn[country].tgold<=BRIBE){ X mvaddstr(21,0,"NOT ENOUGH GOLD"); X refresh(); X getch(); X return; X } X mvaddstr(20,0,"BRIBES WORK 50% (only the update will show)"); X mvaddstr(21,0,"WHAT NATION NUMBER:"); X refresh(); X nation = get_number(); X if(ntn[nation].active<2){ X mvaddstr(22,0,"NOT NON PLAYER COUNTRY"); X refresh(); X getch(); X return; X } X /*use maxntn here as cant change with nomads...*/ X if((nation<=0)||(nation>MAXNTN)){ X if(isgod==TRUE) country=0; X return; X } X if((isgod!=1) X &&((ntn[nation].dstatus[country]==ALLIED) X ||(ntn[nation].dstatus[country]==JIHAD) X ||(ntn[nation].dstatus[country]==CONFEDERACY))){ X mvaddstr(22,0,"CANT CHANGE THEIR STATUS"); X refresh(); X getch(); X return; X } X ntn[nation].dstatus[country]--; X ntn[country].tgold-=BRIBE; X ntn[nation].tgold+=BRIBE; X EADJDIP; X oldnat=country; X country=nation; X nation=oldnat; X fprintf(fexe,"L_NGOLD\t%hd \t%d \t%ld \t0 \t0 \t%s\n",XNAGOLD ,country,ntn[country].tgold,"null"); X EADJDIP; X country=oldnat; X return; X } X mvaddstr(21,0,"WHAT NATION NUMBER:"); X refresh(); X nation = get_number(); X /*use maxntn here as cant change with nomads...*/ X if((nation<=0)||(nation>MAXNTN)){ X if(isgod==TRUE) country=0; X return; X } X if((isgod==FALSE) X &&(((ntn[country].dstatus[nation]==CONFEDERACY) X &&(ntn[nation].dstatus[country]7)){ X mvprintw(23,0,"SORRY, Invalid inputs -- hit return"); X refresh(); X getch(); X return; X } X ntn[country].dstatus[nation]=temp; X EADJDIP; X X /*prevent ron from being sneaky*/ X if((temp>HOSTILE)&&(ntn[nation].active>2) X &&(ntn[nation].dstatus[country]HOSTILE)&&(ntn[nation].active==1) X &&(ntn[nation].dstatus[country]NAMELTH)){ X beep(); X mvaddstr(2,0,"invalid name--hit return"); X refresh(); X getch(); X if(isgod==TRUE) country=0; X return; X } X /*check if already used*/ X else for(i=1;i<(country-1);i++){ X if((strcmp(ntn[i].name,string)==0)&&(i!=country)) { X mvaddstr(2,0,"name already used--hit return"); X beep(); X refresh(); X getch(); X if(isgod==TRUE) country=0; X return; X } X } X mvaddstr(2,0,"new name can be used following next update--hit return"); X refresh(); X getch(); X strcpy(ntn[country].name,string); X ECHGNAME; X break; X case '2': /*change password */ X clear(); X if(isgod!=1){ X mvaddstr(0,0,"what is your current password:"); X refresh(); X getstr(string); X strcpy(passwd,crypt(string,SALT)); X if((strncmp(passwd,ntn[0].passwd,PASSLTH)!=0) X &&(strncmp(passwd,ntn[country].passwd,PASSLTH)!=0)){ X beep(); X mvaddstr(2,0,"invalid password--hit return"); X refresh(); X getch(); X if(isgod==TRUE) country=0; X return; X } X } X mvaddstr(2,0,"what is your new password:"); X refresh(); X getstr(string); X if((strlen(string)>=8)||(strlen(string)<2)) { X beep(); X mvaddstr(2,0,"invalid new password--hit return"); X refresh(); X getch(); X if(isgod==TRUE) country=0; X return; X } X mvaddstr(4,0,"reenter your new password:"); X refresh(); X getstr(passwd); X if(strcmp(passwd,string)!=0) { X if(isgod==TRUE) country=0; X return; X } X mvaddstr(6,0,"new password can be used following next update--hit return"); X refresh(); X getch(); X ECHGPAS; X strncpy(ntn[country].passwd,crypt(string,SALT),PASSLTH); X break; X case '3': X if(magic(country,VAMPIRE)==1) { X mvaddstr(0,0,"VAMPIRES CAN'T ADD TO COMBAT BONUS (hit return)"); X refresh(); X getch(); X break; X } X if(magic(country,WARLORD)==1) cbonus=30; X else if(magic(country,CAPTAIN)==1) cbonus=20; X else if(magic(country,WARRIOR)==1) cbonus=10; X else cbonus=0; X i=0; X for(armynum=0;armynum0) i+=ASOLD; X i = max ( i, 1500); X armynum = max ( ntn[country].aplus-cbonus, 10 ) / 10; X mvprintw(0,0,"DO YOU WISH SPEND %d IRON ON ATTACK (enter y or n):",IRONORE*i*armynum*armynum); X refresh(); X if(getch()=='y'){ X if(ntn[country].tiron> (long)IRONORE*i*armynum*armynum){ X ntn[country].aplus+=1; X I_APLUS; X ntn[country].tiron-= (long) IRONORE*i*armynum*armynum; X } X else { X mvaddstr(0,0,"SORRY - hit any key"); X clrtoeol(); X refresh(); X getch(); X } X } X i=0; X for(armynum=0;armynum0) i+=ASOLD; X i = max ( i, 1500); X armynum = max ( ntn[country].dplus-cbonus, 10 ) / 10; X mvprintw(0,0,"DO YOU WISH SPEND %d IRON ON DEFENSE (enter y or n):",IRONORE*i*armynum*armynum); X refresh(); X if(getch()=='y'){ X if(ntn[country].tiron>IRONORE*i*armynum*armynum){ X ntn[country].dplus+=1; X I_DPLUS; X ntn[country].tiron-= (long) IRONORE*i*armynum*armynum; X } X else { X mvaddstr(0,0,"SORRY - hit any key"); X clrtoeol(); X refresh(); X getch(); X } X } X break; X case '4': X if(isgod==TRUE){ X clear(); X mvaddstr(0,0,"DO YOU WANT TO DESTROY THIS NATION (y or n)"); X refresh(); X X if(getch()=='y') { X if ((fnews=fopen(newsfile,"w"))==NULL) { X printf("error opening news file\n"); X exit(FAIL); X } X destroy(country); X fclose(fnews); X } X } X break; X default: X if(isgod==TRUE) country=0; X return; X } X if(isgod==TRUE) country=0; X change(); X} X Xvoid Xhelp() X{ X int lineno; X FILE *fp, *fopen(); X int done=FALSE; X char line[80]; X X /*open .help file*/ X if ((fp=fopen(helpfile,"r"))==NULL) { X mvprintw(0,0,"\nerror on read of %s\n",helpfile); X refresh(); X getch(); X return; X } X X while(done==FALSE){ X /*read in screen (until DONE statement)*/ X fgets(line,80,fp); X if(strncmp(line,"DONE",4)==0) done=TRUE; X else { X clear(); X lineno=0; X while(strncmp(line,"END",3)!=0) { X mvaddstr(lineno,0,line); X lineno++; X if(lineno>LINES-3) strcpy(line,"END"); X else fgets(line,80,fp); X } X standout(); X mvaddstr(LINES-2,(COLS/2)-24,"HIT ANY KEY TO CONTINUE HELP SCREENS"); X mvaddstr(LINES-1,(COLS/2)-19,"TO END HELP HIT SPACE KEY"); X standend(); X refresh(); X if(getch()==' ') done=TRUE; X } X } X fclose(fp); X} X Xvoid Xnewspaper() X{ X int lineno; X FILE *fp, *fopen(); X int newpage,done; X short pagenum=1; X char line[80]; X char title[80]; X X clear(); X if ((fp=fopen(newsfile,"r"))==NULL) { X mvprintw(0,0,"error on read of %s",newsfile); X refresh(); X getch(); X return; X } X X /*open and read one page */ X done=FALSE; X newpage=FALSE; X if(fgets(title,80,fp)==NULL) done=TRUE; X while(done==FALSE){ X if(newpage==FALSE){ X clear(); X lineno=5; X newpage=TRUE; X standout(); X mvprintw(0,20,"CONQUER NEWS REPORT page %d",pagenum); X mvaddstr(1,23,"ALL THE NEWS THAT FITS"); X mvprintw(3,20,"%s",title+2); X standend(); X } X X if(fgets(line,80,fp)==NULL) done=TRUE; X else { X if(line[1]!='.') { X strcpy(title,line); X newpage=FALSE; X pagenum++; X } X else { X mvaddstr(lineno++,0,line+2); X if(todigit(line[0])!=pagenum) { X newpage=FALSE; X pagenum=todigit(line[0]); X } X else if(lineno>LINES-3) newpage=FALSE; X } X } X X if(newpage==FALSE||done==TRUE){ X standout(); X mvaddstr(LINES-2,(COLS/2)-13,"HIT ANY KEY TO CONTINUE"); X mvaddstr(LINES-1,(COLS/2)-12,"TO END NEWS HIT SPACE"); X standend(); X refresh(); X if(getch()==' ') done=TRUE; X } X } X fclose(fp); X} END_OF_forms.c if test 14869 -ne `wc -c getopt.c <<'END_OF_getopt.c' X/* X** This is a public domain version of getopt(3). X** Bugs, fixes to: X** Keith Bostic X** ARPA: keith@seismo X** UUCP: seismo!keith X** Added NO_STDIO, opterr handling, Rich $alz (mirror!rs). X*/ X X#include X#include "header.h" X#include "data.h" X X/* X** Error macro. Maybe we want stdio, maybe we don't. X** The (undocumented?) variable opterr tells us whether or not X** to print errors. X*/ X#ifdef SYSV X#define index(s,c) strchr(s,c) Xextern char *strchr(); /* This may be index */ X#else Xextern char *index(); /* This may be strchr */ X#endif X X#ifdef NO_STDIO X X#define tell(s) \ X if (opterr) \ X { \ X char ebuf[2]; \ X (void)write(2, nargv, (unsigned int)strlen(nargv)); \ X (void)write(2, s, (unsigned int)strlen(s)); \ X ebuf[0] = optopt; \ X ebuf[1] = '\n'; \ X (void)write(2, ebuf, 2); \ X } X X#else X X#define tell(s) \ X if (opterr) \ X (void)fputs(*nargv, stderr), \ X (void)fputs(s,stderr), \ X (void)fputc(optopt, stderr), \ X (void)fputc('\n', stderr) X X#endif X X X/* Global variables. */ Xstatic char EMSG[] = ""; Xint opterr = 1; /* undocumented error-suppressor*/ Xint optind = 1; /* index into argv vector */ Xint optopt; /* char checked for validity */ Xchar *optarg; /* arg associated with option */ X X Xgetopt(nargc, nargv, ostr) Xint nargc; Xchar **nargv; Xchar *ostr; X{ X static char *place = EMSG; /* option letter processing */ X register char *oli; /* option letter list index */ X X if (!*place) /* update scanning pointer */ X { X if (optind >= nargc || *(place = nargv[optind]) != '-' || !*++place) X return(EOF); X if (*place == '-') /* found "--" */ X { X optind++; X return(EOF); X } X } X /* option letter okay? */ X if ((optopt = *place++) == ':' X || (oli = index(ostr, optopt)) == NULL) X { X if (!*place) X optind++; X tell(": illegal option -- "); X goto Bad; X } X if(*++oli != ':') /* don't need argument */ X { X optarg = NULL; X if (!*place) X optind++; X } X else /* need an argument*/ X { X if (*place) X optarg = place; /* no white space */ X else X if (nargc <= ++optind) X { X place = EMSG; X tell(": option requires an argument -- "); X goto Bad; X } X else X optarg = nargv[optind]; /* white space */ X place = EMSG; X optind++; X } X return(optopt); /* dump back option letter */ XBad: X return('?'); X} END_OF_getopt.c if test 2223 -ne `wc -c header.h <<'END_OF_header.h' X/* conquer : Copyright (c) 1988 by Ed Barlow. */ X/* MODIFICATION OF THIS FILE IMPLIES THAT THE MODIFIER WILL ACCEPT X A LIMITED USE COPYRIGHT AS FOLLOWS: X X 1) This software is copyrighted and protected by law. The X sole owner of this software, which hereafter is known as X "conquer" is Edward M. Barlow, who hereby grants you a X personal, non-exclusive right to use this software. X 2) conquer may not be redistributed in any form. Any requests for X new software shall, for now, be the perogative of the author. X 3) loss or damage caused by this software shall not be X the responsibility of the author. X 4) Ed Barlow shall be notified of enhancements to this software via X electronic mail and, if there is no response, via US mail to: X X Ed Barlow X 562 Clubhouse Dr, X Middletown NJ 07748 X X My home phone is 201-671-2896. Use it sparingly and call X before 11PM if it is important. X 5) you agree to use your best efforts to see that any user X of conquer complies with the terms and conditions stated above. X 6) The above copyright notice will not be tampered with in any form. X*/ X X/* Special thanks to Brian Beuning, Adam Bryant, and any others who helped X me by making enhancements and bug reports */ X X/*--------------PLEASE MODIFY DATA FILE NAMES IN misc.c--------------------*/ X X/*-------MODIFICATION IS REQUIRED OF THE FOLLOWING 2 DEFINE STATEMENTS-----*/ X#define OWNER "Ed Barlow" /*administrators name*/ X#define LOGIN "smile" /*administrators login id !!!IMPORTANT!!!*/ X /*only the administrative UID may update...*/ X X X/*-------------------MODIFICATION IS OPTIONAL ON THE FOLLOWING-------------*/ X#define VERSION "version 3.0" /* version number of the game */ X#define SYSV /*comment this line out if on a BSD machine*/ X#define PWATER 45 /*percentage of water in the world*/ X#define MAPX 48 /*Number of X Sectors on Map (divisible by 8)*/ X#define MAPY 48 /*Number of Y Sectors on Map (divisible by 8)*/ X /*MAPX and MAPY must be >= 24*/ X#define MAXNTN 28 /*number of nations (including player & npc ntns)*/ X /*but not including pirates...*/ X#define MAXPTS 40 /*points to buy stuff in beginning with*/ X#define MAXARM 50 /*maximum number of armies per nation*/ X#define MAXNAVY 16 /*maximum number of fleets per nation*/ X X/*THE FOLLOWING SHOULD BE COMMENTED OUT IF YOU DO NOT WANT THE FUNCTION*/ X/*#define HIDELOC /*defined if news is not to report sectors*/ X#define OGOD /*defined if you wish to enhance god mode*/ X /* this gives features like god passwords... */ X#define DERVDESG /*allow DERVISH to redesignate in a DESERT/ICE */ X#define LZARD /*defined if lizard npc's exist at beginning*/ X#define MONSTER /*defined if pirates/barbarians/nomads exist*/ X#define CHEAT /* npcs will cheat to keep up */ X#define STORMS /* have storms strike fleets */ X#define VULCANIZE /* add in volcano eruptions.... */ X#define PVULCAN 20 /* % chance of eruption each round (see above)*/ X/* #define ORCTAKE /* define if want orcs to takeover orc NPCS */ X#define TAKEPRICE 500000L /* price for orc takeover (see above) in jewels */ X#define PMOUNT 20 /* % of land that is mountains */ X#define PSTORM 3 /* % chance that a storm will strike a fleet */ X /* unless it is in harbor */ X#define NPC /*defined if non player country exists at beginning*/ X#define CMOVE /*Defined if you wish the computer to move X Player nations if they forget to move*/ X#define BEEP /*defined if you wish terminal to beep*/ X#define HILIGHT /*defined if your terminal supports inverse video*/ X#define RANEVENT /*defined if random events possible (not fully tested)*/ X#define NORANDEVENTS 3 /*number of random events on average turn*/ X X/*---BELOW THIS POINT ARE PARAMETERS YOU MIGHT OPTIONALLY WISH TO CHANGE---*/ X X#define LANDSEE 2 /*how far you can see on land, by armies, by navies*/ X#define NAVYSEE 1 /*making these numbers large takes CPU time*/ X#define ARMYSEE 2 X X/*Below taxation rates are in thousand dollars (US 1985) per 100 humans per X *point of whatever -- ie 1 person in veg of 9 means produce $70x9=630K X *thousand dollars */ X#define TAXFOOD 40L X#define TAXIRON 60L X#define TAXGOLD 70L X/*City and Capitol tax rates based on people only (no multipleier)*/ X#define TAXCAP 1000L X#define TAXCITY 750L X X#define SHIPMAINT 5000L /*ship mainatinance cost*/ X X#define TOMANYPEOPLE 3500L /* too many people in sector - 1/2 repro */ X /* and 1/2 production - not in cities/capitol*/ X#define TOMUCHMINED 100000L /* 100% chance of droping mine value of sector*/ X /* actual chance is prorated */ X#define DESFOOD 4 /* food value of sector to redesignate it */ X X/* min soldiers to take sector */ X#define TAKESECTOR max(75,(ntn[country].tmil/150)) X X#define FINDPERCENT 15 /* percent to find gold/iron in sector */ X#define DESCOST 5000L /*cost to redesignatie*/ X /*this is also the iron cost for cities*/ X#define FORTCOST 1000L /*cost to build a fort point*/ X#define WARSHPCOST 80000L /*cost to build one warship*/ X#define MERSHPCOST 80000L /*cost to build one merchant*/ X#define SHIPCREW 50 /* full strength crew on a ship */ X#define SHIPHOLD 300 /*number of humans a merchant can hold*/ X#define CITYLIMIT 8 /*% of ntns people in sector before => city*/ X#define CITYPERCENT 20 /* percent of npc pop able to live in cities */ X/* note that militia are not considered military below */ X#define MILRATIO 8 /* ratio civ:mil for non player countries*/ X#define MILINCAP 10 /*ratio (mil in cap):mil for NPCs*/ X#define MILINCITY 10 /* militia in city/cap = people/MILINCITY */ X#define NPCTOOFAR 15 /* npcs should not stray this far from cap */ X#define BRIBE 100000L /*amount of gold to bribe one level*/ X#define IRONORE 7 /*iron per soldier needed for +1% weapons*/ X X/*--------------------Extended command definitions--------------------------*/ X#define EXT_CMD '\033' /* ESC to start extended command */ X X/*--------------------DO NOT TO ALTER BELOW THIS LINE-----------------------*/ X X#define MAXX (MAPX / 8) /*Number of X areas on map*/ X#define MAXY (MAPY / 8) /*Number of Y areas on map*/ X#define NUMAREAS (MAXX * MAXY) /*total # areas, MAXX*MAXY*/ X#define NTOTAL (MAXNTN +4) /*MAXNTN+4*/ X#define NLIZARD (MAXNTN ) /*MAXNTN+0*/ X#define NNOMAD (MAXNTN +1) /*MAXNTN+1*/ X#define NBARBARIAN (MAXNTN +2) /*MAXNTN+2*/ X#define NPIRATE (MAXNTN +3) /*MAXNTN+3*/ END_OF_header.h if test 6342 -ne `wc -c move.c <<'END_OF_move.c' X/*conquer : Copyright (c) 1988 by Ed Barlow. X * I spent a long time writing this code & I hope that you respect this. X * I give permission to alter the code, but not to copy or redistribute X * it without my explicit permission. If you alter the code, X * please document changes and send me a copy, so all can have it. X * This code, to the best of my knowledge works well, but it is my first X * 'C' program and should be treated as such. I disclaim any X * responsibility for the codes actions (use at your own risk). I guess X * I am saying "Happy gaming", and am trying not to get sued in the process. X * Ed X */ X X X/*include files*/ X#include "header.h" X#include "data.h" X#include X Xextern FILE *fexe; X/*redraw map in this turn if redraw is a 1*/ Xextern short redraw; Xextern short selector; Xextern short pager; Xextern short xcurs,ycurs,xoffset,yoffset; Xextern short hilmode; /*highlight modes: 0=owned sectors, 1= armies, 2=none*/ X X/* nation id of owner*/ Xextern short country; Xint armornvy=AORN; /*is one if navy*/ X Xvoid Xmymove() X{ X int mveleft; X int i,j,x,y; X char carried; X int total,Tarmynum,Tnation; X int startx=0,starty=0; X int ctransport=0; /*number of civilians to transport*/ X int valid=FALSE; /*1 if move was a valid move (you must pay cost)*/ X short armynum; X int oldxcurs,oldycurs; X short nvynum; X int done=FALSE; /*done is TRUE if done with this move*/ X int capacity; X X armornvy=AORN; X clear_bottom(0); X /*get selected army or navy*/ X if((armynum=getselunit())<0) { X errormsg("ERROR: FAKE UNIT SELECTED: "); X armornvy=AORN; X return; X } X X /*navy*/ X if((armynum>=MAXARM)&&(armynum 0 ) { X int has_army; X int has_civilians; X char prompt[ 200 ]; X X has_army = solds_in_sector( XREAL, YREAL, country ) > 0; X has_civilians = (sct[XREAL][YREAL].owner == country) && X (sct[XREAL][YREAL].people > 0); X X if( !has_civilians && !has_army ) { X carried = 'n'; X } else { X strcpy( prompt, "Transport " ); X if( has_army ) X strcat( prompt, "(a)rmy, " ); X if( has_civilians ) X strcat( prompt, "(c)iv, " ); X if( has_army && has_civilians ) X strcat( prompt, "(b)oth, " ); X strcat( prompt, "(n)othing: " ); X X mvaddstr( LINES-4, 13, prompt ); X clrtoeol(); X refresh(); X carried = getch(); X } X } X else carried='n'; X X /*transport army*/ X if(carried=='a'||carried=='b'){ X mvprintw(LINES-3,0,"CAPACITY=%d ;WHAT ARMY TO XPORT?:",capacity); X clrtoeol(); X refresh(); X armynum = get_number(); X if((armynum=0) X &&(AXLOC==XREAL)&&(AYLOC==YREAL)){ X if(ASOLD>capacity){ X errormsg("ERROR: TOO MANY TROOPS"); X armornvy=AORN; X return; X } X else if(AMOVE==0){ X errormsg("SORRY: ARMY HAS NO MOVEMENT POINTS"); X armornvy=AORN; X return; X } X else capacity-=ASOLD; X } X else { X errormsg("ERROR: INVALID ARMY!"); X armornvy=AORN; X return; X } X } X /*transport civilians*/ X if(carried=='c'||carried=='b'){ X mvprintw(LINES-2,0,"CAPACITY=%d ;HOW MANY CIVILIANS XPORT?:",capacity); X clrtoeol(); X refresh(); X ctransport = get_number(); X if(ctransport>0&&ctransport<=sct[XREAL][YREAL].people&&(ctransport<=capacity)){ X startx=XREAL; X starty=YREAL; X } X else { X errormsg("NUMBER OF MEN ERROR"); X armornvy=AORN; X return; X } X } X } X /*army*/ X else { X mvprintw(LINES-4,0,"ARMY %d: ",armynum); X clrtoeol(); X if(AMOVE<=0){ X errormsg("NO MOVEMENT POINTS LEFT"); X redraw=FALSE; X armornvy=AORN; X return; X } X } X X clear_bottom(3); X standout(); X mvaddstr(LINES-2,0,"MOVEMENT SCREEN - see documentation"); X clrtoeol(); X mvaddstr(LINES-1,0,"HIT SPACE IF DONE "); X clrtoeol(); X standend(); X move(ycurs,xcurs*2); X refresh(); X X while(done==FALSE){ X valid=TRUE; X if(armornvy==NAVY) mveleft=NMOVE; X else mveleft=AMOVE; X oldxcurs=xcurs; X oldycurs=ycurs; X switch(getch()) { X case '1': X case 'b': X xcurs--; X ycurs++; X break; X case '4': X case 'h': X xcurs--; X break; X case '2': X case 'j': /*move down*/ X ycurs++; X break; X case '8': X case 'k': /*move up*/ X ycurs--; X break; X case '6': X case 'l': /*move east*/ X xcurs++; X break; X case '3': X case 'n': /*move south-east*/ X ycurs++; X xcurs++; X break; X case '9': X case 'u': /*move north-east*/ X ycurs--; X xcurs++; X break; X case '7': X case 'y': /*move north-west*/ X ycurs--; X xcurs--; X break; X case ' ': /* redraw map */ X valid=FALSE; X redraw=TRUE; X coffmap(); X /*see within one sector of unit*/ X if(hilmode==3) { X for(i=XREAL-xoffset-1;i<=XREAL-xoffset+1;i++){ X for(j=YREAL-yoffset-1;j<=YREAL-yoffset+1;j++){ X highlight(i,j); X see(i,j); X } X } X for(i=0;i0){ X standout(); X see(ntn[country].arm[i].xloc-xoffset,ntn[country].arm[i].yloc-yoffset); X } X for(i=0;i0){ X standout(); X see(ntn[country].nvy[i].xloc-xoffset,ntn[country].nvy[i].yloc-yoffset); X X } X } X else for(i=XREAL-xoffset-1;i<=XREAL-xoffset+1;i++){ X for(j=YREAL-yoffset-1;j<=YREAL-yoffset+1;j++){ X highlight(i,j); X see(i,j); X } X } X move(ycurs,xcurs*2); X refresh(); X break; X case ' ': X valid=FALSE; X done=TRUE; X break; X default: X beep(); X valid=FALSE; X } X X /*if valid move check if have enough movement points*/ X if(valid==TRUE) X if(armornvy==ARMY) { X if((movecost[XREAL][YREAL]<0) X ||(movecost[XREAL][YREAL]>mveleft)) { X beep(); X valid=FALSE; X xcurs=oldxcurs; X ycurs=oldycurs; X } else { X AMOVE-=movecost[XREAL][YREAL]; X if(AMOVE<=0) done=TRUE; X } X X } else if(armornvy==NAVY) { X if(movecost[XREAL][YREAL]>mveleft){ X beep(); X valid=FALSE; X xcurs=oldxcurs; X ycurs=oldycurs; X } else if(movecost[XREAL][YREAL] > 0){ X /* LAND OF SOME TYPE */ X if(((sct[XREAL][YREAL].designation==DCITY) X ||(sct[XREAL][YREAL].designation==DCAPITOL))){ X /* harbor */ X if(NMOVE>=4) NMOVE-=4; X else { X beep(); X valid=FALSE; X xcurs=oldxcurs; X ycurs=oldycurs; X } X } else { /* coastland */ X standout(); X mvprintw(LINES-3,0,"DO YOU WISH TO LAND SHIPS?"); X standend(); X clrtoeol(); X refresh(); X if(getch()=='y') { X move(3,0); X clrtoeol(); X if(NMOVE>=10) NMOVE=0; X else { X beep(); X valid=FALSE; X xcurs=oldxcurs; X ycurs=oldycurs; X } X } else { X move(3,0); X clrtoeol(); X valid=FALSE; X xcurs=oldxcurs; X ycurs=oldycurs; X move(ycurs,xcurs*2); X refresh(); X } X } X } else NMOVE+=movecost[XREAL][YREAL]; X X if(NMOVE<=0) done=TRUE; X X } else if(armornvy==AORN){ X errormsg("ERROR - NOT ARMY OR NAVY"); X return; X } X X /*calc enemy soldiers */ X total=0; X if(armornvy==ARMY) { X for(Tnation=0;Tnation0) X &&(ntn[Tnation].arm[Tarmynum].xloc==XREAL) X &&(ntn[Tnation].arm[Tarmynum].yloc==YREAL) X &&((ntn[country].dstatus[Tnation]>=HOSTILE) X ||(ntn[Tnation].dstatus[country]>=HOSTILE)) X &&(ntn[Tnation].arm[Tarmynum].stat!=SCOUT) X &&(ntn[Tnation].arm[Tarmynum].unittyp!=A_NINJA)) X total+=ntn[Tnation].arm[Tarmynum].sold; X } X /*naval total is number of at war WARSHIPS within one sector*/ X else { X for(Tnation=0;Tnation0) X &&(ntn[Tnation].nvy[Tarmynum].xloc<=XREAL+1) X &&(ntn[Tnation].nvy[Tarmynum].xloc>=XREAL-1) X &&(ntn[Tnation].nvy[Tarmynum].yloc<=YREAL+1) X &&(ntn[Tnation].nvy[Tarmynum].yloc>=YREAL-1) X &&(ntn[Tnation].dstatus[country]>=HOSTILE)) X total+=ntn[Tnation].nvy[Tarmynum].warships; X } X X /*if moved and not done*/ X if((valid==TRUE)&&(done==FALSE)){ X /*check if offmap and correct*/ X coffmap(); X X mvaddstr(LINES-3,0," "); X X /*scouts/ninja and rocs/griffon ignore zones of X control*/ X if((armornvy==ARMY) X &&(ASTAT!=SCOUT) X &&(ATYPE!=A_NINJA) X &&(ATYPE!=A_ROC) X &&(ATYPE!=A_GRIFFON)){ X if((sct[XREAL][YREAL].owner!=0) X &&(sct[XREAL][YREAL].owner!=country) X &&(sct[XREAL][YREAL].people>100) X &&(ntn[sct[XREAL][YREAL].owner].dstatus[country]>FRIENDLY) X &&(ntn[country].dstatus[sct[XREAL][YREAL].owner]0){ X /*stop if you have < 2* total*/ X if(ASOLD < 2 * total){ X AMOVE=0; X AADJMOV; X mvprintw(LINES-3,0,"Zone Of Control "); X beep(); X done=TRUE; X } X else mvaddstr(LINES-3,0,"SAFE -- hit return"); X } X } X else if((armornvy==NAVY)&&(total>0)){ X /*25% stop if they have > total*/ X if((ntn[country].nvy[nvynum].warships < total) X &&(rand()%4==0)){ X NMOVE=0; X NADJMOV; X mvprintw(LINES-3,0,"%d Enemy WarShips Sighted ",total); X beep(); X done=TRUE; X } X else mvaddstr(LINES-3,0,"SAFE -- hit return"); X } X X standout(); X if(armornvy==ARMY){ X mvprintw(LINES-2,0,"MOVESCREEN: move left: %d ",AMOVE); X } X else mvprintw(LINES-2,0,"MOVESCREEN: move left: %d ",NMOVE); X clrtoeol(); X X mvprintw(LINES-1,20,"move cost is %d ",abs(movecost[XREAL][YREAL])); X standend(); X move(ycurs,xcurs*2); X X /*if you just moved off map then see it*/ X if(inch()==' ') { X if(armornvy==ARMY) { X AXLOC=XREAL; X AYLOC=YREAL; X } X else if(armornvy==NAVY) { X NXLOC=XREAL; X NYLOC=YREAL; X } X makemap(); X } X else { X makeside(); X /*see within one sector of unit*/ X if(hilmode==3) { X for(i=XREAL-xoffset-1;i<=XREAL-xoffset+1;i++){ X for(j=YREAL-yoffset-1;j<=YREAL-yoffset+1;j++){ X highlight(i,j); X see(i,j); X } X } X for(i=0;i0){ X standout(); X see(ntn[country].arm[i].xloc-xoffset,ntn[country].arm[i].yloc-yoffset); X } X for(i=0;i0){ X standout(); X see(ntn[country].nvy[i].xloc-xoffset,ntn[country].nvy[i].yloc-yoffset); X X } X } X else for(i=XREAL-xoffset-1;i<=XREAL-xoffset+1;i++){ X for(j=YREAL-yoffset-1;j<=YREAL-yoffset+1;j++){ X highlight(i,j); X see(i,j); X } X } X } X move(ycurs,xcurs*2); X refresh(); X } X } X X /*at this point you are done with move*/ X /*move unit now to XREAL,YREAL*/ X selector=0; X pager=0; X mvaddstr(LINES-1,0,"DONE MOVEMENT"); X clrtoeol(); X if(armornvy==ARMY){ X AXLOC=XREAL; X AYLOC=YREAL; X AADJLOC; X AADJMOV; X /*if sector unowned take it*/ X /*first check if occupied*/ X /* if (other owner and unoccupied) or (no owner) you take*/ X if(ASOLD>=TAKESECTOR){ X if(SOWN==0){ X mvprintw(LINES-2,0,"TAKING UNOWNED SECTOR"); X SOWN=country; X SADJOWN; X AMOVE=0; X AADJMOV; X } X else if((sct[AXLOC][AYLOC].owner!=country) X &&((sct[AXLOC][AYLOC].designation==DCITY) X ||(sct[AXLOC][AYLOC].designation==DCAPITOL))){ X mvprintw(LINES-2,0,"ENTERING CITY SECTOR"); X } X else if((ASOLD > 7*total)&&(total!=0)){ X /*over run if > 7x as many*/ X mvaddstr(LINES-3,0,"OVERRAN HOSTILE ARMY "); X AMOVE=0; X AADJMOV; X x=country; X y=armynum; X for(Tnation=0;Tnation=HOSTILE) X ||(ntn[Tnation].dstatus[x]>=HOSTILE))) { X country=Tnation; X armynum=Tarmynum; X ASOLD=0; X AADJMEN; X } X country=x; X armynum=y; X if(sct[XREAL][YREAL].owner!=country){ X if((sct[XREAL][YREAL].people>0) X &&(ntn[sct[XREAL][YREAL].owner].race!=ntn[country].race)) X if(magic(country,SLAVER)==TRUE) { X flee(XREAL,YREAL,0,TRUE); X } else{ X flee(XREAL,YREAL,0,FALSE); X } X SOWN=country; X SADJOWN; X if (is_habitable(AXLOC,AYLOC)) { X sct[AXLOC][AYLOC].designation=DDEVASTATED; X SADJDES; X } X } X beep(); X } X else if((SOWN!=country) X &&((occ[XREAL][YREAL]==0) X ||(occ[XREAL][YREAL]==country)) X &&(ntn[country].dstatus[SOWN]>HOSTILE) X &&((ASTAT==ATTACK)||(ASTAT==DEFEND))) { X /*people flee if not of same race*/ X if((sct[XREAL][YREAL].people>0) X &&(ntn[sct[XREAL][YREAL].owner].race!=ntn[country].race)) X if(magic(country,SLAVER)==TRUE) { X flee(XREAL,YREAL,0,TRUE); X } else{ X flee(XREAL,YREAL,0,FALSE); X } X mvprintw(LINES-2,0,"TAKING SECTOR"); X SOWN=country; X SADJOWN; X AMOVE=0; X AADJMOV; X } X clrtoeol(); X refresh(); X } X } else if(armornvy==AORN){ X mvprintw(LINES-3,0,"ERROR"); X return; X } else { X /*else navy*/ X mvprintw(LINES-1,0,"NAVY DONE: "); X clrtoeol(); X NXLOC=XREAL; X NYLOC=YREAL; X NADJLOC; X NADJMOV; X if((carried=='a'||carried=='b') X &&(sct[XREAL][YREAL].altitude!=WATER)&&(armynum>=0) X &&(armynum=TAKESECTOR)) { X SOWN=country; X SADJOWN; X } X } X } X /*land civilians*/ X if((carried=='b'||carried=='c') X &&(sct[XREAL][YREAL].altitude!=WATER) X &&(ctransport>0)) { X if(SOWN==country) { X sct[XREAL][YREAL].people+=ctransport; X SADJCIV; X sct[startx][starty].people-=ctransport; X i=startx; X j=starty; X SADJCIV2; X } X else mvprintw(LINES-3,0,"cant move people to %d,%d as unowned",XREAL,YREAL); X } X if((carried=='a'||carried=='b'||carried=='c') X &&(sct[XREAL][YREAL].altitude==WATER)) { X mvaddstr(LINES-3,0,"You stopped in WATER, returning any transported people"); X } X } X redraw=FALSE; X makemap(); X armornvy=AORN; X} X X/*get selected army or navy: if navy, number is MAXARM+nvynum*/ Xint Xgetselunit() X{ X int number=(-1); X short armynum=0; X short nvynum=0; X int count=0; X /*current selected unit is selector/2+5*pager*/ X /*count is order of that army in sector*/ X /*armynum is number of that army*/ X for(armynum=0;armynum0)&&(AXLOC==XREAL)&&(AYLOC==YREAL)) { X if((5*pager)+(selector/2)==count) number=armynum; X count++; X } X } X X if(number==(-1)){ X for(nvynum=0;nvynum0)&&(NXLOC==XREAL)&&(NYLOC==YREAL)) { X if((5*pager)+(selector/2)==count) number=MAXARM+nvynum; X count++; X } X } X if(number>=0){ X if(number>=MAXARM) armornvy=NAVY; X else armornvy=ARMY; X } X return(number); X} END_OF_move.c if test 15082 -ne `wc -c reports.c <<'END_OF_reports.c' X/* Conquer: Copyright (c) 1988 by Edward M Barlow X * I spent a long time writing this code & I hope that you respect this. X * I give permission to alter the code, but not to copy or redistribute X * it without my explicit permission. If you alter the code, X * please document changes and send me a copy, so all can have it. X * This code, to the best of my knowledge works well, but it is my first X * 'C' program and should be treated as such. I disclaim any X * responsibility for the codes actions (use at your own risk). I guess X * I am saying "Happy gaming", and am trying not to get sued in the process. X * Ed X */ X X X/* screen subroutines */ X X/*include files*/ X#include X#include "header.h" X#include "data.h" X Xextern FILE *fexe; Xextern short country; Xextern long startgold; Xextern short xcurs,ycurs; Xextern short xoffset,yoffset; X X/*report on armies and allow changes*/ Xvoid Xarmyrpt(repnum) X int repnum; X /* 0 is for full report 'a' and 1 is for group report 'g' */ X{ X int i,j; X short army; X int men; X short oldarmy; X int done=FALSE; X int position; X int isgod=FALSE; X int count; /*number of armies on current screen */ X short armynum=0; /*current nation id */ X if(country==0) { X standout(); X isgod=TRUE; X clear(); X mvaddstr(0,0,"SUPER USER; FOR WHAT NATION NUMBER:"); X clrtoeol(); X standend(); X refresh(); X country = get_number(); X if(country<0||country>NTOTAL) return; X } X armynum=0; X /*new army screen*/ X while(done==FALSE) { X clear(); X /*Operate on any armies that you wish*/ X standout(); X mvprintw(0,(COLS/2)-20,"ARMY STATS SUMMARY FOR %s",ntn[country].name); X standend(); X /* give a army report */ X X mvaddstr(3,0,"soldiers :"); X mvaddstr(4,0,"movement :"); X mvaddstr(5,0,"x location:"); X mvaddstr(6,0,"y location:"); X mvaddstr(7,0,"status :"); X mvaddstr(8,0,"unit type :"); X mvaddstr(9,0,"cost/turn :"); X mvaddstr(10,0,"enlist :"); X X position=5; X count=0; X while((armynum0 && (!repnum || (AXLOC==XREAL && AYLOC==YREAL))) { X count++; X position+=10; X standout(); X mvprintw(2,position,"%d:",armynum); X standend(); X mvprintw(3,position,"%d",ASOLD); X mvprintw(4,position,"%d",AMOVE); X mvprintw(5,position,"%d",AXLOC); X mvprintw(6,position,"%d",AYLOC); X mvprintw(7,position,"%s",*(soldname+ASTAT)); X mvprintw(8,position,"%s",*(unittype+(ATYPE%100))); X mvprintw(9,position,"$%d",ASOLD * *(unitmaint+(ATYPE%100))); X mvprintw(10,position,"$%d",ASOLD * *(u_encost+(ATYPE%100))); X } X armynum++; X } X if(armynum>=MAXARM) done=TRUE; X X standout(); X mvaddstr(12,(COLS/2)-10,"HIT SPACE KEY IF DONE"); X mvaddstr(13,(COLS/2)-14,"HIT RETURN TO CHANGE AN ARMY"); X mvaddstr(14,(COLS/2)-14,"HIT ANY OTHER KEY TO CONTINUE"); X standend(); X refresh(); X if ((army=getch())==' ') done=TRUE; X if (army=='\n'){ X done=0; X mvaddstr(16,0,"WHAT ARMY DO YOU WANT TO CHANGE:"); X clrtoeol(); X refresh(); X armynum = get_number(); X if((armynum<0)||(armynum>MAXARM)) return; X if(ATYPE<99) X mvaddstr(18,0,"1) CHANGE STATUS, 2) TRANSFER / MERGE, 3) SPLIT ARMY, 4) DISBAND ARMY"); X else mvaddstr(18,0,"1) CHANGE STATUS, 4) DISBAND ARMY:"); X clrtoeol(); X if(isgod==TRUE) mvaddstr(20,0,"5) LOCATION, 6) SOLDIERS:"); X refresh(); X switch(getch()){ X case '1': X adjarm(armynum); X break; X case '2': X clear_bottom(0); X if(ATYPE>=MINMONSTER){ X errormsg("SORRY -- army is monster"); X break; X } X oldarmy=armynum; X mvaddstr(LINES-4,0,"TO WHAT ARMY: "); X refresh(); X armynum = get_number(); X X combinearmies(armynum,oldarmy); X break; X case '3': X splitarmy(armynum); X break; X case '4': X clear_bottom(0); X if(sct[AXLOC][AYLOC].owner!=country){ X errormsg("YOU DONT OWN SECTOR"); X break; X } X else if(ATYPE==A_MERCENARY){ X /*mercs must be payed off*/ X /*mercs do not add to local populace*/ X mvprintw(LINES-4,0,"Your mercenaries demand %ld gold to disband", X *(u_encost+(ATYPE%100)) * ASOLD); X mvprintw(LINES-3,0,"continue? (y or n)"); X refresh(); X if(getch()=='y'){ X ntn[country].tgold -= *(u_encost+(ATYPE%100)) * ASOLD; X ASOLD=0; X AADJMEN; X } X } else if(magic(country,VAMPIRE)==1){ X errormsg("VAMPIRES CANT DISBAND"); X break; X } else { X sct[AXLOC][AYLOC].people+=ASOLD; X ASOLD=0; X AADJMEN; X i=AXLOC; X j=AYLOC; X SADJCIV2; X } X break; X case '5': X if(isgod==TRUE){ X /*X LOCATION*/ X mvaddstr(21,0,"WHAT IS THE NEW X LOC: "); X refresh(); X men = get_number(); X AXLOC=men; X /*Y LOCATION*/ X mvaddstr(21,0,"WHAT IS THE NEW Y LOC: "); X refresh(); X men = get_number(); X AYLOC=men; X AADJLOC; X } X break; X case '6': X if(isgod==TRUE){ X /*SOLDIERS*/ X mvaddstr(21,0,"WHAT IS THE NEW TOTAL SOLDIERS: "); X refresh(); X men = get_number(); X ASOLD=men; X AADJMEN; X } X break; X default: X mvaddstr(21,0,"ERROR : HIT ANY CHAR TO CONTINUE"); X clrtoeol(); X refresh(); X getch(); X } X noecho(); X armynum=0; X } X } X if(isgod==TRUE) country=0; X} X Xvoid Xbudget() X{ X short armynum,nvynum; X long expship=0L,expsold=0L,nosold=0L; /*nosold = # men,exp expense */ X int isgod=FALSE; X X if(country==0) { X isgod=TRUE; X clear(); X mvaddstr(0,0,"SUPER USER; FOR WHAT NATION NUMBER:"); X clrtoeol(); X refresh(); X country = get_number(); X } X X clear(); X standout(); X mvaddstr(0,(COLS/2)-10,"NEXT YEARS BUDGET ESTIMATES"); X standend(); X X spreadsheet(country); X X for(armynum=0;armynum0) { X nosold+= ASOLD; X expsold += ASOLD * *(unitmaint+(ATYPE%100)); X } X for(nvynum=0;nvynum0) expship+=(NWAR+NMER); X X standout(); X mvprintw(5,0, "nation name is.....%s ",ntn[country].name); X mvprintw(6,0, "gold in treasury..$%8ld",ntn[country].tgold); X mvprintw(7,0, "number of sectors..%d",spread.sectors); X standend(); X if(ntn[country].tfood0) military+=ASOLD; X X standout(); X mvprintw(5,0, "nation name is ...%9s",ntn[country].name); X mvprintw(6,0, "gold in treasury..$%8ld",ntn[country].tgold); X standend(); X mvaddstr(8,0, "FOOD PRODUCTION"); X mvprintw(9,0, "granary now holds.........%8ld tons",ntn[country].tfood); X mvprintw(10,0, "%8d people in farms..%8ld tons",spread.infarm,spread.food-ntn[country].tfood); X mvprintw(12,0, "%8d civilians eat....%8d tons",spread.civilians,spread.civilians); X mvprintw(13,0, "%8d soldiers eat....%8d tons",military,military*2); X mvprintw(15,0, "TOTAL NET FOOD............%8d tons",spread.food-ntn[country].tfood-spread.civilians-military*2); X if(spread.food-spread.civilians-military*2NTOTAL) return; X } X X count=0; X for(nvynum=0;nvynum0) { X count++; X position+=10; X standout(); X mvprintw(2,position,"%d:",nvynum); X standend(); X mvprintw(3,position,"%d",NWAR); X mvprintw(4,position,"%d",NMER); X mvprintw(5,position,"%d",NXLOC); X mvprintw(6,position,"%d",NYLOC); X mvprintw(7,position,"%d",NMOVE); X } X nvynum++; X } X if(nvynum>=MAXNAVY) done=TRUE; X X standout(); X mvaddstr(12,(COLS/2)-10,"HIT SPACE KEY IF DONE"); X mvaddstr(13,(COLS/2)-14,"HIT RETURN TO CHANGE A NAVY"); X mvaddstr(14,(COLS/2)-14,"HIT ANY OTHER KEY TO CONTINUE"); X standend(); X refresh(); X if ((navy=getch())==' ') done=TRUE; X if (navy=='\n'){ X mvaddstr(16,0,"WHAT NAVY DO YOU WANT TO CHANGE:"); X clrtoeol(); X refresh(); X nvynum = get_number(); X if((nvynum<0)||(nvynum>MAXNAVY)) return; X mvaddstr(18,0,"1) TRANSFER / MERGE, 2) SPLIT NAVY, 3) DISBAND NAVY:"); X clrtoeol(); X refresh(); X switch(getch()){ X case '1': X oldx=NXLOC; X oldy=NYLOC; X oldnavy=nvynum; X mvaddstr(22,0,"TO WHAT NAVY: "); X clrtoeol(); X refresh(); X nvynum = get_number(); X if(nvynum==oldnavy) { X mvprintw(23,0,"SORRY -- SAME NAVY (%d,%d)",nvynum,oldnavy); X refresh(); X getch(); X } X else if((nvynum<0)||(nvynum>MAXNAVY)){ X mvprintw(23,0,"SORRY -- INVALID NAVY %d",nvynum); X refresh(); X getch(); X } X else if((oldx==NXLOC)&&(oldy==NYLOC)) { X NWAR+=ntn[country].nvy[oldnavy].warships; X NMER+=ntn[country].nvy[oldnavy].merchant; X NADJSHP; X if(NMOVE>ntn[country].nvy[oldnavy].smove) X NMOVE=ntn[country].nvy[oldnavy].smove; X NADJMOV; X nvynum=oldnavy; X NWAR=0; X NMER=0; X NADJSHP; X } X else { X mvaddstr(23,0,"Navies not together (hit any key) "); X refresh(); X getch(); X } X break; X case '2': X mvaddstr(21,0,"HOW MANY WARSHIPS TO SPLIT: "); X clrtoeol(); X refresh(); X wships = get_number(); X mvaddstr(21,0,"HOW MANY MERCHANTS TO SPLIT: "); X clrtoeol(); X refresh(); X mships = get_number(); X if(wships<0) wships=0; X if(mships<0) mships=0; X if((wships<=NWAR)&&(mships<=NMER)){ X NWAR-=wships; X NMER-=mships; X NADJSHP; X oldnavy=nvynum; X oldx=NXLOC; X oldy=NYLOC; X navy=(-1); X for(nvynum=0;nvynum