#include <stdio.h>

/* Begin User Program Section */
#include <concorde.h>
#include "ysmacro.h"
#include "ysmaze2.h"
#include "mzedit.h"
#include "ysgui.h"
/* End User Program Section */

#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <xld.h>
#include <gui.h>

#ifdef EXG
#include <egb.h>
#include <guidbg.h>
#endif


char	*guiEgbPtr ;			/*	EGB のワークアドレス	*/

int	Intro = -1 ;
int	IntroMes[2] = -1 ;
int	IntroYs11Mark = -1 ;
int	mzAtrDia = -1 ;
int	mzAtrLy = -1 ;
int	mzAtrLx = -1 ;
int	mzAtrBl = -1 ;
int	mzAtrBh = -1 ;
int	mzAtrSet = -1 ;
int	mzAtrCancel = -1 ;
int	mzAtrMes[6] = -1 ;
int	Ys11Id = -1 ;
int	MenuBarDlg = -1 ;
int	MenuBar = -1 ;
int	pdFile = -1 ;
int	pdFileLst = -1 ;
int	pdFileLoad = -1 ;
int	pdFileSave = -1 ;
int	pdFileClear = -1 ;
int	pdFileNew = -1 ;
int	pdTw = -1 ;
int	pdTwLst = -1 ;
int	pdTwAbort = -1 ;
int	pdTwExit = -1 ;
int	pdWall = -1 ;
int	pdWallLst = -1 ;
int	pdWallN[10] = -1 ;
int	pdWallLine[2] = -1 ;
int	pdWallAuto = -1 ;
int	pdEtc = -1 ;
int	pdEtcLst = -1 ;
int	pdEtcSize = -1 ;
int	pdEtcLine = -1 ;
int	pdEtcEnter = -1 ;
int	exitBtn = -1 ;
int	InpOpeDlg = -1 ;
int	InpOpeMes = -1 ;
int	InpOpeToggle[2] ;
int	InputFloorNumDlg = -1 ;
int	InputFloorNumMsg = -1 ;
int	InputFloorNumBox = -1 ;
int	InputFloorNumSet = -1 ;
int	mazeWin = -1 ;
int	mazeWinBarV = -1 ;
int	mazeWinBarH = -1 ;
int	YesNoQuestion = -1 ;
int	YesNoQueMsg = -1 ;
int	YesNoQueYesBtn = -1 ;
int	YesNoQueNoBtn = -1 ;
int	YesNoQueYesMsg = -1 ;
int	YesNoQueNoMsg = -1 ;
int	Confirmation = -1 ;
int	ConfirmMsg = -1 ;
int	ConfirmBtn = -1 ;
int	ConfirmBtnMsg = -1 ;


#ifdef EXG
static int ShellCallFunc(int apId,int messId,int info,int data);
static void SetShellFunc();
#endif


int main(int ac,char *av[])
{
	MMICTRL ct;
	extern int APL_init() ;

	#ifndef EXG
	FM_SetVector() ;
	_XLD_init(0);
	_XLD_setMemFunc(TL_malloc,TL_free);
	#endif

	ct.page0=3;     /* Page0の画面モード3 */
	ct.page1=10;    /* Page1の画面モード10 */
	ct.writePage=0;    /* 書き込みページは0 (1番はCONCORDEが使うぜいっ) */
	ct.displayPage=1;  /* 表示ページは,とりあえず,Page0のみ */
	ct.priority=0;  /* 優先表示ページもPage0 */
	ct.mode=0;      /* 0は16色モードという意味らしいぞ */
	ct.width=512;   /* VRAM 1line分のバイト数だそうだ.(多分書き込みページ) */

	ct.size=0;      /* これでライブラリがメモリを勝手に初期化するらしい */
	ct.ptr=NULL;

	ct.asize=0;     /* アプリ管轄のメモリなんて使うと面倒だ */
	ct.aptr=NULL;

	ct.fr.lupx=0;   /* 画面枠は(0,0)-(639,479)だ */
	ct.fr.lupy=0;
	ct.fr.rdwx=639;
	ct.fr.rdwy=479;

	ct.move.lupx=-16384; /* 移動枠 */
	ct.move.lupy=    22;
	ct.move.rdwx= 16384;
	ct.move.rdwy= 16384;

	ct.white=15;    /* 白の色コードは15だぞ */
	ct.black=0;     /* 黒の色コードは0だぞ */
	ct.gray=7;      /* グレーの色コードは7だぞ */
	ct.xor=15;      /* 反転色は白と同じにするといいらしい */

	if (MMI_Open( &ct ) == NOERR)
	{
		/*	初期化に成功すればメインループに入る.	*/
		if (APL_init() == NOERR)
		{
			FDG_SaveCurDir();
			FDG_InitFileDlg();

			LoadFileCom(ac-1,av+1);

			MMI_ExecSystem() ;

			FDG_FreeFileDlg() ;
			FDG_RecovCurDir() ;
		}
	}

	MMI_Close() ;

	#ifndef EXG
	FM_ResetVector() ;
	#endif

	return 0;
}



