[comp.sources.games.bugs] Conquer Version 4 Patch Level 9

adb@cs.bu.edu (Adam Bryant) (03/04/90)

Here is the latest and hopefully last patch to conquer version 4.
[But, hey, didn't I say that with patch number 8?]

Anyway, don't have to much time to say much about it, but in summary:

  - this patch enhances god powers and fixes a number of errors
    in god routines.
  - this patch takes care of a number of bug fixes, most especially
    the grouped troops bug.
  - this patch fixes a number of bugs with the trading code thanks
    to Charles C. Fu.
  - I believe that this is a much cleaner version than any of the
    proceeding ones... and the feel seems a bit better as well.

Enjoy,

adam
----------------------------cut-here------------------------------------
*** opatchlevel.h	Sat Mar  3 15:27:42 1990
--- patchlevel.h	Sat Mar  3 15:27:52 1990
***************
*** 1 ****
! #define PATCHLEVEL	8
--- 1 ----
! #define PATCHLEVEL	9
*** onotes.v4	Sat Mar  3 15:27:42 1990
--- notes.v4	Sat Mar  3 15:27:52 1990
***************
*** 314,319 ****
--- 314,383 ----
  	defend mode this way; even when they had marched too far).
  255. allow recombination of troops with same status and same type
  	unless the type is TRADED or ON_BOARD.
+ ===4.0 patch number eight released => 4.8 ===============================
+ 256. made sure that minor leaders lived before becoming major leaders.
+ 257. fixed major bug on not resetting status of moved grouped unit.
+ 258. set a grouped movement to be equal to the movement of the leader.
+ 259. added missing return to commands.c (1341) [Paul Waterman]
+ 260. made sure only to ask for splitting warships when warships are there.
+ 261. no longer ask to split ships that are not in fleet.
+ 262. allow god to manipulate a fleet up for trade.
+ 263. fixed bug that -1 population may accidently be set by god.
+ 264. fixed bug that caused missetting of gold/jewel value by god.
+ 265. allow god to manipulate an army that is up for trade.
+ 266. added check to assure that navies do not carry invalid troops.
+ 267. added check for onboard armies to be sure they were actually on fleets.
+ 268. reformated the bottom of the display on the read message display.
+ 269. made sure that stones had the designation of '?' to allow them to work.
+ 270. increased reduction on movement in desert for DERVISH to avoid confusion.
+ 271. made sure that blank input would not be taken on redesignate owner.
+ 272. fiddled and diddled (sorry Johnny!) with the charity change check.
+ 273. fixed bug with providing movement to unmovable when having ROADS power.
+ 274. added ifdef's around srand declarations for ANSI compilers. [C. Fu]
+ 275. removed error message for people relocation.  too common an occurance.
+ 276. allow naval battles along shore. [Charles C. Fu]
+ 277. prevent sailors or marines from retreating. [Charles C. Fu]
+ 278. redid the retreat code... made the test much simpler.
+ 279. slight adjustment to ONMAP macro [Charles C. Fu]
+ 280. keep random value of army sizes the same for when seen. [Charles C. Fu]
+ 281. keep random value of ship sizes the same when seen. [Charles C. Fu]
+ 282. keep random value of people in sector the same. [Charles C. Fu]
+ 283. do not allow navies to pass into impassible land [partial fix: C. Fu]
+ 284. make it harder to unload armies in enemy cities [Charles C. Fu]
+ 285. make it harder to load armies in enemy cities [Charles C. Fu]
+ 286. fixed mistype "P_ASOLD" => "P_ATYPE" npc.c [Charles C. Fu]
+ 287. check for division by zero with metals cost for troops
+ 288. make NPC pay metal for troops. [Charles C. Fu]
+ 289. have NPC nations adjust tax rates as appropriate. [Charles C. Fu]
+ 290. give rebel nations a tax rate of 10. [Charles C. Fu]
+ 291. extend view of tradeing list for long screens [Charles C. Fu]
+ 292. refresh() added to end of trade input routine  [Charles C. Fu]
+ 293. do not process invalid country is takeback [Charles C. Fu]
+ 294. cause trade to fail for destroyed army or fleet. [Charles C. Fu]
+ 295. fixed mistype which prevented sale of land. [Charles C. Fu]
+ 	{Darn!, My sabotage was caught! :-) adam}
+ 296. fixed missetting of curntn which blocked ship trades [Charles C. Fu]
+ 	{Foiled Again! :-) Actually that code predated curntn use, so
+ 	we were bound to miss some in the conversion, adam}
+ 297. fixed bug with returning bids to losing nations [Charles C. Fu]
+ 298. let land trades fail during trade, not before [Charles C. Fu] (whatever)
+ 299. convert to doubles for calculation of treasury overflow. [C. Fu]
+ 300. relocated adjustment to MARCHer movment when changing statuses.
+ 301. added in a routine to give the items up for trade to a nation if
+ 	it captures a nations capitol.  [David Soleno]
+ 302. fixed error messages generated by the orc takeover routine.
+ 303. made the rules file be read in from the default directory.
+ 304. made spell point gain for MONST powers additive.
+ 305. put a 25% cap on user defined charity.
+ 306. adjusted the combat routine to separate naval and army combat checks.
+ 307. added in a check to assure that combining overlarge fleets is checked.
+ 308. verified input checks in various locations in report.c.
+ 309. made god adjustment of ships to allow keeping of previous values on '\n'.
+ 310. gave god the ability to adjust army unit types.
+ 311. gave god the ability to adjust army move values.
+ 312. gave god the ability to adjust navy move values.
+ 313. fixed bug in reporting side during newspaper for naval battles.
+ 314. gave god the ability to adjust an army status.
  
  -------------------------------------------------------------------------
  | 2.0 POSSIBLE SHORT-TERM ENHANCEMENTS/FIXES FOR CONQUER V5             |
*** oREADME	Sat Mar  3 15:27:38 1990
--- README	Sat Mar  3 15:27:53 1990
***************
*** 94,99 ****
--- 94,106 ----
  	unreferenced symbol errors occur,  try adding "-ltermcap" after
  	the "-lcurses" line in the makefile.
  
+ Note2: With some versions of 'make' the SHELL environment variable is
+ 	read to determine under what shell jobs should be spawned.  The
+ 	Makefile for conquer was written with '/bin/sh' in mind, so if
+ 	any "command not found" errors appear, doing a:
+ 		setenv SHELL /bin/sh
+ 	before typing 'make', might alleviate the problem.
+ 
  -----------------------------------------------------------
  V   administration instructions
  -----------------------------------------------------------
***************
*** 109,115 ****
  		-a          add new player
  		-x          execute program
  		-d DIR      to use play different game
- 		-p          print a map
  		-r SCENARIO read map while making a new world
  			    uses SCENARIO.ele, SCENARIO.veg, &  SCENARIO.nat
  
--- 116,121 ----
*** odata.h	Sat Mar  3 15:27:39 1990
--- data.h	Sat Mar  3 15:27:53 1990
***************
*** 581,587 ****
  
  /* magic macro: returns TRUE if the nation has that power*/
  #define	magic(NATION,POWER)	((ntn[NATION].powers&(POWER))!=0)
! #define	ONMAP(x,y)	(x>=0 && y>=0 && x<MAPX && y<MAPY)
  
  #ifndef HILIGHT
  #define	standout()
--- 581,587 ----
  
  /* magic macro: returns TRUE if the nation has that power*/
  #define	magic(NATION,POWER)	((ntn[NATION].powers&(POWER))!=0)
! #define	ONMAP(x,y)	((x)>=0 && (y)>=0 && (x)<MAPX && (y)<MAPY)
  
  #ifndef HILIGHT
  #define	standout()
***************
*** 610,616 ****
  #define	check()	checkout(__FILE__,__LINE__)
  #endif DEBUG
  
! #define	GOLDTHRESH	10	/* min ratio of gold:jewels */
  
  #define	SALT "aa"		/* seed for crypt() encryption	*/
  
--- 610,616 ----
  #define	check()	checkout(__FILE__,__LINE__)
  #endif DEBUG
  
! #define	GOLDTHRESH	10L	/* min ratio of gold:jewels */
  
  #define	SALT "aa"		/* seed for crypt() encryption	*/
  
*** oadmin.c	Sat Mar  3 15:27:39 1990
--- admin.c	Sat Mar  3 15:27:53 1990
***************
*** 53,59 ****
--- 53,61 ----
  	int geteuid(), getuid(), setuid(), realuser, l;
  	register int i,j;
  	char *name;
+ #ifndef __STDC__
  	void srand();
+ #endif
  	int getopt();
  	long time();
  	/* mflag = make world, a=add player, x=execute, p=print */
*** oextcmds.c	Sat Mar  3 15:27:40 1990
--- extcmds.c	Sat Mar  3 15:27:54 1990
***************
*** 178,192 ****
  		errormsg("Uh, sir.  Aren't we doing that already?");
  		return;
  	}
- 	/* eliminate half starting movement if start out on march */
- 	if( P_ASTAT==MARCH && new_stat!=MARCH ) {
- 		if(P_AMOVE<(curntn->maxmove * *(unitmove+(P_ATYPE%UTYPE)))/50){
- 			errormsg("That troop has gone too far to stop marching");
- 			return;
- 		}
- 		P_AMOVE-=(curntn->maxmove * *(unitmove+(P_ATYPE%UTYPE)))/50;
- 		AADJMOV;
- 	}
  	if(new_stat == SCOUT) {
  		if(( P_ATYPE != A_SCOUT )&&( P_ASOLD >= 25)) {
  			errormsg("Need less than 25 men to scout");
--- 178,183 ----
***************
*** 232,237 ****
--- 223,238 ----
  			errormsg("Sorry, but you can't rule in that sector");
  			return;
  		}
+ 	}
+ 
+ 	/* eliminate half starting movement if start out on march */
+ 	if( P_ASTAT==MARCH && new_stat!=MARCH ) {
+ 		if(P_AMOVE<(curntn->maxmove * *(unitmove+(P_ATYPE%UTYPE)))/50){
+ 			errormsg("That troop has gone too far to stop marching");
+ 			return;
+ 		}
+ 		P_AMOVE-=(curntn->maxmove * *(unitmove+(P_ATYPE%UTYPE)))/50;
+ 		AADJMOV;
  	}
  
  	/* location dependent statuses make armies stay in place */
