[comp.sources.games] v04i045: conquer3 - middle earth multi-player game

games@tekred.TEK.COM (06/17/88)

Submitted by: ihnp4!homxc!smile
Comp.sources.games: Volume 4, Issue 45
Archive-name: conquer3/Part04



#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 4 (of 8)."
# Contents:  Makefile commands.c makeworld.c
# Wrapped by billr@saab on Thu Jun 16 09:39:58 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f Makefile -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"Makefile\"
else
echo shar: Extracting \"Makefile\" \(6885 characters\)
sed "s/^X//" >Makefile <<'END_OF_Makefile'
X#	conquer: Copyright (c) 1988 by Edward M Barlow
X#	MODIFICATION OF THIS FILE COMITS THE MODIFIER TO FOLLOW THE
X#	THE LIMITED USE CONTRACT CONTAINED IN THE FILE "header.h"
XMAKE	= /bin/make
XCC	= /bin/cc
XRM	= /bin/rm -f
XLD	= mld
X
X#	This should be installed by whomever you want to own the game.
X#	I recommend "games" or "root".
X
X#	uncomment the next line if you dont have getopt in your library
X#	(eg you are on a pc, or a non unix system).  getopt.c is a
X#	public domain software, and has not been tested by the author
X#	of conquer.
X#GETOPT	= getopt.o	
X
X#if the final link does not compile change to the line below
X#LIBRARIES = -lcurses -ltermcap
XLIBRARIES = -lcurses
X
X#	DEFAULT is the directory where default nations & help files will be
X#	stored.  It is also the default directory = where players will play
X#	if they do not use the -d option.
XDEFAULT = /c28/smile/game/default
X
XCFLAGS  = -DDEFAULTDIR=\"$(DEFAULT)\" -O
X#	The following CFLAGS should be used if you wish to debug the game
X#CFLAGS  = -DDEFAULTDIR=\"$(DEFAULT)\" -DDEBUG -g
X
X#	this is the name of the user executable
X#	the user executable contains commands for the games players
XGAME = conquer
X#	this is the name of the administrative executable
X#	the administrative executable contains commands for the game super user
XADMIN = admin
X
X#	This directory is where the executables will be stored
XEXEDIR = /c28/smile/game/runv
X
X#	GAME IDENTIFICATION
X#	this is the game identifier.  See the DATA variable below
XGAMEID = 1
X#	This directory is where individual Conquer game data will be stored.
X#	As multiple simultaneous games are supported, each game must have its
X#	own directory.
XDATA = $(EXEDIR)/lib$(GAMEID)
X
X# AFILS are files needed for game updating...
XAFILS = combat.c cexecute.c io.c admin.c makeworld.c  \
Xnewlogin.c update.c magic.c npc.c misc.c randevent.c data.c
XAOBJS = combat.o cexecuteA.o ioA.o admin.o makeworld.o  \
Xnewlogin.o update.o magicA.o npc.o miscA.o randevent.o dataA.o $(GETOPT)
X
X# GFILS are files needed to run a normal interactive game
XGFILS = commands.c cexecute.c forms.c io.c main.c move.c \
Xmagic.c misc.c reports.c data.c display.c extcmds.c
XGOBJS = commands.o cexecute.o forms.o io.o main.o move.o \
Xmagic.o misc.o reports.o data.o display.o extcmds.o $(GETOPT)
X
XHEADERS=header.h data.h newlogin.h
XHELPFILE=help.txt
XSUPT1=nations Makefile $(HELPFILE) README run man.page 
XSUPT2=execute messages news
XHELPOUT=help
XALLFILS=$(SUPT1) $(HEADERS) $(AFILS) commands.c forms.c main.c move.c \
Xreports.c display.c extcmds.c
X
Xall:	$(ADMIN) $(GAME) helpfile
X	@echo YAY! make new_game to set up permissions, zero appropriate
X	@echo initial files, move $(GAME) and $(ADMIN) to 
X	@echo $(EXEDIR), and set up the world.
X	@echo If a game is in progress, make install will just move $(GAME) 
X	@echo and $(ADMIN) to $(EXEDIR).
X	@echo
X
X$(ADMIN):	$(AOBJS)
X	@echo phew...
X	@echo if the next command does not you might also need -ltermcap
X	@echo === compiling administrative functions
X	$(CC) -O -o $(ADMIN) $(AOBJS) $(LIBRARIES)
X
X$(GAME):	$(GOBJS)
X	@echo phew...
X	@echo if the next command does not compile you might also need -ltermcap
X	@echo === compiling user interface
X	$(CC) -O -o $(GAME) $(GOBJS) $(LIBRARIES)
X
Xclobber:
X	$(RM) *.o core newhelp conquer.doc $(GAME) $(ADMIN) $(HELPOUT) 2>/dev/null
X
Xclean:
X	$(RM) *.o core conquer.doc newhelp $(HELPOUT) 2>/dev/null
X
Xinstall:	$(ADMIN) $(GAME) helpfile
X	cp $(GAME) $(ADMIN) $(EXEDIR)
X	cp $(HELPOUT) $(DATA)
X	cp $(HELPOUT) $(DEFAULT)
X	chmod 4755 $(EXEDIR)/$(GAME)
X	chmod 4750 $(EXEDIR)/$(ADMIN) 
X
Xnew_game:	$(ADMIN) $(GAME) helpfile
X	@echo Installing new game
X	-mkdir $(EXEDIR) 2>/dev/null
X	-mkdir $(DATA) 2>/dev/null
X	-mkdir $(DEFAULT)  2>/dev/null
X	chmod 755 $(EXEDIR)
X	chmod 751 $(DATA) $(DEFAULT)
X	cp $(GAME) $(ADMIN) $(EXEDIR)
X	chmod 4755 $(EXEDIR)/$(GAME) $(EXEDIR)/$(ADMIN)
X	chmod 0700 run
X	chmod 0644 $(HELPOUT)
X	chmod 0600 nations
X	cp $(HELPOUT) nations $(DATA)
X	cp $(HELPOUT) nations $(DEFAULT)
X	@echo now making the world
X	$(EXEDIR)/$(ADMIN) -d$(DATA) -m
X	$(EXEDIR)/$(ADMIN) -d$(DATA) -a
X
Xhelpfile:	$(HELPOUT)
X
X$(HELPOUT):	newhelp.c data.o header.h data.h
X	$(CC) $(CFLAGS) newhelp.c data.o -o newhelp
X	@echo Building the help file
X	newhelp
X	cat $(HELPFILE) | sed -f helpscript > $(HELPOUT)
X	$(RM) helpscript
X	cp $(HELPOUT) $(DEFAULT)
X
Xlint:
X	lint -DDEFAULTDIR=\"$(DEFAULT)\" -DCONQUER $(GFILS) > lintg
X	lint -DDEFAULTDIR=\"$(DEFAULT)\" -DADMIN $(AFILS) > linta
X
Xdocs:	$(HELPOUT) conquer.doc
X
Xconquer.doc:
X	sed -e "s/^END//g" $(HELPOUT) > conquer.doc
X
Xcpio:
X	-$(RM) core
X	find . -name '*[CrpsEech]' -print | cpio -ocBv > cpiosv
X
Xshar:	
X	echo " lines   words chars   FILENAME" > MANIFEST
X	wc $(ALLFILS) >> MANIFEST
X	createshar 1 combat.c commands.c forms.c
X	mv shar.out shar1
X	createshar 2  move.c makeworld.c main.c
X	mv shar.out shar2
X	createshar 3 $(SUPT1)
X	mv shar.out shar3
X	createshar 4 npc.c newlogin.c MANIFEST newlogin.h
X	mv shar.out shar4
X	createshar 5 reports.c misc.c randevent.c
X	mv shar.out shar5
X	createshar 6 magic.c update.c cexecute.c data.c MANIFEST
X	mv shar.out shar6
X	createshar 7 admin.c display.c getopt.c newhelp.c extcmds.c io.c data.h header.h 
X	mv shar.out shar7
X
Xcombat.o:	data.h header.h combat.c
X	$(CC) $(CFLAGS) -DADMIN -c combat.c
Xcexecute.o:	data.h header.h cexecute.c
X	$(CC) $(CFLAGS) -DCONQUER -c cexecute.c
Xio.o:	data.h header.h  io.c
X	$(CC) $(CFLAGS) -DCONQUER -c io.c
XcexecuteA.o:	data.h header.h cexecute.c
X	$(CC) $(CFLAGS) -DADMIN -c cexecute.c
X	mv cexecute.o cexecuteA.o
XioA.o:	data.h header.h  io.c
X	$(CC) $(CFLAGS) -DADMIN -c io.c
X	mv io.o ioA.o
Xadmin.o:	data.h header.h admin.c
X	$(CC) $(CFLAGS) -DADMIN -c admin.c
Xmakeworld.o:	data.h header.h makeworld.c
X	$(CC) $(CFLAGS) -DADMIN -c makeworld.c
Xnewlogin.o:	data.h header.h newlogin.h newlogin.c
X	$(CC) $(CFLAGS) -DADMIN -c newlogin.c
Xupdate.o:	data.h header.h update.c
X	$(CC) $(CFLAGS) -DADMIN -c update.c
Xmagic.o:	data.h header.h magic.c
X	$(CC) $(CFLAGS) -DCONQUER -c magic.c
XmagicA.o:	data.h header.h magic.c
X	$(CC) $(CFLAGS) -DADMIN -c magic.c
X	mv magic.o magicA.o
Xnpc.o:	data.h header.h npc.c
X	$(CC) $(CFLAGS) -DADMIN -c npc.c
Xmisc.o:	data.h header.h misc.c
X	$(CC) $(CFLAGS) -DCONQUER -c misc.c
XmiscA.o:	data.h header.h misc.c
X	$(CC) $(CFLAGS) -DADMIN -c misc.c
X	mv misc.o miscA.o
Xrandevent.o:	data.h header.h randevent.c
X	$(CC) $(CFLAGS) -DADMIN -c randevent.c
Xdata.o:	data.h header.h data.c
X	$(CC) $(CFLAGS) -DCONQUER -c data.c
XdataA.o:	data.h header.h data.c
X	$(CC) $(CFLAGS) -DADMIN -c data.c
X	mv data.o dataA.o
Xdisplay.o:	data.h header.h display.c
X	$(CC) $(CFLAGS) -DCONQUER -c display.c
Xreports.o:	data.h header.h reports.c
X	$(CC) $(CFLAGS) -DCONQUER -c reports.c
Xmove.o:	data.h header.h move.c
X	$(CC) $(CFLAGS) -DCONQUER -c move.c
Xmain.o:	data.h header.h main.c
X	$(CC) $(CFLAGS) -DCONQUER -c main.c
Xforms.o:	data.h header.h forms.c
X	$(CC) $(CFLAGS) -DCONQUER -c forms.c
Xcommands.o:	data.h header.h commands.c
X	$(CC) $(CFLAGS) -DCONQUER -c commands.c
END_OF_Makefile
if test 6885 -ne `wc -c <Makefile`; then
    echo shar: \"Makefile\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f commands.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"commands.c\"
