games@tekred.TEK.COM (06/17/88)
Submitted by: ihnp4!homxc!smile
Comp.sources.games: Volume 4, Issue 43
Archive-name: conquer3/Part02
#! /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 2 (of 8)."
# Contents: combat.c npc.c
# Wrapped by billr@saab on Thu Jun 16 09:39:56 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\" \(24900 characters\)
sed "s/^X//" >combat.c <<'END_OF_combat.c'
X/*conquer : Copyright (c) 1988 by Ed Barlow.
X * I spent a long time writing this code & I hope that you respect this.
X * I give permission to alter the code, but not to copy or redistribute
X * it without my explicit permission. If you alter the code,
X * please document changes and send me a copy, so all can have it.
X * This code, to the best of my knowledge works well, but it is my first
X * 'C' program and should be treated as such. I disclaim any
X * responsibility for the codes actions (use at your own risk). I guess
X * I am saying "Happy gaming", and am trying not to get sued in the process.
X * Ed
X */
X
X#include "header.h"
X#include "data.h"
X
X#define MGKNUM 32 /* number of units possible in battle */
X#define ATKR 2
X#define DFND 1
X
Xextern FILE *fnews;
Xextern short country;
X
Xshort retreatside; /* ATKR, DFND, or none (0) */
Xshort retreatx; /* retreat x square */
Xshort retreaty; /* retreat y square */
X
Xint unit[MGKNUM]; /*armynum*/
Xint owner[MGKNUM]; /*owner*/
Xint side[MGKNUM]; /*see definitions->1=units 2=unit*/
Xint troops[MGKNUM]; /*starting troops in army */
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[]={
X20,20,20,20,20,15,10,10,10,10,5,5,5,5,5,0,0,0,0,0,0
X};
Xint Cbt5_1[]={
X40,30,20,20,20,20,20,20,10,10,10,10,5,5,5,0,0,0,0,0,0
X};
Xint Cbt4_1[]={
X50,40,30,30,30,20,20,20,20,10,10,10,10,5,5,5,0,0,0,0,0
X};
Xint Cbt3_1[]={
X60,50,40,30,30,30,20,20,20,20,10,10,10,10,5,5,5,0,0,0,0
X};
Xint Cbt2_1[]={
X70,50,40,40,40,40,30,30,20,20,20,20,10,10,10,10,10,5,5,5,0
X};
Xint Cbt3_2[]={
X80,60,40,40,40,40,30,30,30,30,20,20,20,20,20,20,20,10,10,10,0
X};
Xint Cbt5_4[]={
X90,60,50,50,50,50,40,40,30,30,30,30,30,30,30,30,30,20,10,10,10
X};
Xint Cbt1_1[]={
X100,90,60,60,60,60,50,50,40,40,40,40,30,30,30,30,20,20,20,10,10
X};
Xint Cbt4_5[]={
X100,90,80,70,70,70,60,60,50,50,50,50,40,40,40,40,40,30,20,20,10
X};
Xint Cbt2_3[]={
X110,90,80,80,70,70,60,60,50,50,50,50,40,40,40,40,40,40,30,20,10
X};
Xint Cbt1_2[]={
X110,100,100,90,80,80,80,80,70,60,60,60,50,50,50,50,50,40,30,30,10
X};
Xint Cbt1_3[]={
X120,110,110,100,90,90,90,90,80,80,70,70,70,70,60,50,50,40,30,30,20
X};
Xint Cbt1_4[]={
X120,110,100,100,90,90,90,90,80,80,70,70,70,70,60,50,50,40,30,30,20
X};
Xint Cbt1_5[]={
X130,110,110,100,100,90,90,90,80,80,70,70,70,70,60,50,50,40,40,30,20
X};
Xint Cbt1_6[]={
X130,120,110,110,110,100,100,90,90,90,80,80,80,70,70,50,50,40,40,40,40
X};
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 */
Xvoid
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<MGKNUM;temp++){
X unit[temp]=(-1);
X owner[temp]=(-1);
X side[temp]=(-1);
X troops[temp]=0;
X }
X
X /*check all armies in area and add to matrix*/
X count=0;
X valid=FALSE;
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<MGKNUM)) {
X
X if((country!=anation)
X &&(ntn[anation].dstatus[country]>HOSTILE)) {
X valid=TRUE;
X dnation=country;
X }
X unit[count]=armynum;
X owner[count]=country;
X count++;
X }
X
X if(valid==TRUE) 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].nvy[j].xloc][ntn[anation].nvy[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<MGKNUM;temp++){
X unit[temp]=(-1);
X owner[temp]=(-1);
X side[temp]=(-1);
X troops[temp]=0;
X }
X
X /*check all fleets in 1 sector range and add to matrix*/
X count=0;
X valid=FALSE;
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<MGKNUM)) {
X fought[NXLOC][NYLOC]=1;
X if((country!=anation)
X &&(ntn[anation].dstatus[country]>HOSTILE)){
X valid=TRUE;
X dnation=country;
X }
X unit[count]=nvynum;
X owner[count]=country;
X count++;
X }
X if(valid==TRUE) navalcbt();
X }
X }
X printf("\nall army and navy attacks completed");
X}
X
X/*taking the three matrices, run a combat*/
Xvoid
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<MGKNUM;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<MGKNUM;i++) if(owner[i]!=(-1)) {
X if(side[i]==ATKR){
X troops[i] = ntn[owner[i]].arm[unit[i]].sold;
X asold += ntn[owner[i]].arm[unit[i]].sold;
X } else if(side[i]==DFND){
X troops[i] = ntn[owner[i]].arm[unit[i]].sold;
X dsold += ntn[owner[i]].arm[unit[i]].sold;
X }
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<MGKNUM;i++) if(owner[i]!=(-1)) {
X if(side[i]==ATKR)
X abonus += cbonus(i)*troops[i];
X else if(side[i]==DFND)
X dbonus += cbonus(i)*troops[i];
X }
X
X /*archer bonus if not in fort vs kinghts/cavalry*/
X j=0;
X k=0;
X for(i=0;i<MGKNUM;i++) if(owner[i]!=(-1))
X
X if(sct[ntn[owner[i]].arm[unit[i]].xloc][ntn[owner[i]].arm[unit[i]].yloc].fortress==0){
X if((ntn[owner[i]].arm[unit[i]].unittyp == A_CAVALRY)
X ||(ntn[owner[i]].arm[unit[i]].unittyp == A_KNIGHT))
X if(side[i]==ATKR) j+=troops[i];
X else if(side[i]==DFND) k+=troops[i];
X }
X
X for(i=0;i<MGKNUM;i++) if(owner[i]!=(-1)) {
X if(j>0) abonus += (15 * j * troops[i]) / asold;
X if(k>0) dbonus += (15 * k * troops[i]) / dsold;
X }
X
X abonus/=asold;
X dbonus/=dsold;
X
X/*CALCULATED BONUSES TO WHOLE COMBAT*/
X for(i=0;i<MGKNUM;i++) if(owner[i]!=(-1)) {
X if(sct[ntn[owner[i]].arm[unit[i]].xloc][ntn[owner[i]].arm[unit[i]].yloc].fortress != 0){
X /*Catapults add +1%/20 men defending castle (max +10%)*/
X if((ntn[owner[i]].arm[unit[i]].unittyp == A_CATAPULT)
X &&(side[i]==DFND))
X abonus += max((troops[i]/20),10);
X /*Seige_engines add +1%/20 men when attacking fortress*/
X else if((ntn[owner[i]].arm[unit[i]].unittyp == A_SEIGE)
X &&(side[i]==ATKR))
X abonus += max((troops[i]/20),30);
X }
X else {
X /*Catapults add +1%/40 men normal combat (max +10%)*/
X if(ntn[owner[i]].arm[unit[i]].unittyp == A_CATAPULT)
X abonus+=max((troops[i]/40),10);
X }
X }
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 } else if(odds>600) {
X PAloss = Cbt6_1[aroll/10];
X PDloss = Cbt1_6[20-droll/10];
X } else if(odds>500){
X PAloss = Cbt5_1[aroll/10];
X PDloss = Cbt1_5[20-droll/10];
X } else if(odds>400){
X PAloss = Cbt4_1[aroll/10];
X PDloss = Cbt1_4[20-droll/10];
X } else if(odds>300) {
X PAloss = Cbt3_1[aroll/10];
X PDloss = Cbt1_3[20-droll/10];
X } else if(odds>200) {
X PAloss = Cbt2_1[aroll/10];
X PDloss = Cbt1_2[20-droll/10];
X } else if(odds>150) {
X PAloss = Cbt3_2[aroll/10];
X PDloss = Cbt2_3[20-droll/10];
X } else if(odds>125) {
X PAloss = Cbt5_4[aroll/10];
X PDloss = Cbt4_5[20-droll/10];
X } else if(odds>100){
X PAloss = Cbt1_1[aroll/10];
X PDloss = Cbt1_1[20-droll/10];
X } else if(odds>75) {
X PAloss = Cbt4_5[aroll/10];
X PDloss = Cbt5_4[20-droll/10];
X } else if(odds>50) {
X PAloss = Cbt1_2[aroll/10];
X PDloss = Cbt2_1[20-droll/10];
X } else if(odds>33) {
X PAloss = Cbt1_3[aroll/10];
X PDloss = Cbt3_1[20-droll/10];
X } else if(odds>15) {
X PAloss = Cbt1_6[aroll/10];
X PDloss = Cbt6_1[20-droll/10];
X } else {
X PAloss = 120;
X PDloss = 0;
X }
X
X retreatside = 0;
X
X if((PDloss > 2* PAloss)
X &&(PDloss>=50)
X &&(odds>150)
X &&(rand()%4==0)) retreatside=DFND;
X
X if((PAloss > 2* PDloss)
X &&(PAloss>=50)
X &&(odds<150)
X &&(rand()%2==0)) retreatside=ATKR;
X
X if(retreatside!=0) {
X fdxyretreat();
X /* no legal retreat route */
X if((retreatx== ntn[owner[0]].arm[unit[0]].xloc)
X && (retreaty== ntn[owner[0]].arm[unit[0]].yloc)){
X if(retreatside==ATKR) PAloss+=10;
X else PDloss+=10;
X#ifdef DEBUG
X printf("side %d (%d %d) cant retreat...+10% loss\n",retreatside,retreatx,retreaty);
X#endif DEBUG
X }
X#ifdef DEBUG
X else
X printf("retreat side %d to %d %d\n",retreatside,retreatx,retreaty);
X#endif DEBUG
X }
X
X /*divisor is the smallest combat bonus*/
X divisor = 100;
X for(i=0;i<MGKNUM;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<MGKNUM;i++) if(owner[i]!=(-1)){
X if(side[i]==ATKR){
X if( ntn[owner[i]].arm[unit[i]].unittyp >= MINMONSTER) {
X if((rand()%100) < PAloss){ /* kill it */
X Aloss += troops[i];
X ntn[owner[i]].arm[unit[i]].sold=0;
X }
X } else {
X loss=(troops[i]*PAloss*divisor) /(100*(100+ntn[owner[i]].aplus));
X if(loss>troops[i] )
X loss=troops[i];
X /*army can't have less than 25 men in it*/
X if(troops[i]-loss<25)
X loss=troops[i];
X Aloss+=loss;
X ntn[owner[i]].arm[unit[i]].sold-=loss;
X }
X } else if(side[i]==DFND){
X if( ntn[owner[i]].arm[unit[i]].unittyp >= MINMONSTER) {
X if((rand()%100) < PDloss){ /* kill it */
X Dloss +=troops[i];
X ntn[owner[i]].arm[unit[i]].sold=0;
X }
X } else {
X loss=(troops[i]*PDloss*divisor)/(100*(100+ntn[owner[i]].dplus));
X if(loss>troops[i] )
X loss=troops[i];
X /*destroy army if < 25 men*/
X if(troops[i]-loss<25)
X loss=troops[i];
X Dloss+=loss;
X ntn[owner[i]].arm[unit[i]].sold-=loss;
X }
X }
X if((nvamps>0)&&(magic(owner[i],VAMPIRE)==1))
X vampire+= loss / 3;
X }
X#ifdef HIDELOC
X fprintf(fnews,"4.\tBattle occurs in %s", ntn[sct[ntn[owner[0]].arm[unit[0]].xloc][ntn[owner[0]].arm[unit[0]].yloc].owner].name);
X#else
X fprintf(fnews,"4.\tBattle in %d,%d",ntn[owner[0]].arm[unit[0]].xloc, ntn[owner[0]].arm[unit[0]].yloc);
X#endif
X for(j=0;j<MGKNUM;j++) if(owner[j]!=(-1)){
X done=FALSE;
X for(i=0;i<j;i++) if(owner[j]==owner[i]) done=TRUE;
X if(done==FALSE) {
X if(side[i]==ATKR)
X fprintf(fnews,", attacker %s",ntn[owner[j]].name);
X else if(side[i]==DFND)
X fprintf(fnews,", defender %s",ntn[owner[j]].name);
X }
X }
X fprintf(fnews,"\n");
X if(nvamps>0){
X for(i=0;i<MGKNUM;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<MGKNUM;j++) if(owner[j]!=(-1)){
X done=FALSE;
X
X /*first time your nation appears done=FALSE*/
X for(i=0;i<j;i++) if(owner[j]==owner[i]) done=TRUE;
X
X if((done==FALSE)&&(ntn[owner[j]].active==1)) {
X sprintf(tempstr,"%s%d",msgfile,owner[j]);
X if ((fpmsg=fopen(tempstr,"a+"))==NULL) {
X printf("\n\tERROR OPENING %s",tempstr);
X exit(FAIL);
X }
X
X fprintf(fpmsg,"%s\tBATTLE 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\tYou are on the Attacking Side\n",ntn[owner[j]].name);
X else fprintf(fpmsg,"%s\tYou are on the Defending Side\n",ntn[owner[j]].name);
X
X /*detail all participants in battle*/
X for(k=0;k<MGKNUM;k++) if(owner[k]!=(-1)){
X if(side[k]==DFND)
X fprintf(fpmsg,"%s\t%s is defending with army %d (type %s, men %d, bonus=%d)\n",
X ntn[owner[j]].name,
X ntn[owner[k]].name,
X unit[k],
X unittype[ntn[owner[k]].arm[unit[k]].unittyp%100],
X troops[k],
X cbonus(k));
X else if(side[k]==ATKR)
X fprintf(fpmsg,"%s\t%s is attacking with army %d (type %s, men %d, bonus=%d)\n",
X ntn[owner[j]].name,
X ntn[owner[k]].name,
X unit[k],
X unittype[ntn[owner[k]].arm[unit[k]].unittyp%100],
X troops[k],
X cbonus(k));
X else
X fprintf(fpmsg,"%s\t%s is neutral with army %d (type %s, men %d, bonus=%d)\n",
X ntn[owner[j]].name,
X ntn[owner[k]].name,
X unit[k],
X unittype[ntn[owner[k]].arm[unit[k]].unittyp%100],
X ntn[owner[k]].arm[unit[k]].sold,
X cbonus(k));
X }
X
X fprintf(fpmsg,"%s\tattacking soldiers=%d\tmodified roll=%d-> attackers percent loss %d%%\n",ntn[owner[j]].name,asold,aroll,PAloss);
X fprintf(fpmsg,"%s\tdefending soldiers=%d\tmodified roll=%d-> defenders percent loss %d%%\n",ntn[owner[j]].name,dsold,droll,PDloss);
X fprintf(fpmsg,"%s\tODDS are %d to 100\n",ntn[owner[j]].name,odds);
X fprintf(fpmsg,"%s\tRESULT: Attackers lose %d men, Defenders lose %d men\n",ntn[owner[j]].name,Aloss, Dloss);
X if(retreatside==ATKR){
X fprintf(fpmsg,"%s\t\tAdditionally, All attackers retreat to %d %d\n",ntn[owner[j]].name,retreatx,retreaty);
X#ifdef DEBUG
X printf("%s\t\tAdditionally, All attackers retreat to %d %d\n",ntn[owner[j]].name,retreatx,retreaty);
X#endif DEBUG
X } else if(retreatside==DFND){
X fprintf(fpmsg,"%s\t\tAdditionally, All defenders retreat to %d %d\n",ntn[owner[j]].name,retreatx,retreaty);
X#ifdef DEBUG
X printf("%s\t\tAdditionally, All defenders retreat to %d %d\n",ntn[owner[j]].name,retreatx,retreaty);
X#endif DEBUG
X }
X fprintf(fpmsg,"%s\n","END");
X fclose(fpmsg);
X }
X }
X retreat();
X}
X
X/*Subroutine to determine combat bonuses for unit i in matrix*/
X/* returns int - bonus */
Xint
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==FOREST) 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,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,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 /*if a fortress*/
X if(sct[AXLOC][AYLOC].fortress!=0){
X /*Cavalry and Knights get -20%*/
X if((ATYPE == A_CAVALRY) ||(ATYPE == A_KNIGHT)) armbonus -= 20;
X /*Archers gain pluses*/
X else if((ATYPE == A_ARCHER)&&(side[num]==DFND)) armbonus += 15;
X else if((ATYPE == A_ARCHER)&&(side[num]==ATKR)) armbonus += 5;
X }
X
X /*Phalanx and Legionaires need certain numbers of troops*/
X if(((ATYPE!=A_PHALANX) || (ASOLD>500))
X &&((ATYPE!=A_LEGION) || (ASOLD>1000))){
X if(side[num]==ATKR) armbonus+= *(unitattack+(ATYPE%100));
X else armbonus+= *(unitdefend+(ATYPE%100));
X }
X
X return(armbonus);
X}
X
Xfdxyretreat() /* finds retreat location */
X{
X int x,y,nation=(-1);
X int xsctr= ntn[owner[0]].arm[unit[0]].xloc;
X int ysctr= ntn[owner[0]].arm[unit[0]].yloc;
X
X if((sct[xsctr][ysctr].designation==DCITY)
X ||(sct[xsctr][ysctr].designation==DCAPITOL)){
X retreatside=0;
X return;
X }
X retreatx=xsctr;
X retreaty=ysctr;
X
X if(retreatside == ATKR) nation=anation;
X else nation=dnation;
X
X for(x= xsctr-1; x<=xsctr+1; x++)
X for(y= ysctr-1; y<=ysctr+1; y++) if(ONMAP){
X if(tofood(sct[x][y].vegetation,0)==0) continue;
X if(((sct[x][y].owner == nation)
X ||(ntn[sct[x][y].owner].dstatus[nation] < NEUTRAL))
X ||(solds_in_sector( x, y, sct[x][y].owner) == 0)){
X retreatx=x;
X retreaty=y;
X#ifdef DEBUG
X printf("%d %d RETREAT TO %d %d\n",xsctr,ysctr,x,y);
X#endif DEBUG
X return;
X }
X }
X}
X
Xretreat()
X{
X int cnum;
X
X if(retreatside == 0) return;
X
X for(cnum=0;cnum<MGKNUM;cnum++) if(owner[cnum]!=(-1)){
X if(owner[cnum] > MAXNTN ) continue; /*monsts dont retreat */
X if((side[cnum]==ATKR)&&(retreatside==ATKR)){
X ntn[owner[cnum]].arm[unit[cnum]].xloc = retreatx;
X ntn[owner[cnum]].arm[unit[cnum]].yloc = retreaty;
X }
X else if((side[cnum]==DFND)&&(retreatside==DFND)){
X ntn[owner[cnum]].arm[unit[cnum]].xloc = retreatx;
X ntn[owner[cnum]].arm[unit[cnum]].yloc = retreaty;
X }
X }
X}
X
X/*SUBROUTINE TO RUN NAVAL COMBAT ON ALL SHIPS */
X/*just like fight, this takes array of owner,side,unit and calculate*/
Xvoid
Xnavalcbt()
X{
X FILE *fpmsg, *fopen();
X int sailor;
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<MGKNUM;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<MGKNUM;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 sailor=FALSE;
X for(j=0;j<MGKNUM;j++) if(owner[j]!=(-1)) if(side[j]==ATKR)
X if(magic(owner[j],SAILOR)==TRUE) sailor=TRUE;
X if(sailor==TRUE) for(i=0;i<aship;i++) if(rand()%10<=5) dsunk++;
X else for(i=0;i<aship;i++) if(rand()%10<=3) dsunk++;
X
X sailor=FALSE;
X for(j=0;j<MGKNUM;j++) if(owner[j]!=(-1)) if(side[j]==DFND)
X if(magic(owner[j],SAILOR)==TRUE) sailor=TRUE;
X if(sailor==TRUE) for(i=0;i<dship;i++) if(rand()%10<=4) asunk++;
X else for(i=0;i<dship;i++) if(rand()%10<=3) asunk++;
X
X#ifdef HIDELOC
X fprintf(fnews,"4.\tNaval Battle occurs");
X#else
X fprintf(fnews,"4.\t%d,%d: Naval Battle",ntn[owner[0]].nvy[unit[0]].xloc, ntn[owner[0]].nvy[unit[0]].yloc);
X#endif
X for(j=0;j<MGKNUM;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
X#ifdef HIDELOC
X fprintf(fnews,"4.\t\tNaval attackers lose %d of %d warships\n",
X min(asunk,aship),aship);
X fprintf(fnews,"4.\t\tNaval defenders lose %d of %d warships\n",
X min(dsunk,dship),dship);
X fprintf(fnews,"4.\t\tNaval attackers lose %d merchants\n",
X max(0,asunk-aship));
X fprintf(fnews,"4.\t\tNaval defenders lose %d merchants\n",
X max(0,dsunk-dship));
X#else
X fprintf(fnews,"4.\t%d,%d: Naval attackers lose %d of %d warships\n",
X ntn[owner[0]].nvy[unit[0]].xloc,
X ntn[owner[0]].nvy[unit[0]].yloc,min(asunk,aship),aship);
X fprintf(fnews,"4.\t%d,%d: Naval defenders lose %d of %d warships\n",
X ntn[owner[0]].nvy[unit[0]].xloc,
X ntn[owner[0]].nvy[unit[0]].yloc,min(dsunk,dship),dship);
X fprintf(fnews,"4.\t%d,%d: Naval attackers lose %d merchants\n",
X ntn[owner[0]].nvy[unit[0]].xloc,
X ntn[owner[0]].nvy[unit[0]].yloc,max(0,asunk-aship));
X fprintf(fnews,"4.\t%d,%d: Naval defenders lose %d merchants\n",
X ntn[owner[0]].nvy[unit[0]].xloc,
X ntn[owner[0]].nvy[unit[0]].yloc,max(0,dsunk-dship));
X#endif
X
X for(i=0;i<MGKNUM;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 * ntn[owner[i]].nvy[unit[i]].warships/aship;
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 * ntn[owner[i]].nvy[unit[i]].warships / dship;
X }
X }
X }
X /* take care of merchants*/
X for(i=0;i<MGKNUM;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<MGKNUM;j++) if(owner[j]!=(-1)){
X done=FALSE;
X
X /*first time your nation appears done=FALSE*/
X for(i=0;i<j;i++) if(owner[j]==owner[i]) done=TRUE;
X
X if((done==FALSE)&&(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(FAIL);
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<MGKNUM;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 24900 -ne `wc -c <combat.c`; then
echo shar: \"combat.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f npc.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"npc.c\"
else
echo shar: Extracting \"npc.c\" \(28401 characters\)
sed "s/^X//" >npc.c <<'END_OF_npc.c'
X/*conquer : Copyright (c) 1988 by Ed Barlow.
X * I spent a long time writing this code & I hope that you respect this.
X * I give permission to alter the code, but not to copy or redistribute
X * it without my explicit permission. If you alter the code,
X * please document changes and send me a copy, so all can have it.
X * This code, to the best of my knowledge works well, but it is my first
X * 'C' program and should be treated as such. I disclaim any
X * responsibility for the codes actions (use at your own risk). I guess
X * I am saying "Happy gaming", and am trying not to get sued in the process.
X * Ed
X */
X
X#include "header.h"
X#include "data.h"
X#include <ctype.h>
X
Xextern FILE *fnews;
X
Xextern short country;
Xextern int attr[MAPX][MAPY]; /*sector attactiveness*/
Xextern short movecost[MAPX][MAPY];
Xint peace; /*is 8 if at peace, 12 if at war*/
X
X/*ntn 1 is nation you are updating*/
Xvoid
Xnewdip(ntn1,ntn2)
X{
X if(ntn[ntn1].active<2) {
X if(ntn[ntn1].dstatus[ntn2]==UNMET)
X ntn[ntn1].dstatus[ntn2]=NEUTRAL;
X }
X else if(ntn[ntn1].race==ntn[ntn2].race){
X if(rand()%5<3) ntn[ntn1].dstatus[ntn2]=FRIENDLY;
X else if(rand()%2==0) ntn[ntn1].dstatus[ntn2]=ALLIED;
X else ntn[ntn1].dstatus[ntn2]=NEUTRAL;
X }
X else switch(ntn[ntn1].race) {
X case DWARF:
X switch(ntn[ntn2].race) {
X case ELF:
X ntn[ntn1].dstatus[ntn2]=HOSTILE;
X break;
X case HUMAN:
X ntn[ntn1].dstatus[ntn2]=NEUTRAL;
X break;
X case ORC:
X default:
X ntn[ntn1].dstatus[ntn2]=WAR;
X break;
X }
X break;
X case ELF:
X switch(ntn[ntn2].race) {
X case DWARF:
X ntn[ntn1].dstatus[ntn2]=HOSTILE;
X break;
X case HUMAN:
X ntn[ntn1].dstatus[ntn2]=NEUTRAL;
X break;
X case ORC:
X default:
X ntn[ntn1].dstatus[ntn2]=WAR;
X break;
X }
X break;
X case ORC:
X switch(ntn[ntn2].race) {
X case HUMAN:
X ntn[ntn1].dstatus[ntn2]=NEUTRAL;
X break;
X case DWARF:
X case ELF:
X default:
X ntn[ntn1].dstatus[ntn2]=WAR;
X break;
X }
X break;
X case HUMAN:
X switch(ntn[ntn2].race) {
X case DWARF:
X case ELF:
X ntn[ntn1].dstatus[ntn2]=NEUTRAL;
X break;
X case ORC:
X ntn[ntn1].dstatus[ntn2]=HOSTILE;
X break;
X default:
X ntn[ntn1].dstatus[ntn2]=WAR;
X break;
X }
X break;
X default:
X ntn[ntn1].dstatus[ntn2]=WAR;
X break;
X }
X}
X
Xvoid
Xmonster()
X{
X short nvynum,armynum;
X int x, y;
X
X /*move nomads randomly until within 2 of city then attack*/
X country=NNOMAD;
X for(armynum=0;armynum<MAXARM;armynum++) if(ASOLD>0){
X ASOLD *= 11;
X ASOLD /= 10;
X x=AXLOC+rand()%4-2;
X y=AYLOC+rand()%4-2;
X if(ONMAP&&(is_habitable(x,y))
X &&(land_reachp(AXLOC,AYLOC,x,y,ntn[country].arm[armynum].smove,country))){
X AXLOC=x;
X AYLOC=y;
X /*if owned & unoccupied you take & people flee*/
X if( (sct[x][y].owner) == 0 || solds_in_sector( x, y, sct[x][y].owner) == 0 ) {
X if(sct[x][y].owner==0)
X fprintf(fnews,"3.\tnomads take sector %d,%d\n",x,y);
X else fprintf(fnews,"3.\tnomads capture sector %d,%d\n",x,y);
X if(sct[x][y].owner!=0) flee(x,y,1,FALSE);
X sct[x][y].owner=NNOMAD;
X sct[x][y].designation=DDEVASTATED;
X }
X }
X }
X else {
X /*place a new Nomad army*/
X x=(rand()%(MAPX-8))+4;
X y=(rand()%(MAPY-8))+4;
X if((rand()%4==0)&&(is_habitable(x,y))) {
X AXLOC=x;
X AYLOC=y;
X ASOLD=100+100*(rand()%10);
X ATYPE=A_INFANTRY;
X ASTAT=ATTACK;
X }
X }
X country=NLIZARD;
X for(armynum=0;armynum<MAXARM;armynum++) if(ASOLD>0){
X ASOLD*=105;
X ASOLD/=100;
X }
X country=NPIRATE;
X fprintf(fnews,"2.\t%s are updated\n",ntn[NPIRATE].name);
X /*if pirate fleet within 3 attack if outnumber any fleets */
X for(nvynum=0;nvynum<MAXNAVY;nvynum++){
X for(x=1;x<MAXNTN;x++) for(y=0;y<MAXNAVY;y++)
X if((ntn[x].nvy[y].xloc-NXLOC<2)
X &&(sct[ntn[x].nvy[y].xloc][ntn[x].nvy[y].yloc].altitude==WATER)
X &&(ntn[x].nvy[y].xloc-NXLOC>(-2))
X &&(ntn[x].nvy[y].yloc-NYLOC<2)
X &&(ntn[x].nvy[y].yloc-NYLOC>(-2))){
X NXLOC= ntn[x].nvy[y].xloc;
X NYLOC= ntn[x].nvy[y].yloc;
X }
X /*add one warship to random pirate fleet*/
X if((NWAR>0)&&(rand()%3==0)) {
X NWAR++;
X NCREW+=SHIPCREW;
X }
X }
X}
X
X#ifdef NPC
X
Xvoid
Xn_redes(x,y,goldthresh,ironthresh,citythresh)
Xint goldthresh,ironthresh,citythresh;
X{
X register struct s_sector *sptr = &sct[x][y];
X
X if(sptr->designation == DCAPITOL) return;
X
X /*large enough for a city now?*/
X if(((sptr->people > (spread.civilians/CITYLIMIT))
X ||((spread.civilians<30000)&&(sptr->people>1000)))
X &&( spread.food > spread.civilians*3)
X &&( sptr->iron < ironthresh)
X &&( spread.incity+spread.incap < spread.civilians * CITYPERCENT / 100)
X &&( spread.sectors > 10)
X &&( sptr->gold < goldthresh)){
X sptr->designation=DCITY;
X spread.incity+=sptr->people;
X spread.infarm-=sptr->people;
X }
X
X /*not large enough for city and not enough food*/
X if((sptr->designation==DCITY)
X &&( spread.food < spread.civilians*2)
X &&( tofood(sptr->vegetation,sptr->owner) > citythresh )){
X sptr->designation=DFARM;
X spread.incity-=sptr->people;
X spread.infarm+=sptr->people;
X }
X
X if((sptr->designation==DCITY)
X &&( spread.incity+spread.incap > spread.civilians * CITYPERCENT / 66)){
X sptr->designation=DFARM;
X spread.incity-=sptr->people;
X spread.infarm+=sptr->people;
X }
X
X /*what if it is not a city*/
X if((sptr->designation!=DCITY)&&(sptr->designation!=DCAPITOL)){
X if(( sptr->gold >= goldthresh+2 )
X &&( sptr->iron < sptr->gold )){
X sptr->designation=DGOLDMINE;
X }
X else if( sptr->iron >= ironthresh ){
X sptr->designation=DMINE;
X }
X else if( sptr->gold >= goldthresh ){
X sptr->designation=DGOLDMINE;
X }
X else sptr->designation=DFARM;
X }
X}
X
Xvoid
Xredomil()
X{
X short x,y,armynum;
X int i, free, done, ideal, militia=0;
X long diff=0;
X int ok;
X
X#ifdef DEBUG
X check(__LINE__);
X#endif DEBUG
X /* check out any ship crews */
X for(armynum=1;armynum<MAXNAVY;armynum++) {
X if((ntn[country].nvy[armynum].merchant>0)
X || (ntn[country].nvy[armynum].warships>0))
X ntn[country].nvy[armynum].crew =
X (ntn[country].nvy[armynum].merchant+ntn[country].nvy[armynum].warships)*SHIPCREW;
X }
X#ifdef DEBUG
X check(__LINE__);
X#endif DEBUG
X /* code to check and move armies back if they are too far out */
X for(armynum=1;armynum<MAXARM;armynum++) if(ASOLD>0){
X ok = 0;
X for(x=AXLOC-3;x<=AXLOC+3;x++)
X for(y=AYLOC-3;y<=AYLOC+3;y++)
X if((ONMAP)&&(sct[x][y].owner==country)) ok=1;
X if(ok==0){
X AXLOC=ntn[country].capx;
X AYLOC=ntn[country].capy;
X }
X }
X for(armynum=1;armynum<MAXARM;armynum++)
X if((ASOLD>0)&&(ATYPE==A_MILITIA)){
X militia+=ASOLD;
X }
X ntn[country].tmil -= militia;
X
X /*make sure enough men in army 0 -- garrison duty in capitol*/
X armynum=0;
X ASTAT=GARRISON;
X ATYPE=A_INFANTRY;
X AXLOC=ntn[country].capx;
X AYLOC=ntn[country].capy;
X
X /*Ideally ASOLD[0]*MILINCAP=tmil*peace/10*/
X ideal = ntn[country].tmil * peace / (10*MILINCAP);
X if(ntn[country].tgold < 0) ideal/=2;
X#ifdef DEBUG
X if(peace==8)
X printf("\t%s IS AT PEACE - garrison in cap is %d, ideal is %d\n",ntn[country].name,ASOLD,ideal);
X else if(peace==12)
X printf("\t%s IS AT WAR - garrison in cap is %d, ideal is %d\n",ntn[country].name,ASOLD,ideal);
X else printf("error - incap is %d ideal is %d\n",ASOLD,ideal);
X#endif DEBUG
X
X /*MILRATIO ratio mil:civ for non player countries*/
X /*MILINCAP ratio (mil in cap):mil for NPCs*/
X#ifdef DEBUG
X check(__LINE__);
X#endif DEBUG
X
X if((ASOLD*10) < (9*ideal)){
X
X /*too few soldiers on garrison*/
X /*diff is number to change mil in cap (>0)*/
X if(ntn[country].tgold<0L) diff=0;
X else diff = (long) min(ideal-ASOLD,(int) (ntn[country].tiron / *(u_eniron + (ATYPE%100))));
X
X diff = (long) min ((int) diff, sct[ntn[country].capx][ntn[country].capy].people/2);
X
X if(ntn[country].tgold<0 || ntn[country].tiron<0) if(diff > 0) diff=0;
X
X#ifdef DEBUG
X printf("\tadding %d men to garrison (too few men on garrison)\n",diff);
X#endif DEBUG
X
X sct[ntn[country].capx][ntn[country].capy].people-=diff;
X ASOLD+=diff;
X ntn[country].tciv-=diff;
X ntn[country].tmil+=diff;
X if(magic(country,WARRIOR)==1) /* take WARRIOR power into account */
X ntn[country].tgold -= (diff * *(u_encost + (ATYPE%100))) / 2;
X else ntn[country].tgold-=diff* *(u_encost + (ATYPE%100));
X ntn[country].tiron-=(diff* *(u_eniron + (ATYPE%100)));
X#ifdef DEBUG
X if(ASOLD < 0) printf("error 2... ASOLD=%d <0\n",ASOLD);
X#endif DEBUG
X }
X /*else split garrison army if 1.25* needed number*/
X else if(ASOLD *4 > 5*ideal){
X /*diff here is a negative number*/
X diff=((4*ASOLD)-(5*ideal))/4;
X#ifdef DEBUG
X printf("\tsplit garrison of %d men\n",diff);
X#endif DEBUG
X free=0;
X ASOLD-=diff;
X#ifdef DEBUG
X if(ASOLD < 0) printf("error... subtracting %d from %d\n",diff,ASOLD);
X#endif DEBUG
X ntn[country].tmil-=diff;
X ntn[country].tciv+=diff;
X sct[ntn[country].capx][ntn[country].capy].people+=diff;
X /*I add back gold as armies get redone anyway*/
X ntn[country].tiron += (diff* *(u_eniron + (ATYPE%100)));
X if(magic(country,WARRIOR)==1) /* WARRIOR power */
X ntn[country].tgold+=(diff* *(u_encost + (ATYPE%100))) / 2;
X else ntn[country].tgold+=diff* *(u_encost + (ATYPE%100));
X }
X#ifdef DEBUG
X else printf("\tno action - ASOLD (%d) ~= ideal (%d)\n",ASOLD,ideal);
X printf("\tFinal Garrison Army %d (%s) type is %s men is %d\n",armynum,ntn[country].name,*(unittype+(ATYPE)),ASOLD);
X#endif DEBUG
X
X /*build ships and/or armies*/
X done=FALSE;
X ideal = ntn[country].tciv * peace / (10 * MILRATIO);
X if(ntn[country].tgold<0) { ideal*=4; ideal/=5; }
X#ifdef DEBUG
X printf("\t%s total military is %d -> ideal is %d\n",ntn[country].name,ntn[country].tmil,ideal);
X check(__LINE__);
X#endif DEBUG
X /*if < ideal build new army in the capitol - if possible*/
X if(ntn[country].tmil < ((4*ideal)/5)) {
X for(armynum=1;armynum<MAXARM;armynum++)
X if((done==FALSE)&&(ASOLD==0)) {
X done=TRUE;
X ATYPE=A_INFANTRY;
X ASOLD = min ((int) (ideal-ntn[country].tmil), (int) (ntn[country].tiron/ (*(u_eniron + (ATYPE%100)))));
X
X ASOLD = min (ASOLD,sct[ntn[country].capx][ntn[country].capy].people/2);
X ASOLD = min (ASOLD, (int) (ntn[country].tgold/ *(u_encost+(ATYPE%100))));
X if(ASOLD>0){
X#ifdef DEBUG
Xprintf("\tnot enough soldiers - build new army %d with %d men\n",armynum,ASOLD);
X#endif DEBUG
X ntn[country].tiron-=(ASOLD* *(u_eniron + (ATYPE%100)));
X AXLOC= ntn[country].capx;
X AYLOC= ntn[country].capy;
X ntn[country].tmil += ASOLD;
X ntn[country].tciv -= ASOLD;
X if(magic(country,WARRIOR)==1) /* WARRIOR power */
X ntn[country].tgold-=(ASOLD* *(u_encost + (ATYPE%100))) / 2;
X else ntn[country].tgold-=ASOLD* *(u_encost + (ATYPE%100));
X sct[AXLOC][AYLOC].people-=ASOLD;
X ASTAT= DEFEND;
X AMOVE=0;
X }
X else ASOLD=0;
X }
X#ifdef DEBUG
X check(__LINE__);
X#endif DEBUG
X } else if(ntn[country].tmil > (6*ideal/5)){
X#ifdef DEBUG
X check(__LINE__);
X#endif DEBUG
X /*disband a pseudo-random army*/
X done=FALSE;
X diff=ntn[country].tmil-(6*ideal/5);
X#ifdef DEBUG
X if(ASOLD < 0) printf("\ndisbanding pseudo random army of about %d men\n",diff);
X#endif DEBUG
X for(armynum=1;armynum<MAXARM;armynum++){
X if((done==FALSE)
X &&(ASOLD>0)
X &&(ATYPE!=A_MILITIA)
X &&(sct[AXLOC][AYLOC].owner==country)
X &&((sct[AXLOC][AYLOC].gold>4)
X ||(sct[AXLOC][AYLOC].iron>4)
X ||(sct[AXLOC][AYLOC].designation==DCITY))
X &&(ASOLD<=diff)){
X#ifdef DEBUG
X printf("\ttoo many soldiers eliminate army %d (%d men)\n",armynum,ASOLD);
X#endif DEBUG
X diff-=ASOLD;
X sct[AXLOC][AYLOC].people+=ASOLD;
X ntn[country].tmil -= ASOLD;
X ntn[country].tciv += ASOLD;
X ASOLD=0;
X if(diff<=50) done=TRUE;
X }
X#ifdef DEBUG
X if(ASOLD < 0) printf("error X... ASOLD=%d <0\n",ASOLD);
X#endif DEBUG
X }
X }
X#ifdef DEBUG
X check(__LINE__);
X#endif DEBUG
X#ifdef DEBUG
X printf("\twhew... new tmil is %d\n",ntn[country].tmil);
X#endif DEBUG
X
X /*resize armies */
X /*maximum npc army is 200 or tmil/20, minimum is 50*/
X for(armynum=1;armynum<MAXARM;armynum++){
X if((ASOLD>200)&&(ASOLD>ntn[country].tmil/20)) {
X free=FALSE;
X for(i=1;i<MAXARM;i++){
X if((free==0)&&(ntn[country].arm[i].sold==0)){
X free=1;
X ASOLD/=2;
X ATYPE=A_INFANTRY;
X ntn[country].arm[i].sold = ASOLD;
X ntn[country].arm[i].unittyp = A_INFANTRY;
X ntn[country].arm[i].smove = AMOVE;
X ntn[country].arm[i].stat = DEFEND;
X ntn[country].arm[i].xloc = AXLOC;
X ntn[country].arm[i].yloc = AYLOC;
X }
X }
X }
X /*minimum npc army is 50, merge them*/
X else if(ASOLD<50) {
X free=0;
X for(i=1;i<MAXARM;i++){
X if((ntn[country].arm[i].sold>0)
X &&(ntn[country].arm[i].xloc==AXLOC)
X &&(ntn[country].arm[i].yloc==AYLOC)
X &&(ntn[country].arm[i].unittyp==ATYPE)
X &&(i!=armynum)&&(free==0)){
X free=1;
X ntn[country].arm[i].sold += ASOLD;
X ntn[country].arm[i].unittyp=A_INFANTRY;
X ASOLD=0;
X }
X }
X }
X }
X#ifdef DEBUG
X check(__LINE__);
X#endif DEBUG
X
X /* assure that militia unit resides in each city */
X for(armynum=0;armynum<MAXARM;armynum++)
X if((ASOLD>0)&&(ATYPE==A_MILITIA)){
X#ifdef DEBUG
X printf("\t\t%s army %d (now %d men - populace %d)\n",unittype[ATYPE],armynum,ASOLD,sct[AXLOC][AYLOC].people);
X#endif DEBUG
X if((sct[AXLOC][AYLOC].designation!=DCITY)
X &&(sct[AXLOC][AYLOC].designation!=DCAPITOL)){
X#ifdef DEBUG
X printf("\teliminating %s army %d as %d %d is des:%c alt:%c own:%d\n",unittype[ATYPE],armynum,AXLOC,AYLOC,sct[AXLOC][AYLOC].designation,sct[AXLOC][AYLOC].altitude,sct[AXLOC][AYLOC].owner);
X#endif DEBUG
X if(sct[AXLOC][AYLOC].owner == country)
X sct[AXLOC][AYLOC].people+=ASOLD;
X else
X sct[ntn[country].capx][ntn[country].capy].people+=ASOLD;
X ASOLD=0;
X }
X }
X
X if(ntn[country].tgold > 0)
X for(x=0;x<MAPX;x++) for(y=0;y<MAPY;y++)
X if((sct[x][y].owner==country)
X &&((sct[x][y].designation==DCITY)||(sct[x][y].designation==DCAPITOL))){
X free=FALSE;
X for(armynum=0;armynum<MAXARM;armynum++){
X if((ASOLD>0)
X &&(AXLOC==x)&&(AYLOC==y)
X &&(ATYPE==A_MILITIA)) {
X free=TRUE;
X break;
X }
X }
X if(free==FALSE) { /* draft a new militia army */
X for(armynum=0;armynum<MAXARM;armynum++) if(ASOLD==0){
X ATYPE=A_MILITIA;
X AXLOC=x;
X AYLOC=y;
X free=TRUE;
X break;
X }
X }
X if((free==TRUE)) {
X /* want to add ideal troops */
X ideal = sct[x][y].people/MILINCITY - ASOLD;
X ideal = min(ideal, 250);
X if(ideal>0){
X if(magic(country,WARRIOR)==TRUE){ /* WARRIOR power */
X ntn[country].tgold-=
X (ideal* *(u_encost+ATYPE))/2;
X } else {
X ntn[country].tgold-=
X ideal* *(u_encost + ATYPE);
X }
X }
X ASOLD+=ideal;
X ASTAT=GARRISON;
X#ifdef DEBUG
X if(ATYPE!=A_MILITIA) printf("ERROR - NOT MILITIA\n");
X printf("\tadding %d troops to %s army %d (now %d men - populace %d)\n",ideal,unittype[ATYPE],armynum,ASOLD,sct[x][y].people);
X#endif DEBUG
X }
X }
X#ifdef DEBUG
X check(__LINE__);
X#endif DEBUG
X
X /* if archer power - all units are archers */
X if(magic(country,ARCHER)==1)
X for(armynum=1;armynum<MAXARM;armynum++)
X if((ASOLD>0)&&(ATYPE!=A_MILITIA)) ATYPE=A_ARCHER;
X}
X
Xvoid
Xgetdstatus()
X{
X int x,oldstat[MAXNTN];
X
X if(ntn[country].active<=1) return;
X
X for(x=1;x<MAXNTN;x++) {
X oldstat[x] = ntn[country].dstatus[x];
X /*if they at war with you go to war with them*/
X if(ntn[x].dstatus[country]>=WAR) {
X if(ntn[country].dstatus[x]<WAR)
X fprintf(fnews,"2.\tnation %s returns %s's declaration of war\n",ntn[country].name,ntn[x].name);
X
X ntn[country].dstatus[x]=WAR;
X } else
X if((ntn[country].dstatus[x]!=UNMET)
X &&(ntn[country].dstatus[x]!=JIHAD)
X &&(ntn[country].dstatus[x]!=CONFEDERACY)
X &&(ntn[country].active!=1)){
X if((ntn[x].tmil>4*ntn[country].tmil)
X &&(ntn[x].score>4*ntn[country].score)){
X if(rand()%3==0) {
X ntn[country].dstatus[x]=WAR;
X } else if(rand()%8==0) {
X ntn[country].dstatus[x]=JIHAD;
X }
X }
X /*if 2* mil and 2* score then not like them*/
X else if((ntn[x].tmil>2*ntn[country].tmil)
X &&(ntn[x].score>2*ntn[country].score)){
X if((ntn[country].dstatus[x]!=WAR)
X &&(ntn[x].race!=ntn[country].race)){
X if(rand()%3==0)
X ntn[country].dstatus[x]++;
X }
X }
X /*adjust based on your status with them*/
X if((ntn[country].dstatus[x]==WAR)
X &&(ntn[x].dstatus[country]<WAR))
X if(rand()%3==0) ntn[country].dstatus[x]--;
X
X if((ntn[country].dstatus[x]<WAR)
X &&(ntn[country].dstatus[x]>ALLIED)){
X if(ntn[x].dstatus[country]>1+ntn[country].dstatus[x]){
X if(rand()%3==0)
X ntn[country].dstatus[x]++;
X }
X else
X if(ntn[x].dstatus[country]+1<ntn[country].dstatus[x]){
X if(rand()%3==0)
X ntn[country].dstatus[x]--;
X }
X if(ntn[x].race==ntn[country].race)
X if(rand()%3==0)
X ntn[country].dstatus[x]--;
X }
X if(rand()%6==0) {
X if(ntn[country].dstatus[x]!=JIHAD)
X ntn[country].dstatus[x]++;
X }
X else if((rand()%5==0)
X &&(ntn[country].dstatus[x]!=CONFEDERACY)) {
X ntn[country].dstatus[x]--;
X }
X }
X }
X
X for(x=1;x<MAXNTN;x++)
X if(ntn[x].active>1){
X if((rand()%5==0)
X &&(ntn[x].dstatus[country]==WAR)
X &&(ntn[country].dstatus[x]==WAR)) {
X ntn[x].dstatus[country]=HOSTILE;
X ntn[country].dstatus[x]=HOSTILE;
X fprintf(fnews,"2.\tnation %s and %s announce ceasefire\n",ntn[country].name,ntn[x].name);
X } else if((oldstat[x]==WAR)&&(ntn[country].dstatus[x]==WAR)){
X fprintf(fnews,"2.\tnation %s stays at war with %s\n",ntn[country].name,ntn[x].name);
X } else if((oldstat[x]<WAR)&&(ntn[country].dstatus[x]==WAR)){
X fprintf(fnews,"2.\tnation %s goes to war with %s\n",ntn[country].name,ntn[x].name);
X } else if((oldstat[x]!=JIHAD)&&(ntn[country].dstatus[x]==JIHAD)){
X fprintf(fnews,"2.\tnation %s announces a jihad with %s\n",ntn[country].name,ntn[x].name);
X }
X }
X}
X
Xint
Xnationrun()
X{
X int goldthresh,ironthresh,citythresh;
X int armynum,loop;
X int x,y,i;
X long zz;
X
X#ifdef DEBUG
X check(__LINE__);
X#endif DEBUG
X prep(country);
X
X /* is there an error*/
X if((sct[ntn[country].capx][ntn[country].capy].owner==country)
X &&(sct[ntn[country].capx][ntn[country].capy].designation!=DCAPITOL)){
X sct[ntn[country].capx][ntn[country].capy].designation=DCAPITOL;
X }
X
X getdstatus();
X
X /*move units */
X /*are they at war with any normal countries*/
X peace=0;
X for(i=1;i<MAXNTN;i++) if(ntn[country].dstatus[i]>peace)
X peace=ntn[country].dstatus[i];
X
X#ifdef DEBUG
X check(__LINE__);
X#endif DEBUG
X if(peace<WAR){
X peace=8;
X pceattr();
X } else {
X /*if war then attack &/or expand */
X peace=12;
X /*are they attacking or defending */
X if(ntn[country].tmil==0) defattr();
X else for(x=0;x<MAXNTN;x++) if(ntn[country].dstatus[x]>HOSTILE){
X if(100*(ntn[country].tmil*(ntn[country].aplus+100))/((ntn[country].tmil*(ntn[country].aplus+100))+(ntn[x].tmil*(ntn[x].dplus+100)))>rand()%100){
X /*attacker*/
X for(armynum=1;armynum<MAXARM;armynum++)
X if((ASOLD>0)&&(ATYPE!=A_MILITIA))
X ASTAT=ATTACK;
X atkattr();
X }
X /*defender*/
X else {
X for(armynum=1;armynum<MAXARM;armynum++)
X if((ASOLD>0)&&(ATYPE!=A_MILITIA)){
X if(ASOLD<350) ASTAT=DEFEND;
X else ASTAT=ATTACK;
X }
X defattr();
X }
X }
X }
X#ifdef DEBUG
X check(__LINE__);
X#endif DEBUG
X for(armynum=1;armynum<MAXARM;armynum++)
X if((ASOLD!=0)
X &&(ATYPE!=A_MILITIA)) armymove(armynum);
X
X /* INTELLIGENT SECTOR REDESIGNATION */
X if(ntn[country].active!=1) { /* no pc's */
X goldthresh=4;
X ironthresh=4;
X citythresh=10;
X for(loop=1;loop<5;loop++) {
X#ifdef DEBUG
X printf("\tnpcredes(): country %s, food %ld gold %d, iron %d, city %d\n",ntn[country].name,spread.food,goldthresh,ironthresh,citythresh);
X#endif DEBUG
X
X for(x=0;x<MAPX;x++) for(y=0;y<MAPY;y++)
X if((sct[x][y].owner==country)
X &&(is_habitable(x,y)))
X n_redes(x,y,goldthresh,ironthresh,citythresh);
X
X spreadsheet(country);
X
X if(spread.food < spread.civilians * 2L) {
X goldthresh++;
X ironthresh++;
X citythresh--;
X } else if(spread.food > spread.civilians * 3L) {
X if(rand()%2==0) goldthresh--;
X else ironthresh--;
X if(goldthresh==0) goldthresh=1;
X if(ironthresh==0) ironthresh=1;
X citythresh++;
X }
X else break;
X }
X }
X
X /*build forts in any cities*/
X if(ntn[country].active!=1) for(x=0;x<MAPX;x++) for(y=0;y<MAPY;y++)
X if(((sct[x][y].designation==DCITY)
X ||(sct[x][y].designation==DCAPITOL))
X &&(sct[x][y].owner==country)
X &&(sct[x][y].fortress<10)
X &&(ntn[country].tgold>10000)
X &&(rand()%5==0)
X &&(sct[x][y].fortress<(sct[x][y].people%1000)))
X sct[x][y].fortress++;
X#ifdef DEBUG
X check(__LINE__);
X#endif DEBUG
X /*redo mil*/
X if(ntn[country].active!=1) redomil();
X#ifdef DEBUG
X check(__LINE__);
X#endif DEBUG
X
X /*buy new powers and/or new weapons*/
X if(getmgkcost(M_MIL,country) < getmgkcost(M_CIV,country)){
X if(ntn[country].jewels > getmgkcost(M_MIL,country)) {
X ntn[country].jewels-=getmgkcost(M_MIL,country);
X if((zz=getmagic(M_MIL))!=0){
X fprintf(fnews,"1.\tnation %s gets combat power number %d\n",ntn[country].name,zz);
X printf("\tnation %s gets combat power number %d\n",ntn[country].name,zz);
X exenewmgk(zz);
X } else if((zz=getmagic(M_MIL))!=0){
X fprintf(fnews,"1.\tnation %s gets combat power number %d\n",ntn[country].name,zz);
X printf("\tnation %s gets combat power number %d\n",ntn[country].name,zz);
X exenewmgk(zz);
X }
X else ntn[country].jewels+=getmgkcost(M_MIL,country);
X }
X } else {
X if(ntn[country].jewels > getmgkcost(M_CIV,country)) {
X ntn[country].jewels-=getmgkcost(M_CIV,country);
X if((zz=getmagic(M_CIV))!=0){
X fprintf(fnews,"1.\tnation %s gets civilian power number %d\n",ntn[country].name,zz);
X printf("\tnation %s gets civilian power number %d\n",ntn[country].name,zz);
X exenewmgk(zz);
X }
X else if((zz=getmagic(M_CIV))!=0){
X fprintf(fnews,"1.\tnation %s gets civilian power number %d\n",ntn[country].name,zz);
X printf("\tnation %s gets civilian power number %d\n",ntn[country].name,zz);
X exenewmgk(zz);
X }
X else ntn[country].jewels+=getmgkcost(M_CIV,country);
X }
X }
X
X#ifdef DEBUG
X check(__LINE__);
X#endif DEBUG
X if(magic(country,VAMPIRE)!=1) {
X i=0;
X if(magic(country,WARLORD)==1) i=30;
X else if(magic(country,CAPTAIN)==1) i=20;
X else if(magic(country,WARRIOR)==1) i=10;
X x = max ( ntn[country].aplus-i, 10 ) / 10;
X /* SHOULD USE spread.iron but it didnt work right */
X if(ntn[country].tiron > 3 * IRONORE * ntn[country].tmil*x*x){
X ntn[country].aplus+=1;
X ntn[country].dplus+=1;
X ntn[country].tiron-=2*IRONORE*ntn[country].tmil*x*x;
X printf("\tnation %s buys +1 percent attack and defence\n",ntn[country].name);
X }
X }
X}
X
X/* make sectors of those with whom you are peaceful attr = 1 */
Xn_atpeace()
X{
X register int x,y;
X for(x=0;x<MAPX;x++) for(y=0;y<MAPY;y++)
X if((sct[x][y].owner!=0)
X &&(ntn[country].dstatus[sct[x][y].owner]<WAR)
X &&(abs(x-ntn[country].capx)>2)
X &&(abs(y-ntn[country].capy)>2))
X attr[x][y]=1;
X}
X
X/* you are too far from capitol */
Xn_toofar()
X{
X register int x,y;
X for(x=ntn[country].capx+NPCTOOFAR;x<MAPX;x++)
X for(y=0;y<MAPY;y++) if(ONMAP)
X attr[x][y]=1;
X for(y=ntn[country].capy+NPCTOOFAR;y<MAPY;y++)
X for(x=0;x<MAPY;x++) if(ONMAP)
X attr[x][y]=1;
X for(x=0;x<ntn[country].capx-NPCTOOFAR;x++)
X for(y=0;y<MAPY;y++) if(ONMAP)
X attr[x][y]=1;
X for(y=0;y<ntn[country].capy-NPCTOOFAR;y++)
X for(x=0;x<MAPY;x++) if(ONMAP)
X attr[x][y]=1;
X}
X
X/* take undefended land */
Xn_unowned()
X{
X register int x,y;
X int dist;
X
X /* around capitol */
X for(x=ntn[country].capx-4;x<=ntn[country].capx+4;x++){
X for(y=ntn[country].capy-4;y<=ntn[country].capy+4;y++){
X if((ONMAP)&&(sct[x][y].owner==0)) {
X /* find distance btwn x,y and cap */
X dist=abs(x-ntn[country].capx)+abs(y,ntn[country].capy);
X if(dist<10) attr[x][y]+= 500 - 50*dist;
X }
X }
X }
X
X for(x=0;x<MAPX;x++) {
X for(y=0;y<MAPY;y++) {
X /*add to attractiveness for unowned sectors*/
X if(sct[x][y].owner == 0) {
X attr[x][y]+=100;
X } else {
X if(sct[x][y].owner == NNOMAD)
X attr[x][y]+=25;
X }
X }
X }
X if(is_habitable(x,y) == 0) attr[x][y] /= 5;
X}
Xvoid
Xn_defend(natn)
Xregister short natn;
X{
X int x,y;
X
X /* add 1/10th of soldiers in sector */
X for(x=1;x<MAXARM;x++) if(ntn[natn].arm[x].sold > 0)
X if(sct[ntn[natn].arm[x].xloc][ntn[natn].arm[x].yloc].owner==country)
X attr[ntn[natn].arm[x].xloc][ntn[natn].arm[x].yloc] +=
X ntn[natn].arm[x].sold/10;
X
X /*plus 80 if near your capitol */
X for(x=ntn[country].capx-1;x<=ntn[country].capy+1;x++){
X for(y=ntn[country].capy-1;y<=ntn[country].capy+1;y++){
X if(ONMAP) attr[x][y]+=80;
X }
X }
X
X /*plus based on defensive value*/
X for(x=0;x<MAPX;x++) for(y=0;y<MAPY;y++) {
X if(movecost[x][y]==1) attr[x][y] += 50;
X else if(movecost[x][y]<=3) attr[x][y] += 20;
X else if(movecost[x][y]<=5) attr[x][y] += 10;
X
X if((sct[x][y].designation==DCITY)
X &&((sct[x][y].owner==country)||(sct[x][y].owner==natn))){
X attr[x][y] += 50;
X }
X }
X}
X
Xvoid
Xn_attack(nation)
Xregister short nation;
X{
X register int x,y;
X
X /*plus 40 if next to their capitol */
X for(x=ntn[nation].capx-1;x<=ntn[nation].capy+1;x++){
X for(y=ntn[nation].capy-1;y<=ntn[nation].capy+1;y++){
X if((sct[x][y].owner==nation)&&(ONMAP))
X attr[x][y]+=40;
X }
X }
X
X /*plus 100 if on their capitol*/
X attr[ntn[nation].capx][ntn[nation].capy]+=100;
X}
X
X/* +100 if undefended sectors of nation, +60 if not */
Xvoid
Xn_undefended( nation )
X{
X register int x,y;
X for(x=0;x<MAPX;x++) for(y=0;y<MAPY;y++) if(sct[x][y].owner==nation){
X if(is_habitable(x,y) == 0) {
X attr[x][y] += 30;
X } else if(occ[x][y]==0) {
X attr[x][y]+=100;
X } else {
X attr[x][y]+=60;
X }
X }
X}
X
X/* +60 if between two capitols */
Xvoid
Xn_between(nation)
Xint nation;
X{
X int x1,x2,y1,y2,x,y;
X
X /*plus if strategic blocking sector*/
X
X /*+60 if between the two capitol*/
X if (ntn[nation].capx < ntn[country].capx){
X x1=ntn[nation].capx;
X x2=ntn[country].capx;
X } else {
X x1=ntn[country].capx;
X x2=ntn[nation].capx;
X }
X if (ntn[nation].capy < ntn[country].capy){
X y1=ntn[nation].capy;
X y2=ntn[country].capy;
X }
X else {
X y1=ntn[country].capy;
X y2=ntn[nation].capy;
X }
X
X for(x=x1;x<=x2;x++) for(y=y1;y<=y2;y++) {
X if(ONMAP) attr[x][y]+=60;
X }
X}
X
X/* if in jeopardy, move to survive
X * if within two of cap add 1/5th of men
X * if on cap and war and 2x your garrison go jihad and + 1/2 men
X */
Xvoid
Xn_survive()
X{
X register struct army *aptr;
X int nation,armynum;
X
X if(sct[ntn[country].capy][ntn[country].capy].owner!=country){
X attr[ntn[country].capy][ntn[country].capy]=1000;
X }
X
X /*defend your capitol if occupied, +50 more if with their army*/
X for(nation=1;nation<MAXNTN;nation++)
X if((ntn[nation].active != 0)
X &&((ntn[nation].dstatus[country]>=WAR)
X ||(ntn[country].dstatus[nation]>=WAR))){
X for(armynum=1;armynum<MAXARM;armynum++)
X if(ntn[nation].arm[armynum].sold > 0) {
X
X aptr = &(ntn[nation].arm[armynum]);
X
X if((aptr->xloc==ntn[nation].capx)
X &&(aptr->yloc==ntn[nation].capy)){
X if(aptr->sold>2*ntn[country].arm[0].sold){
X attr[aptr->xloc][aptr->yloc]+=
X aptr->sold/2;
X } else {
X attr[aptr->xloc][aptr->yloc]+=
X aptr->sold/5;
X }
X }
X else if((aptr->xloc<=ntn[nation].capx+2)
X &&(aptr->xloc>=ntn[nation].capx-2)
X &&(aptr->yloc<=ntn[nation].capy+2)
X &&(aptr->yloc>=ntn[nation].capy-2)){
X attr[aptr->xloc][aptr->yloc]+=aptr->sold/5;
X
X }
X }
X }
X}
X
Xvoid
Xdefattr()
X{
X int nation;
X
X n_unowned();
X
X for(nation=1;nation<MAXNTN;nation++)
X if((ntn[nation].active!=0)&&(ntn[country].dstatus[nation]>=WAR)) {
X n_defend(nation);
X n_between(nation);
X n_undefended(nation);
X }
X
X n_toofar();
X n_survive();
X}
X
X/*calculate attractiveness of attacking sectors*/
Xvoid
Xatkattr()
X{
X int nation;
X
X n_unowned();
X
X /*adjust for each nation that you are at war with*/
X for(nation=1;nation<MAXNTN;nation++)
X if(ntn[country].active!=0)
X if(ntn[country].dstatus[nation]==WAR) {
X n_between(nation);
X n_undefended(nation);
X n_attack(nation);
X } else if(ntn[country].dstatus[nation]==JIHAD) {
X n_attack(nation);
X n_attack(nation);
X n_between(nation);
X n_undefended(nation);
X n_attack(nation);
X n_between(nation);
X n_undefended(nation);
X n_attack(nation);
X }
X
X n_toofar();
X n_survive();
X}
X
X/*calculate attractiveness when at peace*/
Xint
Xpceattr()
X{
X n_unowned();
X n_atpeace();
X n_toofar();
X n_survive();
X}
X#endif
X
X#ifdef DEBUG
Xcheck(line)
Xint line;
X{
X int armynum;
X for(armynum=0;armynum<MAXARM;armynum++)
X if(ASOLD<0) {
X printf("ERROR: line %d army %d nation %s soldier %d\n",line,armynum,ntn[country].name,ASOLD);
X ASOLD=0;
X }
X if((AXLOC>MAPX)||(AYLOC>MAPY)){
X printf("CHECK ERROR: line %d army %d nation %s loc %d %d\n",line,armynum,ntn[country].name,AXLOC,AYLOC);
X }
X if(ntn[country].tiron < 0L)
X printf("ERROR: line %d nation %s iron is %ld\n",line,ntn[country].name,ntn[country].tiron);
X if(ntn[country].tfood < 0L)
X printf("ERROR: line %d nation %s food is %ld\n",line,ntn[country].name,ntn[country].tfood);
X if(ntn[country].jewels < 0L)
X printf("ERROR: line %d nation %s jewels is %ld\n",line,ntn[country].name,ntn[country].jewels);
X}
X#endif DEBUG
END_OF_npc.c
if test 28401 -ne `wc -c <npc.c`; then
echo shar: \"npc.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 2 \(of 8\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 8 archives.
rm -f ark[1-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0