*** orandeven.c	Sat Mar  3 15:27:43 1990
--- randeven.c	Sat Mar  3 15:27:54 1990
***************
*** 207,212 ****
--- 207,213 ----
  	ntn[new].powers= ntn[target].powers;
  	ntn[new].tships= 0;
  	ntn[new].tsctrs = split;
+ 	ntn[new].tax_rate = 10;
  
  	/* first check first letter of name */
  	if( markok(toupper(ntn[new].name[0]),FALSE) )
*** ocexecute.c	Sat Mar  3 15:27:39 1990
--- cexecute.c	Sat Mar  3 15:27:55 1990
***************
*** 197,203 ****
  			back into your capitol */
  			if((sct[x][y].owner!=country)&&(country!=0)) {
  				sct[curntn->capx][curntn->capy].people+=armynum;
- 				fprintf(stderr,"ERROR: <%s> told to put %d civilians in sector %d,%d not owned - placed in capitol\n",curntn->name,armynum,x,y);
  				break;
  			}
  			sct[x][y].people=armynum;
--- 197,202 ----
***************
*** 206,212 ****
  			/* if you dont own it, put people in your capitol */
  			if((sct[x][y].owner!=country)&&(country!=0)) {
  				sct[curntn->capx][curntn->capy].people+=armynum;
- 				fprintf(stderr,"SACIV3: <%s> told to put %d civilians in sector %d,%d not owned - placed in capitol\n",curntn->name,armynum,x,y);
  			}
  			else
  			{
--- 205,210 ----
***************
*** 258,264 ****
  		case DESTRY:
  			sct[ntn[armynum].capx][ntn[armynum].capy].owner=savectry;
  			country=armynum;
! 			destroy(country);
  			country=savectry;
  			break;
  		case CHG_MGK:
--- 256,262 ----
  		case DESTRY:
  			sct[ntn[armynum].capx][ntn[armynum].capy].owner=savectry;
  			country=armynum;
! 			if (isupdate) destroy(country);
  			country=savectry;
  			break;
  		case CHG_MGK:
*** oforms.c	Sat Mar  3 15:27:40 1990
--- forms.c	Sat Mar  3 15:27:55 1990
***************
*** 579,595 ****
  		intval = get_number();
  		if (intval < 0) {
  			break;
! 		} else if( intval > 100 )
  			errormsg("ERROR - invalid charity rate");
  		/* this will protect from both underflow and overflow */
! 		else if((int)curntn->popularity + 2*(intval - (int)curntn->charity)>100)
! 			errormsg("ERROR - you may not increase charity that much");
! 		else if((int)curntn->popularity + 2*(intval - (int)curntn->charity)<0)
! 			errormsg("ERROR - you may not decrease charity that much");
! 		else {
! 			curntn->popularity += (unsigned char) 2*(intval - (int) curntn->charity);
! 			curntn->charity = intval;
! 			NADJNTN;
  		}
  		break;
  	case '5':	/* terror */
--- 579,607 ----
  		intval = get_number();
  		if (intval < 0) {
  			break;
! 		} else if( intval > 100 ) {
  			errormsg("ERROR - invalid charity rate");
+ 		} else if (intval > 25) {
+ 			errormsg("You are kidding, right?");
  		/* this will protect from both underflow and overflow */
! 		} else if(intval > curntn->charity) {
! 			if (2 * (intval - (int)curntn->charity) + (int) curntn->popularity > 100) {
! 				errormsg("ERROR - you may not increase charity that much");
! 			} else {
! 				curntn->popularity += (unsigned char) 2*(intval - (int) curntn->charity);
! 				curntn->charity = intval;
! 				NADJNTN;
! 				NADJNTN2;
! 			}
! 		} else {
! 			if (2 * (intval - (int)curntn->charity) < - (int) curntn->popularity) {
! 				errormsg("ERROR - you may not decrease charity that much");
! 			} else {
! 				curntn->popularity += (unsigned char) 2*(intval - (int) curntn->charity);
! 				curntn->charity = intval;
! 				NADJNTN;
! 				NADJNTN2;
! 			}
  		}
  		break;
  	case '5':	/* terror */
*** omisc.c	Sat Mar  3 15:27:41 1990
--- misc.c	Sat Mar  3 15:27:55 1990
***************
*** 886,891 ****
--- 886,894 ----
  	/* advertise */
  	fprintf(fnews,"1.\tCapitol of %s sacked by %s\n",ntn[cntry].name,ntn[nation].name);
  
+         /* Remove goods from trade board */
+ 	fixtrade(cntry);
+ 
  	/* first give all prizes to the conquerer */
  	if(curntn->tgold > 0) {			/* all gold */
  		ntn[nation].tgold += curntn->tgold;
***************
*** 1088,1096 ****
  		} /* switch */
  	} /* for */
  
! 	if((magic(cntry,DERVISH)==1) ||(magic(cntry,DESTROYER)==1)) {
! 		veg_cost[ ICE ] = 1;
! 		veg_cost[ DESERT ] = 1;
  	}
  
  	for( j = 0; ele[j] != '0'; j++ ) {
--- 1091,1099 ----
  		} /* switch */
  	} /* for */
  
! 	if(magic(cntry,DERVISH) || magic(cntry,DESTROYER)) {
! 		veg_cost[ ICE ] = 0;
! 		veg_cost[ DESERT ] = 0;
  	}
  
  	for( j = 0; ele[j] != '0'; j++ ) {
*** oreports.c	Sat Mar  3 15:27:43 1990
--- reports.c	Sat Mar  3 15:27:55 1990
***************
*** 143,149 ****
  				continue;
  			}
  #ifdef TRADE
! 			if(P_ASTAT==TRADED) {
  				errormsg("May not change traded army");
  				continue;
  			}
--- 143,149 ----
  				continue;
  			}
  #ifdef TRADE
! 			if(isgod==FALSE && P_ASTAT==TRADED) {
  				errormsg("May not change traded army");
  				continue;
  			}
***************
*** 154,160 ****
  			ypos++;
  			clrtoeol();
  #ifdef OGOD
! 			if(isgod==TRUE) mvaddstr(ypos++,0,"GOD OPTIONS: 6) LOCATION 7) SOLDIERS");
  			clrtoeol();
  #endif OGOD
  			ypos++;
--- 154,160 ----
  			ypos++;
  			clrtoeol();
  #ifdef OGOD
! 			if(isgod==TRUE) mvaddstr(ypos++,0,"GOD OPTIONS: 6) LOCATION 7) SOLDIERS 8) MOVE 9) UNITTYPE 0) STATUS ");
  			clrtoeol();
  #endif OGOD
  			ypos++;
***************
*** 272,283 ****
  					mvaddstr(ypos++,0,"What is the New Total Soldiers: ");
  					refresh();
  					men = get_number();
! 					if (men>0) {
  						P_ASOLD=men;
  						AADJMEN;
  					}
  				}
  				break;
  #endif OGOD
  			default:
  				errormsg("Invalid Input");
--- 272,328 ----
  					mvaddstr(ypos++,0,"What is the New Total Soldiers: ");
  					refresh();
  					men = get_number();
! 					if (men>=0) {
  						P_ASOLD=men;
  						AADJMEN;
  					}
  				}
  				break;
+ 			case '8':
+ 				if (isgod == TRUE) {
+ 					mvaddstr(ypos, 0, "What is the new movement value?");
+ 					refresh();
+ 					men = get_number();
+ 
+ 					if (men >=0 && men <= 100) {
+ 						P_AMOVE = men;
+ 					}
+ 				}
+ 				break;
+ 			case '9':
+ 				if (isgod == TRUE) {
+ 					mvaddstr(ypos++, 0, "Change unit type; Normal 0-26, Leader 27-44, Monster 45-59");
+ 					mvaddstr(ypos++, 0, "[MajorHackEH?] New Type is? ");
+ 					refresh();
+ 					men = get_number();
+ 
+ 					if (men < 0 || men > MAXMONSTER) break;
+ 					if (men > 44) men += TWOUTYPE;
+ 					else if (men > NOUNITTYPES) men += UTYPE;
+ 					
+ 					P_ATYPE = men;
+ 				}
+ 				break;
+ 			case '0':
+ 				if (isgod == TRUE) {
+ 					mvprintw(ypos++, 0, "1) Mar 2) Sct 3) Garr 4) Trade 5) Mil 6) Fly 7) Def 8) MDef 9) Att 10) MAtt");
+ 					mvprintw(ypos++, 0, "11) Genrl 12) Sort 13) Sieg 14) Sgd 15) Onb 16) Rule 17+) Group (leader-=17)");
+ 					mvaddstr(ypos++, 0, "Set what status? ");
+ 					refresh();
+ 					men = get_number();
+ 
+ 					if (men < 0 || men > NUMSTATUS+MAXARM)
+ 					  break;
+ 					if (men >= NUMSTATUS) {
+ 					  i = curntn->arm[men-NUMSTATUS].unittyp;
+ 					  if (i < MINLEADER || i >= MINMONSTER) {
+ 					    errormsg("There is no such leader to group under");
+ 					    break;
+ 					  }
+ 					}
+ 					P_ASTAT = men;
+ 				}
+ 				break;
  #endif OGOD
  			default:
  				errormsg("Invalid Input");
***************
*** 585,593 ****
  			clrtoeol();
  			refresh();
  			nvynum = get_number();
! 			if(nvynum<0) break;
  #ifdef TRADE
! 			if (curntn->nvy[nvynum].commodity==TRADED) {
  				errormsg("Sorry - That Navy is up for trade");
  				continue;
  			}
--- 630,638 ----
  			clrtoeol();
  			refresh();
  			nvynum = get_number();
! 			if(nvynum<0) continue;
  #ifdef TRADE