else
echo shar: Extracting \"commands.c\" \(23192 characters\)
sed "s/^X//" >commands.c <<'END_OF_commands.c'
X/*conquer : Copyright (c) 1988 by Ed Barlow.
X *  I spent a long time writing this code & I hope that you respect this.
X *  I give permission to alter the code, but not to copy or redistribute
X *  it without my explicit permission.  If you alter the code,
X *  please document changes and send me a copy, so all can have it.
X *  This code, to the best of my knowledge works well,  but it is my first
X *  'C' program and should be treated as such.  I disclaim any
X *  responsibility for the codes actions (use at your own risk).  I guess
X *  I am saying "Happy gaming", and am trying not to get sued in the process.
X *                                                Ed
X */
X
X/*	commands.c		*/
X
X/*include files*/
X#include "header.h"
X#include "data.h"
X#include <ctype.h>
X
X/*execute file pointer*/
Xextern FILE *fexe;
Xextern short country;
Xextern short selector;
Xextern short pager;
Xextern short xcurs,ycurs,xoffset,yoffset;
X
X/*change current hex designation*/
Xvoid
Xredesignate()
X{
X	char newdes;
X	short x,y;
X
X	if(country==0){
X		clear_bottom(0);
X		mvaddstr(LINES-4,0,"SUPER USER: CHANGE (v)egetation, (e)levation, (d)esig, (o)wner, (m)inerals");
X		refresh();
X		switch(getch()){
X		case 'e':
X			/*simple contour map definitions*/
X			mvprintw(LINES-3,7,"ELEVATIONS: change to %c, %c, %c, %c or %c?",WATER,PEAK,MOUNTAIN,HILL,CLEAR);
X			refresh();
X			newdes=getch();
X			if(newdes!=WATER&&newdes!=PEAK&&newdes!=MOUNTAIN
X			&&newdes!=HILL&&newdes!=CLEAR) return;
X			sct[XREAL][YREAL].altitude=newdes;
X			if((newdes==PEAK)||(newdes==WATER)) {
X				sct[XREAL][YREAL].owner=0;
X				sct[XREAL][YREAL].people=0;
X				sct[XREAL][YREAL].fortress=0;
X			}
X			/*will fall through as must change vegetation*/
X		case 'v':
X			/*vegetation types*/
X			mvprintw(LINES-3,7,"VEGETATIONS: change to %c, %c, %c, %c, %c, %c, %c, %c, %c, %c, %c or %c?",
X			VOLCANO,DESERT,TUNDRA,BARREN,LT_VEG,
X			GOOD,WOOD,FOREST,JUNGLE,SWAMP,ICE,NONE);
X			refresh();
X			newdes=getch();
X			if(newdes!=VOLCANO
X			&&newdes!=DESERT&&newdes!=TUNDRA
X			&&newdes!=BARREN&&newdes!=LT_VEG
X			&&newdes!=NONE&&newdes!=GOOD
X			&&newdes!=WOOD&&newdes!=FOREST&&newdes!=JUNGLE
X			&&newdes!=SWAMP&&newdes!=ICE) return;
X			sct[XREAL][YREAL].vegetation=newdes;
X			if(tofood(sct[XREAL][YREAL].vegetation,0)!=0)
X				sct[XREAL][YREAL].designation=newdes;
X			return;
X		case 'o':
X			mvprintw(LINES-3,7,"what nation owner:");
X			refresh();
X			x = get_number();
X			if (x<NTOTAL) sct[XREAL][YREAL].owner=x;
X			return;
X		case 'm':
X			mvaddstr(LINES-2,7,"(g)old, or (i)ron?");
X			refresh();
X			switch(getch()) {
X			case 'g':
X				mvaddstr(LINES-2,7,"new sector gold value: ");
X				refresh();
X				x = get_number();
X				if (x<100 && x>=0)
X					sct[XREAL][YREAL].gold = x;
X				break;
X			case 'i':
X				mvaddstr(LINES-2,7,"new sector iron value:");
X				refresh();
X				x = get_number();
X				if (x<100 && x>=0)
X					sct[XREAL][YREAL].iron = x;
X				break;
X			default:
X				break;
X			}
X			return;
X		}
X	}
X	if((country!=0)&&(sct[XREAL][YREAL].owner!=country)) {
X		errormsg("You do not own");
X		return;
X	}
X	clear_bottom(0);
X	mvprintw(LINES-4,7,"$%d: redesignate to %c, %c, %c",DESCOST,DMINE,DGOLDMINE,DFARM);
X	mvprintw(LINES-3,7,"$%d: redesignate to %c, %c?",20*DESCOST,DCITY,DCAPITOL);
X	mvprintw(LINES-2,0,"space to return => what new designation:");
X	refresh();
X	/*read answer*/
X	newdes=getch();
X
X	if(newdes!=DMINE&&newdes!=DGOLDMINE&&newdes!=DFARM&&newdes!=DCITY&&newdes!=DCAPITOL) {
X		errormsg("invalid input");
X		return;
X	}
X
X	if((SOWN==country)||(country==0)) {
X		if(((tofood(sct[XREAL][YREAL].vegetation,country)>=DESFOOD)
X		||(country==0))){
X			if(((newdes!=DCITY)&&(newdes!=DCAPITOL))||(country==0)) {
X				/*decrement treasury*/
X				sct[XREAL][YREAL].designation=newdes;
X				if(country==0) {
X					country=sct[XREAL][YREAL].owner;
X					SADJDES;
X					country=0;
X				}
X				else {
X					SADJDES;
X					ntn[country].tgold-=DESCOST;
X				}
X			}
X			else if((newdes==DCAPITOL)
X			&&(sct[XREAL][YREAL].designation==DCITY)){
X
X				ntn[country].tgold-=20*DESCOST;
X				ntn[country].tiron-=DESCOST;
X				x=ntn[country].capx;
X				y=ntn[country].capy;
X				sct[x][y].designation=DCITY;
X				if(country==0) {
X					country=sct[x][y].owner;
X					SADJDES2;
X					country=0;
X				}
X				else SADJDES2;
X				sct[XREAL][YREAL].designation=newdes;
X				ntn[country].capx=XREAL;
X				ntn[country].capy=YREAL;
X				if(country==0) {
X					country=sct[XREAL][YREAL].owner;
X					SADJDES;
X					country=0;
X				}
X				else SADJDES;
X			}
X			else if((newdes==DCAPITOL)
X			&&(sct[XREAL][YREAL].designation!=DCITY)){
X				errormsg("New Capitol must be in a town");
X			}
X			else if((ntn[country].tiron>DESCOST)
X			&&(newdes==DCITY)){
X				if(sct[XREAL][YREAL].people>=500){
X					ntn[country].tgold-=20*DESCOST;
X					ntn[country].tiron-=DESCOST;
X					sct[XREAL][YREAL].designation=newdes;
X					if(country==0) {
X						country=sct[XREAL][YREAL].owner;
X						SADJDES;
X						country=0;
X					}
X					else SADJDES;
X				}
X				else {
X				errormsg("Need 500 people to build to town");
X				}
X			} else	errormsg("Not enough iron for town");
X		} else	errormsg("vegetation too sparse");
X	} else {
X	errormsg("Sorry, you don't own sector");
X	}
X}
X
X/*build fort or ship-type */
Xvoid
Xconstruct()
X{
X	int nearsea,repairs;
X	long cost;
X	int armbonus;
X	int x,y;
X	short nvynum=0;
X	short mnumber,wnumber;
X	short isgod=FALSE;
X	char type;
X
X	clear_bottom(0);
X	if(country==0){
X		isgod=TRUE;
X		country=sct[XREAL][YREAL].owner;
X	}
X
X	if(sct[XREAL][YREAL].owner!=country) {
X		errormsg("You do not own");
X		if(isgod==TRUE) country=0;
X		return;
X	}
X
X	if((isgod==FALSE) && (ntn[country].tgold < 0 )) {
X		errormsg("You are broke");
X		return;
X	}
X
X	if((sct[XREAL][YREAL].designation==DCITY)
X	||(sct[XREAL][YREAL].designation==DCAPITOL)) {
X		/*calculate cost for fort*/
X		cost=FORTCOST;
X		if(isgod==TRUE) cost=0;
X		else for(x=1;x<=sct[XREAL][YREAL].fortress;x++)
X			cost*=2;
X
X		if(sct[XREAL][YREAL].designation==DCITY) armbonus=8;
X		else if(sct[XREAL][YREAL].designation==DCAPITOL) armbonus=10;
X		if(magic(country,ARCHITECT)==TRUE) armbonus*=2;
X
X		mvprintw(LINES-4,0,"Construct <f>ortifications (+%d%% - %ld gold) or <s>hips?:",armbonus,cost);
X		refresh();
X		type=getch();
X	} else {
X		errormsg("Must construct in town or capitol");
X		if (isgod==1) country=0;
X		return;
X	}
X
X	/* construct ships*/
X	if (type=='s') {
X		/*check if next to sea*/
X		nearsea=0;
X		for(x=XREAL-1;x<=XREAL+1;x++)
X			for(y=YREAL-1;y<=YREAL+1;y++)
X				if(sct[x][y].altitude==WATER) nearsea=1;
X
X		if (nearsea==0) {
X			errormsg("not in a harbor");
X			if(isgod==TRUE) country=0;
X			return;
X		}
X
X		repairs=FALSE;
X		if((nvynum=getselunit()-MAXARM)>=0){
X			if(nvynum>=MAXNAVY){
X				errormsg("INVALID NAVY");
X				if(isgod==TRUE) country=0;
X				return;
X			}
X			mvaddstr(LINES-3,0,"Do you wish to repair existing fleet (y or n)");
X			refresh();
X			if(getch()=='y') repairs=TRUE;
X			else{
X				mvaddstr(LINES-3,0,"Do you wish to raise a new fleet (y or n)");
X				clrtoeol();
X				refresh();
X				if(getch()=='y') nvynum=(-1);
X			}
X		}
X
X		if(repairs==TRUE){
X			clear_bottom(0);
X			mvprintw(LINES-4,0,"Repairing Fleet %d",nvynum);
X			mvaddstr(LINES-3,0,"How many crew per ship do you wish to add:");
X			clrtoeol();
X			refresh();
X			mnumber = get_number();
X			cost = (long) mnumber*WARSHPCOST*NWAR + (long) mnumber*MERSHPCOST*NMER;
X			if( ntn[country].tgold < cost ) {
X				errormsg("NOT ENOUGH GOLD");
X				if(isgod==TRUE) country=0;
X				return;
X			}
X			if( sct[XREAL][YREAL].people < (NWAR+NMER) * mnumber ){
X				errormsg("NOT ENOUGH CIVILIANS IN SECTOR");
X				if(isgod==TRUE) country=0;
X				return;
X			}
X			if( SHIPCREW * (NWAR+NMER) < NCREW + (NWAR+NMER) * mnumber ){
X				errormsg("THAT WOULD EXCEED MAXIMUM SHIP CREW");
X				if(isgod==TRUE) country=0;
X				return;
X			}
X	
X			if(magic(country,SAILOR)==TRUE){
X				ntn[country].tgold -= cost/2;
X			} else {
X				ntn[country].tgold -= cost;
X			}
X
X			NCREW += (NWAR+NMER) * mnumber;
X			if(isgod==TRUE) country=0;
X			return;
X		}
X
X		if(nvynum<0) {
X			nvynum=0;
X			x=(-1);
X			while((x==(-1))&&(nvynum<MAXNAVY)) {
X				if(NWAR+NMER<=0) {
X					x=nvynum;
X					NWAR=0;
X					NMER=0;
X					NADJSHP;
X				}
X				nvynum++;
X			}
X			nvynum=x;
X		}
X		if(nvynum<0){
X			errormsg("NO FREE NAVIES");
X			if(isgod==TRUE) country=0;
X			return;
X		}
X		else	mvprintw(LINES-2,30,"raising new fleet %d",nvynum);
X
X
X		mvprintw(LINES-3,0,"how many merchants:");
X		refresh();
X		mnumber = get_number();
X		mvprintw(LINES-3,40,"how many warships:");
X		refresh();
X		wnumber = get_number();
X		/*sanity checks*/
X		if((wnumber>100)||(wnumber<0)) wnumber=0;
X		if((mnumber>100)||(mnumber<0)) mnumber=0;
X		if (wnumber==0 && mnumber==0)
X		{
X			if(isgod==1) country=0;
X			return;
X		}
X		cost =  wnumber*WARSHPCOST + mnumber*MERSHPCOST;
X		if(isgod==TRUE)				cost=0;
X		else if(magic(country,SAILOR)==TRUE)	cost/=2;
X
X		if(cost > ntn[country].tgold ) {
X			errormsg("sorry - not enough gold");
X			if(isgod==TRUE) country=0;
X			return;
X		}
X
X		if( sct[XREAL][YREAL].people < (wnumber+mnumber) * mnumber ){
X			errormsg("NOT ENOUGH CIVILIANS IN SECTOR");
X			if(isgod==TRUE) country=0;
X			return;
X		}
X
X		if((nvynum>=0)&&(nvynum<MAXNAVY)) {
X			clear_bottom(0);
X			mvprintw(LINES-4,0,"constructing %hd warships and %hd merchant",wnumber,mnumber);
X
X			NCREW += (wnumber+mnumber) * SHIPCREW;
X			sct[XREAL][YREAL].people -= (wnumber+mnumber)*SHIPCREW;
X
X			ntn[country].tgold -= cost;
X
X			NXLOC =XREAL;
X			NYLOC =YREAL;
X			NWAR+=wnumber;
X			NMER+=mnumber;
X			NMOVE=0;
X			NADJSHP;
X			NADJLOC;
X			NADJMOV;
X		} else errormsg("ERROR!!!!!!!!!!!!!");
X
X		mvprintw(LINES-2,30,"adding ships to fleet %d",nvynum);
X		mvprintw(LINES-2, 60, "PRESS ANY KEY");
X		beep();
X		refresh();
X		getch();
X	}
X	/* construct fortification points*/
X	else if(type=='f'){
X		if(sct[XREAL][YREAL].people>=500)
X		/* can only go into debt as much as the nation has jewels */
X		if ((ntn[country].tgold - cost) > ((-1)*10*ntn[country].jewels)) {
X			mvprintw(LINES-3,25,"you build +%d%% fort points for %ld gold",armbonus,cost);
X			ntn[country].tgold-=cost;
X			sct[XREAL][YREAL].fortress++;
X			INCFORT;
X			errormsg("");
X		}
X		else errormsg("need 500 people or you are broke");
X	}
X	else errormsg("invalid input error");
X
X	if(isgod==TRUE) country=0;
X	refresh();
X}
X
X/*DRAFT IF IN A CITY*/
Xvoid
Xdraft()
X{
X	short armynum,x,y,i;
X	int men=0,mercs;
X	short army=(-1), isgod=FALSE, newtype=0;
X	long i_cost, e_cost;
X
X	clear_bottom(0);
X	if(country==0) {
X		isgod=TRUE;
X		country=sct[XREAL][YREAL].owner;
X	}
X	else if(sct[XREAL][YREAL].owner!=country) {
X		errormsg("You do not own");
X		return;
X	}
X
X	if((sct[XREAL][YREAL].designation!=DCITY)
X	&&(sct[XREAL][YREAL].designation!=DCAPITOL)) {
X		errormsg("must raise in towns");
X		if(isgod==TRUE) country=0;
X		return;
X	}
X
X	if((sct[XREAL][YREAL].designation==DCITY)
X	&&(sct[XREAL][YREAL].people*(2*CITYLIMIT+(ntn[country].tsctrs/2))<ntn[country].tciv)){
X		mvprintw(LINES-1,0,"need %d people in town: hit any key",ntn[country].tciv/(2*CITYLIMIT+(ntn[country].tsctrs/2)));
X		refresh();
X		getch();
X		if(isgod==TRUE) country=0;
X		return;
X	}
X
X	if(ntn[country].tgold <= 0){
X		errormsg("you dont have any gold");
X		if(isgod==TRUE) country=0;
X		return;
X	}
X
X	/*raise an untrained army */
X	mvprintw(LINES-3,0,"how many men do you wish to raise:");
X	clrtoeol();
X	refresh();
X	men = get_number();
X	if(men<=0) {
X		if (isgod==TRUE) country=0;
X		return;
X	}
X	/* i_people is initial people -> can  draft up to following */
X	/*	draftable = max_draft - already drafted */
X	/*		  = imen/4 - ( imen - people)   */
X	/*		  = -3/4 * imen + people)   */
X	if((men > sct[XREAL][YREAL].people - (3*sct[XREAL][YREAL].i_people/4))
X	||(sct[XREAL][YREAL].i_people <= 0)) {
X		if(sct[XREAL][YREAL].i_people <= 0) {
X		errormsg("aborting: can not raise in this sector");
X		}
X		else errormsg("aborting: raising too many soldiers");
X		if(isgod==TRUE) country=0;
X		return;
X	}
X	/*ask what type of unit*/
X	y=LINES-2;
X	x=0;
X	mvaddstr(y,x,"options:");
X	clrtoeol();
X	x+=9;
X	for(i=0;i<=NOUNITTYPES;i++){
X		if(unitvalid(i)==TRUE) {
X			mvprintw(y,x+2,"%s",*(shunittype+i));
X			mvprintw(y,x,"(%c)",*(shunittype+i)[0]);
X			x+=7;
X			if(x>COLS-10){
X				x=0;
X				y++;
X			}
X		}
X	}
X	move(y,x);
X	clrtoeol();
X	if((magic(country,WARRIOR)==TRUE)
X	||(magic(country,WARLORD)==TRUE)
X	||(magic(country,CAPTAIN)==TRUE))
X	mvaddstr(LINES-3,0,"(Warrior = 1/2 enlist cost) what type of unit do you want:");
X	else
X	mvaddstr(LINES-3,0,"what type of unit do you want to raise:");
X
X	clrtoeol();
X	refresh();
X	switch(getch()){
X	case 'm':
X		newtype=A_MILITIA;
X		break;
X	case 'I':
X		newtype=A_INFANTRY;
X		break;
X	case 'A':
X		newtype=A_ARCHER;
X		break;
X	case 'M':
X		newtype=A_MERCENARY;
X		break;
X	case 'P':
X		newtype=A_PHALANX;
X		break;
X	case 'L':
X		newtype=A_LEGION;
X		break;
X	case 'E':
X		newtype=A_ELITE;
X		break;
X	case 'D':
X		newtype=A_DRAGOON;
X		break;
X	case 'C':
X		newtype=A_CAVALRY;
X		break;
X	case 'K':
X		newtype=A_KNIGHT;
X		break;
X	case 'c':
X		newtype=A_CATAPULT;
X		break;
X	case 's':
X		newtype=A_SEIGE;
X		break;
X	case 'R':
X		newtype=A_ROC;
X		break;
X	case 'O':
X		newtype=A_ORC;
X		break;
X	case 'U':
X		newtype=A_URUK;
X		break;
X	case 'T':
X		newtype=A_TROLL;
X		break;
X	case 'g':
X		newtype=A_GRIFFON;
X		break;
X	case 'l':
X		newtype=A_LT_CAV;
X		break;
X	case 'o':
X		newtype=A_OLOG;
X		break;
X	case 'N':
X		newtype=A_NINJA;
X		break;
X	case 'X':
X		newtype=A_MARINES;
X		break;
X	case 'S':
X		newtype=A_SAILOR;
X		break;
X	case 'G':
X		newtype=A_GOBLIN;
X		break;
X	case 'e':
X		newtype=A_ELEPHANT;
X		break;
X	default:
X		errormsg("Invalid type");
X		if (isgod==TRUE) country=0;
X		return;
X	}
X	if(unitvalid(newtype)==FALSE) {
X		errormsg("Invalid type");
X		if (isgod==TRUE) country=0;
X		return;
X	}
X
X	/* check that you dont have too many mercenaries */
X	mercs=0;
X	if(newtype == A_MERCENARY){
X		for(armynum=0;armynum<MAXARM;armynum++){
X			if(ATYPE==A_MERCENARY) mercs+=ASOLD;
X		}
X		if(men+mercs > (ntn[country].tmil-mercs)/2) {
X			errormsg("aborting--you would then have more than 50%% mercenaries");
X			if(isgod==TRUE) country=0;
X			return;
X		}
X	}
X
X	e_cost= (long) *(u_encost+newtype) * men;
X	i_cost= (long) *(u_eniron+newtype) * men;
X
X	/*magiced get 1/2 enlistment costs*/
X	if((magic(country,WARRIOR)==TRUE)
X	||(magic(country,WARLORD)==TRUE)
X	||(magic(country,CAPTAIN)==TRUE))
X		e_cost/=2;
X
X	if((magic(country,SAPPER)==TRUE)
X	&&((newtype==A_SEIGE)||(newtype==A_CATAPULT))){
X		e_cost/=2;
X		i_cost/=2;
X	}
X
X	/*check to see if enough gold*/
X	if(e_cost >  ntn[country].tgold) {
X		errormsg("aborting--you dont have enough gold in treasury");
X		if(isgod==TRUE) country=0;
X		return;
X	}
X	/*check for iron deposits*/
X	else if(i_cost > ntn[country].tiron) {
X		mvprintw(LINES-1,0,"aborting--you dont have %ld iron",i_cost);
X		clrtoeol();
X		refresh();
X		getch();
X		if(isgod==TRUE) country=0;
X		return;
X	}
X	else {
X		move(LINES-2,0);
X		clrtoeol();
X	}
X
X	/*count is order of that army in sector*/
X	/*armynum is number of that army*/
X	if((armynum=getselunit())>=0){
X		if(armynum>=MAXARM) {
X			army = -1;
X		} else {
X			/*if different types, must raise new army*/
X			if(newtype == ATYPE){
X			mvaddstr(LINES-1,0,"Do you wish to raise a new army:");
X			clrtoeol();
X			refresh();
X			if(getch()!='y') army=armynum;
X			else army= -1;
X			}
X			else army=(-1);
X		}
X	}
X	if(army==(-1)) {
X		mvprintw(LINES-2,0,"(%s, gold=%ld, iron=%ld) raising a new army",*(unittype+newtype),e_cost,i_cost);
X		clrtoeol();
X		refresh();
X		sleep(1);
X
X		armynum=0;
X		while((army==(-1))&&(armynum<MAXARM)) {
X			if(ASOLD<=0) {
X				army=armynum;
X				ASOLD=0;
X				ASTAT=DEFEND; /* set new armies to DEFEND */
X				AADJSTAT;
X				AADJMEN;
X			}
X			armynum++;
X		}
X		if(army==(-1)){
X			errormsg("NO FREE ARMIES");
X			if(isgod==TRUE) country=0;
X			return;
X		}
X		armynum=army;
X	} else {
X		mvprintw(LINES-2,0,"(%s, gold=%ld, iron=%ld) adding to existing army",*(unittype+newtype),e_cost,i_cost);
X		clrtoeol();
X		refresh();
X		sleep(1);
X	}
X
X	ATYPE=newtype;
X	if(ATYPE != A_MERCENARY){
X		sct[XREAL][YREAL].people -= men;
X		SADJCIV;
X	}
X	AYLOC=YREAL;
X	AXLOC=XREAL;
X	AADJLOC;
X	AMOVE=0;
X	AADJMOV;
X	ASOLD+=men;
X	AADJMEN;
X	ntn[country].tiron -= i_cost;
X	ntn[country].tgold -= e_cost;
X	makemap(); /* if display 'y' is set, this will show new army */
X	if(isgod==TRUE) country=0;
X}
X
X/*adjust picked army*/
Xvoid
Xadjarm(armynum)
Xint armynum;
X{
X	short status;
X
X	clear_bottom(0);
X	if(armynum==(-1)) armynum=getselunit();
X	mvprintw(LINES-4,0,"ADJUST ARMY %d",armynum);
X	mvaddstr(LINES-3,0,"1) March  2) Scout  3) Attack  4) Defend  5) Garrison");
X	mvaddstr(LINES-2,0,"Enter your choice (return to continue):");
X	refresh();
X	status = get_number();
X	if((status<1)||(status>5)) return;
X	change_status(armynum,status);
X}
X
X/*go through msgfile not rewriting to temp messages you discard*/
X/* then move temp to msgfile*/
Xvoid
Xrmessage()
X{
X	int unlink();
X	FILE *mesgfp;
X	FILE *fptemp;
X	int i;
X	int count;
X	int contd;
X	int done=FALSE;
X	char tempfile[ 30 ];
X	char mesgfile[ 30 ];
X	char line[80];
X	char save[20][80];
X
X	clear();
X	/*open file*/
X	sprintf(tempfile,"%s:temp",msgfile);
X	if( (fptemp = fopen(tempfile,"w")) == NULL ) {
X		mvprintw(0,0,"error on creating %s--hit return", tempfile);
X		refresh();
X		getch();
X		return;
X	}
X
X	sprintf(mesgfile,"%s%d",msgfile,country);
X	if ((mesgfp=fopen(mesgfile,"r"))==NULL) {
X	        (void) unlink (tempfile) ;
X		mvprintw(0,0,"no messages in %s, hit return",mesgfile);
X		refresh();
X		getch();
X		return;
X	}
X
X	/*read in file a line at at time*/
X	if(fgets(line,80,mesgfp)==NULL) done=TRUE;
X	while(done==FALSE) {
X		contd=0;
X		count=3;
X		if(strncmp(line,ntn[country].name,strlen(ntn[country].name))==0) {
X			clear();
X			standout();
X			/*print to end of message*/
X			while(contd==0) {
X				if(count<22) strcpy(save[count-3],line);
X				mvprintw(count,0,"%s",line);
X				standend();
X				for(i=0;i<strlen(ntn[country].name);i++)
X					mvaddch(count,i,' ');
X				count++;
X				if(fgets(line,80,mesgfp)==NULL) contd=1;
X				if(strncmp(line,"END",3)==0) contd=1;
X			}
X			standout();
X			mvaddstr(LINES-3,(COLS/2)-22,"HIT RETURN TO SAVE MESSAGE");
X			mvaddstr(LINES-2,(COLS/2)-22,"HIT ANY OTHER KEY TO CONTINUE");
X			standend();
X			refresh();
X			if(getch()=='\n') {
X				for(i=0;i<count-3;i++) fputs(save[i],fptemp);
X				strcpy(line,"END\n");
X				fputs(line,fptemp);
X			}
X		}
X		else fputs(line,fptemp);
X		if(fgets(line,80,mesgfp)==NULL) done=TRUE;
X	}
X	fclose(mesgfp);
X	fclose(fptemp);
X
X	/*IMPLEMENT A MOVE BETWEEN TMP FILE AND REAL FILE HERE*/
X	move_file( tempfile, mesgfile );
X}
X
Xvoid
Xwmessage()
X{
X	FILE *fp, *fopen();
X	int x,y;
X	int done=FALSE;
X	char ch;
X	char name[12];
X	char realname[12];
X	int temp=(-1);
X	int linedone;
X	char line[100];
X	int nationid;
X
X	/*what nation to send to*/
X	clear();
X	mvprintw(0,0,"to send a message to the administrator, send to 'god':");
X	mvprintw(2,0,"What country name do you wish to send to:");
X	refresh();
X	get_nname(name);
X
X	/*is name valid*/
X	for(nationid=0;nationid<MAXNTN;nationid++) if(ntn[nationid].active!=0)
X		if(strcmp(name,ntn[nationid].name)==0) temp=nationid;
X
X	if(strcmp(name,"god")==0) {
X		temp=0;
X		strcpy(realname,"unowned");
X	}
X	else strcpy(realname,name);
X
X	if (temp==(-1)) {
X		mvprintw(3,0,"error--invalid name");
X		refresh();
X		getch();
X		return;
X	}
X
X	sprintf(line,"%s%d",msgfile,temp);
X	if ((fp=fopen(line,"a+"))==NULL) {
X		mvprintw(4,0,"error opening %s",line);
X		refresh();
X		getch();
X		return;
X	}
X
X	move(0,0);
X	clrtoeol();
X	move(2,0);
X	clrtoeol();
X	standout();
X	mvprintw(3,(COLS-25)/2,"message to nation %s",name);
X	mvprintw(LINES-2,(COLS-35)/2,"end with a return on a new line");
X	standend();
X
X	if (country==0)
X		fprintf(fp,"%s Message to %s from GOD\n",realname,name);
X	else fprintf(fp,"%s Message to %s from %s\n",realname,name,ntn[country].name);
X	fprintf(fp,"%s \n",realname);
X	y=6;
X	x=0;
X	refresh();
X	while(done==FALSE) {
X		linedone=FALSE;
X		ch=' ';
X		/*read line*/
X		while(linedone==FALSE){
X			/* check for delete or backspace */
X			if(ch=='\b' || ch=='\177'){
X				if(x>0) x--;
X				mvaddch(y,x,' ');
X				move(y,x);
X				line[x]=' ';
X				refresh();
X				ch=getch();
X			} else if(ch=='\n') linedone=TRUE;
X			else if(isprint(ch)&&(x<65)){
X				/*concatonate to end*/
X				line[x]=ch;
X				mvaddch(y,x,ch);
X				x++;
X				refresh();
X				ch=getch();
X			} else	ch=getch();
X		}
X		if (ch!='\n') {
X			mvaddch(y,x,ch);
X			line[x]=ch;
X			x++;
X		}
X		line[x]='\0';
X		if(x<=1) done=TRUE;
X		/*write to file*/
X		fprintf(fp,"%s %s\n",realname,line);
X		x=0;
X		y++;
X	}
X	fputs("END\n",fp);
X	mvprintw(20,0,"Done with messaging");
X	fclose(fp);
X}
X
X/*strategic move of civilians...once only*/
Xvoid
Xmoveciv()
X{
X	short people;
X	short i,j;
X
X	mvaddstr(LINES-1,0,"Moving civilians costs 50 per civilian");
X	if(sct[XREAL][YREAL].owner!=country){
X		mvprintw(LINES-2,0,"you do not own:  hit return");
X		clrtoeol();
X		refresh();
X		getch();
X		return;
X	}
X	else if(sct[XREAL][YREAL].people==0){
X		mvaddstr(LINES-2,0,"nobody lives here!!!:  hit return");
X		clrtoeol();
X		refresh();
X		getch();
X		makebottom();
X		return;
X	}
X
X	clear();
X	mvaddstr(0,0,"Moving civilians costs 50 per civilian");
X	mvprintw(1,0,"sector contains %d people",sct[XREAL][YREAL].people);
X	mvaddstr(2,0,"how many people to move?");
X	clrtoeol();
X	refresh();
X	people = get_number();
X	if((people<0)
X	||(people>sct[XREAL][YREAL].people)
X	||(people*50>ntn[country].tgold)){
X		mvaddstr(5,0,"Sorry...Input error or you do not have the gold");
X		clrtoeol();
X		refresh();
X		getch();
X		makebottom();
X		return;
X	}
X
X	mvprintw(5,0,"sector location is x=%d, y=%d",XREAL,YREAL);
X	mvaddstr(7,0,"what x location to move to?");
X	refresh();
X	i = get_number();
X
X	if((i-(XREAL))>2||(i-(XREAL))<-2) {
X		mvprintw(10,0,"can only move 2 sectors (you tried %hd)...--hit any key",i-(XREAL));
X		refresh();
X		getch();
X		return;
X	}
X
X	mvaddstr(10,0,"what y location to move to?");
X	clrtoeol();
X	refresh();
X	j = get_number();
X	if((j-(YREAL)>2)||((YREAL)-j>2)) {
X		mvprintw(10,0,"sorry, can only move 2 sectors (you tried %hd)...--hit any key",j-(XREAL));
X		refresh();
X		getch();
X	}
X	else if(sct[i][j].owner!=country){
X		mvaddstr(12,0,"sorry, you dont own it...");
X		clrtoeol();
X		refresh();
X		getch();
X	}
X	/*need to check move cost > 0 for sector*/
X	else if(movecost[i][j]<0){
X		mvaddstr(12,0,"you can't enter there...");
X		clrtoeol();
X		refresh();
X		getch();
X	}
X	else {
X		ntn[country].tgold-=50*people;
X		sct[XREAL][YREAL].people-=people;
X		SADJCIV;
X		sct[i][j].people+=people;
X		SADJCIV2;
X	}
X}
X
Xint
Xarmygoto()
X{
X	short armynum=0,loop=0;
X	armynum=getselunit();
X	if((armynum<0)||(armynum>MAXARM)) armynum=0;
X	else armynum++;
X	/* move to next army with > 0 soldiers*/
X	while ((armynum < MAXARM) && (ASOLD <= 0)) armynum++;
X	if(armynum >= MAXARM)  {
X		armynum=0;
X		if(ASOLD <= 0) return(0);
X	}
X	/*move to correct location*/
X	xcurs = AXLOC - xoffset;
X	ycurs = AYLOC - yoffset;
X	coffmap();
X
X	/*select correct unit*/
X	selector=0;
X	pager=0;
X	while((getselunit() != armynum) && (loop++ < 500)) {
X		selector+=2;
X		if(selector>=10) {
X			selector=0;
X			pager+=1;
X		}
X	}
X	return(1);
X}
X
Xint
Xnavygoto()
X{
X	short nvynum=0,loop=0;
X	nvynum=getselunit()-MAXARM;
X	if((nvynum<0)||(nvynum>MAXNAVY)) nvynum=0;
X	else nvynum++;
X	/* move to next nvy with > 0 soldiers*/
X	while ((nvynum < MAXNAVY) && (NMER+NWAR <= 0)) nvynum++;
X	if(nvynum >= MAXNAVY) {
X		nvynum=0;
X		if(NMER+NWAR <= 0) return(0);
X	}
X	/*move to correct location*/
X	xcurs = NXLOC - xoffset;
X	ycurs = NYLOC - yoffset;
X	coffmap();
X
X	/*select correct unit*/
X	selector=0;
X	pager=0;
X	while(((getselunit()-MAXARM) != nvynum) && (loop++ < 500)) {
X		selector+=2;
X		if(selector>=10) {
X			selector=0;
X			pager+=1;
X		}
X	}
X	return(1);
X}
END_OF_commands.c
if test 23192 -ne `wc -c <commands.c`; then
    echo shar: \"commands.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f makeworld.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"makeworld.c\"
