#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <file_dlg.h>
#include <egb.h>
#include <mos.h>
#include <snd.h>
#include <wav.h>
#include <guidbg.h>
#include "wavhime.h"

char	*guiEgbPtr ;			/*	EGB のワークアドレス	*/

/*	アラートメッセージ						*/
static char	*alertStrMem[] = 
				{"WAVE版 音姫七変化：\nメモリが不足しています", "確認"};

/*	checkMemFunc関数／alertMemFunc関数の追い越し禁止フラグ	*/
static int		checkMemFlag = 0x00 ;

/****************************************************************/
/*	メモリ不足時のアラート関数（イベント登録関数）				*/
/****************************************************************/
void alertMemFunc()
{
	/*	メモリ不足のアラート表示	*/
	MMI_CallMessage(MMI_GetApliId(), GM_ALERT, 
						AM_ALERT1 | AM_ALERTB0E,(int)alertStrMem) ;

	/* checkMemFunc関数/alertMemFunc関数の追い越し禁止解除	*/
	checkMemFlag &= 0xef ;
}

/****************************************************************/
/*	メモリ開放関数												*/
/****************************************************************/
int checkMemFunc(useMem)
int	useMem ;
{
	int		ret ;

	/*	メモリチェック					*/
	if(TL_checkMemory(1) * 4096 >= useMem)
		return NOERR ;		/*	メモリがあれば正常復帰		*/

	do
	{
		/*	メモリ開放処理				*/
		ret = MMI_CallMessage(MMI_GetApliId(), GM_PURGE, 0, 0) ;

		/*	メモリチェック				*/
		if(TL_checkMemory(1) * 4096 >= useMem)
			break ;
	} while(ret == NOERR) ;

	return	ret ;
}


/****************************************************************/
/*	Townsシェル呼び出し関数										*/
/****************************************************************/
int userFunc(aplId, messId, info, data)
int		aplId ;
int		messId ;
int		info ;
int		data ;
{
	extern int wakeSet() ;
	extern int sleepSet() ;
	extern int quitFunc2() ;

	register int	ret ;
	int				sw ;
	POOLDATA		*ptr ;

	ret = ILLEGAL_FUNCTION ;

	switch (messId)
	{
		case	GM_WAKE :
		{
			EVENT	ev ;

			/*	checkMemFunc関数の追い越し禁止判定			*/
			if(checkMemFlag & 0x01)
				break ;

			/*	動作メモリのチェック						*/
			/*	checkMemFunc関数の追い越し禁止		*/
			checkMemFlag |= 0x01 ;
			if(checkMemFunc(MinMem) != NOERR)
			{
				/*	alertMemFunc関数の追い越し禁止	*/
				checkMemFlag |= 0x10 ;
				/*	メモリ不足の場合はアラート処理関数をイベント登録する	*/
				MMI_FlushEvnt() ;
				ev.what = EVEXEC ;
				ev.shift = 0 ;
				ev.info = (int)alertMemFunc ;
				MMI_SetEvnt(&ev) ;
				break ;
			}

			/*	サウンドの初期化	*/
			WAV_init() ;            //  WAVEライブラリの初期化

			wakeSet() ;
			break ;
		}

		case	GM_SLEEP :
		{
			/* alertMemFunc関数がイベント登録されてなければ、checkMemFunc関数
				の追い越し禁止解除											*/
			if((checkMemFlag & 0x10) == 0x00)
				checkMemFlag &= 0xfe ;

			/*	サウンドの終了	*/
		    WAV_end() ;             //  WAVEライブラリの終了

			sleepSet() ;
			break ;
		}

		case	GM_QUIT :
		{
			ret = quitFunc2() ;
			break ;
		}

	}
	return ret ;

}

