
//**************************************************************
//
//			Gmap_INIT.c
//				include	"gmap.c"
//**************************************************************

//--------------------------------------------------------------
//		定義
//--------------------------------------------------------------
//#define

#include	<Agb.h>
#include	"../define.h"
#include	"../m4aLib.h"

#include	"gmap.h"

#include	"../global.h"
#include	"../sub.h"
#include	"../data.h"

#include	"save_data.h"
#include	"gmap_sub.h"
#include    "Gmap_INIT.h"

//--------------------------------------------------------------
//		Local関数
//--------------------------------------------------------------
/*----- GmapInit(void) -----*/
static	void	GmapBgVramInitSet(u8 bgnum);
static	void 	GmapInitRam_A(void);
static	void	GmapInitRam_B(void);

static	void	GmapStageSetAll(void);			// ＭＡＰ−ＶＲＡＭ展開
static	void	GmapExramInit(void);
//static	void	GmapInit_Priority_Blend(void);	//
static	void	GmapDisContinueField(void);	// 中断SAVE復帰(field)			//SAVEPRG

static void BossStage_WorkSet(void);

/*----- ＭＡＰ解凍 -----*/
int MapLH_kaitou(u8 mode, u8 *ptr, u8 *pexram);

//--------------------------------------------------------------
//		参照サブルーチン
//--------------------------------------------------------------
//extern

//--------------------------------------------------------------
//		外部データ
//--------------------------------------------------------------
extern const u8	bossmae256_base_CharLZ[];
extern const u8	bossmae256y_base_CharLZ[];
extern const u8 Scr_bossmae[];
extern const u8 Scr_bossmaey[];

extern const MapStateDef *MapStat_Init_Tbl[];
extern const MapPartsDef MapParts_tbl[];
extern const u8	Bg_nuki_Char[0x20];
extern const u8	a_suji_Char[0x200];
extern const u8 Scr_bmpause[];
extern u8 usFcount;
extern const GateDef *WarioGateData_Tbl[];
extern const u8 Scr_NO[];
extern const u8	s_w5bos10s_Char[0xc00];
#if CHINA
 const u8 bmpause_Char_zh[] = {
#include "Cbmpause_zh.c"
};
#endif
extern const u8 bmpause_Char[0x1a0];

