[net.games.emp] Empire Playing Aids

jfw (02/17/83)

Here is my program "feedme", which takes a file containing a survey and
a census (which was the order of my "empstatus" command file), and
prints a note for each sector which is in danger of famine.  The
arguments do the following:

-s: self-sufficiency: print a note for every sector which is not
			self-sufficient.
-v: verbose: print a note for every sector which IS self-sufficient.

================================ feedme.c ================================

#include <stdio.h>

struct Sect {
	int x,y,sect,fert;
	struct Sect *next;
} *root,*last;

int verbose = 0, selfish = 0;


main(argc,argv)char **argv; {
	register int s,t;
	char buf[256];
	int x,y,sect,fert,food,c,m;
	
	while (--argc) {
		argv++;
		if (!strcmp(*argv,"-v"))
			verbose = 1;
		else if (!strcmp(*argv,"-s"))
			selfish = 1;
		else if (freopen(*argv,"r",stdin) == NULL) {
			perror(*argv);
			exit(-1);
		} else break;
	}
	/* hunt till "survey" */
	
	while (s = gets(buf)) {
		if (!strncmp(buf,"survey",6))
			break;
	}
	if (!s) {
		puts("EOF before \"survey\"");
		exit(-1);
	}
	
	/* skip 2 lines */
	
	gets(buf), gets(buf);
	
	/* read sector types and fertilities */
	
	while (s = gets(buf)) {
		if (buf[3] != ',') { /* not a report */
			if ((t = index(buf,'s')) && !strcmp(t,"sectors"))
				break;	/* end of data */
			else	continue; /* information*/
		}
		sscanf(buf, "%d,%d %c %*d%% %*d %*d %d",&x,&y,&sect,&fert);
		create(x,y,sect,fert);
	}
	if (!s)
	{
		fprintf(stderr,"EOF before end of data\n");
		exit(0);
	}
	/* hunt until "census" */
	
	while (s = gets(buf))
		if (!strncmp(buf,"census",6))
			break;
	if (!s) {
		puts("EOF before \"census\" found");
		exit(-1);
	}
	/* skip 2 lines */
	gets(buf), gets(buf);
	
	/* now, read each sector, checking against appropriate things */
	
	while (s = gets(buf)) {
		if (buf[3] != ',') { /* not a report */
			if ((t = index(buf,'s')) && !strcmp(t,"sectors"))
				break;	/* end of data */
			else	continue; /* information*/
		}
		sscanf(buf,"%d,%d %*s %*c %*d%% %*d %d %d %*d %*d %*d %*d %*d %*d %d",&x,&y,&c,&m,&food);
		check(x,y,c,m,food);
	}
	exit(0);
}

check(x,y,c,m,f) {
	/* algorithm:  find match for x,y.  perform following tests:
	 * self sufficiency:
	 *	non-agribusiness:
	 *		c + m <= fert && m <= 1.666 * c
	 *	agribusiness
	 *		c + m <= 5*fert && (fert-10)*c + (fert/5 - 10)*m >= 0
	 * imminent danger, if non-self-sufficient:
	 *	if (c + m)*.048 >= food, print warning of 1 day's notice
	 *	if (c + m)*.002 >= food, print FAMINE notice
	 */
	struct Sect *s;
	int des,fert;
	
	if (!(s = getsect(x,y))) {
		printf("sector %d,%d not surveyed\n",x,y);
		return;
	}
	des = s->sect;
	fert = s->fert;
	
	
	if (des == 'a') {
		if (c+m <= 5*fert &&
		    (fert-10)*c + (fert/5-10)*m >= 0) {
			if (verbose)
			printf("agribusiness at %d,%d self-sufficient\n",x,y);
			return;
		}
	} else if (c+m <= fert && 3*m <= 5*c) {
		if (verbose) printf("sector %d,%d self-sufficient.\n",x,y);
		return;
	}
	if ((c+m)*.048 >= (float)f) {
		if ((c+m)*.002 >= (float)f)
			printf("FAMINE imminent in %d,%d <%c>\n",x,y,des);
		else
			printf("Food shortage in %d,%d\n",x,y);
	}
	if (selfish) printf("Sector %d,%d not self-sufficient\n",x,y);
}

create(x,y,sect,f) {
	struct Sect *s;
	
	if (!(s = malloc(sizeof *s))) {
		printf("No Storage!\n");
		exit(-2);
	}
	if (!root)
		root = last = s;
	else
		last->next = s;
	s->x = x;
	s->y = y;
	s->sect = sect;
	s->fert = f;
	s->next = 0;
	last = s;
}

getsect(x,y) {
	struct Sect *s = root;
	
	while (s) {
		if (s->x == x && s->y == y)
			return(s);
		else
			s = s->next;
	}
	return(0);
}