//*************************************************************************************************
//	File Name名	: Main.java
//	Theme	: Ragnarekkr Work
//	History
//	'94/11/04	J.Mukai	COMM.H/WORK.ASM
//	'04/09/29	H.Kuwata	java coding
//*************************************************************************************************

//=================================================================================================
//	Inport
//=================================================================================================

//=================================================================================================
//	Section																Class Definition
//=================================================================================================
public	class	Main	extends Thread
{
	static	Mouse	mouse;
	static	WMap	wmap;
	boolean		quit_thread	=	false;

	Main()
	{
		mouse	=	new	Mouse();
		wmap	=	new WMap();			// World Map
	}

	void	closeMain()
	{
		quit_thread	=	true;
	}

	/*
	 * @see java.lang.Runnable#run()
	 */
	public	void	run()
	{
		mouse.MOUSE_ENTRY_INIT();	// Reset the Mouse Drawing Entry Ptr to default.

		//VRTC_ST
		//KEY_ST

		//VOPEN
		Ragna.init.DATA_STANDBY();
		//MOUSE_INT		; マウス の初期化
		Vram.ACT_();

		do {
			Mouse.MOUSE_PATTRN( Work.MS_DEF, 0 );			// Definition for Mouse Pattern

			Work.NOW_MODE = Work.MODE_WMAP;			// Mode = World-Map

			Tos._SYS( 240 );					// BOOT Talk Message
			if ( Tos._BIT( 14 ) != 0 ) {
				Menu.menu.LOAD_BOOT();
				if ( Work.LOADED != 0 ) {
					Tos.BIT_SET( 13 );
				} else {
					Tos.BIT_RES( 14 );
				}
			}

			if ( quit_thread ) break;
		} while ( Tos._BIT( 13 ) == 0 );

		if ( Tos._BIT( 14 ) == 0 ) {			// If not "Load & Restart"
			Ragna.init.DATA_STANDBY2();					// Data Base Loading // 桐データの読み込み
		}
		Dos.DIET_READ( "talk/help.tos", Work.HELP_T, 0 );
		Dos.DIET_READ( "talk/kame.tos", Work.KAME_T, 0 );

		for (;;) {
			if ( quit_thread ) break;
			Tos._SYS( 1 );			// Initial Talk call
			if ( Work.NOW_MODE == Work.MODE_WMAP ) {			// Skip on "Load & Restart"
				RESET_MONSTER();
				ALL_CHR_HPMAX();		// Recover HP // ヒットポイント回復
				wmap.WORLD_MAP();			// Draw World Map // ワールドマップ
			}

			Work.SYS_FLAG = Z80._RES( 5,Work.SYS_FLAG );

			Work.NOW_MODE = Work.MODE_FIELD;		// Mode = Field // 動作モード=フィールド

			if ( Tos._BIT( 14 ) == 0 ) {
				Ragna.init.READ_MAPUNIT();			// Reset Charactors // マップの付属のE_CHRとE_UNIT
				Work.TIME_CNT = 7;			// Time to 7AM // 時間 朝7時
				Work.WEATHER_STAT = Z80._RES( 2,Work.WEATHER_STAT );	// Set to Daytime // 昼設定
				CHANGE_MONSTER2();		// 時間でクラスを変えるキャラ

				Work.SICON_HOLD = -1;		// 指揮キャラなし
			} else {
				Tos.BIT_RES( 14 );			// ロード時は読まない
			}

			FIELD_FRAME();
			new TosCHR_ALLREAD();			// Load 140 Charactrs // マップキャラ140体の読み込み
			Tos.MAP_INIT();				// Initial Talk for Map // マップチップ読み込み&初期化トーク

			Work.SYS_FLAG2 = Z80._RES( 0,Work.SYS_FLAG2 );	// Off key repeat flags (Ret / Space)
			Tool.KEY_CL();				// Clear Key Buffer

			do {
				if ( quit_thread ) break;
				MAIN_JOB();
			} while ( Z80._BIT( 5,Work.SYS_FLAG ) == 0 );

			Work.SYS_FLAG = Z80._RES( 5, Work.SYS_FLAG );
		}
	}