void main( ac, av )
char ac,*av[];
{
	extern int APL_init() ;
	extern int startSet() ;	/* buffer確保その他の関数 */

	MMICTRL ctrl ;
	int kobj ;

	/*	初期化処理	*/
	ctrl.page0 = 3 ;
	ctrl.page1 = 3 ;
	ctrl.writePage = 0 ;
	ctrl.displayPage = 1 ;
	ctrl.priority = 0 ;
	ctrl.mode = 0 ;
	ctrl.width = 512 ;
	ctrl.size = 0 ;
	ctrl.ptr = NULL ;
	ctrl.asize = 0 ;
	ctrl.aptr = NULL ;
	ctrl.fr.lupx = 0 ;
	ctrl.fr.lupy = 0 ;
	ctrl.fr.rdwx = 639 ;
	ctrl.fr.rdwy = 479 ;
	ctrl.move.lupx = 0 ;
	ctrl.move.lupy = 20 ;	/*	ダイアログの移動範囲に制限を付ける(y座標)	*/
	ctrl.move.rdwx = 639 ;
	ctrl.move.rdwy = 479 ;
	ctrl.white = 15 ;
	ctrl.black = 8 ;		/*	パレット変更に伴いGUIの表示色を変更(黒)		*/
	ctrl.gray = 7 ;			/*	             〃                    (灰色)	*/
	ctrl.xor = 7 ;			/*	             〃                    (反転色)	*/

	/*	サウンドの初期化	*/
	WAV_init() ;            //  WAVEライブラリの初期化

	/*	二重起動のチェック		*/
	kobj = MMI_CallMessage(MMI_GetApliId(),	GM_QUERYID, QM_KIND, 1) ;

	if( kobj > NOERR )	/* 自分自身を消す */
	{
		MMI_CallMessage(MMI_GetApliId(), GM_SWITCH, FALSE, kobj) ;
	}
	/*	初期化処理				*/
	else if(MMI_Open(&ctrl) == NOERR)
	{
		/*	サウンドの初期化	*/
//		WAV_init() ;            //  WAVEライブラリの初期化

		/*	初期化に成功すればメインループに入る.	*/
		if (APL_init() == NOERR)
		{
			extern int tempFileSet( int, char **, char * ) ;

			/*	動作メモリのチェック	*/
			/*	checkMemFunc関数の追い越し禁止	*/
			checkMemFlag |= 0x01 ;
			if(checkMemFunc(MinMem) != NOERR)
			{
				/*	alertMemFunc関数の追い越し禁止	*/
				checkMemFlag |= 0x10 ;
				alertMemFunc();			/*	メモリ不足のアラート表示	*/
			}
			/*	checkMemFunc関数の追い越し禁止解除	*/
			checkMemFlag &= 0xfe ;


			FDG_SaveCurDir() ;		/*	カレントディレクトリ保存	*/
		    FDG_InitFileDlg() ;		/*	ファイルダイアログ初期化	*/

			char *ppath ; 		/* フルパス取得 */
			char path[80] ;
			ppath = ( char * )MMI_CallMessage(
					 MMI_GetApliId(), GM_QUERYID, QM_PATH, (int)path ) ;

			startSet() ;
			if( tempFileSet( ac, av, path ) == NOERR )	// テンポラリファイル
			{
				MMI_ExecSystem() ;		/*	メインのイベントループ		*/
			}

		    FDG_FreeFileDlg() ;		/*	ファイルダイアログ終了処理	*/
			FDG_RecovCurDir() ;		/*	カレントディレクトリ復元	*/

			MMI_SendMessage(MMI_GetSleepObj(), MM_SLEEP, 0) ;
			MMI_SetWakeObj(UNUSED);
		}

		/*	サウンドの終了	*/
//	    WAV_end() ;             //  WAVEライブラリの終了

		/*	終了処理				*/
		MMI_Close() ;
	}

	/*	サウンドの終了	*/
    WAV_end() ;             //  WAVEライブラリの終了

}

int APL_init()
{
	extern int		setPalette( char * ) ;	/*	パレット設定関数	*/
	extern int		mItemId[] ;

	extern MMIINIT	initDataIWVABOU ;
	extern MMIINIT	initDataIWVDSK ;
	extern MMIINIT	initDataIWVERR ;
	extern MMIINIT	initDataIWVMIX ;
	extern MMIINIT	initDataIWVPHA ;
	extern MMIINIT	initDataIWVREC ;
	extern MMIINIT	initDataIWVINF ;
	extern MMIINIT	initDataIWVECH ;
	extern MMIINIT	initDataIWVVIB ;
	extern MMIINIT	initDataIWVTRE ;
	extern MMIINIT	initDataIWVVOI ;
	extern MMIINIT	initDataIWVEXP ;
	extern MMIINIT	initDataIWVLEV ;
	extern MMIINIT	initDataIWVPCH ;
	extern MMIINIT	initDataIWVSMP ;
	extern MMIINIT	initDataIWVFAD ;
	extern MMIINIT	initDataIWVHAR ;
	extern MMIINIT	initDataIWVTRM ;
	extern MMIINIT	initDataIWVFFT ;

	register int	ret ;

	/*	EGB ワークアドレスの取得.	*/
	guiEgbPtr = MMI_GetEgbPtr() ;

	/*	ハイパ型部品の初期化			*/
	if ((ret = MMI_initHyper()) < 0)
		return ret ;
	/*	ダイアログ型部品の初期化		*/
	if ((ret = MMI_initDialogL40()) < 0)
		return ret ;
	/*	アラート型部品の初期化			*/
	if ((ret = MMI_initAlertL40()) < 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_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 ;
	/*	トグルアイコン型部品の初期化	*/
	if ((ret = MMI_initToggleIconL40()) < 0)
		return ret ;

//	/*	デフォルトビジュアルイフェクトの登録	*/
//	MMI_SetUpVisualEffect() ;

	/*	パレット変更 */
	ret = setPalette( guiEgbPtr ) ;

	/*	背景データの初期化						*/

	/*	データの登録		*/
	if ((ret = MMI_Init(&initDataIWVABOU)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataIWVDSK)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataIWVERR)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataIWVMIX)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataIWVPHA)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataIWVREC)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataIWVINF)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataIWVECH)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataIWVVIB)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataIWVTRE)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataIWVVOI)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataIWVEXP)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataIWVLEV)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataIWVPCH)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataIWVSMP)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataIWVFAD)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataIWVHAR)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataIWVTRM)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataIWVFFT)) < 0)
		return ret ;

	/*	タスクリストとサイドワークメニューを登録する	*/
	MMI_SetUpPrgMenu( mItemId[0], 2 ) ;
	MMI_SetUpSDKMenu( mItemId[0], 4 ) ;

	/*	呼び出し関数を登録する	*/
	MMI_SendMessage(MMI_GetBaseObj(), MM_SETEXEC, 1, userFunc) ;

	/*	アプリケーション名を登録する	*/
	MMI_CallMessage(MMI_GetApliId(), GM_TITLE, (int)"WAVE版 音姫七変化", 0) ;

	/*	背景を表示する							*/
	MMI_SendMessage(MMI_GetBaseObj(), MM_SHOW, 0) ;

	return NOERR ;
}

