[comp.sources.games.bugs] conquer v3 - patch 2.sh -> shell archive for trade.c

smile@homxc.UUCP (E.BARLOW) (07/13/88)

This shar archive contains trade.c.
The Ed

#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh to create the files
#       
# This archive is number 1
# This archive created: Wed Jul 13 09:27:41 EDT 1988
echo shar: extracting "'trade.c'" '(25421trade.c)'
if test -f 'trade.c'
then
	echo shar: will not over-write existing file "'trade.c'"
else
cat << \SHAR_EOF > 'trade.c'
/*conquer : Copyright (c) 1988 by Ed Barlow.
 *  I spent a long time writing this code & I hope that you respect this.  
 *  I give permission to alter the code, but not to copy or redistribute
 *  it without my explicit permission.  If you alter the code, 
 *  please document changes and send me a copy, so all can have it.  
 *  This code, to the best of my knowledge works well,  but it is my first
 *  'C' program and should be treated as such.  I disclaim any
 *  responsibility for the codes actions (use at your own risk).  I guess
 *  I am saying "Happy gaming", and am trying not to get sued in the process.
 *                                                Ed
 */

/*
 *  The following file "trade.c" was written by Adam Bryant who
 *  gives all rights to this code to Ed Barlow provided that this
 *  message remains intact.
 */

/* thanks adam -- Ed */

/*	trade.c		*/

/*include files*/
#include "header.h"
#include "data.h"

#ifdef TRADE		

/* possible commodities */
#define TDGOLD   0
#define TDFOOD   1
#define TDIRON   2
#define TDJEWL   3
#define TDLAND   4
#define TDARMY   5
#define TDSHIP   6

/* constants and indicators */
#define	NUMPRODUCTS	7
#define	MAXITM	30
#define	SELL	0
#define	BUY	1
#define	NODEAL	2
#define	NOSALE	3
#define TRADECOST(cost)	((100-cost)/100)	/* twenty percent cost normal*/

extern short country;

char *commodities[NUMPRODUCTS] = { "Gold", "Food", "Iron", "Jewels",
		"Land", "Soldiers", "Ships"};
#ifdef ADMIN
char *tradefail[NUMPRODUCTS] = { "lack of gold", "lack of food",
	"lack of iron", "lack of jewels", "land not owned",
	"no available armies", "no available navies"};
#endif ADMIN
#ifdef CONQUER
/* Use this when you wish to sell something */
char *selllist[NUMPRODUCTS] = { "Sell how many gold talons? ", "Sell how much food? ",
	"Sell how much iron? ", "Sell how many jewels? ", "What X location? ",
	"How many soldiers? ", "How many ships? "};

/* Use this when you wish to place a bid something */
char *buylist[NUMPRODUCTS] = { "Bid how much gold? ", "Bid how much food? ",
	"Bid how much iron? ", "Bid how many jewels? ", " ",
	"Bid what army? ", "Bid how many ships? "};