//*********************************************************************
//*********************************************************************
//	画面初期ＳＥＴ
//	  LCDC-OFF or LCDC-ON  の２通りに注意
//*********************************************************************
//*********************************************************************
void	GmapInit(void)
{
int	i;
u8 *ptr;
MapPartsDef	mapparts;

	GmapInitRam_A();				//ＲＡＭ初期値 MAP-STATE のSET前である事
	MapState = *(MapStat_Init_Tbl[ucTotalTaikaiNum] + ucHeyaNum);		//マップの基本構築ＳＥＴ
	mapparts = MapParts_tbl[MapState.ChrsetNum];						//マップ部品をローカル取得

	//---------------------------------
	//	ボス部屋WORK-SET (ucBossHeya)
	//---------------------------------
	BossStage_WorkSet();

	//-----	敵配置難易度設定 -----------
	if(ucLevel == GAME_NORMAL) {
		(int)MapState.ucTekistr = (int)MapState.ucTekistre;
	}
	else if(ucLevel == GAME_SHARD) {
		(int)MapState.ucTekistr = (int)MapState.ucTekistrh;
	}

	//-----	BGM無しVER -----------------
	if(ucBgmOff) {
		MapState.usVolume = 0;
	}
	//----------------------------------

	/*_____PANEL-SET_____*/
	Panel.pData = mapparts.Panel;	//←これ重要
	Panel.pHit  = mapparts.Hit;		//←これ重要
	Panel.pPrt  = mapparts.Prt;		//←これ重要

	GmapInitRam_B();

	//BgmChangeInit();				//BGM変更(game.cへ移動)

	if((!cGmStartFlg) || ucDisConFlg) {	//最初にGAME_SEQへ入ってきた場合だけ
		GmapExramInit();
	}

	/*_____CHR-SET_____*/
	DmaCopy(3, mapparts.pPchr, BGVRAM_CHR+0x820, mapparts.Psize, 16);
	DMACOPY_Interval_Wait();
	DmaCopy(3, Bg_nuki_Char, BGVRAM_CHR+0x800, 0x20, 16);			//CLEAR-CHR

	/*_____COLOR-SET_____*/
	DmaCopy(3, mapparts.PCol, BG_PLTT, 512, 16);
	DMACOPY_Interval_Wait();

	if(ucStageNum != 4) {		//壊れブロックの壊れOBJ-COLOR
		DmaCopy(3, mapparts.BobjCol, OBJ_PLTT+32*3 , 32, 16);
		#ifdef	DEBUG_MAIN
		if(ucTitle2f == 1) {	//---デバッグ用数字
			DMACOPY_Interval_Wait();
			DmaCopy(3, a_suji_Char,OBJ_MODE0_VRAM+0x400*0x0f+0x200 , 0x200, 16);
		}
		#endif
	}

	//---BGﾊﾟﾚｯﾄ(0,0)を格納
	Bgpltt00.usOrg = *mapparts.PCol;
	#ifdef	DEBUG_MAIN
	if(!ucTitle2f) {
		*(u16*)BG_PLTT=0;
		Bgpltt00.usWork=0;
	}
	else {
		Bgpltt00.usWork=Bgpltt00.usOrg;
	}
	#else
	*(u16*)BG_PLTT=0;
	Bgpltt00.usWork=0;
	#endif

	//S-CHRの必要が無い場合はどうする？
	DmaCopy(3, mapparts.Schr, (BGVRAM_CHR+0xc000-mapparts.Ssize-0x20), mapparts.Ssize, 16);
	DMACOPY_Interval_Wait();
	DmaCopy(3, Bg_nuki_Char, BGVRAM_CHR+0xc000-0x20, 0x20, 16);		//CLEAR-CHR

	GmapStageSetAll();		// ＭＡＰ−ＶＲＡＭ展開

	//-----SAVEPRG-----
	GmapDisContinueField();	// 中断SAVE復帰(field)			//SAVEPRG

	//-----画面作成用-----
	usWarPosXB = Wario.usPosX; 		//
	usWarPosYB = Wario.usPosY; 		//

	//-----画面位置計算-----				//[usBg1(V/H)ofs]全てを中断SAVEする
	if(!(cPauseFlag || ucDisConFlg)) {		//ポーズ・中断復帰時は「補正」も再開させる
		GmScrSet();					//ＢＧ画面位置調整
		usBg1Vofs = OfsTrg.usV;
		usBg1Hofs = OfsTrg.usH;
		GmScrSet();					//ＢＧ画面位置調整（強制補正 ：BG0.2 の正確な位置出し）
	}

	GmapInit_Priority_Blend();	//ＢＧ優先の設定
	BgScrollReady();			//VBLKでSETされる各BGのSCR値をSET

	GmapBgVramInitSet(0);
	GmapBgVramInitSet(1);
	GmapBgVramInitSet(2);

	//BOSS前部屋の256色MODE用
	if(ucBossHeya == BOSS_PASS)	{		//ボスステージ廊下
		if(ucWorldNum == 5) {			//ヨーキ・ステージ？
			LZ77UnCompVram( (u8 *)bossmae256y_base_CharLZ, (u16 *)(BGVRAM_CHR + 0x4000));	//ヨーキ
			i = MapLH_kaitou(0,(u8*)Scr_bossmaey,(u8*)EXMAP3+0x800);						//ヨーキ
		}
		else {
			LZ77UnCompVram( (u8 *)bossmae256_base_CharLZ, (u16 *)(BGVRAM_CHR + 0x4000));	//中ボス
			i = MapLH_kaitou(0,(u8*)Scr_bossmae,(u8*)EXMAP3+0x800);							//中ボス
		}
		DmaCopy(3, EXMAP3+0x800 , BG_VRAM+0x1000*3+0x800 , i , 16);
	}
	if(ucBossHeya >= BOSS_PASS) {		//ボスステージ廊下以降	（PAUSE-ASC EX-RAM展開）
		MapLH_kaitou(0,(u8*)Scr_bmpause,(u8*)EXMAP3);
	}

	TekiPanel_TboxBg_Init();	//大ボス戦の宝箱初期SET
	BgkakiInit();				//書替えCHRの初期SET

	GameHblkSet_Init();			//HBLKPRG
	GameHblk_Main();			//初期1LOOP

	//---------------------------------
	//  わりおの最終位置調整、土管
	//---------------------------------
	if(Wario.ucDokan) {
		if(Wario.ucStat == DOKANU) {		//土管上
			Wario.usPosY += (16*2)*4;
		}
		else if(Wario.ucStat == DOKAND){	//土管下
			Wario.usPosY -= (16*2)*4;
		}
		usWarPosYB = Wario.usPosY; 			//
	}

	//------役割から基本SET-UP
	i =(0*(Map[1].usPnlX))+0;		//yp=0,xp=0	
	i = *(Map[1].pData+i);
	i = *(Panel.pPrt+i);
	if(i == YSETUP_KEY_PRI0) {
		ucKeyPri = 1;	//priority 0
	}
	else {
		ucKeyPri = 0;	//wario posi
	}
}