int APL_init()
{
	extern MMIINIT	initDataMZATR ;
	extern MMIINIT	initDataMZEDIT ;
	extern MMIINIT	initDataMZWIN ;

	register int	ret ;

	/*	EGB ワークアドレスの取得.	*/
	guiEgbPtr = MMI_GetEgbPtr() ;
	EGB_tmenuPalette2(guiEgbPtr);

	/* Begin User Program Section */ 
	/* Caution:Delete Parts Initialize Area And Paste It! */
	if ((ret = MMI_initHyper()) < 0)return ret ;
	if ((ret = MMI_initDialogL40()) < 0)return ret ;
	if ((ret = MMI_initAlertL40()) < 0)return ret ;
	if ((ret = MMI_initWindowL40()) < 0)return ret ;
	if ((ret = MMI_initMessageL40()) < 0)return ret ;
	if ((ret = MMI_initMenuL40()) < 0)return ret ;
	if ((ret = MMI_initButtonL40()) < 0)return ret ;
	if ((ret = MMI_initDrawButtonL40()) < 0)return ret ;
	if ((ret = MMI_initIconL40()) < 0)return ret ;
	if ((ret = MMI_initToggleIconL40()) < 0)return ret ;
	if ((ret = MMI_initMenuItemL40()) < 0)return ret ;
	if ((ret = MMI_initScrollBarL40()) < 0)return ret ;
	if ((ret = MMI_initTextL40()) < 0)return ret ;
	if ((ret = MMI_initListMenuL40()) < 0)return ret ;
	if ((ret = MMI_initNumBoxL40()) < 0)return ret ;
	/* End User Program Section */ 

	/*	背景データの初期化						*/

	/*	データの登録		*/
	if ((ret = MMI_Init(&initDataMZATR)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataMZEDIT)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataMZWIN)) < 0)
		return ret ;

	/* Begin User Program Section */
	int i,evMask,exMask;
	extern int ActiveWin;
	extern MAZEWIN mzWin[MAZEWIN_NUM];

	WgbInitPrint12();

	for(i=0; i<MAZEWIN_NUM; i++)
	{
		mzWin[i].openflag=FALSE;
		mzWin[i].saveflag=TRUE;

		mzWin[i].win =
          MMI_SendMessage(mazeWin, MM_NEW, 0);
		mzWin[i].vbar =
		  MMI_SendMessage(mazeWinBarV, MM_NEW, 0);
		mzWin[i].hbar =
		  MMI_SendMessage(mazeWinBarH, MM_NEW, 0);

		mzWin[i].map.bl=MAZE_BLOCK_LEN;
		mzWin[i].map.bh=MAZE_BLOCK_HEI;
		mzWin[i].map.lx=MAZE_SIZE_X;
		mzWin[i].map.ly=MAZE_SIZE_Y;

		mzWin[i].map.map=
		  (short *)MALLOCFUNC(sizeof(short)*MAZE_SIZE_X_MAX*MAZE_SIZE_Y_MAX);

		if(mzWin[i].map.map==NULL)
		{
			return -1;
		}
	}

	evMask=MMI_GetEventMask();
	MMI_SetEventMask(EVALL);
	exMask=MMI_GetExecMask();
	MMI_SetExecMask(exMask | EVMOSMOVE | EVMOSDRAG);


	#ifdef EXG
	MMI_SetUpPrgMenu(pdTw,2);
	SetShellFunc();
	#endif

	MMI_SetUpSDKMenu(pdTw,-3);


	/*	背景を表示する							*/
	MMI_SendMessage(MMI_GetBaseObj(), MM_SHOW, 0) ;

	return NOERR ;
}


#ifdef EXG
static int ShellCallFunc(int apId,int messId,int info,int data)
{
	switch(messId)
	{
	case GM_QUIT:
		if(YsYesNoQuestion(Ys11Id,"終了しますか?","終了","まさか")==YSYES)
		{
			YsAbortGuiLoop();
		}
		return NOERR;
	default:
		return ILLEGAL_FUNCTION;
	}
}

static void SetShellFunc()
{
	int bas,app;

	bas=MMI_GetBaseObj();
	app=MMI_GetApliId();
	MMI_SendMessage(bas,MM_SETEXEC,1,ShellCallFunc);
	MMI_CallMessage(app,GM_TITLE,(int)"ＹｓＭａｚｅ２エディタ",0);
}

#endif
