games-request@tekred.TEK.COM (10/26/87)
Submitted by: ihnp4!mhuxd!smile (E.BARLOW)
Comp.sources.games: Volume 2, Issue 59
Archive-name: conquest/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 5)."
# Contents: combat.c magic.c newlogin.c
# Wrapped by billr@tekred on Mon Oct 26 10:33:03 1987
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\" \(18977 characters\)
sed "s/^X//" >combat.c <<'END_OF_combat.c'
X/*conquest 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
X#define ATKR 2
X#define DFND 1
X
X/*is sector occupied, if MAXNTN+1 2+ armies occupy*/
Xextern short occ[MAPX][MAPY];
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 30,20,15,15,15,15,15,15,15,10,10,10,5,5,5,0,0,0,0,0,0
X};
Xint Cbt5_1[]={
X 40,30,20,20,20,20,15,15,15,10,10,10,5,5,5,0,0,0,0,0,0
X};
Xint Cbt4_1[]={
X 40,35,30,25,25,20,20,15,15,15,10,10,10,5,5,5,0,0,0,0,0
X};
Xint Cbt3_1[]={
X 55,45,35,30,25,25,20,20,20,15,15,10,10,10,5,5,5,0,0,0,0
X};
Xint Cbt2_1[]={
X 60,50,35,35,35,35,25,25,20,20,15,15,10,10,10,10,10,5,5,5,0
X};
Xint Cbt3_2[]={
X 65,55,35,35,35,35,30,30,25,25,20,20,15,15,15,15,15,10,10,10,0
X};
Xint Cbt5_4[]={
X 65,55,45,45,45,45,35,35,30,30,30,30,25,25,25,25,25,15,10,10,10
X};
Xint Cbt1_1[]={
X 85,65,55,55,55,55,45,45,35,35,35,35,25,25,25,25,25,15,10,10,10
X};
Xint Cbt4_5[]={
X 100,75,65,65,65,65,55,55,45,45,45,45,35,35,35,35,35,25,20,15,10
X};
Xint Cbt2_3[]={
X 100,85,75,75,65,65,55,55,45,45,45,45,40,40,35,35,35,35,25,20,10
X};
Xint Cbt1_2[]={
X 100,100,95,90,80,80,75,75,65,60,60,60,45,50,45,45,45,35,30,25,10
X};
Xint Cbt1_3[]={
X 110,110,100,100,90,90,85,85,80,80,70,70,65,65,55,50,45,40,30,25,10
X};
Xint Cbt1_4[]={
X 110,110,100,100,90,90,90,85,80,80,70,70,65,65,55,50,45,40,30,25,10
X};
Xint Cbt1_5[]={
X 120,110,110,100,100,90,90,90,80,80,70,70,65,65,55,50,45,40,30,25,10
X};
Xint Cbt1_6[]={
X 130,120,110,110,110,100,100,90,90,90,80,80,80,70,65,50,45,40,30,25,10
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)&&(ntn[anation].arm[j].sold>0)&&(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++) if(ntn[country].active!=0) for(armynum=0;armynum<MAXARM;armynum++) if((ASOLD>0)&&(ASTAT!=SCOUT)&&(AXLOC==ntn[anation].arm[j].xloc)&&(AYLOC==ntn[anation].arm[j].yloc)&&(count<32)) {
X
X if((country!=anation)&&(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)&&(fought[ntn[anation].nvy[j].xloc][ntn[anation].nvy[j].yloc]==0)&&(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++) if(ntn[country].active!=0) for(nvynum=0;nvynum<MAXNAVY;nvynum++) if((NWAR+NMER>0)&&(abs(NXLOC-ntn[anation].nvy[j].xloc)<=1)&&(abs(NYLOC-ntn[anation].nvy[j].yloc)<=1)&&(count<32)) {
X fought[ntn[country].nvy[nvynum].xloc][ntn[country].nvy[nvynum].yloc]=1;
X if((country!=anation)&&(ntn[anation].dstatus[country]>HOSTILE)){
X valid=1;
X dnation=country;
X }
X unit[count]=armynum;
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 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;
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("ERROR 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 = rand()%100 + 50 + abonus - dbonus;
X droll = rand()%100 + 50 + abonus - dbonus;
X
X if(aroll<0) aroll=0;
X if(aroll>199) aroll=199;
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
X if ((fpmsg=fopen(MSGFILE,"a+"))==NULL) {
X printf("\n\tERROR OPENING %s",MSGFILE);
X exit(1);
X }
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 * 1.2)/(100+2*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 }
X else if(side[i]==DFND){
X loss=(ntn[owner[i]].arm[unit[i]].sold * PDloss * 1.2)/(100+2*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)) vampire+=loss/2;
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\n",ntn[owner[j]].name,asold,aroll);
X fprintf(fpmsg,"%s defending soldiers=%d\tmodified roll=%d\n",ntn[owner[j]].name,dsold,droll);
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)||(magic(country,DERVISH)==1))&&((sct[AXLOC][AYLOC].vegitation==ICE)||(sct[AXLOC][AYLOC].vegitation==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].vegitation==JUNGLE) armbonus+=20;
X else if(sct[AXLOC][AYLOC].vegitation==FORREST) armbonus+=15;
X else if(sct[AXLOC][AYLOC].vegitation==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)&&(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)&&(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)||(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)||(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 int done=0;
X int temp1,temp2;
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 taloss=0,tdloss=0; /*total a's and d's total losses*/
X register int k,i,j;
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)&&(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 /*RUN COMBAT; loop until done*/
X /*determine relative strengths--does anybody try to flee*/
X
X while(done==0){
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 10%; once all warships sunk then all*/
X /*sunk are are captured merchant*/
X for(i=0;i<32;i++)
X if((owner[i]!=(-1))&&(ntn[owner[i]].nvy[unit[i]].warships>0)){
X for(j=0;j<ntn[owner[i]].nvy[unit[i]].warships;j++)
X if(side[j]==ATKR) if(rand()%10==0) asunk++;
X else if(rand()%10==0) dsunk++;
X }
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 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
X fprintf(fnews,"\n4.\tthis round attackers lose %d of %d warships (remainder prizes)",asunk,aship);
X fprintf(fnews,"\n4.\tthis round defenders lose %d of %d warships (remainder prizes)",dsunk,dship);
X
X taloss+=asunk;
X tdloss+=dsunk;
X
X if ((fpmsg=fopen(MSGFILE,"a+"))==NULL) {
X fprintf(fnews,"\n4.\tERROR OPENING %s",MSGFILE);
X exit(1);
X }
X
X for(i=0;i<32;i++) if(owner[i]!=(-1)){
X if((asunk>0)&&(side[i]==ATKR)){
X if(asunk>ntn[owner[i]].nvy[unit[i]].warships) {
X asunk-=ntn[owner[i]].nvy[unit[i]].warships;
X ntn[owner[i]].nvy[unit[i]].warships=0;
X }
X else {
X ntn[owner[i]].nvy[unit[i]].warships-=asunk;
X asunk=0;
X }
X }
X else if((dsunk>0)&&(side[i]==DFND)){
X if(dsunk>ntn[owner[i]].nvy[unit[i]].warships) {
X dsunk-=ntn[owner[i]].nvy[unit[i]].warships;
X ntn[owner[i]].nvy[unit[i]].warships=0;
X }
X else {
X ntn[owner[i]].nvy[unit[i]].warships-=dsunk;
X dsunk=0;
X }
X }
X }
X
X /*prizes*/
X if(dsunk+asunk>0) {
X
X temp1=asunk;
X temp2=dsunk;
X for(i=0;i<32;i++) if(owner[i]!=(-1)){
X if((dsunk>0)&&(side[i]==ATKR)){
X ntn[owner[i]].nvy[unit[i]].merchant+=dsunk;
X dsunk=0;
X if(rand()%2==0) done=1;
X }
X if((asunk>0)&&(side[i]==DFND)){
X ntn[owner[i]].nvy[unit[i]].merchant+=asunk;
X asunk=0;
X if(rand()%2==0) done=1;
X }
X }
X asunk=temp1;
X dsunk=temp2;
X
X /*remove prizes?*/
X for(i=0;i<32;i++) if(owner[i]!=(-1)){
X if((asunk>0)&&(side[i]==ATKR)){
X if(asunk>aship) {
X asunk-=ntn[owner[i]].nvy[unit[i]].merchant;
X ntn[owner[i]].nvy[unit[i]].merchant=0;
X }
X else {
X ntn[owner[i]].nvy[unit[i]].merchant-=asunk;
X asunk=0;
X }
X }
X else if((dsunk>0)&&(side[i]==DFND)){
X if(dsunk>dship) {
X dsunk-=ntn[owner[i]].nvy[unit[i]].merchant;
X ntn[owner[i]].nvy[unit[i]].merchant=0;
X }
X else {
X ntn[owner[i]].nvy[unit[i]].merchant-=dsunk;
X dsunk=0;
X }
X }
X }
X }
X
X /*will round continue; does one side wish to withdraw*/
X if(rand()%3==0) done=1;
X else if((taloss>1.5*tdloss)||(tdloss>1.5*taloss)){
X if(rand()%3==0) done=1;
X }
X }
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
X fprintf(fpmsg,"%s NAVAL BATTLE SUMMARY for sector %d, %d\n",ntn[owner[j]].name,ntn[owner[0]].nvy[unit[0]].xloc, ntn[owner[0]].nvy[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++)
X if((owner[k]!=owner[j]&&(owner[k]!=(-1)))){
X if(side[k]==DFND) 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, taloss,tdloss);
X fprintf(fpmsg,"END\n");
X }
X }
X
X fclose(fpmsg);
X}
END_OF_combat.c
if test 18977 -ne `wc -c <combat.c`; then
echo shar: \"combat.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f magic.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"magic.c\"
else
echo shar: Extracting \"magic.c\" \(9276 characters\)
sed "s/^X//" >magic.c <<'END_OF_magic.c'
X/*conquest 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/*create a new login for a new player*/
X#include "header.h"
X#include <ctype.h>
X
Xextern short country;
Xextern short redraw;
Xextern FILE *fexe;
Xextern FILE *fnews;
X
X/*give player one new magic power in current magic (powers)*/
X/*do nothing if that player has that power or it is not permitted*/
X/*getmagic() returns the value of the power gained, and stores it in power*/
X
Xgetmagic()
X{
Xshort newpower;
X newpower=rand()%MAXPOWER;
X switch(newpower){
X case WARRIOR:
X case CAPTAIN:
X case WARLORD:
X if(magic(country,WARRIOR)!=1){
X ntn[country].powers*=WARRIOR;
X return(WARRIOR);
X }
X else if(magic(country,CAPTAIN)!=1){
X ntn[country].powers*=CAPTAIN;
X return(CAPTAIN);
X }
X else if(magic(country,WARLORD)!=1){
X ntn[country].powers*=WARLORD;
X return(WARLORD);
X }
X break;
X case MI_MONST:
X case AV_MONST:
X case MA_MONST:
X if(ntn[country].race!=ORC) return(1);
X if(magic(country,MI_MONST)!=1){
X ntn[country].powers*=MI_MONST;
X return(MI_MONST);
X }
X else if(magic(country,AV_MONST)!=1){
X ntn[country].powers*=AV_MONST;
X return(AV_MONST);
X }
X else if(magic(country,MA_MONST)==1){
X ntn[country].powers*=MA_MONST;
X return(MA_MONST);
X }
X break;
X case SPY:
X case KNOWALL:
X case DERVISH:
X case HIDDEN:
X case ARCHITECT:
X case URBAN:
X case THE_VOID:
X case HEALER:
X case ARCHER:
X case CAVALRY:
X if(magic(country,newpower)==1) return(1);
X ntn[country].powers*=newpower;
X return(newpower);
X case DESTROYER:
X if((ntn[country].race!=ELF)&&(magic(country,DESTROYER)!=1)){
X ntn[country].powers*=DESTROYER;
X return(DESTROYER);
X }
X break;
X case VAMPIRE:
X if((ntn[country].race!=ELF)&&(magic(country,VAMPIRE)!=1)){
X ntn[country].powers*=VAMPIRE;
X return(VAMPIRE);
X }
X break;
X case MINER:
X if((ntn[country].race!=ELF)&&(ntn[country].race!=DWARF)&&(magic(country,MINER)!=1)){
X ntn[country].powers*=MINER;
X return(MINER);
X }
X case STEEL:
X if(magic(country,STEEL)==1) return(1);
X if(magic(country,MINER)!=1) return(1);
X ntn[country].powers*=STEEL;
X return(STEEL);
X case BREEDER:
X if(magic(country,BREEDER)==1) return(1);
X if(ntn[country].race!=ORC) return(1);
X ntn[country].powers*=BREEDER;
X return(BREEDER);
X }
X return(1);
X}
X
X/*form to interactively get a magic power*/
Xdomagic()
X{
X short x,count,done=0,loop=0;
X short isgod=0;
X short overmax=0;
X if(country==0) {
X isgod=1;
X clear();
X mvaddstr(0,0,"WHAT NATION NUMBER:");
X refresh();
X echo();
X scanw("%hd",&country);
X noecho();
X }
X
X while(done==0){
X clear();
X count=3;
X redraw=TRUE;
X standout();
X mvprintw(0,(COLS/2)-15,"MAGIC POWERS FOR %s",ntn[country].name);
X standend();
X /*print the powers that you have*/
X if(magic(country,WARRIOR)==1)
X mvaddstr(count++,0,"you have WARRIOR power (Fighter Level 1)");
X if(magic(country,CAPTAIN)==1)
X mvaddstr(count++,0,"you have CAPTAIN power (Fighter Level 2)");
X if(magic(country,WARLORD)==1)
X mvaddstr(count++,0,"you have WARLORD power (Fighter Level 3)");
X if(magic(country,MI_MONST)==1)
X mvaddstr(count++,0,"you have MINOR MONSTER power");
X if(magic(country,AV_MONST)==1)
X mvaddstr(count++,0,"you have AVERAGE MONSTER power");
X if(magic(country,MA_MONST)==1)
X mvaddstr(count++,0,"you have MAJOR MONSTER power");
X if(magic(country,SPY)==1)
X mvaddstr(count++,0,"you have SPY power");
X if(magic(country,KNOWALL)==1)
X mvaddstr(count++,0,"you have KNOWALL power");
X if(magic(country,DERVISH)==1)
X mvaddstr(count++,0,"you have DERVISH power");
X if(magic(country,DESTROYER)==1)
X mvaddstr(count++,0,"you have DESTROYER power");
X if(magic(country,HIDDEN)==1)
X mvaddstr(count++,0,"you have HIDDEN power");
X if(magic(country,THE_VOID)==1)
X mvaddstr(count++,0,"you have THE_VOID power");
X if(magic(country,ARCHITECT)==1)
X mvaddstr(count++,0,"you have ARCHITECT power");
X if(magic(country,VAMPIRE)==1)
X mvaddstr(count++,0,"you have VAMPIRE power");
X if(magic(country,HEALER)==1)
X mvaddstr(count++,0,"you have HEALER power");
X if(magic(country,MINER)==1)
X mvaddstr(count++,0,"you have MINER power");
X if(magic(country,URBAN)==1)
X mvaddstr(count++,0,"you have URBAN power");
X if(magic(country,STEEL)==1)
X mvaddstr(count++,0,"you have STEEL power");
X if(magic(country,ARCHER)==1)
X mvaddstr(count++,0,"you have ARCHER power");
X if(magic(country,CAVALRY)==1)
X mvaddstr(count++,0,"you have CAVALRY power");
X if(magic(country,BREEDER)==1)
X mvaddstr(count++,0,"you have BREEDER power");
X standout();
X if(count>=PCPOWERS+3){
X mvaddstr(count++,0,"YOU HAVE THE MAXIMUM NUMBER OF POWERS");
X mvaddstr(count++,0," NEW POWERS COST DOUBLE AND ARE INVALID UNLESS THEY");
X mvaddstr(count++,0," AUGMENT EXISTING FIGHTER OR MONSTER POWERS (hit any char)");
X standend();
X overmax=1;
X }
X
X if(ntn[country].race==ORC){
X mvprintw(count++,0,"DO YOU WISH TO TAKE OVER A NPC NATION (enter y or n):");
X mvaddstr(count++,0," Base 10 percent for 100K Jewels if Confederacy and the same race");
X refresh();
X if(getch()=='y'){
X mvprintw(count++,0,"SORRY; NOT IMPLEMENTED YET");
X }
X }
X
X count++;
X mvprintw(count++,0,"DO YOU WISH TO BUY A RANDOM NEW POWER FOR %d JEWELS (enter y or n):",JWL_MGK);
X standend();
X refresh();
X if(getch()=='y'){
X if(((ntn[country].jewels>JWL_MGK)&&(overmax==0))||(ntn[country].jewels>2*JWL_MGK)) {
X while(loop==0) if((x=getmagic())!=1){
X if((ntn[country].powers<=1)||(x<1)){
X mvprintw(count++,0,"ERROR ON POWER #%d",x);
X }
X else if(overmax==1){
X ntn[country].jewels-=2*JWL_MGK;
X if(((magic(country,WARRIOR)==1)&&((x==CAPTAIN)||(x==WARLORD)))||((magic(country,MI_MONST)==1)&&((x==AV_MONST)||(x==MA_MONST)))){
X CHGMGK;
X exenewmgk(x);
X }
X else {
X mvprintw(count++,0,"USELESS POWER (number %d)",x);
X ntn[country].powers/=x;
X }
X }
X else {
X ntn[country].jewels-=JWL_MGK;
X mvprintw(count++,0,"YOU NOW HAVE POWER #%d",x);
X CHGMGK;
X exenewmgk(x);
X }
X refresh();
X getch();
X loop=1;
X }
X }
X else {
X mvaddstr(count++,0,"NOT ENOUGH JEWELS -- hit any key");
X refresh();
X getch();
X done=1;
X }
X }
X else done=1;
X }
X if(isgod==1) country=0;
X}
X
X/*do magic for both npcs and pcs in update*/
X/*if target is 0 then it will be picked randomly*/
Xtakeover(percent,target)
X{
Xint loop=1,y,save;
X save=country;
X country=target;
X if(rand()%100<percent){
X loop=0;
X y=0;
X if (target==0) while(loop==0){
X y++;
X country=rand()%MAXNTN;
X if((ntn[country].race==ntn[save].race)&&(ntn[country].active>=2)) loop=1;
X else if(y>=500) {
X country=save;
X return;
X }
X }
X sct[ntn[country].capx][ntn[country].capy].owner=save;
X fprintf(fnews,"1.\tnation %s taken over by %s\n",ntn[country].name,ntn[save].name);
X destroy();
X }
X country=save;
X}
X
X/*execute new magic*/
Xexenewmgk(newpower)
X{
X short x,y;
X switch(newpower){
X case WARRIOR:
X ntn[country].aplus+=10;
X ntn[country].dplus+=10;
X break;
X case CAPTAIN:
X ntn[country].aplus+=10;
X ntn[country].dplus+=10;
X break;
X case WARLORD:
X ntn[country].aplus+=10;
X ntn[country].dplus+=10;
X break;
X case HEALER:
X if(ntn[country].race==ORC) {
X if(ntn[country].repro<=11)
X ntn[country].repro+=2;
X else ntn[country].repro=13;
X }
X else if(ntn[country].repro<=8){
X ntn[country].repro=10;
X }
X else if(ntn[country].repro==9){
X ntn[country].repro=10;
X ntn[country].dplus+=5;
X }
X else if(ntn[country].repro>=10){
X ntn[country].dplus+=10;
X }
X break;
X case DESTROYER:
X for(x=ntn[country].capx-3;x<=ntn[country].capx+3;x++) {
X for(y=ntn[country].capy-3;y<=ntn[country].capy+3;y++){
X if((x>0)&&(y>0)&&(x<MAPX)&&(y<MAPY)&&(sct[x][y].altitude!=WATER)&&(isdigit(sct[x][y].vegitation)==0)){
X sct[x][y].vegitation=DESERT;
X sct[x][y].designation=DESERT;
X }
X }
X }
X break;
X case MI_MONST:
X case AV_MONST:
X case MA_MONST:
X case SPY:
X case KNOWALL:
X case DERVISH:
X case HIDDEN:
X case THE_VOID:
X case ARCHITECT:
X case MINER:
X break;
X case VAMPIRE:
X ntn[country].aplus-=35;
X ntn[country].dplus-=35;
X ntn[country].maxmove-=2;
X break;
X case URBAN:
X if(ntn[country].race==ORC) {
X ntn[country].repro+=3;
X if(ntn[country].repro>=13){
X ntn[country].maxmove+=2*(ntn[country].repro-13);
X ntn[country].repro=13;
X }
X }
X else if(ntn[country].repro<=9){
X ntn[country].repro+=3;
X }
X else {
X ntn[country].maxmove+=2*(ntn[country].repro-9);
X ntn[country].repro=12;
X }
X break;
X case STEEL:
X break;
X case ARCHER:
X ntn[country].dplus+=10;
X break;
X case CAVALRY:
X ntn[country].aplus+=10;
X ntn[country].maxmove+=6;
X break;
X case BREEDER:
X ntn[country].repro+=3;
X ntn[country].dplus-=10;
X ntn[country].dplus-=10;
X break;
X }
X}
END_OF_magic.c
if test 9276 -ne `wc -c <magic.c`; then
echo shar: \"magic.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f newlogin.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"newlogin.c\"
else
echo shar: Extracting \"newlogin.c\" \(22711 characters\)
sed "s/^X//" >newlogin.c <<'END_OF_newlogin.c'
X/*conquest 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/*create a new login for a new player*/
X#include <ctype.h>
X
X#include "header.h"
X
Xextern short country;
X
Xnewlogin()
X{
X /* use points to create empire, add if late starter*/
X int points;
X char tempc[10];
X int n;
X int valid=1; /*valid == 0 means continue loop*/
X int temp;
X int more=0; /*0 if add another player*/
X int loop;
X int x;
X char tempo[8];
X char passwd[8];
X register i;
X
X printf("\nPreparing to add player\n");
X printf("break at any time to abort\n");
X
X while(more==0) {
X points=MAXPTS;
X /*find valid nation number type*/
X for(i=1;i<MAXNTN;i++)
X if(ntn[i].active==0) {
X country=i;
X break;
X }
X printf("first valid nation id is %d\n",country);
X
X if(i==MAXNTN) {
X beep();
X printf("error, cant add new nation\n");
X return;
X }
X
X ntn[country].active=1;
X
X valid=0;
X /*get name*/
X while(valid==0) {
X valid=1;
X printf("\nwhat name would you like your nation to have:");
X scanf("%s",ntn[country].name);
X
X if((strlen(ntn[country].name)<=1)||(strlen(ntn[country].name)<=1)){
X printf("\ninvalid name");
X valid=0;
X }
X
X /*check if already used*/
X if((strcmp(ntn[i].name,"god")==0)||(strcmp(ntn[i].name,"unowned")==0)){
X printf("\nname already used");
X valid=0;
X }
X
X for(i=1;i<(country-1);i++)
X if(strcmp(ntn[i].name,ntn[country].name)==0) {
X printf("\nname already used");
X valid=0;
X }
X }
X
X /*get password*/
X valid=0;
X while(valid==0) {
X printf("\nwhat is your nations password:");
X scanf("%s",passwd);
X if((strlen(passwd)>=8)||(strlen(passwd)<2)) {
X beep();
X printf("\ninvalid password (too short or long)");
X }
X else {
X printf("\nreenter your nations password:");
X scanf("%s",ntn[country].passwd);
X }
X if(strcmp(passwd,ntn[country].passwd)==0) valid=1;
X }
X strncpy(ntn[country].passwd,crypt(passwd,SALT),PASSLTH);
X
X /*get your name*/
X valid=0;
X while(valid==0) {
X valid=1;
X printf("\nenter either YOUR name (j_smith) or the name of your nations leader (gandalf...)");
X printf("\n\t(maximum 10 characters, no spaces):");
X scanf("%s",tempc);
X if((strlen(tempc)>=10)||(strlen(tempc)<2)) {
X beep();
X printf("\ninvalid name (too short or long)");
X valid=0;
X }
X else strcpy(ntn[country].leader,tempc);
X }
X
X valid=0;
X while(valid==0) {
X valid=1;
X printf("\nwhat race would you like to be:");
X printf("\n\tchoose (d)warf,(e)lf,(o)rc,(h)uman:");
X scanf("%s",tempo);
X switch(tempo[0]) {
X case 'd':
X printf("\ndwarf chosen\n");
X getclass(DWARF);
X ntn[country].race=DWARF;
X ntn[country].tgold=100000; /*1 pts*/
X ntn[country].tfood=12000; /*0 pts*/
X ntn[country].jewels=10000; /*0 pts*/
X ntn[country].tiron=10000; /*0 pts*/
X ntn[country].tciv= 6000; /*6 pts*/
X ntn[country].tmil= 1500; /*1.5 pts*/
X ntn[country].repro= 4; /*4 pts*/
X ntn[country].maxmove= 6; /*1.5 pts*/
X ntn[country].aplus= 20; /*2 pts*/
X ntn[country].dplus= 20; /*2 pts*/
X ntn[country].location=RANDOM; /*0+ pts*/
X /*MINER POWER INATE TO DWARVES*/
X printf("you have magical MINING skills");
X ntn[country].powers=MINER;
X exenewmgk(MINER);
X points-=18;
X break;
X case 'e':
X printf("\nelf chosen\n");
X getclass(ELF);
X ntn[country].race=ELF;
X ntn[country].tgold=100000; /*1 pts*/
X ntn[country].tfood=12000;
X ntn[country].jewels=10000;
X ntn[country].tiron=10000;
X ntn[country].tciv=7000; /*7 pts*/
X ntn[country].tmil=200; /*0 pts*/
X ntn[country].repro=3; /*3 pts*/
X ntn[country].maxmove=8; /*2 pts*/
X ntn[country].aplus=10; /*1 pts*/
X ntn[country].dplus=40; /*4 pts*/
X ntn[country].location=FAIR; /*1 pts*/
X printf("you have magical cloaking skills");
X ntn[country].powers=THE_VOID;
X exenewmgk(THE_VOID);
X points-=20; /* VOID COSTS ADDITIONAL PT*/
X break;
X case 'o':
X printf("\norc chosen\n");
X getclass(ORC);
X ntn[country].race=ORC;
X ntn[country].tgold=1000; /*0 pts*/
X ntn[country].tfood=12000;
X ntn[country].jewels=10000;
X ntn[country].tiron=10000;
X ntn[country].tciv=4000; /*4 pts*/
X ntn[country].tmil=2500; /*2.5 pts*/
X ntn[country].repro=10; /*10 pts*/
X ntn[country].maxmove=6; /*1.5 pts*/
X ntn[country].aplus=00; /*0 pts*/
X ntn[country].dplus=00; /*0 pts*/
X /*MINOR MONSTER POWER INATE TO ORCS*/
X printf("your leader is a minor monster (army 0 is very potent)");
X ntn[country].powers=MI_MONST;
X exenewmgk(MI_MONST);
X ntn[country].location=RANDOM; /*0 pts*/
X points-=18;
X break;
X case 'h':
X printf("\nhuman chosen\n");
X ntn[country].race=HUMAN;
X getclass(HUMAN);
X ntn[country].tgold=1000; /*0 pts*/
X ntn[country].tfood=12000; /*0 pts*/
X ntn[country].jewels=10000; /*0 pts*/
X ntn[country].tiron=10000; /*0 pts*/
X ntn[country].tciv=6000; /*6 pts*/
X ntn[country].tmil=1000; /*1 pts*/
X ntn[country].repro=5; /*5 pts*/
X ntn[country].maxmove=10; /*2.5 pts*/
X ntn[country].aplus=10; /*1 pts*/
X ntn[country].dplus=10; /*1 pts*/
X ntn[country].location=RANDOM; /*0 pts*/
X /*WARRIOR POWER INATE TO HUMANS*/
X printf("you have magical WARRIOR skills");
X ntn[country].powers=WARRIOR;
X exenewmgk(WARRIOR);
X points-=18;
X break;
X default:
X printf("\ninvalid race\n ");
X valid=0;
X }
X }
X
X ntn[country].mark=(*ntn[country].name);
X printf("\ntesting first letter of name (%c) for nation mark...",ntn[country].mark);
X valid=1;
X while(valid==1) {
X valid=0;
X if((isprint(ntn[country].mark)==0)||(isspace(ntn[country].mark)!=0)) {
X printf("\n%c is not a graphical character",ntn[country].mark);
X valid=1;
X }
X if(valid==0) for(i=0;i<=3;i++) if(ntn[country].mark==(*(ele+i))) {
X printf("\n%c is an altitude character",ntn[country].mark);
X valid=1;
X }
X if(valid==0) for(i=0;i<=11;i++) if(ntn[country].mark==(*(veg+i))) {
X printf("\n%c is a vegitation character,ntn[country].mark");
X valid=1;
X }
X if(valid==0) for(i=1;i<country;i++) if(ntn[i].mark==ntn[country].mark) {
X printf("\n%c is an already used character",ntn[country].mark);
X valid=1;
X }
X if(valid==0) if(ntn[i].mark=='*') {
X printf("\n'*' is invalid character");
X valid=1;
X }
X if(valid==1){
X printf("\nplease reenter new national mark for maps:");
X printf("\n (this can be any printing key like ! or O)");
X scanf("%s",tempc);
X ntn[country].mark=(*tempc);
X }
X else printf("\nvalid\n");
X }
X
X printf("\nmark currently is %c\n",ntn[country].mark);
X
X while(points>0) {
X printf("\n\nwhat would you like to buy with your remaining %d points\n\n",points);
X printf("\t1. population (1000/pt):\t\tnow have %d civilians\n",ntn[country].tciv);
X printf("\t2. more gold ($100000/pt):\t\tnow have %d gold pieces\n",ntn[country].tgold);
X printf("\t3. better location:\t\t\tlocation is now is %c\n",ntn[country].location);
X printf("\t4. more soldiers (1000/pt):\t\tnow have %d soldiers\n",ntn[country].tmil);
X printf("\t5. better attack (10%%/pt):\t\tnow is +%d\n ",ntn[country].aplus);
X printf("\t6. better defence (10%%/pt):\t\tnow is +%d\n",ntn[country].dplus);
X printf("\t7. higher reproduction (1%%/pt):\t\trate is now %d%%\n",ntn[country].repro);
X printf("\t8. higher movement (4/pt): \t\tnow move %d sectors\n",ntn[country].maxmove);
X printf("\t9. double raw recourses (1 pt): \tfood now %d\n",ntn[country].tfood);
X printf("\t \tgold dust now %d\n",ntn[country].jewels);
X printf("\t \tiron now %d\n",ntn[country].tiron);
X printf("\t10. additional random magic power (1 pt)\n");
X
X
X printf("\nWhat option to buy:");
X scanf("%d",&n);
X switch(n) {
X
X case 1:
X printf("additional population costs 1 pt per 1000\n");
X printf("how many points to spend on population:");
X scanf("%d",&temp);
X putchar('\n');
X if(points >= temp) {
X points -= temp;
X ntn[country].tciv+=temp*1000;
X }
X else printf("You dont have enough points left");
X break;
X case 2:
X printf("you now have $%d\n",ntn[country].tgold);
X printf("and can buy gold at $100000 per point\n");
X printf("how many points to spend on added gold:");
X scanf("%d",&temp);
X putchar('\n');
X if(points>=temp)
X {
X points-=temp;
X ntn[country].tgold+=temp*100000;
X }
X else printf("You dont have enough points left");
X break;
X case 3:
X printf("you now are in %c location\n",ntn[country].location);
X printf(" R=random, F=fair, G=good\n");
X if(ntn[country].location==RANDOM){
X printf("2pts for (g)ood location or 1pts for (f)air\n");
X }
X if(ntn[country].location==FAIR){
X printf("1pts for (g)ood location\n");
X }
X if(ntn[country].location==GREAT) return;
X
X printf("what type of location do you wish:");
X scanf("%s",tempo);
X switch(tempo[0]) {
X case 'g':
X case GREAT:
X if(ntn[country].location==FAIR){
X printf("1pts for (g)ood location\n");
X if(points>=1) {
X points -=1;
X ntn[country].location=GREAT;
X }
X else printf("You dont have enough points left");
X }
X else {
X if(points>=2) {
X points -=2;
X ntn[country].location=GREAT;
X }
X else printf("You dont have enough points left");
X }
X break;
X case 'f':
X case FAIR:
X if(ntn[country].location==RANDOM){
X if(points>=1) {
X points -=1;
X ntn[country].location=FAIR;
X }
X else printf("You dont have enough points left");
X }
X else printf("\nlocation unchanged\n");
X break;
X default:
X printf("\nlocation unchanged\n");
X }
X putchar('\n');
X break;
X case 4:
X printf("you start with %d soldiers\n",ntn[country].tmil);
X printf("additional military costs 1 / 1000\n");
X printf("how many points you wish:");
X scanf("%d",&temp);
X putchar('\n');
X if(points >= temp) {
X points -= temp;
X ntn[country].tmil+=temp*1000;
X }
X else printf("You dont have enough points left");
X break;
X case 5:
X printf("now have %d percent attack bonus\n",ntn[country].aplus);
X printf("an additional 10 percent per point\n");
X printf("how many points you wish:");
X scanf("%d",&temp);
X putchar('\n');
X if(points >= temp) {
X points -= temp;
X ntn[country].aplus+=temp*10;
X }
X else printf("You dont have enough points left");
X break;
X case 6:
X printf("now have %d percent defence bonus\n",ntn[country].dplus);
X printf("an additional 10 percent per point\n");
X printf("how many points you wish:");
X scanf("%d",&temp);
X putchar('\n');
X if(points >= temp) {
X points -= temp;
X ntn[country].dplus+=temp*10;
X }
X else printf("You dont have enough points left");
X break;
X case 7:
X printf("repro rate costs 1 per percent\n");
X printf("you now have %d percent\n",ntn[country].repro);
X if((ntn[country].race!=ORC)&&(ntn[country].repro>=10)){
X printf("you have the maximum rate");
X break;
X }
X printf("how many points you wish:");
X scanf("%d",&temp);
X putchar('\n');
X if(points >= temp) {
X if((ntn[country].race!=ORC)&&(ntn[country].repro+temp>=10)){
X printf("that exceeds the 10% limit");
X }
X else {
X points -= temp;
X ntn[country].repro+=temp;
X }
X }
X else printf("You dont have enough points left");
X break;
X case 8:
X printf("additional movement costs 1 per +4 sct/turn\n");
X printf("you start with a rate of 6\n");
X printf("you now have a rate of 10\n");
X putchar('\n');
X if(points >= 1) {
X points -= 1;
X ntn[country].maxmove+=4;
X }
X else printf("You dont have enough points left");
X break;
X case 9:
X printf("doubling raw materials\n");
X if(points >0) {
X points--;
X ntn[country].tfood*=2;
X ntn[country].jewels*=2;
X ntn[country].tiron*=2;
X
X }
X break;
X case 10:
X printf("choosing basic magic at 1 point cost\n");
X if(points >0) {
X points--;
X loop=0;
X while(loop==0) if((x=getmagic())>1){
X exenewmgk(x);
X loop=1;
X }
X }
X else printf("sorry not enough points\n");
X break;
X default:
X printf("invalid option\n");
X }
X }
X
X printnat();
X printf("\nhit 'y' if OK?");
X getchar();
X if(getchar()!='y'){
X ntn[i].active=0;
X getchar();
X printf("\n OK, nation deleted\n");
X printf("\nhit return to add another nation");
X printf("\nhit any other key to continue?");
X if(getchar()=='\n') more=0;
X else more=1;
X putchar('\n');
X }
X else {
X place();
X getchar();
X printf("\nNation is now added to world");
X printf("\nhit return to add another nation");
X printf("\nhit any other key to continue?");
X if(getchar()=='\n') more=0;
X else more=1;
X putchar('\n');
X }
X }
X writedata();
X}
X
Xprintnat()
X{
X int i;
X i=country;
X printf("am about to print stats for nation %d\n\n",i);
X printf("name is %8s\n",ntn[i].name);
X printf("leader is %8s\n",ntn[i].leader);
X printf("total sctrs :%2d\n",ntn[i].tsctrs);
X printf("class is %8s\n",*(Class+ntn[i].class));
X printf("mark is %c \n",ntn[i].mark);
X printf("race is %c \n",ntn[i].race);
X printf("aplus is +%2d\n",ntn[i].aplus);
X printf("dplus is +%2d\n",ntn[i].dplus);
X printf("total gold is %5d\n",ntn[i].tgold);
X printf("maxmove is %2d sctrs\n",ntn[i].maxmove);
X printf("jewels is %2d\n",ntn[i].jewels);
X printf("total military is %5d\n",ntn[i].tmil);
X printf("total civilians is %5d\n",ntn[i].tciv);
X printf("repro is %2d percent\n",ntn[i].repro);
X printf("total iron :%5d\n",ntn[i].tiron);
X printf("total food :%5d\n",ntn[i].tfood);
X printf("total ships :%2d\n",ntn[i].tships);
X}
X
X/*PLACE NATION*/
Xplace()
X{
X int placed=0;
X int t;
X int temp;
X int n; /*count vbl for inf loop*/
X short armynum=0;
X register i,j,x,y;
X
X n=0;
X updmove(ntn[country].race);
X switch(ntn[country].location) {
X case OOPS:
X while ((placed == 0)&&(n++<800)){
X placed=1;
X if(ntn[country].active==1){
X x = (rand()%(MAPX-8))+4;
X y = (rand()%(MAPY-8))+4;
X }
X else {
X x = (rand()%(MAPX-2))+1;
X y = (rand()%(MAPY-2))+1;
X }
X
X for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++)
X if(sct[x][y].owner!=0) placed=0;
X
X if((movecost[x][y]<=0)||(movecost[x][y]>5)) placed=0;
X }
X break;
X case RANDOM:
X while ((placed == 0)&&(n<2000)){
X placed=1;
X if(ntn[country].active==1){
X#if (MAPX>12)
X x = rand()%(MAPX-12)+6;
X y = rand()%(MAPY-12)+6;
X#else
X x = rand()%(MAPX-8)+4;
X y = rand()%(MAPY-8)+4;
X#endif
X /*important that no countries near*/
X for(i=x-4;i<=x+4;i++) for(j=y-4;j<=y+4;j++)
X if((sct[i][j].owner<MAXNTN)&&(sct[i][j].owner!=0)) placed=0;
X }
X else {
X x = (rand()%(MAPX-6))+3;
X y = (rand()%(MAPY-6))+3;
X /*important that no countries near*/
X for(i=x-2;i<=x+2;i++) for(j=y-2;j<=y+2;j++)
X if((sct[i][j].owner<MAXNTN)&&(sct[i][j].owner!=0)) placed=0;
X }
X for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++)
X if(sct[x][y].owner!=0) placed=0;
X if((movecost[x][y]<=0)||(movecost[x][y]>4)) placed=0;
X n++;
X }
X if (placed==1) for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++)
X if(sct[i][j].altitude!=WATER) sct[i][j].vegitation=GOOD;
X break;
X case FAIR:
X while ((placed == 0)&&(n<500)) {
X if(ntn[country].active==1){
X#if (MAPX>24)
X x = rand()%(MAPX-24)+12;
X y = rand()%(MAPY-24)+12;
X#else
X x = rand()%(MAPX-14)+7;
X y = rand()%(MAPY-14)+7;
X#endif
X }
X else {
X x = rand()%(MAPX-10)+5;
X y = rand()%(MAPY-10)+5;
X }
X
X for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++)
X if(sct[x][y].owner!=0) placed=0;
X
X n++;
X placed=1;
X if((movecost[x][y]>0)&&(movecost[x][y]<=4)){
X#if(PWATER>50)
X for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++)
X if(sct[i][j].altitude==WATER) placed=0;
X /*important that no countries near*/
X for(i=x-3;i<=x+3;i++) for(j=y-3;j<=y+3;j++){
X if((sct[i][j].owner<MAXNTN)&&(sct[i][j].owner!=0)) placed=0;
X }
X#else
X for(i=x-1;i<=x;i++) for(j=y-1;j<=y;j++)
X if(sct[i][j].altitude==WATER) placed=0;
X /*important that no countries near*/
X for(i=x-2;i<=x+2;i++) for(j=y-2;j<=y+2;j++){
X if((sct[i][j].owner<MAXNTN)&&(sct[i][j].owner!=0)) placed=0;
X }
X#endif
X }
X else placed=0;
X }
X if (placed==1) for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++)
X if(sct[i][j].altitude!=WATER) sct[i][j].vegitation=GOOD;
X break;
X case GREAT:
X placed = 0;
X while ((placed == 0) && (n<1500)){
X placed=1;
X if(ntn[country].active==1){
X#if (MAPX>40)
X x = rand()%(MAPX-40)+20;
X y = rand()%(MAPY-40)+20;
X#else
X x = rand()%(MAPX-18)+9;
X y = rand()%(MAPY-18)+9;
X#endif
X
X /*important that no countries near*/
X for(i=x-4;i<=x+4;i++) for(j=y-4;j<=y+4;j++){
X if((sct[i][j].owner<MAXNTN)&&(sct[i][j].owner!=0)) placed=0;
X }
X }
X else {
X#if (MAPX>24)
X x = rand()%(MAPX-24)+12;
X y = rand()%(MAPY-24)+12;
X#else
X x = rand()%(MAPX-12)+6;
X y = rand()%(MAPY-12)+6;
X#endif
X for(i=x-2;i<=x+2;i++) for(j=y-2;j<=y+2;j++){
X if((sct[i][j].owner<MAXNTN)&&(sct[i][j].owner!=0)) placed=0;
X }
X }
X
X for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++)
X if(sct[x][y].owner!=0) placed=0;
X
X n++; /*variable to prevent infinite loop*/
X if((movecost[x][y]>0)&&(movecost[x][y]<4)){
X#if(PWATER>50)
X /*if any water within 2 sectors placed = 0*/
X for(i=x-2;i<=x+2;i++) for(j=y-2;j<=y+2;j++)
X if(movecost[x][y]<0) placed=0;
X#else
X for(i=x-2;i<=x+1;i++) for(j=y-2;j<=y+1;j++)
X if(movecost[x][y]<0) placed=0;
X#endif
X
X if (placed==1) switch(ntn[country].race) {
X case DWARF:
X sct[x][y].altitude=MOUNTAIN;
X sct[x][y].designation=MOUNTAIN;
X for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++) if((i!=x)&&(j!=y)&&(sct[i][j].altitude!=WATER)){
X if (rand()%3==0) {
X sct[i][j].altitude=MOUNTAIN;
X sct[i][j].designation=MOUNTAIN;
X sct[i][j].gold=rand()%6;
X sct[i][j].iron=rand()%6;
X }
X else {
X sct[i][j].altitude=HILL;
X sct[i][j].designation=HILL;
X sct[i][j].iron=rand()%4;
X sct[i][j].gold=rand()%4;
X }
X }
X break;
X case ELF:
X sct[x][y].vegitation = FORREST;
X for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++) if((i!=x)&&(j!=y)&&(sct[i][j].altitude!=WATER)) {
X if (rand()%3==0)
X sct[i][j].vegitation=FORREST;
X else sct[i][j].vegitation=WOOD;
X
X if (rand()%2==0)
X sct[i][j].gold=rand()%8;
X else sct[i][j].gold=rand()%4;
X }
X break;
X case ORC:
X sct[x][y].altitude=MOUNTAIN;
X for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++) if((i!=x)&&(j!=y)&&(sct[i][j].altitude!=WATER)) {
X if (rand()%3==0) {
X sct[i][j].altitude=MOUNTAIN;
X sct[i][j].designation=MOUNTAIN;
X }
X else {
X sct[i][j].altitude=HILL;
X sct[i][j].designation=HILL;
X }
X if (rand()%2==0){
X sct[i][j].iron=rand()%8;
X sct[i][j].gold=rand()%8;
X }
X else {
X sct[i][j].iron=rand()%4;
X sct[i][j].gold=rand()%4;
X }
X }
X break;
X case HUMAN:
X sct[x][y].altitude = CLEAR;
X for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++) if((i!=x)&&(j!=y)&&(sct[i][j].altitude!=WATER)) {
X if (rand()%2==0)
X sct[x][y].altitude = CLEAR;
X
X if (rand()%2==0)
X sct[i][j].vegitation=WOOD;
X else
X sct[i][j].vegitation=GOOD;
X
X if (rand()%2==0)
X sct[i][j].gold=rand()%7+1;
X else
X sct[i][j].iron=rand()%7+1;
X }
X break;
X }
X }
X else placed=0;
X }
X }
X
X /*done with one try*/
X if(placed==1) {
X ntn[country].capx = x;
X ntn[country].capy = y;
X sct[x][y].designation=DCAPITOL;
X sct[x][y].owner=country;
X sct[x][y].people=ntn[country].tciv;
X sct[x][y].fortress=5;
X
X /* put all military into armies of 100 */
X armynum=0;
X temp=ntn[country].tmil;
X ASOLD=ntn[country].tmil/3;
X temp-=ASOLD;
X ASTAT=GARRISON;
X AMOVE=0;
X AXLOC=ntn[country].capx;
X AYLOC=ntn[country].capy;
X while((armynum<MAXARM)&&(temp>0)) {
X armynum++;
X if(temp>100){
X ASOLD=100;
X temp-=100;
X }
X else {
X ASOLD=temp;
X temp=0;
X }
X AXLOC=ntn[country].capx;
X AYLOC=ntn[country].capy;
X ASTAT=DEFEND;
X AMOVE=ntn[country].maxmove;
X }
X if(temp>0) {
X armynum=0;
X ASOLD+=temp;
X }
X
X /* give you some terain to start with: pc nations get more*/
X if ((ntn[country].active>=2)&&(ntn[country].location==GREAT))
X t=1;
X else if (ntn[country].active>=2) t=0;
X else if (ntn[country].location==OOPS) t=0;
X else if (ntn[country].location==RANDOM) t=0;
X else if (ntn[country].location==FAIR) t=1;
X else if (ntn[country].location==GREAT) t=2;
X else printf("error");
X
X for(i=x-t;i<=x+t;i++) for(j=y-t;j<=y+t;j++)
X if((movecost[i][j]>=0)&&(sct[i][j].owner==0)&&(sct[i][j].people==0)) {
X sct[i][j].owner=country;
X sct[i][j].designation=DFARM;
X }
X }
X else {
X if(ntn[country].location==OOPS) printf("ERROR\n");
X else if(ntn[country].location==RANDOM) {
X printf("RANDOM PLACE FAILED, TRYING TO PLACE AGAIN\n");
X ntn[country].location=OOPS;
X place();
X }
X else if(ntn[country].location==FAIR) {
X printf("FAIR PLACE FAILED, TRYING TO PLACE AGAIN\n");
X ntn[country].location=RANDOM;
X place();
X }
X else if(ntn[country].location==GREAT) {
X printf("GOOD PLACE FAILED, TRYING TO PLACE AGAIN\n");
X ntn[country].location=FAIR;
X place();
X }
X }
X}
X
X/*get class routine*/
Xgetclass(race)
X{
X short check=0;
X short tmp;
X while(check==0){
X printf("what type of nation would you like to be\n");
X printf("1. king (Humans, Dwarves, and Elves)\n");
X printf("2. emperor (Humans, Dwarves, and Elves)\n");
X printf("3. wizard (Humans, Dwarves, and Elves)\n");
X printf("4. theocracy (Humans Only)\n");
X printf("5. pirate (Humans & Orcs Only)\n");
X printf("6. trader (Elves & Dwarves Only)\n");
X printf("7. tyrant (Humans & Orcs Only)\n");
X printf("8. demon (Orcs Only)\n");
X printf("9. dragon (Orcs Only)\n");
X printf("10. shadow (Orcs Only)\n\n");
X printf("\tinput:");
X scanf("%hd",&tmp);
X if((tmp>=1)&&(tmp<=10)) {
X if((race==HUMAN)&&((tmp<6)||(tmp==7))) check=1;
X else if((race==DWARF)&&((tmp<=3)||(tmp==6))) check=1;
X else if((race==ELF)&&((tmp==6)||(tmp<=3))) check=1;
X else if((race==ORC)&&((tmp==5)||(tmp>6))) check=1;
X else printf("bad input \n\n\n");
X }
X else printf("\tinvalid input\n\n\n");
X }
X ntn[country].class=tmp;
X}
END_OF_newlogin.c
if test 22711 -ne `wc -c <newlogin.c`; then
echo shar: \"newlogin.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 2 \(of 5\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 4 5 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 5 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