//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
static void GmapStageSetAll(void)		// ＭＡＰ−ＶＲＡＭ展開
{
u8  *ptr8;
u16 *ptr16;
int *ptra;
int a;

	/*_____MAP-bacdF_____*/
	ptr8 = (u8 *)MapState.scr3;
	a = (MapLH_kaitou(0,ptr8,(u8 *)EXMAP3));	// a(ASC SIZE-data)
	DmaCopy(3, EXMAP3 , BG_VRAM+0x1000*3 , a , 16);

	/*_____MAP-field_____*/
	ptra = (int *)EXMAPFILADR;
	(int)ptr16 = *(ptra+ucHeyaNum);
	Map[1].usPnlX = *(ptr16++);
	Map[1].usPnlY = *(ptr16++);
	Map[1].pData =ptr16;

	/*_____MAP-backN_____*/
	if(MapState.bg2 & BuPANEL) {
		ptr8 = (u8 *)MapState.map2;
		Map[2].pData =	(u16 *)EXMAP2;
		a = MapLH_kaitou(1,ptr8,(u8 *)EXMAP2);
		Map[2].usPnlX = (u16)(a>>16);
		Map[2].usPnlY = (u16)(a&0xff);
	}
	/*_____MAP-front_____*/
	if(MapState.bg0 & BuPANEL) {
		ptr8 = (u8 *)MapState.map0;
		Map[0].pData =	(u16 *)EXMAP0;
		a = MapLH_kaitou(1,ptr8,(u8 *)EXMAP0);
		Map[0].usPnlX = (u16)(a>>16);
		Map[0].usPnlY = (u16)(a&0xff);
	}
	else if(MapState.bg0 & BuSCR) {
		ptr8 = (u8 *)MapState.map0;
		a = (MapLH_kaitou(0,ptr8,(u8 *)EXMAP0));	// a(ASC SIZE-data)
		DmaCopy(3, EXMAP0 , BG_VRAM+0x1000*0 , a , 16);
	}
}




