games@tekred.TEK.COM (06/17/88)
Submitted by: ihnp4!homxc!smile
Comp.sources.games: Volume 4, Issue 46
Archive-name: conquer3/Part05
#! /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 5 (of 8)."
# Contents: io.c nations randevent.c update.c
# Wrapped by billr@saab on Thu Jun 16 09:40:00 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f io.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"io.c\"
else
echo shar: Extracting \"io.c\" \(6460 characters\)
sed "s/^X//" >io.c <<'END_OF_io.c'
X/*io.c*/
X/*Print and io subroutines for game*/
X
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 files*/
X#include <ctype.h>
X#include "header.h"
X#include "data.h"
X
X/*Declarations*/
Xextern struct s_sector sct[MAPX][MAPY];
Xextern struct nation ntn[NTOTAL]; /* player nation stats */
Xextern FILE *fexe;
X
X/*offset of upper left hand corner*/
Xextern short xoffset;
Xextern short yoffset;
X/*current cursor postion (relative to 00 in upper corner)*/
X/* position is 2*x,y*/
Xextern short xcurs;
Xextern short ycurs;
X/*redraw map in this turn if redraw is a 1*/
Xextern short redraw;
X/*display state*/
Xextern short hilmode;
Xextern short dismode;
X/* nation id of owner*/
Xextern short country;
X#ifdef ADMIN
X/*print a sector.altitude map subroutine*/
Xvoid
Xprintele()
X{
X register int X, Y;
X printf("doing print of altitude\n");
X for(Y=0;Y<MAPY;Y++) {
X for(X=0;X<MAPX;X++) putc(sct[X][Y].altitude,stdout);
X putc('\n',stdout);
X }
X}
X#endif ADMIN
X#ifdef ADMIN
Xvoid
Xpr_ntns()
X{
X register int X, Y;
X printf("doing print of nations\n");
X for(Y=0;Y<MAPY;Y++) {
X for(X=0;X<MAPX;X++) {
X if(sct[X][Y].owner==0)
X putc(sct[X][Y].altitude,stdout);
X else putc(ntn[sct[X][Y].owner].mark,stdout);
X }
X putc('\n',stdout);
X }
X}
X#endif ADMIN
X
X/*print all data--trashes/creates datafile in the process*/
Xvoid
Xwritedata()
X{
X int fd;
X printf("\ndoing write of data\n");
X if((fd = creat(datafile,0666))==-1) {
X printf("cant open data. check permissions\n");
X return;
X }
X write(fd,sct,sizeof(sct));
X write(fd,ntn,sizeof(ntn));
X close(fd);
X}
X
Xvoid
Xreaddata()
X{
X int fd;
X int n_read;
X
X /*read in existing nation army and navy data*/
X /*check if file openable*/
X printf("reading data file\n");
X if( (fd = open(datafile,0)) < 0 ) {
X fprintf( stderr, "can not open %s \n", datafile );
X exit(FAIL);
X }
X if((n_read=read(fd,sct,sizeof(sct)))==0) printf("EOF\n");
X else if(n_read==-1) printf("error reading sector data (sct)\n");
X if(n_read!=sizeof(sct)) {
X printf( "wrong data format (%d vs. %d)\n",n_read, sizeof(sct) );
X abrt();
X }
X if((n_read=read(fd,ntn,sizeof(ntn)))==0) printf("EOF\n");
X else if(n_read==-1) printf("error reading nation data (ntn)\n");
X if(n_read!=sizeof(ntn)) {
X printf( "wrong data format (%d vs. %d)\n",n_read, sizeof(ntn) );
X abrt();
X }
X close(fd);
X verifydata( __FILE__, __LINE__ );
X
X} /* readdata() */
X
X#ifdef ADMIN
X/*print a map subroutine*/
Xvoid
Xprintveg()
X{
X register int X, Y;
X printf("doing print of vegetation\n");
X for(Y=0;Y<MAPY;Y++) {
X for(X=0;X<MAPX;X++) putc(sct[X][Y].vegetation,stdout);
X putc('\n',stdout);
X }
X}
X#endif ADMIN
X#ifdef CONQUER
Xvoid
Xoffmap()
X{
X redraw=FALSE;
X /*set offset offsets can not be < 0*/
X if(xcurs<1){
X if(XREAL<=0) {
X xoffset=0;
X xcurs=0;
X }
X else {
X redraw=TRUE;
X xoffset-=15;
X xcurs+=15;
X }
X }
X else if(xcurs >= (COLS-22)/2){
X if(XREAL<MAPX) {
X redraw=TRUE;
X xoffset+=15;
X xcurs-=15;
X }
X }
X if(XREAL>=MAPX) xcurs=MAPX-1-xoffset;
X if(xoffset<0) {
X xcurs += xoffset;
X xoffset=0;
X }
X if(xcurs<0) {
X xoffset += xcurs;
X xcurs=0;
X }
X else if(xcurs >= (COLS-22)/2) {
X redraw=TRUE;
X xoffset+=15;
X xcurs-=15;
X }
X
X if(ycurs<1){
X if(YREAL<=0) {
X yoffset=0;
X ycurs=0;
X }
X else {
X redraw=TRUE;
X ycurs+=15;
X yoffset-=15;
X }
X }
X else if(ycurs >= SCREEN_Y_SIZE){
X if(YREAL<MAPY) {
X redraw=TRUE;
X yoffset+=15;
X ycurs-=15;
X }
X }
X if(YREAL>=MAPY) ycurs=MAPY-1-yoffset;
X if(yoffset<0) {
X ycurs += yoffset;
X yoffset=0;
X }
X if(ycurs<0) {
X yoffset += ycurs;
X ycurs=0;
X }
X else if(ycurs >= SCREEN_Y_SIZE) {
X redraw=TRUE;
X yoffset+=15;
X ycurs-=15;
X }
X}
X#endif CONQUER
X#ifdef CONQUER
Xvoid
Xprintscore()
X{
X int i;
X int nationid; /*current nation id */
X
X printf("id race class score gold military people sectors name\n");
X for (nationid=1; nationid<MAXNTN; nationid++) {
X
X if(ntn[nationid].active==0) continue;
X printf("%d",nationid);
X for(i=1;i<8;i++)
X if(ntn[nationid].race==*(races+i)[0])
X printf(" %s",*(races+i));
X if(ntn[nationid].active>=2) printf(" NPC");
X else printf(" %s",*(Class+ntn[nationid].class));
X printf(" %ld %ld %ld %ld %d",
X ntn[nationid].score ,ntn[nationid].tgold
X ,ntn[nationid].tmil ,ntn[nationid].tciv
X ,ntn[nationid].tsctrs );
X printf(" %s\n",ntn[nationid].name);
X }
X}
X#endif CONQUER
X
Xvoid
Xflee(x,y,z,slaver)
Xint x,y,z,slaver;
X{
X /*count is number of acceptable sectors*/
X int count=0;
X int slaves=0;
X int i,j;
X
X if(slaver==TRUE){
X slaves= sct[x][y].people/4;
X sct[x][y].people-=slaves;
X }
X
X /*flee*/
X sct[x][y].people*=6;
X sct[x][y].people/=10;
X /*check if next to anybody of the sectors owners race*/
X for(i=x-2;i<=x+2;i++) for(j=y-2;j<=y+2;j++)
X if(i>=0&&i<MAPX&&j>=0&&j<MAPY
X &&(ntn[sct[i][j].owner].race==ntn[sct[x][y].owner].race))
X count++;
X
X if(count>0) {
X if(z==0) if(slaver==TRUE){
X mvprintw(LINES-2,20,"CIVILIANS ABANDON SECTOR (%d slaves)",slaves);
X }else{
X mvaddstr(LINES-2,20,"CIVILIANS ABANDON SECTOR");
X }
X for(i=x-2;i<=x+2;i++) for(j=y-2;j<=y+2;j++)
X if(i>=0&&i<MAPX&&j>=0&&j<MAPY
X &&(ntn[sct[i][j].owner].race==ntn[sct[x][y].owner].race)) {
X sct[i][j].people += sct[x][y].people / count;
X if(z==0) SADJCIV2;
X }
X }
X else {
X sct[x][y].people /= 2;
X for(i=x-4;i<=x+4;i++) for(j=y-4;j<=y+4;j++)
X if(i>=0&&i<MAPX&&j>=0&&j<MAPY
X &&(ntn[sct[i][j].owner].race==ntn[sct[x][y].owner].race))
X count++;
X if(count>0) {
X if(z==0) mvaddstr(LINES-2,20,"PEOPLE FLEE SECTOR AND HALF DIE");
X for(i=x-4;i<=x+4;i++) for(j=y-4;j<=y+4;j++)
X if(i>=0&&i<MAPX&&j>=0&&j<MAPY
X &&(ntn[sct[i][j].owner].race==ntn[sct[x][y].owner].race)) {
X sct[i][j].people += sct[x][y].people / count;
X if(z==0) SADJCIV2;
X }
X }
X else if(z==0) mvaddstr(LINES-2,20,"PEOPLE IN SECTOR DIE");
X }
X
X sct[x][y].people = slaves;
X if(z==0) SADJCIV;
X sct[x][y].fortress=0;
X /*SINFORT;*/
X if(tofood(sct[XREAL][YREAL].vegetation,sct[XREAL][YREAL].owner)!=0) {
X sct[x][y].designation=DDEVASTATED;
X if(z==0) SADJDES2;
X }
X}
X
END_OF_io.c
if test 6460 -ne `wc -c <io.c`; then
echo shar: \"io.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f nations -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"nations\"
else
echo shar: Extracting \"nations\" \(2960 characters\)
sed "s/^X//" >nations <<'END_OF_nations'
X# GAME MASTERS FILE ON NPC NATIONS: COMPILE TIME ONLY
X# comments are offset by a # sign in the first column
X#
X# THERE IS A LIMIT OF "MAXNTN" NATIONS TOTAL; Be sure this is ok
X#
X# name :nations name
X# :examples include Darboth Ummaya Rugar Jute Atlantis Iberia
X# :Kuybyshev Avar Grodor Bantanya Fung Codor Delph Macitania
X# leader : permitted leaders are "dwarfking","elfking","elfdruid",
X# "elfwizard","demon","dragon","wizard","priest",
X# "shadow","king","priestking","wizard","demigod"
X# race :Character, ORC='O',ELF='E',DWARF='D',LZARD='L',HUMAN='H'
X# :BRIGAND='P' BARBARIAN='B'
X# mark :unique mark for race (ie & or ! or 1 or H...)
X# loc :G,F,R location (good,fair,random)
X# aplus :attack percentage plus (multiples of 10 (ie 10,20,30))
X# dplus :defence percentage plus (multiples of 10 (ie 10,20,30))
X# maxmove :movement rate (4 to 8)
X# gold :total gold at start
X# mil :total military at start
X# civilians :total civilians at start
X# repro-rate :reproduction rate of nation (percentage)
X# aggr :aggressiveness (1--always peaceful) to (10 -- always hostile)
X#
X#EXAMPLE NATIONS PTS
X# Sporf demon O S R 0 0 6 1000 2500 4000 10 9 9
X# Athens king H A R 10 10 9 10000 500 5000 5 4 9
X# Fung king E F F 20 30 8 20000 200 3000 3 2 6
X# X dwarfking D X R 20 20 6 20000 1500 4000 4 4 6
X# ADD PTS IN VALUE TO THE ABOVE FORE RACIAL BASES TO GET BALANCE
X#
X# THE NATIONS LISTED BELOW ARE CALIBRATED AS FOLLOWS
X# ELVES: fung (27), lint (28), anorian (29), roos (22) =>106 points
X# ORCS : sporf (24), etland (24), woolos (36), darboth (20) =>106 points
X# HUMAN: argos(24), taelos(20), cordoba(21), zaos(21), tokus(20) =>106 pts
X# DWARF: Goldor (22), Muldor (38), Sodor (25), Valar(20) =>106 points
X#
X# format: (note that offset by a space)
X#
X# name leader race mark location aplus dplus maxmove gold mil civ repro aggr
X#########################################################################
Xanorian elfwizard E A F 30 40 8 70000 1500 8500 8 2
Xbobland dragon O B F 20 0 6 12000 1500 8000 10 9
Xcordoba wizard H C R 10 10 2 30000 1500 8000 8 4
Xdarboth balrog O D R 0 0 7 70000 1500 9500 8 9
Xedland dragon O E R 20 0 8 12000 1500 8500 10 9
Xfung elfking E F F 10 40 8 50000 1000 9500 8 2
Xgotho warking H G R 10 10 9 50000 1000 6150 8 4
Xhargo king H H R 10 10 9 30000 1500 11000 7 4
Xlint elfwizard E L F 20 30 8 50000 1500 7900 10 2
Xmedal elfpriest E M R 20 0 6 16000 2000 6500 10 9
Xnoria dwarfduke D N R 10 30 6 50000 1000 10000 8 4
Xroos dwarfduke D R F 15 10 9 50000 1000 7900 7 8
Xsodor dwarfking D S F 10 30 6 160000 5000 18000 7 4
Xtokus king H T R 10 10 8 30000 1000 7500 8 4
Xwoooo shadow O W F 10 10 10 60000 3500 17000 10 9
XValar dwarf D V R 10 15 8 30000 1000 7000 8 4
Xzaos king H Z R 10 15 12 30000 1000 7000 8 4
END_OF_nations
if test 2960 -ne `wc -c <nations`; then
echo shar: \"nations\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f randevent.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"randevent.c\"
else
echo shar: Extracting \"randevent.c\" \(22037 characters\)
sed "s/^X//" >randevent.c <<'END_OF_randevent.c'
X/* Conquer: Copyright (c) 1988 by Edward M Barlow */
X#include <stdio.h>
X#include <ctype.h>
X#include "header.h"
X#include "data.h"
X#ifdef RANEVENT
X#ifdef ADMIN
X
Xextern FILE *fnews;
Xextern short country;
X
Xchar eventstr[80];
Xint xpos,ypos; /* saved x and y position */
X
Xchar *randevents[] = {
X/* 0 */ "province rebels -- disolve 10% of nation",
X/* 1 */ "evil wizard sets up -- disolve 10% of nation",
X/* 2 */ "tax revolt -- disolve 20% of nation",
X/* 3 */ "rebelion -- disolve 30% of nation",
X/* 4 */ "army revolts -- disolve 30% of nation",
X/* 5 */ "religious schism -- disolve 30% of nation",
X/* 6 */ "peasant revolt ",
X/* 7 */ "peasant revolt ",
X/* 8 */ "peasant revolt ",
X/* 9 */ "dragon raid -- lose 30% of food",
X/* 10 */ "famine -- food in granaries reduced 75%",
X/* 11 */ "hurricane",
X/* 12 */ "tornado",
X/* 13 */ "volcano erupts -- all flee, 30% die (in 1 sector range)",
X/* 14 */ "royal wedding (absorb neighbor nation)",
X/* 15 */ "new alloy gives new fighter power",
X/* 16 */ "royal advisor discovered to be spy -- lose power",
X/* 17 */ "gold strike one sector ",
X/* 18 */ "gold strike one sector ",
X/* 19 */ "gold vein runs out in one goldmine sector ",
X/* 20 */ "gold vein runs out in one goldmine sector ",
X/* 21 */ "flood",
X/* 22 */ "earthquake",
X/* 23 */ "frost -- crops ruined",
X/* 24 */ "dragon killed, you gain his jewel hoard",
X/* 25 */ "several nomad armies raid in your area",
X/* 26 */ "town burns to the ground",
X/* 27 */ "black plague -- 40% of populace & armies die",
X/* 28 */ "pirate raid on harbor",
X/* 29 */ "barbarian raid",
X/* 30 */ "new magician offers you magic power",
X/* 31 */ "new magic item give you magic power",
X/* 32 */ "ores in one iron mine run out",
X/* 33 */ "new architect strengthens castle walls",
X/* 34 */ "new ores discovered + 4-10 iron one sector",
X/* 35 */ "skilled diplomat obtains peace",
X/* 36 */ "severe winter",
X/* 37 */ "severe winter",
X/* 38 */ "tidal wave -- abandon all coastlands ",
X/* 39 */ "ninja destroy general staff - 1/2 armies paralyzed",
X/* 40 */ "general found to be spy -- many armies paralyzed",
X/* 41 */ "general prosperity +20% gold",
X/* 42 */ "plague kills 20% of your soldiers",
X/* 43 */ "poor conditions kill 20% of your soldiers"
X};
X#define MAXRANEVENT 43
X
X/*finds unused nation and sets it up partially*/
Xint
Xfindnew()
X{
X int newntn=0,nationis;
X for ( nationis=MAXNTN ; nationis >= 1; nationis--)
X if (ntn[nationis].active == 0) newntn=nationis;
X if (newntn == 0) return (0);
X strcpy(ntn[newntn].leader,"rebel");
X strcpy(ntn[newntn].passwd,ntn[0].passwd);
X ntn[newntn].class=0;
X ntn[newntn].score=0L;
X ntn[newntn].tsctrs=0;
X ntn[newntn].active=2;
X return(newntn);
X}
X
X/* disolve a certain percent of a nation */
X/*returns value of new nation */
Xint
Xdisolve(percent, target)
Xint target;
Xint percent;
X{
X int new; /* new nation number */
X int split; /* number of sectors split */
X int defaultx=(-1), defaulty=(-1), realx=(-1), realy=(-1), dist;
X int i,j,armynum,narmynum,posi,posj;
X int notdone=1;
X char tmpchr;
X
X split = ntn[target].tsctrs * percent / 100;
X if (split==0) {
X strcpy(eventstr,"no sectors to split");
X return(0);
X }
X if (split<=7) {
X strcpy(eventstr,"nation is too small->no sectors will be split");
X return(0);
X }
X /* find starting town */
X for(posi=0; posi<MAPX; posi++) for(posj=0; posj<MAPY; posj++) {
X if((sct[posi][posj].designation == DCITY )
X &&(sct[posi][posj].owner == target)){
X if ( rand()%5 == 0 ) {
X realx = posi;
X realy = posj;
X } else {
X defaultx = posi;
X defaulty = posj;
X }
X }
X }
X if ((realx == (-1) ) && (realy == (-1))){
X realx = defaultx;
X realy = defaulty;
X }
X if ((realx == (-1) ) && (realy == (-1))) {
X strcpy(eventstr,"can't disolve nation->no cities available");
X return(0);
X }
X new=findnew();
X if(new == 0) {
X strcpy(eventstr,"no nations available");
X return(0);
X }
X
X strcpy(ntn[new].name,"r-");
X strncat(ntn[new].name,ntn[target].name,min(NAMELTH-2,strlen(ntn[target].name)));
X for (armynum=0;armynum<MAXNAVY;armynum++)
X if(strcmp(ntn[armynum].name, ntn[new].name)==0) {
X strcpy(eventstr,"no nations available");
X return(0);
X }
X#ifdef HIDELOC
X sprintf(eventstr,"new nation created");
X#else
X sprintf(eventstr,"new nation created at %d,%d",realx,realy);
X#endif HIDELOC
X wdisaster(target,realx,realy,0,"revolt");
X sct[realx][realy].owner=new;
X ntn[new].capx=realx;
X ntn[new].capy=realy;
X sct[realx][realy].designation=DCAPITOL;
X ntn[new].race= ntn[target].race;
X ntn[new].tgold= ntn[target].tgold* percent / 100;
X ntn[new].tfood= ntn[target].tfood* percent / 100;
X ntn[new].jewels= ntn[target].jewels* percent / 100;
X ntn[new].tiron= ntn[target].tiron* percent / 100;
X ntn[new].tciv= ntn[target].tciv* percent / 100;
X ntn[new].tmil= ntn[target].tmil* percent / 100;
X ntn[target].tgold -= ntn[new].tgold;
X ntn[target].tfood -= ntn[new].tfood;
X ntn[target].jewels -= ntn[new].jewels;
X ntn[target].tiron -= ntn[new].tiron;
X ntn[target].tciv -= ntn[new].tciv;
X ntn[target].tmil -= ntn[new].tmil;
X ntn[new].repro= ntn[target].repro;
X ntn[new].maxmove= ntn[target].maxmove;
X ntn[new].aplus= ntn[target].aplus;
X ntn[new].dplus= ntn[target].dplus;
X ntn[new].location= ntn[target].location;
X ntn[new].powers= ntn[target].powers;
X /* make the rebellion's mark some unused uppercase letter */
X tmpchr='A'-1;
X while (notdone) {
X tmpchr++;
X notdone=0;
X for (i=0;i<MAXNTN;i++)
X if (ntn[i].mark==tmpchr && ntn[i].active>0)
X notdone=1;
X if (!notdone && !isalpha(tmpchr))
X notdone=1;
X if (tmpchr=='Z')
X notdone=0;
X }
X ntn[new].mark= tmpchr;
X for ( dist=2 ; dist < 10; dist++) if (split > 0)
X for (i=defaultx-dist; i<defaultx+dist; i++)
X for (j=defaulty-dist; j<defaulty+dist; j++){
X if (i>=0 && j>=0 && i<MAPX && j<MAPY
X &&(split>0)
X &&( sct[i][j].designation != DCAPITOL )
X &&( sct[i][j].owner == target)){
X split--;
X sct[i][j].owner=new;
X }
X }
X
X narmynum=1;
X for (armynum=0;armynum<MAXNAVY;armynum++) {
X ntn[new].nvy[armynum].warships = 0;
X ntn[new].nvy[armynum].merchant = 0;
X }
X for (armynum=0;armynum<MAXARM;armynum++)
X if((ntn[target].arm[armynum].sold>0)
X &&(sct[ntn[target].arm[armynum].xloc][ntn[target].arm[armynum].yloc].owner==new)){
X ntn[new].arm[narmynum].sold
X =ntn[target].arm[armynum].sold;
X ntn[new].arm[narmynum].unittyp
X =ntn[target].arm[armynum].unittyp;
X ntn[new].arm[narmynum].xloc
X =ntn[target].arm[armynum].xloc;
X ntn[new].arm[narmynum].yloc
X =ntn[target].arm[armynum].yloc;
X ntn[new].arm[narmynum].stat
X =ntn[target].arm[armynum].stat;
X ntn[new].arm[narmynum].smove
X =ntn[target].arm[armynum].smove;
X ntn[target].arm[armynum].sold = 0;
X narmynum++;
X }
X for (armynum=narmynum; armynum<MAXARM; armynum++)
X ntn[new].arm[armynum].sold = 0;
X armynum=0;
X ntn[new].arm[0].sold = 300;
X ntn[new].arm[0].unittyp = A_INFANTRY;
X ntn[new].arm[0].xloc = realx;
X ntn[new].arm[0].yloc = realy;
X ntn[new].arm[0].stat = GARRISON;
X ntn[new].arm[0].smove = 0;
X for (dist=0;dist<MAXNTN;dist++) if(dist!=new) {
X /* create realistic diplomatic status */
X if (ntn[target].dstatus[dist]==UNMET) {
X ntn[new].dstatus[dist]=UNMET;
X ntn[dist].dstatus[new]=UNMET;
X }
X else if (ntn[target].dstatus[dist]<NEUTRAL)
X {
X ntn[new].dstatus[dist]=HOSTILE;
X ntn[dist].dstatus[new]=HOSTILE;
X }
X else {
X ntn[new].dstatus[dist]=NEUTRAL;
X ntn[dist].dstatus[new]=NEUTRAL;
X }
X }
X for (dist=MAXNTN;dist<NTOTAL;dist++) {
X ntn[new].dstatus[dist]=WAR;
X ntn[dist].dstatus[new]=WAR;
X }
X ntn[new].dstatus[target]=WAR;
X ntn[target].dstatus[new]=WAR;
X return(new);
X}
X
Xint
Xrandomevent()
X{
X unsigned char wierd; /*because its weird I need to use this*/
X long totalscore=0;
X int count, event, newnation, i, j, armynum,x,y;
X int done, holdval; /*if 1 then event happened */
X long newpower;
X struct s_sector *sptr;
X
X printf("RANDOM HAPPENINGS ARE NOW BEING CHECKED\n");
X
X#ifdef VULCANIZE
X/* have a volcano erupt on the map based on percent chance of PVULCAN */
X if(rand()%100<PVULCAN) erupt();
X#endif
X
X for(country=0;country<MAXNTN;country++)
X if( ntn[country].active != 0 )
X totalscore+= ntn[country].score;
X
X /* decide what nations get random event */
X for(country=0;country<MAXNTN;country++)
X if (( ntn[country].active != 0 )
X &&(ntn[country].score > 20L)
X &&((rand()%totalscore) < NORANDEVENTS * ntn[country].score)){
X event = rand()%(MAXRANEVENT+1);
X printf("event %2d",event);
X done=TRUE;
X /* do the event */
X switch(event) {
X case 0:
X /*general/province defects*/
X if(disolve(10, country)==0) done=FALSE;;
X break;
X case 1:
X /*evil wizard sets up -- disolve 10%*/
X if(disolve(10, country)==0) done=FALSE;;
X break;
X case 2:
X /*tax revolt -- disolve 20%*/
X if(disolve(20, country)==0) done=FALSE;;
X break;
X case 3:
X /*rebelion -- disolve 30%*/
X if(rand()%2==0) { if(disolve(30, country)==0) done=FALSE; }
X else done=FALSE;
X break;
X case 4:
X /*general takes over province -- disolve 30%*/
X if(rand()%2==0) { if(disolve(30, country)==0) done=FALSE; }
X else done=FALSE;
X break;
X case 5:
X /*religious schism -- disolve 30%*/
X if(rand()%2==0) { if(disolve(30, country)==0) done=FALSE; }
X else done=FALSE;
X break;
X case 6:
X case 7:
X case 8:
X /*peasant revolt */
X if((newnation=disolve(10, country)) == 0 ) done=FALSE;
X if(done==TRUE)
X for (i=0; i<MAPX; i++) for (j=0; j<MAPY; j++)
X if(( sct[i][j].owner == country)
X &&( solds_in_sector(i,j,country)==0))
X if(rand()%10<=3) {
X sct[i][j].owner = newnation;
X for(armynum=0;armynum<MAXARM;armynum++)
X if(ASOLD == 0) {
X ASOLD = sct[i][j].people/4;
X ASTAT = A_MILITIA;
X sct[i][j].people -= ASOLD;
X break;
X }
X }
X break;
X case 9:
X /*dragon raid -- lose 30% of food*/
X ntn[country].tfood *= 7L;
X ntn[country].tfood /= 10L;
X break;
X case 10:
X /*famine -- food=0 10% starve*/
X ntn[country].tfood /= 4L;
X break;
X case 11:
X /*hurricane*/
X sptr = rand_sector();
X
X wdisaster(country,xpos,ypos,20,"hurricane");
X sprintf (eventstr,"centered on sector %d, %d", xpos, ypos);
X /* one hex radius */
X for (x=xpos-1;x<=xpos+1;x++)
X for (y=ypos-1;y<=ypos+1;y++) if(ONMAP) {
X sptr = &sct[x][y];
X if ((sptr->designation != DCAPITOL) &&
X (sptr->designation != DCITY))
X sptr->designation = DNODESIG;
X else if (sptr->fortress != 0)
X sptr->fortress--;
X reduce(x, y, 20);
X }
X break;
X case 12:
X /*tornado*/
X sptr = rand_sector();
X sprintf (eventstr, "in sector %d, %d", xpos, ypos);
X if ((sptr->designation != DCAPITOL)
X && (sptr->designation != DCITY))
X sptr->designation = DNODESIG;
X else {
X if (sptr->fortress < 2) sptr->fortress = 0;
X else sptr->fortress -= 2;
X }
X wdisaster(country,xpos,ypos,25,"tornado");
X reduce(xpos, ypos, 25);
X break;
X case 13:
X /*volcano -- all flee around one mountain -- 30% die*/
X holdval=0; /* holdval is # of mountains */
X for (i=0; i<MAPX; i++) for (j=0; j<MAPY; j++)
X if(sct[i][j].owner==country && sct[i][j].altitude==MOUNTAIN)
X holdval++;
X
X if (holdval > 0) count = (rand()%holdval) + 1;
X else count = done = FALSE;
X if( count == FALSE ) break;
X
X for (i=0; count && (i<MAPX); i++)
X for (j=0;count && (j<MAPY); j++)
X if (( sct[i][j].owner == country)
X && (sct[i][j].altitude == MOUNTAIN)) {
X count--;
X if (count == 0) {
X blowup(i,j);
X }
X }
X break;
X case 14:
X /*royal wedding (absorb neighbor nation)*/
X /* takeover ( 100, 0 ); */ done=FALSE;
X /* something not right.... */
X break;
X case 15:
X /*new alloy +10% combat (WARRIOR...)*/
X if(magic(country,WARRIOR)!=1){
X ntn[country].powers|=WARRIOR;
X exenewmgk(WARRIOR);
X }
X else if(magic(country,CAPTAIN)!=1){
X ntn[country].powers|=CAPTAIN;
X exenewmgk(CAPTAIN);
X }
X else if(magic(country,WARLORD)!=1){
X ntn[country].powers|=WARLORD;
X exenewmgk(WARLORD);
X }
X break;
X case 16:
X /*royal advisor is spy -- lose power*/
X done=FALSE;
X break;
X case 17:
X case 18:
X /*gold strike one sector +4-10 gold*/
X done=FALSE;
X for (i=0; i<MAPX; i++) for (j=0; j<MAPY; j++)
X if(( sct[i][j].owner == country)
X && (done == FALSE)
X && (is_habitable(i,j))
X && (rand()%3 == 0)) {
X wierd = (char) rand()%7;
X wierd+=4;
X sct[i][j].gold += wierd;
X done=TRUE;
X break;
X }
X break;
X case 19:
X case 20:
X /*gold vein runs out one goldmine sector >5 gold */
X for (i=0; i<MAPX; i++) for (j=0; j<MAPY; j++)
X if(( sct[i][j].owner == country)
X && (sct[i][j].gold >= 5)
X && (done == FALSE)
X && (sct[i][j].designation == DGOLDMINE)){
X sct[i][j].gold =0;
X sct[i][j].designation = DFARM;
X done=TRUE;
X }
X break;
X case 21:
X /*flood*/
X done=FALSE;
X break;
X case 22: /*earthquake*/
X /* get epicenter */
X sptr = rand_sector();
X sprintf (eventstr, "quake in sector %d, %d (owner %s)", xpos, ypos,ntn[country].name);
X /* 10% damage in 3 sectors, 25 in 1, 50 in */
X for (x=xpos-3;x<=xpos+3;x++)
X for (y=ypos-3;y<=ypos+3;y++) if(ONMAP) {
X reduce(x, y, 10);
X }
X
X for (x=xpos-1;x<=xpos+1;x++)
X for (y=ypos-1;y<=ypos+1;y++) if(ONMAP) {
X reduce(x,y,15); /* ADDITIONAL 15% */
X if(((rand()%2) == 0)
X &&(sct[x][y].designation!= DCAPITOL)
X &&(sct[x][y].designation!= DCITY))
X sct[x][y].designation=DNODESIG;
X }
X
X if(is_habitable(xpos,ypos))
X sptr->designation = DDEVASTATED;
X if (sptr->fortress < 2) sptr->fortress = 0;
X else sptr->fortress -= 2;
X reduce(xpos, ypos, 25); /* ADDITIONAL 25% */
X wdisaster(country,xpos,ypos,50,"earthquake");
X break;
X case 23:
X /*frost -- crops ruined*/
X done=FALSE;
X break;
X case 24:
X /*dragon killed + 50000 jewels*/
X ntn[country].jewels+=50000;
X break;
X case 25:
X /*nomad raid -- put large nomad army in area*/
X done=FALSE;
X for(count=0; count < 100; count++) if(done <= 3){
X i=(rand()%(MAPX-8))+4;
X j=(rand()%(MAPY-8))+4;
X /* get army number */
X armynum = -1;
X for(newpower=0; newpower<MAXARM; newpower++)
X if (ntn[NNOMAD].arm[newpower].sold == 0)
X armynum=newpower;
X if(armynum == -1) done=4;
X else if((is_habitable(i,j))
X && ( sct[i][j].owner == country)) {
X ntn[NNOMAD].arm[armynum].xloc =i;
X ntn[NNOMAD].arm[armynum].yloc =j;
X if(ntn[country].tmil > 10000) /* 800-4800 */
X ntn[NNOMAD].arm[armynum].sold =800+50*(rand()%80);
X else if(ntn[country].tmil > 5000) /* 500-2500 */
X ntn[NNOMAD].arm[armynum].sold =500+50*(rand()%40);
X else if(ntn[country].tmil > 1000) /* 400-1400 */
X ntn[NNOMAD].arm[armynum].sold =400+20*(rand()%50);
X else /* 200-600 */
X ntn[NNOMAD].arm[armynum].sold =200+20*(rand()%20);
X ntn[NNOMAD].arm[armynum].unittyp = A_CAVALRY;
X ntn[NNOMAD].arm[armynum].stat =ATTACK;
X done++;
X }
X }
X done=TRUE;
X break;
X case 26:
X /*town burns -- reduce fort and redesignate*/
X done=FALSE;
X for (i=0; i<MAPX; i++) for (j=0; j<MAPY; j++)
X if(( sct[i][j].owner == country)
X && ( done == FALSE )
X && ( sct[i][j].designation == DCITY)){
X sct[i][j].designation = DNODESIG;
X wdisaster(country,i,j,50,"city burned down");
X reduce(i,j,50);
X done=TRUE;
X }
X break;
X case 27:
X /*plague -- 40% of populace dies*/
X for (i=0; i<MAPX; i++) for (j=0; j<MAPY; j++)
X if( sct[i][j].owner == country){
X sct[i][j].people *= 6;
X sct[i][j].people /= 10;
X }
X for (armynum=0; armynum<MAXARM; armynum++)
X if((ASOLD > 0)&&(ATYPE<MINMONSTER)){
X ASOLD *= (6);
X ASOLD /= (10);
X }
X break;
X case 28: /*pirate raid on harbor*/
X done=FALSE;
X break;
X case 29: /*barbarian raid*/
X done=FALSE;
X break;
X case 30: /*new magician + RANDOM POWER*/
X /*buy new powers and/or new weapons*/
X if((newpower=getmagic(M_CIV))!=0L){
X printf("\tnation %s gets magic power number %ld\n",ntn[country].name,newpower);
X fprintf(fnews,"1. \tevent in %s->gets magic power number %ld\n", ntn[country].name,newpower);
X exenewmgk(newpower);
X }
X else done=FALSE;
X break;
X case 31: /*new magic item + RANDOM POWER*/
X /*buy new powers and/or new weapons*/
X if((newpower=getmagic(M_MIL))!=0){
X printf("\tnation %s gets magic power number %ld\n",ntn[country].name,newpower);
X fprintf(fnews,"1. \tevent in %s->gets magic power number %ld\n", ntn[country].name,newpower);
X exenewmgk(newpower);
X }
X else done=FALSE;
X break;
X case 32:
X /* ores run out */
X done=FALSE;
X for (i=0; i<MAPX; i++) for (j=0; j<MAPY; j++)
X if(( sct[i][j].owner == country)
X && (sct[i][j].iron >= 5)
X && (done == FALSE)
X && (sct[i][j].designation == DMINE)){
X sct[i][j].iron =0;
X sct[i][j].designation = DNODESIG;
X done=TRUE;
X }
X case 33:
X /*new architect strengthens castle walls */
X for (i=0; i<MAPX; i++) for (j=0; j<MAPY; j++)
X if(( sct[i][j].owner == country)
X && (sct[i][j].designation == DCITY
X || sct[i][j].designation == DCAPITOL))
X sct[i][j].fortress += 2;
X break;
X case 34:
X /*new ores discovered + 4-10 iron*/
X done=FALSE;
X for (i=0; i<MAPX; i++) for (j=0; j<MAPY; j++)
X if(( sct[i][j].owner == country)
X && (done == FALSE)
X && (is_habitable(i,j))
X && (sct[i][j].iron != 0)){
X sct[i][j].iron += 4;
X wierd = (char) rand()%7;
X sct[i][j].iron += wierd;
X done=TRUE;
X }
X break;
X case 35:
X /*new leader sets up peace*/
X for (newnation=0;newnation<MAXNTN;newnation++) if(country!=newnation) {
X if( ntn[newnation].dstatus[country]>NEUTRAL ){
X ntn[newnation].dstatus[country]=NEUTRAL;
X ntn[country].dstatus[newnation]=NEUTRAL;
X }
X }
X break;
X case 36:
X case 37:
X /*severe winter*/
X done=FALSE;
X break;
X case 38:
X /*tidal wave -- abandon all coastlands */
X done=FALSE;
X break;
X case 39: /*ninja attack paralyzes half your armys AMOVE=0*/
X case 40: /*general found to be spy AMOVE=0*/
X for(armynum=0; armynum<MAXARM; armynum++) if(rand()%2==0)
X AMOVE = 0;
X break;
X case 41:
X /*general prosperity +20% gold*/
X if (ntn[country].tgold > 0l) {
X ntn[country].tgold *= 12l;
X ntn[country].tgold /= 10l;
X }
X else done=FALSE;
X break;
X case 42:
X case 43:
X /*kill 20% of armies*/
X for (armynum=0; armynum<MAXARM; armynum++)
X if((ASOLD > 0) && (ATYPE<MINMONSTER)){
X ASOLD *= (8);
X ASOLD /= (10);
X }
X break;
X default:
X printf("error condition -- illegal random event\n");
X break;
X }
X if(done==TRUE) fprintf(fnews,"1. \tevent in %s - %s\n"
X ,ntn[country].name,randevents[event]);
X if(done==TRUE) printf("\t%s -- %s\n"
X ,ntn[country].name,randevents[event]);
X else printf("\t%s -- (unimplemented) %s\n"
X ,ntn[country].name,randevents[event]);
X if(strlen(eventstr)>5) {
X printf("\t\t->%s\n",eventstr);
X if(done==TRUE) fprintf(fnews,"1. \tevent in %s -->%s\n"
X ,ntn[country].name,eventstr);
X }
X strcpy(eventstr,"");
X }
X}
X
X#ifdef VULCANIZE
X/*volcano erupts --- causes devastation in surrounding sectors */
Xvoid
Xerupt()
X{
X int i, j, nvolcanos=0, volhold;
X
X printf("checking for volcanic eruptions\n");
X /* count all of the volcanos */
X for (i=0; i<MAPX; i++) for (j=0; j<MAPY; j++)
X if(sct[i][j].vegetation == VOLCANO) nvolcanos++;
X
X if(nvolcanos==0) {
X printf("no volcano's found\n");
X return;
X }
X /* choose a random one to erupt */
X volhold = rand()%nvolcanos;
X for (i=0; i<MAPX; i++) for (j=0; j<MAPY; j++)
X if ( sct[i][j].vegetation == VOLCANO ) {
X volhold--;
X if (volhold == 0) blowup(i,j);
X }
X}
X#endif VULCANIZE
X
X/* blowup a volcano in sector i,j */
Xvoid
Xblowup(i,j)
Xregister int i,j;
X{
X register int x,y;
X wdisaster(sct[i][j].owner,i,j,100,"volcano erupted");
X printf("\tvolcano at %d, %d erupts; devastates surounding area\n",i,j);
X fprintf(fnews,"1. \tevent in sector %d, %d->volcanic eruption causes devastation\n",i,j);
X sct[i][j].vegetation = VOLCANO;
X sct[i][j].gold = 0;
X sct[i][j].iron = 0;
X reduce(i,j,100);
X if(is_habitable(i,j))
X sct[i][j].designation = DDEVASTATED;
X sct[i][j].fortress = 0;
X /* decrease neighboring population and armies 30% */
X for(x=i-1; x<=i+1; x++) for(y=j-1; y<=j+1; y++)
X if((ONMAP)&&(sct[x][y].altitude != WATER)) {
X reduce(x,y,30);
X if(is_habitable(x,y))
X sct[x][y].designation = DDEVASTATED;
X sct[x][y].fortress = 0;
X }
X}
X
X/** reduce will drop armies & and civilians in sector by percent **/
Xvoid
Xreduce(x,y,percent)
Xint x,y,percent;
X{
X long temp; /* used to avoid overflow problems */
X int armynum,ctry;
X
X percent = 100 - percent; /* invert percent so math works */
X
X /* work on people */
X temp = sct[x][y].people;
X temp *= percent;
X temp /= 100;
X sct[x][y].people = temp;
X
X /* work on armies */
X for(ctry=1;ctry<MAXNTN;ctry++) {
X for(armynum=0;armynum<MAXARM;armynum++)
X if((ntn[ctry].arm[armynum].xloc==x)
X &&(ntn[ctry].arm[armynum].unittyp<MINMONSTER)
X &&(ntn[ctry].arm[armynum].yloc==y)) {
X temp = ntn[ctry].arm[armynum].sold;
X temp *= percent;
X temp /= 100;
X ntn[ctry].arm[armynum].sold = temp;
X }
X }
X}
X
X/* returns pointer to random sector in country */
Xstruct s_sector
X*rand_sector()
X{
X int count=0;
X for(xpos=0;xpos<MAPX;xpos++) for(ypos=0;ypos<MAPX;ypos++)
X if(sct[xpos][ypos].owner == country) count++;
X count = rand()%count;
X for(xpos=0;xpos<MAPX;xpos++) for(ypos=0;ypos<MAPX;ypos++){
X if(sct[xpos][ypos].owner == country) count--;
X if(count==0) return(&sct[xpos][ypos]);
X }
X abrt();
X}
X
X/*global disaster report --- tell 'em where it hit */
Xwdisaster(cntry,xloc,yloc,prcnt,event)
Xint cntry,xloc,yloc,prcnt;
Xchar *event;
X{
X char line[100];
X FILE *fp, *fopen();
X char realname[12];
X
X /*send a message to the country if it is a PC*/
X if (ntn[country].active!=1) {
X return;
X }
X strcpy(realname,ntn[cntry].name);
X sprintf(line,"%s%d",msgfile,cntry);
X if((fp=fopen(line,"a+"))==NULL) {
X printf("\nError in writing disaster report.");
X abrt();
X }
X fprintf(fp,"%s GLOBAL DISASTER REPORT\n",realname);
X fprintf(fp,"%s \n",realname);
X fprintf(fp,"%s\tDisaster occurs within nation %s:\n",realname,realname);
X fprintf(fp,"%s\tA %s struck during the day centered around location %d %d.\n",realname,event,xloc,yloc);
X if(prcnt>0) {
X fprintf(fp,"%s\tDamage was estimated at about %d%% in severity.\n",realname,prcnt);
X }
X fputs("END\n",fp);
X fclose(fp);
X}
X#endif ADMIN
X#endif RANEVENT
END_OF_randevent.c
if test 22037 -ne `wc -c <randevent.c`; then
echo shar: \"randevent.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f update.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"update.c\"
else
echo shar: Extracting \"update.c\" \(21402 characters\)
sed "s/^X//" >update.c <<'END_OF_update.c'
X/* Conquer: Copyright (c) 1988 by Edward M Barlow
X * I spent a long time writing this code & I hope that you respect this.
X * I give permission to alter the code, but not to copy or redistribute
X * it without my explicit permission. If you alter the code,
X * please document changes and send me a copy, so all can have it.
X * This code, to the best of my knowledge works well, but it is my first
X * 'C' program and should be treated as such. I disclaim any
X * responsibility for the codes actions (use at your own risk). I guess
X * I am saying "Happy gaming", and am trying not to get sued in the process.
X * Ed
X */
X
X#include "header.h"
X#include "data.h"
X#include <ctype.h>
X
Xextern FILE *fnews;
X
Xextern short country;
Xint attr[MAPX][MAPY]; /*sector attactiveness*/
Xextern short movecost[MAPX][MAPY];
X
X/*update nation */
Xvoid
Xupdate()
X{
X char command[80];
X
X if ((fnews=fopen(newsfile,"w"))==NULL) {
X printf("error opening news file\n");
X exit(FAIL);
X }
X
X /*run each nation in a random order*/
X updexecs();
X
X#ifdef LZARD
X /* run lizard nations */
X updlizards();
X#endif
X
X#ifdef MONSTER
X /* update monster nations */
X monster();
X#endif
X
X /*run combat*/
X combat();
X
X /* capture unoccupied sectors */
X updcapture();
X
X /*for whole map, update one sector at a time*/
X updsectors();
X
X /*reset military stuff for whole world*/
X updmil();
X
X /*commodities: feed the people, too much gold?, validate iron*/
X updcomodities();
X
X#ifdef RANEVENT
X /*run random events */
X randomevent();
X#endif RANEVENT
X
X fprintf(fnews,"1\tIMPORTANT WORLD NEWS\n");
X fclose(fnews);
X
X#ifdef CHEAT
X cheat();
X#endif CHEAT
X
X /* score all nations */
X score();
X
X sprintf(command,"/bin/rm -f %s*",exefile);
X printf("%s\n",command);
X system(command);
X
X sprintf( command, "sort -n -o %s %s", newsfile, newsfile );
X printf("%s\n",command);
X system(command);
X}
X
X/* returns attractiventess */
Xint
Xattract(x,y,race)
X{
X register struct s_sector *sptr = &sct[x][y];
X int Attr = 1;
X
X if((sptr->designation==DGOLDMINE)&&(sptr->gold>3)){
X if(ntn[sptr->owner].jewels<=ntn[sptr->owner].tgold*GOLDTHRESH)
X Attr+=120;
X else if(sptr->gold>5) Attr+=120;
X else Attr+=75;
X }
X else if((sptr->designation==DFARM)&&(tofood(sptr->vegetation,sptr->owner)>=6)){
X if(ntn[sptr->owner].tfood<=ntn[sptr->owner].tciv*FOODTHRESH)
X Attr+=300;
X else if(tofood(sptr->vegetation,sptr->owner)==9) Attr+=100;
X else Attr+=40;
X }
X else if(sptr->designation==DCAPITOL) Attr+=200;
X else if(sptr->designation==DCITY) Attr+=125;
X else if((sptr->designation==DMINE)&&(sptr->iron>3)) {
X if(ntn[sptr->owner].tiron<=ntn[sptr->owner].tciv)
X Attr+=120;
X else if(sptr->iron>5) Attr+=100;
X else Attr+=50;
X }
X
X switch(race){
X case DWARF:
X if((sptr->designation==DGOLDMINE)&&(sptr->gold>=5))
X Attr+=100;
X else if((sptr->designation==DMINE)&&(sptr->iron>=5))
X Attr+=100;
X
X if(sptr->altitude==MOUNTAIN) Attr+=40;
X else if(sptr->altitude==HILL) Attr+=20;
X else if(sptr->altitude==CLEAR) Attr+=0;
X else Attr=0;
X break;
X case ELF:
X if(sptr->vegetation==JUNGLE) Attr+=40;
X else if(sptr->vegetation==WOOD) Attr+=90;
X else if(sptr->vegetation==FOREST) Attr+=50;
X
X if((sptr->designation==DGOLDMINE)&&(sptr->gold>=5))
X Attr+=75;
X
X if(sptr->altitude==MOUNTAIN) Attr-=20;
X else if(sptr->altitude==HILL) Attr-=10;
X else if(sptr->altitude==CLEAR) Attr+=0;
X else Attr=0;
X break;
X case HUMAN:
X Attr+=tofood(sptr->vegetation,sptr->owner)*4;
X
X if((sptr->designation==DGOLDMINE)&&(sptr->gold>=5))
X Attr+=75;
X else if((sptr->designation==DMINE)&&(sptr->iron>=5))
X Attr+=75;
X else if((sptr->designation==DFARM)&&(tofood(sptr->vegetation,sptr->owner)>=6))
X Attr+=55;
X else if(sptr->designation==DCAPITOL) Attr+=70;
X else if(sptr->designation==DCITY) Attr+=50;
X
X if(sptr->altitude==MOUNTAIN) Attr-=10;
X else if(sptr->altitude==HILL) Attr+=00;
X else if(sptr->altitude==CLEAR) Attr+=10;
X else Attr=0;
X break;
X case ORC:
X if(sptr->designation==DCAPITOL) Attr+=120;
X else if(sptr->designation==DCITY) Attr+=75;
X else if((sptr->designation==DGOLDMINE)&&(sptr->gold>=5))
X Attr+=75;
X else if((sptr->designation==DMINE)&&(sptr->iron>=5))
X Attr+=75;
X
X if(sptr->altitude==MOUNTAIN) Attr+=20;
X else if(sptr->altitude==HILL) Attr+=10;
X else if(sptr->altitude==CLEAR) Attr+=0;
X else Attr=0;
X break;
X default:
X break;
X }
X if((Attr<0)||(movecost[x][y]<0)) Attr=0;
X return(Attr);
X}
X
Xvoid
Xarmymove(armynum)
Xint armynum;
X{
X int sum, where;
X register int x, y;
X
X sum=0;
X for(x=AXLOC-2;x<=AXLOC+2;x++)
X for(y=AYLOC-2;y<=AYLOC+2;y++)
X if(ONMAP) sum+=attr[x][y];
X
X if(sum==0) {
X AXLOC=ntn[country].capx;
X AYLOC=ntn[country].capy;
X } else {
X where=rand()%sum;
X for(x=AXLOC-2;x<=AXLOC+2;x++) for(y=AYLOC-2;y<=AYLOC+2;y++) {
X if( x < 0 || x >= MAPX || y < 0 || y >= MAPY )
X continue;
X
X where -= attr[x][y];
X if( (where < 0 )
X && movecost[x][y]>=1
X && movecost[x][y]<=AMOVE
X &&(land_reachp(AXLOC,AYLOC,x,y,AMOVE,country))){
X AXLOC=x;
X AYLOC=y;
X /* CHANGE SO ARMIES MOVE PSEUDO INDEPENDANTLY */
X if((sct[x][y].designation != DCAPITOL)
X &&(sct[x][y].designation != DCITY)
X &&(sct[x][y].owner==country))
X attr[x][y]/=2;
X
X if(sct[x][y].owner==0){
X sct[x][y].owner=country;
X attr[x][y]/=2;
X }
X
X return;
X } /* if */
X } /* for for */
X
X /*do again - have this block if lots of bad terrain*/
X /*what could happen is that it won't find a move first time*/
X for(x=AXLOC-2;x<=AXLOC+2;x++) for(y=AYLOC-2;y<=AYLOC+2;y++) {
X if( x < 0 || x >= MAPX || y < 0 || y >= MAPY )
X continue;
X
X where -= attr[x][y];
X if( (where < 0 )
X && movecost[x][y]>=1
X && movecost[x][y]<=AMOVE
X &&(land_reachp(AXLOC,AYLOC,x,y,AMOVE,country))){
X AXLOC=x;
X AYLOC=y;
X if(sct[x][y].owner==0)
X sct[x][y].owner=country;
X return;
X } /* if */
X } /* for for */
X } /* if */
X}
X
Xvoid
Xscore()
X{
X int x;
X printf("\nupdating scores for all nations\n");
X for(x=1;x<MAXNTN;x++) if(ntn[x].active!=0) ntn[x].score += score_one(x);
X}
X
X#ifdef CHEAT
X/* this routine cheats in favor of npc nations */
Xvoid
Xcheat()
X{
X int x,y;
X int bonus=0, count=0, npcavg, pcavg, avgscore=0;
X /* add gold */
X for(x=1;x<MAXNTN;x++) if(ntn[x].active>1) {
X if((ntn[x].tgold<ntn[x].tciv)
X &&( rand()%5==0)){
X ntn[x].tgold+=10000;
X printf("npc cheat routine - add $10000 to nation %s\n",ntn[x].name);
X }
X }
X
X for(x=1;x<MAXNTN;x++) if(ntn[x].active!=0)
X if(ntn[x].active==1) {
X bonus+=ntn[x].aplus+ntn[x].dplus;
X avgscore+=ntn[x].score;
X count++;
X }
X
X if(count==0) return;
X pcavg = bonus / count;
X avgscore /= count;
X printf("pc average score is %d count is %d\n",avgscore,count);
X
X bonus=0;
X count=0;
X for(x=1;x<MAXNTN;x++) if(ntn[x].active!=0)
X if(ntn[x].active!=1) {
X bonus+=ntn[x].aplus+ntn[x].dplus;
X count++;
X }
X if(count==0) return;
X npcavg = bonus / count;
X for(x=1;x<MAXNTN;x++)
X if((ntn[x].active > 1)
X &&(ntn[x].score < avgscore)
X &&(rand()%100 < (pcavg-npcavg))) {
X if(ntn[x].aplus>ntn[x].dplus) ntn[x].dplus+=1;
X else ntn[x].aplus+=1;
X printf("npc cheat routine - add 1%% to nation %s combat skill\n",ntn[x].name);
X }
X
X /* cheat by making npc's frendlier to each other if they are */
X /* of the same race */
X for(x=1;x<MAXNTN;x++) if(ntn[x].active>=2)
X for(y=1;y<MAXNTN;y++) if(ntn[y].active>=2)
X if((ntn[x].dstatus[y]!=CONFEDERACY)
X &&(ntn[x].dstatus[y]!=UNMET)){
X if(ntn[x].race == ntn[y].race){
X ntn[x].dstatus[y]--;
X } else {
X if(ntn[x].dstatus[y]!=JIHAD)
X if(rand()%4==0)
X ntn[x].dstatus[y]--;
X }
X }
X}
X#endif CHEAT
X
X/* update all nations in a random order, move civilians of that nation */
Xupdexecs()
X{
X register struct s_sector *sptr;
X register int i, j;
X register int x,y;
X int moved,done, number=0;
X
X int finis=FALSE;
X int execed[MAXNTN];
X
X for(country=0;country<MAXNTN;country++) execed[country]=FALSE;
X
X system("date");
X
X while(finis==FALSE){
X
X /*get random active nation*/
X country=(rand()%(MAXNTN-1))+1;
X if(ntn[country].active <= 0) continue;
X
X done=FALSE;
X number=0;
X /*Find the next unupdated nation*/
X while(done==FALSE){
X if((ntn[country].active>0)
X &&(execed[country]==FALSE)) {
X done=TRUE;
X execed[country]=TRUE;
X } else {
X country++;
X number++;
X if(number>MAXNTN) {
X finis=TRUE;
X done=TRUE;
X }
X else if(country>=MAXNTN) country=1;
X }
X }
X
X if(finis==TRUE) continue;
X
X printf("updating nation number %d -> %s\n",country,ntn[country].name);
X
X /*if execute is 0 and PC nation then they did not move*/
X if((execute()==0)&&(ntn[country].active==1)){
X printf("\tnation %s did not move\n",ntn[country].name);
X#ifdef CMOVE
X printf("\tthe computer will move for %s\n",ntn[country].name);
X fprintf(fnews,"1.\tthe computer will move for %s\n",ntn[country].name);
X nationrun();
X#endif
X }
X#ifdef NPC
X /* run npc nations */
X if(ntn[country].active>=2) {
X nationrun();
X /*do magic*/
X#ifdef ORCTAKE
X if(magic(country,MA_MONST)==1) {
X if(x=takeover(5,0)==1)
X printf("SUCCESSFUL TAKEOVER OF %d",x);
X } else if(magic(country,AV_MONST)==1) {
X if(x=takeover(3,0)==1)
X printf("SUCCESSFUL TAKEOVER OF %d",x);
X } else if(magic(country,MI_MONST)==1){
X if(x=takeover(1,0)==1)
X printf("SUCCESSFUL TAKEOVER OF %d",x);
X }
X#endif ORCTAKE
X }
X#endif
X
X /*update movement array*/
X updmove( ntn[country].race,country );
X
X /*THIS IS WHERE YOU ZERO THE ATTR MATRIX*/
X /*calculate sector attractiveness*/
X for(x=0;x<MAPX;x++) for(y=0;y<MAPY;y++) {
X sptr = &sct[x][y];
X if((sptr->owner==country)
X &&(tofood(sptr->vegetation,sptr->owner)!=0)){
X attr[x][y]=attract(x,y,ntn[country].race);
X }
X else if(((magic(sptr->owner,DERVISH)==1)
X ||(magic(sptr->owner,DESTROYER)==1))
X &&((sptr->vegetation==ICE)
X ||(sptr->vegetation==DESERT))) {
X attr[x][y]=36;
X }
X else attr[x][y]=0;
X }
X
X /*if near capitol add to attr*/
X for(x=ntn[country].capx-2;x<=ntn[country].capx+2;x++)
X for(y=ntn[country].capy-2;y<=ntn[country].capy+2;y++)
X if(attr[x][y]>0) attr[x][y]+=20;
X
X/*MOVE CIVILIANS based on the ratio of attractivenesses
X *
X * EQUILIBRIUM(1) = A1/(A1+A2) * (P1+P2)
X * EQUILIBRIUM(2) = A2/(A1+A2) * (P1+P2)
X * MOVE 1/5 of way to equilibrium each turn
X * DELTA(1) = (EQUILIBRIUM(1)-P1)/5 = (A1P2-P1A2)/5(A1+A2)
X * DELTA(2) = (EQUILIBRIUM(2)-P2)/5 = (A2P1-P2A1)/5(A1+A2) = -DELTA(1)
X * ij is refered to as 1, xy as 2
X * NOTE AM ADDING 1 to divisor to prevent floating exception errors
X */
X for(x=0; x<MAPX; x++ ) for(y=0; y<MAPY; y++) {
X
X sptr = &sct[x][y];
X if( sptr->owner != country )
X continue;
X if( sptr->people == 0 )
X continue;
X
X for(i=x-2;i<=x+2;i++) {
X if( i < 0 || i >= MAPX )
X continue;
X
X for(j=y-2;j<=y+2;j++) {
X if( j < 0 || j >= MAPY )
X continue;
X if( sct[i][j].owner != country)
X continue;
X moved=(sptr->people*attr[i][j]-sct[i][j].people*attr[x][y])/(1+5*(attr[i][j]+attr[x][y]));
X if( moved <= 0 )
X continue;
X
X sct[i][j].people += moved;
X sptr->people -= moved;
X } /* for */
X } /* for */
X } /* for */
X } /* while */
X
X /*zero out all recalculated values*/
X for(country=0;country<MAXNTN;country++){
X ntn[country].tships=0;
X ntn[country].tmil=0;
X if(magic(country,SUMMON)==TRUE) {
X if(rand()%4==0) ntn[country].spellpts/=2;
X ntn[country].spellpts+=4;
X if(magic(country,WYZARD)==TRUE)
X ntn[country].spellpts+=3;
X if(magic(country,SORCERER)==TRUE)
X ntn[country].spellpts+=3;
X }
X }
X
X}
X
X#ifdef LZARD
X/* update lizards and monsters */
Xupdlizards()
X{
X register int i, j;
X int armynum;
X
X puts("updating lizards\n ");
X country = NLIZARD;
X /*move to lizard castle*/
X for(armynum=0;armynum<MAXARM;armynum++)
X if((ASOLD>0)&&(ASTAT==ATTACK)) {
X if(ntn[NLIZARD].arm[armynum-1].sold<=0) {
X ASOLD=0;
X continue;
X }
X AMOVE =20; /* just in case god wants to move them */
X AXLOC = ntn[NLIZARD].arm[armynum-1].xloc;
X AYLOC = ntn[NLIZARD].arm[armynum-1].yloc;
X for(i=ntn[NLIZARD].arm[armynum-1].xloc-1;i<=ntn[NLIZARD].arm[armynum-1].xloc+1;i++) {
X for(j=ntn[NLIZARD].arm[armynum-1].yloc-1;j<=ntn[NLIZARD].arm[armynum-1].yloc+1;j++) {
X if((i>=0)&&(j>=0)&&(i<MAPX)&&(j<MAPY)
X &&(sct[i][j].altitude!=WATER)
X &&(sct[i][j].altitude!=PEAK)
X &&(sct[i][j].owner != NLIZARD)
X &&(rand()%3==0)){
X AXLOC = i;
X AYLOC = j;
X }
X }
X }
X }
X#ifdef DEBUG
X for(armynum=0;armynum<MAXARM;armynum++) {
X if((ASOLD>0)&&(sct[AXLOC][AYLOC].altitude==WATER))
X printf("ERROR line %d... %s army %d in water (army %d: x: %d y: %d)\n",__LINE__,ntn[NLIZARD].name,armynum,armynum-1, ntn[NLIZARD].arm[armynum-1].xloc, ntn[NLIZARD].arm[armynum-1].yloc);
X }
X#endif DEBUG
X}
X#endif
X
X/* capture unoccupied sectors */
Xupdcapture()
X{
X register struct s_sector *sptr;
X int armynum;
X
X fprintf(fnews,"3\tNEWS ON WHAT SECTORS HAVE BEEN CAPTURED\n");
X /*look for any areas where armies alone in sector*/
X prep(country);
X for(country=1;country<NTOTAL;country++) if(ntn[country].active!=0){
X for(armynum=0;armynum<MAXARM;armynum++)
X/* cheat in favor of npcs as the routines assume 75 man armies */
X if(((ntn[country].active==1)&&(ASOLD>TAKESECTOR))
X ||((ntn[country].active>1)&&(ASOLD>75))){
X sptr = &sct[AXLOC][AYLOC];
X if(sptr->owner==0){
X sptr->owner=country;
X }
X else if((sptr->owner!=country)
X &&(ntn[country].dstatus[sptr->owner]>=WAR)
X &&(occ[AXLOC][AYLOC]==country)){
X
X if((sptr->owner!=0)
X &&(ntn[sptr->owner].race!=ntn[country].race))
X if(magic(country,SLAVER)==TRUE){
X flee(AXLOC,AYLOC,1,TRUE);
X }else{
X flee(AXLOC,AYLOC,1,FALSE);
X }
X#ifdef HIDELOC
X fprintf(fnews,"3.\tarea captured by %s from %s\n",ntn[country].name,ntn[sptr->owner].name);
X#else
X fprintf(fnews,"3.\tarea %d,%d captured by %s from %s\n",AXLOC,AYLOC,ntn[country].name,ntn[sptr->owner].name);
X#endif HIDELOC
X sptr->owner=country;
X }
X }
X }
X
X /* capture countries */
X for(country=1;country<MAXNTN;country++)
X if((ntn[country].active>=2)
X &&((ntn[country].tciv==0)
X ||(sct[ntn[country].capx][ntn[country].capy].owner!=country)))
X destroy(country);
X}
X
X/* update sectors */
Xupdsectors()
X{
X register struct s_sector *sptr;
X register struct nation *nptr;
X register int i, j;
X register int x,y;
X
X printf("\nupdating all sectors\n");
X for(x=0;x<MAPX;x++) for(y=0;y<MAPY;y++) {
X sptr = &sct[x][y];
X if(sptr->owner == 0) continue;
X nptr = &ntn[sptr->owner];
X
X /* add to contents of sector */
X if(rand()%100<FINDPERCENT) {
X if(rand()%2==0) sct[x][y].iron++;
X else sct[x][y].gold++;
X }
X
X /* if huge number dont reproduce */
X if(sptr->people > BIG / 50L) {
X if(sptr->people * sptr->iron > 2*(rand()%100)*TOMUCHMINED)
X sptr->iron--;
X if(sptr->people * sptr->gold > 2*(rand()%100)*TOMUCHMINED)
X sptr->gold--;
X } else if((sptr->people > TOMANYPEOPLE)&&(sptr->designation!=DCITY)&&(sptr->designation!=DCAPITOL)){
X sptr->people += (nptr->repro * sptr->people)/200;
X if(sptr->people * sptr->iron > 2*(rand()%100)*TOMUCHMINED)
X sptr->iron--;
X if(sptr->people * sptr->gold > 2*(rand()%100)*TOMUCHMINED)
X sptr->gold--;
X } else if(sptr->people<100) {
X sptr->people+=sptr->people/10;
X } else {
X sptr->people += (nptr->repro * sptr->people)/100;
X if(sptr->people * sptr->iron > (rand()%100)*TOMUCHMINED)
X sptr->iron--;
X if(sptr->people * sptr->gold > (rand()%100)*TOMUCHMINED)
X sptr->gold--;
X }
X
X /*check all adjacent sectors and decide if met */
X for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++)
X if(i>=0&&i<MAPX&&j>=0&&j<MAPY&&(sct[i][j].owner!=0)) {
X if(sptr->owner!=sct[i][j].owner) {
X if(nptr->dstatus[sct[i][j].owner]==UNMET)
X newdip(sptr->owner,sct[i][j].owner);
X if(ntn[sct[i][j].owner].dstatus[sptr->owner]==UNMET)
X newdip(sct[i][j].owner,sptr->owner);
X }
X }
X
X /* if desert sector... reverts to desert */
X if(tofood(sptr->vegetation,sptr->owner)<DESFOOD){
X sptr->designation=DNODESIG;
X }
X }
X
X for(country=1;country<MAXNTN;country++) {
X if(ntn[country].active != 0){
X spreadsheet(country);
X ntn[country].tsctrs = spread.sectors;
X ntn[country].tciv=spread.civilians;
X ntn[country].tfood=spread.food;
X ntn[country].tgold=spread.gold;
X ntn[country].tiron=spread.iron;
X ntn[country].jewels=spread.jewels;
X }
X }
X}
X
X/* reset military stuff */
Xupdmil()
X{
X register int x,y;
X int armynum,nvynum;
X
X printf("updating armies and navies\n");
X for(country=1;country<NTOTAL;country++) if(ntn[country].active!=0){
X for(armynum=0;armynum<MAXARM;armynum++){
X if(ASOLD>0) {
X ntn[country].tmil+=ASOLD;
X /*add movement to all armies */
X /*unitmove is 10 times movement rate*/
X switch(ASTAT) {
X case MARCH:
X AMOVE=(ntn[country].maxmove * *(unitmove+(ATYPE%100)))/5;
X break;
X case SCOUT:
X case ATTACK:
X case DEFEND:
X AMOVE=(ntn[country].maxmove * *(unitmove+(ATYPE%100)))/10;
X break;
X case GARRISON:
X AMOVE=0;
X break;
X default:
X ASTAT=DEFEND;
X AMOVE=(ntn[country].maxmove * *(unitmove+(ATYPE%100)))/10;
X }
X if((magic(country,ROADS)==1)
X &&(sct[AXLOC][AYLOC].owner!=country))
X if(AMOVE>4) AMOVE-=4;
X
X if((magic(country,VAMPIRE)==1)
X &&(ATYPE<100)){
X ntn[country].tgold -= ASOLD * (*(unitmaint+(ATYPE))) / 4;
X } else
X if((magic(country,SAPPER)==1)
X &&((ATYPE==A_CATAPULT)||(ATYPE==A_SEIGE))){
X ntn[country].tgold -= ASOLD * (*(unitmaint+(ATYPE))) / 2;
X } else
X ntn[country].tgold -= ASOLD * (*(unitmaint+(ATYPE%100)));
X if(ATYPE>=MINMONSTER)
X ntn[country].jewels -= ASOLD * (*(unitmaint+(ATYPE%100))/5);
X }
X }
X /*add to movement of fleets*/
X for(nvynum=0;nvynum<MAXNAVY;nvynum++) {
X /*update sea sectors*/
X if( NMER + NWAR > 0 ) {
X if(sct[NXLOC][NYLOC].altitude==WATER) {
X#ifdef STORMS
X/*
X * Storms should stay around and slowly move
X * around the world.
X */
X /*all ships sunk on percentage PSTORM*/
X /*pirates never are sunk (implicitly)*/
X if( country != NPIRATE &&
X (rand()%100 < PSTORM) ) {
X x = NXLOC;
X y = NYLOC;
X#ifdef HIDELOC
X fprintf(fnews,"3.\tstorm sinks %s fleet at sea\n",ntn[country].name);
X#else
X fprintf(fnews,"3.\tstorm sinks %s fleet in %d,%d\n",ntn[country].name,x,y);
X#endif HIDELOC
X NWAR=0;
X NMER=0;
X }
X#endif
X }
X NMOVE = 3 * ntn[country].maxmove * NCREW;
X NMOVE /= ((NWAR+NMER)*SHIPCREW);
X ntn[country].tships += NWAR + NMER;
X ntn[country].tgold -= (NWAR + NMER) * SHIPMAINT;
X } else {
X NWAR=0;
X NMER=0;
X }
X } /* for */
X }
X}
X
X/* update commodities */
Xupdcomodities()
X{
X FILE *fpmsg;
X register struct s_sector *sptr;
X register int x,y;
X long xx;
X char command[80];
X long dead;
X
X fprintf(fnews,"2\tWORLD FOOD SUPPLY & DECLARATIONS OF WAR\n");
X for(country=1;country<MAXNTN;country++) if(ntn[country].active!=0){
X /*soldiers eat 2*/
X ntn[country].tfood-=ntn[country].tmil*2;
X /*civilians eat 1*/
X ntn[country].tfood-=ntn[country].tciv;
X
X /*starve people*/
X if(ntn[country].tfood<0) for(x=0;x<MAPX;x++) for(y=0;y<MAPY;y++) {
X sptr = &sct[x][y];
X if((sptr->owner==country)
X &&((sptr->designation==DCITY)
X ||(sptr->designation==DCAPITOL))
X &&(ntn[country].tfood<0)){
X /*lose one person in city per three food*/
X /*maximum of 1/3 people in city lost*/
X if(sptr->people < ntn[country].tfood){
X sptr->people+=ntn[country].tfood/3;
X ntn[country].tfood=0;
X }
X else {
X ntn[country].tfood+=sptr->people;
X dead = sptr->people/3;
X sptr->people -= dead;
X }
X fprintf(fnews,"2.\tfamine hits city at %d,%d in %s.\n",x,y,ntn[country].name);
X#ifdef HIDELOC
X fprintf(fnews,"2.\tfamine hits town in %s.\n",ntn[country].name);
X#else
X fprintf(fnews,"2.\tfamine hits town at %d,%d in %s.\n",x,y,ntn[country].name);
X#endif HIDELOC
X printf("famine hits town at %d,%d in %s.\n",x,y,ntn[country].name);
X sprintf(command,"%s%d",msgfile,country);
X if(ntn[country].active==1)
X if((fpmsg=fopen(command,"a+"))==NULL) {
X printf("error opening %s\n",command);
X } else {
X fprintf(fpmsg,"%s notice from program\n%s\n",ntn[country].name,ntn[country].name);
X fprintf(fpmsg,"%s famine hits town at %d,%d in %s.-> %ld people reduced by %ld\n%s\n",ntn[country].name,x,y,ntn[country].name,sptr->people,dead,ntn[country].name);
X fprintf(fpmsg,"END\n");
X fclose(fpmsg);
X }
X }
X }
X /*this state can occur if few people live in cities*/
X if(ntn[country].tfood<0) {
X ntn[country].tfood=0L;
X }
X else if(ntn[country].tfood>FOODTHRESH*ntn[country].tciv) {
X ntn[country].tgold+=ntn[country].tfood-FOODTHRESH*ntn[country].tciv;
X ntn[country].tfood=FOODTHRESH*ntn[country].tciv;
X }
X
X if(ntn[country].tgold>GOLDTHRESH*ntn[country].jewels){
X xx=ntn[country].tgold-GOLDTHRESH*ntn[country].jewels;
X ntn[country].jewels += xx/GOLDTHRESH;
X ntn[country].tgold -= xx;
X }
X else if(ntn[country].tgold > JEWELTHRESH * ntn[country].jewels){
X fprintf(fnews,"3.\tTAX REVOLT IN NATION %s\n",ntn[country].name);
X }
X
X /* fix overflow problems */
X if(ntn[country].tgold < -1*BIG) {
X fprintf(fnews,"2.\tVariable Overflow - gold in nation %s\n",ntn[country].name);
X ntn[country].tgold=BIG;
X }
X if(ntn[country].tfood < -1*BIG) {
X fprintf(fnews,"2.\tVariable Overflow - food in nation %s\n",ntn[country].name);
X ntn[country].tfood=BIG;
X }
X if(ntn[country].jewels < -1*BIG) {
X fprintf(fnews,"2.\tVariable Overflow - jewels in nation %s\n",ntn[country].name);
X ntn[country].jewels=BIG;
X }
X if(ntn[country].tiron < -1*BIG) {
X fprintf(fnews,"2.\tVariable Overflow - iron in nation %s\n",ntn[country].name);
X ntn[country].tiron=BIG;
X }
X }
X}
END_OF_update.c
if test 21402 -ne `wc -c <update.c`; then
echo shar: \"update.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 5 \(of 8\).
cp /dev/null ark5isdone
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