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

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

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



#! /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 6 (of 8)."
# Contents:  data.h magic.c main.c
# Wrapped by billr@saab on Thu Jun 16 09:40:01 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f data.h -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"data.h\"
else
echo shar: Extracting \"data.h\" \(13697 characters\)
sed "s/^X//" >data.h <<'END_OF_data.h'
X/* conquer : Copyright (c) 1988 by Ed Barlow. */
X
X/*--------I DO BELIEVE IT IS NECESSARY TO ALTER THIS FILE-------------------*/
X#define	FAIL	1		/* fail return to shell */
X#define	SUCCESS	0		/* successful return to shell */
X#define	BIG	500000000L	/* BIGGER THAN ANYTHING SHOULD BE */
X
X#include <curses.h>
X/* sometimes curses.h defines TRUE ...but doesn't */
X/* check if already defined */
X#ifndef TRUE
X#define	TRUE		1
X#define	FALSE		0
X#endif
X
X/* these defines are for types of magic */
X#define	M_MIL		1
X#define	M_CIV		2
X#define	M_MGK		3
X
X/*simple contour map definitions*/
X#define	WATER		(*(ele+0))
X#define	PEAK		(*(ele+1))
X#define	MOUNTAIN	(*(ele+2))
X#define	HILL		(*(ele+3))
X#define	CLEAR		(*(ele+4))
X
X/*racial types*/
X#define	GOD		'-'
X#define	ORC		'O'
X#define	ELF		'E'
X#define	DWARF		'D'
X#define	LIZARD		'L'
X#define	HUMAN		'H'
X#define	PIRATE		'P'
X#define	BARBARIAN	'B'
X#define	NOMAD		'N'
X#define	TUNKNOWN	'?'
X
X/*designations*/
X#ifdef 1
X#define	DCITY		't'
X#define	DCAPITOL	'c'
X#define	DMINE		'm'
X#define	DFARM		'f'
X#define	DDEVASTATED	'x'
X#define	DGOLDMINE	'$'
X#define	DCASTLE		'!'
X#define	DNODESIG	'-'
X#else
X#define	DCITY		(*(des+0))
X#define	DCAPITOL	(*(des+1))
X#define	DMINE		(*(des+2))
X#define	DFARM		(*(des+3))
X#define	DDEVASTATED	(*(des+4))
X#define	DGOLDMINE	(*(des+5))
X#define	DCASTLE		(*(des+6))
X#define	DNODESIG	(*(des+7))
X#endif
X
X/* nation placement variables */
X#define	GREAT		'G'
X#define	FAIR		'F'
X#define	RANDOM		'R'
X#define	OOPS		'X'
X
X/*vegetation types -- these are legal in designations too*/
X#define	VOLCANO		(*(veg+0))
X#define	DESERT		(*(veg+1))
X#define	TUNDRA		(*(veg+2))
X#define	BARREN		(*(veg+3))
X#define	LT_VEG		(*(veg+4))
X#define	GOOD		(*(veg+5))
X#define	WOOD		(*(veg+6))
X#define	FOREST		(*(veg+7))
X#define	JUNGLE		(*(veg+8))
X#define	SWAMP		(*(veg+9))
X#define	ICE		(*(veg+10))
X#define	NONE		(*(veg+11))
X
X/*Diplomacy Variables*/
X#define	JIHAD		7
X#define	WAR		6
X#define	HOSTILE		5
X#define	NEUTRAL		4
X#define	FRIENDLY	3
X#define	ALLIED		2
X#define	CONFEDERACY	1
X#define	UNMET		0
X
X/*army status*/
X#define	MARCH		1	/*March */
X#define	SCOUT		2	/*Scouting--will not engage enemy if possible*/
X#define	ATTACK		3	/*Attack anybody (Hostile+) within 2 sectors*/
X#define	DEFEND		4	/*Defend */
X#define	GARRISON	5	/*Garrison--for a city or Capitol */
X
Xstruct s_sector
X{
X	char	designation;	/*designation of sector*/
X	char	altitude;	/*sector altitude */
X	char	vegetation;	/*sector vegetation	*/
X	short	owner;		/*nation id of owner, MAXNTN+? is SPECIAL*/
X	int	people;		/*civilians in sector*/
X	short	i_people;	/* initial civilians in sector */
X	unsigned char	gold;		/*gold production ability*/
X	unsigned char	fortress;	/*fortification level (0 to 9)*/
X	unsigned char	iron;		/*amount of iron produced by sector*/
X};
X#define	SOWN	sct[xcurs+xoffset][ycurs+yoffset].owner
X#define	XREAL	(xcurs+xoffset)
X#define	YREAL	(ycurs+yoffset)
X
X#define	SCREEN_X_SIZE	( (COLS - 21) / 2 )
X#define	SCREEN_Y_SIZE	( LINES - 5 )
X
X#define	PASSLTH		7	/*one less than the characters in the password*/
X#define	NAMELTH		9	/*one less than the characters in the name*/
X#define	LEADERLTH	9	/*one less than the characters in the leader*/
X
Xstruct navy
X{
X	short warships;
X	short merchant;
X	short xloc;
X	short yloc;
X	short smove;
X	short crew;
X	short armynum;
X};
X
X#define	A_MILITIA	0
X#define	A_GOBLIN	1
X#define	A_ORC		2
X#define	A_INFANTRY	3
X#define	A_SAILOR	4
X#define	A_MARINES	5
X#define	A_ARCHER	6
X#define	A_URUK		7
X#define	A_NINJA		8
X#define	A_PHALANX	9
X#define	A_OLOG		10
X#define	A_LEGION	11
X#define	A_DRAGOON	12
X#define	A_MERCENARY	13
X#define	A_TROLL		14
X#define	A_ELITE		15
X#define	A_LT_CAV	16
X#define	A_CAVALRY	17
X#define	A_CATAPULT	18
X#define	A_SEIGE		19
X#define	A_ROC		20
X#define	A_KNIGHT	21
X#define	A_GRIFFON	22
X#define	A_ELEPHANT	23
X#define	NOUNITTYPES	23	/*number of unit types*/
X
X#define	MINLEADER	124	/* min value of a leader -1*/
X#define	A_LEADER	124
X#define	MAXLEADER	124	/* max value for leader */
X
X#define	MINMONSTER	225	/* min value of a monster -1*/
X#define	SPIRIT		225
X#define	ASSASSIN	226
X#define	DJINNI		227
X#define	GARGOYLE	228
X#define	WRAITH		229
X#define	HERO		230
X#define	CENTAUR		231
X#define	GIANT		232
X#define	SUPERHERO	233
X#define	MUMMY		234
X#define	ELEMENTAL	235
X#define	MINOTAUR	236
X#define	DEMON		237
X#define	BALROG		238
X#define	DRAGON		239
X#define	MAXMONSTER	239
X
Xstruct army
X{
X	short unittyp;
X	short xloc;
X	short yloc;
X	short smove;
X	int sold;
X	short stat;
X};
X
Xstruct	nation		/* player nation stats */
X{
X	char	name[NAMELTH+1];/* name */
X	char	passwd[PASSLTH+1];/* password */
X	char	leader[LEADERLTH+1];/* leader title */
X	char	race;		/* national race (integer--see header.h)*/
X	short	class;		/* national class*/
X	char	location;	/* location variable gfr */
X	char	mark;		/* unique mark for nation*/
X	short	capx;		/* Capitol x coord */
X	short	capy;		/* Capitol y coord */
X	short	active;		/* activity level of nation, not sure if
X				i have used this variable consistently:
X				1 if PC NATION,
X				2+Aggressiveness if NPC,
X				0 if inactive,
X				999 to represents MONSTER (pirate...)*/
X	short	aplus;		/* attack plus of all soldiers*/
X	short	dplus;		/* attack plus of all soldiers*/
X	short	maxmove;	/* maximum movement of soldiers*/
X	short	repro;		/* reproduction rate of nation*/
X	long	score;		/* score */
X	long	tgold;		/* gold in treasury */
X	long	jewels;		/* raw amount of gold in treasury */
X	long	tmil;		/* total military */
X	long	tciv;		/* total civilians */
X	long	tiron;		/* total real iron in nation*/
X	long	tfood;		/* total food in nation*/
X	long	powers;
X	short	spellpts;	/* spell points */
X	short	tsctrs;		/* total number sectors */
X	short	tships;		/* number warships */
X	struct	army arm[MAXARM];
X	struct	navy nvy[MAXNAVY];
X	short	dstatus[MAXNTN+4];	/*diplomatic status*/
X};
X
X#define	ATYPE	ntn[country].arm[armynum].unittyp
X#define	AXLOC	ntn[country].arm[armynum].xloc
X#define	AYLOC	ntn[country].arm[armynum].yloc
X#define	AMOVE	ntn[country].arm[armynum].smove
X#define	ASOLD	ntn[country].arm[armynum].sold
X#define	ASTAT	ntn[country].arm[armynum].stat
X#define	NWAR	ntn[country].nvy[nvynum].warships
X#define	NMER	ntn[country].nvy[nvynum].merchant
X#define	NCREW	ntn[country].nvy[nvynum].crew
X#define	NXLOC	ntn[country].nvy[nvynum].xloc
X#define	NYLOC	ntn[country].nvy[nvynum].yloc
X#define	NMOVE	ntn[country].nvy[nvynum].smove
X
Xextern	struct s_sector	sct[MAPX][MAPY];
Xextern	struct nation	ntn[MAXNTN+4];
Xextern	short	movecost[MAPX][MAPY];
X/*is sector occupied, if MAXNTN+1 2+ armies occupy*/
Xextern	char	occ[ MAPX ][ MAPY ];
X
X#define	AORN		0
X#define	ARMY		1
X#define	NAVY		2
X
X#define	XASTAT		1
X#define	XAMEN		2
X#define	XALOC		4
X#define	XNLOC		5
X#define	XNASHP		6
X#define	XECNAME		8
X#define	XECPAS		9
X#define EDSPL		10
X#define	XSADES		11
X#define	XSACIV		12
X#define	XSIFORT		13
X#define	XNAGOLD		14
X#define	XAMOV		15
X#define	XNMOV		16
X#define	XSAOWN		17
X#define	EDADJ		18
X#define	XNARGOLD	19
X#define	XNAIRON		20
X#define	INCAPLUS	22
X#define	INCDPLUS	23
X#define	CHG_MGK		24
X#define	DESTRY		25
X
X#define	DESTROY fprintf(fexe,"DESTROY \t%d \t%d \t%hd \t0 \t0 \t%s\n",DESTRY,save,country,"null")
X#define	CHGMGK fprintf(fexe,"L_MAGIC \t%d \t%hd \t%ld \t%ld \t0 \t%s\n",CHG_MGK,country,ntn[country].powers,x,"null")
X#define	I_APLUS fprintf(fexe,"INC_APLUS \t%d \t%hd \t0 \t0 \t0 \t%s\n",INCAPLUS,country,"null")
X#define	I_DPLUS fprintf(fexe,"INC_DPLUS \t%d \t%hd \t0 \t0 \t0 \t%s\n",INCDPLUS,country,"null")
X#define	AADJSTAT fprintf(fexe,"A_STAT \t%d \t%hd \t%d \t%d \t0 \t%s\n",XASTAT,country,armynum,ntn[country].arm[armynum].stat,"null")
X#define	AADJMEN	fprintf(fexe,"L_ADJMEN \t%d \t%hd \t%d \t%d \t%d \t%s\n",XAMEN ,country,armynum,ASOLD,ATYPE,"null")
X#define	NADJSHP	fprintf(fexe,"N_ASHP \t%d \t%hd \t%d \t%d \t%d \t%s\n",XNASHP ,country,nvynum,ntn[country].nvy[nvynum].merchant,ntn[country].nvy[nvynum].warships,"null" )
X#define	AADJLOC	fprintf(fexe,"A_LOC \t%d \t%hd \t%d \t%d \t%d \t%s\n",XALOC ,country,armynum,ntn[country].arm[armynum].xloc,ntn[country].arm[armynum].yloc,"null")
X#define	NADJLOC	fprintf(fexe,"N_LOC \t%d \t%hd \t%d \t%d \t%d \t%s\n",XNLOC ,country,nvynum,ntn[country].nvy[nvynum].xloc,ntn[country].nvy[nvynum].yloc ,"null")
X#define	AADJMOV	fprintf(fexe,"A_MOV \t%d \t%hd \t%d \t%d \t0 \t%s\n",XAMOV ,country,armynum,ntn[country].arm[armynum].smove,"null")
X#define	NADJMOV	fprintf(fexe,"N_MOV \t%d \t%hd \t%d \t%d \t0 \t%s\n",XNMOV ,country,nvynum,ntn[country].nvy[nvynum].smove,"null")
X#define	ECHGNAME fprintf(fexe,"E_CNAME \t%d \t%hd \t0 \t0 \t0 \t%s\n",XECNAME ,country,ntn[country].name)
X#define	ECHGPAS	fprintf(fexe,"E_CPAS \t%d \t%hd \t0 \t0 \t0 \t%s\n",XECPAS ,country,crypt(string,SALT))
X#define	SADJDES	fprintf(fexe,"S_ADES \t%d \t%hd \t0 \t%d \t%d \t%c\n",XSADES ,country,xcurs+xoffset,ycurs+yoffset,sct[xcurs+xoffset][ycurs+yoffset].designation)
X#define	SADJDES2	fprintf(fexe,"S_ADES \t%d \t%hd \t0 \t%d \t%d \t%c\n",XSADES ,country,x,y,sct[x][y].designation)
X#define	SADJCIV2	fprintf(fexe,"S_ACIV \t%d \t%hd \t%d \t%d \t%d \t%s\n",XSACIV ,country,sct[i][j].people,i,j,"null")
X#define	SADJCIV	fprintf(fexe,"S_ACIV \t%d \t%hd \t%d \t%d \t%d \t%s\n",XSACIV ,country,sct[xcurs+xoffset][ycurs+yoffset].people,xcurs+xoffset,ycurs+yoffset,"null")
X#define	INCFORT fprintf(fexe,"SIFORT \t%d \t%hd \t0 \t%d \t%d \t%s\n",XSIFORT ,country,xcurs+xoffset,ycurs+yoffset,"null")
X#define	SADJOWN	fprintf(fexe,"S_AOWN \t%d \t%hd \t0 \t%d \t%d \t%s\n",XSAOWN ,country,xcurs+xoffset,ycurs+yoffset,"null")
X#define	EADJDIP	fprintf(fexe,"E_ADJ \t%d \t%hd \t%d \t%d \t0 \t%s\n",EDADJ,country,nation,ntn[country].dstatus[nation],"null")
X#define EDECSPL  fprintf(fexe,"E_SPL \t%d \t%hd \t%d \t%d \t0 \t%s\n",EDSPL,country,s_cost,0,"null")
X
X#define	S_MIL		0		/* position in powers array */
X#define	WARRIOR		0x00000001L
X#define	CAPTAIN		0x00000002L
X#define	WARLORD		0x00000004L
X#define	ARCHER		0x00000008L
X#define	CAVALRY		0x00000010L
X#define	SAPPER		0x00000020L
X#define	ARMOR		0x00000040L
X#define	AVIAN		0x00000080L
X#define	MI_MONST	0x00000100L
X#define	AV_MONST	0x00000200L
X#define	MA_MONST	0x00000400L
X#define	E_MIL		11
X		/*CIVILIAN POWERS */
X#define	S_CIV		11
X#define	SLAVER		0x00000800L
X#define	DERVISH		0x00001000L
X#define	HIDDEN		0x00002000L
X#define	ARCHITECT	0x00004000L
X#define	HEALER		0x00008000L
X#define	MINER		0x00010000L
X#define	BREEDER		0x00020000L
X#define	URBAN		0x00040000L
X#define	STEEL		0x00080000L
X#define	NINJA		0x00100000L
X#define	SAILOR		0x00200000L
X#define	DEMOCRACY	0x00400000L
X#define	ROADS		0x00800000L
X#define	E_CIV		13
X			/* MAGICAL SKILLS */
X#define	S_MGK		24
X#define	THE_VOID	0x01000000L
X#define	KNOWALL		0x02000000L
X#define	DESTROYER	0x04000000L
X#define	VAMPIRE		0x08000000L
X#define	SUMMON		0x10000000L
X#define	WYZARD		0x20000000L
X#define	SORCERER	0x40000000L
X#define	E_MGK		7
X#define	MAXPOWER	31 /* number of powers */
X
X/*my first macro: which will return 1 if the nation has that power*/
X#define	magic(NATION,POWER)	((ntn[NATION].powers&(POWER))!=0)
X
X#define	ONMAP	(x>=0 && y>=0 && x<MAPX && y<MAPY)
X
X#ifndef HILIGHT
X#define	standout()
X#endif
X
X#ifdef BEEP
X#define	beep()		putc('\007',stderr)
X#else
X#define	beep()
X#endif
X
X#ifdef SYSV
X#define	rand()		lrand48()
X#define	srand(x)	srand48(x)
X#else
X#define	rand()		random()
X#define	srand(x)	srandom(x)
X#endif
X
X#define	FOODTHRESH	3
X#define	GOLDTHRESH	10
X#define	JEWELTHRESH	10
X
X#define	SALT "aa"	/* salt for crypt */
X
X
Xextern	char	*ele;
Xextern	char	*elename[];
Xextern	char	*veg;
Xextern	int	vegfood[];
Xextern	char	*vegname[];
Xextern	char	*numbers;
Xextern	char	*Class[];
Xextern	char	*races[];
Xextern	char	*diploname[];
Xextern	char	*soldname[];
Xextern	char	*unittype[];
Xextern	char	*shunittype[];
Xextern	int	unitminsth[];
Xextern	int	u_eniron[];
Xextern	int	u_encost[];
Xextern	int	unitmaint[];
Xextern	char	*des;
Xextern	char	*desname[];
Xextern	char	*pwrname[];
Xextern	long	powers[];
X
X#ifdef ADMIN
Xextern	char	*npcsfile;
Xextern	int	unitattack[];
Xextern	int	unitdefend[];
Xextern	int	unitmove[];
X#endif ADMIN
X
X/*file name definitions */
Xextern	char	*exefile;
Xextern	char	*datafile;
Xextern	char	*msgfile;
Xextern	char	*helpfile;
Xextern	char	*newsfile;
Xextern	char	*isonfile;
X
X#define	abrt() { \
Xfprintf(stderr,"\nSerious Error (File %s, Line %d) - Aborting\n",__FILE__,__LINE__); \
Xexit(FAIL); \
X}
X
X/* extern	everything else */
Xextern	long exenewmgk(), getmagic(), getmagic(), getmgkcost(), score_one();
Xextern	struct s_sector *rand_sector();
X
Xextern	void adjarm(),armymove(),armyrpt(),atkattr(),blowup();
Xextern	void budget(),change(),cheat(),coffmap(),combat(),construct();
Xextern	void defattr(),destroy(),diploscrn(),domagic(),draft(),erupt();
Xextern	void fight(),fill_edge(),flee(),fleetrpt(),hangup(),help();
Xextern	void highlight(),makemap(),makeside(),makeworld(),monster(),moveciv();
Xextern	void mymove(),navalcbt(),newdip(),newdisplay(),newlogin();
Xextern	void newspaper(),npcredes(),offmap(),place(),populate(),prep();
Xextern	void printele(),printnat(),printscore(),printveg(),pr_ntns(),produce();
Xextern	void readdata(),redesignate(),redomil(),reduce(),rmessage(),score();
Xextern	void see(),showscore(),update(),updmove(),verifydata(),verify_ntn();
Xextern	void verify_sct(),wmessage(),writedata(),getdstatus(),exit();
X
Xextern	char	*crypt(),*strcpy(),*strncpy(),*strcat(),*strncat();
X
X#define	HI_OWN		0	/* hilight modes */
X#define	HI_ARMY		1
X#define	HI_NONE		2
X#define	HI_YARM		3
X#define	HI_MOVE		4
X
X#define	DI_VEGE		1	/* display modes */
X#define	DI_DESI		2
X#define	DI_CONT		3
X#define	DI_FOOD		4
X#define	DI_NATI		5
X#define	DI_RACE		6
X#define	DI_MOVE		7
X#define	DI_DEFE		8
X#define	DI_PEOP		9
X#define	DI_GOLD		10
X#define	DI_IRON		11
X
Xextern	struct sprd_sht
X{
X	/* total product at end of turn */
X	long food, gold, jewels, iron;
X	/* revenue this turn */
X	long revfood, revjewels, reviron, revcap, revcity;
X	/* civilians in that type of sector */
X	int ingold, iniron, infarm, incity, incap;
X	int sectors, civilians;
X} spread;
END_OF_data.h
if test 13697 -ne `wc -c <data.h`; then
    echo shar: \"data.h\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f magic.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"magic.c\"