//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
static	void	GmapDisContinueField(void)	// 中断SAVE復帰(field)			//SAVEPRG
{
int	n,a;

	if(!ucDisConFlg)	return;

	//-----壊れていたブロックを壊す-----
	if(usDisConR) {
		for( n=0 ; n != usDisConR ; n++) {
			a = *((u16*)(EXBACKUP_FIELD)+n);
			a = a<<1;
			*(u16*)(EXMAPFILADR+a) = 0;
		}
	}

	//-----ゲート壊れブロックを壊す-----
	PanelPartWork_ReBlock_operate(1);		//復活ブロック 1:破壊

	//-----ＯＢＪからのあたりをつける-----
	PanelPartWork_HitBlock_operate(1);		//あたり後付け 1:前面あたりパネル番号
}




//--------------------------------------------------------------
//	ＲＡＭ初期セット
//	  注意：MAP-STATE SET前
//--------------------------------------------------------------
static void GmapInitRam_A(void)
{
GateDef	*ptr;
u16 *ptr16;
u16 x,y;
u16 xp,yp;
int i;

	ucGmapSubSeq = 0;	//SUB-SEQ CLEAR
	ucSTEndType = 0;	//ステージエンド種類
	ucBossPause = 0;	//ボス部屋のポーズ

	Fade.ucCnt = 0;		//tbl-DATA参照番号
	Fade.ucDat = 0;		//計算用DATA
	Fade.ucDip = 0;		//
	Fade.ucDMAf = 0;	//colorのDMA転送f (指定BitをSetするとDMA開始)
	Fade.ucSW = 0;		//計算終了

	ucFlashLoop = 0;
	usBldCnt = 0;

	usFcount =0;		//フレームカウンター

	if(!cGmStartFlg) {

		Fade.ucKind = GFADE_BLACK_COL;	//GATE-Fade(IN/OUT)の種類
		BgmMap.ucSwSeq = 0;
		BgmMap.ucTiming = 0;
		BgmMap.usNowNum = 0;
		BgmMap.usPlyNum = 0;
		ucBgCountDown = 0;

		CCobj.ucKind = 0;	//種類
		CCobj.ucPltt = 0;	//開始パレット番号
		CCobj.ucKazu = 0;	//パレット数
		CCobj.ucDat = 0;	//カウンター
		CCobj.ucDMAf = 0;	//DMA転送SW
		CCobj.ucSp = 0;		//変化SP

		CCbg.ucKind = 0;	//種類
		CCbg.ucPltt = 0;	//開始パレット番号
		CCbg.ucKazu = 0;	//パレット数
		CCbg.ucDat = 0;		//カウンター
		CCbg.ucDMAf = 0;	//DMA転送SW
		CCbg.ucSp = 0;		//変化SP

		ucTekiKowareFlg = 0;

		//-----SAVEPRG-----
		if(!ucDisConFlg) {
			#ifdef	DEBUG_MAIN
			if(!ucTitle2f && !(ucAutoDemoNum & 0x80)) {
				ucGateNum = 0;			//save
			}
			#else
			if(!(ucAutoDemoNum & 0x80)) {
				ucGateNum = 0;			//save
			}
			#endif

			usDisConR = 0;			//save
		//	BgmMap.usNextNum = 0;	//save

			usTekiBgPosX = 0;		//save
			usTekiBgPosY = 0;		//save
			for(i=0;i<5;i++) {		//save
				MapSw[i]=0;
			}
		}
	}

	//-----------------------------------------
	//以下、ポーズ復帰時には行わない
	//-----------------------------------------
	if(cPauseFlag)	return;

	ucBgKakiStop = 0;		//BG書替え制御

	/*---  わりおの初期位置のSET  ---*/
 	ptr =(GateDef *)WarioGateData_Tbl[ucTotalTaikaiNum];
	ptr += ucGateNum ;

	ucHeyaNum 	= ptr->ucHeya;
	ucTekiGroup	= ptr->ucTekiGrp;		//敵グループ−ＳＥＴ
	ucGateType	= ptr->ucType;			//ゲートの種類
	if((ptr->ucType == GATE_SHOP) && !ucDisConFlg) {
		Fade.ucKind = GFADE_WIN1;		//GATE-Fade(IN/OUT)の種類
	}

	//-----------------------------------------
	//以下、中断SAVE開始時には行わない
	//-----------------------------------------
	if(ucDisConFlg) {
		DisContinue_KeyWord_Clear();	//現中断SAVEを無効化
		return;
	}

	//-----
	OfsTrg.usH = 0;			//画面位置目標値
	OfsTrg.usV = 0;			//画面位置目標値
	OfsTrg.cHm = 0;			//画面移動量
	OfsTrg.cVm = 0;			//画面移動量

	//後付けHITの初期ｸﾘｱ
	ptr16 = (u16 *)EXHitBLOCKDAT;		//後付けHITの初期ｸﾘｱ
	for(x=0;x<(EXHitBLOCK_SIZE/2);x++) {
		*ptr16 = 0;
		*ptr16++;
	}

	//ＢＧＭ−ＳＥＴ（設定値を必ずＳＥＴ）
	if(ptr->usBgm) {					//設定値が無い場合、NEXT持続
		BgmMap.usNextNum = ptr->usBgm;
	}

	if(ptr->ucType == GATE_TUBE) {		//土管の上・下アニメーション動作部分は、INIT最終で行う	
		x = ptr->ucPX1+1;				//土管位置調整(+1)
		y = ptr->ucPY2+1;				//指定位置(+1)
		Wario.usPosX = (x << 6);		//仮想ポイント
		Wario.usPosY = (y << 6)-1;		//仮想ポイント（World座標変換-1）

		if(Wario.ucStat == DOKANU) {	//土管上	土管下(DOKAND)補正無し
			Wario.usPosY -= 16*4;		//最終立ち位置は、指定パネルの上
		}
		else if(Wario.ucStat == DOKAND) {	//土管下(DOKAND)補正無し
			Wario.usPosY += (16*2)*4;		//最終立ち位置は、指定２パネル下
		}
	}
	else {
		x = ptr->ucPX1 ;			//
		y = ptr->ucPY2+1;			//指定位置(+1)
		Wario.usPosX = (x << 6)+(8 + ptr->cOfsx)*4;		//ポイント（+8*4）
		Wario.usPosY = (y << 6)+(ptr->cOfsy)*4-1;		//ポイント（World座標変換-1）
	}

	///// AUTO DEMO WORK-SET /////
	if(ucAutoDemoNum & 0x80) {
		AutoDemo_Init_Work();
	}
	if(ucDemoSwitch) {
		ucMainTimer = 0;	//ランダム要素の排除
	}

	///// 地震関係 /////
	Jishin.Pow =0;
	Jishin.Fcnt =0;
	Jishin.Kind =0;

	YureX.Pow =0;
	YureX.Fcnt =0;
	YureX.Kind =0;

	///// カウンター /////
	usBg1Vofs =0;
	usBg1Hofs =0;
	usBg0Hofs =0;
	usBg0Vofs =0;

	///// その他ＲＡＭ /////
	ReBlockSw =0;
	ucAlpfaSw = 0;

	////////////////////////

}