else
echo shar: Extracting \"makeworld.c\" \(22776 characters\)
sed "s/^X//" >makeworld.c <<'END_OF_makeworld.c'
X/*conquer : Copyright (c) 1988 by Ed Barlow.
X *  I spent a long time writing this code & I hope that you respect this.
X *  I give permission to alter the code, but not to copy or redistribute
X *  it without my explicit permission.  If you alter the code,
X *  please document changes and send me a copy, so all can have it.
X *  This code, to the best of my knowledge works well,  but it is my first
X *  'C' program and should be treated as such.  I disclaim any
X *  responsibility for the codes actions (use at your own risk).  I guess
X *  I am saying "Happy gaming", and am trying not to get sued in the process.
X *                                                Ed
X */
X
X/*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
Xextern short country;
Xint area_map[MAXX][MAXY];/*Value Map of Areas*/
Xint type[MAPX][MAPY];
X
X#define TOHILL(x,y)	{ \
Xsct[(x)][(y)].altitude=HILL; \
Xnmountains--; \
X}
X#define TOMT(x,y)	{ \
Xsct[(x)][(y)].altitude=MOUNTAIN; \
Xnmountains--; \
X}
X#define TOPEAK(x,y)	{ \
Xsct[(x)][(y)].altitude=PEAK; \
Xnmountains--; \
X}
X
Xvoid
Xmakeworld()
X{
X	register 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	char passwd[12];
X	int alloc = NUMAREAS * 2;/*Value Allocated*/
X	int tplace[MAXX][MAXY] ;/*Temporary matrix 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 nmountains;
X	int rnd;
X	int tempfd;
X	char newstring[40];
X
X	/*abort if datafile currently exists*/
X	if((tempfd=open(datafile,0))!=-1) {
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	}
X	printf("\n**********************WELCOME TO CONQUER**********************");
X	printf("\nThe world will now be created...Your super user login will be 'god'.");
X	printf("\nNon player countries will be read from data stored in the nations file");
X	printf("\n& will have the same password as god (about to be entered). Add player");
X	printf("\nnations with the command <conquer -a>.  Have fun!!!\n");
X	printf("\nRemember to check the world out before playing to make sure");
X	printf("\nno nations are in bad positions (surrounded by water... )");
X	printf("\n******************************************************************\n\n");
X
X	printf("First, we must zero extraneous files from prior games\n");
X	sprintf(newstring,"rm %s* 2> /dev/null",exefile);
X	printf("\t%s\n",newstring);
X	system(newstring);
X	sprintf(newstring,"rm %s* 2> /dev/null",msgfile);
X	printf("\t%s\n",newstring);
X	system(newstring);
X	sprintf(newstring,"> %s 2> /dev/null",newsfile);
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	printf("please enter new conquer super user password (remember this!):");
X	scanf("%s",passwd);
X	getchar();
X	printf("please reenter conquer password:");
X	scanf("%s",ntn[0].passwd);
X	getchar();
X	if((strlen(ntn[0].passwd)<2)
X	||(strncmp(passwd,ntn[0].passwd,PASSLTH)!=0)) {
X		printf("\ninvalid super user password\n");
X		exit(FAIL);
X	}
X	strncpy(ntn[0].passwd,crypt(passwd,SALT),PASSLTH);
X
X	printf("\n\ncreating world\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]=0;
X		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				printf("ERROR");
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("amount of water is %d / %d sectors\n",chance,MAPX*MAPY);
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("smoothing...amount of water is %d / %d sectors\n",chance,MAPX*MAPY);
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	nmountains= MAPX * MAPY * PMOUNT * ( 100-PWATER ) / (100*100);
X	printf("%d mountains to be placed",nmountains);
X
X	/* heuristic says that 5 is cutoff number to stop placing ranges */
X	while(nmountains>(NUMAREAS*3*PWATER/100)+5) {
X		/*Place one range randomly*/
X		X1 = rand()%(MAPX-6);
X		Y1 = rand()%(MAPY-6);
X		if((type[X1][Y1]==LAND)
X		&&(type[X1+1][Y1+1]==LAND)
X		&&(type[X1+1][Y1]==LAND)
X		&&(type[X1][Y1+1]==LAND)
X		&&(type[X1+2][Y1+2]==LAND)) {
X			/*place second endpoint */
X			valid = FALSE;
X			i=0;
X			while((valid==FALSE) && (i<500)) {
X				i++;
X				X2 = (rand()%7) + X1;
X				Y2 = (rand()%7) + Y1;
X				if(type[X2][Y2] == LAND) {
X					valid = TRUE;
X					/*fill in mountain range*/
X					for(x=X1;x<=X2;x++) {
X						if(X1<X2)
X						y=((Y2-Y1)*(x-X1)/(X2-X1))+Y1;
X						else y=Y1;
X						if(type[x][y] == LAND){
X							if(rand()%100>80) {
X								TOPEAK(x,y);
X							}
X							else {
X								TOMT(x,y)
X							}
X						}
X						if((y < MAPY - 1)
X						&& type[x][y+1] == LAND) {
X							rnd=rand()%100+1;
X							if(rnd>90) {
X								TOPEAK(x,y+1);
X							}
X							else if(rnd>50) {
X								TOMT(x,y+1);
X							}
X							else if(rnd>20) {
X								TOHILL(x,y+1);
X							}
X						}
X						if((y!=0)
X						&& type[x][y-1] == LAND ) {
X							rnd=rand()%100+1;
X							if(rnd>90) {
X								TOPEAK(x,y-1);
X							} else
X							if(rnd>50) {
X								TOMT(x,y-1);
X							} else
X							if(rnd>20) {
X								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) {
X								TOMT(x,y-2);
X							} else {
X								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) {
X								TOMT(x,y+2);
X							} else if(rnd>50) {
X								TOHILL(x,y+2);
X							}
X						}
X					}
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	/*char veg[]="VDW46973JSI~"*/
X	/*char veg[]="VDWBLGWFJSI~"*/
X	/*               012345678901*/
X
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	/*char veg[]="VDW46973JSI~"*/
X	/*char veg[]="VDWBLGWFJSI~"*/
X	/*               012345678901*/
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	/*PLACE EACH SECTOR'S RAW MATERIALS */
X
X	printf("\nplacing raw materials\n");
X	for(y=0;y<MAPY;y++) for(x=0;x<MAPX;x++) {
X
X		/*gold*/
X		if(rand()%10==0) sct[x][y].gold=rand()%4+4;
X		else if(rand()%4==0) sct[x][y].gold=rand()%4;
X		else sct[x][y].gold=0;
X
X		/*iron*/
X		if(rand()%10==0) sct[x][y].iron=rand()%4+4;
X		else if(rand()%4==0) sct[x][y].iron=rand()%4;
X		else sct[x][y].iron=0;
X
X		/*default designations*/
X		sct[x][y].designation=DNODESIG;
X
X		/*default owner is unowned*/
X		sct[x][y].owner=0;
X	}
X	printf("populating world\n");
X	populate();
X	close(tempfd);
X	writedata();
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;
X	int nvynum=0,army2num=0,armynum=0;
X	int temp;
X	int cnum=0;
X	FILE *fp, *fopen();
X	int done=FALSE;
X	char line[80];
X
X
X	/*randomly scatter lizard city (want in DESERTS/swamp/Ice) */
X	/*don't reproduce. Their cities are fortified and stockpiled */
X#ifdef LZARD
X	strncpy(ntn[NLIZARD].name,"lizard",10);
X	strncpy(ntn[NLIZARD].leader,"dragon",10);
X	strcpy(ntn[NLIZARD].passwd,ntn[0].passwd);
X	ntn[NLIZARD].race=LIZARD;
X	ntn[NLIZARD].mark='*';
X	ntn[NLIZARD].active=2;
X	ntn[NLIZARD].aplus=0;
X	ntn[NLIZARD].dplus=0;
X	ntn[NLIZARD].maxmove=0;
X	ntn[NLIZARD].repro=0;
X	ntn[NLIZARD].powers=KNOWALL;
X	for(i=0;i<NTOTAL;i++) if(i!=NLIZARD) {
X		ntn[NLIZARD].dstatus[i]=WAR;
X		ntn[i].dstatus[NLIZARD]=WAR;
X	}
X
X	armynum=0;
X	country=NLIZARD;
X	/* adjustment to make sure that fair amount of lizards are */
X	/* created on the map ... but not too many... */
X	while(armynum<(min((MAXARM-2),(MAXARM-2) * MAPX * MAPY / 10000 ))){
X		x = (rand()%MAPX);
X		y = (rand()%MAPY);
X		if(armynum>=MAXARM) break;
X		if (is_habitable(x,y)) {
X			sct[x][y].designation = DCASTLE;
X			sct[x][y].fortress = 5+rand()%5;
X			sct[x][y].gold = 15+rand()%20;
X			for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++)
X				if(i>=0&&j>=0&&i<MAPX&&j<MAPY)
X					if(sct[i][j].altitude!=WATER)
X						sct[i][j].owner = NLIZARD;
X			AMOVE=0;
X			AXLOC=x;
X			AYLOC=y;
X			ASTAT=GARRISON;
X			ASOLD=750+100*(rand()%10);
X			ATYPE=A_INFANTRY;
X			armynum++;
X			AMOVE=8;
X			AXLOC=x;
X			AYLOC=y;
X			ASTAT=ATTACK;
X			ASOLD=750+100*(rand()%10);
X			ATYPE=A_INFANTRY;
X			armynum++;
X		}
X	}
X	printf("%d lizards placed\n",armynum/2);
X#endif
X
X	/* Place Brigands, Barbarians, and Nomads*/
X#ifdef MONSTER
X	armynum=0;
X	army2num=0;
X	strcpy(ntn[NBARBARIAN].name,"bbarian");
X	strcpy(ntn[NBARBARIAN].leader,"shaman");
X	strcpy(ntn[NBARBARIAN].passwd,ntn[0].passwd);
X	ntn[NBARBARIAN].race=BARBARIAN;
X	ntn[NBARBARIAN].powers=KNOWALL;
X	ntn[NBARBARIAN].mark='*';
X	ntn[NBARBARIAN].active=2;
X	ntn[NBARBARIAN].aplus=0;
X	ntn[NBARBARIAN].dplus=10;
X	ntn[NBARBARIAN].maxmove=4;
X	ntn[NBARBARIAN].repro=5;
X	for(i=0;i<NTOTAL;i++) if(i!=NBARBARIAN) {
X		ntn[NBARBARIAN].dstatus[i]=WAR;
X		ntn[i].dstatus[NBARBARIAN]=WAR;
X	}
X	ntn[NBARBARIAN].dstatus[NBARBARIAN]=NEUTRAL;
X
X	strcpy(ntn[NNOMAD].name,"nomad");
X	strcpy(ntn[NNOMAD].leader,"khan");
X	strcpy(ntn[NNOMAD].passwd,ntn[0].passwd);
X	ntn[NNOMAD].powers=KNOWALL;
X	ntn[NNOMAD].race=NOMAD;
X	ntn[NNOMAD].mark='*';
X	ntn[NNOMAD].active=2;
X	ntn[NNOMAD].aplus=10;
X	ntn[NNOMAD].dplus=0;
X	ntn[NNOMAD].maxmove=4;
X	ntn[NNOMAD].repro=5;
X	for(i=0;i<NTOTAL;i++) if(i!=NNOMAD) {
X		ntn[NNOMAD].dstatus[i]=WAR;
X		ntn[i].dstatus[NNOMAD]=WAR;
X	}
X	ntn[NNOMAD].dstatus[NNOMAD]=NEUTRAL;
X
X	strcpy(ntn[NPIRATE].name,"pirate");
X	strcpy(ntn[NPIRATE].leader,"captain");
X	strcpy(ntn[NPIRATE].passwd,ntn[0].passwd);
X	ntn[NPIRATE].powers=KNOWALL;
X	ntn[NPIRATE].race=PIRATE;
X	ntn[NPIRATE].mark='*';
X	ntn[NPIRATE].active=2;
X	ntn[NPIRATE].aplus=20;
X	ntn[NPIRATE].dplus=0;
X	ntn[NPIRATE].maxmove=4;
X	ntn[NPIRATE].repro=5;
X	for(i=0;i<NTOTAL;i++) if(i!=NPIRATE) {
X		ntn[NPIRATE].dstatus[i]=WAR;
X		ntn[i].dstatus[NPIRATE]=WAR;
X	}
X	ntn[NPIRATE].dstatus[NPIRATE]=NEUTRAL;
X
X	temp=(rand()%10+1)*(rand()%10+1);
X	for(i=0;i<temp;i++){
X		/*50% chance will be on edge, else anywhere*/
X		if(rand()%2==0){
X			if(rand()%2==0) {
X				x=(rand()%20);
X				y=(rand()%20);
X			}
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		}
X		else {
X			x = rand()%MAPX;
X			y = rand()%MAPY;
X		}
X
X		/* now place people*/
X		if (is_habitable(x,y)&&sct[x][y].owner==0) {
X			if(rand()%2==0) {
X				sct[x][y].owner = NBARBARIAN;
X				country=NBARBARIAN;
X				AXLOC=x;
X				AYLOC=y;
X				ASTAT=ATTACK;
X				ASOLD=200+100*(rand()%10);
X				ATYPE=A_INFANTRY;
X				if(armynum<MAXARM-1) armynum++;
X			}
X			else {
X				sct[x][y].owner = NNOMAD;
X				ntn[NNOMAD].arm[army2num].xloc=x;
X				ntn[NNOMAD].arm[army2num].yloc=y;
X				ntn[NNOMAD].arm[army2num].stat=ATTACK;
X				ntn[NNOMAD].arm[army2num].sold=100+100*(rand()%15);
X				ntn[NNOMAD].arm[army2num].unittyp=A_CAVALRY;
X				if(army2num<MAXARM-1) army2num++;
X			}
X		}
X		else if(nvynum<MAXNAVY) {
X			country=NPIRATE;
X			NXLOC=x;
X			NYLOC=y;
X			NWAR=2*(1+rand()%10);
X			NCREW=NWAR*SHIPCREW;
X			nvynum++;
X		}
X	}
X	printf("all random population placed\n");
X#endif
X
X	/*set up god but dont place*/
X	strcpy(ntn[0].name,"unowned");
X	strcpy(ntn[0].leader,"god");
X	ntn[cnum].race=GOD;
X	ntn[cnum].mark='-';
X	ntn[cnum].active=0;
X	ntn[cnum].location=GOD;
X	ntn[cnum].powers=KNOWALL;
X	cnum++;
X
X	if ((fp=fopen(helpfile,"r"))==NULL) {
X		printf("\terror on read of %s file\n",helpfile);
X		printf("\tdo you wish to use default help file (y or n)?");
X		if(getchar()=='y'){
X		sprintf(line,"cp %s/%s %s",DEFAULTDIR,helpfile,helpfile);
X		printf("\n%s\n",line);
X		system(line);
X		} else {
X			printf("\nOK; no NPC nations used\n");
X			return;
X		}
X		getchar();
X	}
X
X#ifdef NPC
X
X	/*open npcsfile file*/
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	else printf("reading npc nation data from file: %s\n",npcsfile);
X
X	cnum=1;
X	/*set up npc nation*/
X	if(fgets(line,80,fp)==NULL) done=TRUE;
X	while(done==FALSE) {
X		/*read and parse a new line*/
X		if(line[0]!='#') {
X			sscanf(line,"%s %s %c %c %c %hd %hd %hd %ld %ld %ld %hd %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,&ntn[cnum].maxmove,&ntn[cnum].tgold,
X			&ntn[cnum].tmil,&ntn[cnum].tciv,&ntn[cnum].repro,
X			&ntn[cnum].active);
X			ntn[cnum].active++;
X			ntn[cnum].class=0;
X			strcpy(ntn[cnum].passwd,ntn[0].passwd);
X			country=cnum;
X			if(ntn[country].race==HUMAN){
X				ntn[country].powers=WARRIOR;
X				exenewmgk(WARRIOR);
X			}
X			else if(ntn[country].race==DWARF){
X				ntn[country].powers=MINER;
X				exenewmgk(MINER);
X			}
X			else if(ntn[country].race==ELF){
X				ntn[country].powers=THE_VOID;
X				exenewmgk(THE_VOID);
X			}
X			else if(ntn[country].race==ORC){
X				ntn[country].powers=MI_MONST;
X				exenewmgk(MI_MONST);
X			}
X			else ntn[country].powers=WARRIOR;
X			ntn[country].tfood= ntn[country].tciv * 3;
X			ntn[country].tiron=10000L;
X			ntn[country].jewels=10000L;
X			printf("\tnation %d: %s",cnum,line);
X			cnum++;
X			place();
X		}
X		if(fgets(line,80,fp)==NULL) done=TRUE;
X	}
X	printf("all npc nations placed\n");
X#endif
X}
END_OF_makeworld.c
if test 22776 -ne `wc -c <makeworld.c`; then
    echo shar: \"makeworld.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 4 \(of 8\).
cp /dev/null ark4isdone
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