#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define G6_LONGEST_ROW	200
#define G6_TOX_NUM 		  8

/*	paramaeters:
		pai_num = player number + ai number
	returns:
		1 on success*/
int gamefile_copy(FILE *pgf,FILE *psf,int pnum,int aipp)
{
	char s[G6_LONGEST_ROW+1];

	rewind(pgf);

	while (fgets(s,G6_LONGEST_ROW,pgf))
	{
		if (s[0]=='[' && strncmp("[map]",s,5)==0)
			break;

		if (strncmp("min_players",s,11)==0)
			fprintf(psf,"min_players=%d\n",pnum);

		else if (strncmp("max_players",s,11)==0)
			fprintf(psf,"max_players=%d\n",pnum*(1+aipp));

		else if (strncmp("aifill",s,6)==0)
			fprintf(psf,"aifill=%d\n",pnum*(1+aipp));

		else if (strncmp("server_state",s,12)==0)
			fprintf(psf,"server_state=0\n");

		else if (strncmp("nplayers",s,8)==0)
			fprintf(psf,"nplayers=0\n");

		else if (strncmp("options",s,7)==0)
			fprintf(psf,"options=\"1.7 startoptions spacerace rulesets startpos riversoverlay\"\n");

		else
			fprintf(psf,"%s",s);
	}

	return 1;
}

int mapsettings_copy(FILE *pmf,FILE *psf,char *s,int pnum)
{
	/* "width" MUST be the first string !!! , see later */
	char tox[G6_TOX_NUM][15]={	"width","ritches","swampsize","deserts",
							"riverlength","mountains","forestsize","huts"	};
	int toxlen[G6_TOX_NUM];
	int i,setted,width;

	for (i=0;i<G6_TOX_NUM;i++)
		toxlen[i]=strlen(tox[i]);

	while (strncmp("r0sx",s,4))
	{
		setted=0;

		if (strncmp("generator",s,9)==0)
		{
			setted=1;
			fprintf(psf,"generator=0\n");
		}

		for (i=0;i<G6_TOX_NUM;i++)
			if (strncmp(tox[i],s,toxlen[i])==0)
			{
				setted=1;
				fprintf(psf,"%s=%d\n",tox[i],atoi(s+toxlen[i]+1)*pnum);
				if (i==0)																/* !!! */
					width=atoi(s+toxlen[i]+1);
				break;
			}

		if (!setted)
			fprintf(psf,"%s",s);

		fgets(s,G6_LONGEST_ROW,pmf);
	}


	return width;
}

int playerpoz_copy(FILE *pmf,FILE *psf,char *s,int pnum,int aipp,int width)
{
	char t[10],c;
	int *p,l,i,j;

	p=(int *) malloc(sizeof(int)*(1+aipp)*2);
	if (!p)
		return 0;

	for (i=0;i<1+aipp;i++)
	{
		l=sprintf(t,"r%dsx",i);
		if (strncmp(t,s,l)==0)
			p[i*2]=atoi(strchr(s+4,'=')+1);

		fgets(s,G6_LONGEST_ROW,pmf);

		l=sprintf(t,"r%dsy",i);
		if (strncmp(t,s,l)==0)
			p[i*2+1]=atoi(strchr(s+4,'=')+1);

		fgets(s,G6_LONGEST_ROW,pmf);
	}

	for (i=0;i<1+aipp;i++)
		for (j=0;j<pnum;j++)
		{
			fprintf(psf,"r%dsx=%d\n",i*pnum+j,p[i*2]+j*width);
			fprintf(psf,"r%dsy=%d\n",i*pnum+j,p[i*2+1]);
		}

	free(p);

	return 1;
}

int terrain_copy(FILE *pmf,FILE *psf,char *s,int pnum,int width)
{
	char *t;
	int i;

	if (strncmp("t000",s,4)==0)
		fseek(pmf,-G6_LONGEST_ROW,SEEK_CUR);

	t=(char *) malloc(sizeof(char)*(width+10));
	if (!t)
		return 0;

	while (strncmp("t000",t,4)!=0)
		fgets(t,width+10,pmf);

	while (t[0]!='\n')
	{
		t[width+6]='\0';
		fprintf(psf,"%s",t);

		for (i=1;i<pnum;i++)
			fprintf(psf,"%s",t+6);

		fprintf(psf,"\"\n");

		fgets(t,width+10,pmf);
	}

	free(t);

	return 1;
}

/*	paramaeters:
		pnum = player number
		aipp = AI/player
	returns:
		1 on success*/
int mapfile_copy(FILE *pmf,FILE *psf,int pnum,int aipp)
{
	int width;
	char s[G6_LONGEST_ROW+1];

	rewind(pmf);

	s[0]='\0';
	while (s[0]!='[' || strncmp("[map]",s,5))
		fgets(s,G6_LONGEST_ROW,pmf);

	width=mapsettings_copy(pmf,psf,s,pnum);
	playerpoz_copy(pmf,psf,s,pnum,aipp,width);
	terrain_copy(pmf,psf,s,pnum,width);

	return 1;
}

/* args:
		1 - mapfile (get game settings and map from this file)
		2 - scenariofile (output)
		3 - player number
		4 - ai/player*/
int main(int argnum,char **args)
{
	int i,j;
	FILE *pmf,*psf;

	if (argnum<5)
	{
		printf("To use this program plese give the parameters in the following order\n\n");
		printf("  name of input file\n  name of output file\n");
		printf("  player number\n  ai/player\n\nExample:\n\n");
		printf("  % a.out civgame-in.sav civgame-out.sav 3 1\n\n");
		printf("Be careful the map width will be multiplied with player count : )");
		printf(" (c) Zoltán Lakatos, distributed under GPL\n");

		return 0;
	}

	i=atoi(args[3]);
	j=atoi(args[4]);

	if (i<1) i=1;
	if (j<0) j=0;
	j=0; /* the placement with AIs works not good enough*/

	pmf=fopen(args[1],"rb");
	psf=fopen(args[2],"wb");
	if (!pmf || !psf)
	{
		fclose(psf);
		fclose(pmf);
		printf("File open error\n");
		return 0;
	}

	gamefile_copy(pmf,psf,i,j);
	mapfile_copy(pmf,psf,i,j);

	fclose(psf);
	fclose(pmf);

	return 0;
}