! 			if (isgod == FALSE && curntn->nvy[nvynum].commodity==TRADED) {
  				errormsg("Sorry - That Navy is up for trade");
  				continue;
  			}
***************
*** 599,605 ****
  			mvaddstr(ypos++,0,"OPTIONS: 1) TRANSFER / MERGE, 2) SPLIT NAVY, 3) DISBAND NAVY");
    			clrtoeol();
  #ifdef OGOD
! 			if(isgod==TRUE) mvaddstr(ypos++,0,"GOD OPTIONS:  4) ADJUST SHIPS, 5) LOCATION, 6) CREW");
  			ypos++;
  			clrtoeol();
  #endif OGOD
--- 644,650 ----
  			mvaddstr(ypos++,0,"OPTIONS: 1) TRANSFER / MERGE, 2) SPLIT NAVY, 3) DISBAND NAVY");
    			clrtoeol();
  #ifdef OGOD
! 			if(isgod==TRUE) mvaddstr(ypos++,0,"GOD OPTIONS:  4) ADJUST SHIPS, 5) LOCATION, 6) CREW 7) MOVE");
  			ypos++;
  			clrtoeol();
  #endif OGOD
***************
*** 630,635 ****
--- 675,699 ----
  					errormsg("Sorry -- One of the two Armies must be unloaded");
  				}
  				else if((newx==P_NXLOC)&&(newy==P_NYLOC)) {
+ 					/* first check sizes */
+ 					for(i=N_LIGHT;i<=N_HEAVY;i++) {
+ 						if (P_NGAL(i) + SHIPS(curntn->nvy[newnavy].galleys,i) > N_MASK) {
+ 							i = (-1);
+ 							break;
+ 						}
+ 						if (P_NMER(i) + SHIPS(curntn->nvy[newnavy].merchant,i) > N_MASK) {
+ 							i = (-1);
+ 							break;
+ 						}
+ 						if (P_NWAR(i) + SHIPS(curntn->nvy[newnavy].warships,i) > N_MASK) {
+ 							i = (-1);
+ 							break;
+ 						}
+ 					}
+ 					if (i == (-1)) {
+ 					  errormsg("That would cause you to have too many ships of one type");
+ 					  break;
+ 					}
  					crew = flthold(nvynum)*P_NCREW;
  					people = fltmhold(nvynum)*P_NPEOP;
  					crew += flthold(newnavy)*curntn->nvy[newnavy].crew;
***************
*** 691,699 ****
  				curntn->nvy[navy].people=P_NPEOP;
  				curntn->nvy[navy].smove=P_NMOVE;
  					
  				mvaddstr(LINES-2,0,"Do you wish to separate warships from remainder of fleet?");
  				refresh();
! 				if(getch()=='y') {
  					curntn->nvy[navy].warships=P_NWSHP;
  					P_NWSHP=0;
  					NADJWAR;
--- 755,764 ----
  				curntn->nvy[navy].people=P_NPEOP;
  				curntn->nvy[navy].smove=P_NMOVE;
  					
+ 				if (P_NWSHP != 0)
  				mvaddstr(LINES-2,0,"Do you wish to separate warships from remainder of fleet?");
  				refresh();
! 				if(P_NWSHP!=0 && getch()=='y') {
  					curntn->nvy[navy].warships=P_NWSHP;
  					P_NWSHP=0;
  					NADJWAR;
***************
*** 715,720 ****
--- 780,786 ----
  					break;
  				}
  				for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) {
+ 					if (P_NWAR(shipsize) == 0) continue;
  					mvprintw(ypos,0,"How Many %s Warships To Split?",fltstr[shipsize]);
  					clrtoeol();
  					refresh();
***************
*** 724,729 ****
--- 790,796 ----
  					(void) addwships(navy,shipsize,newnavy);
  				}
  				for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) {
+ 					if (P_NMER(shipsize) == 0) continue;
  					mvprintw(ypos,0,"How Many %s Merchants To Split?",fltstr[shipsize]);
  					clrtoeol();
  					refresh();
***************
*** 733,738 ****
--- 800,806 ----
  					(void) addmships(navy,shipsize,newnavy);
  				}
  				for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) {
+ 					if (P_NGAL(shipsize) == 0) continue;
  					mvprintw(ypos,0,"How Many %s Galleys To Split?",fltstr[shipsize]);
  					clrtoeol();
  					refresh();
***************
*** 791,822 ****
  			case '4':
  				if (isgod==TRUE) {
  					/* ADJUST SHIPS */
- 					P_NWSHP=0;
- 					P_NMSHP=0;
- 					P_NGSHP=0;
  					for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) {
! 						mvprintw(ypos,0,"How Many %s Warships?",fltstr[shipsize]);
  						clrtoeol();
  						refresh();
  						newnavy = get_number();
! 						if(newnavy>N_MASK||newnavy<0) newnavy=0;
! 						(void) NADD_WAR(newnavy);
  					}
  					for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) {
! 						mvprintw(ypos,0,"How Many %s Merchants?",fltstr[shipsize]);
  						clrtoeol();
  						refresh();
  						newnavy = get_number();
! 						if(newnavy>N_MASK||newnavy<0) newnavy=0;
! 						(void) NADD_MER(newnavy);
  					}
  					for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) {
! 						mvprintw(ypos,0,"How Many %s Galleys?",fltstr[shipsize]);
  						clrtoeol();
  						refresh();
  						newnavy = get_number();
! 						if(newnavy>N_MASK||newnavy<0) newnavy=0;
! 						(void) NADD_GAL(newnavy);
  					}
  					NADJWAR;
  					NADJMER;
--- 859,908 ----
  			case '4':
  				if (isgod==TRUE) {
  					/* ADJUST SHIPS */
  					for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) {
! 						mvprintw(ypos,0,"How Many %s Warships? [%d] ",
! 							 fltstr[shipsize],P_NWAR(shipsize));
  						clrtoeol();
  						refresh();
  						newnavy = get_number();
! 						if (newnavy < 0 || newnavy > N_MASK) continue;
! 						newnavy -= P_NWAR(shipsize);
! 						if (newnavy > 0) {
! 							(void) NADD_WAR(newnavy);
! 						} else if (newnavy < 0) {
! 							newnavy = -newnavy;
! 							(void) NSUB_WAR(newnavy);
! 						}
  					}
  					for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) {
! 						mvprintw(ypos,0,"How Many %s Merchants? [%d] ",
! 							 fltstr[shipsize], P_NMER(shipsize));
  						clrtoeol();
  						refresh();
  						newnavy = get_number();
! 						if(newnavy>N_MASK||newnavy<0) continue;
! 						newnavy -= P_NMER(shipsize);
! 						if (newnavy > 0) {
! 						  (void) NADD_MER(newnavy);
! 						} else if (newnavy < 0) {
! 						  newnavy = -newnavy;
! 						  (void) NSUB_MER(newnavy);
! 						}
  					}
  					for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) {
! 						mvprintw(ypos,0,"How Many %s Galleys? [%d]",
! 							 fltstr[shipsize], P_NGAL(shipsize));
  						clrtoeol();
  						refresh();
  						newnavy = get_number();
! 						if(newnavy>N_MASK||newnavy<0) continue;
! 						newnavy -= P_NGAL(shipsize);
! 						if (newnavy > 0) {
! 						  (void) NADD_GAL(newnavy);
! 						} else if (newnavy < 0) {
! 						  newnavy = -newnavy;
! 						  (void) NSUB_GAL(newnavy);
! 						}
  					}
  					NADJWAR;
  					NADJMER;
***************
*** 850,855 ****
--- 936,951 ----
  					if (crew>=0 && crew<=SHIPCREW) {
  						P_NCREW = crew;
  						NADJCRW;
+ 					}
+ 				}
+ 				break;
+ 			case '7':
+ 				if (isgod == TRUE) {
+ 					mvaddstr(ypos, 0, "Set what move value? ");
+ 					refresh();
+ 					newnavy = get_number();
+ 					if (newnavy <= 100 && newnavy >= 0) {
+ 						P_NMOVE = newnavy;
  					}
  				}
  				break;
*** ocombat.c	Sat Mar  3 15:27:39 1990
--- combat.c	Sat Mar  3 15:27:56 1990
***************
*** 37,42 ****
--- 37,47 ----
  int	dnation;		/*one nation defending in this fight*/
  int	count=0;                /*number of armies or navies in sector*/
  
+ /* indicators of naval or army combat */
+ #define COMBAT_X	0
+ #define COMBAT_A	1
+ #define COMBAT_N	2
+ 
  /************************************************************************/
  /*	COMBAT()	run all combat on the map			*/
  /*  	for each sector, determine if armies in with attack mode	*/