//--------------------------------------------------------------
//	ＲＡＭ初期セット（後処理）
//	  注意：MAP-STATE SET後
//--------------------------------------------------------------
static void GmapInitRam_B(void)
{
	if(MapState.scroll == BSCROLL) {
		BlockScrollInit_adrset();		//エリア指定スクロール初期ＳＥＴ
	}
	//---------------------------
	//---------------------------
	ScrStop.R = 0x40 * 2 ;
	ScrStop.L = 0x40 * 2 ;
	ScrStop.D = 0x40 * 2 ;
	ScrStop.U = 0x40 * 2 ;
	//---------------------------
	if(ucTotalTaikaiNum == TOTAL_TAIKAINUM_TN) {  //敵配置チェック用ＭＡＰ、大会番号は移動するので注意
		ScrStop.R = 0 ;
		ScrStop.L = 0 ;
		ScrStop.D = 0 ;
		ScrStop.U = 0x40*2;		//←注意
	}
	//---------------------------

	//---ＢＧ３の自動ｽｸﾛｰﾙ設定---
	Bg3As.Move = 0;
	Bg3As.Cnt = 0;
	if(MapState.farofs == BG3S_Xf_La) {
		Bg3As.Type = BG3AS_Left_A;
	}
	else {
		Bg3As.Type = BG3AS_STP;
	}

	//---ＢＧ０の自動ｽｸﾛｰﾙ設定---
	Bg0As.Move = 0;
	Bg0As.Cnt = 0;
	if(MapState.bg0 == BuSCRFOG) {
		Bg0As.Type = BG0AS_Left_B;
	}
	else {
		Bg0As.Type = BG0AS_STP;
	}
}