void
trade()
{
	FILE *tfile;
	int count, done=FALSE, notopen=FALSE;
	int buysell, holdint, holdint2, extint, inloop;
	int type1[MAXITM], type2[MAXITM], deal[MAXITM], extra[MAXITM];
	int natn[MAXITM], itemnum, getland(), gettrade(), checkland();
	int tradable();
	long lvar1[MAXITM], lvar2[MAXITM], holdlong, holdlong2, armyvalue();
	void tradeerr(), setaside(), takeback();
	
	while (done==FALSE) {
		itemnum=0;
		done=TRUE;
		/* open trading file */
		if ((tfile=fopen(tradefile,"r")) == NULL ) {
			notopen=TRUE;
		}
		/* read in all of the data */
		while (notopen==FALSE && !feof(tfile)) {
			fscanf(tfile,"%d %d %d %d %ld %ld %d\n",&deal[itemnum],
				&natn[itemnum],&type1[itemnum],&type2[itemnum],&lvar1[itemnum],&lvar2[itemnum],&extra[itemnum]);
			if (deal[itemnum]==NOSALE) {
				/* remove item from sales list */
				deal[type1[itemnum]]=NOSALE;
			} else if (deal[itemnum]==SELL) {
				itemnum++;
			}
		}
		if (notopen==FALSE) fclose(tfile);
		clear();
		/* display header */
		standout();
		mvaddstr(0,27,"COMMODITIES EXCHANGE");
		standend();
		count=2;
		mvprintw(count,0,"    Nation\t\tItem\t\tMinimum Price");
		/* go through list of commodities */
		for (holdint=0;holdint<itemnum;holdint++) {
			if (deal[holdint]==SELL) {
				count++;
				mvprintw(count,0,"%2d) %-10s",
					holdint+1,
					ntn[natn[holdint]].name);

				if (type1[holdint]==TDLAND) {
					holdlong = (long) tofood(sct[(int)lvar1[holdint]][extra[holdint]].vegetation,0);
					mvprintw(count,20,"(food=%2ld) %s",
						holdlong,
						commodities[type1[holdint]]);
				} else {
					holdlong = lvar1[holdint];
					mvprintw(count,20,"%9ld %s",
						holdlong,
						commodities[type1[holdint]]);
				}
				mvprintw(count,40,"%9ld %s",
					lvar2[holdint],
					commodities[type2[holdint]]);
				if (count>16) {
					standout();
					mvaddstr(21,30,"Hit Any Key to Continue");
					standend();
					refresh();
					getch();
					clear();
					standout();
					mvaddstr(0,27,"COMMODITIES EXCHANGE");
					standend();
					mvprintw(2,0,"    Nation\t\tItem\t\tMinimum Price");
					count=3;
				}
			}
		}
		standout();
		count++;
		if (itemnum==0)	mvaddstr(count++,0,"Nothing to Buy.  Do you wish to (S)ell?");
		else mvaddstr(count++,0,"Do you wish to (B)uy, (S)ell, or (U)nsell?");
		standend();
		refresh();
		inloop=TRUE;
		while (inloop==TRUE) switch(getch()) {
		case 'b':
		case 'B':
			if (itemnum==0) break;
			buysell=BUY;
			mvaddstr(count++,0,"What item number do you want to purchase? ");
			refresh();
			holdint = get_number();
			if (holdint<1 || holdint>itemnum) {
				tradeerr("Invalid Item Number");
				return;
			}
			holdint--;
			if (deal[holdint]!=SELL) {
				tradeerr("Sorry, that item is not on the market.");
				return;
			}
			if (ntn[natn[holdint]].dstatus[country]==UNMET) {
				tradeerr("That nation has not been met by you");
				return;
			}
			if (ntn[natn[holdint]].dstatus[country]>HOSTILE) {
				tradeerr("That nation is not doing business with you");
				return;
			}
			/* obtain bid */
			mvprintw(count++,0,"%s",buylist[type2[holdint]]);
			refresh();
			holdlong2 = 0L;
			holdlong = (long) get_number();
			/* check for valid bid */
			switch(type2[holdint]) {
			case TDGOLD:
				if (holdlong < lvar2[holdint]) {
					tradeerr("You underbid the minimum.");
					buysell=NODEAL;
				} else if (holdlong > ntn[country].tgold) {
					tradeerr("Not Enough Gold");
					buysell=NODEAL;
				}
				break;
			case TDFOOD:
				if (holdlong < lvar2[holdint]) {
					tradeerr("You underbid the minimum.");
					buysell=NODEAL;
				} else if (holdlong > ntn[country].tfood) {
					tradeerr("Not Enough Food");
					buysell=NODEAL;
				}
				break;
			case TDIRON:
				if (holdlong < lvar2[holdint]) {
					tradeerr("You underbid the minimum.");
					buysell=NODEAL;
				} else if (holdlong > ntn[country].tiron) {
					tradeerr("Not Enough Iron");
					buysell=NODEAL;
				}
				break;
			case TDJEWL:
				if (holdlong < lvar2[holdint]) {
					tradeerr("You underbid the minimum.");
					buysell=NODEAL;
				} else if (holdlong > ntn[country].jewels) {
					tradeerr("Not Enough Jewels");
					buysell=NODEAL;
				}
				break;
			case TDLAND:
				mvaddstr(count++,0,"What Y position? ");
				refresh();
				holdlong2 = (long) get_number;
				if (checkland(BUY,(int)(holdlong),(int)(holdlong2))==NODEAL) {
					buysell=NODEAL;
				} else if (tofood(sct[(int)holdlong][(int)holdlong2].vegetation,natn[holdint]) < lvar2[holdint]) {
					tradeerr("You underbid the minimum");
					buysell=NODEAL;
				}
				break;
			case TDARMY:
				if ((int)holdlong > MAXARM) {
					tradeerr("Invalid Unit");
					buysell=NODEAL;
				} else if (tradable(country,(int)holdlong)==FALSE) {
					tradeerr("That unit type is non-tradable.");
					buysell=NODEAL;
				} else if (armyvalue(country,(int)holdlong) < lvar2[holdint]) {
					tradeerr("You underbid the minimum.");
					buysell=NODEAL;
				}
				break;
			case TDSHIP:
				if ((int)holdlong >= MAXNAVY) {
					tradeerr("Invalid Navy");
					buysell=NODEAL;
				} else if (ntn[country].nvy[(int)holdlong].merchant+ntn[country].nvy[(int)holdlong].warships < (int)lvar2[holdint]) {
					tradeerr("You underbid the minimum.");
					buysell=NODEAL;
				}
				break;
			default:
				tradeerr("Invalid Commodity");
				buysell=NODEAL;
				break;
			}
			if (buysell==BUY) {
				if ( (tfile = fopen(tradefile,"a+"))==NULL) {
					tradeerr("Error opening file for trading");
					abrt();
				}
				setaside(country,type2[holdint],holdlong);
				fprintf(tfile, "%d %d %d %d %ld %ld %d\n",BUY, country, holdint, 0, holdlong, holdlong2, 0);
				fclose(tfile);
			}
			return;
		case 's':
		case 'S':
			/* sell an item */
			/* only allow MAXITM on market */
			if (itemnum>=MAXITM) {
				standout();
				if (itemnum==0) mvaddstr(count++,0,"Market Congested.  Hit any key to continue");
				else mvaddstr(count++,0,"Market Congested.  (B)uy or any key to continue");
				standend();
				refresh();
				break;
			}
			buysell=SELL;
			holdint = gettrade("Selling",&count);
			if (holdint==(-1)) {
				tradeerr("Invalid Option");
				return;
			}

			mvprintw(count++,0,"%s",selllist[holdint]);
			refresh();
			/* find out how much commodities */
			holdlong = (long) get_number();
			extint = 0;
			if (holdint< TDLAND && holdlong==0L)
				return;

			/* check for valid items */
			switch(holdint) {
			case TDGOLD:
				if (holdlong > ntn[country].tgold) {
					tradeerr("Not Enough Gold");
					buysell=NODEAL;
				}
				break;
			case TDFOOD:
				if (holdlong > ntn[country].tfood) {
					tradeerr("Not Enough Food");
					buysell=NODEAL;
				}
				break;
			case TDIRON:
				if (holdlong > ntn[country].tiron) {
					tradeerr("Not Enough Iron");
					buysell=NODEAL;
				}
				break;
			case TDJEWL:
				if (holdlong > ntn[country].jewels) {
					tradeerr("Not Enough Jewels");
					buysell=NODEAL;
				}
				break;
			case TDLAND:
				mvprintw(count++,0,"What Y position? ");
				refresh();
				extint = get_number();
				buysell = checkland(SELL,(int)holdlong,extint);
				break;
			case TDARMY:
				if (holdlong>=MAXARM || ntn[country].arm[(int)holdlong].sold <= 0) {
					tradeerr("Invalid Army");
					buysell=NODEAL;
				} else if (tradable(country,(int)holdlong)==FALSE) {
					tradeerr("That unit is non-tradable.");
					buysell=NODEAL;
				}
				break;
			case TDSHIP:
				if (holdlong>=MAXNAVY || ntn[country].nvy[(int)holdlong].merchant + ntn[country].nvy[(int)holdlong].warships <= 0) {
					tradeerr("Invalid Navy");
					buysell=NODEAL;
				}
				break;
			default:
				tradeerr("Invalid Commodity");
				buysell=NODEAL;
				break;
			}
			/* invalid commodity */
			if (buysell==NODEAL) return;

			/* find out what they want in trade */
			holdint2 = gettrade("In Trade For",&count);
			if (holdint2==(-1)) {
				tradeerr("Invalid Option");
				return;
			}
			if (holdint2==TDLAND) {
				holdlong2 = (long) getland(&count);
				if (holdlong2==(-1L)) {
					tradeerr("Invalid Vegetation");
					return;
				}
			} else {
				/* find out for what value */
				mvprintw(count++,0,"Minimum %s",selllist[holdint2]);
				refresh();
				holdlong2 = (long) get_number();
				if (holdlong2 == 0L) return;
			}

			/* make sure what was bid is unusable */
			setaside(country,holdint,holdlong);

			/* set up output properly */
			if (holdint==TDARMY) {
				extint = (int) holdlong;
				holdlong = armyvalue(country,(int)holdlong);
			}
			else if (holdint==TDSHIP) {
				extint = (int)holdlong;
				holdlong = (long)(ntn[country].nvy[(int)holdlong].merchant + ntn[country].nvy[(int)holdlong].warships);
			}

			/* send it out */
			if ( (tfile = fopen(tradefile,"a+"))==NULL) {
				tradeerr("Error opening file for trading");
				abrt();
			}
			fprintf(tfile, "%d %d %d %d %ld %ld %d\n", SELL, country, holdint, holdint2, holdlong, holdlong2, extint);
			fclose(tfile);
			inloop=FALSE;
			done=FALSE;
			break;
		case 'u':
		case 'U':
			/* unsell an item */
			if (itemnum==0) break;
			mvaddstr(count++,0,"What item number to remove? ");
			refresh();
			holdint = get_number();
			if (holdint==0 || holdint>itemnum) {
				tradeerr("Invalid Item Number");
				return;
			}
			holdint--;
#ifdef OGOD
			/* allow god to remove commodities */
			if (country!=0 && country!=natn[holdint]) 
#else 
			if (country != natn[holdint]) 
#endif OGOD
			{
				tradeerr("That is not your item");
				return;
			}
			
			/* remove it from market */
			if ( (tfile = fopen(tradefile,"a+"))==NULL) {
				tradeerr("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]);
			/*redraw the commodities board so removal is seen*/
			inloop=FALSE;
			done=FALSE;
			break;
		default:
			/* return on no choice */
			return;
		}
	}
}

void
tradeerr(mesg)
char *mesg;
{
	clear_bottom(0);
	standout();
	mvaddstr(21,0,mesg);
	standend();
	mvaddstr(22,0,"Hit any key to continue");
	refresh();
	getch();
}

int
checkland(tradestat,xspot,yspot)
int tradestat,xspot,yspot;
{
	int newstat=tradestat;
	if (xspot < 0 || xspot > MAPX || yspot > MAPY || yspot < 0) {
		tradeerr("That is off the map");
		newstat=NODEAL;
	} 
	else if (sct[xspot][yspot].owner != country) {
		tradeerr("You don't own it");
		newstat=NODEAL;
	}
	else if (ntn[country].capx==xspot && ntn[country].capy==yspot) {
		tradeerr("That is your capitol");
		newstat=NODEAL;
	}
	else if (sct[xspot][yspot].designation == DCITY) {
		tradeerr("Towns may not be sold");
		newstat=NODEAL;
	}
	return(newstat);
}

/* get minimum foodvalue for land */
int
getland(count)
int *count;
{
	int	temp;
	char	entered;

	mvprintw((*count)++,0,"MINIMUM VEGETATION: %c, %c, %c, %c, %c, %c, %c, %c, %c, %c, %c or %c: ",
		VOLCANO,DESERT,TUNDRA,BARREN,LT_VEG,
		GOOD,WOOD,FOREST,JUNGLE,SWAMP,ICE,NONE);

	refresh();
	entered=getch();
	if(entered!=VOLCANO       &&entered!=JUNGLE
		&&entered!=DESERT &&entered!=TUNDRA
		&&entered!=BARREN &&entered!=LT_VEG
		&&entered!=NONE   &&entered!=GOOD
		&&entered!=WOOD   &&entered!=FOREST
		&&entered!=SWAMP  &&entered!=ICE) temp=(-1);
	else temp = tofood(entered,country);
	mvprintw((*count)++,0," JUST ENTERED %c so temp is %d", entered,temp);
	return(temp);
}

int
gettrade(saletype,count)
char *saletype;
int *count;
{
	int hold=(-1);

	mvprintw((*count)++,0,"%s: (G)old, (F)ood, (I)ron, (J)ewels, (L)and, (A)rmy, (S)hips?",saletype);
	refresh();
	switch(getch()) {
	case 'g':
	case 'G':
		hold=TDGOLD;
		break;
	case 'f':
	case 'F':
		hold=TDFOOD;
		break;
	case 'i':
	case 'I':
		hold=TDIRON;
		break;
	case 'j':
	case 'J':
		hold=TDJEWL;
		break;
	case 'l':
	case 'L':
		hold=TDLAND;
		break;
	case 'a':
	case 'A':
		hold=TDARMY;
		break;
	case 's':
	case 'S':
		hold=TDSHIP;
		break;
	default:
		break;
	}
	return(hold);
}

/* set aside things that are up for bid */
void
setaside(cntry,item,longval)
int cntry,item;
long longval;
{
	switch(item)
	{
	case TDGOLD:
		ntn[cntry].tgold -= longval;
		break;
	case TDFOOD:
		ntn[cntry].tfood -= longval;
		break;
	case TDIRON:
		ntn[cntry].tiron -= longval;
		break;
	case TDJEWL:
		ntn[cntry].jewels -= longval;
		break;
	case TDLAND:
		break;
	case TDARMY:
		ntn[cntry].arm[(int)longval].smove = 0;
		ntn[cntry].arm[(int)longval].stat = TRADED;
		break;
	case TDSHIP:
		/* use armynum to hold indicator */
		ntn[cntry].nvy[(int)longval].smove = 0;
		ntn[cntry].nvy[(int)longval].armynum = TRADED;
		break;
	}
}

/* regain things that are up for bid */
void
takeback(cntry,item,longval)
int cntry,item;
long longval;
{
	switch(item)
	{
	case TDGOLD:
		ntn[cntry].tgold += longval;
		break;
	case TDFOOD:
		ntn[cntry].tfood += longval;
		break;
	case TDIRON:
		ntn[cntry].tiron += longval;
		break;
	case TDJEWL:
		ntn[cntry].jewels += longval;
		break;
	case TDLAND:
		break;
	case TDARMY:
		ntn[cntry].arm[(int)longval].stat = DEFEND;
		break;
	case TDSHIP:
		/* use armynum to hold indicator */
		ntn[cntry].nvy[(int)longval].armynum = 0;
		break;
	}
}
#endif CONQUER

#ifdef ADMIN
/* give things that were purchased from cntry1 to cntry2 */
long
tradeit(cntry1,cntry2,item,longval,extra)
int cntry1,cntry2,item,extra;
long longval;
{
	int unitnum=(-1),unitcount=0;
	/* error for -1 returned */
	long returnval=(-1);
	switch(item)
	{
	case TDGOLD:
		returnval = longval;
		ntn[cntry1].tgold -= longval;
		ntn[cntry2].tgold += longval * TRADECOST(20);
		break;
	case TDFOOD:
		if (ntn[cntry1].tfood >= longval) {
			returnval = longval;
			ntn[cntry1].tfood -= longval;
			ntn[cntry2].tfood += longval * TRADECOST(20);
		}
		break;
	case TDIRON:
		if (ntn[cntry1].tiron >= longval) {
			ntn[cntry1].tiron -= longval;
			ntn[cntry2].tiron += longval * TRADECOST(20);
			returnval = longval;
		}
		break;
	case TDJEWL:
		if (ntn[cntry1].jewels >= longval) {
			ntn[cntry1].jewels -= longval;
			ntn[cntry2].jewels += longval * TRADECOST(20);
			returnval = longval;
		}
		break;
	case TDLAND:
		if (sct[(int)longval][extra].owner==cntry1) {
			sct[(int)longval][extra].owner = cntry2;
			returnval = longval;
		}
		break;
	case TDARMY:
		/* find army number for cntry2 */
		/* give army to cntry2 */
		while(unitnum==(-1)&&unitcount<MAXARM) {
			if (ntn[cntry2].arm[unitcount].sold<=0) {
				/* give army to cntry2 */
				ntn[cntry2].arm[unitcount].sold = ntn[cntry1].arm[extra].sold;
				ntn[cntry2].arm[unitcount].unittyp = ntn[cntry1].arm[extra].unittyp;
				ntn[cntry2].arm[unitcount].xloc = ntn[cntry2].capx;
				ntn[cntry2].arm[unitcount].yloc = ntn[cntry2].capy;
				ntn[cntry2].arm[unitcount].stat = DEFEND;
				ntn[cntry2].arm[unitcount].smove = 0;
				/* remove army from cntry1 */
				ntn[cntry1].arm[extra].sold = 0;
				ntn[cntry1].arm[extra].smove = 0;
				ntn[cntry1].arm[extra].stat = DEFEND;
				unitnum=unitcount;
			}
			unitcount++;
		}
		returnval=(long)unitnum;
		break;
	case TDSHIP:
		/* give navy to cntry1 */
		while(unitnum==(-1)&&unitcount<MAXARM){
			if (ntn[cntry2].nvy[unitcount].merchant+ntn[cntry2].nvy[unitcount].warships <= 0) {
				/* give navy to cntry2 */
				ntn[cntry2].nvy[unitcount].warships = ntn[cntry1].nvy[extra].warships;
				ntn[cntry2].nvy[unitcount].merchant = ntn[cntry1].nvy[extra].merchant;
				ntn[cntry2].nvy[unitcount].crew = ntn[cntry1].nvy[extra].crew;
				ntn[cntry2].arm[unitcount].xloc = ntn[cntry1].nvy[extra].xloc;
				ntn[cntry2].arm[unitcount].yloc = ntn[cntry1].nvy[extra].yloc;
				ntn[cntry2].nvy[unitcount].armynum = 0;
				ntn[cntry2].nvy[unitcount].smove = 0;
				/* remove navy from cntry1 */
				ntn[cntry1].nvy[extra].smove = 0;
				ntn[cntry1].nvy[extra].merchant = 0;
				ntn[cntry1].nvy[extra].warships = 0;
				ntn[cntry1].nvy[extra].crew = 0;
				ntn[cntry1].nvy[extra].armynum = 0;
				unitnum=unitcount;
			}
			unitcount++;
		}
		returnval=(long)unitnum;
		break;
	}
	return(returnval);
}

long
gettval(cntry1,cntry2,type,longval,extint)
int cntry1, cntry2, extint;
long longval;
{
	int returnval=(-1);
	long armyvalue();

	switch(type) {
	case TDGOLD:
	case TDFOOD:
	case TDIRON:
	case TDJEWL:
		returnval=longval;
		break;
	case TDLAND:
		if (cntry2!=sct[(int)longval][extint].owner)
		returnval=(long)tofood(sct[(int)longval][extint].vegetation,cntry1);
		break;
	case TDARMY:
		if (armyvalue(cntry2,extint)>0)
		returnval=armyvalue(cntry2,extint);
		break;
	case TDSHIP:
		if (ntn[cntry2].nvy[extint].merchant+ntn[cntry2].nvy[extint].warships>0)
		returnval=(long)(ntn[cntry2].nvy[extint].merchant+ntn[cntry2].nvy[extint].warships);
		break;
	}
	return(returnval);
}

/* this function sends detailed message to players */
/* upon completion of a trade */
void
trademail(cntry1,cntry2,item1,item2,lvar1,lvar2,lvar3,lvar4)
int cntry1,cntry2,item1,item2;
long lvar1,lvar2,lvar3,lvar4;
{
	FILE *fp[2];
	int count;
	char cname[2][12],filename[2][80];

	sprintf(filename[0],"%s%d",msgfile,cntry1);
	sprintf(filename[1],"%s%d",msgfile,cntry2);
	strcpy(cname[0],ntn[cntry1].name);
	strcpy(cname[1],ntn[cntry2].name);

	if ((fp[0]=fopen(filename[0],"a+"))==NULL) {
		printf("error opening <%s>\n",filename[0]);
		abrt();
	}
	if ((fp[1]=fopen(filename[1],"a+"))==NULL) {
		printf("error opening <%s>\n",filename[1]);
		abrt();
	}

	for (count=0;count<2;count++) {
		fprintf(fp[count],"%s Message to %s from Conquer Commerce Commision\n",cname[count],cname[count]);
		fprintf(fp[count],"%s \n",cname[count]);
		fprintf(fp[count],"%s   Trade transaction between %s and %s completed.",cname[count],cname[0],cname[1]);
		if (item1<=TDJEWL)
		fprintf(fp[count],"%s       Nation %s receives %ld %s\n",cname[count],cname[0],lvar1,commodities[item1]);
		else if (item1==TDLAND)
		fprintf(fp[count],"%s       Nation %s receives sector %ld, %ld\n",cname[count],cname[0],lvar1,lvar2);
		else if (item1==TDARMY)
		fprintf(fp[count],"%s       Nation %s receives army #%ld\n",cname[count],cname[0],lvar1);
		else if (item1==TDSHIP)
		fprintf(fp[count],"%s       Nation %s receives navy #%ld\n",cname[count],cname[0],lvar1);
		if (item2<=TDJEWL)
		fprintf(fp[count],"%s       Nation %s receives %ld %s\n",cname[count],cname[1],lvar3,commodities[item2]);
		else if (item1==TDLAND)
		fprintf(fp[count],"%s       Nation %s receives sector %ld, %ld\n",cname[count],cname[1],lvar3,lvar4);
		else if (item1==TDARMY)
		fprintf(fp[count],"%s       Nation %s receives army #%ld\n",cname[count],cname[1],lvar3);
		else if (item1==TDSHIP)
		fprintf(fp[count],"%s       Nation %s receives navy #%ld\n",cname[count],cname[1],lvar3);
		fclose(fp[count]);
	}
}
#endif ADMIN

/* routine to determine whether or not an army type is tradable */
int
tradable(cntry,armynum)
int cntry,armynum;
{
	int oldcntry=country,returnval=FALSE;
	country=cntry;
	if ( ATYPE==A_MERCENARY || ATYPE==A_SEIGE || ATYPE==A_CATAPULT
		|| ATYPE==A_ELEPHANT || ATYPE>=MINMONSTER) returnval=TRUE;
	country=oldcntry;
	return(returnval);
}

/* routine to determine commercial value of army */
long armyvalue(cntry,unit)
int cntry,unit;
{
#ifdef CONQUER
	extern int unitattack[];
#endif CONQUER
	long returnval;
	
	returnval = ntn[cntry].arm[unit].sold*100 +
		ntn[cntry].arm[unit].sold * unitattack[ntn[cntry].arm[unit].unittyp%100];
	if (ntn[cntry].arm[unit].unittyp >= MINMONSTER) returnval+=ntn[cntry].arm[unit].sold*10;
	returnval/=100;
	return(returnval);
}

void
uptrade()
{
	FILE *tfile;
	int count, itemnum=0, natn[MAXITM];
	int type1[MAXITM], type2[MAXITM], deal[MAXITM], extra[MAXITM];
#ifdef ADMIN
	extern FILE *fnews;
	void trademail();
	int whobuy[MAXITM];
	long tradeit(), buy1[MAXITM], buy2[MAXITM];
	long price[MAXITM], gettval(), longval1, longval2;
#endif ADMIN
	long lvar1[MAXITM], lvar2[MAXITM];
#ifdef CONQUER
	void setaside(),takeback();
#endif CONQUER

	/* initialize purchase list */
	for (count=0; count<MAXITM; count++) {
		deal[count]=(-1);
#ifdef ADMIN
		whobuy[count]=(-1);
		price[count]=(-1);
#endif ADMIN
	}
	/* open trading file */
	if ((tfile = fopen(tradefile,"r")) == NULL) {
		/* no commodities - no transactions */
		return;
	}
	/* read in all of the transactions */
	while(!feof(tfile)) {
		fscanf(tfile,"%d %d %d %d %ld %ld %d\n",&deal[itemnum],
			&natn[itemnum],&type1[itemnum],&type2[itemnum],&lvar1[itemnum],&lvar2[itemnum],&extra[itemnum]);
		if (deal[itemnum]==NOSALE) {
			/* remove item from sales list */
			deal[type1[itemnum]]=NOSALE;
#ifdef CONQUER
			if (natn[itemnum]==country) takeback(country,type1[type1[itemnum]],lvar1[type1[itemnum]]);
#endif CONQUER
		} else if (deal[itemnum]==SELL) {
			itemnum++;
#ifdef CONQUER
			if (natn[itemnum]==country) setaside(country,type2[itemnum],lvar1[itemnum]);
#endif CONQUER
		} else if (deal[itemnum]==BUY) {
#ifdef ADMIN
			if (deal[type1[itemnum]]==SELL) deal[type1[itemnum]]==BUY;
			/* check for highest price for item */
			if (price[type1[itemnum]]<gettval(natn[type1[itemnum]],natn[itemnum],type2[type1[itemnum]],lvar1[itemnum],(int)lvar2[itemnum])) {
				price[type1[itemnum]]=gettval(natn[type1[itemnum]],natn[itemnum],type2[type1[itemnum]],lvar1[itemnum],(int)lvar2[itemnum]);
				buy1[type1[itemnum]]=lvar1[itemnum];
				buy2[type1[itemnum]]=lvar2[itemnum];
				whobuy[type1[itemnum]]=natn[itemnum];
			}
#endif ADMIN
#ifdef CONQUER
			if (natn[itemnum]==country) setaside(country,type2[type1[itemnum]],lvar1[itemnum]);
#endif CONQUER
		}
	}
	fclose(tfile);
#ifdef ADMIN
	/* reopen the file for unsold commodities */
	if ((tfile=fopen(tradefile,"w")) == NULL) {
		/* error on opening file */
		printf("Error opening <%s> for trade update\n",tradefile);
		abrt();
	}

	/* compute the trading */
	for (count=0;count<itemnum;count++) {
		if (deal[count]==SELL)
			/* adjust the displayed value */
			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]);
		else if (deal[count]==BUY) {
			/* do the trading */
			longval1 = tradeit(natn[count],whobuy[count],type1[count],lvar1[count],extra[count]);
			if (longval1!=(-1)) longval2 = tradeit(whobuy[count],natn[count],type2[count],buy1[count],(int)buy2[count]);
			if (longval1==(-1)) {
				/* abort due to seller */
				fprintf(fnews,"2.\tTrade between %s and %s breaks down due to %s.",
					ntn[natn[count]].name,ntn[whobuy[count]].name,tradefail[type1[count]]);
			} else if (longval2==(-1)) {
				/* abort due to buyer */
				tradeit(whobuy[count],natn[count],type1[count],longval1,extra[count]);
				fprintf(fnews,"2.\tTrade between %s and %s breaks down due to %s.",
					ntn[whobuy[count]].name,ntn[natn[count]].name,tradefail[type2[count]]);
				/* place it on the list for next turn */
				/* adjust the displayed value */
				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 {
				/* trade completed send mail */
				fprintf(fnews,"2.\tNation %s sells %s to %s for %s"
					,ntn[natn[count]].name,commodities[type1[count]],ntn[whobuy[count]].name,commodities[type2[count]]);
				trademail(natn[count],whobuy[count],type1[count],
					type2[count],longval1,(long)extra[count],
					longval2,buy2[count]);
			}
		}
	}
	fclose(tfile);
#endif ADMIN
}
#endif TRADE
SHAR_EOF
if test 25421trade.c != `wc -c trade.c | sed -e s/\ //g`
then
	echo shar: error transmitting "'trade.c'" '(should have been 25421trade.c characters)' | sed -e s/X/\ /g
fi
fi