else
echo shar: Extracting \"magic.c\" \(20241 characters\)
sed "s/^X//" >magic.c <<'END_OF_magic.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 new login for a new player*/
X#include "header.h"
X#include "data.h"
X#include <ctype.h>
X
Xextern short country;
Xextern short redraw;
Xextern FILE *fexe;
Xextern FILE *fnews;
X
X/*give player one new magic power in current magic (powers)*/
X/*do nothing if that player has that power or it is not permitted*/
X/*getmagic() returns the value of the power gained, and stores it in power*/
X
Xlong
Xgetmagic(type)
Xint type;
X{
X	long newpower;
X	int start,end;
X	switch(type){
X		case M_MGK:
X			start=S_MGK;
X			end=E_MGK;
X			break;
X		case M_CIV:
X			start=S_CIV;
X			end=E_CIV;
X			break;
X		case M_MIL:
X			start=S_MIL;
X			end=E_MIL;
X			break;
X		default:
X			printf("fatal error in num_powers");
X			abrt();
X	}
X	newpower=powers[start+(rand()%end)];
X	if(newpower==0) {
X		printf("ILLEGAL POWER");
X		abrt();
X	}
X
X	if((newpower==WARRIOR)||(newpower==CAPTAIN)||(newpower==WARLORD)){
X		if(magic(country,WARRIOR)!=TRUE){
X			ntn[country].powers|=WARRIOR;
X			return(WARRIOR);
X		}
X		else if(magic(country,CAPTAIN)!=TRUE){
X			ntn[country].powers|=CAPTAIN;
X			return(CAPTAIN);
X		}
X		else if(magic(country,WARLORD)!=TRUE){
X			ntn[country].powers|=WARLORD;
X			return(WARLORD);
X		}
X		else return(0L);
X	}else if((newpower==MI_MONST) ||(newpower==AV_MONST) ||(newpower==MA_MONST)){
X		if(ntn[country].race!=ORC) return(0L);
X		if(magic(country,MI_MONST)!=TRUE){
X			ntn[country].powers|=MI_MONST;
X			return(MI_MONST);
X		}
X		else if(magic(country,AV_MONST)!=TRUE){
X			ntn[country].powers|=AV_MONST;
X			return(AV_MONST);
X		}
X		else if(magic(country,MA_MONST)==TRUE){
X			ntn[country].powers|=MA_MONST;
X			return(MA_MONST);
X		}
X		else return(0L);
X	}else if(newpower==CAVALRY){
X		if(ntn[country].active >= 2) return(0L);	/*npc nation*/
X		if(magic(country,newpower)==TRUE) return(0L);
X		ntn[country].powers|=newpower;
X		return(newpower);
X	}else if(newpower==URBAN){
X		if(magic(country,BREEDER)==TRUE) return(0L);
X		if(magic(country,newpower)==TRUE) return(0L);
X		ntn[country].powers|=newpower;
X		return(newpower);
X	}else if(newpower==HEALER){
X		if(ntn[country].race==ORC) return(0L);
X		if(magic(country,newpower)==TRUE) return(0L);
X		ntn[country].powers|=newpower;
X		return(newpower);
X	}else if(newpower==KNOWALL){
X#ifdef OGOD
X	     /* only god should have KNOWALL if sectors hidden */
X	     if(country!=0) return(0L);
X#endif
X	     if(magic(country,KNOWALL)==TRUE) return(0L);
X	     ntn[country].powers|=KNOWALL;
X	     return(KNOWALL);
X	}else if((newpower==SLAVER)
X	||(newpower==DERVISH)
X	||(newpower==HIDDEN)
X	||(newpower==ARCHITECT)
X	||(newpower==THE_VOID)
X	||(newpower==ARCHER)){
X		if(magic(country,newpower)==TRUE) return(0L);
X		ntn[country].powers|=newpower;
X		return(newpower);
X	}else if(newpower==DESTROYER){
X		if((ntn[country].race!=ELF)&&(magic(country,DESTROYER)!=TRUE)){
X			ntn[country].powers|=DESTROYER;
X			return(DESTROYER);
X		}
X		return(0L);
X	}else if(newpower==VAMPIRE){
X		if((ntn[country].race!=ELF)&&(magic(country,VAMPIRE)!=TRUE)){
X			ntn[country].powers|=VAMPIRE;
X			return(VAMPIRE);
X		}
X		return(0L);
X	}else if(newpower==MINER){
X		if((ntn[country].race!=ELF)&&(ntn[country].race!=DWARF)&&(magic(country,MINER)!=TRUE)){
X			ntn[country].powers|=MINER;
X			return(MINER);
X		}
X		return(0L);
X	}else if(newpower==STEEL){
X		if(magic(country,STEEL)==TRUE) return(0L);
X		if(magic(country,MINER)!=TRUE) return(0L);
X		ntn[country].powers|=STEEL;
X		return(STEEL);
X	}else if(newpower==BREEDER){
X		if(magic(country,URBAN)==TRUE) return(0L);
X		if(magic(country,BREEDER)==TRUE) return(0L);
X		if(ntn[country].race!=ORC) return(0L);
X		ntn[country].powers|=BREEDER;
X		return(BREEDER);
X	}
X	else if(ntn[country].active >= 2) return(0L);	/*npc nation*/
X	else if((newpower==NINJA)
X	||(newpower==SLAVER)
X	||(newpower==SAILOR)
X	||(newpower==DEMOCRACY)
X	||(newpower==ROADS)
X	||(newpower==SUMMON)
X	||(newpower==WYZARD)
X	||(newpower==SORCERER)
X	||(newpower==SAPPER)
X	||(newpower==ARMOR)
X	||(newpower==AVIAN)){	/* these powers are only for pc's */
X		if(magic(country,newpower)==TRUE) return(0L);
X		ntn[country].powers|=newpower;
X		return(newpower);
X	}
X	else return(0L);
X}
X#ifdef CONQUER
X/*form to interactively get a magic power*/
Xvoid
Xdomagic()
X{
X	int count, done=FALSE, loop=0, i,type;
X	long price,x;
X	short isgod=0;
X	if(country==0) {
X		isgod=1;
X		clear();
X		mvaddstr(0,0,"WHAT NATION NUMBER:");
X		refresh();
X		country = get_number();
X	}
X
X	while(done==FALSE){
X		done=TRUE;
X		clear();
X		count=3;
X		redraw=TRUE;
X		standout();
X		mvprintw(0,(COLS/2)-15,"MAGIC POWERS FOR %s",ntn[country].name);
X		mvprintw(count++,30,"1) %d military powers: %ld jewels",
X			num_powers(country,M_MIL) ,getmgkcost(M_MIL,country));
X		mvprintw(count++,30,"2) %d civilian powers: %ld jewels",
X			num_powers(country,M_CIV) ,getmgkcost(M_CIV,country));
X		mvprintw(count++,30,"3) %d magic powers:    %ld jewels",
X			num_powers(country,M_MGK),getmgkcost(M_MGK,country));
X
X		price =  getmgkcost(M_MIL,country);
X		if(price > getmgkcost(M_CIV,country))
X			price = getmgkcost(M_CIV,country);
X		if(price > getmgkcost(M_MGK,country))
X			price = getmgkcost(M_MGK,country);
X
X		standend();
X		count=3;
X		/*print the powers that you have*/
X		i=0;
X		while( powers[i] != 0 ){
X			if(magic(country,powers[i])==TRUE)
X			mvprintw(count++,0,"you have power %s",*(pwrname+i));
X			i++;
X		}
X
X		if(count<=7) count=8;
X		else count++;
X		standout();
X		mvprintw(count++,0,"YOU HAVE %ld JEWELS IN YOUR TREASURY",ntn[country].jewels);
X		if(price < ntn[country].jewels){
X		mvaddstr(count++,0,"DO YOU WISH TO BUY A RANDOM NEW POWER (enter y or n):");
X		standend();
X		refresh();
X		count++;
X		if(getch()=='y'){
X			done=FALSE;
X			mvprintw(count++,0,"ENTER SELECTION (1,2,3):");
X			refresh();
X			type = get_number();
X			if(type==M_MIL || type==M_CIV || type==M_MGK){
X			price=getmgkcost(type,country);
X#ifdef OGOD
X			if (isgod==TRUE) price=0;
X#endif OGOD
X			if(ntn[country].jewels>=price) {
X				loop = 0;
X				while(loop++ < 500) if((x=getmagic(type))!=0){
X					ntn[country].jewels -= price;
X					CHGMGK;
X					exenewmgk(x);
X					refresh();
X					if (isgod==TRUE) country=0;
X					return;
X				}
X				if (loop >= 500)
X					mvaddstr(count++,0,"You have too many powers! -- hit any key");
X					refresh();
X					getch();
X			} else {
X			mvaddstr(count++,0,"NOT ENOUGH JEWELS TO PURCHASE NEW MAGIC -- hit any key");
X			refresh();
X			getch();
X			}
X			} else {
X			mvaddstr(count++,0,"INVALID SELECTION -- hit any key");
X			refresh();
X			getch();
X			}
X		}
X		} else {
X			mvaddstr(count++,0,"CAN NOT BUY NEW POWER - hit any key");
X			standend();
X			refresh();
X			getch();
X		}
X		if(magic(country,SUMMON)==TRUE)
X			done=dosummon(&count);
X#ifdef ORCTAKE
X		if((ntn[country].race==ORC)&&(ntn[country].jewels>=TAKEPRICE))
X			done=orctake(&count);
X#endif ORCTAKE
X#ifdef OGOD
X		if (isgod==TRUE) {
X			mvaddstr(count++,0,"GOD: REMOVE A MAGIC POWER? (y or n)");
X			refresh();
X			if (getch()=='y') killmagk();
X		}
X#endif OGOD
X	}
X	if(isgod==1) country=0;
X}
X#endif CONQUER
X/*do magic for both npcs and pcs in update*/
X/*if target is 0 then it is update and target will be picked randomly*/
Xint
Xtakeover(percent,target)
Xint percent,target;
X{
X	int loop=1,y,save,isupdate=0;
X	save=country;
X	if(target==country) return(0);
X	if(target==0) isupdate=1;
X	country=target;
X	if(rand()%100<percent){
X		loop=0;
X		y=0;
X		if (target==0) while(loop==0){
X			y++;
X			country=rand()%MAXNTN;
X			if((ntn[country].race==ntn[save].race)
X			&&(ntn[country].active>=2)
X			&&(country!=save)) loop=1;
X			else if(y>=500) {
X				country=save;
X				return(0);
X			}
X		}
X		sct[ntn[country].capx][ntn[country].capy].owner=save;
X		if(isupdate==1){
X		printf("nation %s taken over by %s\n",ntn[country].name,ntn[save].name);
X		fprintf(fnews,"1.\tnation %s taken over by %s\n",ntn[country].name,ntn[save].name);
X		}
X		else {
X			DESTROY;
X			if ((fnews=fopen("/dev/null","w"))==NULL){
X				printf("error opening null file\n");
X				exit(FAIL);
X			}
X		}
X		destroy(country);
X		if(isupdate!=1) fclose(fnews);
X		y=country;
X		country=save;
X		return(y);
X	}
X	country=save;
X	return(0);
X}
X
X/*execute new magic*/
Xlong
Xexenewmgk(newpower)
Xlong newpower;
X{
X	short x,y;
X	if(newpower==WARRIOR) {
X		ntn[country].aplus+=10;
X		ntn[country].dplus+=10;
X		return(0L);
X	}
X	if(newpower==CAPTAIN) {
X		ntn[country].aplus+=10;
X		ntn[country].dplus+=10;
X		return(0L);
X	}
X	if(newpower==WARLORD) {
X		ntn[country].aplus+=10;
X		ntn[country].dplus+=10;
X		return(0L);
X	}
X	if(newpower==HEALER) {
X		if(ntn[country].race==ORC) {
X			printf("ORCS CANT HAVE HEALER POWER\n");
X			abrt();
X		} else if(ntn[country].repro<=8){
X			ntn[country].repro+=2;
X		} else if(ntn[country].repro==9){
X			ntn[country].repro=10;
X			ntn[country].dplus+=5;
X		} else if(ntn[country].repro>=10){
X			ntn[country].dplus+=10;
X		}
X		return(0L);
X	}
X	if(newpower==DESTROYER) {
X		for(x=ntn[country].capx-3;x<=ntn[country].capx+3;x++) {
X			for(y=ntn[country].capy-3;y<=ntn[country].capy+3;y++){
X				if((ONMAP)
X				&&(sct[x][y].altitude!=WATER)
X#ifdef DERVDESG
X				&&((rand()%2)==0)
X#else
X				&&(tofood(sct[x][y].vegetation,0)<DESFOOD)
X#endif DERVDESG
X				&&((x!=ntn[country].capx)
X					||(y!=ntn[country].capy))){
X					sct[x][y].vegetation=DESERT;
X					sct[x][y].designation=DNODESIG;
X				}
X			}
X		}
X		updmove(ntn[country].race,country);
X		return(0L);
X	}
X	if(newpower==DERVISH) {
X		updmove(ntn[country].race,country);
X		return(0L);
X	}
X	if((newpower==MI_MONST)
X	||(newpower==AV_MONST)
X	||(newpower==MA_MONST)
X	||(newpower==KNOWALL)
X	||(newpower==HIDDEN)
X	||(newpower==THE_VOID)
X	||(newpower==ARCHITECT)
X	||(newpower==MINER))
X		return(0L);
X	if(newpower==VAMPIRE) {
X		ntn[country].aplus-=35;
X		ntn[country].dplus-=35;
X		ntn[country].maxmove-=2;
X		return(0L);
X	}
X	if(newpower==URBAN) {
X		if(ntn[country].race==ORC) {
X			x=ntn[country].repro;
X			if(ntn[country].repro>=13){
X				ntn[country].maxmove+=4;
X			}
X			else if(ntn[country].repro>10){
X				ntn[country].maxmove+=2*(x-10);
X				ntn[country].repro=13;
X			}
X			else ntn[country].repro+=3;
X		}
X		else if(ntn[country].repro<=9){
X			ntn[country].repro+=3;
X		}
X		else {
X			ntn[country].maxmove+=2*(ntn[country].repro-9);
X			ntn[country].repro=12;
X		}
X		return(0L);
X	}
X	if(newpower==BREEDER) {
X		ntn[country].repro+=3;
X		ntn[country].dplus-=10;
X		ntn[country].aplus-=10;
X		return(0L);
X	}
X	if(newpower==DEMOCRACY){
X		ntn[country].repro+=1;
X		ntn[country].dplus+=10;
X		ntn[country].aplus+=10;
X		return(0L);
X	}
X	if(newpower==ROADS){
X		ntn[country].maxmove+=4;
X		return(0L);
X	}
X	if(newpower==ARMOR){
X		ntn[country].maxmove-=3;
X		if( ntn[country].maxmove<4) ntn[country].maxmove=4;
X		ntn[country].dplus+=20;
X	}
X	if((newpower==NINJA)
X	||(newpower==STEEL)
X	||(newpower==ARCHER)
X	||(newpower==CAVALRY)
X	||(newpower==SAILOR)
X	||(newpower==SUMMON)
X	||(newpower==WYZARD)
X	||(newpower==SORCERER)
X	||(newpower==SAPPER)
X	||(newpower==AVIAN)){	/* these powers are only for pc's */
X		return(1L);
X	}
X	return(0L);
X}
X#ifdef CONQUER
X/* returns 0 if summon occurred, 1 else */
Xint
Xdosummon(count)
Xint *count;
X{
X	int done=TRUE,x,i,armynum;
X	long e_cost;
X	int newtype,s_cost;
X	if((*count)>20) {
X		(*count)=2;
X		clear();
X	}
X	mvaddstr((*count)++,0,"YOU HAVE SUMMON POWER");
X	mvaddstr((*count)++,0,"DO YOU WISH SUMMON A MONSTER (enter y or n):");
X	refresh();
X	if(getch()=='y'){
X		done=FALSE;
X		x=0;
X		mvaddstr((*count)++,x,"options:");
X		x+=9;
X		for(i=MINMONSTER;i<=MAXMONSTER;i++){
X			if(unitvalid(i)==TRUE) {
X				mvprintw((*count),x+2,"%s",*(shunittype+(i%200)));
X				mvprintw((*count),x,"(%c)",*(shunittype+(i%200))[0]);
X				x+=7;
X				if(x>COLS-20){
X					x=0;
X					(*count)++;
X				}
X			}
X		}
X		(*count)++;
X		mvaddstr((*count)++,0,"what type of unit do you want to raise:");
X		refresh();
X
X		newtype='0';
X		switch(getch()){
X		case 's':
X			newtype=SPIRIT;
X			break;
X		case 'A':
X			newtype=ASSASSIN;
X			break;
X		case 'e':
X			newtype=DJINNI;
X			break;
X		case 'G':
X			newtype=GARGOYLE;
X			break;
X		case 'W':
X			newtype=WRAITH;
X			break;
X		case 'H':
X			newtype=HERO;
X			break;
X		case 'C':
X			newtype=CENTAUR;
X			break;
X		case 'g':
X			newtype=GIANT;
X			break;
X		case 'S':
X			newtype=SUPERHERO;
X			break;
X		case 'M':
X			newtype=MUMMY;
X			break;
X		case 'E':
X			newtype=ELEMENTAL;
X			break;
X		case 'm':
X			newtype=MINOTAUR;
X			break;
X		case 'd':
X			newtype=DEMON;
X			break;
X		case 'B':
X			newtype=BALROG;
X			break;
X		case 'D':
X			newtype=DRAGON;
X			break;
X		default:
X			break;
X		}
X
X		if(unitvalid(newtype)==FALSE) {
X			beep();
X			mvprintw((*count)++,0,"%d INVALID TYPE",newtype);
X			refresh();
X			sleep(2);
X			return(done);
X		}
X
X		e_cost= (long) *(u_encost+(newtype%200)) * *(unitminsth+(newtype%200));
X		s_cost= *(u_encost+(newtype%200));
X		/*check to see if enough spell points*/
X		if(s_cost > ntn[country].spellpts) {
X			mvprintw((*count)++,0,"you dont have %d spell points",s_cost);
X			refresh();
X			sleep(1);
X			return(done);
X		}
X
X		/*check to see if enough gold*/
X		if(e_cost >  ntn[country].tgold) {
X			mvprintw((*count)++,0,"you dont have %ld gold in treasury",e_cost);
X			refresh();
X			sleep(1);
X			return(done);
X		}
X
X		armynum=0;
X		while(armynum<MAXARM) {
X			if(ASOLD<=0) {
X				ASOLD= *(unitminsth+(newtype%200));
X				ATYPE=newtype;
X				ASTAT=DEFEND; /* set new armies to DEFEND */
X				AXLOC=ntn[country].capx;
X				AYLOC=ntn[country].capy;
X				AMOVE=0;
X				AADJLOC;
X				AADJSTAT;
X				AADJMEN;
X				AADJMOV;
X				armynum=MAXARM;
X			} else if(armynum==MAXARM-1) {
X				mvaddstr((*count)++,0,"NO FREE ARMIES");
X				refresh();
X				sleep(2);
X				return(done);
X			} else armynum++;
X		}
X		ntn[country].tgold -= e_cost;
X		ntn[country].spellpts -= s_cost;
X		EDECSPL;
X	}
X	return(done);
X}
X#endif CONQUER
X#ifdef CONQUER
X#ifdef ORCTAKE
X/* orc takeover routine... returns 0 if run, 1 if not */
Xorctake(count)
Xint *count;
X{
X	int chance=0;
X	if((*count)>20) {
X		(*count)=2;
X		clear();
X	}
X	if(magic((*count)ry,MA_MONST)==TRUE) {
X	mvaddstr((*count)++,0,"  You have a 10 percent chance for %ld Jewels take over other orcs",TAKEPRICE);
X	chance=10;
X	} else if(magic((*count)ry,AV_MONST)==TRUE) {
X	mvaddstr((*count)++,0,"  You have a 6 percent chance for %ld Jewels take over other orcs",TAKEPRICE);
X	chance=6;
X	} else if(magic((*count)ry,MI_MONST)==TRUE){
X	mvaddstr((*count)++,0,"  You have a 3 percent chance for %ld Jewels to take over other orcs",TAKEPRICE);
X	chance=3;
X	}
X	if(chance==0) return(1);
X
X	mvprintw((*count)++,0,"DO YOU WISH TO TAKE OVER AN ORC NPC NATION (enter y or n):");
X	refresh();
X	if(getch()=='y'){
X		done=FALSE;
X		mvaddstr((*count)++,0,"  What orc nation (number):");
X		refresh();
X		i=get_number();
X		if(ntn[i].race==ORC){
X			ntn[(*count)ry].jewels-=TAKEPRICE;
X			if((i=takeover(chance,i))==1)
X			mvprintw((*count)++,0," Successful: %d",i);
X		}
X		else mvaddstr((*count)++,0,"  Wrong Race");
X	}
X	return(done);
X}
X#endif ORCTAKE
X#endif CONQUER
X#ifdef CONQUER
X/* unitvalid tells if nation has powers needed to draft unit */
Xint
Xunitvalid(type)
Xint type;
X{
X	int valid=FALSE;
X	switch(type){
X		case GARGOYLE:
X		case A_GOBLIN:
X		case A_ORC:	if(magic(country,MI_MONST)==TRUE) valid=TRUE;
X				break;
X		case A_MARINES: if(magic(country,SAILOR)==TRUE) valid=TRUE;
X				break;
X		case A_ARCHER:	if(magic(country,ARCHER)==TRUE) valid=TRUE;
X				break;
X		case A_URUK:	if(magic(country,AV_MONST)==TRUE) valid=TRUE;
X				break;
X		case A_NINJA:	if(magic(country,NINJA)==TRUE) valid=TRUE;
X				break;
X		case A_PHALANX:	if(magic(country,CAPTAIN)==TRUE) valid=TRUE;
X				break;
X		case A_OLOG:	if((magic(country,BREEDER)==TRUE)
X				&&(magic(country,AV_MONST)==TRUE)) valid=TRUE;
X				break;
X		case A_ELEPHANT:if(magic(country,DERVISH)==TRUE)  valid=TRUE;
X				break;
X		case SUPERHERO:
X		case A_LEGION:	if(magic(country,WARLORD)==TRUE) valid=TRUE;
X				break;
X		case A_DRAGOON:	if(magic(country,CAVALRY)==TRUE) valid=TRUE;
X				break;
X		case A_TROLL:	if(magic(country,MA_MONST)==TRUE) valid=TRUE;
X				break;
X		case A_ELITE:	if(magic(country,STEEL)==TRUE) valid=TRUE;
X				break;
X		case A_LT_CAV:
X		case A_CAVALRY:	if(magic(country,CAVALRY)==TRUE) valid=TRUE;
X				break;
X		case A_KNIGHT:	if((magic(country,ARMOR)==TRUE)
X				&&(magic(country,CAVALRY)==TRUE)) valid=TRUE;
X				break;
X		case A_ROC:
X		case A_GRIFFON: if(magic(country,AVIAN)==TRUE) valid=TRUE;
X				break;
X		case ASSASSIN:	if(magic(country,NINJA)==TRUE) valid=TRUE;
X				break;
X		case DJINNI:	if(magic(country,DERVISH)==TRUE) valid=TRUE;
X				break;
X		case HERO:	if(magic(country,WARRIOR)==TRUE) valid=TRUE;
X				break;
X		case ELEMENTAL:	if(magic(country,SORCERER)==TRUE) valid=TRUE;
X				break;
X		case WRAITH:
X		case MUMMY:	if(magic(country,VAMPIRE)==TRUE) valid=TRUE;
X				break;
X		case MINOTAUR:
X		case DEMON:	if(magic(country,DESTROYER)==TRUE) valid=TRUE;
X				break;
X		case BALROG:	if((magic(country,WYZARD)==TRUE)
X				&&(magic(country,VAMPIRE)==TRUE)) valid=TRUE;
X				break;
X		case DRAGON:	if((magic(country,MA_MONST)==TRUE)
X				&&(magic(country,WYZARD)==TRUE)) valid=TRUE;
X				break;
X		default:	valid=TRUE;	/* for all unrestricted types */
X	}
X	return(valid);
X}
X#endif CONQUER
X
X#ifdef OGOD
X/*remove a magic power*/
Xlong
Xremovemgk(oldpower)
Xlong oldpower;
X{
X	short x,y;
X	if((oldpower==WARRIOR)
X	||(oldpower==CAPTAIN)
X	||(oldpower==WARLORD)) {
X		ntn[country].aplus-=10;
X		ntn[country].dplus-=10;
X		return(0L);
X	}
X	if(oldpower==HEALER) {
X		if(ntn[country].race==ORC) {
X			printf("ORCS CANT HAVE HEALER POWER\n");
X			abrt();
X		} else ntn[country].repro -= 2;
X		return(0L);
X	}
X	if(oldpower==DESTROYER) {
X		for(x=ntn[country].capx-3;x<=ntn[country].capx+3;x++) {
X			for(y=ntn[country].capy-3;y<=ntn[country].capy+3;y++){
X				if((ONMAP)
X				&&(sct[x][y].altitude!=WATER)
X				&&((x!=ntn[country].capx)
X					||(y!=ntn[country].capy))){
X					if (sct[x][y].vegetation==DESERT)
X					{
X						/* LT_VEG has medium value*/
X						sct[x][y].vegetation=LT_VEG;
X						sct[x][y].designation=DNODESIG;
X					}
X				}
X			}
X		}
X		updmove(ntn[country].race,country);
X		return(0L);
X	}
X	if(oldpower==DERVISH) {
X		updmove(ntn[country].race,country);
X		return(0L);
X	}
X	if((oldpower==MI_MONST)
X	||(oldpower==AV_MONST)
X	||(oldpower==MA_MONST)
X	||(oldpower==KNOWALL)
X	||(oldpower==HIDDEN)
X	||(oldpower==THE_VOID)
X	||(oldpower==ARCHITECT)
X	||(oldpower==MINER))
X		return(0L);
X	if(oldpower==VAMPIRE) {
X		ntn[country].aplus+=35;
X		ntn[country].dplus+=35;
X		ntn[country].maxmove+=2;
X		return(0L);
X	}
X	if(oldpower==URBAN) {
X		ntn[country].repro -= 3;
X		return(0L);
X	}
X	if(oldpower==BREEDER) {
X		ntn[country].repro-=3;
X		ntn[country].dplus+=10;
X		ntn[country].aplus+=10;
X		return(0L);
X	}
X	if(oldpower==DEMOCRACY){
X		ntn[country].repro-=1;
X		ntn[country].dplus-=10;
X		ntn[country].aplus-=10;
X		return(0L);
X	}
X	if(oldpower==ROADS){
X		ntn[country].maxmove-=4;
X		return(0L);
X	}
X	if(oldpower==ARMOR){
X		ntn[country].maxmove+=3;
X		ntn[country].dplus-=20;
X	}
X	if((oldpower==NINJA)
X	||(oldpower==STEEL)
X	||(oldpower==ARCHER)
X	||(oldpower==CAVALRY)
X	||(oldpower==SAILOR)
X	||(oldpower==SUMMON)
X	||(oldpower==WYZARD)
X	||(oldpower==SORCERER)
X	||(oldpower==SAPPER)
X	||(oldpower==AVIAN)){	/* these powers are only for pc's */
X		return(1L);
X	}
X	return(0L);
X}
X
X#ifdef CONQUER
X/* killmagk: this routine removes a magic power */
Xkillmagk()
X{
X	int count,choice,i;
X	long holdmagk;
X
X	clear();
X	count=3;
X	standout();
X	mvprintw(0,(COLS/2)-15,"MAGIC POWERS FOR %s",ntn[country].name);
X	standend();
X	i=0;
X	while( powers[i] != 0 ){
X		if(magic(country,powers[i])==TRUE)
X		mvprintw(count,0,"%d: power %s",count-2,*(pwrname+i));
X		count++;
X		i++;
X	}
X	count++;
X	standout();
X	mvaddstr(count++,5," Which power to remove? ");
X	standend();
X	refresh();
X	choice=get_number();
X	if (choice>count-5) choice=0;
X	mvprintw(count++,0," Remove magic #%d? (y or [n])",choice);
X	refresh();
X	if ((getch()=='y')&&(choice!=0)) {
X		i=0;
X		if (magic(country,holdmagk=powers[i])==TRUE) choice--;
X		while(choice) {
X			i++;
X			if (magic(country,holdmagk=powers[i])==TRUE)
X		choice--;
X		}
X		ntn[country].powers ^= holdmagk;
X		removemgk(holdmagk);
X	}
X}
X#endif CONQUER
X#endif OGOD
END_OF_magic.c
if test 20241 -ne `wc -c <magic.c`; then
    echo shar: \"magic.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f main.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"main.c\"