//*********************************************************************
//*********************************************************************
//*********************************************************************
//
//		画面初期ＳＥＴ
//
//*********************************************************************
//*********************************************************************
//*********************************************************************

static	void	GmapBgVramInitSet(u8 bgnum)

{
//u8 flag[3] ={MapState.bg0,MapState.bg1,MapState.bg2};
u8 flag;
int	lpX,lpY;		//

u16	*pMap;			//FILEアドレス
u16	*pVram;			//BG-VRAMのポインタ（始点）

u16 startX,x;		//start-panel位置(X)、列を加算するwork
u16 startY,y;		//start-panel位置(Y)、行を加算するwork

u16	i,c;			//計算用、vram書込み位置計算用
s16 sbuf;
u16	mpadd;			//map-panel番号を拾うﾎﾟｲﾝﾀ加算用

u16 divX, divY;		//書込む列数、書込む行数
u16	paX,paY;		//現在の左上端パネル位置
u16 vofs,hofs;

//-----------------------------
//-----------------------------
	if(bgnum == 0) {
		flag = MapState.bg0;
		vofs = usBg0Vofs;
		hofs = usBg0Hofs;
	}
	else if(bgnum == 1) {
		flag = MapState.bg1;
		vofs = usBg1Vofs;
		hofs = usBg1Hofs;
	}
	else {
		flag = MapState.bg2;
		vofs = usBg2Vofs;
		hofs = usBg2Hofs;
	}
//-----------------------------
//-----------------------------
	if(flag & BuPANEL) {

	/*----- Ｘ方向準備 -----*/
		paX = hofs>>6 ;
		divX = 15+6 ;						//書込む列数
		if((sbuf = (paX - 3)) < 0 )	sbuf = 0;
		if(divX > (Map[bgnum].usPnlX - sbuf)) divX = (Map[bgnum].usPnlX - sbuf); 
		startX=(u16)sbuf;					//start-panel(X)

	/*----- Ｙ方向準備 ----- */
		paY = vofs>>6 ;
		divY = 10+6 ;			//書込む列数
		if((sbuf = (paY - 3)) < 0 )	sbuf = 0;
		if(divY > (Map[bgnum].usPnlY - sbuf)) divY = (Map[bgnum].usPnlY - sbuf); 
		y=(u16)sbuf;						//vram計算用-start位置Y
		startY= (u16)sbuf*Map[bgnum].usPnlX;	//start-panel(Y)

	/*----- パネル開始地点の算出 -----*/
		pMap = (u16 *)Map[bgnum].pData+(startX+startY);	//ptr（パネル開始点） format(pnl)

	/*----- VRAMへPANELを置いていく -----*/
		for(lpY=0; lpY<divY ; lpY++,y++) {		//行SET（パネル縦10）

			mpadd = Map[bgnum].usPnlX*lpY;			//map加算値

			x = startX;							//vram計算用-start位置X
			for(lpX=0; lpX<divX ; lpX++,x++)	//列SET（パネル横32）
			{
				(int)pVram = BG_VRAM+(bgnum*0x1000);
				c=(x & 0x1f);
				if(c & 0x10)	(int)pVram += 0x800;
				c =(c & 0x0f)*2;
				pVram += (0x40*(y & 0x0f) + c);

				i= *(pMap+mpadd)<<2 ;		//関数：ＣＨＲコードを拾うポイントを計算
				*pVram        = *(Panel.pData+i++);		//左上
				*(pVram+1)    = *(Panel.pData+i++);		//右上
				*(pVram+0x20) = *(Panel.pData+i++);		//左下
				*(pVram+0x21) = *(Panel.pData+i++);		//右下
				mpadd++ ;					//MAPADD(+1)
			}
		}
	}

//-----------------------------
//-----------------------------
	if(flag == BuNO) {		//VRAM-clear ＤＭＡ版
		MapLH_kaitou(0,(u8*)Scr_NO,(u8*)EXMAP3);
		DmaCopy(3, EXMAP3 , BG_VRAM+0x1000*bgnum 		, 0x800 , 16);
		DMACOPY_Interval_Wait();
		DmaCopy(3, EXMAP3 , BG_VRAM+0x1000*bgnum+0x800	, 0x800 , 16);
	}
}