***************
*** 45,51 ****
  combat()
  {
  	register int i,j;
! 	char	**fought; 		/* TRUE if already fought in sctr */
  	int	temp,ctry;
  	int	initialized=FALSE;	/* TRUE if arrays initialized */
  	short	armynum,nvynum;
--- 50,56 ----
  combat()
  {
  	register int i,j;
! 	char	**fought; 		/* SET: if already fought in sctr */
  	int	temp,ctry;
  	int	initialized=FALSE;	/* TRUE if arrays initialized */
  	short	armynum,nvynum;
***************
*** 60,66 ****
  	/*for each nation, if in attack mode run a check*/
  
  	/* no sectors have been fought in yet */
! 	for(i=0;i<MAPX;i++) for(j=0;j<MAPY;j++) fought[i][j]=FALSE;
  
  	for(ctry=NTOTAL-1;ctry>0;ctry--) if(isactive(ntn[ctry].active)) {
  
--- 65,71 ----
  	/*for each nation, if in attack mode run a check*/
  
  	/* no sectors have been fought in yet */
! 	for(i=0;i<MAPX;i++) for(j=0;j<MAPY;j++) fought[i][j]=COMBAT_X;
  
  	for(ctry=NTOTAL-1;ctry>0;ctry--) if(isactive(ntn[ctry].active)) {
  
***************
*** 72,83 ****
  			if((aptr->sold>0)
  			&&(aptr->stat>=ATTACK)
  			&&(aptr->stat<=SORTIE||aptr->stat>=NUMSTATUS)
! 			&&(!fought[aptr->xloc][aptr->yloc])){
  
  			/* someone can initiate combat in xspot,yspot */
  			xspot=aptr->xloc;
  			yspot=aptr->yloc;
! 			fought[xspot][yspot]=TRUE;
  
  			/*initialize matrix*/
  			if( !initialized ) {
--- 77,88 ----
  			if((aptr->sold>0)
  			&&(aptr->stat>=ATTACK)
  			&&(aptr->stat<=SORTIE||aptr->stat>=NUMSTATUS)
! 			&&(!(fought[aptr->xloc][aptr->yloc]&COMBAT_A))){
  
  			/* someone can initiate combat in xspot,yspot */
  			xspot=aptr->xloc;
  			yspot=aptr->yloc;
! 			fought[xspot][yspot]|=COMBAT_A;
  
  			/*initialize matrix*/
  			if( !initialized ) {
***************
*** 131,142 ****
  		/*navy combat*/
  		for(j=0;j<MAXNAVY;j++)
  		if((nptr->nvy[j].warships!=0)
! 		&&(fought[nptr->nvy[j].xloc][nptr->nvy[j].yloc]==0)
! 		&&(sct[nptr->nvy[j].xloc][nptr->nvy[j].yloc].altitude==WATER)){
  
  			xspot=nptr->nvy[j].xloc;
  			yspot=nptr->nvy[j].yloc;
! 			fought[xspot][yspot]=1;
  
  			/*initialize matrix*/
  			if( !initialized ){
--- 136,146 ----
  		/*navy combat*/
  		for(j=0;j<MAXNAVY;j++)
  		if((nptr->nvy[j].warships!=0)
! 		&&(!(fought[nptr->nvy[j].xloc][nptr->nvy[j].yloc]&COMBAT_N))) {
  
  			xspot=nptr->nvy[j].xloc;
  			yspot=nptr->nvy[j].yloc;
! 			fought[xspot][yspot]|=COMBAT_N;
  
  			/*initialize matrix*/
  			if( !initialized ){
***************
*** 156,166 ****
  			if(isactive(ntn[country].active))
  			for(nvynum=0;nvynum<MAXNAVY;nvynum++)
  			if((NWSHP+NMSHP+NGSHP!=0)
! 			&&(abs(NXLOC-xspot)<=2)
! 			&&(abs(NYLOC-yspot)<=2)
! 			&&(sct[NXLOC][NYLOC].altitude==WATER)
  			&&(count<MGKNUM)) {
! 				fought[NXLOC][NYLOC]=1;
  				if((country!=ctry)
  				&&(nptr->dstatus[country]>HOSTILE)){
  					valid=TRUE;
--- 160,171 ----
  			if(isactive(ntn[country].active))
  			for(nvynum=0;nvynum<MAXNAVY;nvynum++)
  			if((NWSHP+NMSHP+NGSHP!=0)
! 			&&(((NXLOC==xspot) && (NYLOC==yspot)) ||
! 			   (sct[NXLOC][NYLOC].altitude==WATER
! 			    &&(abs(NXLOC-xspot)<=2)
! 			    &&(abs(NYLOC-yspot)<=2)))
  			&&(count<MGKNUM)) {
! 				fought[NXLOC][NYLOC]|=COMBAT_N;
  				if((country!=ctry)
  				&&(nptr->dstatus[country]>HOSTILE)){
  					valid=TRUE;
***************
*** 804,817 ****
  
  	for(cnum=0;cnum<count;cnum++) if(owner[cnum]>(-1)){
  		if( unitnum != (-1) ) cnum=unitnum;
! 		if((side[cnum]==ATKR)&&(retreatside==ATKR)){
! 			ntn[owner[cnum]].arm[unit[cnum]].xloc = retreatx;
! 			ntn[owner[cnum]].arm[unit[cnum]].yloc = retreaty;
  		}
- 		else if((side[cnum]==DFND)&&(retreatside==DFND)){
- 			ntn[owner[cnum]].arm[unit[cnum]].xloc = retreatx;
- 			ntn[owner[cnum]].arm[unit[cnum]].yloc = retreaty;
- 		}
  		if( unitnum != (-1) ) return;
  	}
  }
--- 809,824 ----
  
  	for(cnum=0;cnum<count;cnum++) if(owner[cnum]>(-1)){
  		if( unitnum != (-1) ) cnum=unitnum;
! 		if(side[cnum] == retreatside){
! 			if ((ntn[owner[cnum]].arm[unit[cnum]].unittyp==A_MARINES)||
! 			    (ntn[owner[cnum]].arm[unit[cnum]].unittyp==A_SAILOR)){
! 				ntn[owner[cnum]].arm[unit[cnum]].sold *= 85;
! 				ntn[owner[cnum]].arm[unit[cnum]].sold /= 100;
! 			} else {
! 				ntn[owner[cnum]].arm[unit[cnum]].xloc = retreatx;
! 				ntn[owner[cnum]].arm[unit[cnum]].yloc = retreaty;
! 			}
  		}
  		if( unitnum != (-1) ) return;
  	}
  }
***************
*** 868,875 ****
  	 *     galley crew                      2
  	 *     merchant crew                    4
  	 * soldiers onboard:
!       *     SAILOR/ARCHER                   3/4
!       *     MARINE                          1/3
  	 *     others                          4/3
  	 */
  	for(j=0;j<count;j++) if(owner[j]!=(-1)){
--- 875,882 ----
  	 *     galley crew                      2
  	 *     merchant crew                    4
  	 * soldiers onboard:
!          *     SAILOR/ARCHER                   3/4
!          *     MARINE                          1/3
  	 *     others                          4/3
  	 */
  	for(j=0;j<count;j++) if(owner[j]!=(-1)){
***************
*** 959,967 ****
  	/* calculate capture percentages */
  	/*
  	 *  This formula produces:
!       *        0% capture for   1:100  odds
  	 *        2% capture for   1:10   odds
!       *       15% capture for   1:1    odds
  	 *       60% capture for  10:1    odds
  	 *      100% capture for >60:1    odds
  	 *      with linear progression between each.
--- 966,974 ----
  	/* calculate capture percentages */
  	/*
  	 *  This formula produces:
!          *        0% capture for   1:100  odds
  	 *        2% capture for   1:10   odds
!          *       15% capture for   1:1    odds
  	 *       60% capture for  10:1    odds
  	 *      100% capture for >60:1    odds
  	 *      with linear progression between each.
***************
*** 1240,1249 ****
  		k=0;
  		for(i=0;i<j;i++) if(owner[j]==owner[i]) k=1;
  		if(k==0) {
! 		if(side[i]==DFND)
  			fprintf(fnews,", attacker %s",ntn[owner[j]].name);
! 		else if(side[i]==ATKR)
  			fprintf(fnews,", defender %s",ntn[owner[j]].name);
  		}
  	}
  	fprintf(fnews,"\n");
--- 1247,1257 ----
  		k=0;
  		for(i=0;i<j;i++) if(owner[j]==owner[i]) k=1;
  		if(k==0) {
! 		if(side[j]==ATKR)
  			fprintf(fnews,", attacker %s",ntn[owner[j]].name);
! 		else if(side[j]==DFND)
  			fprintf(fnews,", defender %s",ntn[owner[j]].name);
+ 		else fprintf(fnews,", neutral %s",ntn[owner[j]].name);
  		}
  	}
  	fprintf(fnews,"\n");
*** omove.c	Sat Mar  3 15:27:41 1990
--- move.c	Sat Mar  3 15:27:56 1990
***************
*** 63,68 ****
--- 63,72 ----
  	} else {	/*army*/
  		mvprintw(LINES-4,0,"ARMY %d: ",armynum);
  		clrtoeol();
+ 		if (P_ASTAT>=NUMSTATUS) {
+ 			groupmen = P_ASTAT - NUMSTATUS;
+ 			P_AMOVE = curntn->arm[groupmen].smove;
+ 		}
  		if(P_AMOVE==0){
  			errormsg("That Unit is Not Able to Move");
  			redraw=DONE;
***************
*** 74,81 ****
  		if(P_ASTAT>=NUMSTATUS) {
  			mvprintw(LINES-4,10,"Member of Army Group %d!! Continue? ",P_ASTAT-NUMSTATUS);
  			refresh();
! 			if( getch() == 'y' )  P_ASTAT=ATTACK;
! 			else {
  				redraw=DONE;
  				armornvy=AORN;
  				return;
--- 78,87 ----
  		if(P_ASTAT>=NUMSTATUS) {
  			mvprintw(LINES-4,10,"Member of Army Group %d!! Continue? ",P_ASTAT-NUMSTATUS);
  			refresh();
! 			if( getch() == 'y' )  {
! 				P_ASTAT=ATTACK;
! 				AADJSTAT;
! 			} else {
  				redraw=DONE;
  				armornvy=AORN;
  				return;
***************
*** 261,267 ****
  				valid=FALSE;
  				xcurs=oldxcurs;
  				ycurs=oldycurs;
! 			} else if(movecost[XREAL][YREAL] >= 0){
  				/* LAND OF SOME TYPE */
  				valid=FALSE;
  				/* check for nearby water */
--- 267,274 ----
  				valid=FALSE;
  				xcurs=oldxcurs;
  				ycurs=oldycurs;
! 			} else if(movecost[XREAL][YREAL] >= 0
! 				  || movecost[XREAL][YREAL] == -2){
  				/* LAND OF SOME TYPE */
  				valid=FALSE;
  				/* check for nearby water */
*** oupdate.c	Sat Mar  3 15:27:45 1990
--- update.c	Sat Mar  3 15:27:59 1990
***************
*** 27,32 ****
--- 27,42 ----
  int	**attr;			/* sector attractiveness */
  long	**newpop;		/* storage for old population */
  
+ long
+ dtol(d) double d;
+ {
+ 	char tempstr[BIGLTH];
+ 	long l;
+ 	sprintf(tempstr,"%-60.0lf",d);
+ 	sscanf(tempstr,"%ld",&l);
+ 	return(l);
+ }
+ 
  /****************************************************************/
  /*	UPDATE() - updates the whole world			*/
  /****************************************************************/
***************
*** 625,631 ****
  			if(rand()%100 < 30) {	/* new leader takes over */
  				x++;
  				for(armynum=0;armynum<MAXARM;armynum++)
! 					if(P_ATYPE == x) break;
  				if( armynum<MAXARM) {
  					P_ATYPE=x-1;
  					P_ASOLD= *(unitminsth+(x-1)%UTYPE);
--- 635,641 ----
  			if(rand()%100 < 30) {	/* new leader takes over */
  				x++;
  				for(armynum=0;armynum<MAXARM;armynum++)
! 					if(P_ATYPE == x && P_ASOLD > 0) break;
  				if( armynum<MAXARM) {
  					P_ATYPE=x-1;
  					P_ASOLD= *(unitminsth+(x-1)%UTYPE);
***************
*** 699,706 ****
  				ntn[country].spellpts+=3;
  		}
  		if(magic(country,MA_MONST)==TRUE) ntn[country].spellpts+=2;
! 		else if(magic(country,AV_MONST)==TRUE) ntn[country].spellpts+=1;
! 		else if((magic(country,MI_MONST)==TRUE)
  			&&( rand()%2==0)) ntn[country].spellpts+=1;
  	}
  	free(attr);
--- 709,716 ----
  				ntn[country].spellpts+=3;
  		}
  		if(magic(country,MA_MONST)==TRUE) ntn[country].spellpts+=2;
! 		if(magic(country,AV_MONST)==TRUE) ntn[country].spellpts+=1;
! 		if((magic(country,MI_MONST)==TRUE)
  			&&( rand()%2==0)) ntn[country].spellpts+=1;
  	}
  	free(attr);
***************
*** 1212,1221 ****
  			&&( A->stat<NUMSTATUS ))
  				A->stat=FLIGHT;
  
! 			if((magic(country,ROADS)==1)
  			&&(sct[AX][AY].owner!=country)){
  				if(A->smove>7) A->smove-=4;
! 				else A->smove=4;
  			}
  
  			if((magic(country,SAPPER)==1)
--- 1222,1231 ----
  			&&( A->stat<NUMSTATUS ))
  				A->stat=FLIGHT;
  
! 			if((magic(country,ROADS)==TRUE)
  			&&(sct[AX][AY].owner!=country)){
  				if(A->smove>7) A->smove-=4;
! 				else if (A->smove>4) A->smove=4;
  			}
  
  			if((magic(country,SAPPER)==1)
***************
*** 1411,1417 ****
  		tempflt = (float) curntn->tfood * (100-curntn->spoilrate);
  		curntn->tfood = (long) (tempflt / 100.0);
  
! 		if(curntn->tgold > GOLDTHRESH*curntn->jewels){
  			/* buy jewels off commodities board */
  			xx=curntn->tgold-GOLDTHRESH*curntn->jewels;
  			if (ispc(curntn->active)) {
--- 1421,1427 ----
  		tempflt = (float) curntn->tfood * (100-curntn->spoilrate);
  		curntn->tfood = (long) (tempflt / 100.0);
  
! 		if((0.0+curntn->tgold) - GOLDTHRESH*(0.0+curntn->jewels) > 0.0){
  			/* buy jewels off commodities board */
  			xx=curntn->tgold-GOLDTHRESH*curntn->jewels;
  			if (ispc(curntn->active)) {
***************
*** 1419,1429 ****
  					fprintf(fm,"Message from Conquer\n\n");
  					fprintf(fm,"Gold imbalance forced your treasury to purchase\n");
  					fprintf(fm,"%ld jewels for %ld gold talons to compensate.\n",
! 						xx/GODPRICE*GODJEWL,xx);
  					mailclose(country);
  				}
  			}
! 			curntn->jewels += (xx/GODPRICE*GODJEWL);
  			curntn->tgold  -= xx;
  		}
  
--- 1429,1440 ----
  					fprintf(fm,"Message from Conquer\n\n");
  					fprintf(fm,"Gold imbalance forced your treasury to purchase\n");
  					fprintf(fm,"%ld jewels for %ld gold talons to compensate.\n",
! 						dtol((double)xx*GODJEWL/GODPRICE)
! 						,xx);
  					mailclose(country);
  				}
  			}
! 			curntn->jewels += dtol((double)xx*GODJEWL/GODPRICE);
  			curntn->tgold  -= xx;
  		}
  
*** ocommands.c	Sat Mar  3 15:27:39 1990
--- commands.c	Sat Mar  3 15:28:00 1990
***************
*** 189,195 ****
  			mvaddstr(LINES-3,7,"What nation owner:");
  			refresh();
  			x = get_country();
! 			if (x<NTOTAL) sptr->owner=x;
  			reset_god();
  			return;
  		case 'p':
--- 189,195 ----
  			mvaddstr(LINES-3,7,"What nation owner:");
  			refresh();
  			x = get_country();
! 			if (x>0 && x<NTOTAL) sptr->owner=x;
  			reset_god();
  			return;
  		case 'p':
***************
*** 200,206 ****
  			}
  			mvaddstr(LINES-3,7,"new population for sector: ");
  			refresh();
! 			sptr->people = (long) get_number();
  			reset_god();
  			return;
  		case 't':
--- 200,208 ----
  			}
  			mvaddstr(LINES-3,7,"new population for sector: ");
  			refresh();
! 			metal = get_number();
! 			if (metal <= (-1)) return;
! 			sptr->people = metal;
  			reset_god();
  			return;
  		case 't':
***************
*** 222,228 ****
  				mvaddstr(LINES-1,7,"new sector value: ");
  				refresh();
  				x = get_number();
! 				if(x<100 && x>=0)
  				if(y>END_MINE) {
  					sptr->jewels = (char)x;
  					sptr->metal = 0;
--- 224,230 ----
  				mvaddstr(LINES-1,7,"new sector value: ");
  				refresh();
  				x = get_number();
! 				if(x<100 && x>0) {
  				if(y>END_MINE) {
  					sptr->jewels = (char)x;
  					sptr->metal = 0;
***************
*** 230,235 ****
--- 232,241 ----
  					sptr->metal  = (char)x;
  					sptr->jewels = 0;
  				}
+ 				} else {
+ 					sptr->jewels = 0;
+ 					sptr->metal = 0;
+ 				}
  			} else {
  				sptr->jewels=0;
  				sptr->metal=0;
***************
*** 1119,1126 ****
  			if(strncmp(line,"END",3)==0) contd=TRUE;
  		}
  		standout();
! 		mvaddstr(LINES-3,(COLS/2)-22,"HIT ANY KEY TO CONTINUE");
! 		mvaddstr(LINES-2,(COLS/2)-22,"HIT RETURN TO DELETE MESSAGE");
  		standend();
  		refresh();
  		inpch=getch();
--- 1125,1132 ----
  			if(strncmp(line,"END",3)==0) contd=TRUE;
  		}
  		standout();
! 		mvaddstr(LINES-3,(COLS/2)-13,"HIT ANY KEY TO CONTINUE");
! 		mvaddstr(LINES-2,(COLS/2)-16,"HIT RETURN TO DELETE MESSAGE");
  		standend();
  		refresh();
  		inpch=getch();
*** odata.c	Sat Mar  3 15:27:39 1990
--- data.c	Sat Mar  3 15:28:01 1990
***************
*** 93,99 ****
  100,50,100,50,250,125,
  250,50,500,100,250,125,
  50, 50, 50, 75, 75,
! 100, 50, 150, 150, 150,
  175, 150, 500, 500, 1000
  };
  
--- 93,99 ----
  100,50,100,50,250,125,
  250,50,500,100,250,125,
  50, 50, 50, 75, 75,
! 75, 50, 150, 150, 150,
  175, 150, 500, 500, 1000
  };
  
***************
*** 262,268 ****
  /*              0         0         0         0         0         0 */
  /* a value of x means any designation is possible */
  /*              fwbcwmhpgcfshfrwdpbcpstgponpmldpllpiopshmtpbcltismasspdsgridp*/
! char *tg_stype="xffffttttffffffffffftxlxllttuuctcccfffxxtccmmmmmmmm$$$$$$$$$$0";
  char *tg_value="13335157911433442331131135734567789123937571111111111111111110";
  
  char	*tg_name[] = {
--- 262,268 ----
  /*              0         0         0         0         0         0 */
  /* a value of x means any designation is possible */
  /*              fwbcwmhpgcfshfrwdpbcpstgponpmldpllpiopshmtpbcltismasspdsgridp*/
! char *tg_stype="xffffttttffffffffffftxlxllttuuctcccfff?xtccmmmmmmmm$$$$$$$$$$0";
  char *tg_value="13335157911433442331131135734567789123937571111111111111111110";
  
  char	*tg_name[] = {
*** omagic.c	Sat Mar  3 15:27:40 1990
--- magic.c	Sat Mar  3 15:28:01 1990
***************
*** 628,636 ****
  			}
  		} else {
  			if (ntn[i].race==ORC) 
! 				mvaddstr((*count)++,0,"  Wrong Race");
! 			else mvaddstr((*count)++,0,"  That Nation is Outside Your Influence");
  		}
  	}
  	return(done);
  }
--- 628,638 ----
  			}
  		} else {
  			if (ntn[i].race==ORC) 
! 				mvaddstr((*count)++,0,"  That Nation is Outside Your Influence");
! 			else mvaddstr((*count)++,0,"  Wrong Race");
  		}
+ 		refresh();
+ 		sleep(2);
  	}
  	return(done);
  }
*** omain.c	Sat Mar  3 15:27:41 1990
--- main.c	Sat Mar  3 15:28:02 1990
***************
*** 61,67 ****
  	int geteuid(), getuid(), setuid();
  	register int i,j;
  	char name[NAMELTH+1],filename[FILELTH];
! 	void srand(),init_hasseen(),mapprep();
  	int getopt();
  	char passwd[PASSLTH+1];
  	long time();
--- 61,70 ----
  	int geteuid(), getuid(), setuid();
  	register int i,j;
  	char name[NAMELTH+1],filename[FILELTH];
! #ifdef __STDC__
! 	void srand();
! #endif
! 	void init_hasseen(),mapprep();
  	int getopt();
  	char passwd[PASSLTH+1];
  	long time();
***************
*** 1119,1125 ****
  					mvprintw(nfound2*2+count,COLS-20,"%s: %d men  ",ntn[i].name,enemy);
  				else if(magic(i,THE_VOID)==TRUE)
  				mvprintw(nfound2*2+count,COLS-20,"%s: ?? men  ",ntn[i].name);
! 				else mvprintw(nfound2*2+count,COLS-20,"%s: %ld men  ",ntn[i].name,(enemy*(rand()%60+70)/100));
  				count++;
  			}
  			enemy=0;
--- 1122,1132 ----
  					mvprintw(nfound2*2+count,COLS-20,"%s: %d men  ",ntn[i].name,enemy);
  				else if(magic(i,THE_VOID)==TRUE)
  				mvprintw(nfound2*2+count,COLS-20,"%s: ?? men  ",ntn[i].name);
! 				else {
! 					srand(i*17+enemy+TURN*3);
! 					mvprintw(nfound2*2+count,COLS-20,"%s: %ld men  ",ntn[i].name,(enemy*(rand()%60+70)/100));
! 					srand((unsigned) time((long *) 0));
! 				}
  				count++;
  			}
  			enemy=0;
***************
*** 1137,1143 ****
  					mvprintw(nfound2*2+count,COLS-20,"%s: %d ships",ntn[i].name,enemy);
  				else if(magic(i,THE_VOID)==TRUE)
  				mvprintw(nfound2*2+count,COLS-20,"%s: ?? ships",ntn[i].name);
! 				else mvprintw(nfound2*2+count,COLS-20,"%s: %ld ships",ntn[i].name,(enemy*(rand()%60+70)/100));
  				count++;
  			}
  		}
--- 1144,1154 ----
  					mvprintw(nfound2*2+count,COLS-20,"%s: %d ships",ntn[i].name,enemy);
  				else if(magic(i,THE_VOID)==TRUE)
  				mvprintw(nfound2*2+count,COLS-20,"%s: ?? ships",ntn[i].name);
! 				else {
! 					srand(i*17+enemy+TURN*3);
! 					mvprintw(nfound2*2+count,COLS-20,"%s: %ld ships",ntn[i].name,(enemy*(rand()%60+70)/100));
! 					srand((unsigned) time((long *) 0));
! 				}
  				count++;
  			}
  		}
***************
*** 1177,1184 ****
  
  		if((sptr->owner==country)||(country==0)||(magic(country,NINJA)==TRUE))
  		mvprintw(LINES-9,COLS-20,"people: %6d",sptr->people);
! 		else
! 		mvprintw(LINES-9,COLS-20,"people: %6d",sptr->people*(rand()%60+70)/100);
  		clrtoeol();
  		if((sptr->owner==country)
  		||(sptr->owner==0)
--- 1188,1198 ----
  
  		if((sptr->owner==country)||(country==0)||(magic(country,NINJA)==TRUE))
  		mvprintw(LINES-9,COLS-20,"people: %6d",sptr->people);
! 		else {
! 			srand(country*17+TURN*3+sptr->people);
! 			mvprintw(LINES-9,COLS-20,"people: %6d",sptr->people*(rand()%60+70)/100);
! 			srand((unsigned) time((long *) 0));
! 		}
  		clrtoeol();
  		if((sptr->owner==country)
  		||(sptr->owner==0)
*** onpc.c	Sat Mar  3 15:27:42 1990
--- npc.c	Sat Mar  3 15:28:02 1990
***************
*** 487,493 ****
  	for(armynum=1;armynum<MAXARM;armynum++) if(P_ASOLD>0){
  		/* move army back if too far out */
  		ok = 0;
! 		if (P_ASOLD < MINLEADER && P_ASOLD!=A_MILITIA) {
  			curntn->tmil += P_ASOLD;
  		}
  		for(x=(int)P_AXLOC-3;x<=(int)P_AXLOC+3;x++)
--- 487,493 ----
  	for(armynum=1;armynum<MAXARM;armynum++) if(P_ASOLD>0){
  		/* move army back if too far out */
  		ok = 0;
! 		if (P_ATYPE < MINLEADER && P_ASOLD!=A_MILITIA) {
  			curntn->tmil += P_ASOLD;
  		}
  		for(x=(int)P_AXLOC-3;x<=(int)P_AXLOC+3;x++)
***************
*** 562,567 ****
--- 562,568 ----
  
  	/*too few soldiers on garrison*/
  	/*diff is number to change mil in cap (>0)*/
+ 	if (*(u_enmetal + (P_ATYPE%UTYPE)) > 0)
  	diff = (long) min(ideal-P_ASOLD,(int) (curntn->metals / *(u_enmetal + (P_ATYPE%UTYPE))));
  
  	diff=(long) min((int) diff, sct[curntn->capx][curntn->capy].people/2L);
***************
*** 636,641 ****
--- 637,643 ----
  	&&( P_ATYPE<MINLEADER )
  	&&( P_ASOLD < TAKESECTOR )
  	&&( curntn->tgold > 0 )
+ 	&&(curntn->metals >= (TAKESECTOR+20-P_ASOLD)* *(u_enmetal + (P_ATYPE%UTYPE)))
  	&&( fort_val(&sct[P_AXLOC][P_AYLOC]) > 0)
  	&&( sct[P_AXLOC][P_AYLOC].owner == country )) {
  #ifdef DEBUG
***************
*** 647,652 ****
--- 649,655 ----
  		else curntn->tgold-=(TAKESECTOR+20-P_ASOLD)*
  			*(u_encost + (P_ATYPE%UTYPE));
  		curntn->tmil += TAKESECTOR+20-P_ASOLD;
+ 		curntn->metals -= ((TAKESECTOR+20-P_ASOLD)* *(u_enmetal + (P_ATYPE%UTYPE)));
  		P_ASOLD = TAKESECTOR+20;
  	}
  
***************
*** 1160,1165 ****
--- 1163,1177 ----
  
  	if( curntn->tgold > curntn->tciv ) curntn->charity=10;
  	else curntn->charity=0;
+ 	if( (curntn->tsctrs < 20) || (curntn->score < 20) ) {
+ 		if( curntn->tax_rate < 10 )
+ 			curntn->tax_rate = 10;
+ 	} else {
+ 		curntn->tax_rate = (int)min((int)(curntn->prestige/5),(int)((curntn->popularity+curntn->terror+3*curntn->charity)/10));
+ 		curntn->tax_rate = (int)min(curntn->tax_rate,20);
+ 		if(curntn->tax_rate < 4)
+ 			curntn->tax_rate = 4;
+ 	}
  
  	/* INTELLIGENT SECTOR REDESIGNATION */
  	/* note that only redesignate pc's if not designated yet */
*** otrade.c	Sat Mar  3 15:27:44 1990
--- trade.c	Sat Mar  3 15:28:03 1990
***************
*** 51,57 ****
  #ifdef ADMIN
  char *tradefail[NUMPRODUCTS] = { "lack of gold", "lack of food",
  	"lack of metal", "lack of jewels", "land not owned",
! 	"no available armies", "no available navies"};
  #endif ADMIN
  #ifdef CONQUER
  /* Use this when you wish to bid something */
--- 51,58 ----
  #ifdef ADMIN
  char *tradefail[NUMPRODUCTS] = { "lack of gold", "lack of food",
  	"lack of metal", "lack of jewels", "land not owned",
! 	"unavailable or destroyed armies",
! 	"unavailable or destoryed navies"};
  #endif ADMIN
  #ifdef CONQUER
  /* Use this when you wish to bid something */
***************
*** 145,151 ****
  					lvar2[holdint],
  					commodities[type2[holdint]]);
  				}
! 				if (count>16) {
  					standout();
  					mvaddstr(LINES-2,30,"Hit Any Key to Continue");
  					standend();
--- 146,152 ----
  					lvar2[holdint],
  					commodities[type2[holdint]]);
  				}
! 				if (count>LINES-8) {
  					standout();
  					mvaddstr(LINES-2,30,"Hit Any Key to Continue");
  					standend();
***************
*** 571,576 ****
--- 572,578 ----
  		}
  	}
  	mvprintw((*count)++,0," JUST ENTERED %c so food value is %d", entered,temp);
+ 	refresh();
  	return(temp);
  }
  
