/************************************************************************

		<< TEST GAME >>		++ Main Program ++

 ************************************************************************/

#include <stdio.h>
#include <sys/time.h>
#include <X11/keysym.h>

#include "ToolBox.h"
#include "map.h"
#include "External.h"
#include "Prototype.h"
#include "WindowSize.h"


/************************************************************************
		ϐ
 ************************************************************************/
GC bitmapGPort;			/* rbg}bvpfb	*/
GC pixmapGPort;			/* sNX}bvpfb	*/
GC viewerGPort;			/* Rcr[pfb		*/

int objectCounter = 0;
static int executeFlag = 1;

static struct timeval timebase;
static	int	timeCounter;


/************************************************************************
	EBhEʒɊJ悤ɍWݒ肷.
 ************************************************************************/

extern void SetCenterWindow(px,py,width,height)
int *px,*py,width,height;
{
	*px = (topLevel.window.width  - width ) / 2;
	*py = (topLevel.window.height - height) / 2;
}

/************************************************************************
	vȌI`FbN
 ************************************************************************/

extern void CheckQuitCAD(item)
MItemPtr item;
{
	static char *quitMessage = "Do you really want to quit ?";
	int px,py;

	SetCenterWindow(&px,&py,300,80);

	if (AlertDialog(px,py,300,80,1,2,1,&quitMessage) == 1) {
		executeFlag = 0;
	}
}

/************************************************************************
	OtBbNEReLXg쐬.
 ************************************************************************/

static void InitGraphicContext()
{
	bitmapGPort = XCreateGC(display,scaleUpPict,0,NULL);
	pixmapGPort = XCreateGC(display, mainWindow,0,NULL);
	viewerGPort = XCreateGC(display, mainWindow,0,NULL);

	XSetForeground(display,bitmapGPort,1);
	XSetBackground(display,bitmapGPort,0);

	XSetForeground(display,pixmapGPort,255);
	XSetBackground(display,pixmapGPort,  0);

	XSetForeground(display,viewerGPort,foreColor);
	XSetBackground(display,viewerGPort,backColor);
}

/************************************************************************
	gbvxEEBhEւ̃CxgsȂ.
 ************************************************************************/

static void TopLevelEvent(event,wcore)
XEventPtr event;
WCorePtr wcore;
{
	switch (event->type) {
	/*	case ConfigureNotify: ResetDesignWindowDefaultSize();	break;	*/
		case	 EnterNotify: ActiveColorMap(event);			break;
		case	 LeaveNotify: InactiveColorMap(event);			break;
	}
}

/************************************************************************
	gbvxEEBhEւ̃CxgsȂ.
 ************************************************************************/

static void InitTopLevelWindow()
{
	XSelectInput(display,mainWindow,StructureNotifyMask | KeyPressMask | EnterWindowMask | LeaveWindowMask);
	SetToplevelProc(TopLevelEvent);
}

/************************************************************************
	Get System time.
 ************************************************************************/
extern int
TickCount2(void)
{
	struct timeval tp;
	int sec,msec;

	gettimeofday(&tp,NULL);
	sec  = tp.tv_sec  - timebase.tv_sec;
	msec = tp.tv_usec / 1000;

	return(sec * 1000 + msec);
}

/**********************************************************************
	Initialize parameter for test.
 **********************************************************************/
static void
InitParameter(void)
{
	timeCounter = TickCount2();	
}

/************************************************************************
	Check key pressing.
 ************************************************************************/
static int
IsKeyPressed(char *keyvec, KeySym keysym)
{
	KeyCode code   = XKeysymToKeycode(display,keysym);
	int		keybit = (keyvec[code/8] >> (code&7)) & 0x01;

	return(keybit);
}	

/************************************************************************
	Scan Controller.
 ************************************************************************/
static int
ScanController(void)
{
	static int oldstat = 0;
	int  status,trigger;
	char keyvec[32];

	XQueryKeymap(display,keyvec);

	status  = IsKeyPressed(keyvec,XK_Control_L) << 7;
	status |= IsKeyPressed(keyvec,XK_Alt_L	  ) << 6;
	status |= IsKeyPressed(keyvec,XK_Escape	  ) << 4;
	status |= IsKeyPressed(keyvec,XK_Up		  ) << 3;
	status |= IsKeyPressed(keyvec,XK_Down	  ) << 2;
	status |= IsKeyPressed(keyvec,XK_Left	  ) << 1;
	status |= IsKeyPressed(keyvec,XK_Right	  ) << 0;
	trigger = (status ^ oldstat) & status;
	oldstat = status;
	return((trigger<<16) + status);

}

/************************************************************************
	Syncronize game frame.
 ************************************************************************/
static int
GameSyncro(void)
{
	int time,interval;

	while ((time = TickCount2()) < timeCounter+16);
	interval	= time - timeCounter;
	timeCounter = time;
	return(interval);
}


/************************************************************************
	C[`
 ************************************************************************/

int	INTERVAL = 0;

void main()
{

	int controller = 0;

	InitParameter();
										/* CEBhEI[v	*/
	InitToolBox("SAMPLE",10,10,MainWidth,MainHeight,defaultPIXEL,defaultBACK);	
	InitColors();						/* J[ݒ					*/
	InitPictures();			
	InitMenus();						/* j[̏ݒ				*/

	InitGameWindow();					/* Q[ʏݒ				*/
	InitMeterWindow();					/* [^ʏݒ				*/
	InitGame();							/* Q[ݒ					*/

	InitTopLevelWindow();

										/* C[v						*/
	while ((controller & 0x10) == 0) {
		MainGame(controller);			/*	Q[C[`			*/
		controller = ScanController();	/*	Rg[[̓ǂݍ		*/
		INTERVAL = GameSyncro();		/*	WAIT NMI						*/
	}

}

