games-request@tekred.TEK.COM (01/23/88)
Submitted by: ihnp4!mhuxd!smile (Ed Barlow)
Comp.sources.games: Volume 3, Issue 73
Archive-name: conquer/Part04
#! /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 4 (of 6)."
# Contents: combat.c forms.c move.c
# Wrapped by billr@tekred on Fri Jan 22 13:27:09 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f combat.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"combat.c\"
else
echo shar: Extracting \"combat.c\" \(18772 characters\)
sed "s/^X//" >combat.c <<'END_OF_combat.c'
X/*conquer is copyrighted 1986 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#include "header.h"
X#include "data.h"
X
X#define ATKR 2
X#define DFND 1
X
Xextern FILE *fnews;
Xextern short country;
X
Xint unit[32]; /*armynum*/
Xint owner[32]; /*owner*/
Xint side[32]; /*see definitions->1=units 2=unit*/
Xint anation; /*nation attacking in this fight*/
Xint dnation; /*one nation defending in this fight*/
X
X/*RESOLVE COMBAT RESULTS */
X/*attacker wants a high roll and defender wants low roll on both dice*/
X/* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9*/
X
Xint Cbt6_1[]={
X 20,20,20,20,20,15,10,10,10,10,5,5,5,5,5,0,0,0,0,0,0
X};
Xint Cbt5_1[]={
X 40,30,20,20,20,20,20,20,10,10,10,10,5,5,5,0,0,0,0,0,0
X};
Xint Cbt4_1[]={
X 50,40,30,30,30,20,20,20,20,10,10,10,10,5,5,5,0,0,0,0,0
X};
Xint Cbt3_1[]={
X 60,50,40,30,30,30,20,20,20,20,10,10,10,10,5,5,5,0,0,0,0
X};
Xint Cbt2_1[]={
X 70,50,40,40,40,40,30,30,20,20,20,20,10,10,10,10,10,5,5,5,0
X};
Xint Cbt3_2[]={
X 80,60,40,40,40,40,30,30,30,30,20,20,20,20,20,20,20,10,10,10,0
X};
Xint Cbt5_4[]={
X 90,60,50,50,50,50,40,40,30,30,30,30,30,30,30,30,30,20,10,10,10
X};
Xint Cbt1_1[]={
X 100,90,60,60,60,60,50,50,40,40,40,40,30,30,30,30,20,20,20,10,10
X};
Xint Cbt4_5[]={
X 100,90,80,70,70,70,60,60,50,50,50,50,40,40,40,40,40,30,20,20,10
X};
Xint Cbt2_3[]={
X 110,90,80,80,70,70,60,60,50,50,50,50,40,40,40,40,40,40,30,20,10
X};
Xint Cbt1_2[]={
X 110,100,100,90,80,80,80,80,70,60,60,60,50,50,50,50,50,40,30,30,10
X};
Xint Cbt1_3[]={
X 120,110,110,100,90,90,90,90,80,80,70,70,70,70,60,50,50,40,30,30,20
X};
Xint Cbt1_4[]={
X 120,110,100,100,90,90,90,90,80,80,70,70,70,70,60,50,50,40,30,30,20
X};
Xint Cbt1_5[]={
X 130,110,110,100,100,90,90,90,80,80,70,70,70,70,60,50,50,40,40,30,20
X};
Xint Cbt1_6[]={
X 130,120,110,110,110,100,100,90,90,90,80,80,80,70,70,50,50,40,40,40,40
X};
X
X/*run all combat on map
X * procedure is to find each sector with armies in attack mode and
X * then search around them
X */
Xcombat()
X{
X register int i,j;
X /*if fought is 1 then do not fight a second battle in sector*/
X short fought[MAPX][MAPY];
X int temp;
X short armynum,nvynum;
X int valid;
X int count=0;
X
X printf("RUN COMBAT SUBROUTINES");
X fprintf(fnews,"4\tBATTLE SUMMARY STATISTICS\n");
X /*for each nation, if in attack mode run a check*/
X
X for(i=0;i<MAPX;i++) for(j=0;j<MAPY;j++) fought[i][j]=0;
X
X for(anation=0;anation<NTOTAL;anation++) if(ntn[anation].active>0) {
X
X /*army combat*/
X for(j=0;j<MAXARM;j++) if((ntn[anation].arm[j].stat==ATTACK)
X &&(ntn[anation].arm[j].sold>0)
X &&(fought[ntn[anation].arm[j].xloc][ntn[anation].arm[j].yloc]==0)){
X
X fought[ntn[anation].arm[j].xloc][ntn[anation].arm[j].yloc]=1;
X /*initialize matrix*/
X for(temp=0;temp<32;temp++){
X unit[temp]=(-1);
X owner[temp]=(-1);
X side[temp]=(-1);
X }
X
X /*check all armies in area and add to matrix*/
X count=0;
X valid=0;
X /*is valid,set matrix*/
X for(country=0;country<NTOTAL;country++)
X if(ntn[country].active!=0)
X for(armynum=0;armynum<MAXARM;armynum++)
X if((ASOLD>0)
X &&(ASTAT!=SCOUT)
X &&(AXLOC==ntn[anation].arm[j].xloc)
X &&(AYLOC==ntn[anation].arm[j].yloc)
X &&(count<32)) {
X
X if((country!=anation)
X &&(ntn[anation].dstatus[country]>HOSTILE)) {
X valid=1;
X dnation=country;
X }
X unit[count]=armynum;
X owner[count]=country;
X count++;
X }
X
X if(valid==1) fight();
X }
X
X /*navy combat*/
X for(j=0;j<MAXNAVY;j++)
X if((ntn[anation].nvy[j].warships>0)
X&&(fought[ntn[anation].nvy[j].xloc][ntn[anation].nvy[j].yloc]==0)
X&&(sct[ntn[anation].arm[j].xloc][ntn[anation].arm[j].yloc].altitude==WATER)){
X
X fought[ntn[anation].nvy[j].xloc][ntn[anation].nvy[j].yloc]=1;
X
X /*initialize matrix*/
X for(temp=0;temp<32;temp++){
X unit[temp]=(-1);
X owner[temp]=(-1);
X side[temp]=(-1);
X }
X
X /*check all fleets in 1 sector range and add to matrix*/
X count=0;
X valid=0;
X /*is valid,set matrix*/
X for(country=0;country<NTOTAL;country++)
X if(ntn[country].active!=0)
X for(nvynum=0;nvynum<MAXNAVY;nvynum++)
X if((NWAR+NMER>0)
X &&(abs(NXLOC-ntn[anation].nvy[j].xloc)<=1)
X &&(abs(NYLOC-ntn[anation].nvy[j].yloc)<=1)
X &&(count<32)) {
X fought[ntn[country].nvy[nvynum].xloc][ntn[country].nvy[nvynum].yloc]=1;
X if((country!=anation)
X &&(ntn[anation].dstatus[country]>HOSTILE)){
X valid=1;
X dnation=country;
X }
X unit[count]=nvynum;
X owner[count]=country;
X count++;
X }
X if(valid==1) navalcbt();
X }
X }
X printf("\nall army and navy attacks completed");
X}
X
X/*taking the three matrices, run a combat*/
Xfight()
X{
X FILE *fpmsg, *fopen();
X char tempstr[15];
X int droll,aroll;
X int odds; /*odds total times 100*/
X int done;
X int i,j,k;
X int asold=0,dsold=0; /*a's and d's total soldiers*/
X int Aloss=0,Dloss=0; /*a's and d's total losses*/
X int PAloss,PDloss; /*percent a and d loss*/
X int loss,divisor;
X int abonus=0,dbonus=0; /*bonus aggregate*/
X short vampire=0; /*# non vamps deaded */
X short nvamps=0; /*number of vampire armies*/
X
X /* determine who is attacker & who is on defenders side?*/
X for(j=0;j<32;j++) if(owner[j]!=(-1)){
X if(owner[j]==anation) side[j]=ATKR;
X else if(owner[j]==dnation) side[j]=DFND;
X else if(ntn[anation].dstatus[owner[j]]==JIHAD) side[j]=DFND;
X else if(ntn[owner[j]].dstatus[anation]==JIHAD) side[j]=DFND;
X else if(ntn[anation].dstatus[owner[j]]==WAR) side[j]=DFND;
X else if(ntn[owner[j]].dstatus[anation]==WAR) side[j]=DFND;
X else if((ntn[owner[j]].dstatus[anation]==CONFEDERACY)&&(ntn[owner[j]].dstatus[dnation]>HOSTILE)) side[j]=ATKR;
X else if((ntn[owner[j]].dstatus[anation]==ALLIED)&&(ntn[owner[j]].dstatus[dnation]>HOSTILE)) side[j]=ATKR;
X }
X
X /*calculate number of troops */
X asold=0;
X dsold=0;
X for(i=0;i<32;i++) if(owner[i]!=(-1)) {
X if(side[i]==ATKR)
X asold += ntn[owner[i]].arm[unit[i]].sold;
X else if(side[i]==DFND)
X dsold += ntn[owner[i]].arm[unit[i]].sold;
X if(magic(owner[i],VAMPIRE)==1) nvamps++;
X }
X
X if((dsold<=0)||(asold<=0)) {
X printf("\nERROR CONDITION -- ABORTING THIS COMBAT!!!!!!\n");
X return;
X }
X odds = (asold*100)/dsold;
X
X /* CALCULATE WEIGHTED AVERAGE BONUS*/
X abonus=0;
X dbonus=0;
X for(i=0;i<32;i++) if(owner[i]!=(-1)) {
X if(side[i]==ATKR)
X abonus += cbonus(i)*ntn[owner[i]].arm[unit[i]].sold;
X else if(side[i]==DFND)
X dbonus += cbonus(i)*ntn[owner[i]].arm[unit[i]].sold;
X }
X
X abonus/=asold;
X dbonus/=dsold;
X
X /*RUN COMBAT */
X /*DICE RESULTS MAY BE FROM 0 TO 200*/
X /*attacker wants a high roll and defender wants low roll on both dice*/
X aroll = abs(rand()%100);
X aroll += 50 + abonus - dbonus;
X if(aroll<0) aroll=0;
X if(aroll>199) aroll=199;
X
X droll = abs(rand()%100);
X droll += 50 + abonus - dbonus;
X if(droll<0) droll=0;
X if(droll>199) droll=199;
X
X /*odds bonus*/
X if(odds>1500) {
X PAloss = (Cbt6_1[aroll/10])/4;
X PDloss = Cbt1_6[20-droll/10]+30;
X }
X if(odds>600) {
X PAloss = Cbt6_1[aroll/10];
X PDloss = Cbt1_6[20-droll/10];
X }
X else if(odds>500){
X PAloss = Cbt5_1[aroll/10];
X PDloss = Cbt1_5[20-droll/10];
X }
X else if(odds>400){
X PAloss = Cbt4_1[aroll/10];
X PDloss = Cbt1_4[20-droll/10];
X }
X else if(odds>300) {
X PAloss = Cbt3_1[aroll/10];
X PDloss = Cbt1_3[20-droll/10];
X }
X else if(odds>200) {
X PAloss = Cbt2_1[aroll/10];
X PDloss = Cbt1_2[20-droll/10];
X }
X else if(odds>150) {
X PAloss = Cbt3_2[aroll/10];
X PDloss = Cbt2_3[20-droll/10];
X }
X else if(odds>125) {
X PAloss = Cbt5_4[aroll/10];
X PDloss = Cbt4_5[20-droll/10];
X }
X else if(odds>100){
X PAloss = Cbt1_1[aroll/10];
X PDloss = Cbt1_1[20-droll/10];
X }
X else if(odds>75) {
X PAloss = Cbt4_5[aroll/10];
X PDloss = Cbt5_4[20-droll/10];
X }
X else if(odds>50) {
X PAloss = Cbt1_2[aroll/10];
X PDloss = Cbt2_1[20-droll/10];
X }
X else if(odds>33) {
X PAloss = Cbt1_3[aroll/10];
X PDloss = Cbt3_1[20-droll/10];
X }
X else if(odds>15) {
X PAloss = Cbt1_6[aroll/10];
X PDloss = Cbt6_1[20-droll/10];
X }
X else {
X PAloss = 120;
X PDloss = 0;
X }
X sprintf(tempstr,"%s%d",msgfile,country);
X if ((fpmsg=fopen(tempstr,"a+"))==NULL) {
X printf("\n\tERROR OPENING %s",tempstr);
X exit(1);
X }
X
X /*divisor is the smallest combat bonus*/
X divisor = 100;
X for(i=0;i<32;i++) if(owner[i]!=(-1)){
X if(side[i]==ATKR)
X divisor= min (divisor,ntn[owner[i]].aplus);
X else
X divisor= min (divisor,ntn[owner[i]].dplus);
X }
X divisor+=100;
X
X /*NOTE LOSSES ARE ADJUSTED BY CBONUS*/
X for(i=0;i<32;i++) if(owner[i]!=(-1)){
X if(side[i]==ATKR){
X loss=(ntn[owner[i]].arm[unit[i]].sold*PAloss*divisor) /(100*(100+ntn[owner[i]].aplus));
X if(loss>ntn[owner[i]].arm[unit[i]].sold )
X loss=ntn[owner[i]].arm[unit[i]].sold;
X /*army can't have less than 25 men in it*/
X if(ntn[owner[i]].arm[unit[i]].sold-loss<25)
X loss=ntn[owner[i]].arm[unit[i]].sold;
X Aloss+=loss;
X ntn[owner[i]].arm[unit[i]].sold-=loss;
X }
X else if(side[i]==DFND){
X loss=(ntn[owner[i]].arm[unit[i]].sold*PDloss*divisor)/(100*(100+ntn[owner[i]].dplus));
X if(loss>ntn[owner[i]].arm[unit[i]].sold )
X loss=ntn[owner[i]].arm[unit[i]].sold;
X /*destroy army if < 25 men*/
X if(ntn[owner[i]].arm[unit[i]].sold-loss<25)
X loss=ntn[owner[i]].arm[unit[i]].sold;
X Dloss+=loss;
X ntn[owner[i]].arm[unit[i]].sold-=loss;
X }
X if((nvamps>0)&&(magic(owner[i],VAMPIRE)==1))
X vampire+=.35 * loss;
X }
X
X fprintf(fnews,"4.\tBattle in %d,%d",ntn[owner[0]].arm[unit[0]].xloc, ntn[owner[0]].arm[unit[0]].yloc);
X for(j=0;j<32;j++) if(owner[j]!=(-1)){
X done=0;
X for(i=0;i<j;i++) if(owner[j]==owner[i]) done=1;
X if(done==0) {
X if(side[i]==DFND)
X fprintf(fnews,",attacker %s",ntn[owner[j]].name);
X else if(side[i]==ATKR)
X fprintf(fnews,",defender %s",ntn[owner[j]].name);
X }
X }
X fprintf(fnews,"\n");
X if(nvamps>0){
X for(i=0;i<32;i++) if(owner[i]!=(-1)){
X if(magic(owner[i],VAMPIRE)==1)
X ntn[owner[i]].arm[unit[i]].sold+=vampire/nvamps;
X }
X }
X
X /*who is in the battle*/
X for(j=0;j<32;j++) if(owner[j]!=(-1)){
X done=0;
X
X /*first time your nation appears done=0*/
X for(i=0;i<j;i++) if(owner[j]==owner[i]) done=1;
X
X if((done==0)&&(ntn[owner[j]].active==1)) {
X
X fprintf(fpmsg,"%s BATTLE SUMMARY for sector %d, %d\n",ntn[owner[j]].name,ntn[owner[0]].arm[unit[0]].xloc, ntn[owner[0]].arm[unit[0]].yloc);
X
X if(side[j]==ATKR) fprintf(fpmsg,"%s You are on the Attacking Side\n",ntn[owner[j]].name);
X else fprintf(fpmsg,"%s You are on the Defending Side\n",ntn[owner[j]].name);
X
X /*detail all participants in battle*/
X for(k=0;k<32;k++) if(owner[k]!=(-1)){
X if(side[k]==DFND) fprintf(fpmsg,"%s\t %s is defending with army %d \n",ntn[owner[j]].name, ntn[owner[k]].name,unit[k]);
X else fprintf(fpmsg,"%s\t %s is attacking with army %d \n",ntn[owner[j]].name,ntn[owner[k]].name, unit[k]);
X }
X
X fprintf(fpmsg,"%s attacking soldiers=%d\tmodified roll=%d->%d%%\n",ntn[owner[j]].name,asold,aroll,PAloss);
X fprintf(fpmsg,"%s defending soldiers=%d\tmodified roll=%d->%d%%\n",ntn[owner[j]].name,dsold,droll,PDloss);
X fprintf(fpmsg,"%s ODDS are %d to 100\n",ntn[owner[j]].name,odds);
X fprintf(fpmsg,"%s RESULT: Attackers lose %d men, Defenders lose %d men\n",ntn[owner[j]].name,Aloss, Dloss);
X fprintf(fpmsg,"%s\n","END");
X }
X }
X fclose(fpmsg);
X}
X
X/*Subroutine to determine combat bonuses for unit i in matrix*/
Xcbonus(num)
X{
X short armynum;
X int armbonus;
X
X armbonus=0;
X armynum=unit[num];
X country=owner[num];
X
X /*Racial combat bonus due to terrain (the faster you move the better)*/
X armbonus+=5*(9-movecost[AXLOC][AYLOC]);
X
X if((magic(country,MI_MONST)==1)&&(unit[num]==0)) armbonus+=20;
X if((magic(country,AV_MONST)==1)&&(unit[num]==0)) armbonus+=20;
X if((magic(country,MA_MONST)==1)&&(unit[num]==0)) armbonus+=20;
X
X if(((magic(country,DESTROYER)==1)
X ||(magic(country,DERVISH)==1))
X &&((sct[AXLOC][AYLOC].vegetation==ICE)
X ||(sct[AXLOC][AYLOC].vegetation==DESERT)))
X armbonus+=30;
X
X if(side[num]==DFND){
X
X if(sct[AXLOC][AYLOC].altitude==MOUNTAIN) armbonus+=20;
X else if(sct[AXLOC][AYLOC].altitude==HILL) armbonus+=10;
X
X if(sct[AXLOC][AYLOC].vegetation==JUNGLE) armbonus+=20;
X else if(sct[AXLOC][AYLOC].vegetation==FORREST) armbonus+=15;
X else if(sct[AXLOC][AYLOC].vegetation==WOOD) armbonus+=10;
X
X armbonus += ntn[owner[num]].dplus;
X
X if(sct[AXLOC][AYLOC].designation==DCASTLE)
X armbonus+=5*sct[AXLOC][AYLOC].fortress;
X else if((ASTAT==GARRISON)
X &&(sct[AXLOC][AYLOC].designation==DCITY)){
X if(magic(country,ARCHER)==1) armbonus+=30;
X if(magic(country,ARCHITECT)==1){
X armbonus+=10+16*sct[AXLOC][AYLOC].fortress;
X }
X else armbonus+=10+8*sct[AXLOC][AYLOC].fortress;
X }
X else if((ASTAT==GARRISON)
X &&(sct[AXLOC][AYLOC].designation==DCAPITOL)){
X if(magic(country,ARCHER)==1) armbonus+=30;
X if(magic(country,ARCHITECT)==1){
X armbonus+=20+20*sct[AXLOC][AYLOC].fortress;
X }
X else armbonus+=20+10*sct[AXLOC][AYLOC].fortress;
X }
X
X }
X else if(side[num]==ATKR) armbonus += ntn[owner[num]].aplus;
X
X /*army status is important*/
X if(ASTAT==MARCH) armbonus-=40;
X
X return(armbonus);
X}
X
Xprep()
X{
X short armynum,nvynum;
X int save,i,j;
X /*set occ to 0*/
X for(i=0;i<MAPX;i++) for(j=0;j<MAPX;j++) occ[i][j]=0;
X save=country;
X /*set occ to country of occupant army*/
X for(country=0;country<NTOTAL;country++)
X if(ntn[country].active!=0) {
X for(armynum=0;armynum<MAXARM;armynum++){
X if((ASOLD>0)&&(ASTAT!=SCOUT)){
X if((occ[AXLOC][AYLOC]==0)
X ||(occ[AXLOC][AYLOC]==country))
X occ[AXLOC][AYLOC]=country;
X else occ[AXLOC][AYLOC]=MAXNTN+5;
X }
X }
X for(nvynum=0;nvynum<MAXNAVY;nvynum++){
X if(NWAR+NMER>0){
X if((occ[NXLOC][NYLOC]==0)
X ||(occ[NXLOC][NYLOC]==country))
X occ[NXLOC][NYLOC]=country;
X else occ[NXLOC][NYLOC]=MAXNTN+5;
X }
X }
X }
X country=save;
X}
X
X/*SUBROUTINE TO RUN NAVAL COMBAT ON ALL SHIPS */
X/*just like fight, this takes array of owner,side,unit and calculate*/
Xnavalcbt()
X{
X FILE *fpmsg, *fopen();
X char tempmsg[15];
X int aship=0,dship=0; /*a's and d's total war ships*/
X int asunk=0,dsunk=0; /*a's and d's losses for the round*/
X int amsunk=0,dmsunk=0; /*a's and d's msunks for the round*/
X register int done,i,j,k;
X
X /* determine who is attacker & who is on defenders side?*/
X for(j=0;j<32;j++) if(owner[j]!=(-1)){
X if(owner[j]==anation) side[j]=ATKR;
X else if(ntn[anation].dstatus[owner[j]]==JIHAD) side[j]=DFND;
X else if(ntn[owner[j]].dstatus[anation]==JIHAD) side[j]=DFND;
X else if(ntn[anation].dstatus[owner[j]]==WAR) side[j]=DFND;
X else if(ntn[owner[j]].dstatus[anation]==WAR) side[j]=DFND;
X else if((ntn[owner[j]].dstatus[anation]==CONFEDERACY)
X &&(ntn[owner[j]].dstatus[dnation]>HOSTILE)) side[j]=ATKR;
X else if((ntn[owner[j]].dstatus[anation]==ALLIED)
X &&(ntn[owner[j]].dstatus[dnation]>HOSTILE)) side[j]=ATKR;
X }
X
X /*RUN COMBAT; loop until done*/
X /*determine relative strengths--does anybody try to flee*/
X /*calculate number of ships on a side*/
X for(j=0;j<32;j++) if(owner[j]!=(-1)){
X if(side[j]==DFND) {
X dship+=ntn[owner[j]].nvy[unit[j]].warships;
X }
X else if(side[j]==ATKR) {
X aship+=ntn[owner[j]].nvy[unit[j]].warships;
X }
X }
X
X /*no bonus currently included in this combat*/
X
X /*each warship can do damage 40%; once all warships sunk then all*/
X /*sunk are captured merchant*/
X for(i=0;i<aship;i++) if(rand()%10<=3) dsunk++;
X for(i=0;i<dship;i++) if(rand()%10<=3) asunk++;
X
X fprintf(fnews,"4.\tNaval Battle in %d,%d",ntn[owner[0]].arm[unit[0]].xloc, ntn[owner[0]].arm[unit[0]].yloc);
X for(j=0;j<32;j++) if(owner[j]!=(-1)){
X k=0;
X for(i=0;i<j;i++) if(owner[j]==owner[i]) k=1;
X if(k==0) {
X if(side[i]==DFND)
X fprintf(fnews,",attacker %s",ntn[owner[j]].name);
X else if(side[i]==ATKR)
X fprintf(fnews,",defender %s",ntn[owner[j]].name);
X }
X }
X fprintf(fnews,"\n");
X
X fprintf(fnews,"4.\tattackers lose %d of %d warships (remainder are merchants)\n",asunk,aship);
X fprintf(fnews,"4.\tdefenders lose %d of %d warships (remainder are merchants)\n",dsunk,dship);
X
X for(i=0;i<32;i++) if(owner[i]!=(-1)){
X if((asunk>0)&&(side[i]==ATKR)){
X if(asunk > aship ) {
X ntn[owner[i]].nvy[unit[i]].warships=0;
X amsunk = asunk - aship;
X } else {
X ntn[owner[i]].nvy[unit[i]].warships -= asunk / aship * ntn[owner[i]].nvy[unit[i]].warships;
X }
X }
X else if((dsunk>0)&&(side[i]==DFND)){
X if(dsunk > dship ) {
X ntn[owner[i]].nvy[unit[i]].warships=0;
X dmsunk = dsunk -dship;
X } else {
X ntn[owner[i]].nvy[unit[i]].warships -= dsunk / dship * ntn[owner[i]].nvy[unit[i]].warships;
X }
X }
X }
X /* take care of merchants*/
X for(i=0;i<32;i++) if(owner[i]!=(-1)){
X if((amsunk>0)&&(side[i]==ATKR)){
X if(amsunk >= ntn[owner[i]].nvy[unit[i]].merchant ) {
X amsunk -= ntn[owner[i]].nvy[unit[i]].merchant;
X ntn[owner[i]].nvy[unit[i]].merchant=0;
X } else {
X ntn[owner[i]].nvy[unit[i]].merchant-=amsunk;
X amsunk=0;
X }
X }
X else if((dmsunk>0)&&(side[i]==DFND)){
X if(dmsunk >= ntn[owner[i]].nvy[unit[i]].merchant ) {
X dmsunk -= ntn[owner[i]].nvy[unit[i]].merchant;
X ntn[owner[i]].nvy[unit[i]].merchant=0;
X } else {
X ntn[owner[i]].nvy[unit[i]].merchant-=dmsunk;
X dmsunk=0;
X }
X }
X }
X
X /*will round continue; does one side wish to withdraw*/
X
X /*mail results; who is in the battle*/
X for(j=0;j<32;j++) if(owner[j]!=(-1)){
X done=0;
X
X /*first time your nation appears done=0*/
X for(i=0;i<j;i++) if(owner[j]==owner[i]) done=1;
X
X if((done==0)&&(ntn[owner[j]].active==1)) {
X sprintf(tempmsg,"%s%d",msgfile,owner[j]);
X if ((fpmsg=fopen(tempmsg,"a+"))==NULL) {
X fprintf(fnews,"4.\tERROR OPENING %s\n",tempmsg);
X exit(1);
X }
X
X fprintf(fpmsg,"%s NAVAL BATTLE in sector %d %d\n"
X ,ntn[owner[j]].name,ntn[owner[0]].nvy[unit[0]].xloc
X ,ntn[owner[0]].nvy[unit[0]].yloc);
X
X if(side[j]==ATKR)
X fprintf(fpmsg,"%s You are on the Attacking Side\n"
X ,ntn[owner[j]].name);
X else fprintf(fpmsg,"%s You are on the Defending Side\n"
X ,ntn[owner[j]].name);
X
X /*detail all participants in battle*/
X for(k=0;k<32;k++) if(owner[k]!=(-1)){
X if(side[k]==DFND)
X fprintf(fpmsg,"%s\t%s is defender with navy %d\n" ,ntn[owner[j]].name , ntn[owner[k]].name,unit[k]);
X else fprintf(fpmsg,"%s\t%s is attacker with navy %d\n",ntn[owner[j]].name,ntn[owner[k]].name, unit[k]);
X }
X
X fprintf(fpmsg,"%s RESULT: Attackers lose %d ships, Defenders lose %d ships\n",ntn[owner[j]].name, asunk,dsunk);
X fprintf(fpmsg,"%s Attackers capture %d merchants, Defenders capture %d merchants\n",ntn[owner[j]].name, dmsunk,amsunk);
X fprintf(fpmsg,"END\n");
X fclose(fpmsg);
X }
X }
X}
END_OF_combat.c
if test 18772 -ne `wc -c <combat.c`; then
echo shar: \"combat.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
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\" \(14354 characters\)
sed "s/^X//" >forms.c <<'END_OF_forms.c'
X/*conquer is copyrighted 1986 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/* 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
Xshowscore()
X{
X int i;
X int done=0;
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==0)&&(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,"%d",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=1;
X }
X}
X
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=0;
X if(country==0) {
X isgod=1;
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 (%d 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==1) 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[country].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==1) 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==1) country=0;
X return;
X }
X if((isgod==0)
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,country);
X if ((fp=fopen(tempifile,"a+"))==NULL) {
X mvprintw(4,0,"error opening %s",tempifile);
X refresh();
X getch();
X return;
X }
X fprintf(fp,"%s %s Declared war on you\n",ntn[nation].name,ntn[country].name);
X fputs("END\n",fp);
X fclose(fp);
X }
X }
X }
X}
X
Xchange()
X{
X char string[10];
X int i, cbonus;
X short armynum;
X char passwd[8];
X short isgod=0;
X
X if(country==0) {
X isgod=1;
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 mvprintw(12,0,"capital loc: x is %d",ntn[country].capx);
X mvprintw(13,0," y is %d",ntn[country].capy);
X mvprintw(14,0,"leader is %s",ntn[country].leader);
X mvprintw(15,0,"class is %s",*(Class+ntn[country].class));
X mvprintw(16,0,"nations mark is...%c ",ntn[country].mark);
X for(i=1;i<8;i++) if(ntn[country].race==*(races+i)[0])
X mvprintw(17,0, "nation race is....%s ",*(races+i));
X mvprintw(18,0,"score currently...%d",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........$%5ld",ntn[country].tgold);
X mvprintw(10,(COLS/2),"jewels ............$%5ld",ntn[country].jewels);
X mvprintw(11,(COLS/2),"iron & minerals......%5ld",ntn[country].tiron);
X if(ntn[country].tfood<2*ntn[country].tciv) standout();
X mvprintw(12,(COLS/2),"food in granary......%5ld",ntn[country].tfood);
X standend();
X
X mvprintw(13,(COLS/2),"total soldiers.......%5ld",ntn[country].tmil);
X mvprintw(14,(COLS/2),"total civilians......%5ld",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
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 if(isgod==1) 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 echo();
X mvaddstr(0,0,"what name would you like:");
X clrtoeol();
X refresh();
X getstr(string);
X if((strlen(string)<=1)||(strlen(string)>NAMELTH)){
X beep();
X mvaddstr(2,0,"invalid name--hit return");
X noecho();
X refresh();
X getch();
X if(isgod==1) 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 noecho();
X refresh();
X getch();
X if(isgod==1) 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 noecho();
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==1) 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==1) 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==1) 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 }
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==1){
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(1);
X }
X destroy();
X fclose(fnews);
X }
X }
X break;
X default:
X if(isgod==1) country=0;
X return;
X }
X if(isgod==1) country=0;
X change();
X}
X
Xhelp()
X{
X int lineno;
X FILE *fp, *fopen();
X int done=0;
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==0){
X /*read in screen (until DONE statement)*/
X fgets(line,80,fp);
X if(strncmp(line,"DONE",4)==0) done=1;
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)-14,"HIT ANY KEY TO CONTINUE HELP SCREENS");
X mvaddstr(LINES-1,(COLS/2)-12,"TO END HELP HIT SPACE KEY");
X standend();
X refresh();
X if(getch()==' ') done=1;
X }
X }
X fclose(fp);
X}
X
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=0;
X newpage=0;
X if(fgets(title,80,fp)==NULL) done=1;
X while(done==0){
X if(newpage==0){
X clear();
X lineno=5;
X newpage=1;
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=1;
X else {
X if(line[1]!='.') {
X strcpy(title,line);
X newpage=0;
X pagenum++;
X }
X else {
X mvaddstr(lineno++,0,line+2);
X if(todigit(line[0])!=pagenum) {
X newpage=0;
X pagenum=todigit(line[0]);
X }
X else if(lineno>LINES-3) newpage=0;
X }
X }
X
X if(newpage==0||done==1){
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=1;
X }
X }
X fclose(fp);
X}
END_OF_forms.c
if test 14354 -ne `wc -c <forms.c`; then
echo shar: \"forms.c\" 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\" \(17674 characters\)
sed "s/^X//" >move.c <<'END_OF_move.c'
X/*conquer is copyrighted 1986 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
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=0; /*1 if move was a valid move (you must pay cost)*/
X short armynum;
X int oldxcurs,oldycurs;
X short nvynum;
X int done=0; /*done is 1 if done with this move*/
X int capacity;
X
X armornvy=AORN;
X /*get selected army or navy*/
X if((armynum=getselunit())<0) {
X standout();
X beep();
X mvprintw(LINES-3,0,"ERROR: FAKE UNIT (%d) SELECTED: ",armynum);
X clrtoeol();
X mvaddstr(LINES-1,0,"hit return to continue");
X clrtoeol();
X standend();
X refresh();
X getch();
X return;
X }
X
X /*navy*/
X if((armynum>=MAXARM)&&(armynum<MAXARM+MAXNAVY)) {
X nvynum=armynum-MAXARM;
X armynum=(-1);
X standout();
X mvprintw(LINES-3,0,"NAVY %d SELECTED: ",nvynum);
X standend();
X clrtoeol();
X capacity=NMER*SHIPHOLD;
X if((NMOVE<=0)) {
X mvprintw(LINES-2,0,"NO MOVE POINTS LEFT on fleet %d",nvynum);
X beep();
X redraw=FALSE;
X clrtoeol();
X mvaddstr(LINES-1,0,"hit return to continue");
X clrtoeol();
X refresh();
X getch();
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-2, 0, 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-2,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 mvaddstr(LINES-1,0,"ERROR: TOO MANY TROOPS");
X clrtoeol();
X refresh();
X getch();
X armornvy=AORN;
X return;
X }
X else if(AMOVE==0){
X mvaddstr(LINES-1,0,"SORRY: ARMY HAS NO MOVEMENT POINTS");
X clrtoeol();
X refresh();
X getch();
X armornvy=AORN;
X return;
X }
X else capacity-=ASOLD;
X }
X else {
X mvaddstr(LINES-1,0,"ERROR: INVALID ARMY!");
X refresh();
X getch();
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 mvaddstr(LINES-2,0,"NUMBER OF MEN ERROR");
X refresh();
X getch();
X armornvy=AORN;
X return;
X }
X }
X refresh();
X standend();
X }
X /*army*/
X else {
X mvprintw(LINES-3,0,"ARMY %d SELECTED: ",armynum);
X clrtoeol();
X if(AMOVE<=0){
X mvaddstr(LINES-2,0,"NO MOVEMENT POINTS LEFT");
X clrtoeol();
X mvaddstr(LINES-1,0,"hit return to continue");
X clrtoeol();
X beep();
X standend();
X refresh();
X redraw=FALSE;
X getch();
X armornvy=AORN;
X return;
X }
X }
X
X standout();
X mvaddstr(LINES-2,0,"MOVEMENT SCREEN");
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==0){
X valid=1;
X if(armornvy==NAVY) mveleft=NMOVE;
X else mveleft=AMOVE;
X oldxcurs=xcurs;
X oldycurs=ycurs;
X switch(getch()) {
X case 'b':
X xcurs--;
X ycurs++;
X break;
X case 'h':
X xcurs--;
X break;
X case 'j': /*move down*/
X ycurs++;
X break;
X case 'k': /*move up*/
X ycurs--;
X break;
X case 'l': /*move east*/
X xcurs++;
X break;
X case 'n': /*move south-east*/
X ycurs++;
X xcurs++;
X break;
X case 'u': /*move north-east*/
X ycurs--;
X xcurs++;
X break;
X case 'y': /*move north-west*/
X ycurs--;
X xcurs--;
X break;
X case ' ':
X valid=0;
X done=1;
X break;
X default:
X beep();
X valid=0;
X }
X
X /*if valid move check if have enough movement points*/
X if(valid==1){
X /*if valid move decrement move rate*/
X if(armornvy==ARMY) {
X if((movecost[XREAL][YREAL]<0)
X ||(movecost[XREAL][YREAL]>mveleft)) {
X beep();
X valid=0;
X xcurs=oldxcurs;
X ycurs=oldycurs;
X }
X else {
X AMOVE-=movecost[XREAL][YREAL];
X if(AMOVE<=0) done=1;
X }
X }
X /*then navy*/
X else if(armornvy==NAVY) {
X if(movecost[XREAL][YREAL]>mveleft) {
X beep();
X valid=0;
X xcurs=oldxcurs;
X ycurs=oldycurs;
X }
X else if(movecost[XREAL][YREAL]>0){
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 done=1;
X if(((sct[XREAL][YREAL].designation==DCITY)
X ||(sct[XREAL][YREAL].designation==DCAPITOL))
X &&(sct[XREAL][YREAL].owner==country)) NMOVE--;
X else NMOVE=0;
X }
X else {
X move(3,0);
X clrtoeol();
X valid=0;
X xcurs=oldxcurs;
X ycurs=oldycurs;
X move(ycurs,xcurs*2);
X refresh();
X }
X }
X else NMOVE+=movecost[XREAL][YREAL];
X if(NMOVE<=0) done=1;
X }
X else if(armornvy==AORN){
X mvprintw(LINES-3,0,"AORN ERROR -- aborting hit return");
X refresh();
X getch();
X return;
X }
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 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==1)&&(done==0)){
X /*check if offmap and correct*/
X coffmap();
X
X mvaddstr(LINES-3,0," ");
X
X if((armornvy==ARMY)&&(ASTAT!=SCOUT)){
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=1;
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=1;
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=1;
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
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>=75){
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)) flee(XREAL,YREAL,0);
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)) flee(XREAL,YREAL,0);
X mvprintw(LINES-2,0,"TAKING SECTOR");
X SOWN=country;
X SADJOWN;
X AMOVE=0;
X AADJMOV;
X }
X clrtoeol();
X refresh();
X }
X }
X else if(armornvy==AORN){
X mvprintw(LINES-3,0,"ERROR");
X return;
X }
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 AXLOC=XREAL;
X AYLOC=YREAL;
X AADJLOC;
X AMOVE=0;
X AADJMOV;
X /*take unowned land*/
X if(SOWN==0) {
X SOWN=country;
X SADJOWN;
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
X#define ALPHA_SIZE 128
X
X/*movecost contains movement cost unless water -1 or unenterable land (-2)*/
X/*NEW: if water and not ajacent to land will cost -4*/
Xupdmove(race)
X{
X register struct s_sector *sptr;
X register int i,j;
X int x,y;
X int onecost;
X int twocost;
X char *HVegcost= "83210000232E";
X char *OVegcost= "52100012517E";
X char *EVegcost= "86221000017E";
X char *DVegcost= "57100013577E";
X char *XVegcost= "83210001232E"; /*others*/
X char *HElecost= "E321E";
X char *OElecost= "E211E";
X char *EElecost= "E631E";
X char *DElecost= "E211E";
X char *XElecost= "E321E"; /*others*/
X
X short veg_cost[ ALPHA_SIZE ];
X short ele_cost[ ALPHA_SIZE ];
X
X for( j = 0; j < ALPHA_SIZE; j++ )
X veg_cost[j] = ele_cost[j] = -1;
X
X for( j = 0; j <= 10; j++ ) {
X switch( race ) {
X case ELF:
X veg_cost[ veg[j] ] = todigit( EVegcost[j] );
X break;
X case DWARF:
X veg_cost[ veg[j] ] = todigit( DVegcost[j] );
X break;
X case ORC:
X veg_cost[ veg[j] ] = todigit( OVegcost[j] );
X break;
X case HUMAN:
X veg_cost[ veg[j] ] = todigit( HVegcost[j] );
X break;
X default:
X veg_cost[ veg[j] ] = todigit( XVegcost[j] );
X break;
X } /* switch */
X } /* for */
X
X for( j = 0; j <= 4; j++ ) {
X switch( race ) {
X case ELF:
X ele_cost[ ele[j] ] = todigit( EElecost[j] );
X break;
X case DWARF:
X ele_cost[ ele[j] ] = todigit( DElecost[j] );
X break;
X case ORC:
X ele_cost[ ele[j] ] = todigit( OElecost[j] );
X break;
X case HUMAN:
X ele_cost[ ele[j] ] = todigit( HElecost[j] );
X break;
X default:
X ele_cost[ ele[j] ] = todigit( XElecost[j] );
X break;
X } /* switch */
X } /* for */
X
X for(x=0;x<MAPX;x++) for(y=0;y<MAPX;y++){
X sptr = &sct[x][y];
X
X if(race==GOD) movecost[x][y] = 0;
X else if(sptr->altitude==WATER) {
X movecost[x][y] = -4;
X for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++)
X if( i>=0 && j>=0 && i<MAPX && j<MAPY)
X if( sct[i][j].altitude != WATER)
X movecost[x][y] = -1;
X }
X else if(((magic(country,DERVISH)==1)
X ||(magic(country,DESTROYER)==1))
X &&((sptr->vegetation==ICE)
X ||(sptr->vegetation==DESERT)))
X movecost[x][y] = 1;
X else {
X onecost = veg_cost[ sptr->vegetation ];
X twocost = ele_cost[ sptr->altitude ];
X
X if( onecost == -1 || twocost == -1 )
X movecost[x][y] = -2;
X else
X movecost[x][y] = onecost + twocost;
X } /* if */
X } /* for */
X} /* updmove() */
X
X/*get selected army or navy: if navy, number is MAXARM+nvynum*/
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}
X
Xflee(x,y,z)
X{
X /*count is number of acceptable sectors*/
X int count=0;
X int i,j;
X /*flee*/
X /*check if next to anybody of the sectors owners race*/
X for(i=x-2;i<=x+2;i++) for(j=y-2;j<=y+2;j++)
X if(i>=0&&i<MAPX&&j>=0&&j<MAPY
X &&(ntn[sct[i][j].owner].race==ntn[sct[x][y].owner].race))
X count++;
X
X if(count>0) {
X if(z==0) mvaddstr(LINES-2,20,"CIVILIANS ABANDON SECTOR");
X for(i=x-2;i<=x+2;i++) for(j=y-2;j<=y+2;j++)
X if(i>=0&&i<MAPX&&j>=0&&j<MAPY
X &&(ntn[sct[i][j].owner].race==ntn[sct[x][y].owner].race)) {
X sct[i][j].people += sct[x][y].people / count;
X if(z==0) SADJCIV2;
X }
X }
X else {
X sct[x][y].people /= 2;
X for(i=x-4;i<=x+4;i++) for(j=y-4;j<=y+4;j++)
X if(i>=0&&i<MAPX&&j>=0&&j<MAPY
X &&(ntn[sct[i][j].owner].race==ntn[sct[x][y].owner].race))
X count++;
X if(count>0) {
X if(z==0) mvaddstr(LINES-2,20,"PEOPLE FLEE SECTOR AND HALF DIE");
X for(i=x-4;i<=x+4;i++) for(j=y-4;j<=y+4;j++)
X if(i>=0&&i<MAPX&&j>=0&&j<MAPY
X &&(ntn[sct[i][j].owner].race==ntn[sct[x][y].owner].race)) {
X sct[i][j].people += sct[x][y].people / count;
X if(z==0) SADJCIV2;
X }
X }
X else if(z==0) mvaddstr(LINES-2,20,"PEOPLE IN SECTOR DIE");
X }
X
X sct[x][y].people = 0;
X if(z==0) SADJCIV;
X sct[x][y].fortress=0;
X /*SINFORT;*/
X if(isdigit(sct[XREAL][YREAL].vegetation)!=0) {
X sct[x][y].designation=DDEVASTATED;
X if(z==0) SADJDES2;
X }
X}
X
END_OF_move.c
if test 17674 -ne `wc -c <move.c`; then
echo shar: \"move.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 4 \(of 6\).
cp /dev/null ark4isdone
MISSING=""
for I in 1 2 3 4 5 6 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 6 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