billr@saab.CNA.TEK.COM (Bill Randle) (06/24/89)
Submitted-by: adb@bu-it.bu.edu (Adam Bryant)
Posting-number: Volume 6, Issue 91
Archive-name: conquer4/Part09
Superseeds: conquer3; Volume 4, Issue 42-49
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 9 (of 14)."
# Contents: admin.c check.c makeworl.c newlogin.h
# Wrapped by billr@saab on Thu Jun 15 15:20:18 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'admin.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'admin.c'\"
else
echo shar: Extracting \"'admin.c'\" \(16157 characters\)
sed "s/^X//" >'admin.c' <<'END_OF_FILE'
X/*conquer : Copyright (c) 1988 by Ed Barlow.
X * I spent a long time writing this code & I hope that you respect this.
X * I give permission to alter the code, but not to copy or redistribute
X * it without my explicit permission. If you alter the code,
X * please document changes and send me a copy, so all can have it.
X * This code, to the best of my knowledge works well, but it is my first
X * 'C' program and should be treated as such. I disclaim any
X * responsibility for the codes actions (use at your own risk). I guess
X * I am saying "Happy gaming", and am trying not to get sued in the process.
X * Ed
X */
X
X#include "header.h"
X#include "data.h"
X#include <ctype.h>
X
X#include <signal.h>
X
X#include <fcntl.h>
X#include <pwd.h>
X/*Declarations*/
Xchar *getpass();
Xstruct s_sector **sct;
Xstruct s_nation ntn[NTOTAL]; /* player nation stats */
Xstruct s_world world;
X/*is sector occupied by an army?*/
Xchar **occ;
Xshort **movecost;
Xlong startgold=0;
X
X/*offset of upper left hand corner*/
Xshort xoffset=0,yoffset=0;
X/*current cursor postion (relative to 00 in upper corner)*/
X/* position is 2*x,y*/
Xshort xcurs=0,ycurs=0;
X/*display state*/
Xshort dismode=2;
X/* nation id of owner*/
Xshort country=0;
Xstruct s_nation *curntn;
X
XFILE *fexe, *fopen();
X
Xvoid
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X{
X int geteuid(), getuid(), setuid();
X register int i;
X char *name;
X void srand();
X int getopt();
X long time();
X /* mflag = makeworld, a=add player, x=execute, p=print */
X /* rflag = make world from read in files */
X int mflag, aflag, xflag, pflag, rflag;
X char string[80];
X extern char *optarg;
X char defaultdir[256];
X struct passwd *getpwnam();
X
X mflag = aflag = xflag = pflag = rflag = 0;
X srand((unsigned) time((long *) 0));
X strcpy(defaultdir, DEFAULTDIR);
X name = string;
X *name = 0;
X
X /* process the command line arguments */
X while((i=getopt(argc,argv,"maxpr:d:"))!=EOF) switch(i){
X /* process the command line arguments */
X case 'm': /* make a new world*/
X mflag++;
X break;
X case 'a': /* anyone with password can add player*/
X aflag++;
X break;
X case 'x': /* execute program*/
X xflag++;
X break;
X case 'p': /* print the map*/
X pflag++;
X break;
X case 'r': /* read map file */
X rflag++;
X if(strlen(optarg) > NAMELTH){
X fprintf(stderr,"ERROR: MAPFILE STEM LONGER THAN %d\n",NAMELTH);
X exit(FAIL);
X }
X strcpy(scenario, optarg);
X break;
X case 'd':
X strcpy(defaultdir, optarg);
X break;
X case '?': /* print out command line arguments */
X printf("Command line format: %s [-maxp -dDIR -rSCENARIO]\n",argv[0]);
X printf("\t-m make a world\n");
X printf("\t-a add new player\n");
X printf("\t-x execute program\n");
X printf("\t-d DIR to use play different game\n");
X printf("\t-p print a map\n");
X /* printf("\t-r SCENARIO read map while making a new world\n\t\t\tuses SCENARIO.ele, SCENARIO.veg, & SCENARIO.nat\n"); */
X exit(SUCCESS);
X };
X
X#ifdef OGOD
X if(((getuid())!=(getpwnam(LOGIN)->pw_uid))&&(!aflag))
X {
X printf("Sorry -- you can not administrate conquer\n");
X printf("you need to be logged in as %s\n",LOGIN);
X exit(FAIL);
X }
X /* may now replace user identity */
X (void) setuid (geteuid ()) ;
X#endif OGOD
X
X /* now that we have parsed the args, we can got to the
X * dir where the files are kept and do some work.
X */
X if (chdir(defaultdir)) {
X printf("unable to change dir to %s\n",defaultdir);
X exit(FAIL);
X }
X if((mflag)||(rflag)) {
X makeworld(rflag);
X sprintf(string,"%sup",isonfile);
X unlink(string);
X exit(SUCCESS);
X }
X
X /* read data*/
X readdata();
X verifydata( __FILE__, __LINE__ );
X
X if (aflag) { /* a new player */
X sprintf(string,"%sup",isonfile);
X if(check_lock(string,FALSE)==TRUE) {
X printf("Conquer is updating\n");
X printf("Please try again later.\n");
X exit(FAIL);
X }
X
X sprintf(string,"%s0",isonfile);
X if(check_lock(string,FALSE)==TRUE) {
X printf("God is currently logged in.\n");
X printf("Please try again later.\n");
X exit(FAIL);
X }
X
X printf("\n********************************************");
X printf("\n* PREPARING TO ADD NEW PLAYERS *");
X printf("\n********************************************\n");
X if( TURN > 5 ){
X printf("more than 5 turns have passed since game start!\n");
X printf("permission of game administrator required\n");
X if(strncmp(crypt(getpass("\nwhat is conquer super user password:"),SALT),ntn[0].passwd,PASSLTH)!=0)
X {
X printf("sorry...\n");
X exit(FAIL);
X }
X }
X /* prevent more than one addition */
X sprintf(string,"%sadd",isonfile);
X if(check_lock(string,TRUE)==TRUE) {
X printf("Some else is adding\n");
X printf("Please try again later.\n");
X exit(FAIL);
X }
X
X /* disable interrupts */
X signal(SIGINT,SIG_IGN);
X signal(SIGQUIT,SIG_IGN);
X newlogin();
X unlink(string);
X exit(SUCCESS);
X } else if (pflag) { /* print a map of the game */
X#ifdef OGOD
X if(strncmp(crypt(getpass("\nwhat is conquer super user password:"),SALT),ntn[0].passwd,PASSLTH)!=0) {
X printf("sorry, must be super user to get map\n");
X exit(FAIL);
X }
X#endif OGOD
X printf("For Convienience, output is to stderr\n");
X printf("what type of map\noptions are\n");
X printf("\t1) altitudes\n\t2) vegetations\n");
X printf("\t3) nations\n\n");
X printf("\tINPUT:");
X scanf("%hd",&dismode);
X if(dismode==1) printele();
X else if(dismode==2) printveg();
X else pr_ntns();
X exit(SUCCESS);
X } else if (xflag) { /* update the game */
X#ifndef OGOD
X if ( getuid() != (getpwnam(LOGIN))->pw_uid ){
X printf("sorry -- your uid is invalid for updating\n");
X printf("you need to be logged in as %s\n",LOGIN);
X exit(FAIL);
X }
X#endif OGOD
X#ifdef RUNSTOP
X /* check if any players are on */
X for (i=0;i<NTOTAL;i++) {
X sprintf(string,"%s%d",isonfile,i);
X if(check_lock(string,FALSE)==TRUE) {
X printf("Nation %d is still in the game.\n",i);
X printf("Update aborted.\n");
X exit(FAIL);
X }
X }
X#endif RUNSTOP
X sprintf(string,"%sup",isonfile);
X if(check_lock(string,TRUE)==TRUE) {
X printf("Another update is still executing.\n");
X printf("Update aborted.\n");
X exit(FAIL);
X }
X update();
X writedata();
X unlink(string);
X exit(SUCCESS);
X }
X printf("error: must specify an option\n");
X
X /* print out command line arguments */
X printf("Command line format: %s [-maxp -dDIR]\n",argv[0]);
X printf("\t-a add new player\n");
X printf("\t-d DIR to use play different game\n");
X printf("\t-m make a world\n");
X printf("\t-p print a map\n");
X printf("\t-x execute program\n");
X exit(SUCCESS);
X}
X
X/* if parameter == 0 do for all nations */
Xvoid
Xatt_setup(cntry)
Xint cntry;
X{
X int nat;
X for( nat= 0; nat<NTOTAL;nat++) if( isntn( ntn[nat].active ))
X if( (cntry==0) || (nat==cntry) ){
X ntn[nat].farm_ability = 10;
X ntn[nat].poverty = 95;
X ntn[nat].popularity=ntn[nat].reputation=ntn[nat].prestige = 50;
X ntn[nat].eatrate = 25;
X ntn[nat].tax_rate = 10;
X if( magic(nat,MINER) )
X ntn[nat].mine_ability = 25;
X else ntn[nat].mine_ability = 10;
X ntn[nat].knowledge = 10;
X ntn[nat].charity = 0;
X }
X}
X
X/* calculates a nations base values in each of its attributes */
X/* includes bonuses for magic powers, but not trade goods */
Xvoid
Xatt_base()
X{
X long cityfolk,townfolk,scholars,foodpts,minepts,roads,clerics,ngrain;
X long blksmths;
X long mercs,armynum,ncities;
X long temp;
X int x,y;
X char d;
X
X /* set to one so NEVER will have a divide by 0 */
X WORLDJEWELS=1; WORLDGOLD=1; WORLDMETAL=1;
X WORLDFOOD=1; WORLDSCORE=1; WORLDCIV=1; WORLDSCT=1;
X WORLDMIL=1; WORLDNTN=0;
X for(country=1;country<NTOTAL;country++) {
X curntn= &ntn[country];
X if( !isntn( curntn->active )) continue;
X WORLDNTN++;
X WORLDJEWELS+=curntn->jewels;
X if(curntn->tgold>0) WORLDGOLD+=curntn->tgold;
X WORLDMETAL+=curntn->metals;
X WORLDFOOD+=curntn->tfood;
X WORLDSCORE+=curntn->score;
X WORLDCIV+=curntn->tciv;
X WORLDSCT+=curntn->tsctrs;
X WORLDMIL+=curntn->tmil;
X }
X if (WORLDGOLD==0) WORLDGOLD=1;
X printf("calculating new national attributes: sum of scores=%ld of mil=%ld\n",WORLDSCORE,WORLDMIL);
X
X /* count the number of sectors */
X for(country=1;country<NTOTAL;country++) {
X if(!isntn(ntn[country].active)) continue;
X curntn= &ntn[country];
X cityfolk=townfolk=scholars=foodpts=minepts=roads=clerics=ngrain=ncities=blksmths=0;
X
X for(x=0;x<MAPX;x++) for(y=0;y<MAPY;y++)
X if(sct[x][y].owner == country) {
X d = sct[x][y].designation;
X if( d==DTOWN) townfolk+=sct[x][y].people;
X else if( d==DCITY ){
X cityfolk+=sct[x][y].people;
X ncities++;
X } else if( d==DMINE ) {
X if( tg_ok( country, &sct[x][y] ))
X minepts+=sct[x][y].metal;
X } else if( d==DFARM )
X foodpts += sct[x][y].people * tofood( &sct[x][y],country);
X else if( d==DCAPITOL ){
X ncities+=3;
X cityfolk+=sct[x][y].people;
X } else if( d==DUNIVERSITY)scholars+=sct[x][y].people;
X else if( d==DROAD ) roads++;
X else if( d==DCHURCH ) clerics+=sct[x][y].people;
X else if( d==DGRANARY ) ngrain++;
X else if( d==DBLKSMITH ) blksmths+=sct[x][y].people;
X }
X cityfolk /= 167;
X townfolk /= 167;
X scholars /=167;
X clerics /= 167;
X blksmths /= 167;
X
X /* use prior eatrate a weighting factor */
X if (curntn->eatrate<25) curntn->eatrate=25;
X if( TURN!= 1) { /* remember eatrate is scaled by 25 */
X switch(SEASON(TURN)) {
X case WINTER: /* 7 food/person for each eatrate */
X temp = 180L * curntn->tfood/(curntn->eatrate+25L);
X break;
X case SPRING: /* 6 food/person for each eatrate */
X temp = 204L * curntn->tfood/(curntn->eatrate+25L);
X break;
X case SUMMER: /* 5 food/person for each eatrate */
X temp = 250L * curntn->tfood/(curntn->eatrate+25L);
X break;
X case FALL: /* 4 food/person for each eatrate */
X temp = 312L * curntn->tfood/(curntn->eatrate+25L);
X break;
X }
X if(curntn->tciv>0) x = curntn->eatrate/2 + temp/curntn->tciv;
X else x = 25;
X if( x < MAXTGVAL ) curntn->eatrate = (char)x;
X else curntn->eatrate=MAXTGVAL;
X if ( curntn->eatrate < 25 ) curntn->eatrate=25;
X
X } else {
X cityfolk = 10; /* Aproximate steady state */
X }
X
X if( 30 <= 1+ngrain+ncities ) curntn->spoilrate=1;
X else curntn->spoilrate = 30-ngrain-ncities;
X if( curntn->tfood > curntn->tciv * 10 )
X curntn->spoilrate = 30;
X
X /* get number of mercenaries */
X mercs=0;
X for(armynum=0;armynum<MAXARM;armynum++)
X if(P_ATYPE==A_MERCENARY) mercs+=P_ASOLD;
X if(curntn->tmil>0 && curntn->tciv>0) temp=(1000*curntn->tmil)/curntn->tciv+(1000*mercs)/curntn->tmil;
X else temp=0;
X curntn->terror = min( temp/5, MAXTGVAL );
X
X temp = (5*townfolk/2+5*cityfolk) + roads*5;
X curntn->communications = min( temp,2*MAXTGVAL );
X
X temp=1000*curntn->score/WORLDSCORE + 1000*curntn->tmil/WORLDMIL;
X curntn->power = min(temp/5,MAXTGVAL);
X
X temp = curntn->tgold;
X if(temp<0) temp=0;
X temp = 1000*temp/WORLDGOLD + 1000*curntn->jewels/WORLDJEWELS + 1000*curntn->metals/WORLDMETAL + cityfolk*5/3 + townfolk*5/6;
X curntn->wealth = min( temp/10,MAXTGVAL );
X
X if( TURN!= 1) {
X curntn->reputation += rand()%8-3;
X curntn->reputation = min( curntn->reputation,MAXTGVAL );
X
X temp = (curntn->prestige + curntn->power + curntn->wealth) / 3;
X curntn->prestige = min( temp,MAXTGVAL );
X
X if(curntn->tciv>0) temp = foodpts*10 / curntn->tciv;
X else temp = 0;
X curntn->farm_ability = min( temp,MAXTGVAL );
X }
X temp = (minepts/3 + cityfolk/2 + townfolk/2 + blksmths);
X curntn->mine_ability = min( temp,MAXTGVAL );
X if( magic(country,MINER) )
X curntn->mine_ability += 15;
X if( magic(country,STEEL) )
X curntn->mine_ability += 15;
X
X temp = cityfolk/2 + townfolk/6 + scholars/2;
X curntn->knowledge = min( temp,MAXTGVAL );
X
X temp = (curntn->wealth + 10*P_EATRATE + clerics + curntn->popularity)/2;
X curntn->popularity = min( temp,MAXTGVAL );
X
X /* poverty tends 10% to 100-wealth/4 */
X curntn->poverty += (100-curntn->wealth/4-curntn->poverty+5)/10;
X
X if(magic(country,SLAVER)) curntn->terror+=PWR_NA;
X if(magic(country,RELIGION)) curntn->popularity+=PWR_NA;
X if(magic(country,URBAN)) {
X if(curntn->popularity > PWR_NA)
X curntn->popularity-=PWR_NA;
X else curntn->popularity=0;
X }
X if(magic(country,DEMOCRACY)) {
X curntn->eatrate += 25;
X if(curntn->terror > PWR_NA)
X curntn->terror-=PWR_NA;
X else curntn->terror=0;
X curntn->charity+=2; /* it creeps up */
X }
X if(magic(country,KNOWALL)) curntn->knowledge+=PWR_NA;
X if(magic(country,ARCHITECT)){
X if(curntn->spoilrate>=PWR_NA)
X curntn->spoilrate-=PWR_NA;
X else curntn->spoilrate=1;
X }
X if(magic(country,ROADS)) curntn->communications+=50;
X if(magic(country,DESTROYER)) curntn->terror+=PWR_NA;
X if(magic(country,ROADS)) curntn->terror+=PWR_NA;
X if(magic(country,VAMPIRE)) curntn->terror+=PWR_NA;
X
X switch(curntn->class){
X case C_NPC: curntn->popularity+=CLA_NA;
X curntn->terror+=CLA_NA; break;
X case C_KING: curntn->popularity+=CLA_NA; break;
X case C_TRADER: curntn->wealth+=CLA_NA;
X curntn->popularity+=CLA_NA;
X curntn->prestige+=CLA_NA/3; break;
X case C_EMPEROR: curntn->wealth+=CLA_NA;
X curntn->popularity+=CLA_NA;
X curntn->prestige+=CLA_NA/3; break;
X case C_WIZARD: curntn->knowledge+=CLA_NA; break;
X case C_PRIEST: curntn->popularity+=CLA_NA; break;
X case C_PIRATE: curntn->terror+=CLA_NA; break;
X /* for warlord remember it is recursive */
X case C_WARLORD: curntn->prestige+=CLA_NA*2/3; break;
X case C_DEMON: curntn->terror+=CLA_NA; break;
X case C_DRAGON: curntn->terror+=CLA_NA; break;
X case C_SHADOW: curntn->terror+=CLA_NA; break;
X }
X
X curntn->prestige = min( curntn->prestige, MAXTGVAL );
X curntn->popularity = min( curntn->popularity, MAXTGVAL );
X curntn->power = min( curntn->power, MAXTGVAL );
X curntn->communications = min( curntn->communications, 2*MAXTGVAL);
X curntn->wealth = min( curntn->wealth, MAXTGVAL );
X curntn->eatrate = min( curntn->eatrate, MAXTGVAL );
X curntn->knowledge = min( curntn->knowledge, MAXTGVAL );
X curntn->farm_ability = min( curntn->farm_ability, MAXTGVAL );
X curntn->mine_ability = min( curntn->mine_ability, MAXTGVAL );
X curntn->terror = min( curntn->terror, MAXTGVAL );
X curntn->reputation = min( curntn->reputation, MAXTGVAL );
X }
X}
X
X/* calculates a nations bonuses due to trade goods */
Xvoid
Xatt_bonus()
X{
X short x,y,nation,good;
X struct s_sector *sptr;
X printf("working on exotic trade goods\n");
X for(x=0;x<MAPX;x++) for(y=0;y<MAPY;y++) {
X if(!isntn(ntn[sct[x][y].owner].active)) continue;
X
X sptr = &sct[x][y];
X nation = sptr->owner;
X curntn = &ntn[nation];
X
X if( !tg_ok( nation, sptr) ) continue;
X
X good = sptr->tradegood;
X
X if(( *(tg_stype+good)== sptr->designation )
X ||(( *(tg_stype+good)== DTOWN )&&(sptr->designation==DCITY))
X ||(( *(tg_stype+good)== DTOWN )&&(sptr->designation==DCAPITOL))
X ||(( *(tg_stype+good)== DCITY )&&(sptr->designation==DCAPITOL))
X ||(( *(tg_stype+good)== DUNIVERSITY )&&(sptr->designation==DCITY))
X ||(( *(tg_stype+good)== DUNIVERSITY )&&(sptr->designation==DCAPITOL))
X ||( *(tg_stype+good)== 'x' ))
X if( good <= END_POPULARITY ) {
X curntn->popularity += ( *(tg_value+good) - '0');
X curntn->popularity = min( MAXTGVAL, curntn->popularity );
X } else if( good <= END_COMMUNICATION ) {
X if(curntn->communications + (*(tg_value+good) - '0')<2*MAXTGVAL)
X curntn->communications += (*(tg_value+good) - '0');
X else curntn->communications = 2*MAXTGVAL;
X } else if( good <= END_EATRATE ) { /* eatrate scaled already */
X /* no tradegoods for eatrate */
X curntn->eatrate = min( MAXTGVAL, curntn->eatrate );
X } else if( good <= END_SPOILRATE ) {
X if(curntn->spoilrate > (*(tg_value+good) - '0'))
X curntn->spoilrate -= (*(tg_value+good)-'0');
X else curntn->spoilrate = 1;
X } else if( good <= END_KNOWLEDGE ) {
X if(curntn->knowledge + (*(tg_value+good)-'0') < MAXTGVAL)
X curntn->knowledge += (*(tg_value+good) - '0');
X else curntn->knowledge = MAXTGVAL;
X } else if( good <= END_FARM ) {
X if(curntn->farm_ability + (*(tg_value+good) - '0') < MAXTGVAL)
X curntn->farm_ability += (*(tg_value+good)-'0');
X else curntn->farm_ability = MAXTGVAL;
X } else if( good <= END_SPELL ) {
X curntn->spellpts++;
X } else if( good <= END_TERROR ) {
X if(curntn->terror + (*(tg_value+good)-'0')< MAXTGVAL)
X curntn->terror += (*(tg_value+good)-'0');
X else curntn->terror = MAXTGVAL;
X }
X }
X}
END_OF_FILE
if test 16157 -ne `wc -c <'admin.c'`; then
echo shar: \"'admin.c'\" unpacked with wrong size!
fi
# end of 'admin.c'
fi
if test -f 'check.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'check.c'\"
else
echo shar: Extracting \"'check.c'\" \(5133 characters\)
sed "s/^X//" >'check.c' <<'END_OF_FILE'
X/* Conquer: Copyright (c) 1988 by Edward M Barlow */
X/* check.c contains checking and debugging functions */
X
X#include <ctype.h>
X#include <stdio.h>
X#include "header.h"
X#include "data.h"
X
Xvoid
Xverify_ntn( __file__, __line__ )
Xchar __file__[];
Xint __line__;
X{
X register struct s_nation *nptr;
X register int i;
X register int country;
X struct army *a;
X
X for( country = 0; country < NTOTAL; country++ ) {
X nptr = &ntn[country];
X
X if(nptr->active == 0) continue;
X if( nptr->metals < 0.0 ) {
X fprintf( stderr, "file %s: line %d: nation[%d] metal = %ld\n",
X __file__, __line__, country, nptr->metals );
X nptr->metals = 0.0;
X }
X
X if( nptr->jewels < 0 ) {
X fprintf( stderr, "file %s: line %d: nation[%d] jewels = %ld\n",
X __file__, __line__, country, nptr->jewels );
X nptr->jewels = 0.0;
X }
X
X for( i = 0; i < MAXARM; i++ ) {
X a = &nptr->arm[i];
X if( a->sold < 0 ) {
X fprintf( stderr, "file %s: line %d: nation[%d] army[%d] sold = %d\n",
X __file__, __line__, country, i, a->sold );
X a->sold = 0;
X }
X if( a->sold==0 ) continue;
X if( a->xloc >= MAPX ) {
X fprintf( stderr, "file %s: line %d: nation[%d] army[%d] xlocation = %d\n",
X __file__, __line__, country, i, a->xloc );
X a->xloc = 0;
X }
X if( a->yloc >= MAPY ) {
X fprintf( stderr, "file %s: line %d: nation[%d] army[%d] ylocation = %d\n",
X __file__, __line__, country, i, a->yloc );
X a->yloc = 0;
X }
X if( sct[a->xloc][a->yloc].altitude==PEAK ) {
X fprintf( stderr, "file %s: line %d: nation[%d] army[%d] loc=%d,%d (peak)\n",
X __file__,__line__,country,i,a->xloc,a->yloc);
X a->sold = 0;
X }
X if( sct[a->xloc][a->yloc].altitude==WATER ) {
X fprintf( stderr, "file %s: line %d: nation[%d] army[%d] loc=%d,%d (water) men=%d\n",
X __file__,__line__,country,i,a->xloc,a->yloc,a->sold);
X a->sold = 0;
X }
X } /* for */
X
X for( i = 0; i < NTOTAL; i++ ) {
X if( nptr->dstatus[i] > JIHAD ) {
X fprintf( stderr, "file %s: line %d: nation[%d] diplomatic status with %d = %d\n",
X __file__, __line__, country, i, nptr->dstatus[i] );
X nptr->dstatus[i] = WAR;
X }
X } /* for */
X } /* for */
X} /* verify_ntn() */
X
Xvoid
Xverify_sct( __file__, __line__ )
Xchar __file__[];
Xint __line__;
X{
X register struct s_sector *sptr;
X register int x, y;
X
X for( x = 0; x < MAPX; x++ ) {
X for( y = 0; y < MAPY; y++ ) {
X sptr = &sct[x][y];
X
X if(sptr->tradegood>TG_none) {
X fprintf( stderr, "file %s: line %d: sct[%d][%d].tradegood = %d (invalid)\n", __file__, __line__, x, y, sptr->tradegood );
X sptr->tradegood=TG_none;
X }
X if(( sptr->metal != 0 )
X &&(( sptr->tradegood>END_MINE)
X ||(sptr->tradegood<=END_NORMAL))) {
X fprintf( stderr, "file %s: line %d: sct[%d][%d].metal = %d with no tradegood\n", __file__, __line__, x, y, sptr->metal );
X sptr->metal = 0;
X }
X
X if(( sptr->jewels != 0 )
X &&((sptr->tradegood>END_WEALTH)
X ||(sptr->tradegood<=END_MINE))) {
X fprintf( stderr, "file %s: line %d: sct[%d][%d].jewels = %d with no tradegood\n", __file__, __line__, x, y, sptr->jewels );
X sptr->jewels = 0;
X }
X
X if( sptr->people > ABSMAXPEOPLE )
X sptr->people = ABSMAXPEOPLE;
X
X if( sptr->people < 0 ) {
X fprintf( stderr, "file %s: line %d: sct[%d][%d].people = %d\n", __file__, __line__, x, y, sptr->people );
X if( sptr->people < -1*ABSMAXPEOPLE )
X sptr->people = ABSMAXPEOPLE;
X else sptr->people = 0;
X }
X
X if( sptr->owner != 0 && sptr->altitude == WATER ) {
X fprintf( stderr, "file %s: line %d: sct[%d][%d].owner = %s (a water sector)\n",__file__,__line__, x, y, ntn[sptr->owner].name );
X sptr->owner = 0;
X }
X if( sptr->fortress > 12 ){
X fprintf( stderr, "file %s: line %d: sct[%d][%d].fortress = %d \n",__file__,__line__, x, y, sptr->fortress );
X sptr->fortress = 12;
X }
X } /* for */
X } /* for */
X} /* verify_sct() */
X
Xvoid
Xverifydata( __file__, __line__ )
Xchar __file__[];
Xint __line__;
X{
X /* check for invalid values */
X verify_ntn( __file__, __line__ );
X verify_sct( __file__, __line__ );
X}/* verifydata() */
X
X#ifdef DEBUG
Xvoid
Xcheckout(file,line)
Xint line;
Xchar *file;
X{
X /* fprintf(stderr,"file %s line %d\n",file,line); */
X /* verifydata(file,line); */
X}
X#endif DEBUG
X
X#include <fcntl.h>
X#ifdef FILELOCK
X#include <sys/file.h>
X#endif FILELOCK
X
X/*
X * check_lock() -- routine to check if a file is locked.
X * - returns true if a lock is active false is not.
X * - setting keeplock to true means leaves lock active
X * if it is not already active.
X */
Xint
Xcheck_lock(filename,keeplock)
X char *filename;
X int keeplock;
X{
X int hold=FALSE;
X#ifdef FILELOCK
X int fd;
X
X if ((fd=open(filename,O_CREAT,0600))!=(-1)) {
X if(flock(fd, LOCK_EX|LOCK_NB)==(-1)) {
X hold=TRUE;
X }
X /* remove lock after checking */
X if(keeplock==FALSE && hold==FALSE) {
X close(fd);
X unlink(filename);
X }
X } else {
X printf("error opening lock file <%s>\n",filename);
X exit(FAIL);
X }
X#else
X if( access( filename, 00 ) == 0 ) {
X hold=TRUE;
X }
X if (hold==FALSE && keeplock==TRUE) {
X /* create lock file */
X if(open(filename,O_CREAT,0600)==(-1)) {
X printf("error opening lock file <%s>\n",filename);
X exit(FAIL);
X }
X }
X#endif FILELOCK
X return(hold);
X}
END_OF_FILE
if test 5133 -ne `wc -c <'check.c'`; then
echo shar: \"'check.c'\" unpacked with wrong size!
fi
# end of 'check.c'
fi
if test -f 'makeworl.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'makeworl.c'\"
else
echo shar: Extracting \"'makeworl.c'\" \(30426 characters\)
sed "s/^X//" >'makeworl.c' <<'END_OF_FILE'
X/* conquer : Copyright (c) 1988 by Ed Barlow.
X * I spent a long time writing this code & I hope that you respect this.
X * I give permission to alter the code, but not to copy or redistribute
X * it without my explicit permission. If you alter the code,
X * please document changes and send me a copy, so all can have it.
X * This code, to the best of my knowledge works well, but it is my first
X * 'C' program and should be treated as such. I disclaim any
X * responsibility for the codes actions (use at your own risk). I guess
X * I am saying "Happy gaming", and am trying not to get sued in the process.
X * Ed
X */
X
X/*Create a world*/
X
X/*DEFINE TEMPORARY VARIABLES FROM MAKEFILE*/
X#include <ctype.h>
X#include <stdio.h>
X#include "header.h"
X#include "data.h"
X
X#define HALF 2
X#define LAND 3
X
Xint pwater; /* percent water in world (0-100) */
Xextern short country;
Xextern int numleaders;
Xchar **area_map; /*Value Map of Areas*/
Xchar **type;
X
X#define TOHILL(x,y) if( nmountains != 0 ) { \
Xsct[(x)][(y)].altitude=HILL; \
Xnmountains--; \
X}
X#define TOMT(x,y) if( nmountains != 0 ) { \
Xsct[(x)][(y)].altitude=MOUNTAIN; \
Xnmountains--; \
X}
X#define TOPEAK(x,y) if( nmountains != 0 ) { \
Xsct[(x)][(y)].altitude=PEAK; \
Xnmountains--; \
X}
X
Xvoid
Xmakeworld(rflag)
Xint rflag; /* TRUE if you wish to read in a map from mapfiles */
X{
X char passwd[PASSLTH+1],*getpass();
X char newstring[40];
X FILE *fopen();
X
X /*abort if datafile currently exists*/
X if(access(datafile,00) == 0) {
X printf("ABORTING: File %s exists\n",datafile);
X printf("\tthis means that a game is in progress. To proceed, you must remove \n");
X printf("\tthe existing data file. This will, of course, destroy that game.\n\n");
X exit(FAIL);
X }
Xprintf("\n************************** WELCOME TO CONQUER **************************");
Xprintf("\n*\tThe world will now be created... *");
Xprintf("\n*\t *");
Xprintf("\n*\tYour super user login will be 'god'. *");
Xprintf("\n*\t *");
Xprintf("\n*\tNon player countries will be read from the file 'nations' *");
Xprintf("\n*\tand will have the same password as god (which you are about to *");
Xprintf("\n*\tenter). Add player nations with <conqrun -a>. Have fun!!! *");
Xprintf("\n*\t *");
Xprintf("\n*\tRemember to check the world out before playing to make sure *");
Xprintf("\n*\tno nations are in bad positions (surrounded by water... ) *");
Xprintf("\n************************************************************************\n\n");
X
X printf("First, we must zero extraneous files from prior games\n");
X printf("\tignore any errors this causes\n");
X sprintf(newstring,"rm -f %s* %s* %s* %s* %s 2> /dev/null",exefile,msgfile,newsfile,isonfile,tradefile);
X printf("\t%s\n",newstring);
X system(newstring);
X printf("OK This has been done, Now to set up a new world\n\n");
X
X while(TRUE) { /* password routine */
X strncpy(passwd,getpass("please enter new conquer super user password (remember this!):"),PASSLTH);
X strncpy(ntn[0].passwd,getpass("please reenter conquer password:"),PASSLTH);
X if((strlen(passwd)<2)
X ||(strncmp(ntn[0].passwd,passwd,PASSLTH)!=0)){
X beep();
X printf("\ninvalid super user password\n");
X } else break;
X }
X
X strncpy(ntn[0].passwd,crypt(passwd,SALT),PASSLTH);
X while(TRUE) {
X printf("\nplease enter the size of the world\n");
X
X printf("values should be divisible by 8 & greater than 23\n");
X printf("Enter number of X sectors: ");
X gets( passwd );
X world.mapx = atoi( passwd );
X if(((world.mapx % 8) != 0 ) || (world.mapx<24)){
X printf("ERROR: Invalid value entered\n");
X continue;
X }
X printf("Enter number of Y sectors: ");
X gets( passwd );
X world.mapy = atoi( passwd );
X if(((world.mapy % 8) != 0 ) || (world.mapy<24)){
X printf("ERROR: Invalid value entered\n");
X continue;
X }
X break;
X }
X
X getspace(); /* malloc space for this world */
X
X /* get amount of water to have in the world */
X while(TRUE) {
X printf("\nEnter percent water to have in world (0-100): ");
X gets( passwd );
X pwater = (-1);
X pwater = atoi( passwd );
X if((pwater<0) || (pwater>100 )){
X printf("ERROR: Invalid value entered\n");
X continue;
X }
X break;
X }
X
X if( rflag==FALSE ) createworld();
X else readmap(); /* read map in from mapfiles */
X rawmaterials();
X verifydata(__FILE__,__LINE__);
X writedata();
X
X /* initialize news file */
X sprintf(newstring,"%s0",newsfile);
X if( (fm=fopen(newstring,"w"))!=(FILE *)NULL ) {
X fprintf(fm,"1\tIMPORTANT WORLD NEWS\n");
X fprintf(fm,"5\tGLOBAL ANNOUNCEMENTS\n");
X fclose(fm);
X } else {
X fprintf(stderr,"error opening news file <%s>\n",newstring);
X }
X}
X
Xvoid
Xcreateworld() /* create world */
X{
X int i,j;
X register int x,y;
X int n; /*count used in string searches*/
X float avvalue; /*Average water tvalue of sectors*/
X int number[5]; /*Number of sectors with type=[0-4]*/
X int alloc = NUMAREAS * 2; /*Value Allocated*/
X char **tplace; /*Temp: to see if an area is placed*/
X int X, Y, chance;
X int X1,Y1;
X int X2,Y2;
X int valid;
X int rnd;
X long nmountains;
X
X tplace = (char **) m2alloc(MAPX,MAPY,sizeof(char));
X area_map = (char **) m2alloc(MAPX,MAPY,sizeof(char));
X type = (char **) m2alloc(MAPX,MAPY,sizeof(char));
X
X printf("\n\ncreating world\n");
X printf("\tin the beginning, the world was a set of bits ordered in\n");
X printf("\ta random way. Then the conquer game administrator (hereafter\n");
X printf("\tknown as god) decreed 'conqrun -m'!!!\n");
X printf("\nday 1... and the variables were initialized\n\n");
X /*initialize variables */
X avvalue = (((float) (100-pwater)/25.0)); /*Average water tvalue of sectors*/
X for(i=0;i<MAXX;i++) for(j=0;j<MAXY;j++)
X tplace[i][j] = area_map[i][j] = 0;
X
X for(i=0;i<MAPX;i++) for(j=0;j<MAPY;j++) sct[i][j].vegetation=NONE;
X
X for(i=0;i<5;i++) number[i] = NUMAREAS/5; /*areas with type=[i]*/
X number[2]=NUMAREAS - 4*number[0]; /*correct for roundoff*/
X
X /*determine # of area types to areas*/
X for(i=0;i<250;i++) {
X if((avvalue*NUMAREAS)>alloc) {
X /*have not allocated high enough so Allocate more */
X x = rand()%4; /*0 to 3*/
X if(number[x]>0) {
X number[x] = number[x] - 1;
X number[x+1] = number[x+1] + 1;
X alloc = alloc + 1;
X }
X }
X else {
X /*have allocated too much Allocate less */
X x = (rand()%4) +1; /*1 to 4*/
X if(number[x]>0) {
X number[x] = number[x] - 1;
X number[x-1] = number[x-1] + 1;
X alloc = alloc - 1;
X }
X }
X }
X
X i=0;
X while((number[4]>0)&&(i<500)) {
X i++;
X /*place a full land sector anywhere but on edge*/
X X = ((rand()%(MAXX-2))+1); /*1 to MAXX-2)*/
X Y = ((rand()%(MAXY-2))+1); /*1 to MAXY-2)*/
X if(tplace[X][Y] == 0) {
X tplace[X][Y]=1;
X area_map[X][Y]=4;
X number[4]=number[4] - 1;
X /*place surrounding sectors*/
X if(tplace[X+1][Y] == 0) {
X rnd = rand()%100 + 1; /*1 to 100*/
X if((rnd<25) && (number[4]>0)) {
X area_map[X+1][Y]=4;
X number[4]=number[4]-1;
X tplace[X+1][Y]=1;
X }
X if(rnd>25 && number[3]>0) {
X area_map[X+1][Y]=3;
X number[3]=number[3]-1;
X tplace[X+1][Y]=1;
X }
X }
X if(tplace[X-1][Y] == 0) {
X rnd = rand()%100 + 1 ; /*(1 to 100)*/
X if(rnd<25 && number[4]>0) {
X area_map[X-1][Y]=4;
X number[4]=number[4]-1;
X tplace[X-1][Y]=1;
X }
X if(rnd>25 && number[3]>0) {
X area_map[X-1][Y]=3;
X number[3]=number[3]-1;
X tplace[X-1][Y]=1;
X }
X }
X if(tplace[X][Y+1] == 0) {
X rnd = rand()%100 + 1 ; /*(1 to 100)*/
X if(rnd<25 && number[4]>0) {
X area_map[X][Y+1]=4;
X number[4]=number[4]-1;
X tplace[X][Y+1]=1;
X }
X if(rnd>25 && number[3]>0) {
X area_map[X][Y+1]=3;
X number[3]=number[3]-1;
X tplace[X][Y+1]=1;
X }
X }
X if(tplace[X][Y-1] == 0) {
X rnd = rand()%100 + 1 ; /*(1 to 100)*/
X if(rnd<25 && number[4]>0) {
X area_map[X][Y-1]=4;
X number[4]=number[4]-1;
X tplace[X][Y-1]=1;
X }
X if(rnd>25 && number[3]>0) {
X area_map[X][Y-1]=3;
X number[3]=number[3]-1;
X tplace[X][Y-1]=1;
X }
X }
X }
X }
X
X /* place all other areas*/
X for(X=0;X<MAXX;X++) for(Y=0;Y<MAXY;Y++) {
X while(tplace[X][Y] == 0) {
X rnd = rand()%5; /*(0 to 4)*/
X if(number[rnd]>0) {
X area_map[X][Y]=rnd;
X number[rnd]=number[rnd]-1;
X tplace[X][Y]=1;
X }
X }
X }
X
X /*ALL AREAS PLACED, NOW DETERMINE SECTOR TYPE
X *fill in each area with sectors
X * 1) water
X * 2) water with major islands (25% land)
X * 3) 50/50 water/land
X * 4) land with major water (75% Land)
X * 5) land
X */
X for(Y=0;Y<MAXY;Y++) for(X=0;X<MAXX;X++) {
X /*fill in edges*/
X fill_edge(X,Y);
X /*fill in center*/
X for(i=1;i<7;i++) {
X for(j=1;j<7;j++) switch(area_map[X][Y]){
X
X case 0:
X if((rand()%100) < 95) type[X*8+i][Y*8+j]=WATER;
X else type[X*8+i][Y*8+j]=HALF;
X break;
X case 1:
X if(rand()%2 == 0) type[X*8+i][Y*8+j]=WATER;
X else type[X*8+i][Y*8+j]=HALF;
X break;
X case 2:
X if (rand()%2 == 0) type[X*8+i][Y*8+j]=WATER;
X else type[X*8+i][Y*8+j]=LAND;
X break;
X case 3:
X if (rand()%2 == 0) type[X*8+i][Y*8+j]=LAND;
X else type[X*8+i][Y*8+j]=HALF;
X break;
X case 4:
X if ((rand()%100) < 95) type[X*8+i][Y*8+j]=LAND;
X else type[X*8+i][Y*8+j]=HALF;
X break;
X default:
X fprintf(stderr,"ERROR\n");
X abrt();
X }
X }
X }
X
X /*calculate all 50% areas*/
X for(X=0;X<MAPX;X++) for(Y=0;Y<MAPY;Y++) {
X if(type[X][Y] == HALF)
X if(rand()%100 >= (100-pwater)) {
X type[X][Y] = LAND;
X }
X else type[X][Y] = WATER;
X }
X
X chance=0;
X for(X=0;X<MAPX;X++) for(Y=0;Y<MAPY;Y++)
X if(type[X][Y] == WATER) chance++;
X printf("day 2... and god decreed that water should have %d / %d sectors\n",chance,NUMSECTS);
X
X /*Newly added code to smooth the world out*/
X for(X=1;X<MAPX-1;X++) for(Y=1;Y<MAPY-1;Y++) {
X chance = 0;
X /*count # of land and sea sides*/
X for(i=X-1;i<=X+1;i++) for(j=Y-1;j<=Y+1;j++)
X if(type[i][j] == LAND) chance++;
X if(rand()%9 < chance) type[X][Y] = LAND;
X else type[X][Y] = WATER;
X }
X chance=0;
X for(X=0;X<MAPX;X++) for(Y=0;Y<MAPY;Y++)
X if(type[X][Y] == WATER) chance++;
X printf("\tbut god was not pleased and smoothed the oceans to %d / %d sectors\n\n",chance,NUMSECTS);
X
X /*Adjust world given sectors as land or sea, place vegetation,
X designation, and altitude */
X
X for(i=0;i<MAPX;i++) for(j=0;j<MAPY;j++)
X if(type[i][j]==LAND) sct[i][j].altitude = CLEAR;
X else sct[i][j].altitude = WATER;
X
X /* place */
X avvalue = PMOUNT * (100-pwater);
X avvalue /= 10000;
X nmountains = NUMSECTS * avvalue;
X printf("day 3... god created %ld mountains and hills\n",nmountains);
X
X /* heuristic says that 5 is cutoff number to stop placing ranges */
X /* and 1 third of mountains are placed as random hills */
X while(nmountains>5 && nmountains> (NUMSECTS*avvalue)/3) {
X X1 = rand()%(MAPX-8); /* Place one endpoint of range */
X Y1 = rand()%(MAPY-8);
X X2 = (rand()%8) + X1; /* Place second endpoint */
X Y2 = (rand()%8) + Y1;
X
X valid = FALSE;
X for(x=X1;x<=X2;x++){
X if(X1<X2) y=((Y2-Y1)*(x-X1)/(X2-X1))+Y1;
X else y=Y1;
X for(j=y-2;j<=y+2;j++) if(j>=0)
X if( type[x][j] != LAND && rand()%2==0 ) {
X valid = TRUE;
X break;
X }
X }
X if( valid==TRUE) continue;
X
X /*fill in mountain range:
X y-2 y-1 y y+1 y+2
X %peak 0 10 20 10 0
X %mtn 10 40 80 40 10
X %hill 40 30 0 30 40
X */
X for(x=X1;x<=X2;x++) {
X if(X1<X2) y=((Y2-Y1)*(x-X1)/(X2-X1))+Y1;
X else y=Y1;
X
X if(type[x][y] == LAND){
X if(rand()%100>80) { TOPEAK(x,y);
X } else { TOMT(x,y)
X }
X }
X
X if((y < MAPY - 1) && type[x][y+1] == LAND) {
X rnd=rand()%100+1;
X if(rnd>90) { TOPEAK(x,y+1);
X } else if(rnd>50) { TOMT(x,y+1);
X } else if(rnd>20) { TOHILL(x,y+1);
X }
X }
X if((y!=0) && type[x][y-1] == LAND ) {
X rnd=rand()%100+1;
X if(rnd>90) { TOPEAK(x,y-1);
X } else if(rnd>50) { TOMT(x,y-1);
X } else if(rnd>20) { TOHILL(x,y-1);
X }
X }
X if((y>=2)
X &&(type[x][y-2] == LAND )) {
X rnd=rand()%100+1;
X if(rnd>90) { TOMT(x,y-2);
X } else if(rnd>50){ TOHILL(x,y-2);
X }
X }
X if((y < MAPY - 2)
X &&(type[x][y+2] == LAND )) {
X rnd=rand()%100+1;
X if(rnd>90) { TOMT(x,y+2);
X } else if(rnd>50) { TOHILL(x,y+2);
X }
X }
X }
X }
X
X /*fill in random hills to work out,not to left of to water*/
X while(nmountains>0) {
X x = rand()%(MAPX-1);
X y = rand()%(MAPY-1);
X if((type[x][y]==LAND)&&(type[x+1][y]==LAND))
X TOHILL(x,y);
X }
X
X /*make sure no peak or mountain is next to water*/
X for(y=1;y<MAPY-1;y++) for(x=1;x<MAPX-1;x++)
X if((sct[x][y].altitude==PEAK)
X ||(sct[x][y].altitude==MOUNTAIN))
X for(i=0;i<=2;i++) for(j=0;j<=2;j++)
X if(sct[x+i-1][y+j-1].altitude==WATER)
X sct[x][y].altitude=HILL;
X
X /*FIGURE OUT SECTOR VEGETATION TYPE
X *use sector.altitude, and sector to determine vegetation
X *from water is distance from nearest water
X */
X
X for(x=0;x<MAPX;x++) for(y=0;y<MAPY;y++)
X if(type[x][y]==LAND)
X {
X sct[x][y].vegetation=(*(veg+3+rand()%5));
X /*if hill then decrement vegetation*/
X if(sct[x][y].altitude==HILL) {
X for(n=3;n<9;n++)
X if(sct[x][y].vegetation==(*(veg+n)))
X sct[x][y].vegetation=(*(veg+n-1));
X if(area_map[x/8][y/8]<=1) sct[x][y].vegetation=VOLCANO;
X }
X else if(sct[x][y].altitude==MOUNTAIN)
X if((rand()%6==4)&&((y>MAPY/2+8)||(y<MAPY/2-8)))
X sct[x][y].vegetation=ICE;
X else sct[x][y].vegetation=(*(veg+2+rand()%3));
X else if(sct[x][y].altitude==PEAK)
X if((rand()%3==0)&&((y>MAPY/2+8)||(y<MAPY/2-8)))
X sct[x][y].vegetation=ICE;
X else sct[x][y].vegetation=VOLCANO;
X }
X
X /*REWORK POLEAR/EQUATORIAL sector.vegetation*/
X /*Determine which areas are North Pole and Equatorial*/
X /*polar work*/
X for(x=0;x<MAPX;x++)
X {
X for(y=0;y<6;y++) if(type[x][y]==LAND)
X {
X if(rand()%4 == 0) sct[x][y].vegetation = ICE;
X else for(n=3;n<10;n++)
X if(sct[x][y].vegetation==(*(veg+n)))
X sct[x][y].vegetation=(*(veg+(n-1)));
X }
X for(y=MAPY-7;y<MAPY;y++) if(type[x][y]==LAND)
X {
X if(rand()%4 == 0) sct[x][y].vegetation = ICE;
X else for(n=3;n<10;n++)
X if(sct[x][y].vegetation==(*(veg+n)) )
X sct[x][y].vegetation=(*(veg+(n-1)));
X }
X }
X
X /*insert equator*/
X for(y=(MAPY/2)-8;y<=(MAPY/2)+8;y++) for(x=0;x<MAPX;x++)
X if(type[x][y]==LAND)
X if(rand()%10 ==0) sct[x][y].vegetation=DESERT;
X /*increment vegetation if between Waste and Jungle*/
X else for(n=2;n<9;n++)
X if((sct[x][y].vegetation==(*(veg+n)))
X &&(sct[x][y].altitude==CLEAR)
X &&(rand()%4==0))
X sct[x][y].vegetation=(*(veg+(n+1)));
X
X for(y=((MAPY/2)-2);y<=((MAPY/2)+2);y++) for(x=0;x<MAPX;x++)
X if((type[x][y]==LAND)&&(sct[x][y].altitude==CLEAR))
X if(rand()%10 == 0) sct[x][y].vegetation=DESERT;
X else if(rand()%10 == 0) sct[x][y].vegetation=JUNGLE;
X else if(rand()%10 == 0) sct[x][y].vegetation=SWAMP;
X /*increment vegetation again, but only Waste to Light*/
X else for(n=2;n<4;n++)
X if(sct[x][y].vegetation==(*(veg+n)))
X sct[x][y].vegetation=(*(veg+(n+1)));
X
X /*expand swamps*/
X for(y=2;y<MAPY;y++) for(x=2;x<MAPX;x++)
X if(sct[x][y].vegetation==SWAMP)
X for(i=0;i<2;i++) for(j=0;j<2;j++)
X if((type[x-i][y-j]==LAND)&&((rand()%3)==0))
X sct[x-i][y-j].vegetation=SWAMP;
X /*expand deserts*/
X for(y=2;y<MAPY;y++) for(x=2;x<MAPX;x++)
X if(sct[x][y].vegetation==DESERT)
X for(i=0;i<2;i++) for(j=0;j<2;j++)
X if((type[x-i][y-j]==LAND)&&((rand()%3)==0))
X sct[x-i][y-j].vegetation=DESERT;
X
X /*change all volcanos to peaks */
X for(y=1;y<MAPY;y++) for(x=1;x<MAPX;x++)
X if(sct[x][y].vegetation==VOLCANO) sct[x][y].altitude=PEAK;
X
X /*make sure no desert is next to water*/
X for(y=1;y<MAPY-1;y++) for(x=1;x<MAPX-1;x++)
X if(sct[x][y].vegetation==DESERT)
X for(i=0;i<=2;i++) for(j=0;j<=2;j++)
X if(sct[x+i-1][y+j-1].altitude==WATER)
X sct[x][y].vegetation=LT_VEG;
X
X free(tplace);
X free(type);
X free(area_map);
X}
X
Xvoid
Xrawmaterials() /*PLACE EACH SECTOR'S RAW MATERIALS */
X{
X int i,j;
X register int x,y;
X int X1,Y1;
X int valid;
X int nmountains;
X struct s_sector *sptr;
X
X TURN=1;
X
X nmountains = 10 * (END_NORMAL+1);
X for(i=0;i<=END_NORMAL;i++) nmountains -= ( *(tg_value+i) - '0');
X
X printf("\nday 4... and god placed the worlds raw materials\n");
X for(y=0;y<MAPY;y++) for(x=0;x<MAPX;x++) {
X
X sptr = &sct[x][y];
X
X /*default designations*/
X sptr->designation=DNODESIG;
X sptr->tradegood = TG_none;
X
X /* default setup of sector */
X sptr->owner = sptr->metal = sptr->jewels = sptr->fortress = 0;
X sptr->people = 0l;
X
X if( is_habitable(x,y)==FALSE ) continue;
X
X /* exotic trade goods !!! */
X if(rand()%100 < TRADEPCT) {
X valid = FALSE;
X if((rand()%100 < METALPCT )||sptr->altitude==MOUNTAIN){
X getmetal( sptr ); /* metal */
X } else if((rand()%(100-METALPCT))<JEWELPCT ) {
X getjewel( sptr ); /* jewel */
X } else while( valid == FALSE ) { /* random good */
X j=rand()%nmountains;
X for(i=0;i<=END_NORMAL;i++) {
X j -= (10 - ( *(tg_value+i) - '0'));
X if(j <= 0) break;
X } /* 'i' now random trade good type */
X
X /* fish - next to water */
X if(i==TG_fish){
X for(X1=x-1;X1<=x+1;X1++)for(Y1=y-1;Y1<=y+1;Y1++)
X if((ONMAP(X1,Y1))
X &&(sct[X1][Y1].altitude==WATER)){
X valid=TRUE;
X break;
X }
X
X if(valid==FALSE) continue;
X }
X
X /* corn,fruit - should be arable land */
X if(((i==TG_corn)||(i==TG_fruit))
X &&(tofood(sptr,0)<6)) continue;
X
X /* timber,pine,oak - wood/forest */
X if(((i==TG_timber)||(i==TG_pine)||(i==TG_oak))
X &&(sptr->vegetation!=FOREST)
X &&(sptr->vegetation!=WOOD)) continue;
X
X valid = TRUE;
X sptr->tradegood = i;
X }
X if(sptr->tradegood == TG_none)
X printf("??? DEBUG -tradegood==NONE\n");
X }
X }
X
X printf("\nday 5... and god decreed that world would be populated\n");
X printf("\tby all manner of creatures; big ones; little one; fat ones;\n");
X printf("\tskinny ones; orange ones; turquois ones; bright blue ones\n");
X printf("\tWAIT!!! god has suddenly realized that smurfs were taking things\n");
X printf("\ttoo far and stopped creating new ones to place everybody on the map...\n");
X populate();
X MERCMEN = ST_MMEN;
X MERCATT = ST_MATT;
X MERCDEF = ST_MDEF;
X printf("\nday 6... and god, who believed in a two day weekend, took off to\n\tthe local pub to celebrate...\n\n");
X printf("day 7... and god rested (to get rid of that stupid hangover)\n");
X printf("\tand thought about logging in to see what the world looks like\n");
X printf("\tand about telling players to add themselves to the game\n");
X printf("\twith the 'conqrun -a' command.\n");
X}
X
X/*fill: subroutine to fill in a square edges with land or sea*/
Xvoid
Xfill_edge(AX,AY)
X{
X/* 1) water
X * 2) water with major islands (25% land)
X * 3) 50/50 water/land
X * 4) land with major water (75% Land)
X * 5) land
X */
X register int i;
X int edgearea, X0, Y0, X1, Y1, X2, Y2, X3, Y3, X4, Y4;
X int area;
X
X X0=AX;
X Y0=AY;
X X1=X0-1;
X Y1=Y0;
X X2=X0+1;
X Y2=Y0;
X X3=X0;
X Y3=Y0-1;
X X4=X0;
X Y4=Y0+1;
X
X /*NORMALIZE FOR EDGE OF WORLD*/
X if( X1 < 0 ) X1 = MAXX - 1;
X if( X2 >= MAXX ) X2 = 0;
X if( Y3 < 0 ) Y3 = MAXY - 1;
X if( Y4 >= MAXY ) Y4 = 0;
X
X area=area_map[X0][Y0];
X /*fill in south*/
X edgearea=area_map[X4][Y4];
X if(area + edgearea > 6) for(i=0;i<8;i++) type[X0*8+i][Y0*8+7] = LAND;
X else if((area + edgearea)>3) {
X for(i=0;i<8;i++)
X if(rand()%2 == 0) type[(X0*8)+i][Y0*8+7] = LAND;
X else type[(X0*8)+i][Y0*8+7] = WATER;
X }
X else for(i=0;i<8;i++) type[(X0*8)+i][Y0*8+7] = WATER;
X /*fill in east*/
X edgearea=area_map[X2][Y2];
X if(area + edgearea > 6) for(i=0;i<8;i++) type[X0*8+7][Y0*8+i] = LAND;
X else if((area + edgearea)>3) {
X for(i=0;i<8;i++)
X if(rand()%2==0) type[X0*8+7][Y0*8+i] = LAND;
X else type[X0*8+7][Y0*8+i] = WATER;
X }
X else for(i=0;i<8;i++) type[X0*8+7][Y0*8+i] = WATER;
X /*fill in west*/
X edgearea=area_map[X1][Y1];
X if(area + edgearea > 6) for(i=0;i<=7;i++) type[X0*8][Y0*8+i] = LAND;
X else if((area + edgearea)>3) {
X for(i=0;i<8 ;i++)
X if(rand()%2==0) type[X0*8][Y0*8+i] = LAND;
X else type[X0*8][Y0*8+i] = WATER;
X }
X else for(i=0;i<8 ;i++) type[X0*8][Y0*8+i] = WATER;
X /*fill in north*/
X edgearea=area_map[X3][Y3];
X if(area + edgearea > 6) for(i=0;i<8 ;i++) type[X0*8+i][Y0*8] = LAND;
X else if((area + edgearea)>3) {
X for(i=0;i<8 ;i++)
X if(rand()%2==0) type[(X0*8)+i][Y0*8] = LAND;
X else type[(X0*8)+i][Y0*8] = WATER;
X }
X else for(i=0;i<8 ;i++) type[(X0*8)+i][Y0*8] = WATER;
X}
X
X/* ALLOCATE POPULATIONS OF THE WORLD*/
Xvoid
Xpopulate()
X{
X int i=0,x=0,y=0,j=0,xloc,yloc;
X int nvynum=0,armynum=0,points,shipsize,temp,cnum;
X short short1,short2; /*temporary short variables */
X short class;
X
X int loopcnt=0;
X int pirarmy=0,barbarmy=0,nomadarmy=0,lizarmy=0;
X short npirates=0,nbarbarians=0,nnomads=0,nlizards=0;
X
X FILE *fp, *fopen();
X int done=FALSE;
X char line[80],allign;
X char fname[80];
X
X /*set up god but dont place*/
X curntn = &ntn[0];
X strcpy(curntn->name,"unowned");
X strcpy(curntn->leader,"god");
X curntn->race=GOD;
X curntn->location=GOD;
X curntn->powers=KNOWALL; /* so god can see the map */
X curntn->powers|=NINJA; /* so god can see exact unit numbers */
X curntn->mark='-';
X
X for( country=1; country<NTOTAL; country++ ) {
X curntn = &ntn[country];
X if( isactive( curntn->active )) {
X printf("THIS SHOULDNT HAPPEN\n");
X continue;
X }
X strcpy(curntn->passwd,ntn[0].passwd);
X curntn->powers=0;
X curntn->repro=0;
X curntn->active=INACTIVE;
X curntn->maxmove=0;
X curntn->mark='-';
X }
X
X for( country=1; country<NTOTAL; country++ ) {
X for(i=country+1;i<NTOTAL;i++) {
X ntn[country].dstatus[i]=UNMET;
X ntn[i].dstatus[country]=UNMET;
X }
X }
X
X#ifdef MONSTER
X for( country=NTOTAL-1; country>=NTOTAL-4; country-- ) {
X curntn = &ntn[country];
X if( country==NTOTAL-1 ) {
X strncpy(curntn->name,"lizard",10);
X strncpy(curntn->leader,"dragon",10);
X curntn->active=NPC_LIZARD;
X curntn->race=LIZARD;
X } else if( country==NTOTAL-2 ) {
X strcpy(curntn->name,"savages");
X strcpy(curntn->leader,"shaman");
X curntn->active=NPC_BARBARIAN;
X curntn->race=BARBARIAN;
X } else if( country==NTOTAL-3 ) {
X strcpy(curntn->name,"nomad");
X strcpy(curntn->leader,"khan");
X curntn->active=NPC_NOMAD;
X curntn->race=NOMAD;
X } else if( country==NTOTAL-4 ) {
X strcpy(curntn->name,"pirate");
X strcpy(curntn->leader,"captain");
X curntn->active=NPC_PIRATE;
X curntn->race=PIRATE;
X }
X
X curntn->aplus=0;
X curntn->dplus=0;
X curntn->powers=KNOWALL;
X curntn->mark='*';
X curntn->maxmove=12;
X curntn->repro=5;
X
X /* everybody hates monster nations */
X if(ismonst(ntn[country].active))
X for(i=1;i<NTOTAL;i++) {
X ntn[country].dstatus[i]=WAR;
X ntn[i].dstatus[country]=WAR;
X }
X }
X
X /* create one inhabitant per MONSTER sectors */
X temp = (NUMSECTS)/MONSTER;
X while( temp-- >0 ) switch( rand()%4 ) {
X case 0: if(npirates < MAXNAVY ) npirates++;
X break;
X case 1: if(nbarbarians < MAXARM ) nbarbarians++;
X break;
X case 2: if(nnomads < MAXARM ) nnomads++;
X break;
X case 3: if(rand()%3==0) {
X if(nlizards < MAXARM/2 ) nlizards++;
X } else if(nnomads < MAXARM ) nnomads++;
X break;
X }
X printf("placing %d lizards, %d pirates, %d barbarians, and %d nomads\n",
X nlizards,npirates,nbarbarians,nnomads);
X
X while((nlizards+npirates+nbarbarians+nnomads > 0 )&&(loopcnt++ <5000)) {
X if( nlizards>0 ) {
X for(country=1;country<NTOTAL;country++)
X if( ntn[country].active == NPC_LIZARD ) break;
X armynum=lizarmy;
X } else if( nbarbarians>0 ) {
X for(country=1;country<NTOTAL;country++)
X if( ntn[country].active==NPC_BARBARIAN ) break;
X armynum=barbarmy;
X } else if( nnomads>0 ) {
X for(country=1;country<NTOTAL;country++)
X if( ntn[country].active == NPC_NOMAD ) break;
X armynum=nomadarmy;
X } else if( npirates>0 ) {
X for(country=1;country<NTOTAL;country++)
X if( ntn[country].active == NPC_PIRATE ) break;
X armynum=pirarmy;
X }
X
X curntn = &ntn[country];
X
X /*50% chance will be close to map edge, else anywhere*/
X if((rand()%2==0)&&(curntn->active!=NPC_LIZARD)){
X if(rand()%2==0) {
X x=(rand()%20);
X } else {
X x=(MAPX-(rand()%20)-1);
X y=(MAPY-(rand()%20)-1);
X }
X if(rand()%2==0) x = rand()%MAPX;
X else y = rand()%MAPY;
X } else {
X x = rand()%MAPX;
X y = rand()%MAPY;
X }
X
X if(sct[x][y].owner!=0) continue;
X if(!is_habitable(x,y)) continue;
X
X sct[x][y].owner = country;
X
X /* now place people*/
X switch( curntn->active ) {
X case NPC_LIZARD:
X nlizards--;
X sct[x][y].designation = DFORT;
X sct[x][y].metal = 0;
X sct[x][y].jewels = 8 + (i=rand()%20);
X sct[x][y].tradegood = TG_platinum;
X /* make fortificaton consistant with gold */
X sct[x][y].fortress = 5+i/4;
X for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++)
X if((ONMAP(i,j))&&(sct[i][j].altitude!=WATER))
X sct[i][j].owner = country;
X P_AMOVE=0;
X P_AXLOC=x;
X P_AYLOC=y;
X P_ASTAT=GARRISON;
X P_ASOLD=750+100*(rand()%10);
X P_ATYPE=defaultunit(country);
X armynum++;
X lizarmy++;
X P_AMOVE=8;
X P_AXLOC=x;
X P_AYLOC=y;
X P_ASTAT=ATTACK;
X P_ASOLD=750+100*(rand()%10);
X P_ATYPE=defaultunit(country);
X lizarmy++;
X break;
X case NPC_PIRATE:
X /* pirates must be on islands */
X temp=TRUE;
X for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++)
X if((ONMAP(i,j)) && ( x!=i || y!=j)
X &&( sct[i][j].altitude!=WATER)) {
X /* fifty percent chance of failure */
X /* for every non-land sector */
X if (sct[i][j].owner!=0 || rand()%2==0)
X temp=FALSE;
X }
X
X if(temp==FALSE) {
X sct[x][y].owner = 0;
X break;
X }
X
X /* build the island */
X for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++)
X if((ONMAP(i,j)) && ( x!=i || y!=j))
X if( sct[i][j].altitude!=WATER ) {
X sct[i][j].altitude=WATER;
X sct[i][j].vegetation=WATER;
X sct[i][j].tradegood=TG_none;
X sct[i][j].jewels=0;
X sct[i][j].metal=0;
X }
X
X npirates--;
X sct[x][y].designation = DBASECAMP;
X P_AMOVE=8;
X P_AXLOC=x;
X P_AYLOC=y;
X P_ASTAT=ATTACK;
X P_ASOLD=150+100*(rand()%3);
X P_ATYPE=defaultunit(country);
X pirarmy++;
X P_NXLOC=x;
X P_NYLOC=y;
X P_NPEOP=0;
X P_NARMY=MAXARM;
X shipsize = N_LIGHT;
X (void) NADD_WAR( rand()%5+2 );
X shipsize = N_MEDIUM;
X (void) NADD_WAR( rand()%3+1 );
X shipsize = N_HEAVY;
X (void) NADD_WAR( rand()%2 );
X P_NCREW=SHIPCREW;
X nvynum++;
X break;
X case NPC_NOMAD:
X nnomads--;
X P_AXLOC=x;
X P_AYLOC=y;
X P_ASTAT=ATTACK;
X P_ASOLD=100+100*(rand()%8);
X P_ATYPE=defaultunit(country);
X nomadarmy++;
X break;
X case NPC_BARBARIAN:
X nbarbarians--;
X P_AXLOC=x;
X P_AYLOC=y;
X P_ASTAT=ATTACK;
X P_ASOLD=100+100*(rand()%4);
X P_ATYPE=defaultunit(country);
X barbarmy++;
X break;
X }
X }
X
X /* put random monsters around the world */
X for(country=1;country<NTOTAL;country++) {
X if( ntn[country].active != NPC_BARBARIAN ) continue;
X curntn = &ntn[country];
X armynum=barbarmy;
X if( country!=NTOTAL ) while(armynum<MAXARM) {
X x = rand()%MAPX;
X y = rand()%MAPY;
X if (is_habitable(x,y)&&sct[x][y].owner==0) {
X sct[x][y].owner = country;
X if( sct[x][y].jewels==0 )
X getjewel( &(sct[x][y]) );
X P_AXLOC= x;
X P_AYLOC= y;
X P_ASTAT= ATTACK;
X P_ATYPE= MINMONSTER + rand()%(MAXMONSTER-MINMONSTER+1);
X P_ASOLD= *(unitminsth+(P_ATYPE%UTYPE));
X P_AMOVE= 10;
X armynum++;
X }
X }
X }
X
X printf("all random population and monsters placed\n");
X#endif MONSTER
X
X for (i=0;i<MAXHELP;i++) {
X sprintf(fname,"%s/%s%d",DEFAULTDIR,helpfile,i);
X if ((fp=fopen(fname,"r"))==NULL) {
X printf("\tcannot find helpfile <%s>\n",fname);
X printf("\tplease move it to %s\n",DEFAULTDIR);
X }
X }
X
X#ifdef NPC
X printf("\nDo you want NPC nations in this campaign?");
X if( getchar()!='y' ) return;
X if((fp=fopen(npcsfile,"r"))==NULL) {
X printf("error on read of %s file\n",npcsfile);
X printf("Do you wish to use default NPC nations file (y or n)?");
X if(getchar()=='y'){
X sprintf(line,"%s/%s",DEFAULTDIR,npcsfile);
X if ((fp=fopen(line,"r"))==NULL) {
X printf("\nsorry; error on read of %s file\n",line);
X return;
X } else printf("\nOK; default nations used\n");
X } else {
X printf("\nOK; no NPC nations used\n");
X return;
X }
X }
X printf("reading npc nation data from file: %s\n",npcsfile);
X printf("and adding 1 nation per %d land sectors\n",MONSTER);
X
X cnum=1;
X while(fgets(line,80,fp)!=NULL) {
X /*read and parse a new line*/
X if(line[0]!='#') {
X xloc = yloc = -1;
X sscanf(line,"%s %s %c %c %c %hd %hd %hd %ld %ld %d %hd %c %d %d %hd",
X ntn[cnum].name,ntn[cnum].leader,&ntn[cnum].race,
X &ntn[cnum].mark,&ntn[cnum].location,&ntn[cnum].aplus,
X &ntn[cnum].dplus,&short1,&ntn[cnum].tgold,
X &ntn[cnum].tmil,&points,&short2,&allign,&xloc,&yloc,
X &class);
X
X country=cnum;
X curntn = &ntn[country];
X if( cnum > MAPX*MAPY/MONSTER*(100-pwater)/100 ) {
X printf("world too small to add npc nation %d %s\n",cnum,curntn->name);
X continue;
X }
X if( isactive(ntn[cnum].active) ) {
X printf("Too few nations permitted in world to add npc nation %d %s\n",cnum,curntn->name);
X continue;
X }
X curntn->class = (short)class;
X printf("adding npc nation %s (%s)\n",curntn->name,*(Class+curntn->class));
X curntn->maxmove = short1;
X curntn->repro = short2;
X if( allign == 'G' )
X curntn->active = PC_GOOD;
X else if( allign == 'N' )
X curntn->active = PC_NEUTRAL;
X else if( allign == 'E' )
X curntn->active = PC_EVIL;
X else if( allign == 'g' )
X curntn->active = GOOD_6FREE;
X else if( allign == 'n' )
X curntn->active = NEUTRAL_6FREE;
X else if( allign == 'e' )
X curntn->active = EVIL_6FREE;
X else if( allign == 'i' )
X curntn->active = ISOLATIONIST;
X else {
X printf("invalid nation allignment (%c) line is:\n\t%s\n",allign,line);
X abrt();
X }
X strcpy(curntn->passwd,ntn[0].passwd);
X
X points -= doclass( class, FALSE );
X points -= startcost();
X if(points < 10 ) {
X printf("ERROR IN NATIONS FILE IN NATION %s\n",ntn[cnum].name);
X printf("nation doesnt have enough points left for 10000 civilians\n");
X abrt();
X }
X curntn->tciv = 1000L * points;
X
X if(curntn->race==HUMAN){
X curntn->powers|=WARRIOR;
X exenewmgk(WARRIOR);
X } else if(curntn->race==DWARF){
X curntn->powers|=MINER;
X exenewmgk(MINER);
X } else if(curntn->race==ELF){
X curntn->powers|=THE_VOID;
X exenewmgk(THE_VOID);
X } else if(curntn->race==ORC){
X curntn->powers|=MI_MONST;
X exenewmgk(MI_MONST);
X } else {
X curntn->powers|=WARRIOR;
X exenewmgk(WARRIOR);
X }
X curntn->tfood= curntn->tciv * 3;
X curntn->metals=10000L;
X curntn->jewels=10000L;
X cnum++;
X place(xloc,yloc);
X att_setup(country); /* nation attributes */
X }
X }
X att_base(); /* get nation attributes */
X printf("all npc nations placed\n");
X#endif NPC
X}
END_OF_FILE
if test 30426 -ne `wc -c <'makeworl.c'`; then
echo shar: \"'makeworl.c'\" unpacked with wrong size!
fi
# end of 'makeworl.c'
fi
if test -f 'newlogin.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'newlogin.h'\"
else
echo shar: Extracting \"'newlogin.h'\" \(1454 characters\)
sed "s/^X//" >'newlogin.h' <<'END_OF_FILE'
X/*conquer : Copyright (c) 1988 by Ed Barlow. */
X/* initial starting stats */
X
X/*dwarf*/
X#define NLDGOLD 100000L
X#define NLDFOOD 35000L
X#define NLDJEWEL 15000L
X#define NLDMETAL 15000L
X#define NLDCIVIL 6000L
X#define NLDMILIT 1000L
X#define NLDREPRO 4
X#define NLDMMOVE 6
X#define NLDAPLUS 20
X#define NLDDPLUS 20
X
X/*elf*/
X#define NLEGOLD 100000L
X#define NLEFOOD 35000L
X#define NLEJEWEL 15000L
X#define NLEMETAL 15000L
X#define NLECIVIL 7000L
X#define NLEMILIT 200L
X#define NLEREPRO 5
X#define NLEMMOVE 8
X#define NLEAPLUS 10
X#define NLEDPLUS 40
X
X/*orc*/
X#define NLOGOLD 1000L
X#define NLOFOOD 35000L
X#define NLOJEWEL 15000L
X#define NLOMETAL 15000L
X#define NLOCIVIL 6000L
X#define NLOMILIT 2000L
X#define NLOREPRO 8
X#define NLOMMOVE 6
X#define NLOAPLUS 0
X#define NLODPLUS 0
X
X/*human*/
X#define NLHGOLD 1000L
X#define NLHFOOD 35000L
X#define NLHJEWEL 15000L
X#define NLHMETAL 15000L
X#define NLHCIVIL 6000L
X#define NLHMILIT 1000L
X#define NLHREPRO 5
X#define NLHMMOVE 10
X#define NLHAPLUS 15
X#define NLHDPLUS 10
X
X/* the purchase definitions and/or costs */
X#define NLPOP 1000L
X#define NLGOLD 100000L
X#define NLLOCCOST 1
X#define NLSOLD 900L
X#define NLATTACK 10
X#define NLDEFENCE 10
X#define NLREPRO_ORC 2 /* repro points per NLREPCOST for orcs */
X#define NLREPRO 1 /* repro points per NLREPCOST for others */
X#define NLREPCOST 3
X#define NLMOVE 2
X#define NLDBLCOST 1
X#define NLMAGIC 3
X/* get NLEADER leaders for NLEADPT points */
X#define NLEADER 3
X#define NLEADPT 1
END_OF_FILE
if test 1454 -ne `wc -c <'newlogin.h'`; then
echo shar: \"'newlogin.h'\" unpacked with wrong size!
fi
# end of 'newlogin.h'
fi
echo shar: End of archive 9 \(of 14\).
cp /dev/null ark9isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 14 archives.
rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0