***************
*** 659,664 ****
--- 661,667 ----
  int cntry,item,isup,extint;
  long longval;
  {
+ 	if (cntry == -1) return;
  	switch(item)
  	{
  	case TDGOLD:
***************
*** 722,727 ****
--- 725,731 ----
  	case TDARMY:
  		/* find army number for cntry2 */
  		/* give army to cntry2 */
+ 		if(ntn[cntry1].arm[extra].sold <= 0) return -1;
  		while(unitnum==(-1)&&unitcount<MAXARM) {
  			if (ntn[cntry2].arm[unitcount].sold<=0) {
  				/* give army to cntry2 */
***************
*** 743,748 ****
--- 747,755 ----
  		break;
  	case TDSHIP:
  		/* give navy to cntry1 */
+ 		if(!(ntn[cntry1].nvy[extra].merchant!=0
+ 		   && ntn[cntry1].nvy[extra].warships!=0
+ 		   && ntn[cntry1].nvy[extra].galleys!=0) ) return -1;
  		while(unitnum==(-1)&&unitcount<MAXARM){
  			if ((int)ntn[cntry2].nvy[unitcount].merchant+ntn[cntry2].nvy[unitcount].warships+ntn[cntry2].nvy[unitcount].galleys == 0) {
  				/* give navy to cntry2 */
***************
*** 787,793 ****
  		returnval=longval;
  		break;
  	case TDLAND:
! 		if (cntry2!=sct[(int)longval][extint].owner)
  		returnval=(long)tofood( &sct[(int)longval][extint],cntry1);
  		break;
  	case TDARMY:
--- 794,800 ----
  		returnval=longval;
  		break;
  	case TDLAND:
! 		if (cntry2 == sct[(int)longval][extint].owner)
  		returnval=(long)tofood( &sct[(int)longval][extint],cntry1);
  		break;
  	case TDARMY:
***************
*** 795,800 ****
--- 802,808 ----
  		returnval=armyvalue(cntry2,extint);
  		break;
  	case TDSHIP:
+ 		curntn = &ntn[cntry2];
  		if (flthold(extint)>0)
  		returnval = (long)flthold(extint);
  		break;
***************
*** 976,982 ****
  				whobuy[type1[itemnum]]=natn[itemnum];
  			} else {
  				/* return bid */
! 				takeback(whobuy[itemnum],
  					type2[type1[itemnum]],
  					lvar1[itemnum],(int)lvar2[itemnum],FALSE);
  			}
--- 984,990 ----
  				whobuy[type1[itemnum]]=natn[itemnum];
  			} else {
  				/* return bid */
! 				takeback(natn[itemnum],
  					type2[type1[itemnum]],
  					lvar1[itemnum],(int)lvar2[itemnum],FALSE);
  			}
***************
*** 995,1000 ****
--- 1003,1009 ----
  	for (count=0;count<itemnum;count++) {
  		if (deal[count]==SELL) {
  			/* adjust the displayed value */
+ 			if (type1[count] != TDLAND)
  			lvar1[count]=gettval(0,natn[count],type1[count],lvar1[count],extra[count]);
  			/* keep unsold items up for sale */
  			if(lvar1[count]>=0) fprintf(tfile,"%d %d %d %d %ld %ld %d\n", deal[count], natn[count],type1[count],type2[count],lvar1[count],lvar2[count],extra[count]);
***************
*** 1013,1018 ****
--- 1022,1029 ----
  					ntn[whobuy[count]].name,ntn[natn[count]].name,tradefail[type2[count]]);
  				/* place it on the list for next turn */
  				/* adjust the displayed value */
+ 				/* let land fail during trade */
+ 				if (type1[count] != TDLAND)
  				lvar1[count]=gettval(0,natn[count],type1[count],lvar1[count],extra[count]);
  				if(lvar1[count]>=0) fprintf(tfile,"%d %d %d %d %ld %ld %d\n", SELL, natn[count],type1[count],type2[count],lvar1[count],lvar2[count],extra[count]);
  			} else {
***************
*** 1026,1031 ****
--- 1037,1108 ----
  		}
  	}
  	fclose(tfile);
+ }
+ 
+ /* remove a nations items from the trading board */
+ void 
+ fixtrade (cntry)
+ int cntry;
+ {
+ 	FILE *tfile;
+ 	int holdint, notopen=FALSE;
+ 	int type1[MAXITM], type2[MAXITM], deal[MAXITM], extra[MAXITM];
+ 	int natn[MAXITM], itemnum, getland(), gettrade(), checkland();
+ 	long lvar1[MAXITM], lvar2[MAXITM], armyvalue();
+ 	void  setaside(), takeback();
+ 
+ 	/* open trading file */
+ 	if ((tfile=fopen(tradefile,"r")) == NULL ) {
+ 		notopen=TRUE;
+ 	}
+ 	itemnum = 0;
+ 
+ 	/* read in all of the data */
+ 	while (notopen==FALSE && !feof(tfile)) 
+ 	{
+ 		if (fscanf(tfile,"%d %d %d %d %ld %ld %d\n",&deal[itemnum],
+ 			&natn[itemnum],&type1[itemnum],&type2[itemnum],
+ 			&lvar1[itemnum],&lvar2[itemnum],&extra[itemnum]) == 7){
+ 			if (deal[itemnum]==NOSALE) {
+ 				/* remove item from sales list */
+ 				deal[type1[itemnum]]=NOSALE;
+ 			} else if (deal[itemnum]==SELL) {
+ 				itemnum++;
+ 			}
+ 		}
+ 	}
+ 	if (notopen==FALSE) fclose(tfile);
+ 
+ 	/* go through list of commodities */
+ 
+ 	for ( holdint=0; holdint<itemnum; holdint++) 
+ 	{
+ 		if ( deal[holdint]==SELL ) 
+ 		{
+ 
+ 			if ( natn[holdint] == cntry )
+ 			{
+ 				/* remove it from market */
+ 
+ 				if ( (tfile = fopen(tradefile,"a+"))==NULL)
+ 				{
+ 					printf("Error opening file for trading");
+ 					abrt();
+ 				}
+ 
+ 				fprintf(tfile, "%d %d %d %d %ld %ld %d\n", 
+ 				 NOSALE, natn[holdint], holdint, 0, 0L, 0L, 0);
+ 
+ 				fclose(tfile);
+ 
+ 				takeback( natn[holdint], type1[holdint], lvar1[holdint],
+ 					extra[holdint], FALSE);
+ 
+ 			}  /* natn == cntry */
+ 
+ 		} /* SELL order */
+ 
+ 	} /* loop through commodities */
  }
  #endif ADMIN
  #endif TRADE
*** ocheck.c	Sat Mar  3 15:27:39 1990
--- check.c	Sat Mar  3 15:28:03 1990
***************
*** 18,29 ****
  	register struct s_nation	*nptr;
  	register int	i;
  	register int	country;
  	struct army	*a;
  
  	for( country = 0; country < NTOTAL; country++ ) {
  		nptr = &ntn[country];
  
! 		if(nptr->active == 0) continue;
  		if( nptr->metals < 0.0 ) {
  			fprintf( stderr, "file %s: line %d: nation[%d] metal = %ld\n",
  				__file__, __line__, country, nptr->metals );
--- 18,30 ----
  	register struct s_nation	*nptr;
  	register int	i;
  	register int	country;
+ 	int j, k;
  	struct army	*a;
  
  	for( country = 0; country < NTOTAL; country++ ) {
  		nptr = &ntn[country];
  
! 		if(country !=0 && nptr->active == 0) continue;
  		if( nptr->metals < 0.0 ) {
  			fprintf( stderr, "file %s: line %d: nation[%d] metal = %ld\n",
  				__file__, __line__, country, nptr->metals );
***************
*** 54,68 ****
  					__file__, __line__, country, i, a->yloc );
  				a->yloc = 0;
  			}
  			if( a->stat != ONBOARD && sct[a->xloc][a->yloc].altitude==WATER ) {
  				fprintf( stderr, "file %s: line %d: nation[%d] army[%d] loc=%d,%d (water) men=%d\n",
  				__file__,__line__,country,i,a->xloc,a->yloc,a->sold);
  				a->sold = 0;
  			}
! 			if( a->stat == ONBOARD && a->smove != 0) {
! 				/* don't echo since this is still getting */
! 				/* set some place someplace I can't find yet */
! 				a->smove = 0;
  			}
  		} /* for */
  
--- 55,101 ----
  					__file__, __line__, country, i, a->yloc );
  				a->yloc = 0;
  			}
+ 			if( a->stat == ONBOARD) {
+ 				if (a->smove != 0) {
+ 					fprintf( stderr, "file %s: line %d: nation[%d] army[%d] onboard move = %d\n",
+ 						__file__, __line__, country, i, a->smove );
+ 					a->smove = 0;
+ 				}
+ 				k = 0;
+ 				for (j = 0; j < MAXNAVY; j++) {
+ 					if (nptr->nvy[j].warships == 0
+ 					  && nptr->nvy[j].merchant == 0
+ 					  && nptr->nvy[j].galleys == 0)
+ 						continue;
+ 					if (nptr->nvy[j].armynum == i) {
+ 						k = 1;
+ 					}
+ 				}
+ 				if (k == 0) {
+ 					fprintf(stderr, "files %s: line %d: nation[%d] army[%d] onboard nothing\n",
+ 						__file__,__line__,country,i);
+ 					a->stat = DEFEND;
+ 				}
+ 			}
  			if( a->stat != ONBOARD && sct[a->xloc][a->yloc].altitude==WATER ) {
  				fprintf( stderr, "file %s: line %d: nation[%d] army[%d] loc=%d,%d (water) men=%d\n",
  				__file__,__line__,country,i,a->xloc,a->yloc,a->sold);
  				a->sold = 0;
  			}
! 		} /* for */
! 
! 		for( i = 0; i < MAXNAVY; i++ ) {
! 			if (nptr->nvy[i].warships == 0
! 			  && nptr->nvy[i].merchant == 0
! 			  && nptr->nvy[i].galleys == 0)
! 				continue;
! 			if (nptr->nvy[i].armynum != MAXARM) {
! 				a = &(nptr->arm[nptr->nvy[i].armynum]);
! 				if (a->sold == 0 || a->stat != ONBOARD) {
! 					fprintf(stderr, "file %s: line %d: nation[%d] navy[%d] carrying invalid troop\n",
! 					       __file__,__line__,country,i);
! 					nptr->nvy[i].armynum = MAXARM;
! 				}
  			}
  		} /* for */
  