	synchronized	void	MAIN_JOB()
	{
		if ( Z80._BIT( 1,Work.SYS_FLAG) != 0 ) {
			MAIN_INIT();
		}
		
		DEBUG_DISP();

		// Wait Sync
		_sync();

		Vram.DIS_M();			// Draw Mouse Pattern
		Vram.ACT_();

		ANOTHER_PAGE();

		Map.REDU_UNIT();			// 縮小マップ表示
		Map.REDU_FLAME();		// 縮小マップ上フレーム表示
		CHR_PANEL_CYCLE();	// ホエーさんの領域
		Scrol.SCROLL_PACK();
		Cmder.cmder.CMD_MOVER();		// 部隊移動

		if ( Z80._BIT( 1,Work.SYS_FLAG ) != 0 ) return;

		if ( Tool.CTRL_D() != 0 ) {
			if ( Cmder.JUDGE_TOUCH() ) {		// 敵&味方 接触?-> SI
				// 接触有り 戦闘
				Work.UNIT_S	SI = Cmder.JUDGE_TOUCH_SI;
				Work.UNIT_S	DI = Cmder.JUDGE_TOUCH_DI;

				Vram.ACT_D();		// ACTをDISと同じにする
				Tos._SYS( 63 );		// 遭遇メッセージ

				Sub.DISP_CHR_NAME( SI );	// ユニット名
				Tos._SYS( 64 );;		// 遭遇メッセージ

				Vram.ACT_P();		// ACTをDISの裏にする
				Scrol.SCROLL_TO_CHR( SI, 8 );	// 戦闘位置へ飛ぶ

				int AL = CHECK_AMBUSH( SI, DI );	// 先制フラグ -> AX
				int AH = 0;		// Normal Battle // 通常戦闘
				Ragna.fight.FIGHT(SI,DI,AL,AH);		// Battle Scene Call
				AL = Fight.FIGHT_AL;		// 味方側残数
				AH = Fight.FIGHT_AH;		// 敵側残数
				FIGHT_AFTER( AL, AH, SI, DI );
				if ( CHECK_GAMEOVER() != 0 ) {
					Tos.GAME_OVER();
				}
			}

			if ( Z80._BIT( 1,Work.SYS_FLAG ) != 0 ) return;
		}

		Mouse.MOUSE_PATTRN( Work.MS_DEF, 0 );			// Set Mouse Pattern
		Mouse.PANEL_( /*Tos tos*/ null );			// Mouse Panel Settings
		if ( (Ragna.space_trig & 0x80) != 0 ) {			// Pause by SPACE
			Ragna.space_trig &= ~0x80;
			_IP_TIME( IC_PANEL_STAT[3] );
		}
		if ( Z80._BIT( 7,Work.SPACE ) != 0 ) {			// System Menu on Right Click
			IP_SYSTEM_( IC_PANEL_STAT[5] );		// IC_PANEL_SYSTEM
			Tool.KEY_CL();
		}

		SCROLL_CHASER();		// Scroll & Chace Chractor
	}


	synchronized	void	_sync()
	{
			// 実行時間計測
			long sync_current = System.currentTimeMillis();
			Ragna.sync_exec = ( Ragna.sync_interval >= 0 ? (sync_current - Ragna.sync_interval) & 0xfff : 0 );
			//Mon.locate(0,0);
			//Mon.println("interval = "+(Ragna.sync_exec)+":");

		// Wait Sync
		try {
			if ( !quit_thread ) {
				wait();
			}
		} catch( InterruptedException e ) {}

			Ragna.sync_interval = (System.currentTimeMillis() & 0xfff);
	}

	synchronized	void	_notify()
	{
		// Kick Sync wait
		//notifyAll();
		notify();
	}
}