games@tekred.TEK.COM (06/17/88)
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 <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 7 (of 8)." # Contents: forms.c getopt.c header.h move.c reports.c # Wrapped by billr@saab on Thu Jun 16 09:40:02 1988 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f forms.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"forms.c\" else echo shar: Extracting \"forms.c\" \(14869 characters\) sed "s/^X//" >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 <ctype.h> 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<MAXNTN)) { X clear(); X standout(); X mvaddstr(0,(COLS/2)-10,"NATION SCORE SCREEN"); X standend(); X mvaddstr(3,0,"nationid is:"); X mvaddstr(4,0,"name is:"); X mvaddstr(5,0,"leader:"); X mvaddstr(6,0,"race:"); X mvaddstr(7,0,"class:"); X mvaddstr(8,0,"score:"); X mvaddstr(9,0,"gold:"); X mvaddstr(10,0,"military:"); X mvaddstr(11,0,"civilians:"); X mvaddstr(12,0,"sectors:"); X X count=0; X position=2; X while((nationid<MAXNTN)&&(count<5)){ X if((nationid<MAXNTN)&&(ntn[nationid].active!=0)) { X position+=13; X mvprintw(3,position,"%d",nationid); X standout(); X mvprintw(4,position,"%s",ntn[nationid].name); X standend(); X mvprintw(5,position,"%s",ntn[nationid].leader); X for(i=1;i<8;i++) X if(ntn[nationid].race==*(races+i)[0]) X mvprintw(6,position,"%s",*(races+i)); X if(ntn[nationid].active>=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;i<NTOTAL;i++) if((ntn[i].active>0)&&(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]<WAR)) X ||(ntn[country].dstatus[nation]==JIHAD))) { X mvprintw(23,0,"SORRY, Can't change status on ntn %s -- hit return",ntn[nation].name); X refresh(); X getch(); X return; X } X else{ X clear(); X mvaddstr(0,0,"WHAT NEW STATUS"); X mvaddstr(2,0,"1) CONFEDERACY (irrevocable)"); X mvaddstr(3,0,"2) ALLIED"); X mvaddstr(4,0,"3) FRIENDLY"); X mvaddstr(5,0,"4) NEUTRAL"); X mvaddstr(6,0,"5) HOSTILE"); X mvaddstr(7,0,"6) WAR"); X mvaddstr(8,0,"7) JIHAD (irrevocable):"); X mvaddstr(12,0,"INPUT:"); X refresh(); X temp = get_number(); X if((temp<1)||(temp>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]<WAR)) { X olddip=ntn[nation].dstatus[country]; X oldnat=country; X country=nation; X nation=oldnat; X ntn[country].dstatus[nation]=WAR; X EADJDIP; X ntn[country].dstatus[nation]=olddip; X oldnat=country; X country=nation; X nation=oldnat; X } X else if((temp>HOSTILE)&&(ntn[nation].active==1) X &&(ntn[nation].dstatus[country]<WAR)) { X sprintf(tempifile,"%s%d",msgfile,nation); X if ((fp=fopen(tempifile,"a+"))==NULL) { X mvprintw(4,0,"error opening %s",tempifile); X refresh(); X if (isgod==TRUE) country=0; X getch(); X return; X } X fprintf(fp,"%s Message to %s from CONQUER\n",ntn[nation].name,ntn[nation].name); X fprintf(fp,"%s \n",ntn[nation].name); X fprintf(fp,"%s \n",ntn[nation].name); X fprintf(fp,"%s %s has declared war on you\n",ntn[nation].name,ntn[country].name); X fputs("END\n",fp); X fclose(fp); X } X } X } X} X Xvoid Xchange() X{ X char string[10]; X int i, cbonus; X short armynum; X char passwd[8]; X short isgod=FALSE; X X if(country==0) { X isgod=TRUE; X clear(); X mvaddstr(0,0,"SUPER USER; FOR WHAT NATION NUMBER:"); X refresh(); X country = get_number(); X } X clear(); X mvaddstr(0,(COLS/2)-10,"NATION STATS SUMMARY"); X mvprintw(5,0,"1. nation name is %s ",ntn[country].name); X mvprintw(6,0,"2. password is XXXXXXXX"); X if (isgod==TRUE) X mvprintw(7,0,"active is %d",ntn[country].active); X mvprintw(11,0,"capitol loc: x is %d",ntn[country].capx); X mvprintw(12,0," y is %d",ntn[country].capy); X mvprintw(13,0,"leader is %s",ntn[country].leader); X mvprintw(14,0,"class is %s",*(Class+ntn[country].class)); X mvprintw(15,0,"nations mark is...%c ",ntn[country].mark); X for(i=1;i<8;i++) if(ntn[country].race==*(races+i)[0]) X mvprintw(16,0, "nation race is....%s ",*(races+i)); X mvprintw(17,0,"score currently...%ld",ntn[country].score); X X mvprintw(4,(COLS/2), "attack bonus...........+%2d",ntn[country].aplus); X mvprintw(5,(COLS/2), "defense bonus..........+%2d",ntn[country].dplus); X mvprintw(6,(COLS/2), "maximum move rate.......%2d",ntn[country].maxmove); X mvprintw(7,(COLS/2), "reproduction rate......%2d%%",ntn[country].repro); X mvprintw(9,(COLS/2), "gold talons.....$%8ld",ntn[country].tgold); X mvprintw(10,(COLS/2),"jewels .........$%8ld",ntn[country].jewels); X mvprintw(11,(COLS/2),"iron & minerals...%8ld",ntn[country].tiron); X if(ntn[country].tfood<2*ntn[country].tciv) standout(); X mvprintw(12,(COLS/2),"food in granary...%8ld",ntn[country].tfood); X standend(); X X mvprintw(13,(COLS/2),"total soldiers....%8ld",ntn[country].tmil); X mvprintw(14,(COLS/2),"total civilians...%8ld",ntn[country].tciv); X mvprintw(15,(COLS/2),"total ships..........%5d",ntn[country].tships); X mvprintw(16,(COLS/2),"total sectors........%5d",ntn[country].tsctrs); X mvprintw(17,(COLS/2),"spell points.........%5d",ntn[country].spellpts); X X standout(); X mvaddstr(19,(COLS/2)-9, "HIT ANY KEY TO CONTINUE"); X mvaddstr(20,(COLS/2)-15,"HIT 1 or 2 TO CHANGE NAME or PASSWD"); X if(magic(country,VAMPIRE)!=1) X mvaddstr(21,(COLS/2)-14,"HIT 3 TO ADD TO YOUR COMBAT BONUS"); X else mvaddstr(21,(COLS/2)-17,"( VAMPIRES MAY NOT ADD TO COMBAT BONUS )"); X if(isgod==TRUE) mvaddstr(22,(COLS/2)-9,"HIT 4 TO DESTROY NATION"); X X standend(); X refresh(); X switch(getch()){ X case '1': /*get name*/ X clear(); X mvaddstr(0,0,"what name would you like:"); X clrtoeol(); X refresh(); X get_nname(string); X if((strlen(string)<=1)||(strlen(string)>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;armynum<MAXARM;armynum++) if(ASOLD>0) 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;armynum<MAXARM;armynum++) if(ASOLD>0) 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 <forms.c`; then echo shar: \"forms.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f getopt.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"getopt.c\" else echo shar: Extracting \"getopt.c\" \(2223 characters\) sed "s/^X//" >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 <stdio.h> 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 <getopt.c`; then echo shar: \"getopt.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f header.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"header.h\" else echo shar: Extracting \"header.h\" \(6342 characters\) sed "s/^X//" >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 <header.h`; then echo shar: \"header.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f move.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"move.c\" else echo shar: Extracting \"move.c\" \(15082 characters\) sed "s/^X//" >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 <ctype.h> 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<MAXARM+MAXNAVY)) { X nvynum=armynum-MAXARM; X armynum=(-1); X mvprintw(LINES-4,0,"NAVY %d: ",nvynum); X standend(); X clrtoeol(); X capacity=NMER*SHIPHOLD; X if((NMOVE<=0)) { X errormsg("NO MOVE POINTS LEFT"); X armornvy=AORN; X return; X } X if( capacity > 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<MAXARM)&&(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;i<MAXARM;i++) if(ntn[country].arm[i].sold>0){ X standout(); X see(ntn[country].arm[i].xloc-xoffset,ntn[country].arm[i].yloc-yoffset); X } X for(i=0;i<MAXNAVY;i++) if(ntn[country].nvy[i].merchant+ntn[country].nvy[i].warships>0){ 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;Tnation<NTOTAL;Tnation++) X if(Tnation!=country) X for(Tarmynum=0;Tarmynum<MAXARM;Tarmynum++) X if((ntn[Tnation].arm[Tarmynum].sold>0) 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;Tnation<NTOTAL;Tnation++) X if(Tnation!=country) X for(Tarmynum=0;Tarmynum<MAXNAVY;Tarmynum++) X if((ntn[Tnation].nvy[Tarmynum].warships>0) 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]<WAR)){ X /*if other owner (with civilians) and not hostile then stop*/ X beep(); X mvaddstr(LINES-3,0,"HALT! YOU MAY NOT PASS HERE!"); X clrtoeol(); X refresh(); X AMOVE=0; X AADJMOV; X done=TRUE; X } X else if(total>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;i<MAXARM;i++) if(ntn[country].arm[i].sold>0){ X standout(); X see(ntn[country].arm[i].xloc-xoffset,ntn[country].arm[i].yloc-yoffset); X } X for(i=0;i<MAXNAVY;i++) if(ntn[country].nvy[i].merchant+ntn[country].nvy[i].warships>0){ 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<MAXNTN;Tnation++) X if(Tnation!=x) X for(Tarmynum=0;Tarmynum<MAXARM;Tarmynum++) X if((ntn[Tnation].arm[Tarmynum].xloc==XREAL) X &&(ntn[Tnation].arm[Tarmynum].yloc==YREAL) X &&((ntn[x].dstatus[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<MAXARM)) { X if((SOWN!=0)&&(SOWN!=country)&&(ATYPE!=A_MARINES)){ X mvprintw(LINES-2,0,"SECTOR OWNED - CANT LAND"); X refresh(); X sleep(1); X } else { X AXLOC=XREAL; X AYLOC=YREAL; X AADJLOC; X AMOVE=0; X AADJMOV; X /*take unowned land*/ X if((SOWN==0)&&(ASOLD>=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;armynum<MAXARM;armynum++){ X if((ASOLD>0)&&(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;nvynum<MAXNAVY;nvynum++) X if((NMER+NWAR>0)&&(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 <move.c`; then echo shar: \"move.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f reports.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"reports.c\" else echo shar: Extracting \"reports.c\" \(13951 characters\) sed "s/^X//" >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 <ctype.h> 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((armynum<MAXARM)&&(count!=6)){ X if(ASOLD>0 && (!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;armynum<MAXARM;armynum++) if(ASOLD>0) { X nosold+= ASOLD; X expsold += ASOLD * *(unitmaint+(ATYPE%100)); X } X for(nvynum=0;nvynum<MAXNAVY;nvynum++) X if(NWAR+NMER>0) 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].tfood<ntn[country].tciv) standout(); X mvprintw(9,0, "granary holds ....%8ld",ntn[country].tfood); X standend(); X mvprintw(10,0, "jewels owned is...%8ld",ntn[country].jewels); X mvprintw(11,0, "iron ore owned is.%8ld",ntn[country].tiron); X mvprintw(7,30, "%8d people in gold mines:%8ld",spread.ingold,spread.revjewels); X mvprintw(8,30, "%8d people in iron mines:%8ld",spread.iniron,spread.reviron); X mvprintw(9,30, "%8d people in farms: %8ld",spread.infarm,spread.revfood); X mvprintw(10,30,"%8d people in capitol: %8ld",spread.incap,spread.revcap); X mvprintw(11,30,"%8d people in towns: %8ld",spread.incity,spread.revcity); X standout(); X mvprintw(12,30,"%8ld people TOTAL INCOME: %8ld",spread.civilians,spread.gold - ntn[country].tgold); X standend(); X X if(magic(country,VAMPIRE)==1) expsold/=4; X mvprintw(14,30,"%8d troops: %8ld",nosold,expsold); X X mvprintw(15,30,"%8d ships at %5d each: %8ld",expship,SHIPMAINT,expship*SHIPMAINT); X mvprintw(16,30,"other expenses this turn: %8ld",startgold-ntn[country].tgold); X standout(); X mvprintw(17,30,"TOTAL EXPENSES: %8ld",expsold+(expship*SHIPMAINT)+startgold-ntn[country].tgold); X mvprintw(18,30,"NET INCOME: %8ld",spread.gold-expsold-(expship*SHIPMAINT)-startgold); X X mvaddstr(20,(COLS/2)-13,"HIT 'P' TO SEE PRODUCTION STATS"); X mvaddstr(21,(COLS/2)-12,"HIT ANY OTHER KEY TO CONTINUE"); X standend(); X refresh(); X if(getch()=='P'){ X produce(); X } X if(isgod==TRUE) country=0; X} X Xvoid Xproduce() X{ X short armynum; X int military=0; 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 clear(); X standout(); X mvaddstr(0,(COLS/2)-12,"NEXT YEARS PRODUCTION ESTIMATES"); X standend(); X X spreadsheet(country); X for(armynum=0;armynum<MAXARM;armynum++) if(ASOLD>0) 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*2<FOODTHRESH*(100+ntn[country].repro)*spread.civilians/100){ X mvprintw(16,0, "TOTAL NEXT YEARS FOOD.....%8ld tons",spread.food-spread.civilians-military*2); X } X else{ X mvprintw(16,0, "TOTAL NEXT YEARS FOOD.....%8ld tons",FOODTHRESH*(100+ntn[country].repro)*spread.civilians/100); X mvprintw(17,0, "REVENUE FROM EXCESS.......%8ld gold",spread.food-spread.civilians-military*2-FOODTHRESH*(100+ntn[country].repro)*spread.civilians/100); X } X X mvaddstr(8,41, "OTHER PRODUCTION"); X mvprintw(10,41, "jewels owned is...............%8ld",ntn[country].jewels); X mvprintw(11,41, "%8d people in goldmines :%8ld",spread.ingold,spread.jewels-ntn[country].jewels); X mvprintw(12,41, "ESTIMATE NEXT YEARS JEWELS %8ld",spread.jewels); X mvprintw(14,41, "iron ore owned is.............%8ld",ntn[country].tiron); X mvprintw(15,41, "%8d people in iron mines:%8ld",spread.iniron,spread.iron-ntn[country].tiron); X mvprintw(16,41, "ESTIMATE NEXT YEARS IRON %8ld",spread.iron); X X standout(); X mvaddstr(20,(COLS/2)-12,"HIT 'B' TO SEE BUDGET SCREEN"); X mvaddstr(21,(COLS/2)-12,"HIT ANY OTHER KEY TO CONTINUE"); X standend(); X refresh(); X if(getch()=='B'){ X budget(); X } X X if(isgod==TRUE) country=0; X} X X/*report on ships and allow changes */ Xvoid Xfleetrpt() X{ X short navy; X short oldx,oldy,oldnavy; X short done=FALSE; X int position; X int count; /*screen number */ X short nvynum=0; /*current ship id */ X short wships,mships; X int isgod=FALSE; 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 X count=0; X for(nvynum=0;nvynum<MAXNAVY;nvynum++) count+=NWAR+NMER; X if(count==0){ X clear(); X standout(); X mvaddstr(5,(COLS/2)-6, "NO NAVIES "); X mvaddstr(15,(COLS/2)-14,"HIT ANY KEY TO CONTINUE"); X standend(); X done=TRUE; X refresh(); X if(isgod==TRUE) country=0; X return; X } X nvynum=0; X while(done==FALSE) { X clear(); X /*Operate on any navies that you wish*/ X standout(); X mvprintw(0,(COLS/2)-20,"NAVY STATS SUMMARY FOR %s",ntn[country].name); X standend(); X /* give a navy report */ X X mvaddstr(3,0, "warships :"); X mvaddstr(4,0, "merchant :"); X mvaddstr(5,0, "x location:"); X mvaddstr(6,0, "y location:"); X mvaddstr(7,0,"move left :"); X X position=5; X count=0; X while((nvynum<MAXNAVY)&&(count!=6)){ X if((NWAR+NMER)>0) { 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<MAXNAVY;nvynum++) X if((NWAR+NMER==0)&&(navy==(-1))) X navy=nvynum; X nvynum=navy; X /*overflow*/ X if(nvynum==(-1)) { X mvaddstr(23,0,"TOO MANY NAVIES: "); X nvynum=oldnavy; X NWAR+=wships; X NMER+=mships; X NADJSHP; X } X else { X NMOVE=ntn[country].nvy[oldnavy].smove; X NXLOC=oldx; X NYLOC=oldy; X NWAR=wships; X NMER=mships; X NADJSHP; X NADJLOC; X NADJMOV; X } X } X else { X mvaddstr(23,0,"TOO MANY SHIPS: "); X refresh(); X getch(); X } X break; X case '3': X NWAR=0; X NMER=0; X NADJSHP; X break; X default: X mvaddstr(21,0,"ERROR : HIT ANY CHAR TO CONTINUE"); X clrtoeol(); X refresh(); X getch(); X } X noecho(); X nvynum=0; X } X } X if(isgod==TRUE) country=0; X} END_OF_reports.c if test 13951 -ne `wc -c <reports.c`; then echo shar: \"reports.c\" unpacked with wrong size! fi # end of overwriting check fi echo shar: End of archive 7 \(of 8\). cp /dev/null ark7isdone MISSING="" for I in 1 2 3 4 5 6 7 8 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 8 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0