billr@saab.CNA.TEK.COM (Bill Randle) (06/24/89)
Submitted-by: adb@bu-it.bu.edu (Adam Bryant) Posting-number: Volume 6, Issue 92 Archive-name: conquer4/Part10 Superseeds: conquer3; Volume 4, Issue 42-49 #! /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 10 (of 14)." # Contents: main.c reports.c # Wrapped by billr@saab on Thu Jun 15 15:20:19 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'main.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'main.c'\" else echo shar: Extracting \"'main.c'\" \(29720 characters\) sed "s/^X//" >'main.c' <<'END_OF_FILE' 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#include <ctype.h> X#include <errno.h> X#include "header.h" X#include "data.h" X#include "patchlevel.h" X X#include <signal.h> X#include <pwd.h> X Xextern int armornvy; X Xchar fison[20]; Xchar *getpass(); Xstruct s_sector **sct; Xstruct s_nation ntn[NTOTAL]; /* player nation stats */ Xstruct s_world world; Xchar **occ; /*is sector occupied by an army?*/ Xshort **movecost; Xlong startgold=0; Xlong mercgot=0; X Xshort xoffset=0,yoffset=0; /*offset of upper left hand corner*/ X/* current cursor postion (relative to 00 in upper corner) */ X/* position is 2*x,y*/ Xshort xcurs=0,ycurs=0; Xshort redraw=TRUE; /* if TRUE: redraw map */ Xint done=FALSE; /* if TRUE: you are done */ Xshort hilmode=HI_OWN; /* hilight mode */ Xshort dismode=DI_DESI;/* display mode */ Xshort selector=0; /* selector (y vbl) for which army/navy... is "picked"*/ Xshort pager=0; /* pager for selector 0,1,2,3*/ Xshort country=0; /* nation id of owner*/ Xstruct s_nation *curntn; Xint owneruid; X XFILE *fexe, *fopen(); X X/************************************************************************/ X/* MAIN() - main loop for conquer */ X/************************************************************************/ Xvoid Xmain(argc,argv) Xint argc; Xchar **argv; X{ X int geteuid(), getuid(), setuid(); X register int i; X char name[NAMELTH+1],filename[80]; X void srand(),init_hasseen(); X int getopt(); X char passwd[PASSLTH+1]; X long time(); X extern char *optarg, conqmail[]; X#ifdef SYSMAIL X extern char sysmail[]; X#endif SYSMAIL X int sflag=FALSE; X X char defaultdir[256]; X struct passwd *getpwnam(); X owneruid=getuid(); X strcpy(defaultdir, DEFAULTDIR); X srand((unsigned) time((long *) 0)); X strcpy(name,""); X X /* process the command line arguments */ X while((i=getopt(argc,argv,"hn:d:s"))!=EOF) switch(i){ X /* process the command line arguments */ X case 'h': /* execute help program*/ X if (chdir(defaultdir)) { X printf("unable to change dir to %s\n",defaultdir); X exit(FAIL); X } X initscr(); X savetty(); X noecho(); X crmode(); /* cbreak mode */ X signal(SIGINT,SIG_IGN); /* disable keyboard signals */ X signal(SIGQUIT,SIG_IGN); X help(); X endwin(); X putchar('\n'); X exit(SUCCESS); X case 'd': X strcpy(defaultdir, optarg); X break; X case 'n': X strcpy(name, optarg); X break; X case 's': /*print the score*/ X sflag++; X break; X case '?': /* print out command line arguments */ X printf("Command line format: %s [-hs -d DIR -nNAT]\n",argv[0]); X printf("\t-n NAT play as nation NAT\n"); X printf("\t-h print help text\n"); X printf("\t-d DIR to use play different game\n"); X printf("\t-s print scores\n"); X exit(SUCCESS); X }; X X /* now that we have parsed the args, we can go to the X * dir where the files are kept and do some work. X */ X if (chdir(defaultdir)) { X printf("unable to change dir to %s\n",defaultdir); X exit(FAIL); X } X X readdata(); /* read data*/ X verifydata( __FILE__, __LINE__ ); /* verify data */ X X if(sflag){ X printscore(); X exit(SUCCESS); X } X X /* X * Set the real uid to the effective. This will avoid a X * number of problems involving file protection if the X * executable is setuid. X */ X if (getuid() != geteuid()) { /* we are running suid */ X (void) umask(077); /* nobody else can read files */ X (void) setuid (geteuid ()) ; X } X X /* at this stage must be a normal interactive game */ X X printf("conquer %s.%d: Copyright (c) 1988 by Edward M Barlow\n",VERSION,PATCHLEVEL); X X /* check for update in progress */ X sprintf(filename,"%sup",isonfile); X if(check_lock(filename,FALSE)==TRUE) { X printf("Conquer is updating\n"); X printf("Please try again later.\n"); X exit(FAIL); X } X X /* identify player and country represented */ X /* get nation name from command line or by asking user. X * if you fail give name of administrator of game X */ X if (strlen(name) == 0) { X printf("what nation would you like to be: "); X gets(name); X } X#ifdef OGOD X if(strcmp(name,"god")==0 || strcmp(name,"unowned")==0) { X if ( owneruid != (getpwnam(LOGIN))->pw_uid ){ X printf("sorry -- you can not login as god\n"); X printf("you need to be logged in as %s\n",LOGIN); X exit(FAIL); X } X strcpy(name,"unowned"); X hilmode = HI_NONE; X } X#else X if(strcmp(name,"god")==0) strcpy(name,"unowned"); X#endif OGOD X country=(-1); X for(i=0;i<NTOTAL;i++) X if(strcmp(name,ntn[i].name)==0) country=i; X X if(country==(-1)) { X printf("name not found\n"); X printf("\nfor rules type <conquer -h>"); X printf("\nfor more information please contact %s\n",OWNER); X return; X } else if(country==0) { X sprintf(filename,"%sadd",isonfile); X if(check_lock(filename,FALSE)==TRUE) { X printf("A new player is being added.\n"); X printf("Continue anyway? [y or n]"); X while(((i=getchar())!='y')&&(i!='n')) ; X if(i!='y') exit(FAIL); X } X } X curntn = &ntn[country]; X X /*get encrypted password*/ X strncpy(passwd,crypt(getpass("\nwhat is your nation's password:"),SALT),PASSLTH); X if((strncmp(passwd,curntn->passwd,PASSLTH)!=0) X &&(strncmp(passwd,ntn[0].passwd,PASSLTH)!=0)) { X strncpy(passwd,crypt(getpass("\nerror: reenter your nation's password:"),SALT),PASSLTH); X if((strncmp(passwd,curntn->passwd,PASSLTH)!=0) X &&(strncmp(passwd,ntn[0].passwd,PASSLTH)!=0)) { X printf("\nsorry:"); X printf("\nfor rules type <conquer -h>"); X printf("\nfor more information on the system please contact %s\n",OWNER); X exit(FAIL); X } X } X X initscr(); /* SET UP THE SCREEN */ X copyscreen(); /* copyright screen */ X /* note the getch() later - everything between X now and then is non-interactive */ X init_hasseen(); /* now we know how big the screen is, X we can init that array! */ X X /* check terminal size */ X if (COLS<80 || LINES<24) { X fprintf(stderr,"%s: terminal should be at least 80x24\n",argv[0]); X fprintf(stderr,"please try again with a different setup\n"); X beep(); X refresh(); X getch(); X bye(FALSE); X } X X strcpy(fison,"START"); /* just in case you abort early */ X crmode(); /* cbreak mode */ X X /* check if user is super-user nation[0] */ X /* else setup cursor to capitol*/ X if((country==0)||(ismonst(ntn[country].active))) { X xcurs=LINES/2; X xoffset=0; X ycurs=COLS/4; X yoffset=0; X redraw=TRUE; X /* create gods lock file but do not limit access */ X (void) aretheyon(); X } else { X if(curntn->active==INACTIVE) { X mvprintw(LINES-2,0,"Sorry, for some reason, your country no longer exists."); X mvprintw(LINES-1,0,"If there is a problem, please contact %s.",OWNER); X beep(); X refresh(); X getch(); X bye(TRUE); X } X if(aretheyon()==TRUE) { X mvprintw(LINES-2,0,"Sorry, country is already logged in."); X mvprintw(LINES-1,0,"Please try again later. "); X beep(); X refresh(); X getch(); X bye(FALSE); X } X execute(FALSE); X#ifdef TRADE X checktrade(); X#endif TRADE X if(curntn->capx>15) { X xcurs=15; X xoffset= (curntn->capx-15); X } else { X xcurs= curntn->capx; X xoffset= 0; X } X if(curntn->capy>10) { X ycurs=10; X yoffset= (curntn->capy-10); X } else { X yoffset= 0; X ycurs= curntn->capy; X } X } X updmove(curntn->race,country); X X /* open output for future printing*/ X sprintf(filename,"%s%d",exefile,country); X if ((fexe=fopen(filename,"a"))==NULL) { X beep(); X mvprintw(LINES-2,0,"error opening %s",filename); X refresh(); X getch(); X bye(TRUE); X } X X X signal(SIGINT,SIG_IGN); /* disable keyboard signals */ X signal(SIGQUIT,SIG_IGN); X signal(SIGHUP,hangup); /* must catch hangups */ X signal(SIGTERM,hangup); /* likewise for cheats!! */ X X noecho(); X prep(country,FALSE); /* initialize prep array */ X whatcansee(); /* what can they see */ X X /* initialize mail files */ X (void) sprintf(conqmail,"%s%d",msgfile,country); X#ifdef SYSMAIL X if (getenv("MAIL")==0) { X (void) sprintf(sysmail,"%s/%s",SPOOLDIR,getenv("USER")); X } else { X (void) strcpy(sysmail,getenv("MAIL")); X } X#endif SYSMAIL X X getch(); /* get response from copyscreen */ X X while(done==FALSE) { /*main while routine*/ X coffmap(); /* check if cursor is out of bounds*/ X check_mail(); /* check for new mail */ X parse(); /* get commands, make moves and input command*/ X } X X if(country==0) writedata(); X else { X fprintf(fexe,"L_NGOLD\t%d \t%d \t%ld \t0 \t0 \t%s\n", X XNAGOLD ,country,curntn->tgold,"null"); X fprintf(fexe,"L_NMETAL\t%d \t%d \t%ld \t0 \t0 \t%s\n", X XNAMETAL ,country,curntn->metals,"null"); X fprintf(fexe,"L_NJWLS\t%d \t%d \t%ld \t0 \t0 \t%s\n", X XNARGOLD ,country,curntn->jewels,"null"); X } X bye(TRUE); /* done so quit */ X} X X/************************************************************************/ X/* MAKEBOTTOM() - make the bottom of the screen */ X/************************************************************************/ Xvoid Xmakebottom() X{ X standend(); X move(LINES-4,0); X clrtoeol(); X mvprintw(LINES-3,0,"Conquer: %s.%d Turn %d",VERSION,PATCHLEVEL,TURN); X clrtoeol(); X mvaddstr(LINES-1,0," type ? for help"); X clrtoeol(); X mvaddstr(LINES-2,0," type Q to save & quit"); X clrtoeol(); X X if(country==0) { X mvaddstr(LINES-3,COLS-20,"nation...GOD"); X } else { X mvprintw(LINES-3,COLS-20,"nation...%s",curntn->name); X mvprintw(LINES-2,COLS-20,"treasury.%ld",curntn->tgold); X } X mvprintw(LINES-1,COLS-20,"%s of Year %d",PSEASON(TURN),YEAR(TURN)); X X /* mail status */ X#ifdef SYSMAIL X /* display mail information */ X if (sys_mail_status==NEW_MAIL) { X mvaddstr(LINES-3,COLS/2-6,"You have System Mail"); X } X if (conq_mail_status==NEW_MAIL) { X mvaddstr(LINES-2,COLS/2-6,"You have Conquer Mail"); X } X#else X /* display mail information */ X if (conq_mail_status==NEW_MAIL) { X mvaddstr(LINES-3,COLS/2-6,"You have Conquer Mail"); X } X#endif SYSMAIL X} X X/************************************************************************/ X/* PARSE() - do a command */ X/************************************************************************/ Xvoid Xparse() X{ X char name[20]; X char passwd[PASSLTH+1]; X int ocountry; X X switch(getch()) { X case EXT_CMD: /* extended command */ X ext_cmd( -1 ); X curntn->tgold -= MOVECOST; X break; X case '': /*redraw the screen*/ X whatcansee(); /* what can they see */ X redraw=TRUE; X break; X case 'a': /*army report*/ X redraw=TRUE; X armyrpt(0); X curntn->tgold -= MOVECOST; X break; X case '1': X case 'b': /*move south west*/ X pager=0; X selector=0; X xcurs--; X ycurs++; X break; X case 'B': /*budget*/ X redraw=TRUE; X budget(); X curntn->tgold -= MOVECOST; X break; X case 'c': /*change nation stats*/ X redraw=TRUE; X change(); X curntn->tgold -= MOVECOST; X break; X case 'C': /*construct*/ X construct(); X makebottom(); X curntn->tgold -= MOVECOST; X break; X case 'd': /*change display*/ X newdisplay(); X curntn->tgold -= MOVECOST; X break; X case 'D': /*draft*/ X draft(); X curntn->tgold -= MOVECOST; X makebottom(); X break; X case 'f': /*report on ships and load/unload*/ X redraw=TRUE; X curntn->tgold -= MOVECOST; X fleetrpt(); X break; X case 'F': /*go to next army*/ X navygoto(); X break; X case 'g': /*group report*/ X redraw=TRUE; X curntn->tgold -= MOVECOST; X armyrpt(1); X break; X case 'G': /*go to next army*/ X armygoto(); X break; X case 'H': /*scroll west*/ X pager=0; X selector=0; X xcurs-=((COLS-22)/4); X break; X case '4': X case 'h': /*move west*/ X pager=0; X selector=0; X xcurs--; X break; X case 'I': /*campaign information*/ X camp_info(); X redraw=TRUE; X break; X case 'J': /*scroll down*/ X pager=0; X selector=0; X ycurs+=((SCREEN_Y_SIZE)/2); X break; X case '2': X case 'j': /*move down*/ X pager=0; X selector=0; X ycurs++; X break; X case '8': X case 'k': /*move up*/ X pager=0; X selector=0; X ycurs--; X break; X case 'K': /*scroll up*/ X pager=0; X selector=0; X ycurs-=((SCREEN_Y_SIZE)/2); X break; X case '6': X case 'l': /*move east*/ X pager=0; X selector=0; X xcurs++; X break; X case 'L': /*scroll east*/ X pager=0; X selector=0; X xcurs+=((COLS-22)/4); X break; X case 'm': /*move selected item to new x,y */ X mymove(); X curntn->tgold -= MOVECOST; X makebottom(); X prep(country,FALSE); X pager=0; X selector=0; X break; X case 'M': /*magic*/ X redraw=TRUE; X curntn->tgold -= MOVECOST; X domagic(); X break; X case '3': X case 'n': /*move south-east*/ X pager=0; X selector=0; X ycurs++; X xcurs++; X break; X case 'N': /*read newspaper */ X redraw=TRUE; X curntn->tgold -= MOVECOST; X newspaper(); X break; X case 'p': /*pick*/ X selector+=2; X if(selector>=SCRARM*2) { X selector=0; X pager+=1; X } X /*current selected unit is selector/2+SCRARM*pager*/ X if((selector/2)+(pager*SCRARM)>=units_in_sector(XREAL,YREAL,country)) { X pager=0; X selector=0; X } X break; X case 'P': /*production*/ X redraw=TRUE; X curntn->tgold -= MOVECOST; X produce(); X break; X case 'Q': /*quit*/ X case 'q': /*quit*/ X done=TRUE; X break; X case 'r': /*redesignate*/ X redesignate(); X curntn->tgold -= MOVECOST; X makemap(); X makebottom(); X break; X /*list*/ X case 'R': /*Read Messages*/ X redraw=TRUE; X curntn->tgold -= MOVECOST; X rmessage(); X refresh(); X break; X case 's': /*score*/ X redraw=TRUE; X curntn->tgold -= MOVECOST; X showscore(); X break; X case 'S': /*diplomacy screens*/ X diploscrn(); X curntn->tgold -= MOVECOST; X redraw=TRUE; X break; X case 't': /*fleet loading*/ X loadfleet(); X curntn->tgold -= MOVECOST; X makeside(FALSE); X makebottom(); X break; X#ifdef TRADE X case 'T': /*go to commerce section*/ X trade(); X curntn->tgold -= MOVECOST; X redraw=TRUE; X break; X#endif TRADE X case '9': X case 'u': /*move north-east*/ X pager=0; X selector=0; X ycurs--; X xcurs++; X break; X case 'U': /* scroll north-east */ X pager=0; X selector=0; X xcurs+=((COLS-22)/4); X ycurs-=((SCREEN_Y_SIZE)/2); X break; X case 'v': /* version credits */ X credits(); X redraw=TRUE; X break; X case 'w': /* spell casting */ X wizardry(); X curntn->tgold -= MOVECOST; X break; X case 'W': /*message*/ X redraw=TRUE; X curntn->tgold -= MOVECOST; X wmessage(); X break; X case '7': X case 'y': /*move north-west*/ X pager=0; X selector=0; X ycurs--; X xcurs--; X break; X case 'Y': /* scroll north-west */ X pager=0; X selector=0; X xcurs-=((COLS-22)/4); X ycurs-=((SCREEN_Y_SIZE)/2); X break; X case 'Z': /*move civilians up to 2 spaces*/ X moveciv(); X curntn->tgold -= MOVECOST; X break; X case 'z': /*login as new user */ X#ifdef OGOD X if (owneruid != (getpwnam(LOGIN))->pw_uid) break; X#endif X clear(); X redraw=TRUE; X if(country != 0) { X fprintf(fexe,"L_NGOLD\t%d \t%d \t%ld \t0 \t0 \t%s\n", X XNAGOLD ,country,curntn->tgold,"null"); X fprintf(fexe,"L_NMETAL\t%d \t%d \t%ld \t0 \t0 \t%s\n", X XNAMETAL ,country,curntn->metals,"null"); X fprintf(fexe,"L_NJWLS\t%d \t%d \t%ld \t0 \t0 \t%s\n", X XNARGOLD ,country,curntn->jewels,"null"); X } else X mvaddstr(0,0,"SUPER-USER: YOUR CHANGES WILL NOT BE SAVED IF YOU DO THIS!!!"); X standout(); X mvaddstr(2,0,"change login to: "); X standend(); X refresh(); X X ocountry=country; X country=get_country(); X X /* check validity of country choice */ X if( country==(-1) || country>=NTOTAL X || ( !isactive(ntn[country].active) && country!=0 )) { X country=ocountry; X errormsg("invalid country"); X break; X } X if(country==ocountry){ X errormsg("same country"); X break; X } X X /*get password*/ X mvaddstr(2,0,"what is your nations password:"); X refresh(); X getstr(passwd); X strcpy(name,crypt(passwd,SALT)); X if((strncmp(name,curntn->passwd,PASSLTH)!=0) X &&(strncmp(name,ntn[0].passwd,PASSLTH)!=0)){ X errormsg("sorry: password invalid"); X country=ocountry; X break; X } X if(aretheyon()==TRUE) { X errormsg("sorry: country is already logged in."); X refresh(); X country=ocountry; X break; X } X X if(strcmp(fison,"START")!=0) unlink(fison); X X fclose(fexe); X /* open output for future printing*/ X sprintf(name,"%s%d",exefile,country); X if ((fexe=fopen(name,"a"))==NULL) { X beep(); X printf("error opening %s\n",name); X unlink(fison); X exit(FAIL); X } X curntn = &ntn[country]; X X printf("\n"); X readdata(); X execute(FALSE); X X (void) sprintf(conqmail,"%s%d",msgfile,country); X updmove(curntn->race,country); X /*go to that nations capitol*/ X if((country==0)||(!isntn(ntn[country].active))) { X xcurs=15; xoffset=15; X ycurs=15; yoffset=15; X } else { X if(curntn->capx>15) { X xcurs=15; X xoffset= (curntn->capx-15); X } else { X xcurs= curntn->capx; X xoffset= 0; X } X if(curntn->capy>10) { X ycurs=10; X yoffset= (curntn->capy-10); X } else { X yoffset= 0; X ycurs= curntn->capy; X } X } X whatcansee(); X redraw=TRUE; X break; X case '?': /*display help screen*/ X redraw=TRUE; X help(); X break; X default: X beep(); X } X} X X/************************************************************************/ X/* MAKESIDE() - make the right hand side display */ X/************************************************************************/ Xvoid Xmakeside(alwayssee) Xint alwayssee; /* see even if cant really see sector */ X{ X int i; X int armbonus; X int found=0,nvyfnd=0; X long enemy; X int y; X short armynum; X short nvynum; X int count; X int nfound=0,nfound2=0; X register struct s_sector *sptr = &sct[XREAL][YREAL]; X X if( !alwayssee ) X if( !canbeseen((int) XREAL,(int) YREAL) ) { X for(i=0;i<LINES-3;i++){ X move(i,COLS-21); X clrtoeol(); X } X return; X } X X for(count=0;count<LINES-13;count++){ /*clear top right hand side */ X move(count,COLS-21); X clrtoeol(); X } X X /*check for your armies*/ X count=units_in_sector(XREAL,YREAL,country); X if(pager*SCRARM>count) pager=0; X X /*first army found is #0*/ X /*show armies / navies in range pager*SCRARM to pager*SCRARM + SCRARM*/ X /*so if pager=0 show 0 to 5 (SCRARM), pager=2 show 10 to 15*/ X /*current selected unit is selector/2+4*pager*/ X X if(count>(SCRARM+(pager*SCRARM))) mvaddstr(LINES-14,COLS-20,"MORE..."); X X nfound=0; X for(armynum=0;armynum<MAXARM;armynum++){ X if((P_ASOLD>0)&&(P_AXLOC==XREAL)&&(P_AYLOC==YREAL)) { X if((nfound>=pager*SCRARM)&&(nfound<SCRARM+(pager*SCRARM))) { X /*print that army to nfound%SCRARM*/ X /* patch by rob mayoff */ X if(selector==(nfound%SCRARM)*2) { X mvaddch((nfound%SCRARM)*2,COLS-21,'*'); X standout(); X } else mvaddch((nfound%SCRARM)*2,COLS-21,'>'); X X if(P_ATYPE<MINLEADER) X mvprintw((nfound%SCRARM)*2,COLS-20,"army %d: %ld %s",armynum,P_ASOLD,*(shunittype+(P_ATYPE%UTYPE))); X else X mvprintw((nfound%SCRARM)*2,COLS-20,"%s %d: str=%d",*(unittype+(P_ATYPE%UTYPE)),armynum,P_ASOLD); X clrtoeol(); X X if(P_ASTAT >= NUMSTATUS ) X mvprintw((nfound%SCRARM)*2+1,COLS-20," member group %d",P_ASTAT-NUMSTATUS); X else X mvprintw((nfound%SCRARM)*2+1,COLS-20," mv:%d st:%s",P_AMOVE,*(soldname+P_ASTAT)); X standend(); X } X nfound++; X } X if((occ[XREAL][YREAL]!=0) X &&(occ[XREAL][YREAL]!=country) X &&((sptr->owner==country)||((P_ASOLD>0)&&(P_AXLOC<=XREAL+1) X &&(P_AXLOC>=XREAL-1)&&(P_AYLOC<=YREAL+1)&&(P_AYLOC>=YREAL-1)))) X found=1; X if((occ[XREAL][YREAL]!=0)&&(country==0)) found=1; X } X X if(nfound<SCRARM+(pager*SCRARM)) for(nvynum=0;nvynum<MAXNAVY;nvynum++){ X if(((P_NWSHP!=0)||(P_NMSHP!=0)||(P_NGSHP!=0)) X &&(P_NXLOC==XREAL)&&(P_NYLOC==YREAL)) { X if((nfound>=pager*SCRARM)&&(nfound<SCRARM+(pager*SCRARM))) { X /*print a navy*/ X if(selector==(nfound%SCRARM)*2) { X if((P_NARMY!=MAXARM)||(P_NPEOP!=0)) X mvaddch((nfound%SCRARM)*2,COLS-21,'+'); X else X mvaddch((nfound%SCRARM)*2,COLS-21,'*'); X standout(); X } else mvaddch((nfound%SCRARM)*2,COLS-21,'>'); X X mvprintw((nfound%SCRARM)*2,COLS-20,"nvy %d: mv:%hd cw:%hd",nvynum,P_NMOVE,P_NCREW); X mvprintw((nfound%SCRARM)*2+1,COLS-20,"war:%2hd mer:%2hd gal:%2hd", X P_NWAR(N_LIGHT)+P_NWAR(N_MEDIUM)+P_NWAR(N_HEAVY), X P_NMER(N_LIGHT)+P_NMER(N_MEDIUM)+P_NMER(N_HEAVY), X P_NGAL(N_LIGHT)+P_NGAL(N_MEDIUM)+P_NGAL(N_HEAVY)); X standend(); X } X nfound++; X } X if((occ[XREAL][YREAL]!=0)&&(occ[XREAL][YREAL]!=country) X &&(P_NWSHP!=0||P_NMSHP!=0||P_NGSHP!=0)&&(P_NXLOC<=XREAL+1) X &&(P_NXLOC>=XREAL-1)&&(P_NYLOC<=YREAL+1)&&(P_NYLOC>=YREAL-1)) X nvyfnd=1; X if((occ[XREAL][YREAL]!=0)&&(country==0)) nvyfnd=1; X } X X count=0; X nfound2=nfound; X if((found==1)||(nvyfnd==1)) for(i=0;i<NTOTAL;i++) { X if( !magic(i,HIDDEN) || country == 0 ){ X enemy=0; X for(armynum=0;armynum<MAXARM;armynum++){ X if((i!=country) X &&(ntn[i].arm[armynum].xloc==XREAL) X &&(ntn[i].arm[armynum].yloc==YREAL) X &&(ntn[i].arm[armynum].sold>0)){ X if(nfound2>SCRARM) nfound2=SCRARM; X if( ntn[i].arm[armynum].unittyp>=MINMONSTER ){ X mvprintw(nfound2*2+count,COLS-20,"%s: str=%d",*(unittype+(ntn[i].arm[armynum].unittyp%UTYPE)),ntn[i].arm[armynum].sold); X count++; X } else enemy += ntn[i].arm[armynum].sold; X } X } X if(enemy>0) { X if((magic(country,NINJA)==TRUE) || country == 0 ) X mvprintw(nfound2*2+count,COLS-20,"%s: %d men ",ntn[i].name,enemy); X else if(magic(i,THE_VOID)==TRUE) X mvprintw(nfound2*2+count,COLS-20,"%s: ?? men ",ntn[i].name); X else mvprintw(nfound2*2+count,COLS-20,"%s: %ld men ",ntn[i].name,(enemy*(rand()%60+70)/100)); X count++; X } X enemy=0; X for(nvynum=0;nvynum<MAXNAVY;nvynum++){ X if((i!=country) X &&(ntn[i].nvy[nvynum].xloc==XREAL) X &&(ntn[i].nvy[nvynum].yloc==YREAL) X &&(ntn[i].nvy[nvynum].warships X +ntn[i].nvy[nvynum].merchant X +(int)ntn[i].nvy[nvynum].galleys!=0)) X enemy += fltships(i,nvynum); X } X if(enemy>0) { X if((magic(country,NINJA)==TRUE) || country == 0 ) X mvprintw(nfound2*2+count,COLS-20,"%s: %d ships",ntn[i].name,enemy); X else if(magic(i,THE_VOID)==TRUE) X mvprintw(nfound2*2+count,COLS-20,"%s: ?? ships",ntn[i].name); X else mvprintw(nfound2*2+count,COLS-20,"%s: %ld ships",ntn[i].name,(enemy*(rand()%60+70)/100)); X count++; X } X } X } X X standend(); X mvprintw(LINES-13,COLS-20,"x is %d",XREAL); X clrtoeol(); X mvprintw(LINES-13,COLS-11,"y is %d",YREAL); X clrtoeol(); X X if((country!=0)&&(sptr->altitude==WATER)){ X for(y=LINES-12;y<=LINES-4;y++) { move(y,COLS-20); clrtoeol();} X mvaddstr(LINES-10,COLS-9,"WATER"); X } else { X if((country!=0)&&(country!=sptr->owner) X &&(magic(sptr->owner,THE_VOID)==TRUE)){ X for(y=LINES-11;y<=LINES-4;y++) { X move(y,COLS-20); X clrtoeol(); X } X } else { X X for(y=LINES-11;y<=LINES-10;y++) { X move(y,COLS-20); X clrtoeol(); X } X X if( sptr->designation!=DNODESIG ) standout(); X for(i=0;*(des+i)!='0';i++) X if(sptr->designation== *(des+i)){ X mvprintw(LINES-11,COLS-20,"%s",*(desname+i)); X clrtoeol(); X break; X } X standend(); X X if((sptr->owner==country)||(country==0)||(magic(country,NINJA)==TRUE)) X mvprintw(LINES-9,COLS-20,"people: %6d",sptr->people); X else X mvprintw(LINES-9,COLS-20,"people: %6d",sptr->people*(rand()%60+70)/100); X clrtoeol(); X if((sptr->owner==country) X ||(sptr->owner==0) X ||(country == 0) X ||(!isntn(ntn[sptr->owner].active))){ X /* exotic trade goods */ X if( sptr->tradegood != TG_none && tg_ok(country,sptr) ) { X standout(); X mvprintw(LINES-7,COLS-20,"item: %s",tg_name[sptr->tradegood]); X clrtoeol(); X if( *(tg_stype+sptr->tradegood) == 'x' ) X mvaddstr(LINES-7,COLS-4,"ANY"); X else X mvprintw(LINES-7,COLS-4,"(%c)",*(tg_stype+sptr->tradegood)); X standend(); X } else { X mvaddstr(LINES-7,COLS-20,"item: none"); X clrtoeol(); X } X X if( sptr->jewels != 0 && tg_ok(country,sptr)) { X standout(); X mvprintw(LINES-6,COLS-20,"gold: %2d",sptr->jewels); X standend(); X } else mvaddstr(LINES-6,COLS-20,"gold: 0"); X if( sptr->metal != 0 && tg_ok(country,sptr)) { X standout(); X mvprintw(LINES-6,COLS-10,"metal: %2d",sptr->metal); X standend(); X } else mvaddstr(LINES-6,COLS-10,"metal: 0"); X X armbonus = fort_val(sptr); X if(armbonus>0) X mvprintw(LINES-5,COLS-20,"fortress: +%d%%",armbonus); X else move(LINES-5,COLS-20); X clrtoeol(); X } X else { X for(y=LINES-7;y<=LINES-5;y++) { X move(y,COLS-20); X clrtoeol(); X } X } X } X X standout(); X if((sptr->owner==0)||(ntn[sptr->owner].active==NPC_BARBARIAN)) X mvaddstr(LINES-12,COLS-20,"unowned"); X else mvprintw(LINES-12,COLS-20,"owner: %s",ntn[sptr->owner].name); X standend(); X clrtoeol(); X X for(i=0;*(veg+i)!='0';i++) X if(sptr->vegetation==*(veg+i)) X mvprintw(LINES-11,COLS-9,"%s",*(vegname+i)); X X if(((i=tofood(sptr,country)) != 0) X &&((magic(sptr->owner,THE_VOID)!=TRUE) X ||(sptr->owner==country))){ X if(i>6) standout(); X#ifndef HPUX X if(i<10) mvprintw(LINES-11,COLS-1,"%d",i); X else mvprintw(LINES-11,COLS-2,"%d",i); X#else X if(i<10) mvprintw(LINES-11,COLS-2,"%d",i); X else mvprintw(LINES-11,COLS-3,"%d",i); X#endif HPUX X standend(); X } X X if(sptr->owner!=0) for(i=1;i<=8;i++) X if(ntn[sptr->owner].race==*(races+i)[0]){ X mvprintw(LINES-10,COLS-20,"%s",*(races+i)); X clrtoeol(); X } X X for(i=0;(*(ele+i) != '0');i++) X if( sptr->altitude == *(ele+i) ){ X mvprintw(LINES-10,COLS-9,"%s",*(elename+i)); X break; X } X } X X if(movecost[XREAL][YREAL]<0) X mvaddstr(LINES-8,COLS-20,"YOU CAN'T ENTER HERE"); X else X mvprintw(LINES-8,COLS-20,"move cost: %2d ",movecost[XREAL][YREAL]); X} X X/************************************************************************/ X/* ARETHEYON() - returns TRUE if 'country' is logged on, else FALSE */ X/************************************************************************/ Xint Xaretheyon() X{ X /* return file descriptor for lock file */ X sprintf(fison,"%s%d",isonfile,country); X return(check_lock(fison,TRUE)); X} X X/************************************************************************/ X/* COPYSCREEN() - print copyright notice to screen */ X/* THIS SUBROUTINE MAY NOT BE ALTERED, AND THE MESSAGE CONTAINED HEREIN */ X/* MUST BE SHOWN TO EACH AND EVERY PLAYER, EVERY TIME THEY LOG IN */ X/************************************************************************/ Xvoid Xcopyscreen() X{ X clear(); X standout(); X mvprintw(8,28,"Conquer %s.%d",VERSION,PATCHLEVEL); X standend(); X mvaddstr(10,19, "Copyright (c) 1988 by Edward M Barlow"); X mvaddstr(11,18,"Written Edward M Barlow and Adam Bryant"); X mvaddstr(12,26,"All Rights Reserved"); X mvaddstr(LINES-7,21,"This version is for personal use only"); X mvaddstr(LINES-5,12,"It is expressly forbidden port this software to any form of"); X mvaddstr(LINES-4,12,"Personal Computer or to redistribute this software without"); X mvaddstr(LINES-3,18,"the permission of Edward Barlow or Adam Bryant"); X mvprintw(LINES-1, 60, "PRESS ANY KEY"); X refresh(); X} X X/************************************************************************/ X/* BYE() - exit gracefully from curses */ X/************************************************************************/ Xvoid Xbye(dounlink) Xint dounlink; /* TRUE if want to do unlink */ X{ X if( dounlink ) if(strcmp(fison,"START")!=0) unlink(fison); X clear(); X refresh(); X nocrmode(); X endwin(); X if (fexe!=NULL) fclose(fexe); X printf("quit & save\n"); X exit(SUCCESS); X} X X/************************************************************************/ X/* CREDITS() - print credits notice to screen */ X/************************************************************************/ Xvoid Xcredits() X{ X clear(); X mvprintw(4,0,"Conquer %s.%d",VERSION,PATCHLEVEL); X mvaddstr(5,0,"Copyright (c) 1988 by Edward M Barlow"); X mvaddstr(6,0,"written Edward M Barlow and Adam Bryant"); X mvaddstr(12,0,"I would like to thank the following for comments,"); X mvaddstr(13,0," patches, and playtesting:"); X mvaddstr(15,0,"Derick Hirasawa Brian Rauchfuss Joe E. Powell"); X mvaddstr(16,0,"Andrew Collins Joe Nolet"); X mvaddstr(17,0,"Kenneth Moyle Brian Bresnahan"); X mvaddstr(18,0,"Paul Davison Robert Deroy"); X mvaddstr(20,0,"Also thanks to the many playtesters at Boston University"); X mvaddstr(21,0,"and at the Communications Hex"); X errormsg(""); X} X X/************************************************************************/ X/* CAMP_INFO() - display information about current data file */ X/************************************************************************/ Xvoid Xcamp_info() X{ X int mercs=0,solds=0,armynum,nvynum; X int numarm=0,numnvy=0,numlead=0; X X clear(); X standout(); X mvaddstr(2,COLS/2-16," CONQUER CAMPAIGN INFORMATION "); X mvaddstr(5,0,"World Information"); X mvaddstr(5,COLS-40,"Player Information"); X standend(); X X /* quick statistics */ X for(armynum=0;armynum<MAXARM;armynum++) { X if (P_ASOLD!=0) { X numarm++; X if (P_ATYPE<MINLEADER) { X solds+=P_ASOLD; X if (P_ATYPE==A_MERCENARY) mercs+=P_ASOLD; X } else if (P_ATYPE<MINMONSTER) { X numlead++; X } X } X } X for(nvynum=0;nvynum<MAXNAVY;nvynum++) { X if (P_NWSHP!=0||P_NGSHP!=0||P_NMSHP!=0) numnvy++; X } X X /* global information */ X mvprintw(7,0,"World Map Size............. %dx%d", MAPX, MAPY); X mvprintw(8,0,"Currently Active Nations... %d", WORLDNTN); X mvprintw(9,0,"Maximum Active Nations..... %d", NTOTAL-1); X mvprintw(10,0,"Land displacement to meet.. %d", MEETNTN); X mvprintw(11,0,"Maximum Number of Armies... %d", MAXARM); X mvprintw(12,0,"Maximum Number of Navies... %d", MAXNAVY); X mvprintw(13,0,"Chance of Scout Capture.... %d%%", PFINDSCOUT); X X /* user information */ X mvprintw(7,COLS-40,"Number of Leaders........... %d",numlead); X mvprintw(8,COLS-40,"Men Needed To Take Land..... %d",TAKESECTOR); X mvprintw(9,COLS-40,"Mercenaries in Nation....... %d",mercs); X mvprintw(10,COLS-40,"Total Soldiers in Nation.... %d",solds); X mvprintw(11,COLS-40,"Current Number of Armies.... %d",numarm); X mvprintw(12,COLS-40,"Current Number of Navies.... %d",numnvy); X X standout(); X mvaddstr(LINES-2,COLS/2-13," HIT ANY KEY TO CONTINUE"); X standend(); X refresh(); X X getch(); X} END_OF_FILE if test 29720 -ne `wc -c <'main.c'`; then echo shar: \"'main.c'\" unpacked with wrong size! fi # end of 'main.c' fi if test -f 'reports.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'reports.c'\" else echo shar: Extracting \"'reports.c'\" \(23697 characters\) sed "s/^X//" >'reports.c' <<'END_OF_FILE' 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; Xextern short redraw; X X#define RPT_LINES 11 X#define RPT_COLS 10 X#define BUF_LINES 10 X#define BUF_COLS 15 X#define MAXINROW ((COLS-BUF_COLS)/RPT_COLS) X#define MAXINSCR (((LINES-BUF_LINES)/RPT_LINES)*MAXINROW) 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 char inpkey; X int men,attset,defset,bemerc; X short oldarmy; X int done=FALSE; X int xpos,ypos; X int isgod=FALSE; X int count,count2; /*number of armies on current screen */ X short armynum=0; X X if(country==0) { X isgod=TRUE; X if (get_god()) return; X } else { X /* if not god, check there are armies to display */ X men=FALSE; X for(armynum=0;men==FALSE && armynum<MAXARM;armynum++) X if(P_ASOLD>0 && (!repnum || X (P_AXLOC==XREAL && P_AYLOC==YREAL))) X men=TRUE; X if (!men) { X redraw=FALSE; X clear_bottom(0); X errormsg("no armies to display"); X makebottom(); X return; X } X } X count2=0; X /*new army screen*/ X while(done==FALSE) { X clear(); X armynum=count2; X xpos=BUF_COLS; X ypos=2; X count=0; X while((armynum<MAXARM)&&(count<MAXINSCR)){ X if(P_ASOLD>0 && (!repnum || (P_AXLOC==XREAL && P_AYLOC==YREAL))) { X if (count%MAXINROW==0) { X /* diplay header information */ X mvaddstr(ypos+1,0,"soldiers :"); X mvaddstr(ypos+2,0,"movement :"); X mvaddstr(ypos+3,0,"x location:"); X mvaddstr(ypos+4,0,"y location:"); X mvaddstr(ypos+5,0,"status :"); X mvaddstr(ypos+6,0,"unit type :"); X mvaddstr(ypos+7,0,"cost/turn :"); X mvaddstr(ypos+8,0,"enlist :"); X } X standout(); X mvprintw(ypos,xpos,"%d:",armynum); X standend(); X mvprintw(ypos+1,xpos,"%ld",P_ASOLD); X mvprintw(ypos+2,xpos,"%d",P_AMOVE); X mvprintw(ypos+3,xpos,"%d",P_AXLOC); X mvprintw(ypos+4,xpos,"%d",P_AYLOC); X if(P_ASTAT>=NUMSTATUS) X mvprintw(ypos+5,xpos,"group %d",P_ASTAT-NUMSTATUS); X else X mvprintw(ypos+5,xpos,"%s",*(soldname+P_ASTAT)); X mvprintw(ypos+6,xpos,"%s",*(unittype+(P_ATYPE%UTYPE))); X if (P_ATYPE<MINMONSTER) X mvprintw(ypos+7,xpos,"$%ld",P_ASOLD * *(unitmaint+(P_ATYPE%UTYPE))); X else X mvprintw(ypos+7,xpos,"$%ld", 5L * *(unitmaint+(P_ATYPE%UTYPE))); X if (P_ATYPE<MINMONSTER) X mvprintw(ypos+8,xpos,"$%ld",P_ASOLD * *(u_encost+(P_ATYPE%UTYPE))); X else X mvprintw(ypos+8,xpos,"%d pts", (int)*(u_encost+(P_ATYPE%UTYPE))); X count++; X if(count<MAXINSCR && count%MAXINROW==0) { X ypos+=RPT_LINES; X xpos=BUF_COLS; X } else { X xpos+=RPT_COLS; X } X } X armynum++; X } X X /*Operate on any armies that you wish*/ X standout(); X mvprintw(0,(COLS/2)-15-strlen(curntn->name)/2,"ARMY STATS SUMMARY FOR %s",curntn->name); X X ypos+=10; X mvaddstr(ypos++,(COLS/2)-14,"HIT SPACE KEY IF DONE"); X mvaddstr(ypos++,(COLS/2)-25,"HIT RETURN TO CHANGE ANY ARMY STATISTICS"); X mvaddstr(ypos++,(COLS/2)-17,"HIT ANY OTHER KEY FOR MORE"); X standend(); X refresh(); X X ypos++; X if ((inpkey = getch())==' ') done=TRUE; X else if((inpkey=='\n')||(inpkey=='\r')) { X done=0; X mvaddstr(ypos++,0,"WHAT ARMY DO YOU WANT TO CHANGE:"); X ypos++; X clrtoeol(); X refresh(); X armynum = get_number(); X if((armynum<0)||(armynum>MAXARM)) { X continue; X } X#ifdef TRADE X if(P_ASTAT==TRADED) { X errormsg("May not change traded army"); X continue; X } X#endif TRADE X mvaddstr(ypos,0,"OPTIONS: 1) COMMAND 2) DISBAND 3) CHANGE GROUP"); X if(P_ATYPE<MINLEADER) X mvaddstr(ypos,47,"4) MERGE 5) SPLIT ARMY"); X ypos++; X clrtoeol(); X#ifdef OGOD X if(isgod==TRUE) mvaddstr(ypos++,0,"GOD OPTIONS: 6) LOCATION 7) SOLDIERS"); X clrtoeol(); X#endif OGOD X ypos++; X refresh(); X switch(getch()){ X case '1': X ext_cmd(armynum); X break; X case '4': X clear_bottom(0); X if(P_ATYPE>=MINLEADER){ X errormsg("SORRY -- army is monster"); X break; X } X oldarmy=armynum; X mvaddstr(ypos++,0,"TO WHAT ARMY: "); X refresh(); X armynum = get_number(); X X combinearmies(armynum,oldarmy); X break; X case '5': X splitarmy(armynum); X break; X case '2': /* disband army */ X clear_bottom(0); X if(P_ATYPE<MINLEADER) X mvprintw(ypos++,0,"Disband your %s army %d?",*(unittype+(P_ATYPE%UTYPE)),armynum); X else mvprintw(ypos++,0,"Disband your %s %d?",*(unittype+(P_ATYPE%UTYPE)),armynum); X refresh(); X if(getch()!='y') break; X if(sct[P_AXLOC][P_AYLOC].owner!=country && P_ATYPE!=A_SPY){ X errormsg("You don't own the sector"); X break; X } else if(P_ASTAT==ONBOARD) { X errormsg("That unit must be first be unloaded"); X break; X } else if(P_ATYPE==A_SPY) { X /*spys are given a shut up fee */ X mvprintw(LINES-4,0,"Your spy demands %ld talons to remain quiet", X *(u_encost+(P_ATYPE%UTYPE)) * 2); X mvprintw(LINES-3,0,"Pay him off? (y or n)"); X clrtoeol(); X refresh(); X if(getch()=='y'){ X /* spys do not add to population */ X curntn->tgold -= *(u_encost+(P_ATYPE%UTYPE)) * 2; X P_ASOLD=0; X AADJMEN; X } X } else if(P_ATYPE==A_MERCENARY){ X /*mercs must be payed off*/ X mvprintw(LINES-4,0,"Your mercenaries demand %ld talons to disband", X *(u_encost+(P_ATYPE%UTYPE)) * P_ASOLD); X X mvprintw(LINES-3,0,"Give them severance pay? (y or n)"); X clrtoeol(); X refresh(); X if(getch()=='y'){ X curntn->tgold -= *(u_encost+(P_ATYPE%UTYPE)) * P_ASOLD; X /*mercs do not add to local populace*/ X attset = MERCATT; X defset = MERCDEF; X bemerc = P_ASOLD; X P_ASOLD=0; X AADJMEN; X AADJDISB; X } X } else if(P_ATYPE==A_ZOMBIE){ X errormsg("Zombie units cannot disband"); X break; X } else { X if (P_ATYPE < MINLEADER) { X bemerc = (P_ASOLD*15)/100; X /*15% become mercs*/ X attset = curntn->aplus + X *(unitattack+(P_ATYPE%UTYPE)); X defset = curntn->dplus + X *(unitdefend+(P_ATYPE%UTYPE)); X P_ASOLD -= bemerc; X sct[P_AXLOC][P_AYLOC].people+=P_ASOLD; X AADJDISB; X } X P_ASOLD=0; X AADJMEN; X i=P_AXLOC; X j=P_AYLOC; X SADJCIV2; X } X break; X case '3': X addgroup(armynum); X break; X#ifdef OGOD X case '6': X if(isgod==TRUE){ X /*X LOCATION*/ X mvaddstr(ypos++,0,"What is the New X Loc: "); X refresh(); X men = get_number(); X if (men>=0 && men<MAPX) X P_AXLOC=men; X /*Y LOCATION*/ X mvaddstr(ypos++,0,"What is the New Y Loc: "); X refresh(); X men = get_number(); X if (men>=0 && men<MAPY) X P_AYLOC=men; X AADJLOC; X } X break; X case '7': X if(isgod==TRUE){ X /*SOLDIERS*/ X mvaddstr(ypos++,0,"What is the New Total Soldiers: "); X refresh(); X men = get_number(); X P_ASOLD=men; X AADJMEN; X } X break; X#endif OGOD X default: X errormsg("Invalid Input"); X } X armynum=0; X } else { X /* go to start of next page in army list */ X while(armynum<MAXARM && (P_ASOLD==0 || !(!repnum || X (P_AXLOC==XREAL && P_AYLOC==YREAL)))) armynum++; X if(armynum==MAXARM) count2=0; X else count2=armynum; X } X } X if(isgod==TRUE) reset_god(); X} X Xvoid Xbudget() X{ X short armynum,nvynum; X long numship=0L,costsold=0L,numsold=0L; X long nummonst=0L,costmonst=0L,money; X int isgod=FALSE; X X if(country==0) { X isgod=TRUE; X if (get_god()) return; X /* make budget report work for god */ X startgold=curntn->tgold; X } X X clear(); X standout(); X mvaddstr(0,(COLS/2)-15,"NEXT SEASON'S BUDGET ESTIMATES"); X standend(); X spreadsheet(country); X X for(armynum=0;armynum<MAXARM;armynum++) X if(P_ASOLD>0) { X if(P_ATYPE<MINLEADER) { X numsold += P_ASOLD; X costsold += P_ASOLD * ((long) *(unitmaint+(P_ATYPE%UTYPE))); X } else if (P_ATYPE>=MINMONSTER) { X nummonst++; X costmonst += 5L * ((long) *(unitmaint+(P_ATYPE%UTYPE))); X } X } X for(nvynum=0;nvynum<MAXNAVY;nvynum++) X if(P_NWSHP!=0||P_NMSHP!=0||P_NGSHP!=0) X numship+=flthold(nvynum); X X standout(); X mvprintw(3,0, "nation name is......%s",curntn->name); X standend(); X mvprintw(4,0, "talons in treasury.$%ld",startgold); X mvprintw(5,0, "number of sectors...%d",spread.sectors); X if(curntn->tfood<2*curntn->tciv) standout(); X mvprintw(7,0, "granary holds.....%8ld",curntn->tfood); X standend(); X mvprintw(8,0, "jewels owned......%8ld",curntn->jewels); X mvprintw(9,0, "metal ore owned...%8ld",curntn->metals); X mvprintw(3,COLS-50, "%8ld people in gold mines.%8ld",spread.ingold,spread.revjewels); X mvprintw(4,COLS-50, "%8ld people in mines......%8ld",spread.inmetal,spread.revmetal); X mvprintw(5,COLS-50, "%8ld people in farms......%8ld",spread.infarm,spread.revfood); X mvprintw(6,COLS-50,"%8ld people in cities.....%8ld",spread.incap,spread.revcap); X mvprintw(7,COLS-50,"%8ld people in towns......%8ld",spread.incity,spread.revcity); X mvprintw(8,COLS-50, "%8ld people elsewhere.....%8ld",spread.inothr,spread.revothr); X standout(); X mvprintw(9,COLS-50,"%8ld people INCOME........%8ld",spread.civilians,spread.gold - curntn->tgold); X standend(); X mvprintw(11,COLS-50,"%8ld troops...............%8ld",numsold,costsold); X mvprintw(12,COLS-50,"%8ld monsters.............%8ld",nummonst,costmonst); X X mvprintw(13,COLS-50,"%8ld ship holds @ %4d....%8ld",numship,SHIPMAINT,numship*SHIPMAINT); X mvprintw(14,COLS-50,"other expenses this turn......%8ld",startgold-curntn->tgold); X standout(); X money=costmonst+costsold+(numship*SHIPMAINT)+startgold-curntn->tgold; X mvprintw(15,COLS-50,"TOTAL EXPENSES................%8ld",money); X money=spread.gold - curntn->tgold - money; /* net income */ X standend(); X mvprintw(17,COLS-50,"NET INCOME....................%8ld",money); X mvprintw(16,COLS-50,"CHARITY.......................%8ld",max((money*curntn->charity)/100,0)); X standout(); X mvprintw(18,COLS-50,"NEXT SEASON'S TREASURY........%8ld",(startgold + money)*(100-curntn->charity)/100); X X mvaddstr(LINES-3,(COLS/2)-15,"HIT 'P' TO SEE PRODUCTION SCREEN"); X mvaddstr(LINES-2,(COLS/2)-15,"HIT 'C' FOR CHANGE NATION SCREEN"); X mvaddstr(LINES-1,(COLS/2)-14,"HIT ANY OTHER KEY TO CONTINUE"); X standend(); X refresh(); X switch( getch() ) { X case 'p': X case 'P': produce(); break; X case 'c': X case 'C': change(); break; X } X if(isgod==TRUE) reset_god(); X} X Xvoid Xproduce() X{ X FILE *fp; X short armynum; X long military=0; X long nummonst=0L,costmonst=0L; X int isgod=FALSE; X X if(country==0) { X isgod=TRUE; X if (get_god()) return; X } X fp=fopen("temp","w"); X clear(); X standout(); X mvaddstr(0,(COLS/2)-17,"NEXT SEASON'S PRODUCTION ESTIMATES"); X standend(); X X spreadsheet(country); X fprintf(fp,"LINE %d FILE %s\n",__LINE__,__FILE__); X for(armynum=0;armynum<MAXARM;armynum++) X if(P_ASOLD>0) X { X if (P_ATYPE<MINLEADER) { X military+=P_ASOLD; X } else if (P_ATYPE>=MINMONSTER) { X nummonst++; X costmonst += (long) *(unitmaint+(P_ATYPE%UTYPE)); X } X } X X standout(); X mvprintw(4,0, "nation name is....%s",curntn->name); X standend(); X mvprintw(5,0, "talons in treasury..$%ld",startgold); X mvaddstr(7,0, "FOOD PRODUCTION"); X mvprintw(9,0, "granary now holds.........%8ld tons",curntn->tfood); X mvprintw(10,0, "%8ld people in farms..%8ld tons",spread.infarm,spread.food - curntn->tfood); X fprintf(fp,"LINE %d FILE %s\n",__LINE__,__FILE__); X mvprintw(12,0, "%8ld people @ %3.1f eat.%8.0f tons",spread.civilians,P_EATRATE,P_EATRATE*(float)spread.civilians); X fprintf(fp,"LINE %d FILE %s\n",__LINE__,__FILE__); X mvprintw(13,0, "%8ld soldiers eat.....%8.0f tons",military,military*2*P_EATRATE); X military+= military+spread.civilians; /* military is amount eaten */ X fprintf(fp,"LINE %d FILE %s\n",__LINE__,__FILE__); X standout(); X mvprintw(15,0, "ESTIMATE NET FOOD.........%8.0f tons",spread.food-curntn->tfood-P_EATRATE*military); X mvprintw(16,0, "ESTIMATE FOOD SUPPLY......%8.0f tons",spread.food-P_EATRATE*military); X standend(); X fprintf(fp,"LINE %d FILE %s\n",__LINE__,__FILE__); X X mvaddstr(7,COLS/2+1, "OTHER PRODUCTION"); X mvprintw(9,COLS/2+1, "jewels owned is...............%8ld",curntn->jewels); X mvprintw(10,COLS/2+1, "%8ld people in goldmines..%8ld",spread.ingold,spread.jewels-curntn->jewels); X mvprintw(11,COLS/2+1, "%8ld monsters.............%8ld",nummonst,-costmonst); X standout(); X mvprintw(12,COLS/2+1, "ESTIMATE JEWEL SUPPLY.........%8ld",spread.jewels-costmonst); X standend(); X X mvprintw(14,COLS/2+1, "metal ore owned is............%8ld",curntn->metals); X mvprintw(15,COLS/2+1, "%8ld people in mines......%8ld",spread.inmetal,spread.metal-curntn->metals); X standout(); X mvprintw(16,COLS/2+1, "ESTIMATE METAL SUPPLY.........%8ld",spread.metal); X standend(); X X standout(); X mvaddstr(LINES-3,(COLS/2)-15,"HIT 'B' TO SEE BUDGET SCREEN"); X mvaddstr(LINES-2,(COLS/2)-17,"HIT 'C' FOR CHANGE NATION SCREEN"); X mvaddstr(LINES-1,(COLS/2)-15,"HIT ANY OTHER KEY TO CONTINUE"); X standend(); X refresh(); X switch( getch() ) { X case 'b': X case 'B': budget(); break; X case 'c': X case 'C': change(); break; X } X X if(isgod==TRUE) reset_god(); X fclose(fp); X} X X#undef RPT_LINES X#undef RPT_COLS X#undef BUF_LINES X#undef BUF_COLS X#define RPT_LINES 13 X#define RPT_COLS 11 X#define BUF_LINES 10 X#define BUF_COLS 15 Xchar *fltstr[]= {"Light", "Medium", "Heavy"}; X/*report on ships and allow changes */ Xvoid Xfleetrpt() X{ X short navy,armynum; X short newx,newy,newnavy; X short done=FALSE; X int i,j; X int xpos,ypos,crew,people; X int count,count2; /*screen number */ X short nvynum=0; /*current ship id */ X short shipsize; X int isgod=FALSE; X if(country==0) { X isgod=TRUE; X if (get_god()) return; X } X else { X /* if not god, check if there are navies to display */ X for(count=nvynum=0;count==0 && nvynum<MAXNAVY;nvynum++) X if (P_NWSHP!=0||P_NMSHP!=0||P_NGSHP!=0) count=1; X if(count==0){ X clear_bottom(0); X errormsg("no navies"); X redraw=FALSE; X makebottom(); X return; X } X } X X count2=0; X while(done==FALSE) { X clear(); X ypos=2; X xpos=BUF_COLS; X count=0; X nvynum=count2; X while((nvynum<MAXNAVY)&&(count<MAXINSCR)){ X if((P_NWSHP!=0)||(P_NMSHP!=0)||(P_NGSHP!=0)) { X X /* give a navy report */ X if (count%MAXINROW==0) { X mvaddstr(ypos+2,0, "warships :"); X mvaddstr(ypos+3,0, "merchants :"); X mvaddstr(ypos+4,0, "galleys :"); X mvaddstr(ypos+5,0, "x location:"); X mvaddstr(ypos+6,0, "y location:"); X mvaddstr(ypos+7,0, "crew/unit :"); X mvaddstr(ypos+8,0, "move left :"); X mvaddstr(ypos+9,0, "carrying :"); X mvaddstr(ypos+10,0, "civilians :"); X } X X /* give naval information */ X standout(); X mvprintw(ypos,xpos,"%d:",nvynum); X standend(); X mvprintw(ypos+1,xpos,"lt/md/hv"); X mvprintw(ypos+2,xpos,"%2hd/%2hd/%2hd",P_NWAR(N_LIGHT),P_NWAR(N_MEDIUM),P_NWAR(N_HEAVY)); X mvprintw(ypos+3,xpos,"%2hd/%2hd/%2hd",P_NMER(N_LIGHT),P_NMER(N_MEDIUM),P_NMER(N_HEAVY)); X mvprintw(ypos+4,xpos,"%2hd/%2hd/%2hd",P_NGAL(N_LIGHT),P_NGAL(N_MEDIUM),P_NGAL(N_HEAVY)); X mvprintw(ypos+5,xpos,"%d",(int)P_NXLOC); X mvprintw(ypos+6,xpos,"%d",(int)P_NYLOC); X mvprintw(ypos+7,xpos,"%d",(int)P_NCREW); X mvprintw(ypos+8,xpos,"%d",(int)P_NMOVE); X if(P_NARMY==MAXARM) X mvaddstr(ypos+9,xpos,"(none)"); X else { X armynum=P_NARMY; X if(P_ATYPE<MINLEADER) X mvprintw(ypos+9,xpos,"army %d",armynum); X else X mvprintw(ypos+9,xpos,"%s %d",*(unittype+(P_ATYPE%UTYPE)),armynum); X } X mvprintw(ypos+10,xpos,"%d",P_NPEOP*fltmhold(nvynum)); X X count++; X if(count<MAXINSCR && count%MAXINROW==0) { X ypos+=RPT_LINES; X xpos=BUF_COLS; X } else { X xpos+=RPT_COLS; X } X } X nvynum++; X } X X /*Operate on any navies that you wish*/ X standout(); X mvprintw(0,(COLS/2)-15-strlen(curntn->name)/2,"NAVY STATS SUMMARY FOR %s",curntn->name); X X ypos+=12; X mvaddstr(ypos++,(COLS/2)-14,"HIT SPACE KEY IF DONE"); X mvaddstr(ypos++,(COLS/2)-18,"HIT RETURN TO CHANGE A NAVY"); X mvaddstr(ypos++,(COLS/2)-17,"HIT ANY OTHER KEY FOR MORE"); X ypos++; X standend(); X refresh(); X X if ((navy=getch())==' ') done=TRUE; X else if ((navy=='\n')||(navy=='\r')){ X mvaddstr(ypos++,0,"WHAT NAVY DO YOU WANT TO CHANGE:"); X clrtoeol(); X refresh(); X nvynum = get_number(); X#ifdef TRADE X if (curntn->nvy[nvynum].commodity==TRADED) { X errormsg("Sorry - That Navy is up for trade"); X continue; X } X#endif TRADE X if((nvynum<0)||(nvynum>=MAXNAVY)) { X errormsg("Invalid Naval unit"); X continue; X } X mvaddstr(ypos++,0,"OPTIONS: 1) TRANSFER / MERGE, 2) SPLIT NAVY, 3) DISBAND NAVY"); X clrtoeol(); X#ifdef OGOD X if(isgod==TRUE) mvaddstr(ypos++,0,"GOD OPTIONS: 4) ADJUST SHIPS, 5) LOCATION, 6) CREW"); X ypos++; X clrtoeol(); X#endif OGOD X refresh(); X switch(getch()){ X case '1': X mvaddstr(ypos++,0,"TO WHAT NAVY: "); X clrtoeol(); X refresh(); X newnavy = get_number(); X if(newnavy<0 || newnavy>=MAXNAVY) { X errormsg("Sorry - Invalid Navy unit"); X break; X } X newx = curntn->nvy[newnavy].xloc; X newy = curntn->nvy[newnavy].yloc; X#ifdef TRADE X if (curntn->nvy[newnavy].commodity==TRADED) { X errormsg("Sorry - That Navy is up for trade"); X } else X#endif TRADE X if(nvynum==newnavy) { X errormsg("Sorry -- That is the same Navy"); X } X else if((P_NARMY!=MAXARM) X &&(curntn->nvy[newnavy].armynum!=MAXARM)) { X errormsg("Sorry -- One of the two Armies must be unloaded"); X } X else if((newx==P_NXLOC)&&(newy==P_NYLOC)) { X crew = flthold(nvynum)*P_NCREW; X people = fltmhold(nvynum)*P_NPEOP; X crew += flthold(newnavy)*curntn->nvy[newnavy].crew; X people += flthold(newnavy)*curntn->nvy[newnavy].people; X for(i=N_LIGHT;i<=N_HEAVY;i++) { X (void) addwships(newnavy,i,P_NWAR(i)); X (void) addmships(newnavy,i,P_NMER(i)); X (void) addgships(newnavy,i,P_NGAL(i)); X } X P_NCREW=0; X P_NWSHP=0; X P_NMSHP=0; X P_NGSHP=0; X if (P_NARMY!=MAXARM) { X curntn->nvy[newnavy].armynum=P_NARMY; X P_NARMY=MAXARM; X } X P_NPEOP=0; X NADJWAR; X NADJMER; X NADJGAL; X NADJCRW; X NADJHLD; X if(P_NMOVE>curntn->nvy[newnavy].smove) X curntn->nvy[newnavy].smove=P_NMOVE; X P_NMOVE=0; X NADJMOV; X nvynum=newnavy; X if (flthold(nvynum)>0) X P_NCREW=(unsigned char)(crew/flthold(nvynum)); X if (fltmhold(nvynum)>0) X P_NPEOP=(unsigned char)(people/fltmhold(nvynum)); X NADJMOV; X NADJWAR; X NADJMER; X NADJGAL; X NADJCRW; X NADJHLD; X } X else { X errormsg("Navies not together"); X } X break; X case '2': X newnavy=nvynum; X navy=(-1); X for(nvynum=0;nvynum<MAXNAVY;nvynum++) X if(((P_NWSHP==0)&&(P_NMSHP==0)&&(P_NGSHP==0)) X &&(navy==(-1))) X navy=nvynum; X if(navy==(-1)) { X errormsg("Too many Navies"); X break; X } X nvynum=newnavy; X curntn->nvy[navy].xloc=P_NXLOC; X curntn->nvy[navy].yloc=P_NYLOC; X curntn->nvy[navy].crew=P_NCREW; X curntn->nvy[navy].people=P_NPEOP; X curntn->nvy[navy].smove=P_NMOVE; X X mvaddstr(LINES-2,0,"Do you wish to separate warships from remainder of fleet?"); X refresh(); X if(getch()=='y') { X curntn->nvy[navy].warships=P_NWSHP; X P_NWSHP=0; X NADJWAR; X nvynum=navy; X P_NMSHP=0; X P_NGSHP=0; X P_NARMY=MAXARM; X P_NPEOP=0; X NADJMOV; X NADJCRW; X NADJWAR; X NADJMER; X NADJGAL; X NADJHLD; X break; X } else if(P_NARMY!=MAXARM) { X errormsg("Army must be unloaded before Navy is divided"); X break; X } X for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) { X mvprintw(ypos,0,"How Many %s Warships To Split?",fltstr[shipsize]); X clrtoeol(); X refresh(); X newnavy = get_number(); X if(newnavy>P_NWAR(shipsize)) newnavy=0; X NSUB_WAR(newnavy); X (void) addwships(navy,shipsize,newnavy); X } X for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) { X mvprintw(ypos,0,"How Many %s Merchants To Split?",fltstr[shipsize]); X clrtoeol(); X refresh(); X newnavy = get_number(); X if(newnavy>P_NMER(shipsize)) newnavy=0; X NSUB_MER(newnavy); X (void) addmships(navy,shipsize,newnavy); X } X for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) { X mvprintw(ypos,0,"How Many %s Galleys To Split?",fltstr[shipsize]); X clrtoeol(); X refresh(); X newnavy = get_number(); X if(newnavy>P_NGAL(shipsize)) newnavy=0; X NSUB_GAL(newnavy); X (void) addgships(navy,shipsize,newnavy); X } X X NADJWAR; X NADJMER; X NADJGAL; X nvynum=navy; X P_NARMY=MAXARM; X NADJMOV; X NADJCRW; X NADJWAR; X NADJMER; X NADJGAL; X NADJHLD; X break; X case '3': X /* DISBAND NAVY */ X i=P_NXLOC; X j=P_NYLOC; X if(sct[i][j].altitude == WATER && isgod==FALSE) { X errormsg("Ships need to be on land or in harbor"); X break; X } X if(sct[i][j].owner != country && isgod==FALSE) { X errormsg("You don't own the land"); X break; X } X sct[i][j].people+=P_NCREW*flthold(nvynum); X sct[i][j].people+=P_NPEOP*fltmhold(nvynum); X if(P_NARMY!=MAXARM) { X armynum=P_NARMY; X P_NARMY=MAXARM; X P_ASTAT=DEFEND; X AADJSTAT; X } X P_NWSHP=0; X P_NMSHP=0; X P_NGSHP=0; X P_NCREW=0; X P_NPEOP=0; X SADJCIV2; X NADJCRW; X NADJWAR; X NADJGAL; X NADJMER; X NADJHLD; X break; X#ifdef OGOD X case '4': X if (isgod==TRUE) { X /* ADJUST SHIPS */ X P_NWSHP=0; X P_NMSHP=0; X P_NGSHP=0; X for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) { X mvprintw(ypos,0,"How Many %s Warships?",fltstr[shipsize]); X clrtoeol(); X refresh(); X newnavy = get_number(); X if(newnavy>N_MASK) newnavy=0; X (void) NADD_WAR(newnavy); X } X for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) { X mvprintw(ypos,0,"How Many %s Merchants?",fltstr[shipsize]); X clrtoeol(); X refresh(); X newnavy = get_number(); X if(newnavy>N_MASK) newnavy=0; X (void) NADD_MER(newnavy); X } X for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) { X mvprintw(ypos,0,"How Many %s Galleys?",fltstr[shipsize]); X clrtoeol(); X refresh(); X newnavy = get_number(); X if(newnavy>N_MASK) newnavy=0; X (void) NADD_GAL(newnavy); X } X NADJWAR; X NADJMER; X NADJGAL; X } X break; X case '5': X if (isgod==TRUE) { X /*X LOCATION*/ X mvaddstr(ypos++,0,"What Is The New X Loc: "); X refresh(); X crew = get_number(); X if (crew>=0 && crew<MAPX) X P_NXLOC=crew; X /*Y LOCATION*/ X mvaddstr(ypos,0,"What Is The New Y Loc: "); X clrtoeol(); X refresh(); X crew = get_number(); X if (crew>=0 && crew<MAPY) X P_NYLOC=crew; X NADJLOC; X } X break; X case '6': X if (isgod==TRUE) { X /* ADJUST CREWSIZE */ X mvaddstr(ypos,0,"What value for crew/ship unit: "); X refresh(); X crew = get_number(); X if (crew>=0 && crew<=SHIPCREW) X P_NCREW = crew; X NADJCRW; X } X break; X#endif OGOD X default: X errormsg("Invalid Input"); X } X noecho(); X nvynum=0; X } else { X /* go to start of next page in navy list */ X while((nvynum<MAXNAVY) X &&((P_NWSHP==0)&&(P_NMSHP==0)&&(P_NGSHP==0))) X nvynum++; X if(nvynum==MAXNAVY) count2=0; X else count2=nvynum; X } X } X if(isgod==TRUE) reset_god(); X} END_OF_FILE if test 23697 -ne `wc -c <'reports.c'`; then echo shar: \"'reports.c'\" unpacked with wrong size! fi # end of 'reports.c' fi echo shar: End of archive 10 \(of 14\). cp /dev/null ark10isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 14 archives. rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0