*** onavy.c	Sat Mar  3 15:27:42 1990
--- navy.c	Sat Mar  3 15:28:03 1990
***************
*** 423,430 ****
  			}
  			P_ASTAT=DEFEND;
  			P_NARMY=MAXARM;
! 			if ((sct[XREAL][YREAL].designation!=DCITY
! 			&& sct[XREAL][YREAL].designation!=DCAPITOL)
  			|| P_NMOVE < N_CITYCOST) {
  				P_NMOVE=0;
  			} else {
--- 423,433 ----
  			}
  			P_ASTAT=DEFEND;
  			P_NARMY=MAXARM;
! 			if (!((sct[XREAL][YREAL].designation==DCITY
! 			|| sct[XREAL][YREAL].designation==DCAPITOL)
! 			&& (sct[XREAL][YREAL].owner==country
! 			|| (!ntn[sct[XREAL][YREAL].owner].dstatus[country]!=UNMET
! 			&& ntn[sct[XREAL][YREAL].owner].dstatus[country]<=NEUTRAL)))
  			|| P_NMOVE < N_CITYCOST) {
  				P_NMOVE=0;
  			} else {
***************
*** 495,502 ****
  				P_ASTAT=ONBOARD;
  				P_AMOVE=0;
  				P_NARMY=armynum;
! 				if ((sct[XREAL][YREAL].designation!=DCITY
! 				&& sct[XREAL][YREAL].designation!=DCAPITOL)
  				|| P_NMOVE < N_CITYCOST) {
  					P_NMOVE=0;
  				} else {
--- 498,508 ----
  				P_ASTAT=ONBOARD;
  				P_AMOVE=0;
  				P_NARMY=armynum;
! 				if (!((sct[XREAL][YREAL].designation==DCITY
! 				|| sct[XREAL][YREAL].designation==DCAPITOL)
! 				&& (sct[XREAL][YREAL].owner==country
! 				|| (!ntn[sct[XREAL][YREAL].owner].dstatus[country]!=UNMET
! 				&& ntn[sct[XREAL][YREAL].owner].dstatus[country]<=NEUTRAL)))
  				|| P_NMOVE < N_CITYCOST) {
  					P_NMOVE=0;
  				} else {
*** otxt3	Sat Mar  3 15:27:44 1990
--- txt3	Sat Mar  3 15:28:04 1990
***************
*** 1,25 ****
!                               MAGIC POWERS
  
! Magic powers differentiate your nation from all the other nations in the
! world.  There are three types of powers - truly MAGICAL powers, which
! usually involve summoning or spell use, CIVILIAN powers, which are related
! to civilization and trade, and MILITARY powers, which measure your ability
! to make war.  
  
! All nations start with at least one power (based on race or class) and can 
! purchase additional powers by expending jewels.  On the Magic Screen ('M'), 
! if you have enough jewels, you will be asked if you wish to buy a magic
  power.
!  
! The magic screen also permits you to see what powers you have, and to
! takeover ORC nations if you are an ORC nation with the appropriate powers.
  END
!                             HOW TO GET MAGIC
  
! Magic powers cost jewels to obtain; the chance to obtain a power is based on 
! your nations magic ability.  The formulae for this is to take two to the 
! power of the sum of the number of powers you have from that type and half 
! the number of other powers times your base value:
  
  jewel cost for civilian power = Base * 2**( #mgk/2 + #civ + #mil/2 )
  
--- 1,25 ----
!                                 MAGIC POWERS
  
! Magic powers differentiate your nation from all  the  other  nations  in  the
! world.  There are three types of powers - truly MAGICAL powers, which usually
! involve summoning or spell use, CIVILIAN powers, which are related to civili-
! zation  and  trade,  and  MILITARY powers, which measure your ability to make
! war.
  
! All nations start with at least one power (based on race or  class)  and  can
! purchase  additional  powers by expending jewels.  On the Magic Screen ('M'),
! if you have enough jewels, you will be asked if  you  wish  to  buy  a  magic
  power.
! 
! The magic screen also permits you to see what powers you have, and  to  take-
! over ORC nations if you are an ORC nation with the appropriate powers.
  END
!                               HOW TO GET MAGIC
  
! Magic powers cost jewels to obtain; the cost to obtain a power  is  based  on
! your  nations  magic  ability.   The  formulae for this is to take two to the
! power of the sum of the number of powers you have from that type and half the
! number of other powers times your base value:
  
  jewel cost for civilian power = Base * 2**( #mgk/2 + #civ + #mil/2 )
  
***************
*** 102,145 ****
  Enhance Attack  -- 30% increase in attack at a cost of 1 spell pt / 300 men
  Enhance Defense -- 30% increase in defense at a cost of 1 spell pt / 300 men
  
!    All of the above spells except summoning have an effect area of one army
! unit and a duration of one turn.  Flight and the Combat Enhancements each
! cause the unit to lose one movement point due to the change in status.
  END
!                         SUMMONED MONSTERS
  
! A monster unit represents one monster, but is the equivalent in combat of an
  army of the given number of men.  When summoned, they appear in your Capitol,
! and are yours to command until you disband them or can not afford to pay
! their per/turn jewel cost *and* 5x that cost in gold.  Monsters may be
! wounded in combat as can normal army units.  Wounded monsters have a percent
  chance of dying based on the percent damage taken (a dragon (1000 men) taking
! 200 equivalent men of damage has a 20% chance of dying).  Next turn, however
! its strength will be fully restored (1000 men again).  A number of the
! monsters will also have the ability of flight.
  
! Spell points can accumulate from turn to turn, but there is a 25% chance
! that half your unused spell points disappear each turn... this gives you
! some incentive to use them.
  END
                          SUMMONED MONSTER TYPES
  
             spell    combat                 jewels      power
             points   bonus    move    men    turn       prerequisites
! SPIRIT        2       +0      x1      50     1000
! ASSASSIN      2      +20      x1      50      400      NINJA
! EFREET        2      +10      x1.5    50      400      DERVISH
! GARGOYLE      2      +10      x1      75      450      MI_MONST
! WRAITH        2      +10      x1      75      450      VAMPIRE
! HERO          2       +0      x1     100      200      WARRIOR
! CENTAUR       2      +10      x1.5    50      200      CAVALRY
! GIANT         5       +0      x1     150     2100
! SUPERHERO     5      +15      x1     150      450      WARLORD
! MUMMY         5      +15      x1     150     1000      VAMPIRE
! ELEMENTAL     5       +5      x1.5   175     1900      SORCERER
! MINOTAUR      5      +20      x1     150     2100      DESTROYER
! DEMON         10     +50      x1     500     6000      DESTROYER
! BALROG        10     +40      x1.5   500     6000      WIZARD & VAMPIRE
! DRAGON        15     +50      x2    1000    10000      MA_MONST & WIZARD
  END
  DONE
--- 102,162 ----
  Enhance Attack  -- 30% increase in attack at a cost of 1 spell pt / 300 men
  Enhance Defense -- 30% increase in defense at a cost of 1 spell pt / 300 men
  
! All of the above spells except summoning have an effect area of one army unit
! and  a  duration  of one turn.  Flight and the Combat Enhancements each cause
! the unit to lose one movement point due to the change in status.
  END
!                               SUMMONED MONSTERS
  
! A monster unit represents one monster, but is the equivalent in combat of  an
  army of the given number of men.  When summoned, they appear in your Capitol,
! and are yours to command until you disband them or  can  not  afford  to  pay
! their  per/turn  jewel  cost  *and*  5x  that  cost in gold.  Monsters may be
! wounded in combat as can normal army units.  Wounded monsters have a  percent
  chance of dying based on the percent damage taken (a dragon (1000 men) taking
! 200 equivalent men of damage has a 20% chance of dying).  Next turn,  however
! its  strength  will be fully restored (1000 men again).  A number of the mon-
! sters will also have the ability of flight.
  
! Spell points can accumulate from turn to turn, but there is a 25% chance that
! half  your  unused  spell points disappear each turn....  This gives you some
! incentive to use them.
  END
                          SUMMONED MONSTER TYPES
  
             spell    combat                 jewels      power
             points   bonus    move    men    turn       prerequisites
! Spirit        2       +0      x1      50     1000
! Assasin       2      +20      x1      50      400      NINJA
! Efreet        2      +10      x1.5    50      400      DERVISH
! Gargoyl       2      +10      x1      75      450      MI_MONST
! Wraith        2      +10      x1      75      450      VAMPIRE
! Hero          2       +0      x1      75      200      WARLORD
! Centaur       2      +10      x1.5    50      200      CAVALRY
! Giant         5       +0      x1     150     2100
! Suphero       5      +15      x1     150      450      WARRIOR
! Mummy         5      +15      x1     150     1000      VAMPIRE
! Elmentl       5       +5      x1.5   175     1900      SORCERER
! Mintaur       5      +20      x1     150     2100      DESTROYER
! Daemon        10     +50      x1     500     6000      DESTROYER
! Balrog        10     +40      x1.5   500     6000      WIZARD & VAMPIRE
! Dragon        15     +50      x2    1000    10000      MA_MONST & WIZARD
! END
!                    FURTHER RESTRICTIONS ON ACQUIRING MAGIC
! 
! Note: This applies only to powers acquired during the course of the game  and
! not  to innate powers of nations.  Further, extra random powers bought by new
! nations are considered to be bought  on  their  first  turn  as  their  first
! action.
! 
! God only:              KNOWALL
! Orc only:              MI_MONST, AV_MONST, MA_MONST, BREEDER
! PC only:               ARMOR, AVIAN, SAPPER,
!                        DEMOCRACY, NINJA, ROADS, SAILOR, SLAVER,
!                        SUMMON, WYZARD, SORCEROR
! Forbidden to Dwarves:  SUMMON, WYZARD, SORCEROR
! Forbidden to Elves:    DESTROYER, VAMPIRE, MINER
! Forbidden to Orcs:     RELIGION, CAVALRY
! Forbidden to NPC's:    CAVALRY
  END
  DONE
*** ospew.c	Sat Mar  3 15:27:43 1990
--- spew.c	Sat Mar  3 15:28:05 1990
***************
*** 95,106 ****
  int n;
  FILE *fp;
  {
! 	char *fname;
  	char main_class[20];
  	int i;
  	HowMany = n;
  
! 	fname = DEFFILE;
  	InFile = fopen( fname, "r" );
  	if( InFile == NULL ){
  		fprintf( stderr, "Can\'t open: %s\n", fname );
--- 95,107 ----
  int n;
  FILE *fp;
  {
! 	char fname[BIGLTH];
  	char main_class[20];
  	int i;
  	HowMany = n;
  
! 	/* read in only the rules file in defaultdir */
! 	sprintf(fname, "%s/%s", DEFAULTDIR, DEFFILE);
  	InFile = fopen( fname, "r" );
  	if( InFile == NULL ){
  		fprintf( stderr, "Can\'t open: %s\n", fname );