//////////////////////////////////////////////////////////////////////////////
// tb2ngpc.cpp                                                              //
//////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
// Includes                                                                 //
//////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//////////////////////////////////////////////////////////////////////////////
// Defines                                                                  //
//////////////////////////////////////////////////////////////////////////////
#define X1(data,from,to)	(((data>>from)&1)<<to)
#define X3(data,from,to)	(((data>>from)&7)<<to)
#define X4(data,from,to)	(((data>>from)&15)<<to)

//////////////////////////////////////////////////////////////////////////////
// Variables                                                                //
//////////////////////////////////////////////////////////////////////////////
char s[256];
char *prefix;
char *prefix_out;

//////////////////////////////////////////////////////////////////////////////
// DoMap                                                                    //
//////////////////////////////////////////////////////////////////////////////
int DoMap()
{
	sprintf(s, "%sMAPBG.bin", prefix);
	FILE *fTile = fopen(s, "rb");
	if (!fTile) { printf("Error opening %s!\n", s); return -1; }
	
	sprintf(s, "%sMAPABG.bin", prefix);
	FILE *fAttr = fopen(s, "rb");
	if (!fAttr) { printf("Error opening %s!\n", s); return -1; }
	
	sprintf(s, "outputSCR.bin");
	FILE *fo = fopen(s, "wb");
	if (!fo) { printf("Error opening %s!\n", s); return -1; }

	while (1)
	{
		int tile = fgetc(fTile);
		int attr = fgetc(fAttr);
		if (tile == EOF) break;

		int chr = tile;
		int prop = X1(attr,3,0) + X3(attr,0,1) + X1(attr,6,6) + X1(attr,5,7);
		// lost priority flag, unused K1GE palette code
		fputc(chr, fo);
		fputc(prop, fo);
	}
	
	fclose(fTile);
	fclose(fAttr);
	fclose(fo);
	return 0;
}

//////////////////////////////////////////////////////////////////////////////
// DoTiles                                                                  //
//////////////////////////////////////////////////////////////////////////////
int DoTiles(int tileset=0)
{
	sprintf(s, "%sBG%c.bin", prefix, tileset?'1':'0');
	FILE *fTiles = fopen(s, "rb");
	if (!fTiles) { printf("Error opening %s!\n", s); return -1; }

	sprintf(s, "outputTILES.bin");
	FILE *fo = fopen(s, tileset?"ab":"wb");
	if (!fo) { printf("Error opening %s!\n", s); return -1; }

	while (1)
	{
		unsigned short w;
		if (fread(&w, 2, 1, fTiles) == 0) break;
		
		w =
		(
			X1(w,0,0)	+ X1(w,8,1)		+ X1(w,1,2)		+ X1(w,9,3)		+
			X1(w,2,4)	+ X1(w,10,5)	+ X1(w,3,6)		+ X1(w,11,7)	+
			X1(w,4,8)	+ X1(w,12,9)	+ X1(w,5,10)	+ X1(w,13,11)	+
			X1(w,6,12)	+ X1(w,14,13)	+ X1(w,7,14)	+ X1(w,15,15)
		);
		
		fwrite(&w, 2, 1, fo);
	}
	
	fclose(fTiles);
	fclose(fo);
	return 0;
}

//////////////////////////////////////////////////////////////////////////////
// DoPalettes                                                               //
//////////////////////////////////////////////////////////////////////////////
int DoPalettes()
{
	sprintf(s, "%sBCPD.bin", prefix); 
	FILE *fPal = fopen(s, "rb");
	if (!fPal) { printf("Error opening %s!\n", s); return -1; }
	
	sprintf(s, "outputPAL.bin");
	FILE *fo = fopen(s, "wb");
	if (!fo) { printf("Error opening %s!\n", s); return -1; }
	
	while (1)
	{
		unsigned short w;
		if (fread(&w, 2, 1, fPal) == 0) break;
		
		w = X4(w,1,0) + X4(w,6,4) + X4(w,11,8);
		
		fwrite(&w, 2, 1, fo);
	}

	fclose(fPal);
	fclose(fo);
	return 0;
}

//////////////////////////////////////////////////////////////////////////////
// main                                                                     //
//////////////////////////////////////////////////////////////////////////////
int main(int argc, char *argv[])
{
	// title/syntax
	printf("Tilebuddy to NGPC gfx converter v1.00 by Rafael Vuijk (aka Dark Fader)\n");
	if (argc < 2) { printf("Syntax: %s <tilebuddy_prefix> [converted_prefix]\n", argv[0]); return -1; }

	// use arguments
	prefix_out = prefix = argv[1];
	if (argc >= 3) prefix_out = argv[2];

	// convert!
	DoMap();
	DoPalettes();
	DoTiles(0);
	DoTiles(1);

	return 0;
}