else
echo shar: Extracting \"main.c\" \(19741 characters\)
sed "s/^X//" >main.c <<'END_OF_main.c'
X/*conquer : Copyright (c) 1988 by Ed Barlow.
X *  I spent a long time writing this code & I hope that you respect this.
X *  I give permission to alter the code, but not to copy or redistribute
X *  it without my explicit permission.  If you alter the code,
X *  please document changes and send me a copy, so all can have it.
X *  This code, to the best of my knowledge works well,  but it is my first
X *  'C' program and should be treated as such.  I disclaim any
X *  responsibility for the codes actions (use at your own risk).  I guess
X *  I am saying "Happy gaming", and am trying not to get sued in the process.
X *                                                Ed
X */
X
X/*include files*/
X#include <ctype.h>
X#include "header.h"
X#include "data.h"
X#include <signal.h>
X#include <fcntl.h>
X#include  <pwd.h>
X
Xextern	int armornvy;
X
X/*Declarations*/
Xchar	fison[20];
Xchar	*getpass();
Xstruct	s_sector sct[MAPX][MAPY];
Xstruct	nation ntn[NTOTAL];   /* player nation stats */
X/*is sector occupied by an army?*/
Xchar	occ[MAPX][MAPY];
Xshort	movecost[MAPX][MAPY];
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/*redraw map in this turn if redraw is a 1*/
Xshort	redraw=TRUE;
X/*1 if you have quit*/
Xint done=FALSE;
X/*display state*/
Xshort	hilmode=HI_OWN;
Xshort	dismode=DI_DESI;
Xshort	selector=0;  /*selector (y vbl) for which army/navy... is "picked"*/
Xshort	pager=0;     /*pager for selector 0,1,2,3*/
X/* nation id of owner*/
Xshort	country=0;
Xint owneruid;
X
XFILE *fexe, *fopen();
X
Xint
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	char passwd[20];
X	long time();
X	char string[80];
X	extern char *optarg;
X	char defaultdir[256];
X	struct passwd *getpwnam();
X	int sflag=0;
X
X	owneruid=getuid();
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,"hn:d:s"))!=EOF) switch(i){
X	/* process the command line arguments */
X	case 'h': /* execute help program*/
X		if (chdir(defaultdir)) {
X			printf("unable to change dir to %s\n",defaultdir);
X			exit(FAIL);
X		}
X		initscr();
X		savetty();
X		noecho();
X		crmode();			/* cbreak mode */
X		signal(SIGINT,SIG_IGN);		/* disable keyboard signals */
X		signal(SIGQUIT,SIG_IGN);
X		help();
X		endwin();
X		putchar('\n');
X		exit(SUCCESS);
X	case 'd':
X		strcpy(defaultdir, optarg);
X		break;
X	case 'n':
X		strcpy(name, optarg);
X		break;
X        case 's': /*print the score*/
X		sflag++;
X		break;
X	case '?': /*  print out command line arguments */
X		printf("Command line format: %s [-hs -d DIR -nNAT]\n",argv[0]);
X		printf("\t-n NAT   play as nation NAT\n");
X		printf("\t-h       print help text\n");
X		printf("\t-d DIR   to use play different game\n");
X		printf("\t-s       print scores\n");
X		exit(SUCCESS);
X	};
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
X	/* read data*/
X	readdata();
X	verifydata( __FILE__, __LINE__ );
X
X	if(sflag){
X		printscore();
X		exit(SUCCESS);
X	}
X
X        /*
X         *  Set the real uid to the effective.  This will avoid a
X         *  number of problems involving file protection if the
X         *  executable is setuid.
X         */
X        (void) setuid (geteuid ()) ;
X
X	/* must be a normal interactive game */
X	armornvy=AORN;
X
X	/* identify the player and the country he represents */
X
X	/* get nation name either from command line or by asking
X         *     if you fail will give you the name of administrator of game
X         */
X
X	/* verify existence of nation*/
X	printf("conquer %s: Copyright (c) 1988 by Edward M Barlow\n",VERSION);
X	if (*name == 0) {
X		printf("what nation would you like to be:");
X		scanf("%s",name);
X	}
X#ifdef OGOD
X        if(strcmp(name,"god")==0) {
X		if ( owneruid != (getpwnam(LOGIN))->pw_uid ){
X		printf("sorry -- you can not login as god\n");
X		printf("you need to be logged in as %s\n",LOGIN);
X		exit(FAIL);
X	}
X		strcpy(name,"unowned");
X	}
X#else
X	if(strcmp(name,"god")==0) strcpy(name,"unowned");
X#endif OGOD
X	country=(-1);
X	for(i=0;i<NTOTAL;i++)
X		if(strcmp(name,ntn[i].name)==0) country=i;
X
X	if(country==(-1)) {
X		printf("name not found\n");
X		printf("\nfor rules type <conquer -h>");
X		printf("\nfor more information please contact %s\n",OWNER);
X		return;
X	}
X
X	/*get encrypted password*/
X	strcpy(passwd,crypt(getpass("\nwhat is your nations password:"),SALT));
X	if((strncmp(passwd,ntn[country].passwd,PASSLTH)!=0)
X	&&(strncmp(passwd,ntn[0].passwd,PASSLTH)!=0)) {
X		strcpy(passwd,crypt(getpass("\nerror: reenter your nations password:"),SALT));
X		if((strncmp(passwd,ntn[country].passwd,PASSLTH)!=0)
X		&&(strncmp(passwd,ntn[0].passwd,PASSLTH)!=0)) {
X			printf("\nsorry:");
X			printf("\nfor rules type <conquer -h>");
X			printf("\nfor more information on the system please contact %s\n",OWNER);
X			exit(FAIL);
X		}
X	}
X
X	/* check if user is super-user nation[0] */
X	/*	else setup cursor to capitol*/
X	if(country==0) {
X		printf("welcome super user\n");
X		xcurs=1;
X		xoffset=0;
X		ycurs=1;
X		yoffset=0;
X	} else {
X		printf("\nloading nation %s\n",ntn[country].name);
X		if (ntn[country].active==0) {
X			printf("\nSorry, for some reason, your country no longer exists.");
X			printf("\nIf there is a problem, please contact %s.\n",OWNER);
X			exit(FAIL);
X		}
X		if(aretheyon()==1) {
X			printf("\nSorry, country is already logged in.\n");
X			printf("Please try again later.\n");
X			exit(FAIL);
X		}
X		execute();
X		if(ntn[country].capx>15) {
X			xcurs=15;
X			xoffset= (ntn[country].capx-15);
X		}
X		else {
X			xcurs= ntn[country].capx;
X			xoffset= 0;
X		}
X		if(ntn[country].capy>10) {
X			ycurs=10;
X			yoffset= (ntn[country].capy-10);
X		}
X		else {
X			yoffset= 0;
X			ycurs= ntn[country].capy;
X		}
X	}
X
X	updmove(ntn[country].race,country);
X
X	/* open output for future printing*/
X	{
X	    char filename[80];
X	    sprintf(filename,"%s%d",exefile,country);
X	    if ((fexe=fopen(filename,"a"))==NULL) {
X		    beep();
X		    printf("error opening %s\n",filename);
X		    unlink(fison);
X		    exit(FAIL);
X	    }
X	}
X
X	/* SET UP THE SCREEN */
X	printf("about to set up the screen");
X	initscr();
X	crmode();			/* cbreak mode */
X	signal(SIGINT,SIG_IGN);		/* disable keyboard signals */
X	signal(SIGQUIT,SIG_IGN);
X        signal(SIGHUP,hangup);		/* must catch hangups */
X
X	prep(country);
X	noecho();
X
X	/*main while routine*/
X	done=FALSE;
X	while (done==FALSE)
X	{
X		/* check if cursor is out of bounds*/
X		coffmap();
X		/*get commands, make moves and input command*/
X		parse();
X	}
X
X	if(country==0) writedata();
X	else {
X	fprintf(fexe,"L_NGOLD\t%d \t%d \t%ld \t0 \t0 \t%s\n",
X		XNAGOLD ,country,ntn[country].tgold,"null");
X	fprintf(fexe,"L_NIRON\t%d \t%d \t%ld \t0 \t0 \t%s\n",
X		XNAIRON ,country,ntn[country].tiron,"null");
X	fprintf(fexe,"L_NJWLS\t%d \t%d \t%ld \t0 \t0 \t%s\n",
X		XNARGOLD ,country,ntn[country].jewels,"null");
X	}
X	/*done so quit*/
X	unlink(fison);
X	clear();
X	printw("quitting\n");
X	refresh();
X	nocrmode();
X	endwin();
X	fclose(fexe);
X	exit(SUCCESS);
X}
X
X/*make the bottom of the screen*/
Xint
Xmakebottom()
X{
X	move(LINES-4,0);
X	clrtoeol();
X	mvprintw(LINES-3,0,"Conquer: %s",VERSION);
X	clrtoeol();
X	mvaddstr(LINES-1,0,"  type ? for help");
X	clrtoeol();
X	mvaddstr(LINES-2,0,"  type Q to quit");
X	clrtoeol();
X	if(country==0) mvaddstr(LINES-3,COLS-20,"nation..GOD  ");
X	else {
X		mvprintw(LINES-3,COLS-20,"nation...%s",ntn[country].name);
X		mvprintw(LINES-2,COLS-20,"treasury.%ld",ntn[country].tgold);
X		mvprintw(LINES-1,COLS-20,"score....%ld",ntn[country].score);
X	}
X}
X
X/* parse */
Xint
Xparse()
X{
X	register int i;
X	char name[20];
X	char passwd[12];
X	int ocountry;
X
X	switch(getch()) {
X	case EXT_CMD:	/* extended command */
X	        ext_cmd();
X		break;
X	case '':	/*redraw the screen*/
X		redraw=TRUE;
X		break;
X	case 'a':	/*army report*/
X		redraw=TRUE;
X		armyrpt(0);
X		break;
X	case 'A':	/*adjust army*/
X		adjarm(-1);
X		makebottom();
X		break;
X	case '1':
X	case 'b':	/*move south west*/
X		pager=0;
X		selector=0;
X		xcurs--;
X		ycurs++;
X		break;
X	case 'B':	/*budget*/
X		redraw=TRUE;
X		budget();
X		break;
X	case 'c':	/*change nation stats*/
X		redraw=TRUE;
X		change();
X		break;
X	case 'C':	/*construct*/
X		construct();
X		makebottom();
X		break;
X	case 'd':	/*change display*/
X		newdisplay();
X		break;
X	case 'D':	/*draft*/
X		draft();
X		makebottom();
X		break;
X	case 'f': /*report on ships and load/unload*/
X		redraw=TRUE;
X		fleetrpt();
X		break;
X	case 'F':	/*go to next army*/
X		navygoto();
X		break;
X	case 'g':	/*group report*/
X		redraw=TRUE;
X		armyrpt(1);
X		break;
X	case 'G':	/*go to next army*/
X		armygoto();
X		break;
X	case 'H':	/*scroll west*/
X		pager=0;
X		selector=0;
X		xcurs-=((COLS-22)/4);
X		break;
X	case '4':
X	case 'h':	/*move west*/
X		pager=0;
X		selector=0;
X		xcurs--;
X		break;
X	case 'J':	/*scroll down*/
X		pager=0;
X		selector=0;
X		ycurs+=((SCREEN_Y_SIZE)/2);
X		break;
X	case '2':
X	case 'j':	/*move down*/
X		pager=0;
X		selector=0;
X		ycurs++;
X		break;
X	case '8':
X	case 'k':	/*move up*/
X		pager=0;
X		selector=0;
X		ycurs--;
X		break;
X	case 'K':	/*scroll up*/
X		pager=0;
X		selector=0;
X		ycurs-=((SCREEN_Y_SIZE)/2);
X		break;
X	case '6':
X	case 'l':	/*move east*/
X		pager=0;
X		selector=0;
X		xcurs++;
X		break;
X	case 'L':	/*scroll east*/
X		pager=0;
X		selector=0;
X		xcurs+=((COLS-22)/4);
X		break;
X	case 'm':	/*move selected item to new x,y */
X		mymove();
X		makebottom();
X		prep(country);
X		pager=0;
X		selector=0;
X		break;
X	case 'M':	/*magic*/
X		redraw=TRUE;
X		domagic();
X		break;
X	case '3':
X	case 'n':	/*move south-east*/
X		pager=0;
X		selector=0;
X		ycurs++;
X		xcurs++;
X		break;
X	case 'N':	/*read newspaper */
X		redraw=TRUE;
X		newspaper();
X		break;
X	case 'p':	/*pick*/
X		selector+=2;
X		if(selector>=10) {
X			selector=0;
X			pager+=1;
X		}
X		/*current selected unit is selector/2+5*pager*/
X		if((selector/2)+(pager*5)>=units_in_sector(XREAL,YREAL,country)) {
X			pager=0;
X			selector=0;
X		}
X		break;
X	case 'P':	/*production*/
X		redraw=TRUE;
X		produce();
X		break;
X	case 'Q':	/*quit*/
X	case 'q':	/*quit*/
X		done=TRUE;
X		break;
X	case 'r':	/*redesignate*/
X		redesignate();
X		makemap();
X		makebottom();
X		break;
X		/*list*/
X	case 'R':	/*Read Messages*/
X		redraw=TRUE;
X		rmessage();
X		refresh();
X		break;
X	case 's':	/*score*/
X		redraw=TRUE;
X		showscore();
X		break;
X	case 'S':	/*diplomacy screens*/
X		diploscrn();
X		redraw=TRUE;
X		break;
X	case '9':
X	case 'u':	/*move north-east*/
X		pager=0;
X		selector=0;
X		ycurs--;
X		xcurs++;
X		break;
X    	case 'U':	/* scroll north-east */
X		pager=0;
X		selector=0;
X		xcurs+=((COLS-22)/4);
X		ycurs-=((SCREEN_Y_SIZE)/2);
X		break;
X	case 'W':	/*message*/
X		redraw=TRUE;
X		wmessage();
X		break;
X	case '7':
X	case 'y':	/*move north-west*/
X		pager=0;
X		selector=0;
X		ycurs--;
X		xcurs--;
X		break;
X	case 'Y':	/* scroll north-west */
X		pager=0;
X		selector=0;
X		xcurs-=((COLS-22)/4);
X		ycurs-=((SCREEN_Y_SIZE)/2);
X		break;
X	case 'Z':	/*move civilians up to 2 spaces*/
X		redraw=TRUE;
X		moveciv();
X		break;
X	case 'z':	/*login as new user */
X#ifdef OGOD
X		if (owneruid != (getpwnam(LOGIN))->pw_uid) break;
X#endif
X		clear();
X		redraw=TRUE;
X		if(country != 0) {
X		fprintf(fexe,"L_NGOLD\t%d \t%d \t%ld \t0 \t0 \t%s\n",
X			XNAGOLD ,country,ntn[country].tgold,"null");
X		fprintf(fexe,"L_NIRON\t%d \t%d \t%ld \t0 \t0 \t%s\n",
X			XNAIRON ,country,ntn[country].tiron,"null");
X		fprintf(fexe,"L_NJWLS\t%d \t%d \t%ld \t0 \t0 \t%s\n",
X			XNARGOLD ,country,ntn[country].jewels,"null");
X		} else
X		mvaddstr(0,0,"SUPER-USER: YOUR CHANGES WILL NOT BE SAVED IF YOU DO THIS!!!");
X		standout();
X		mvaddstr(2,0,"change login to : ");
X		standend();
X		refresh();
X		get_nname(name);
X
X		ocountry=country;
X		country=(-1);
X		if(strcmp(name,"god")==0) country=0;
X		else for(i=1;i<NTOTAL;i++)
X			if((strcmp(name,ntn[i].name)==0)&&(ntn[i].active>=1))
X				country=i;
X
X		if(country==(-1)) {
X			errormsg("name not found");
X			country=ocountry;
X			break;
X		}
X		if(country==ocountry){
X			errormsg("same country");
X			break;
X		}
X
X		/*get password*/
X		mvaddstr(2,0,"what is your nations password:");
X		refresh();
X		getstr(passwd);
X		strcpy(name,crypt(passwd,SALT));
X
X		if((strncmp(name,ntn[country].passwd,PASSLTH)!=0)
X		&&(strncmp(name,ntn[0].passwd,PASSLTH)!=0)){
X			errormsg("sorry:  password invalid");
X			country=ocountry;
X			break;
X		}
X		unlink(fison);
X		if(aretheyon()==1) {
X			errormsg("sorry:  country is already logged in.");
X			refresh();
X			country=ocountry;
X			break;
X		}
X
X		fclose(fexe);
X		/* open output for future printing*/
X	 	sprintf(name,"%s%d",exefile,country);
X	 	if ((fexe=fopen(name,"a"))==NULL) {
X			beep();
X			printf("error opening %s\n",name);
X			unlink(fison);
X			exit(FAIL);
X	 	}
X
X		printf("\n");
X		readdata();
X		execute();
X
X		updmove(ntn[country].race,country);
X		/*go to that nations capitol*/
X		if(country!=0) {
X			if(ntn[country].capx>15) {
X				xcurs=15;
X				xoffset= (ntn[country].capx-15);
X			}
X			else {
X				xcurs= ntn[country].capx;
X				xoffset= 0;
X			}
X			if(ntn[country].capy>10) {
X				ycurs=10;
X				yoffset= (ntn[country].capy-10);
X			}
X			else {
X				yoffset= 0;
X				ycurs= ntn[country].capy;
X			}
X		}
X		break;
X	case '?':	/*display help screen*/
X		redraw=TRUE;
X		help();
X		break;
X	default:
X		beep();
X	}
X}
X
Xvoid
Xmakeside()
X{
X	int i;
X	int armbonus=0;
X	int found=0,nvyfnd=0;
X	int enemy;
X	int y;
X	short armynum;
X	short nvynum;
X	int count;
X	int nfound=0;
X	register struct s_sector	*sptr = &sct[XREAL][YREAL];
X
X	/*clear side if you cant see it as you are out of bounds*/
X	if(inch()==' ') {
X		for(i=0;i<LINES-3;i++){
X			move(i,COLS-21);
X			clrtoeol();
X		}
X		return;
X	}
X
X	/*clear top right hand side each new sector*/
X	for(count=0;count<11;count++){
X		move(count,COLS-21);
X		clrtoeol();
X	}
X
X	/*check for your armies*/
X	count=units_in_sector(XREAL,YREAL,country);
X	if(pager*5>count) pager=0;
X
X	/*first army found is #0*/
X	/*show armies / navies in range pager*5 to pager*5 + 4*/
X	/*so if pager=0 show 0 to 4, pager=2 show 10 to 14*/
X	/*current selected unit is selector/2+5*pager*/
X
X	if(count>(5+(pager*5))) mvaddstr(10,COLS-20,"MORE...");
X
X	nfound=0;
X	for(armynum=0;armynum<MAXARM;armynum++){
X		if((ASOLD>0)&&(AXLOC==XREAL)&&(AYLOC==YREAL)) {
X			if((nfound>=pager*5)&&(nfound<=4+(pager*5))) {
X				/*print that army to nfound%5*/
X				mvaddch((nfound%5)*2,COLS-21,'>');
X				if(selector==(nfound%5)*2) standout();
X				/*the mv,for gets the highlighting pretty*/
X				move((nfound%5)*2,COLS-10);
X				for(i=0;i<9;i++) addch(' ');
X
X				mvprintw((nfound%5)*2,COLS-20,"army %d: %d (%s)",armynum,ASOLD,*(shunittype+(ATYPE%100)));
X				/*the mv,for gets the highlighting pretty*/
X				move((nfound%5)*2+1,COLS-10);
X				for(i=0;i<9;i++) addch(' ');
X
X				mvprintw((nfound%5)*2+1,COLS-20," mv:%d st:%s",AMOVE,*(soldname+ASTAT));
X				standend();
X			}
X			nfound++;
X		}
X		if((occ[XREAL][YREAL]!=0)
X		&&(occ[XREAL][YREAL]!=country)
X		&&((sptr->owner==country)||((ASOLD>0)&&(AXLOC<=XREAL+1)
X		&&(AXLOC>=XREAL-1)&&(AYLOC<=YREAL+1)&&(AYLOC>=YREAL-1))))
X			found=1;
X	}
X
X	if(nfound<4+(pager*5)) for(nvynum=0;nvynum<MAXNAVY;nvynum++){
X		if(((NWAR+NMER)!=0)&&(NXLOC==XREAL)&&(NYLOC==YREAL)) {
X			if((nfound>=pager*5)&&(nfound<=4+(pager*5))) {
X				/*print a navy*/
X				mvaddch((nfound%5)*2,COLS-21,'>');
X				if(selector==(nfound%5)*2) standout();
X				mvprintw((nfound%5)*2,COLS-20,"navy %d: move %d",nvynum,NMOVE);
X				mvprintw((nfound%5)*2+1,COLS-20," war:%d mer:%d",NWAR,NMER);
X				standend();
X			}
X			nfound++;
X		}
X		if((occ[XREAL][YREAL]!=0)&&(occ[XREAL][YREAL]!=country)
X		&&(sptr->altitude==WATER)
X		&&(NWAR+NMER>0)&&(NXLOC<=XREAL+1)&&(NXLOC>=XREAL-1)
X		&&(NYLOC<=YREAL+1)&&(NYLOC>=YREAL-1))
X			nvyfnd=1;
X	}
X
X	count=0;
X	if(found==1) for(i=0;i<NTOTAL;i++) {
X		if( !magic(i,HIDDEN) || country == 0 ){
X			enemy=0;
X			for(armynum=0;armynum<MAXARM;armynum++){
X				if((i!=country)
X				&&(ntn[i].arm[armynum].xloc==XREAL)
X				&&(ntn[i].arm[armynum].yloc==YREAL)
X				&&(ntn[i].arm[armynum].sold>0))
X				enemy+=ntn[i].arm[armynum].sold;
X			}
X			if(enemy>0) {
X				if((magic(country,NINJA)==1) || country == 0 )
X					mvprintw(nfound*2+count,COLS-20,"%s: %d men  ",ntn[i].name,enemy);
X				else if(magic(i,THE_VOID)==1){
X				mvprintw(nfound*2+count,COLS-20,"%s: ?? men  ",ntn[i].name);
X				clrtoeol();
X				}
X				else mvprintw(nfound*2+count,COLS-20,"%s: %d men  ",ntn[i].name,(enemy*(rand()%60+70)/100));
X				count++;
X			}
X		}
X	}
X	if(nvyfnd==1) for(i=0;i<NTOTAL;i++) {
X		if( magic(i,HIDDEN)!=1 || country == 0 )
X		for(nvynum=0;nvynum<MAXNAVY;nvynum++)
X		if((ntn[i].arm[nvynum].xloc==XREAL)
X		&&(ntn[i].arm[nvynum].yloc==YREAL)
X		&&(ntn[i].arm[nvynum].sold>0)){
X			if((magic(country,NINJA)==1) || country == 0 ){
X				mvprintw(nfound*2+count,COLS-20,"%s: %d ships  ",
X				ntn[i].name,ntn[i].nvy[nvynum].warships+ntn[i].nvy[nvynum].merchant);
X			}
X			else if(magic(i,THE_VOID)==1){
X			mvprintw(nfound*2+count,COLS-20,"%s: ?? ships",ntn[i].name);
X			clrtoeol();
X			}
X			else mvprintw(nfound*2+count,COLS-20,"%s: %d ships  ",
X			ntn[i].name,(ntn[i].nvy[nvynum].warships+ntn[i].nvy[nvynum].merchant)*(rand()%6+7)/10);
X			count++;
X		}
X	}
X
X	standend();
X	mvprintw(11,COLS-20,"x is %d  ",XREAL);
X	mvprintw(11,COLS-11,"y is %d  ",YREAL);
X
X	if((country!=0)&&(sptr->altitude==WATER)){
X		for(y=12;y<=20;y++) mvaddstr(y,COLS-20,"                    ");
X		mvaddstr(14,COLS-9,"WATER");
X	}
X	else {
X	if((country!=0)&&(country!=sptr->owner)
X	&&(magic(sptr->owner,THE_VOID)==1)){
X		for(y=13;y<=20;y++) mvaddstr(y,COLS-20,"                    ");
X	}
X	else {
X
X		for(y=13;y<=14;y++) mvaddstr(y,COLS-20,"                    ");
X
X		for(i=0;i<=7;i++)
X			if(sptr->designation==*(des+i)){
X			mvprintw(13,COLS-20,"%s",*(desname+i));
X			clrtoeol();
X			}
X
X		if((sptr->owner==country)||(country==0))
X		mvprintw(15,COLS-20,"people: %6d",sptr->people);
X		else
X		mvprintw(15,COLS-20,"people: %6d",sptr->people*(rand()%60+70)/100);
X
X		if((sptr->owner==country)
X		||(sptr->owner==0)
X		||(sptr->owner>=MAXNTN)){
X			mvprintw(17,COLS-20,"gold is:   %3d",sptr->gold);
X			mvprintw(18,COLS-20,"iron is:   %3d",sptr->iron);
X			if(sptr->fortress == 0) {
X			mvaddstr(19,COLS-20,"               ");
X			} else {
X			if(sptr->designation==DCASTLE)
X				armbonus=5 * sptr->fortress;
X			else
X			if(sptr->designation==DCITY){
X				if(magic(country,ARCHITECT)==1){
X				armbonus+=10+16 * sptr->fortress;
X				}
X				else armbonus+=10+8 * sptr->fortress;
X			}
X			else if(sptr->designation==DCAPITOL){
X				if(magic(country,ARCHITECT)==1){
X				armbonus+=20+20 * sptr->fortress;
X				}
X				else armbonus+=20+10 * sptr->fortress;
X			}
X			if(armbonus>0)
X			mvprintw(19,COLS-20,"fortress: +%2d%%",armbonus);
X			}
X		}
X		else {
X		for(y=17;y<=19;y++) mvaddstr(y,COLS-20,"                    ");
X		}
X	}
X
X	standout();
X	if(sptr->owner==0) mvaddstr(12,COLS-20,"unowned");
X	else mvprintw(12,COLS-20,"owner: %s",ntn[sptr->owner].name);
X	standend();
X	clrtoeol();
X
X	for(i=0;i<=10;i++)
X		if(sptr->vegetation==*(veg+i))
X		mvprintw(13,COLS-9,"%s",*(vegname+i));
X
X	if(tofood(sptr->vegetation,country) != 0)
X		mvprintw(13,COLS-1,"%d",tofood(sptr->vegetation,country));
X
X	if(sptr->owner!=0) for(i=1;i<=8;i++)
X		if(ntn[sptr->owner].race==*(races+i)[0]){
X		mvprintw(14,COLS-20,"%s",*(races+i));
X		clrtoeol();
X		}
X
X	for(i=0;(*(ele+i) != '0');i++)
X		if( sptr->altitude == *(ele+i) ){
X			mvprintw(14,COLS-9,"%s",*(elename+i));
X			break;
X		}
X	}
X
X	if(movecost[XREAL][YREAL]<0)
X	mvaddstr(16,COLS-20,"YOU CAN'T ENTER HERE");
X	else
X	mvprintw(16,COLS-20,"move cost:  %2d      ",movecost[XREAL][YREAL]);
X}
X
X/* returns 1 if they are on, else 0 */
Xint
Xaretheyon()
X{
X	FILE *fon;
X	/* set up a detection feature for when a country */
X	/* is logged on... to prevent multiple logins    */
X	sprintf(fison,"%s%d",isonfile,country);
X	if((fon=fopen(fison,"r"))==NULL) {
X		fon=fopen(fison,"w");
X		fprintf(fon,"Arg!");
X		fclose(fon);
X		return(0);
X	} else {
X		return(1);
X	}
X}
END_OF_main.c
if test 19741 -ne `wc -c <main.c`; then
    echo shar: \"main.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 6 \(of 8\).
cp /dev/null ark6isdone
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