//*********************************************************************
//--------------------------------------------------------------
//	EX-RAM初期準備
//    STAGEに入ってくる最初の一回だけ
//--------------------------------------------------------------
//*********************************************************************

static void GmapExramInit(void)
{
const MapStateDef *ptrINIT;	//初期条件を受けるﾎﾟｲﾝﾀ（型に注意）
u8 *ptr1,*ptr2;
int	Fput;						//FILE-ADR（受）
int data;						//FILE-data（数）
int *pFadr;						//FILE-ADR-Tblを作成する為のﾎﾟｲﾝﾀ
int a;							//ucHeyaNum-counter

	pFadr = (int *)EXMAPFILADR;		//拡張WRAMのADR配列をﾎﾟｲﾝﾀで受ける
	Fput = (int)EXMAP;				//拡張WRAMへDATAを送込む先頭ADR
	ptrINIT = MapStat_Init_Tbl[ucTotalTaikaiNum];

	for(a=0; a<TaikaiCourseData_Tbl[cSelectedNo][1]; a++) {	
		ptr1 = (u8 *)ptrINIT->map1;
		ptr2 = (u8 *)Fput;
		data = ((*ptr1 * *(ptr1+1))+2) <<1 ;	// ((Xpanel * Ypanel)+header分)*2 byte

		MapLH_kaitou(2, ptr1, ptr2);			//解凍

		*(pFadr+a) = Fput;						//FILE-ADR-Tbl作成
		Fput += data;							//NextPut-EXRAM-Adr
		ptrINIT++ ;
	}
}


//*********************************************************************
//*********************************************************************
//	解凍
//	MODE 0:ASC解凍		(RETURN)VRAM-SIZE
//	MODE 1:PANEL解凍	(RETURN)PANEL-SIZE(X,Y)
//	MODE 2:PANEL解凍	(RETURN)non ,解凍ADR先頭にPANEL-SIZEを格納
//*********************************************************************
//*********************************************************************
int	MapLH_kaitou(u8 mode, u8 *ptr, u8 *pexram)	//MODE 0:ASC 1:PANEL0 2:PANEL2
{
u8 *pexram_sub;
int i;
int kosu;
int a;

//-----解凍対象による準備
	a=0;
	if(!mode) {
		a = *ptr++;					//RETURN-DARA格納
		if(!a)			a=0x800;
		else if(a==1)	a=0x1000;
		else if(a==2)	a=0x1000;
		else 			a=0x2000;
	}
	else if(mode == 1) {			//MODE 0: ASC SIZE
		a = *ptr++;					//RETURN-DARA格納
		a = (*ptr|(a<<16));			//MODE 1: (PANEL X , PANEL Y)
		*ptr++;
	}
	else {
		*pexram++ = *ptr++;	//PANEL数(X)	max(0xFF)
		*pexram++ = 0;
		*pexram++ = *ptr++;	//PANEL数(Y)	max(0xFF)
		*pexram++ = 0;
	}

//-----解凍開始
	pexram_sub = pexram;
	for( i=0 ; i<2 ; i++ ) {		//0:L 1:H
		if(*ptr++ == 1) {			//圧縮方法=7F
			for( kosu = *ptr++ ; kosu != 0x00 ; kosu = *ptr++ ) {	//0x00 = end-code
				if(kosu & 0x80) {	//--- 圧縮 ---
					for( kosu &= 0x7f ; kosu != 0 ; kosu-- ) {
						*pexram++ = *ptr;
						*pexram++;
					}
					*ptr++;
				}
				else {				//---非圧縮---
					for( ; kosu != 0 ; kosu-- ) {
						*pexram++ = *ptr++;
						*pexram++;
					}
				}
			}
		}
		else {						//圧縮方法=7FF
			kosu = *ptr++;
			kosu = ((kosu << 8) | *ptr++) ;

			for( ; kosu != 0 ; ) {		//0x00 = end-code
				if(kosu & 0x8000) {	//--- 圧縮 ---
					kosu &= 0x7fff;
					for( ; kosu != 0 ; kosu-- ) {
						*pexram++ = *ptr;
						*pexram++;
					}
					*ptr++;
				}
				else {				//---非圧縮---
					for( ; kosu != 0 ; kosu-- ) {
						*pexram++ = *ptr++;
						*pexram++;
					}
				}
				kosu = *ptr++;
				kosu = ((kosu << 8) | *ptr++) ;
			}
		}
		pexram = pexram_sub;
		*pexram++;
	}
	return	a;
}

//--------------------------------------------------------------
//--------------------------------------------------------------
//	ボスステージでのポーズ解除
//	CHRを戻す
//	S-CHRのsizeが重要なため、特別関数
//	(s_w5bos10s_Char)限定、ボス部屋にも入る
//--------------------------------------------------------------
//--------------------------------------------------------------


void BossStage_Pause_ChrReturn(u8 mode)		// 0:pause 1:s-chr
{
	
	
	if(mode) {
		DmaCopy(3, (u8*)s_w5bos10s_Char+(sizeof(s_w5bos10s_Char)-sizeof(bmpause_Char)), (BGVRAM_CHR + 0xbe40),
			 sizeof(bmpause_Char) , 16);	//PAUSE-CHR
	}
	else {
		#if CHINA
		DmaCopy(3, (u8*)bmpause_Char_zh, (u8*)(BGVRAM_CHR + 0xbe40), sizeof(bmpause_Char_zh) , 16);		//PAUSE-CHR
		#else 
		DmaCopy(3, (u8*)bmpause_Char, (u8*)(BGVRAM_CHR + 0xbe40), sizeof(bmpause_Char) , 16);		//PAUSE-CHR
		#endif
		
	}
}

//--------------------------------------------------------------
//--------------------------------------------------------------
//	ボス部屋のフラグ設定
//--------------------------------------------------------------
//--------------------------------------------------------------
static void BossStage_WorkSet(void)
{
	ucBossHeya = BOSS_NON;
	if(ucStageNum != 4) 	return;

	//-----
	ucBossHeya = BOSS_PASS;				//ボスステージ
	if(ucHeyaNum) {
		ucBossHeya = BOSS_HEYA;			//ボス部屋
		if(ucWorldNum == 5) {
			ucBossHeya = BOSS_YOKI;		//ヨーキ
			ucGmapSubSeq = 0;	//
			ucBgYoki = BGYOKI_STOP ; 	//ヨーキ部屋BG-EVENT
		}
	}
}


