//**************************************************************
//
//						title.c
//
//**************************************************************
#include	<Agb.h>
#include	"../define.h"
#include	"../m4aLib.h"
extern void WarioVoiceSet(int);


#define		GLOBAL_VALUE_DEFINE
#include	"title.h"
#undef		GLOBAL_VALUE_DEFINE

#include	"../global.h"
#include	"../sub.h"
#include	"../data.h"
#define	_Sin( a ) (sin_cos_table[(a)])		// ../data.h
#define	_Cos( a ) (sin_cos_table[(a)+64])

#define	LCD_CENTER_X	( LCD_WIDTH / 2 )
#define	LCD_CENTER_Y	( LCD_HEIGHT / 2 )

#define	SCREEN_CHR_WIDTH	32	// BG 32x32 サイズ

#define	TITLE_DEBUG_MODE	FALSE	// デバッグ

//--------------------------------------------------------------
//		外部データ及び定数定義
//--------------------------------------------------------------

//// "Nintendo Presents"
#define	NINTENDO_W		18
#define	NINTENDO_H		3
#define	NINTENDO_TOP	232
extern const u16	nintendo_Palette[32];
extern const u8		nintendo_Char[];
extern const u8		presents[];
extern const u8		nintendo[ NINTENDO_W * NINTENDO_H ];
enum { NIN_0, NIN_1, NIN_2, NIN_3, NIN_4 };


//// Scene ０　街の夜
// BG
extern const u16	scene0_Palette[48];
extern const u8		scene0_Char[];
extern const u16	scene0_mask[];
extern const u16	scene0_opening[];
extern const u16	scene0_ending[];
// OBJ
extern const u8		scene0_obj_Char[];
extern int scene0_E_Anime0( int time, u16 **pattern );
extern int scene0_J_Anime0( int time, u16 **pattern );
enum { S0_0, S0_1, S0_2, S0_3 };


//// Scene １　ワリオの両足
extern const u16	scene1_Palette[48];
extern const u8		scene1_Char[];
extern const u16	scene1_bg0[];
extern const u16	scene1_bg1[];
extern const u16	scene1_bg2[];


//// Scene ２　車庫の中
#define	SCENE2_FRONT_TIRE_W	 2
#define	SCENE2_FRONT_TIRE_H	 4
#define	SCENE2_REAR_TIRE_W	 4
#define	SCENE2_REAR_TIRE_H	 9
#define	SCENE2_FRONT_TIRE_TOP	423
#define	SCENE2_REAR_TIRE_TOP	272
extern const u16	scene2_Palette[48];
extern const u8		scene2_Char[];
extern const u16	scene2_carL[];
extern const u16	scene2_carU[];
extern const u16 *	scene2_ground[4];
extern const u16 *	scene2_door[4];
extern const u16	scene2_frontTire[4][ SCENE2_FRONT_TIRE_W * SCENE2_FRONT_TIRE_H ];
extern const u16	scene2_rearTire[4][ SCENE2_REAR_TIRE_W * SCENE2_REAR_TIRE_H ];
enum { S2_0, S2_1, S2_2 };


//// Scene ３　走行中の車
// BG
extern const u16	scene3_Palette[256];
extern const u8		scene3_Char[];
extern const u16	scene3_back[];
extern const u16	scene3_shadow[];
extern const u16	scene3_car[];
// OBJ
extern const u16	scene3_obj_Palette[16];
extern const u8		scene3_obj_Char[];
extern int scene3_Anime0( int time, u16 **pattern );
enum { S3_0, S3_1, S3_2, S3_3 };


//// Scene ４　通路、走り抜ける車、背景の建物、猫（ＯＢＪ）
// BG
#define	SCENE4_W		240
#define	SCENE4_H		128
#define	SCENE4_SIZE		( SCENE4_W * SCENE4_H )
#define	SCENE4_TOP		(( LCD_HEIGHT - SCENE4_H ) / 2 * LCD_WIDTH )
#define	SCENE4_BOTTOM	( SCENE4_TOP + SCENE4_SIZE )
extern const u16	scene4_bg_Palette[17];
extern const u8		scene4_Bitmap[];
// OBJ
extern const u16	scene4_obj_Palette[208];
extern const u16	scene4_obj_Ending_cat_Palette[16];
extern const u8		scene4_obj_Char[];
extern const u16	scene4_obj_carL[];
extern const u16	scene4_obj_carR[];
extern const u16	scene4_obj_bldg[];
extern int scene4_Anime0 ( int time, u16 **pattern ); // 猫　歩く
extern int scene4_Anime2 ( int time, u16 **pattern ); // 猫　気付く
extern int scene4_Anime3 ( int time, u16 **pattern ); // 猫　驚く
extern int scene4_Anime4 ( int time, u16 **pattern ); // 猫　まばたき
extern int scene4_Anime5 ( int time, u16 **pattern ); // 猫　頭を振る
extern int scene4_Anime6 ( int time, u16 **pattern ); // 猫　下を見る
extern int scene4_Anime7 ( int time, u16 **pattern ); // 猫　新聞紙をかぶる
extern int scene4_Anime8 ( int time, u16 **pattern ); // 舞い上がる新聞紙
extern int scene4_Anime9 ( int time, u16 **pattern ); // 舞い落ちる新聞紙
extern int scene4_Anime10( int time, u16 **pattern ); // 猫　しゃがんで震えている
enum {S4_00, S4_0, S4_1, S4_2, S4_3, S4_4, S4_5, S4_6, S4_7, S4_8, S4_9 };


//// 新聞紙と猫の影
#define NEWSPAPER_MSG_J_W		24
#define NEWSPAPER_MSG_E_W		28
#define	NEWSPAPER_MSG_J_TOP		451
#define	NEWSPAPER_MSG_E_TOP		449
extern const u16	newspaper_Palette[128];
extern const u8		newspaper_Char[];
extern const u16	newspaper_mask[];
extern const u16	newspaper[];
extern const u16	newspaper_cat[];
extern const u16	newspaper_msgJ_U[ NEWSPAPER_MSG_J_W * 1 + 6 ];
extern const u16	newspaper_msgJ_D[ NEWSPAPER_MSG_J_W * 1 + 6 ];
extern const u16	newspaper_msgE_U[ NEWSPAPER_MSG_E_W * 1 + 16 ];
extern const u16	newspaper_msgE_D[ NEWSPAPER_MSG_E_W * 1 + 16 ];
enum { NEWS_0, NEWS_1, NEWS_2, NEWS_3, NEWS_4, NEWS_5 };


//// Scene ５　ＷＡＲＩＯＬＡＮＤ４
// BG
extern const u16	scene5_bg_Palette[160];
extern const u8		scene5_bg_Char[];
extern const u8		scene5_bg_title_Char[];
extern const u16	scene5_bg0_nightL[];
extern const u16	scene5_bg0_nightR[];
extern const u16	scene5_bg0_nightLR[];
extern const u16	scene5_bg1[];
extern const u16	scene5_bg2L[];
extern const u16	scene5_bg2R[];
extern const u16	scene5_bg3L[];
extern const u16	scene5_bg3R[];
extern const u16	warioGBA_logo[];
extern const u16	wario4_logo[];
// OBJ
#define	OB_PUSHSTART_X	(112 -3)
#define	OB_PUSHSTART_Y	 (70 +4 +2)
#define OB_CURSOR_X		 74
#define OB_CURSOR_Y		OB_PUSHSTART_Y
#define	OB_SCENE5_CAR_X	( 140 +8 )
#define	OB_SCENE5_CAR_Y	150
#define	OB_SCENE5_GAS_X	( 204 +8 )
#define	OB_SCENE5_GAS_Y	150
extern const u16	scene5_obj_Palette[16*6];
extern const u8		scene5_obj_Char[];
extern int scene5_Anime0 ( int time, u16 **pattern );
extern int scene5_Anime1 ( int time, u16 **pattern );
extern int scene5_Anime2 ( int time, u16 **pattern );
extern int scene5_Anime6 ( int time, u16 **pattern );
extern int scene5_Anime7 ( int time, u16 **pattern );
extern int scene5_Anime8 ( int time, u16 **pattern );
extern int scene5_Anime9 ( int time, u16 **pattern );
extern int scene5_Anime10( int time, u16 **pattern );
extern int scene5_Anime11( int time, u16 **pattern );
extern int scene5_Anime15( int time, u16 **pattern );
extern int scene5_Anime17( int time, u16 **pattern );
extern int scene5_Anime18( int time, u16 **pattern );
extern void scene5_Anime3( u16 **pattern ); // NEW GAME
extern void scene5_Anime4( u16 **pattern ); // CONTINUE
extern void scene5_Anime5( u16 **pattern ); // CLEAR DATA
extern void scene5_Anime12( u16 **pattern ); // HARD
extern void scene5_Anime13( u16 **pattern ); // NORMAL
extern void scene5_Anime14( u16 **pattern ); // @2001 Nintendo
extern void scene5_Anime16( u16 **pattern ); // PUSH START
extern void scene5_Tire  ( u16 **pattern );
extern void scene5_Rock1 ( u16 **pattern );
extern void scene5_Rock2 ( u16 **pattern );
extern void scene5_Rock3 ( u16 **pattern );
extern void scene5_Rock4 ( u16 **pattern );
extern void scene5_ClearAll( u16 **pattern );
extern void scene5_Yes	 ( u16 **pattern );
extern void scene5_No	 ( u16 **pattern );
extern void scene5_car_palette_change( int index );
enum {S5_00, S5_01, S5_0, S5_1, S5_2, S5_3, S5_4, S5_5, S5_6, S5_7, S5_7_1, S5_8 };


//// Scene ６　ピラミッド
// BG
extern const u16	pyramid_bg_Palette[64];
extern const u8		pyramid_bg_Char[];
#define	PYRAMID_BG0_W	32
#define	PYRAMID_BG0_H	1
extern const u16	pyramid_bg0[ PYRAMID_BG0_W * PYRAMID_BG0_H ];
extern const u16	pyramid_bg1[];
extern const u16	pyramid_bg2[];
extern const u16	pyramid_bg3[];
// OBJ
extern const u16	pyramid_obj_Palette[48];
extern const u8		pyramid_obj_Char[];
extern const u16	pyramid_iwa_L[];
extern const u16	pyramid_iwa_R[];
extern const u16	pyramid_grass_L[];
extern const u16	pyramid_grass_R[];
extern int pyramid_Anime0( int time, u16 **pattern ); // ガッツポーズ
extern int pyramid_Anime1( int time, u16 **pattern ); // 待機ポーズ
extern int pyramid_Anime2( int time, u16 **pattern ); // 走るポーズ
extern int pyramid_Anime3( int time, u16 **pattern ); // 土煙
extern void pyramid_palette_change( int index );
enum { S6_1, S6_2, S6_3, S6_4, S6_5, S6_6, S6_7, S6_8, S6_9 };


//// Scene ７　ピラミッドの入口から
// BG
extern const u16	scene7_bg_Palette[256];
extern const u8		scene7_bg_Char[];
extern const u16	scene7_bg1_1[];
extern const u16	scene7_bg1_2[];
extern const u16	scene7_bg1_3[];
extern const u16	scene7_bg2[];
extern const u16	scene7_bg3_1[];
extern const u16	scene7_bg3_2[];
extern const u16	scene7_bg_pit[]; // 縦穴（クリアーキャラクタ番号は 0x00C5 ）
// OBJ
extern const u16	scene7_obj_Palette[48];	// PaletteNo.12〜展開すること
extern const u16	scene7_smoke_Palette[16]; // PaletteNo.4に展開すること
extern const u8		scene7_obj_Char[];		// ChrNo.200h〜展開すること
extern const u8		scene7_smoke_Char1[];	// ChrNo.94h〜展開すること
extern const u8		scene7_smoke_Char2[];	// ChrNo.B4h〜展開すること
extern int scene7_cat_Anime0( int time, u16 **pattern );
extern int scene7_cat_Anime1( int time, u16 **pattern );
extern int scene7_cat_Anime2( int time, u16 **pattern );
extern int scene7_glitter_Anime0( int time, u16 **pattern );
extern int scene7_smoke_Anime22( int time, u16 **pattern );
extern int scene7_smoke_Anime23( int time, u16 **pattern );
// "TL_wario.c"
extern	void Title_Wario_Pattern( int kind, int stat, int muki );
extern	u16* Title_Wario_Move( int x, int y, u16 pri, u16 cont, u16 trg );
extern	void Title_Wario_VblkSync( void );
extern	void Title_Wario_Palette( void );
enum {	S7_100, S7_101, S7_102,
		S7_200, S7_201, S7_202, S7_203, S7_204, S7_205, S7_206,
		S7_300, S7_301, S7_302, S7_303,
		S7_400
};


//// Scene ８　ピラミッドの中の穴
// BG
extern const u16	scene8_bg_Palette[16];
extern const u8		scene8_bg_Char[];
extern const u16	scene8_bg[];
// OBJ
extern const u16	scene8_obj_Palette[16];
extern const u8		scene8_obj_Char[];
extern void scene8_Anime0( u16 **pattern );
enum { S8_0, S8_1, S8_2 };


//// Scene ９　ピラミッドから脱出
// BG	Scene７のＢＧを使用する
// OBJ
extern const u16	scene9_obj_Palette[112];
extern const u8		scene9_obj_Char[];
extern int scene9_wario_Anime0( int time, u16 **pattern );
extern int scene9_wario_Anime1( int time, u16 **pattern );
extern int scene9_wario_Anime2( int time, u16 **pattern );
extern int scene9_wario_Anime3( int time, u16 **pattern );
extern int scene9_wario_Anime4( int time, u16 **pattern );
extern int scene9_wario_Anime5( int time, u16 **pattern );
extern int scene9_wario_Anime6( int time, u16 **pattern );
extern int scene9_wario_Anime7( int time, u16 **pattern );
extern int scene9_wario_Anime8( int time, u16 **pattern );
extern int scene9_wario_Anime9( int time, u16 **pattern );
extern int scene9_wario_no_item_Anime0( int time, u16 **pattern );
extern int scene9_wario_no_item_Anime3( int time, u16 **pattern );
extern int scene9_wario_no_item_Anime4( int time, u16 **pattern );
extern int scene9_cat_Anime0( int time, u16 **pattern );
extern int scene9_cat_Anime1( int time, u16 **pattern );
extern int scene9_cat_Anime2( int time, u16 **pattern );
extern int scene9_doctor_Anime0( int time, u16 **pattern );
extern int scene9_doctor_Anime1( int time, u16 **pattern );
extern int scene9_doctor_flip_Anime0( int time, u16 **pattern );
extern int scene9_doctor_flip_Anime1( int time, u16 **pattern );
extern int scene9_fragment_Anime0( int time, u16 **pattern );
extern int scene9_fragment_Anime1( int time, u16 **pattern );
extern int scene9_fragment_Anime2( int time, u16 **pattern );
extern int scene9_fragment_Anime3( int time, u16 **pattern );
extern int scene9_fragment_Anime4( int time, u16 **pattern );
extern int scene9_smoke1_Anime0( int time, u16 **pattern );
extern int scene9_smoke1_Anime1( int time, u16 **pattern );
extern int scene9_smoke1_Anime2( int time, u16 **pattern );
extern int scene9_smoke1_Anime3( int time, u16 **pattern );
extern int scene9_smoke2_Anime0( int time, u16 **pattern );
enum {	S9_1,
		S9_100, S9_101, S9_102, S9_103, S9_104, S9_105, S9_106,
		S9_200, S9_201,
		S9_300, S9_301,
		S9_400
};


//// Scene １０　ピラミッドの崩壊
// BG
extern const u16	scene10_bg_Palette[96];
extern const u8		scene10_jungle_Char[]; // ChrNo.220h から展開
extern const u8		scene10_light_Char[];  // ChrNo.340h から展開
extern const u16	scene10_jungle[];
extern const u16	scene10_light[];
extern const u16	scene10_texture[];
// OBJ
#define	S10_TREASURE_X	184
#define	S10_TREASURE_Y0	141		// EndingType 0
#define	S10_TREASURE_Y1	137		// 1
#define	S10_TREASURE_Y2	132		// 2
#define	S10_TREASURE_Y3	126		// 3
extern const u16	scene10_obj_Palette[256];
extern const u8		scene10_obj_Char[];
extern int scene10_cat_wario_Anime0( int time, u16 **pattern );
extern int scene10_cat_wario_Anime1( int time, u16 **pattern );
extern int scene10_cat_wario_Anime2( int time, u16 **pattern );
extern int scene10_cat_wario_Anime3( int time, u16 **pattern );
extern int scene10_cat_wario_Anime4( int time, u16 **pattern );
extern int scene10_cat_wario_Anime5( int time, u16 **pattern );
extern int scene10_cat_wario_Anime6( int time, u16 **pattern );
extern int scene10_cat_wario_Anime7( int time, u16 **pattern );
extern int scene10_cat_wario_Anime8( int time, u16 **pattern );
extern int scene10_cat_wario_Anime9( int time, u16 **pattern );
extern int scene10_cat_wario_Anime10( int time, u16 **pattern );
extern int scene10_cat_wario_Anime11( int time, u16 **pattern );
extern int scene10_cat_wario_Anime12( int time, u16 **pattern );
extern int scene10_cat_wario_Anime13( int time, u16 **pattern );
extern int scene10_cat_wario_Anime14( int time, u16 **pattern );
extern int scene10_cat_wario_Anime15( int time, u16 **pattern );
extern int scene10_cat_wario_Anime16( int time, u16 **pattern );
extern int scene10_cat_wario_Anime17( int time, u16 **pattern );
extern int scene10_kemuri_Anime0( int time, u16 **pattern );
extern int scene10_kemuri_Anime1( int time, u16 **pattern );
extern int scene10_kemuri_Anime2( int time, u16 **pattern );
extern int scene10_etc_Anime0( int time, u16 **pattern );
extern int scene10_etc_Anime1( int time, u16 **pattern );
extern int scene10_etc_Anime2( int time, u16 **pattern );
extern int scene10_etc_Anime3( int time, u16 **pattern );
extern int scene10_etc_Anime4( int time, u16 **pattern );
extern int scene10_etc_Anime5( int time, u16 **pattern );
extern int scene10_etc_Anime6( int time, u16 **pattern );
extern int scene10_etc_Anime7( int time, u16 **pattern );
extern int scene10_etc_Anime8( int time, u16 **pattern );
extern int scene10_princess_change_Anime0( int time, u16 **pattern );
extern int scene10_princess_change_Anime1( int time, u16 **pattern );
extern int scene10_princess_change_Anime2( int time, u16 **pattern );
extern int scene10_princess_change_Anime3( int time, u16 **pattern );
extern int scene10_princess_Anime0( int time, u16 **pattern );
extern int scene10_princess_Anime1( int time, u16 **pattern );
extern int scene10_princess_Anime2( int time, u16 **pattern );
extern int scene10_princess_Anime3( int time, u16 **pattern );
extern int scene10_princess_Anime4( int time, u16 **pattern );
extern int scene10_princess_Anime5( int time, u16 **pattern );
extern int scene10_princess_Anime6( int time, u16 **pattern );
extern int scene10_princess_Anime7( int time, u16 **pattern );
extern int scene10_princess_Anime8( int time, u16 **pattern );
extern int scene10_princess_Anime9( int time, u16 **pattern );
extern int scene10_princess_Anime10( int time, u16 **pattern );
extern int scene10_princess_Anime11( int time, u16 **pattern );
extern int scene10_princess_Anime12( int time, u16 **pattern );
extern int scene10_wario_run_Anime0( int time, u16 **pattern );
extern int scene10_wario_run_Anime1( int time, u16 **pattern );
extern int scene10_wario_run_Anime2( int time, u16 **pattern );
extern int scene10_wario_run_Anime3( int time, u16 **pattern );
extern int scene10_wario_run2_Anime0( int time, u16 **pattern );
extern int scene10_wario_run2_Anime1( int time, u16 **pattern );
extern int scene10_wario_run2_Anime2( int time, u16 **pattern );
extern int scene10_wario_run2_Anime3( int time, u16 **pattern );
extern int scene10_accessories_A_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_accessories_B_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_accessories_C_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_accessories_D_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_A1_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_A2_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_A3_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_A4_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_A5_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_A6_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_A7_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_A8_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_B1_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_B2_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_B3_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_B4_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_B5_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_B6_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_B7_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_B8_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_C1_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_C2_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_C3_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_C4_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_C5_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_C6_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_C7_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_C8_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_D1_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_D2_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_D3_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_D4_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_D5_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_D6_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_D7_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
extern int scene10_kira_D8_move( int time, s16 *x, s16 *y, s16 *w, s16 *h );
enum {  S10_1, S10_2, S10_3, S10_4 };


//// キスシーン
// BG
extern const u16	kiss_bg_Palette[32]; // パレット番号１４からコピーすること
extern const u8		kiss_bg_Char[]; // ３８０ｈから展開すること
extern const u8		kiss_bg[];
extern const u16	kiss_bg_rose[];
extern const u16	kiss_princess_Palette[16]; // パレット番号１にコピーすること
extern const u8		kiss_princess1_Char[];
extern const u16	kiss_princess1[];
extern const u8		kiss_princess2_Char[];
extern const u16	kiss_princess2[];
extern const u8		kiss_princess3_Char[];
extern const u16	kiss_princess3[];
extern const u8		kiss_princess4_Char[];
extern const u16	kiss_princess4[];
extern const u16	kiss_wario_Palette[16];
extern const u8		kiss_wario_happy_Char[];
extern const u16	kiss_wario_happy[];
extern const u8		kiss_wario_unhappy_Char[];
extern const u16	kiss_wario_unhappy[];
extern int Kiss_princess_move( s16 endingType, int time, s16 *x, s16 *y );
extern int Kiss_wario_move( s16 endingType, int time, s16 *x, s16 *y );
// OBJ
extern const u16	kiss_obj_Palette[16];
extern const u8		kiss_obj_Char[];
extern int Kiss_Message_E_Anime0( int time, u16 **pattern );
extern int Kiss_Message_J_Anime0( int time, u16 **pattern );
enum { KISS_0, KISS_1, KISS_2, KISS_3, KISS_4 };


//// Scene １１　昇天するお姫様（　Scene １０　ピラミッドの崩壊　の続き）
// BG
// OBJ
extern int scene11_angel_A_move( int time, s16 *x, s16 *y );
extern int scene11_angel_B_move( int time, s16 *x, s16 *y );
extern int scene11_angel_C_move( int time, s16 *x, s16 *y );
extern int scene11_angel_D_move( int time, s16 *x, s16 *y );
extern int scene11_kira_A1_move( int time, s16 *x, s16 *y );
extern int scene11_kira_A2_move( int time, s16 *x, s16 *y );
extern int scene11_kira_B1_move( int time, s16 *x, s16 *y );
extern int scene11_kira_B2_move( int time, s16 *x, s16 *y );
extern int scene11_kira_C1_move( int time, s16 *x, s16 *y );
extern int scene11_kira_C2_move( int time, s16 *x, s16 *y );
extern int scene11_kira_D1_move( int time, s16 *x, s16 *y );
extern int scene11_kira_D2_move( int time, s16 *x, s16 *y );
extern int scene11_princess_move( int endingtype, int time, s16 *x, s16 *y );
enum {  S11_0, S11_1, /*S11_2,*/ S11_3, S11_4, S11_5, S11_6, S11_7,
		S11_100, S11_101, S11_102, S11_103
};


//// 新聞紙と猫の影（ＥＮＤ）
// BG
#define NEWSPAPER_END_MSG_J_W		13
#define NEWSPAPER_END_MSG_E_W		22
#define	NEWSPAPER_END_MSG_J_TOP		456
#define	NEWSPAPER_END_MSG_E_TOP		452
extern const u16	newspaper_END_Palette[112];
extern const u8		newspaper_END_Char[];
extern const u16	newspaper_END[];
extern const u16	newspaper_END_cat[];
extern const u16	newspaper_END_msgJ_U[ NEWSPAPER_END_MSG_J_W * 1 + 0 ];
extern const u16	newspaper_END_msgJ_D[ NEWSPAPER_END_MSG_J_W * 1 + 0 ];
extern const u16	newspaper_END_msgE_U[ NEWSPAPER_END_MSG_E_W * 1 + 9 ];
extern const u16	newspaper_END_msgE_D[ NEWSPAPER_END_MSG_E_W * 1 + 9 ];
// OBJ
extern const u16	newspaper_END_obj_Palette[64];
extern const u8		newspaper_END_obj_Char[];
extern int newspaper_END_push_start_Anime0( int time, u16 **pattern );
extern int newspaper_END_push_start_Anime1( int time, u16 **pattern );
extern int newspaper_END_push_start_Anime2( int time, u16 **pattern );
extern int newspaper_END_push_start_Anime3( int time, u16 **pattern );
extern int newspaper_END_the_end_Anime0( int time, u16 **pattern );
enum { NEWS_E0, NEWS_E1, NEWS_E2, NEWS_E3, NEWS_E4, NEWS_E5, NEWS_E6, NEWS_E7,  NEWS_E8 };


//// 超ハードメッセージ表示
// BG
extern const u16	super_hard_Palette[80];
extern const u8		super_hard_Char[];
extern const u16	super_hard_bg[];
extern const u16	super_hard_board[];
extern const u16	super_hard_board_E12[];
extern const u16	super_hard_board_J12[];
extern const u16	super_hard_board_00[];
extern const u16	super_hard_E[];
extern const u16	super_hard_J[];
extern const u16	super_hard_E12[];
extern const u16	super_hard_J12[];
extern const u16	super_hard_E00[];
extern const u16	super_hard_J00[];
enum { SH_0, SH_1, SH_2, SH_3 };


//--------------------------------------------------------------
//		定数定義
//--------------------------------------------------------------

//// 各シーンのイベント変更時刻の定義

#define	NINTENDO_START_TIME			0
#define	NINTENDO_EXIT_TIME			50 //500
#define	SCENE1_0_START_TIME			30	// 0.5秒待ち
#define	SCENE1_0_EXIT_TIME			(	2 + SCENE1_0_START_TIME )
#define	SCENE1_1_EXIT_TIME			(   2 + SCENE1_0_EXIT_TIME )
#define	SCENE1_2_EXIT_TIME			( 200 + SCENE1_1_EXIT_TIME )
#define	SCENE1_3_EXIT_TIME			( 2 /*480*/ + SCENE1_2_EXIT_TIME )

#define	SCENE2_0_EXIT_TIME		   510 /*32*/
#define	SCENE2_1_START_TIME			32
#define	SCENE2_1_EXIT_TIME		(	32 + SCENE2_1_START_TIME )
#define	SCENE2_2_EXIT_TIME		(  64+18 + SCENE2_1_EXIT_TIME )	// 18: 0.3秒遅延
#define	SCENE2_3_EXIT_TIME		( 268-18 + SCENE2_2_EXIT_TIME )
#define	SCENE2_BGM_START_TIME	( 120 + SCENE2_1_EXIT_TIME ) // 120: 2秒遅延
#define	SCENE3_LIGHTOFF1_TIME		140
#define	SCENE3_LIGHTON1_TIME		( SCENE3_LIGHTOFF1_TIME +12 )
#define	SCENE3_LIGHTOFF2_TIME		( SCENE3_LIGHTON1_TIME  +12 )
#define	SCENE3_LIGHTON2_TIME		( SCENE3_LIGHTOFF2_TIME +12 )
#define	SCENE3_EXIT_TIME			350
#define	SCENE4_EXIT_TIME			250
#define	WARIO4_NIGHT_EXIT_TIME		400	// 夜景表示の終了時間
#define	WARIO4_TITLE_APPEAR_TIME	700	// ＷＡＲＩＯ４登場時間
#define	NEWSPAPER_EXIT_TIME			80
#define	DEMO_START_TIME				3600	// １分

//// 各シーンのシーケンス値の定義
enum {
	TL_INIT = 0,
	TL_INIT_EXEC,
	TL_NINTENDO_INIT,
	TL_NINTENDO_EXEC,
	TL_SCENE0_INIT,
	TL_SCENE0_EXEC,
	TL_SCENE1_INIT,
	TL_SCENE1_EXEC,
	TL_SCENE2_INIT,
	TL_SCENE2_EXEC,
	TL_SCENE3_INIT,
	TL_SCENE3_EXEC,
	TL_SCENE4_INIT,
	TL_SCENE4_EXEC,
	TL_NEWSPAPER_INIT,
	TL_NEWSPAPER_EXEC,
	TL_WARIO4_INIT,
	TL_WARIO4_EXEC,
	TL_PUSH_START,

	TL_PYRAMID_INIT,
	TL_PYRAMID_EXEC,
	TL_SCENE7_INIT,
	TL_SCENE7_EXEC,
	TL_SCENE8_INIT,
	TL_SCENE8_EXEC,
	TL_END,

	TL_SCENE9_INIT,
	TL_SCENE9_EXEC,
	TL_SCENE10_INIT,
	TL_SCENE10_EXEC,
	TL_KISS_INIT,
	TL_KISS_EXEC,
	TL_SCENE11_INIT,
	TL_SCENE11_EXEC,
	TL_SCENE12_INIT,

	TL_SCENE20_INIT,
	TL_SCENE20_EXEC,
//	TL_SCENE21_INIT,
//	TL_SCENE21_EXEC,
//	TL_SCENE22_INIT,
//	TL_SCENE22_EXEC,
	TL_SCENE23_INIT,
	TL_SCENE23_EXEC,
	TL_SCENE24_INIT,
	TL_SCENE24_EXEC,
	TL_NEWS_END_INIT,
	TL_NEWS_END_EXEC,
	TL_SUPER_HARD_INIT,
	TL_SUPER_HARD_EXEC,
	TL_THE_END,

	TL_QUICK_INIT,

	TL_SEQ_MAX = TL_SUPER_HARD_EXEC
};

//--------------------------------------------------------------
//		関数定義
//--------------------------------------------------------------
static void bg_param_init(void);
static void ob_param_init(void);
int GameTitle();
static void	TitVblkIntr0( void );
static void Initialize( int seq );
static void	Init( void );
static void	Init_Exec( int time );
static void	Nintendo_Init( void );
static void	Nintendo_Exec( int time );
static void	Scene0_Init( void );
static void	Scene0_Exec( int time );
static void	Scene1_Init( void );
static void	Scene1_Exec( int time );
static void	Scene2_Init( void );
static void	Scene2_SetPattern( int i );
static void	Scene2_Exec( int time );
static void	Scene3_Init( void );
static void	Scene3_Exec( int time );
static void	Scene4_Init( void );
static void	Scene4_Exec( int time );
static u16 * Scene4_SetCarObj( u16 *pObj );
static void	Newspaper_Init( void );
static void	Newspaper_Exec( int time );
static void	Newspaper_END_Init( void );
static void	Newspaper_END_Exec( int time );
static void	Wario4_Init( void );
static void	Wario4_Exec( int time );
static u16 * scene5_car_move( u16* oam, int seq, int time );
static void Pyramid_Init( void );
static void Pyramid_Exec( int time );
static void	Scene7_Init( void );
static void	Scene7_Exec( int time );
static void	Scene8_Init( void );
static void	Scene8_Exec( int time );
static void	Scene9_Init( void );
static void	Scene9_Exec( int time );
static void	Scene10_Init( void );
static void	Scene10_Exec( int time );
static void	Kiss_Init( void );
static void	Kiss_Exec( int time );
static void	Scene11_Init( void );
static void	Scene11_Exec( int time );
static void Super_Hard_Init( void );
static void Super_Hard_Exec( int time );

static void GetEndingType( void );	// エンディングタイプを得る



// ＢＧ及びＯＢＪの回転拡大縮小パラメータ変数値を計算する
static u16 * bg_pabcd_calc( u16 *buf, int rotate, int scale_x, int scale_y, int p0x, int p0y );
static void SetObjPABCD( int index, int rotate, int scale_x, int scale_y );

// デバッグ用
static void	debug_bg_param_control( void );	// キー入力によりＢＧパラメータを変化させる
static void debug_ob_param_control( void );	// キー入力によりＯＢＪをコントロールする
static void debug_EVABY_control( void );	// キー入力によりブレンド係数か輝度係数を変化させる
static void debug_bg_scroll( int bg );		// キー入力によりＢＧをスクロールさせる
static void debug_scene_control( void );	// シーンを変える

// ヘルパー関数
static void V_Wait(void);	// Ｖブランク待ち
static void BlockCopy( u16 *src, u16 *dst, u16 srcWidth, u16 srcHeight, u16 dstWidth );	// u16矩形データをコピーする
static u16* SetObj( u16 *src, u16 *dst, int x, int y );	// ＯＢＪをセットする
static void EndObj( u16 *dst );	// ＯＢＪ終端までにあるゴミＯＢＪを画面外に出す
static void bg_regs_init(void);	// ＢＧ表示レジスタを初期化する
static void UnPackScreen( u16* src, u16* dst );	// 圧縮スクリーンデータの展開
static void SetBLDDownMin( u16 bg );	// BLD_DOWN  0 を設定する
static void SetBLDDownMax( u16 bg );	// BLD_DOWN 16 を設定する
static void SetBLDUpMin( u16 bg );		// BLD_UP    0 を設定する
static void SetBLDUpMax( u16 bg );		// BLD_UP   16 を設定する
static BOOL FadeInc( u16 interval );	// フェード値のインクリメント
static BOOL FadeDec( u16 interval );	// フェード値のデクリメント

//--------------------------------------------------------------
//		変数定義
//--------------------------------------------------------------
//  ＢＧ回転拡大縮小パラメータ
	s16		bg_pos_x, bg_pos_y;			// 画面の中心を(０,０)とするキャラクターの中心座標
	u16		bg_rotate;					// ２５６で１回転
	u16		bg_scale_x, bg_scale_y;		// 拡大縮小率
	s16		bg_pabcd_buf[8];			// 回転拡大縮小パラメータ保存用	
	s16		bg_offset_x, bg_offset_y;	// 参照開始点スクロール

	s16		bg_scroll_x, bg_scroll_y;	// テキストＢＧスクロール値

//  ＯＢＪ回転拡大縮小パラメータ
	s16		ob_pos_x, ob_pos_y;			// 画面の中心を(０,０)とするキャラクターの中心座標
	u16		ob_rotate;					// ２５６で１回転
	u16		ob_scale_x, ob_scale_y;		// 拡大縮小率
	u16		ob_affine;					// ２倍角表示

#define SCENE4_CAR_MIN_PALETTE	4
#define SCENE4_CAR_MAX_PALETTE	12
	u16		ob_palette;			// パレット番号
	u16		ob_priority;		// プライオリティ

// αブレンド係数
	u16		uEVA, uEVB,	uEVY;

// その他
	u16		sLocalSeq;			// 各シーン毎に使用するローカルなシーケンス変数
	u32		uLocalTime;			// 各シーン毎に使用するローカルなタイマー変数
	u32		uLocalTime2;		// 各シーン毎に使用するローカルなタイマー変数

	u32		uObjSize;			// ＯＢＪの個数(byte)
	u16	*	pObjEnd;			// ＯＢＪの終端アドレス

	BOOL	bQuickStart;
	BOOL	bMsgJapanese;

	BOOL	bEnding;			// エンディング開始フラグ
	u16		usTreasureCount;	// 宝物個数　０〜１２
	s16		sTreasureScale;		// 宝物の拡大率
	u16		usEndingType;		// エンディングタイプ (bad)0,1,2,3(good)


//// 汎用ポインタ
static	u16		*ptr0, *ptr1, *ptr2, *ptr3;

//// 汎用ワーク
static	s16		sWork0, sWork1, sWork2, sWork3,
				sWork4, sWork5, sWork6, sWork7;
static  s16		saWork0[8], saWork1[8];


//// Scene4
#define		s4_cat_x			sWork0
#define		s4_cat_y			sWork1
#define		s4_paper_x			sWork2
#define		s4_paper_y			sWork3

//// Newspaper
#define		s4_msgSize			sWork0
#define		s4_msgWidth			sWork1

//// Scene5 ( Wario4 )
#define		s5_pushstart_x		sWork0
#define		s5_car_x			sWork1
#define		s5_car_y			sWork2
#define		s5_car_t			bg_rotate
#define		s5_smoke_x			sWork3
#define		s5_smoke_y			sWork4
#define		s5_super_hard		sWork5	// 超ハード　フラグ

//// Scene6 ( Pyramid )
#define		s6_bg1_y			sWork0
#define		s6_bg2_y			sWork1
#define		s6_iwaL_x			sWork2
#define		s6_iwaL_y			sWork3
#define		s6_iwaR_x			sWork4
#define		s6_iwaR_y			sWork5
#define		s6_smoke_x			sWork6
#define		s6_smoke_y			sWork7
#define		s6_smoke_xa			saWork0
#define		s6_smoke_ya			saWork1

//// Scene7 ( into the Pyramid )
#define		s7_cat_x			sWork0
#define		s7_cat_y			sWork1
#define		s7_smoke_x			sWork2
#define		s7_smoke_y			sWork3
#define		s7_smoke_t			sWork4

//// Scene9 ( escape from the Pyramid )
#define		s9_cat_x			sWork0
#define		s9_cat_y			sWork1
#define		s9_doctor_x			sWork2
#define		s9_doctor_y			sWork3
#define		s9_TreasureOffX		sWork4	// 拡大表示補正用
#define		s9_TreasureOffY		sWork5	// 拡大表示補正用
#define		s9_RandomSeed		sWork6
#define		s9_fragment_xa		saWork0
#define		s9_fragment_ya		saWork1

//// Scene10 ( collapse of the Pyramid )
#define		s10_pyramid_y		sWork0
#define		s10_cat_x			sWork1
#define		s10_cat_y			sWork2
#define		s10_treasure_y		sWork3
#define		s10_bAccessoriesMoveDone sWork4
#define		s10_accessoriesDoneCount sWork5
#define		s10_wario_is_surprised	 sWork6
#define		s10_wario_time		sWork7

//// Kiss
#define		kiss_princess_x		sWork0
#define		kiss_princess_y		sWork1
#define		kiss_wario_x		sWork2
#define		kiss_wario_y		sWork3
#define		kiss_bMsgON			sWork4
#define		kiss_bMsgDone		sWork5

//// Scene11
#define		s11_princess_x		sWork0
#define		s11_princess_y		sWork1
#define		s11_treasure_x		sWork2
#define		s11_treasure_y		sWork3
#define		s11_treasure_yTop	sWork4
#define		s11_treasure_speed	sWork5
#define		s11_bPriority		sWork6	// お姫様プライオリティ変更用フラグ
#define		s11_RandomSeed		sWork7
//#define	s11_light_x			sWork8
//#define	s11_light_y			sWork9
#define		s11_stars_xa		saWork0
#define		s11_stars_ya		saWork1

//// SUPER_HARD
#define		sH_bDone			sWork0


//--------------------------------------------------------------
// ＢＧ用パラメータ変数を初期化する
//--------------------------------------------------------------
static void bg_param_init( void )
{
	// 回転拡大縮小用変数の初期化
    bg_pos_x = 0;
    bg_pos_y = 0;
    bg_rotate = 0;
    bg_scale_x = 0x100;
    bg_scale_y = 0x100;
	bg_offset_x = 0;
	bg_offset_y = 0;

	// その他

	// テキストＢＧスクロール用変数の初期化
	bg_scroll_x = 0;
	bg_scroll_y = 0;

	// αブレンド係数用変数の初期化
	uEVA = 8;	//αブレンド係数ＥＶＡ
	uEVB = 8;	//αブレンド係数ＥＶＢ
	uEVY = 0;	//輝度変更係数ＥＶＹ
}

//--------------------------------------------------------------
// ＯＢＪ用パラメータ変数を初期化する
//--------------------------------------------------------------
static void ob_param_init(void)
{
	// ＯＢＪ回転拡大縮小パラメータ変数を初期化する
    ob_pos_x = 0;
    ob_pos_y = 0;
    ob_rotate = 0;
    ob_scale_x = 0x100;
    ob_scale_y = 0x100;
    ob_affine = 0;

	// その他

	// パレット番号変数の初期化
	ob_palette = SCENE4_CAR_MAX_PALETTE;

	// プライオリティ変数の初期化
	ob_priority = 0;
}

//**************************************************************
//		メインルーチン
//**************************************************************

int GameTitle()
{
	int		nResult = 0;
	BOOL	bFromDemo = FALSE;	// タイトルゲームデモから返って来たかどうか

	if ( sGameSeq == TITLE_WARIOLAND_START )
	{
		bFromDemo = TRUE;
		sGameSeq = TL_INIT;
	}
	else if ( sGameSeq == TITLE_PYRAMID_START )
		sGameSeq = TL_PYRAMID_INIT;
	else if ( sGameSeq == TITLE_ESCAPE_START )
		sGameSeq = TL_SCENE9_INIT;
	else if ( sGameSeq == TITLE_ENDING_START )
		sGameSeq = TL_SCENE20_INIT;



	switch( sGameSeq )
	{
	// プロローグ
	case TL_INIT:
		*(vu16*)REG_IE &= CASSETTE_INTR_FLAG;	//カセット割り込み以外は OFF
		SetVblkFunc( TitVblkIntr0 );			//VBLKのセット
		*(vu16*)REG_IE |= V_BLANK_INTR_FLAG;	//VBLK-INT ON

		GetEndingType();	// （宝１２個取っていれば、PUSH START カーソルを王冠に変更する）

		Initialize( TL_INIT );
		bQuickStart = FALSE;
		bMsgJapanese = ucLanguage ;	// ucLanguage : "g_gmap.h"
		bEnding = FALSE;
		sGameSeq = bFromDemo ? TL_QUICK_INIT : TL_NINTENDO_INIT ;

#if TITLE_DEBUG_MODE
	//	if ( usCont & R_BUTTON )	bMsgJapanese ^= 1;
		if ( usCont & R_BUTTON )	sGameSeq = TL_SCENE20_INIT;

		if ( usCont & L_BUTTON )	sGameSeq = TL_SCENE9_INIT;
#endif

	break;
	case TL_INIT_EXEC:		Init_Exec( usFadeTimer++ ); break;
	case TL_NINTENDO_INIT:	Initialize( TL_NINTENDO_INIT ); break;
	case TL_NINTENDO_EXEC:	Nintendo_Exec( usFadeTimer++ ); break;
	case TL_SCENE0_INIT:	Initialize( TL_SCENE0_INIT ); break;
	case TL_SCENE0_EXEC:	Scene0_Exec( usFadeTimer++ ); break;
	case TL_SCENE1_INIT:	Initialize( TL_SCENE1_INIT ); break;
	case TL_SCENE1_EXEC:	Scene1_Exec( usFadeTimer++ ); break;
	case TL_SCENE2_INIT:	Initialize( TL_SCENE2_INIT ); break;
	case TL_SCENE2_EXEC:	Scene2_Exec( usFadeTimer++ ); break;
	case TL_SCENE3_INIT:	Initialize( TL_SCENE3_INIT ); break;
	case TL_SCENE3_EXEC:	Scene3_Exec( usFadeTimer++ ); break;
	case TL_SCENE4_INIT:	Initialize( TL_SCENE4_INIT ); break;
	case TL_SCENE4_EXEC:	Scene4_Exec( usFadeTimer++ ); break;
	case TL_NEWSPAPER_INIT:	Initialize( TL_NEWSPAPER_INIT ); break;
	case TL_NEWSPAPER_EXEC:	Newspaper_Exec( usFadeTimer++ ); break;
	case TL_WARIO4_INIT:	Initialize( TL_WARIO4_INIT ); break;
	case TL_WARIO4_EXEC:	Wario4_Exec( usFadeTimer++ ); break;
	case TL_PUSH_START:		Init();
							nResult = TITLE_RESULT_PUSH_START;
							break;

	case TL_PYRAMID_INIT:	*(vu16*)REG_IE &= CASSETTE_INTR_FLAG;	//カセット割り込み以外は OFF
							SetVblkFunc( TitVblkIntr0 );			//VBLKのセット
							*(vu16*)REG_IE |= V_BLANK_INTR_FLAG;	//VBLK-INT ON
							Init();
							Initialize( TL_PYRAMID_INIT ); break;
	case TL_PYRAMID_EXEC:	Pyramid_Exec( usFadeTimer++ ); break;
	case TL_SCENE7_INIT:	Initialize( TL_SCENE7_INIT ); break;
	case TL_SCENE7_EXEC:	Scene7_Exec( usFadeTimer++ ); break;
	case TL_SCENE8_INIT:	Initialize( TL_SCENE8_INIT ); break;
	case TL_SCENE8_EXEC:	Scene8_Exec( usFadeTimer++ ); break;
	case TL_END:			Init();
							nResult = TITLE_RESULT_END;
							break;


	// ピラミッドから脱出
	case TL_SCENE9_INIT:	*(vu16*)REG_IE &= CASSETTE_INTR_FLAG;	//カセット割り込み以外は OFF
							SetVblkFunc( TitVblkIntr0 );			//VBLKのセット
							*(vu16*)REG_IE |= V_BLANK_INTR_FLAG;	//VBLK-INT ON
							bMsgJapanese = ucLanguage ;	// ucLanguage : "g_gmap.h"
							GetEndingType();
							Init();
							Initialize( TL_SCENE9_INIT ); break;
	case TL_SCENE9_EXEC:	Scene9_Exec( usFadeTimer++ ); break;
	case TL_SCENE10_INIT:	Initialize( TL_SCENE10_INIT ); break;
	case TL_SCENE10_EXEC:	Scene10_Exec( usFadeTimer++ ); break;
	case TL_KISS_INIT:		Initialize( TL_KISS_INIT ); break;
	case TL_KISS_EXEC:		Kiss_Exec( usFadeTimer++ ); break;
	case TL_SCENE11_INIT:	Initialize( TL_SCENE11_INIT ); break;
	case TL_SCENE11_EXEC:	Scene11_Exec( usFadeTimer++ ); break;
	case TL_SCENE12_INIT:	Init();
							nResult = TITLE_RESULT_ESCAPE;
							break;


	// エピローグ（シーン１からシーン６（ＴＨＥ　ＥＮＤ）まで）
	case TL_SCENE20_INIT:	*(vu16*)REG_IE &= CASSETTE_INTR_FLAG;	//カセット割り込み以外は OFF
							SetVblkFunc( TitVblkIntr0 );			//VBLKのセット
							*(vu16*)REG_IE |= V_BLANK_INTR_FLAG;	//VBLK-INT ON
							bMsgJapanese = ucLanguage ;	// ucLanguage : "g_gmap.h"
							bEnding = TRUE;
							GetEndingType();
							Init();
							Initialize( TL_SCENE0_INIT ); break;
	case TL_SCENE20_EXEC:	Scene0_Exec( usFadeTimer++ ); break;
//	case TL_SCENE21_INIT:	Initialize( TL_SCENE1_INIT ); break;
//	case TL_SCENE21_EXEC:	Scene1_Exec( usFadeTimer++ ); break;
//	case TL_SCENE22_INIT:	Initialize( TL_SCENE2_INIT ); break;
//	case TL_SCENE22_EXEC:	Scene2_Exec( usFadeTimer++ ); break;
	case TL_SCENE23_INIT:	Initialize( TL_SCENE3_INIT ); break;
	case TL_SCENE23_EXEC:	Scene3_Exec( usFadeTimer++ ); break;
	case TL_SCENE24_INIT:	Initialize( TL_SCENE4_INIT ); break;
	case TL_SCENE24_EXEC:	Scene4_Exec( usFadeTimer++ ); break;
	case TL_NEWS_END_INIT:	Initialize( TL_NEWS_END_INIT ); break;
	case TL_NEWS_END_EXEC:	Newspaper_END_Exec( usFadeTimer++ ); break;
	case TL_SUPER_HARD_INIT: Initialize( TL_SUPER_HARD_INIT ); break;
	case TL_SUPER_HARD_EXEC: Super_Hard_Exec( usFadeTimer++ ); break;
	case TL_THE_END:		ucResetStop = 0; // リセット許可
							Init();
							nResult = TITLE_RESULT_ENDING; break;


	// クイックスタート
	case TL_QUICK_INIT:		Initialize( TL_QUICK_INIT ); break;

	default:	break;
	}

	//// 回転拡大縮小パラメータ変数値を計算する
	bg_pabcd_calc((u16 *)bg_pabcd_buf, bg_rotate, bg_scale_x, bg_scale_y,
					LCD_CENTER_X - bg_pos_x, LCD_CENTER_Y - bg_pos_y );

	//// クイックスタートチェック
	if ( TL_NINTENDO_INIT < sGameSeq && sGameSeq < TL_WARIO4_EXEC )
	{
		if ( usTrg & (START_BUTTON | A_BUTTON) )
		{
			m4aSongNumStartOrChange( S_CURSOL_1 );	// 効果音
			sGameSeq = TL_QUICK_INIT;
		}
	}


#if TITLE_DEBUG_MODE
	if ( usCont & SELECT_BUTTON )
		debug_scene_control();
	else
		debug_bg_param_control();
#endif

	return	nResult;
}

//==============================================================
//		Ｖブランク関数
//==============================================================
static void TitVblkIntr0(void)
{
	 s16  *s;

	m4aSoundVSync();

	//OAMを転送
	if ( uObjSize )
		DmaCopy(3, OamBuf, OAM, uObjSize, 32);

	// ＢＧ回転拡大縮小パラメータをセット
	s = (s16 *)bg_pabcd_buf;

	*(vs16 *)REG_BG2PA  = *s++;
	*(vs16 *)REG_BG2PB  = *s++;
	*(vs16 *)REG_BG2PC  = *s++;
	*(vs16 *)REG_BG2PD  = *s++;
	*(vs16 *)REG_BG2X_L = *s++;
	*(vs16 *)REG_BG2X_H = *s++;
	*(vs16 *)REG_BG2Y_L = *s++;
	*(vs16 *)REG_BG2Y_H = *s;


	if ( sGameSeq == TL_SCENE7_EXEC ) // ピラミッドの中へ
		Title_Wario_VblkSync();	// 香月さんワリオを使用するために必要

	m4aSoundMain();
}

//==============================================================
//		初期設定
//==============================================================

static void Initialize( int seq )
{
	V_Wait();

	*(vu16*)REG_DISPCNT = DISP_MODE_0;

#if TITLE_DEBUG_MODE
	*(vu16*)REG_IE &= ~V_COUNT_INTR_FLAG;	//VCOUNT-INT OFF
#endif

	// ＢＧ表示レジスタを初期化する
	bg_regs_init();

	// ＯＡＭを初期化する（回転拡大縮小パラメータも含む）
	uObjSize = 0;
	pObjEnd = (u16 *)OamBuf;
	DmaClear(3, 0x000000a0, OAM, 128*8, 32);

	// ＢＧ、ＯＢＪ用パラメータ変数を初期化する
	bg_param_init();
	ob_param_init();

	// その他の初期化
	usFadeTimer = 0;
	sLocalSeq = 0;
	uLocalTime = 0;

	switch( seq )
	{
	case TL_INIT:			Init();					break;
	case TL_NINTENDO_INIT:	Nintendo_Init();		break;
	case TL_SCENE0_INIT:	Scene0_Init();			break;
	case TL_SCENE1_INIT:	Scene1_Init();			break;
	case TL_SCENE2_INIT:	Scene2_Init();			break;
	case TL_SCENE3_INIT:	Scene3_Init();			break;
	case TL_SCENE4_INIT:	Scene4_Init();			break;
	case TL_NEWSPAPER_INIT:	Newspaper_Init();		break;
	case TL_WARIO4_INIT:	Wario4_Init();			break;
	case TL_PYRAMID_INIT:	Pyramid_Init();			break;
	case TL_SCENE7_INIT:	Scene7_Init();			break;
	case TL_SCENE8_INIT:	Scene8_Init();			break;
	case TL_SCENE9_INIT:	Scene9_Init();			break;
	case TL_SCENE10_INIT:	Scene10_Init();			break;
	case TL_KISS_INIT:		Kiss_Init();			break;
	case TL_SCENE11_INIT:	Scene11_Init();			break;
	case TL_SUPER_HARD_INIT: Super_Hard_Init();		break;
	case TL_NEWS_END_INIT:	Newspaper_END_Init();	break;
	case TL_QUICK_INIT:		bQuickStart = TRUE;
							Wario4_Init();			break;
	default:
	}

	if ( seq == TL_QUICK_INIT )
		sGameSeq = TL_WARIO4_EXEC;
	else
		sGameSeq++;
}

//--------------------------------------------------------------
////	ＶＲＡＭの初期化
//--------------------------------------------------------------
static void Init(void)
{
#define	BG0_TOP		0x8000

	// ＶＲＡＭクリアー
	DmaClear(3, 0x00000000, PLTT, PLTT_SIZE, 32);					// Palette
	DmaClear(3, 0xffffffff, (u32 *)((u8 *)BG_VRAM + 1020*32), 64, 32);	// CharNo.1020,1021
	DmaClear(3, 0x00000000, (u32 *)((u8 *)BG_VRAM + 1022*32), 64, 32);	// CharNo.1022,1023
	DmaClear(3, 0x03ff03ff, (u32 *)((u8 *)BG_VRAM + BG0_TOP), 0x800*8, 32);	// BG(256x256) ８枚分 

	*(vu16 *)REG_BLDCNT    = 0x0000;
	*(vu16 *)REG_BLDALPHA  = 0x0000; //0x000f;

    *(vu16 *)REG_DISPCNT = DISP_MODE_0;
}
static void Init_Exec( int time )
{
	if ( uLocalTime++ == 20 ) // 適当に待ち（リセットからのキーチャタリングを吸収）
		sGameSeq++;
}
#undef	BG0_TOP

//--------------------------------------------------------------
//// "Nintendo Presents"
//--------------------------------------------------------------
static void Nintendo_Init( void )
{
#define	BG0_TOP		0x8000
#define	BG2_TOP		0x8800

	 s16 *s;
	vs16 *d;

	// Index 255 のキャラクタビットを 0x00 でクリアーする
	DmaClear(3, 0x00000000, (u16 *)((u8 *)BG_VRAM + 255*64), 64, 32);

	// 256x256 Screen ２枚分を Index 255 でクリアーする
	DmaClear(3, 0xffffffff, (u16 *)((u8 *)BG_VRAM + BG0_TOP), 0x800*2, 32); 
	
	DmaCopy(3, nintendo_Palette, BG_PLTT, sizeof(nintendo_Palette), 16);

	BlockCopy( (u16 *)nintendo, (u16 *)((u8 *)BG_VRAM + BG2_TOP + NINTENDO_TOP),
		( NINTENDO_W / 2 ), NINTENDO_H, ( SCREEN_CHR_WIDTH / 2 ));// 元データバイトサイズ転送

	UnPackScreen( (u16 *)presents, (u16 *)((u8 *)BG_VRAM + BG0_TOP) );

	//ＢＧ０
	*(vu16*)REG_BG0CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_1
		| ((BG0_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);

	//ＢＧ２
	*(vu16*)REG_BG2CNT = BG_COLOR_256 | BG_SCREEN_SIZE_1 | BG_PRIORITY_0
		| ((BG2_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);


	// 回転拡大縮小パラメータ変数値を計算する
	bg_pos_y = 8;
	bg_scale_x = 0x300;		// 3.0 倍
	bg_scale_y = 0x002;		// 1/128 倍
	bg_pabcd_calc((s16 *)bg_pabcd_buf, bg_rotate, bg_scale_x, bg_scale_y,
					LCD_CENTER_X - bg_pos_x, LCD_CENTER_Y - bg_pos_y );

	d = (vs16 *)REG_BG2PA;
	s = (s16 *)bg_pabcd_buf;
	*d++ = *s++;
	*d++ = *s++;
	*d++ = *s++;
	*d++ = *s++;
	*d++ = *s++;
	*d++ = *s++;
	*d++ = *s++;
	*d   = *s;

	*(vu16 *)REG_DISPCNT = DISP_MODE_1;
}
static void Nintendo_Exec( int time )
{
	switch ( sLocalSeq )
	{
	case NIN_0:
		LZ77UnCompVram( (u8 *)nintendo_Char, (u16 *)BG_VRAM );
		uLocalTime = 0;
		sLocalSeq++;

		//BGM_タイトル イントロ・デモ
		m4aSongNumStartOrChange( M_BGM_TITLE_INTRO );
	break;

	case NIN_1:
		if ( uLocalTime++ == NINTENDO_START_TIME )
		{
			*(vu16 *)REG_DISPCNT = DISP_MODE_1 | DISP_BG0_ON | DISP_BG2_ON;
			uLocalTime = 0;
			sLocalSeq++;
		}
	break;

	case NIN_2:	//// “Ｎｉｎｔｅｎｄｏ”文字列の伸縮
		// Ｘ方向を元の大きさまで縮小
		if ( bg_scale_x > 0x100)
			bg_scale_x -= 0x10;

		// Ｙ方向の伸縮
		if ( uLocalTime < 28 )
		{	// 初期値から２倍毎に拡大
			if ( (time & 3 ) == 3 )	// time       0,     3,    7,    11,   15,  19,  23,  27, 
				bg_scale_y <<= 1;	// bg_scale_y 1/128, 1/64, 1/32, 1/16, 1/8, 1/4, 1/2, 1/1 
		}
		else if ( uLocalTime < 32 )
			bg_scale_y += 0x10;
		else
		{	if (bg_scale_y > 0x100 )
				bg_scale_y -= 0x10;
			else
			{	bg_scale_y = 0x100;
				uLocalTime = 0;
				sLocalSeq++;
				break;
			}
		}
		uLocalTime++;
	break;

	case NIN_3: //// “Ｐｒｅｓｅｎｔｓ”文字列のカラーチェンジ
	{
#define	PRESENTS_TONE	32	// カラーを３２階調に分割する

		int rgb;
		int t = uLocalTime++ / 2 ;

		if ( t < PRESENTS_TONE )
		{
			rgb = 30 * t / PRESENTS_TONE;
			*((u16 *)BG_PLTT + 21) = rgb << 10 | rgb << 5 | rgb ; // 0x0000〜0x7bde に変化する

			rgb = 20 * t / PRESENTS_TONE;
			*((u16 *)BG_PLTT + 22) = rgb << 10 | rgb << 5 | rgb ; // 0x0000〜0x5294 に変化する

			rgb = 12 * t / PRESENTS_TONE;
			*((u16 *)BG_PLTT + 23) = rgb << 10 | rgb << 5 | rgb ; // 0x0000〜0x318c に変化する

			rgb = 6 * t / PRESENTS_TONE;
			*((u16 *)BG_PLTT + 25) = rgb << 10 | rgb << 5 | rgb ; // 0x0000〜0x18c6 に変化する
		}
		else
		{	uLocalTime  = 0;
			sLocalSeq++;

			SetBLDDownMin( BLD_BD | BLD_BG0 | BLD_BG2 );	// black 0
		}
	}
	break;

	case NIN_4:

	//	if ( uLocalTime > 100 )
			FadeInc(3);		// normal -> black
		//	FadeInc(15);	// normal -> black

		//// 終了？
		if ( uLocalTime++ == NINTENDO_EXIT_TIME )
			sGameSeq++;
	break;
	}
}
#undef	BG0_TOP
#undef	BG2_TOP


//--------------------------------------------------------------
//// Scene 0　街の夜
//--------------------------------------------------------------
static void Scene0_Init( void )
{
#define	BG0_TOP		0x8000
#define	BG1_TOP		0x8800
#define	S0_BLD_BG	( BLD_OBJ | BLD_BG0 | BLD_BG1 )

	u16 *p;

	//パレット（ＢＧ，ＯＢＪ共通）
	DmaCopy(3, scene0_Palette, BG_PLTT, sizeof(scene0_Palette), 16);
	DmaCopy(3, scene0_Palette, OBJ_PLTT, sizeof(scene0_Palette), 16);

	//キャラクタ
	LZ77UnCompVram( (u8 *)scene0_Char, (u16 *)BG_VRAM );
	LZ77UnCompVram( (u8 *)scene0_obj_Char, (u16 *)OBJ_MODE0_VRAM );

	//スクリーンをセット
	DmaClear(3, 0x0000, (u16 *)((u8 *)BG_VRAM + BG0_TOP ), 0x800*2, 16);
	UnPackScreen( (u16 *)scene0_mask, (u16 *)((u8 *)BG_VRAM + BG0_TOP ) );
	p = bEnding ? (u16 *)scene0_ending : (u16 *)scene0_opening ;
	UnPackScreen( p, (u16 *)((u8 *)BG_VRAM + BG1_TOP ) );

	//ＢＧ０〜１をセット
	*(vu16*)REG_BG0CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_0
		| ((BG0_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG1CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_0
		| ((BG1_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);

	// 街ＢＧスクロール初期値
	bg_scroll_y = 0;

	SetBLDDownMax( S0_BLD_BG ); // black 16

	V_Wait();

	if ( bEnding )
		*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_OBJ_ON ;
	else
		*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_BG0_ON | DISP_BG1_ON;
}

static void Scene0_Exec( int time )
{
	u16 *pObj, *pMsg = 0;
	BOOL bDone = FALSE;

	// オープニングシーンの場合（街の夜のＢＧを出す、メッセージは出さない）
	if ( !bEnding )
	{	switch ( sLocalSeq )
		{
		case S0_0:

			FadeDec(3);	// black -> normal

			if ( uLocalTime++ > 120 )
			{	uLocalTime = 0;
				sLocalSeq++;
			}
		break;

		case S0_1:

			// 街の夜を上から下にスクロールさせる
			if ( bg_scroll_y < 96 )
			{
				if		( bg_scroll_y < 80 && (time & 1 ) )			bg_scroll_y++;
				else if ( bg_scroll_y < 90 && ((time & 3 ) == 3 ))	bg_scroll_y++;
				else { if ((time & 7 ) == 7 )	bg_scroll_y++; }

				*(vu16*)REG_BG1VOFS = bg_scroll_y;
			}
			else
			{	if ( uLocalTime++ > 80 )
				{	uLocalTime = 0;
					sGameSeq++;
				}
			}
		break;
		}
	}

	// エンディングシーンの場合（ＢＧは出さずに、メッセージのみ出す）
	else
	{	switch ( sLocalSeq )
		{
		case S0_0:

			FadeDec(3);	// black -> normal

			if ( uLocalTime++ > 120 )
			{	uLocalTime = 0;
				sLocalSeq++;
			}
		break;

		case S0_1:

			if ( bMsgJapanese )	bDone = scene0_J_Anime0( uLocalTime++, &pMsg );
			else				bDone = scene0_E_Anime0( uLocalTime++, &pMsg );

			if ( bDone )
			{	uLocalTime2 = 0;
				sLocalSeq++;
			}
		break;

		case S0_2:

			if ( bMsgJapanese )	scene0_J_Anime0( uLocalTime, &pMsg );
			else				scene0_E_Anime0( uLocalTime, &pMsg );

			// ＢＧＭ（次のシーンが映る２秒前にセット）
			if ( uLocalTime2 == 65 )
				m4aSongNumStartOrChange( M_BGM_TITLE );

			if ( uLocalTime2++ > 120 )
				if ( FadeInc(3) )		// 3 * 17 == 51ﾌﾚｰﾑ
					sGameSeq++;
		break;	
		}

		//// メッセージ（ＯＢＪ）のセット
		pObj = (u16 *)OamBuf;
		pObj = SetObj( pMsg, pObj, LCD_CENTER_X, LCD_CENTER_Y );
		EndObj( pObj );
	}
}
#undef	BG0_TOP
#undef	BG1_TOP

//--------------------------------------------------------------
//// Scene 1　ワリオの両足
//--------------------------------------------------------------
static void Scene1_Init( void )
{
#define	BG0_TOP		0x8000
#define	BG1_TOP		0x8800
#define	BG2_TOP		0x9000

	//ワリオの両足のパレット、キャラクター
	DmaCopy(3, scene1_Palette, BG_PLTT, sizeof(scene1_Palette), 16);
	LZ77UnCompVram( (u8 *)scene1_Char, (u16 *)BG_VRAM );

	//スクリーンをセット
	DmaClear(3, 0x0000, BG_VRAM+0x8000, 0x800*3, 16);
	UnPackScreen( (u16 *)scene1_bg0, (u16 *)((u8 *)BG_VRAM + BG0_TOP ) );
	UnPackScreen( (u16 *)scene1_bg1, (u16 *)((u8 *)BG_VRAM + BG1_TOP ) );
	UnPackScreen( (u16 *)scene1_bg2, (u16 *)((u8 *)BG_VRAM + BG2_TOP ) );

	//ＢＧ０〜２をセット
	*(vu16*)REG_BG0CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_0
		| ((BG0_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG1CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_0
		| ((BG1_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG2CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_0
		| ((BG2_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);

	*(vu16 *)REG_BLDCNT = 0;
	*(vu16 *)REG_DISPCNT = DISP_MODE_0;
}

static void Scene1_Exec( int time )
{
	if ( uLocalTime == SCENE1_0_START_TIME )
		*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_BG0_ON ; // BG0 on

	else if ( uLocalTime == SCENE1_0_EXIT_TIME )
		*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_BG1_ON ; // BG1 on

	else if ( uLocalTime == SCENE1_1_EXIT_TIME )
		*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_BG2_ON ; // BG2 on

	else if ( uLocalTime == SCENE1_2_EXIT_TIME )
		*(vu16 *)REG_DISPCNT = DISP_MODE_0;	// BG all off

	else if ( uLocalTime == SCENE1_3_EXIT_TIME )
		sGameSeq++;		// 次のシーンに移る

	uLocalTime++;
}
#undef	BG0_TOP
#undef	BG1_TOP
#undef	BG2_TOP

//--------------------------------------------------------------
//// Scene ２　車庫の中
//--------------------------------------------------------------
static void Scene2_Init( void )
{
#define	BG0_TOP		0x8000	// 512x256
#define	BG1_TOP		0x9000	// 512x256
#define	BG2_TOP		0xa000	// 256x256

	//車庫のキャラクター＆スクリーン画像
	DmaCopy(3, scene2_Palette, BG_PLTT, sizeof(scene2_Palette), 16);
	DmaClear(3, 0x0000, BG_VRAM+0x7fe0, 32, 16);	// ChrNo.3ff を抜きキャラクタにする

	// ＢＧ０〜１を ChrNo.3ff でクリアする
	DmaClear(3, 0x03ff03ff, BG_VRAM + BG0_TOP, 0x800*4, 32);

	// 車体上部 (BG0)
	UnPackScreen( (u16 *)scene2_carU, (u16 *)((u8 *)BG_VRAM + BG0_TOP) );

	// 車体下部	(BG1)
	UnPackScreen( (u16 *)scene2_carL, (u16 *)((u8 *)BG_VRAM + BG1_TOP) );

	// 地面とその下
	DmaClear(3, 0x0015, (u16 *)((u8 *)BG_VRAM + BG1_TOP) + 544, 96*sizeof(u16), 16);
	DmaClear(3, 0x0015, (u16 *)((u8 *)BG_VRAM + BG1_TOP + 0x800) + 544, 96*sizeof(u16), 16);

	// ドア(BG0)、前輪(BG1)、後輪(BG1)、地面(BG1)
	Scene2_SetPattern( 0 );

	// シャッター(BG2)
	DmaClear(3, 0x0015, BG_VRAM + BG2_TOP, 32*17*sizeof(u16), 16);
	DmaClear(3, 0x03ff, (u16 *)((u8 *)BG_VRAM + BG2_TOP) + 544, 480*sizeof(u16), 16);
	

	//各ＢＧをセット
	*(vu16*)REG_BG0CNT = BG_COLOR_16 | BG_SCREEN_SIZE_1 | BG_PRIORITY_0
		| ((BG0_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);

	*(vu16*)REG_BG1CNT = BG_COLOR_16 | BG_SCREEN_SIZE_1 | BG_PRIORITY_0
		| ((BG1_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);

	*(vu16*)REG_BG2CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_0
		| ((BG2_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);


	bg_scroll_x = -192; //-24;	// 車の初期スクロール値
	*(vu16*)REG_BG0HOFS = bg_scroll_x;
	*(vu16*)REG_BG1HOFS = bg_scroll_x;

	//モード０
	*(vu16 *)REG_DISPCNT = DISP_MODE_0;
}

// ドア(BG0)、前輪(BG1)、後輪(BG1)、地面(BG1)　スクリーンデータを転送
static void	Scene2_SetPattern( int i )
{	
	int  j;
	u16  *dst;
	u16  data;

	i &= 3;		// 0 <= i <= 3

	// ドア (BG0)
	UnPackScreen( (u16 *)scene2_door[i], (u16 *)((u8 *)BG_VRAM + BG0_TOP) ) ;

	// 前輪 (BG1)
	BlockCopy( (u16 *)scene2_frontTire[i], (u16 *)((u8 *)BG_VRAM + BG1_TOP) + SCENE2_FRONT_TIRE_TOP,
				SCENE2_FRONT_TIRE_W, SCENE2_FRONT_TIRE_H, SCREEN_CHR_WIDTH );

	// 後輪 (BG1)
	BlockCopy( (u16 *)scene2_rearTire[i], (u16 *)((u8 *)BG_VRAM + BG1_TOP) + SCENE2_REAR_TIRE_TOP,
				SCENE2_REAR_TIRE_W, SCENE2_REAR_TIRE_H, SCREEN_CHR_WIDTH );

	// 地面 (BG1)
	UnPackScreen( (u16 *)scene2_ground[i], (u16 *)((u8 *)BG_VRAM + BG1_TOP) ) ;

	// 地面 (BG1)回り込み部分
	{	static u16 ground[] = { 0x2109, 0x20C7, 0x20DE, 0x20F2 };
		data = ground[i];
		dst = (u16 *)((u8 *)BG_VRAM + BG1_TOP +0x800) +575;
		for ( j = 0 ; j < 24 ; j++)		// 24 : -192/8 初期スクロールＸ座標値	
			*dst-- = data;
	}
}

static void Scene2_Exec( int time )
{
	u16 *dst;

	switch ( sLocalSeq )
	{
	case S2_0:
			LZ77UnCompVram( (u8 *)scene2_Char, (u16 *)BG_VRAM );
			SetBLDDownMax( BLD_BD | BLD_BG0 | BLD_BG1 | BLD_BG2 );	// black 16
					
			//モード０
		    *(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_BG0_ON | DISP_BG1_ON | DISP_BG2_ON;

			V_Wait();
			*(vu16*)BG_PLTT = 0x7fff; // 背景色に白をセット 
			sLocalSeq++;
	break;

	case S2_1:

		FadeDec(15);

		if ( bg_scroll_x < -24 && ((time & 3) == 3))
		{
			bg_scroll_x++;
			*(vu16*)REG_BG0HOFS = bg_scroll_x;
			*(vu16*)REG_BG1HOFS = bg_scroll_x;
		}

		if ( time == SCENE2_0_EXIT_TIME )
		{
			uLocalTime = 0;
			sLocalSeq++;
		}
	break;

	case S2_2:
		// ドア、前後輪、地面の書き換え
		switch ( uLocalTime )
		{
		case SCENE2_1_START_TIME:	Scene2_SetPattern( 1 );	break;
		case SCENE2_1_EXIT_TIME:	Scene2_SetPattern( 2 );	break;
		case SCENE2_2_EXIT_TIME:	Scene2_SetPattern( 3 );	break;
		case SCENE2_3_EXIT_TIME:	sGameSeq++;				break;
		default:
		}

		// シャッターを上げていく
		*(vu16*)REG_BG2VOFS = uLocalTime >> 4;  // 1/16

		// 車体を左から右にスクロールさせる
		if ( bg_scroll_x < 16 )
		{
			if		( bg_scroll_x < -8 && ((time & 7 ) == 7) )	bg_scroll_x++;
			else if ( bg_scroll_x < -4 && ((time & 15 ) == 15))	bg_scroll_x++;
			else	{ if ((time & 31) == 31 )	bg_scroll_x++; }

			*(vu16*)REG_BG0HOFS = bg_scroll_x & 0x1ff;
			*(vu16*)REG_BG1HOFS = bg_scroll_x & 0x1ff;
		}

		// 車体上部を揺らす
		{	static u8 offset1[] = { 0, 3, 6, 3};
			static u8 offset2[] = { 0, 2, 4, 2};

			if ( uLocalTime > SCENE2_2_EXIT_TIME )
				*(vu16*)REG_BG0VOFS = offset2[ uLocalTime & 3 ];

			else if ( uLocalTime > SCENE2_1_EXIT_TIME )
				*(vu16*)REG_BG0VOFS = offset1[ uLocalTime >> 1 & 3 ];
		}

		// テールランプを点灯させる
	//	if ( uLocalTime == SCENE2_1_EXIT_TIME )
	//		*((u16 *)BG_PLTT + 13)= 0x001f;

		// BGM_タイトル 開始
		if ( uLocalTime == SCENE2_BGM_START_TIME )
			m4aSongNumStartOrChange( M_BGM_TITLE );
		
		uLocalTime++;
	break;
	}
}
#undef	BG0_TOP
#undef	BG1_TOP
#undef	BG2_TOP

//--------------------------------------------------------------
//// Scene ３　走行中の車
//--------------------------------------------------------------
static void Scene3_Init( void )
{
#define	BG0_TOP		0x8000	// 512x512
#define	BG1_TOP		0xa000	// 512x512
#define	BG2_TOP		0xc000	// 512x512

	// ＢＧ，ＯＢＪパレット
	DmaCopy(3, scene3_Palette, BG_PLTT, sizeof(scene3_Palette), 16);
	DmaCopy(3, scene3_obj_Palette, OBJ_PLTT, sizeof(scene3_obj_Palette), 16);

	// ＢＧ０〜２を ChrNo.3ff でクリアする
	DmaClear(3, 0x00000000, BG_VRAM+0x7fe0, 32, 32);	// ChrNo.3ff を抜きキャラクタにする
	DmaClear(3, 0x03ff03ff, BG_VRAM+0x8000, 0x800*6, 32);

	//各ＢＧをセット
	// BG0 512x256（車をスクロールさせるため）
	*(vu16*)REG_BG0CNT = BG_COLOR_16 | BG_SCREEN_SIZE_3 | BG_PRIORITY_0
		| ((BG0_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	// BG1 512x256（車の影をスクロールさせるため）
	*(vu16*)REG_BG1CNT = BG_COLOR_16 | BG_SCREEN_SIZE_3 | BG_PRIORITY_1
		| ((BG1_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	// BG2 256x256
	*(vu16*)REG_BG2CNT = BG_COLOR_16 | BG_SCREEN_SIZE_3 | BG_PRIORITY_2
		| ((BG2_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);


	bg_scroll_x = 256;	// 車の初期スクロール値
	*(vu16*)REG_BG0HOFS = bg_scroll_x;
	*(vu16*)REG_BG1HOFS = bg_scroll_x;

	//モード０
    *(vu16 *)REG_DISPCNT = DISP_MODE_0;

	// ウィンドウ０ ON
	*(vu16 *)REG_WIN0H = ( 0 << 8 ) | 240 ;		// rect(0,16,240,144);
	*(vu16 *)REG_WIN0V = (16 << 8 ) | 144 ;
	*(vu16 *)REG_WININ = WIN_BLEND_ON | WIN_BG0_ON | WIN_BG1_ON | WIN_BG2_ON | WIN_OBJ_ON ;
	*(vu16 *)REG_WINOUT = 0;
}

static void Scene3_Exec( int time )
{
	u16 *p, *pObj;
	s16	y;
	int	i, j;

	switch ( sLocalSeq )
	{
	case S3_0:
		LZ77UnCompVram( (u8 *)scene3_Char, (u16 *)BG_VRAM );
		// 背景、車の影、車体のスクリーンパーツデータ
		UnPackScreen( (u16 *)scene3_car, (u16 *)((u8 *)BG_VRAM + BG0_TOP) );
		UnPackScreen( (u16 *)scene3_shadow, (u16 *)((u8 *)BG_VRAM + BG1_TOP) );
		UnPackScreen( (u16 *)scene3_back, (u16 *)((u8 *)BG_VRAM + BG2_TOP) );
		sLocalSeq++;
	break;

	case S3_1:
		LZ77UnCompVram( (u8 *)scene3_obj_Char, (u16 *)OBJ_MODE0_VRAM );
		sLocalSeq++;
		*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_OBJ_ON |
								DISP_BG0_ON | DISP_BG1_ON | DISP_BG2_ON |
								DISP_WIN0_ON;

		SetBLDUpMin( BLD_BD | BLD_OBJ | BLD_BG0 | BLD_BG1 | BLD_BG2 );	// white 0
	break;

	case S3_2:
		// 車体を右から左にスクロールさせる
		if ( bg_scroll_x > 0 )
		{
			if		( bg_scroll_x > 80 )						bg_scroll_x-=2;
			if		( bg_scroll_x > 40 )						bg_scroll_x-=1;
			if		( bg_scroll_x > 16 )						bg_scroll_x--;
			else if ( bg_scroll_x > 8 && time & 1 )				bg_scroll_x--;
			else if ( bg_scroll_x > 4 && ((time & 3 ) == 3))	bg_scroll_x--;
			else	{ if ((time & 7 ) == 7)	bg_scroll_x--; }

			*(vu16*)REG_BG0HOFS = bg_scroll_x & 0x1ff;
			*(vu16*)REG_BG1HOFS = bg_scroll_x & 0x1ff;
		}

		//// 車体と影を揺らす
		{	static s8 offset[4] = { 0, 2, 3, 1};
			int i = time & 3;
			y = offset[i];
			*(vu16*)REG_BG0VOFS = y; // 車を上下に揺らす
			*(vu16*)REG_BG1HOFS = ( bg_scroll_x - y) & 0x1ff; // 影を左右に揺らす
		}

		//// パレットカラーチェンジ（パレット２〜１３をパレット１にコピーする）
		{	int i = time % 13; 
			u16 *s = (u16 *)BG_PLTT + 16*(i+1);
			DmaCopy(3, s, (u16 *)BG_PLTT +16, 16*sizeof(u16), 32);
		}
		
		//// フェードイン  uLocalTime : インデックスカウンタとして使用
		if		( bg_scroll_x == 240 )	*(vu16*)REG_BLDY = 1;
		else if ( bg_scroll_x == 238 )	*(vu16*)REG_BLDY = 2;
		else if ( bg_scroll_x == 236 )	*(vu16*)REG_BLDY = 3;	//  18.8%
		else if ( bg_scroll_x == 120 )	*(vu16*)REG_BLDY = 16;	// 100%
		else if ( bg_scroll_x == 116 )	*(vu16*)REG_BLDY = 15;
		else if ( bg_scroll_x == 112 )	*(vu16*)REG_BLDY = 14;
		else if ( bg_scroll_x == 108 )	*(vu16*)REG_BLDY = 13;
		else if ( bg_scroll_x == 104 )	*(vu16*)REG_BLDY = 12;
		else if ( bg_scroll_x == 100 )	*(vu16*)REG_BLDY = 11;
		else if ( bg_scroll_x ==  96 )	*(vu16*)REG_BLDY = 10;
		else if ( bg_scroll_x ==  92 )	*(vu16*)REG_BLDY = 9;
		else if ( bg_scroll_x ==  88 )	*(vu16*)REG_BLDY = 8;
		else if ( bg_scroll_x ==  84 )	*(vu16*)REG_BLDY = 7;
		else if ( bg_scroll_x ==  80 )	*(vu16*)REG_BLDY = 6;
		else if ( bg_scroll_x ==  78 )	*(vu16*)REG_BLDY = 5;
		else if ( bg_scroll_x ==  76 )	*(vu16*)REG_BLDY = 4;
		else if ( bg_scroll_x ==  74 )	*(vu16*)REG_BLDY = 3;

		// 終了？
		if ( time == SCENE3_EXIT_TIME )
			sGameSeq++;

		////　ＯＢＪセット
		scene3_Anime0( time, &p );	// ヘッドライト
		if ( ( SCENE3_LIGHTOFF1_TIME <= time && time < SCENE3_LIGHTON1_TIME ) ||
			 ( SCENE3_LIGHTOFF2_TIME <= time && time < SCENE3_LIGHTON2_TIME ) )
			p = (u16 *)0;	// ヘッドライトを消す

		i = p ? 128/(*p) : 0 ;	// i == ヘッドライトＯＢＪをあと何個表示できるか

		j = bg_scroll_x / 16 ;	// 16 : 適当な値でよい
		if ( i > j  ) i = j;

		pObj = (u16 *)OamBuf;
		if ( i )
		{	while ( i-- )
				pObj = SetObj( p, pObj, -bg_scroll_x +128 -(i<<3), 64 +y);
		}
		else
			pObj = SetObj( p, pObj, -bg_scroll_x +128, 64 +y);

		EndObj( pObj );

		break;
	}
}
#undef	BG0_TOP
#undef	BG1_TOP
#undef	BG2_TOP

//--------------------------------------------------------------
//// Scene ４　通路、走り抜ける車、背景の建物、猫（ＯＢＪ）
//--------------------------------------------------------------
static void Scene4_Init( void )
{
	// ビットマップ画像とＯＢＪのパレット
	DmaCopy(3, scene4_bg_Palette, BG_PLTT, sizeof(scene4_bg_Palette), 16);
	DmaCopy(3, scene4_obj_Palette, OBJ_PLTT, sizeof(scene4_obj_Palette), 16);

	// エンディング時は猫のパレットを変更する
	if ( bEnding == TRUE )
		DmaCopy(3, scene4_obj_Ending_cat_Palette, (u16 *)OBJ_PLTT +32,
				sizeof(scene4_obj_Ending_cat_Palette), 16);


	// 背景ビットマップの上下部分を index 0 でクリア
	DmaClear(3, 0x0000, BG_BITMAP0_VRAM, SCENE4_TOP, 16);
	DmaClear(3, 0x0000, (u8 *)BG_BITMAP0_VRAM + SCENE4_BOTTOM, SCENE4_TOP, 16);

	// 車(ＯＢＪ)のパラメータ初期値
	ob_pos_x = LCD_CENTER_X - 32;	// 車(左側)ＯＢＪのＸ座標値
	ob_pos_y = LCD_CENTER_Y + 40;
	ob_scale_y = ob_scale_x = 0x200;	// 2.0 倍

	// 音量を下げる	(tb)=M4A_TRACK_FULL, (vo)=M4A_VOLUME_4	"g_sound.h"
	if ( !bEnding ) // エンディング時は音量を下げない
		m4aMPlayVolumeControl( &m4a_mplay000, M4A_TRACK_FULL, M4A_VOLUME_4 );

	// 風の効果音
	m4aSongNumStartOrChange( S_DEMO_TITLE_WIND );

	//モード４	( bg, obj off )
    *(vu16 *)REG_DISPCNT = DISP_MODE_4;
}
static void Scene4_Exec( int time )
{
	int i;
	u16 *pCat = (u16 *)0;
	u16 *pPaper = (u16 *)0;
	u16 *pObj = (u16 *)OamBuf;


	switch ( sLocalSeq )
	{
	case S4_00:
		LZ77UnCompVram( (u8 *)scene4_Bitmap,
						(u16 *)((s8 *)BG_BITMAP0_VRAM + SCENE4_TOP) );

		LZ77UnCompVram( (u8 *)scene4_obj_Char, (u16 *)OBJ_MODE4_VRAM );

		uLocalTime = 0;
		sLocalSeq++;
	break;

	case S4_0:
		// 車と建物（ＯＢＪキャラクタ）
		V_Wait();			
		
		// 猫の初期位置
		s4_cat_x = 280;
		s4_cat_y = 144;


		// ビットマップの参照初期値オフセット
		bg_offset_y = -8;

		SetBLDDownMax( BLD_BD | BLD_OBJ | BLD_BG2 );	// black 16

		*(vu16 *)REG_DISPCNT = DISP_MODE_4 | DISP_OBJ_ON | DISP_BG2_ON;

		sLocalSeq++;
		uLocalTime = 0;
	break;

	case S4_1:

			FadeDec(15);

			uLocalTime++;

			scene4_Anime0( time, &pCat ); // 猫　歩く

			// 建物と街路をスクロールする
			switch ( uLocalTime )
			{
			case 150: case 160: case 170: case 180:
			case 190: case 200: case 210: case 220:
				bg_offset_y++;
			break;
			}


			if (( uLocalTime & 1 ) &&
				( s4_cat_x-- == LCD_CENTER_X ))
			{
				sLocalSeq++;
				uLocalTime = 0;

				// 効果音
				m4aSongNumStartOrChange( S_DEMO_TITLE_ACCEL_ON );

				// 輝度ＵＰにする（白くフェードするため）
				uLocalTime2 = 0;
				*(vu16*)REG_BLDY = 3;	// 18.8%
				*(vu16*)REG_BLDCNT = BLD_UP_MODE | BLD_BD | BLD_OBJ | BLD_BG2 ;
			}
	break;

	case S4_2:
			// 猫　気付く
			if ( scene4_Anime2( uLocalTime++, &pCat ) )
			{	sLocalSeq++;
				uLocalTime = 0;
			}
	break;

	case S4_3:
			// 猫　驚く
			if ( scene4_Anime3( uLocalTime++, &pCat ) )
			{	sLocalSeq++;
				uLocalTime = 0;
			}
	break;

	case S4_4:
			// 猫　しゃがんで震えている
			scene4_Anime10( time, &pCat );

			// 車のパレットを変える
			if (( uLocalTime & 3 ) == 3 )
				if ( ob_palette > SCENE4_CAR_MIN_PALETTE ) ob_palette--;

			// 車(OBJ)を縮小させる
			if( ob_scale_x > 0x10 )
			{
				ob_scale_x -= 0x10;	// -= 1/16
				ob_scale_y -= 0x10;	// -= 1/16
			}
			else
			{
				// 車(OBJ)がＢＧに隠れるようにする
				ob_priority = 3;
				
				// 車が坂を下るように見せる
				if ( ob_pos_y < 128 )
				{
					if (( uLocalTime & 7 ) == 7 )
						ob_pos_y++;
				}
				else
				{	sLocalSeq++;
					uLocalTime = 0 -1;

					// 舞い上がる新聞紙の初期値
					s4_paper_x = s4_cat_x - 60;	// 60
					s4_paper_y = s4_cat_y + 60;	// 204
				}
			}

			uLocalTime++;
	break;

	case S4_5:
			// 猫　しゃがんで震えている
			scene4_Anime10( time, &pCat );

			// 舞い上がる新聞紙
			scene4_Anime8( uLocalTime++, &pPaper );

			if ( s4_paper_x < s4_cat_x )  s4_paper_x++;
			if ( s4_paper_y > s4_cat_y )  s4_paper_y--;
			if ( s4_paper_x == s4_cat_x &&
				 s4_paper_y == s4_cat_y )
			{
				sLocalSeq++;
				uLocalTime = 0;

				// 効果音
				m4aSongNumStartOrChange( S_DEMO_TITLE_NEWSPAPER );
			}
	break;

	case S4_6:
			// 猫　新聞紙をかぶる
			if ( scene4_Anime7( uLocalTime++, &pCat ) )
			{
				sLocalSeq++;
				uLocalTime = 0;

				s4_paper_y -= 2;
			}
	break;

	case S4_7:
			// 舞い落ちる新聞紙
			i = uLocalTime < 55 ? uLocalTime : 54;
			scene4_Anime9( i , &pPaper );
			if ( ( uLocalTime & 3 ) == 3 )
				s4_paper_y++;

			// 猫　頭を振る
			if ( scene4_Anime5( uLocalTime++, &pCat ) )
			{
				sLocalSeq++;
				uLocalTime = 0;
			}
	break;

	case S4_8:
			// 舞い落ちた新聞紙
			scene4_Anime9( 54 , &pPaper );

			// 猫　まばたき
			if ( scene4_Anime4( uLocalTime++, &pCat ) )
			{
				sLocalSeq++;
				uLocalTime = 0;
			}
	break;

	case S4_9:
			// 舞い落ちた新聞紙
			scene4_Anime9( 54 , &pPaper );

			// 猫　下を見る
			if ( scene4_Anime6( uLocalTime++, &pCat ) )
				sGameSeq++;
	break;
	default:
	}

	// 通路壁(BG bitmap)を拡大させる
	if ( sLocalSeq >= S4_4 && ( time & 15 ) == 15 )
	{
		if ( bg_scale_x < 0x120 )
		{
			bg_scale_x++;		// += 1/256
			bg_scale_y++;		// += 1/256
		}
	}

	// フェードイン
	if ( sLocalSeq >= S4_2 )
	{
		if		( uLocalTime2 == 15 )	*(vu16*)REG_BLDY = 4;
		else if ( uLocalTime2 == 30 )	*(vu16*)REG_BLDY = 5;
		else if ( uLocalTime2 == 45 )	*(vu16*)REG_BLDY = 6;
		else if ( uLocalTime2 == 61 )	*(vu16*)REG_BLDY = 7;
		else if ( uLocalTime2 == 77 )	*(vu16*)REG_BLDY = 8;	// 50%
		else if ( uLocalTime2 == 78 )	*(vu16*)REG_BLDY = 16;	// 100%
		else if ( uLocalTime2 == 81 )	*(vu16*)REG_BLDY = 15;
		else if ( uLocalTime2 == 84 )	*(vu16*)REG_BLDY = 14;
		else if ( uLocalTime2 == 87 )	*(vu16*)REG_BLDY = 13;
		else if ( uLocalTime2 == 90 )	*(vu16*)REG_BLDY = 12;
		else if ( uLocalTime2 == 93 )	*(vu16*)REG_BLDY = 11;
		else if ( uLocalTime2 == 96 )	*(vu16*)REG_BLDY = 10;
		else if ( uLocalTime2 == 99 )	*(vu16*)REG_BLDY = 9;
		else if ( uLocalTime2 == 102)	*(vu16*)REG_BLDY = 8;
		else if ( uLocalTime2 == 105)	*(vu16*)REG_BLDY = 7;
		else if ( uLocalTime2 == 107)	*(vu16*)REG_BLDY = 6;
		else if ( uLocalTime2 == 109)	*(vu16*)REG_BLDY = 5;
		else if ( uLocalTime2 == 111)	*(vu16*)REG_BLDY = 4;
		else if ( uLocalTime2 == 113)	*(vu16*)REG_BLDY = 3;
		else if ( uLocalTime2 == 115)	*(vu16*)REG_BLDY = 2;
		else if ( uLocalTime2 == 117)	*(vu16*)REG_BLDY = 1;
		else if ( uLocalTime2 == 119)	*(vu16*)REG_BLDY = 0;
		uLocalTime2++;
	}

	//// ＯＢＪセット
	if ( sLocalSeq < S4_1 )
		return;

	// ＯＢＪ回転拡大縮小パラメータ０をセットする
	SetObjPABCD( 0, ob_rotate, ob_scale_x, ob_scale_y );

	// 車（猫より手前に表示）
	if ( sLocalSeq == S4_4 && ob_scale_x > 0x080 )
		pObj = Scene4_SetCarObj( pObj );

	// 舞い上がる(落ちる)新聞紙（猫より手前に表示）
	if ( sLocalSeq >= S4_5 && pPaper )
		pObj = SetObj( pPaper, pObj, s4_paper_x, s4_paper_y );

	// 猫
	if ( pCat )
		pObj = SetObj( pCat, pObj, s4_cat_x, s4_cat_y -bg_offset_y );

	// 車（猫より奥に表示）
	if ( sLocalSeq == S4_4 && ob_scale_x < 0x080 )
		pObj = Scene4_SetCarObj( pObj );

	// ビルディング
	pObj = SetObj( (u16 *)scene4_obj_bldg, pObj, LCD_CENTER_X, 
												LCD_CENTER_Y +16 +bg_offset_y );

	EndObj( pObj );
}

static u16 * Scene4_SetCarObj( u16 * pObj )
{
	int x, y, offsetX, offsetLR;
	u16 *p, *p2;
	u16	palette;

	palette = (ob_palette << OAM_PLTT_SHIFT)|(ob_priority << OAM_PRIORITY_SHIFT);

	p = pObj;

	x = ob_pos_x;
	y = ob_pos_y;

	// 拡大縮小による車のＯＢＪのＸ座標値補正の計算
	// 左右のＯＢＪ(64x64)間(スケール1:1)で64ドットの距離がある
	offsetLR = FixMul( 64, ob_scale_x );	// 拡大縮小によるＸ方向の左右ＯＢＪ間の距離
	// 拡大縮小による左側ＯＢＪの補正値（拡大縮小の中心のＸ座標を左側ＯＢＪの右辺上に見せかけるため）
	offsetX = ( 64 - offsetLR ) / 2;

	// 車(左側)ＯＢＪをセット
	p2 = p +2;
	p = SetObj( (u16 *)scene4_obj_carL, p, (x+=offsetX), y ); // x + offset
	*p2 = (*p2 & 0x3ff) | palette;	// *p2 & 0x3ff : mask palette & priority

	// 車(右側)ＯＢＪをセット
	p2 = p +2;
	p = SetObj( (u16 *)scene4_obj_carR, p, (x+=offsetLR), y ); // x + offsetX + offsetLR
	*p2 = (*p2 & 0x3ff) | palette;

	return	p;
}

//--------------------------------------------------------------
//// 新聞紙と猫の影
//--------------------------------------------------------------

//	ucEndingMessageKind	"g_select.h"

static void Newspaper_Init( void )
{
#define BG0_TOP		0x8000	// 256x256
#define BG1_TOP		0x8800	// 256x512
#define BG2_TOP		0x9800	// 256x256

#define	NEWS_PAPER_YPOS	16
#define	NEWS_CAT_YPOS	-144

	//ＢＧパレット
	DmaCopy(3, newspaper_Palette, BG_PLTT, sizeof(newspaper_Palette), 16);

	// ChrNo.1023 (0x3ff) を０クリア
	DmaClear(3, 0x00000000, (u16 *)((u8 *)BG_VRAM+0x3ff*32), 32, 32);

	//スクリーンをセット
	DmaClear(3, 0x03ff03ff, (u16 *)((u8 *)BG_VRAM + BG0_TOP), 0x800*4, 32);
	UnPackScreen( (u16 *)newspaper_cat, (u16 *)((u8 *)BG_VRAM + BG1_TOP) );
	UnPackScreen( (u16 *)newspaper, (u16 *)((u8 *)BG_VRAM + BG2_TOP) );
	UnPackScreen( (u16 *)newspaper_mask, (u16 *)((u8 *)BG_VRAM + BG0_TOP) );

	//各ＢＧをセット
	// メッセージ (BG0) 256x256 16color
	*(vu16*)REG_BG1CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_0
		| ((BG0_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	// 猫の影 (BG1) 256x512 16color
	*(vu16*)REG_BG1CNT = BG_COLOR_16 | BG_SCREEN_SIZE_2 | BG_PRIORITY_1
		| ((BG1_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	// 新聞紙 (BG2) 256x256 16color
	*(vu16*)REG_BG2CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_2
		| ((BG2_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);

	SetBLDDownMax( BLD_BD | BLD_BG0 | BLD_BG1 | BLD_BG2 );	// black 16
	
	*(vu16*)REG_BG1VOFS = NEWS_CAT_YPOS;	// 猫の影の初期スクロール値
	*(vu16*)REG_BG2VOFS = NEWS_PAPER_YPOS;	// 新聞紙の初期スクロール値

	//モード０
    *(vu16 *)REG_DISPCNT = DISP_MODE_0;
}
static void Newspaper_Exec( int time )
{
	switch ( sLocalSeq )
	{
	case NEWS_0:
		LZ77UnCompVram( (u8 *)newspaper_Char, (u16 *)BG_VRAM );
		V_Wait();
		*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_BG0_ON | DISP_BG1_ON | DISP_BG2_ON ;
		sLocalSeq++;
	break;

	case NEWS_1:
		if ( FadeDec(3) )
		{
			*(vu16*)REG_BLDCNT = BLD_BG2_2ND | BLD_A_BLEND_MODE | BLD_BG1_1ST ;
			*(vu16*)REG_BLDALPHA = ( 8/*EVB*/ << 8 ) | 8/*EVA*/; // ５０％
			sLocalSeq++;
			uLocalTime = 0;
			bg_scroll_y = NEWS_PAPER_YPOS;	// 新聞紙のスクロール初期値
		}
	break;

	case NEWS_2:
		// 新聞紙を上から下にスクロールさせる
		if ((time & 7 ) == 7 )
		{	if ( bg_scroll_y > 0 )
				*(vu16*)REG_BG2VOFS = --bg_scroll_y;
			else
			{	bg_scroll_y = NEWS_CAT_YPOS;	// 猫の影の初期スクロール値
				sLocalSeq++;
			}
		}
	break;

	case NEWS_3:
		// 猫の影を下から上にスクロールさせる
		if ( bg_scroll_y < 0 )
		{
			if		( bg_scroll_y < -40 )						bg_scroll_y++;
			else if	( bg_scroll_y < -20 && (time & 1 ) )		bg_scroll_y++;
			else if ( bg_scroll_y < -10 && ((time & 3 ) == 3 )) bg_scroll_y++;
			else { if ((time & 7 ) == 7 )	bg_scroll_y++; }

			*(vu16*)REG_BG1VOFS = bg_scroll_y;
		}
		else
		{	// メッセージを表示するアドレス先とデータアドレスを保存する
			if ( bMsgJapanese )	// 日本語
			{	ptr0 = (u16 *)((u8 *)BG_VRAM + BG0_TOP) + NEWSPAPER_MSG_J_TOP ;
				ptr2 = (u16 *)newspaper_msgJ_U;
				ptr3 = (u16 *)newspaper_msgJ_D;
				s4_msgSize = sizeof( newspaper_msgJ_U )/sizeof(u16);
				s4_msgWidth = NEWSPAPER_MSG_J_W ;
			}
			else // 英語
			{	ptr0 = (u16 *)((u8 *)BG_VRAM + BG0_TOP) + NEWSPAPER_MSG_E_TOP ;
				ptr2 = (u16 *)newspaper_msgE_U;
				ptr3 = (u16 *)newspaper_msgE_D;
				s4_msgSize = sizeof( newspaper_msgE_U )/sizeof(u16);
				s4_msgWidth = NEWSPAPER_MSG_E_W ;
			}
			ptr1 = ptr0 + SCREEN_CHR_WIDTH;	// １行下
			
			sLocalSeq++;
			uLocalTime = 0;
		}
	break;

	case NEWS_4:
		// メッセージを表示する
		if ( ( time & 3 ) == 3 )
		{
			if ( uLocalTime < s4_msgSize )
			{
				*ptr0++ = *ptr2++;
				*ptr1++ = *ptr3++;

				if ( ++uLocalTime % s4_msgWidth == 0 )
				{
					ptr0 += ( 0x40 - s4_msgWidth );	// 改行
					ptr1 = ptr0 + SCREEN_CHR_WIDTH;
				}
			}
			else
			{	sLocalSeq++;
				uLocalTime = 0;
			}
		}
	break;

	case NEWS_5:
		if ( uLocalTime++ == NEWSPAPER_EXIT_TIME )
		{	// Scene ４ でさげた音量を元に戻す
			m4aMPlayVolumeControl( &m4a_mplay000, M4A_TRACK_FULL, M4A_VOLUME_MAX );
			sGameSeq++;
		}
	break;
	}
}
#undef	BG0_TOP;
#undef	BG1_TOP;
#undef	BG2_TOP;

//--------------------------------------------------------------
//// 新聞紙と猫の影（ＥＮＤ）
//--------------------------------------------------------------
static void Newspaper_END_Init( void )
{
#define BG0_TOP		0x8000	// 256x256
#define BG1_TOP		0x8800	// 256x512
#define BG2_TOP		0x9800	// 256x256

#define	NEWS_PAPER_YPOS	16
#define	NEWS_CAT_YPOS	-144

	u16 *p;

	//パレット
	DmaCopy(3, newspaper_END_Palette, BG_PLTT, sizeof(newspaper_END_Palette), 16);
	DmaCopy(3, newspaper_END_obj_Palette, (u16 *)OBJ_PLTT, sizeof(newspaper_END_obj_Palette), 16);

	// ChrNo.1023 (0x3ff) を０クリア
	DmaClear(3, 0x00000000, (u16 *)((u8 *)BG_VRAM+0x3ff*32), 32, 32);

	//スクリーンをセット
	DmaClear(3, 0x03ff03ff, (u16 *)((u8 *)BG_VRAM + BG0_TOP), 0x800*4, 32);
	UnPackScreen( (u16 *)newspaper_cat, (u16 *)((u8 *)BG_VRAM + BG1_TOP) );
	UnPackScreen( (u16 *)newspaper_END, (u16 *)((u8 *)BG_VRAM + BG2_TOP) );
	UnPackScreen( (u16 *)newspaper_mask, (u16 *)((u8 *)BG_VRAM + BG0_TOP) );

	//各ＢＧをセット
	// メッセージ (BG0) 256x256 16color
	*(vu16*)REG_BG1CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_0
		| ((BG0_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	// 猫の影 (BG1) 256x512 16color
	*(vu16*)REG_BG1CNT = BG_COLOR_16 | BG_SCREEN_SIZE_2 | BG_PRIORITY_1
		| ((BG1_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	// 新聞紙 (BG2) 256x256 16color
	*(vu16*)REG_BG2CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_2
		| ((BG2_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);

	SetBLDDownMax( BLD_BD | BLD_BG0 | BLD_BG1 | BLD_BG2 );	// black 16
	
	*(vu16*)REG_BG1VOFS = NEWS_CAT_YPOS;	// 猫の影の初期スクロール値
	*(vu16*)REG_BG2VOFS = NEWS_PAPER_YPOS;	// 新聞紙の初期スクロール値

	//モード０
    *(vu16 *)REG_DISPCNT = DISP_MODE_0;
}

static void Newspaper_END_Exec( int time )
{
	int bDone;
	u16 *pObj, *pPushStart=0, *pTheEnd=0;

	switch ( sLocalSeq )
	{
	case NEWS_E0:
		LZ77UnCompVram( (u8 *)newspaper_END_Char, (u16 *)BG_VRAM );
		LZ77UnCompVram( (u8 *)newspaper_END_obj_Char, (u16 *)OBJ_MODE0_VRAM );
		V_Wait();
		*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_OBJ_ON |
								DISP_BG0_ON | DISP_BG1_ON | DISP_BG2_ON ;
		sLocalSeq++;
	break;

	case NEWS_E1:
		if ( FadeDec(3) )
		{
			*(vu16*)REG_BLDCNT = BLD_BG2_2ND | BLD_A_BLEND_MODE | BLD_BG1_1ST ;
			*(vu16*)REG_BLDALPHA = ( 8/*EVB*/ << 8 ) | 8/*EVA*/; // ５０％
			sLocalSeq++;
			uLocalTime = 0;
			bg_scroll_y = NEWS_PAPER_YPOS;	// 新聞紙のスクロール初期値
		}
	break;

	case NEWS_E2:
		// 新聞紙を上から下にスクロールさせる
		if ((time & 7 ) == 7 )
		{	if ( bg_scroll_y > 0 )
				*(vu16*)REG_BG2VOFS = --bg_scroll_y;
			else
			{	bg_scroll_y = NEWS_CAT_YPOS;	// 猫の影の初期スクロール値
				sLocalSeq++;
			}
		}
	break;

	case NEWS_E3:
		// 猫の影を下から上にスクロールさせる
		if ( bg_scroll_y < 0 )
		{
			if		( bg_scroll_y < -40 )						bg_scroll_y++;
			else if	( bg_scroll_y < -20 && (time & 1 ) )		bg_scroll_y++;
			else if ( bg_scroll_y < -10 && ((time & 3 ) == 3 )) bg_scroll_y++;
			else { if ((time & 7 ) == 7 )	bg_scroll_y++; }

			*(vu16*)REG_BG1VOFS = bg_scroll_y;
		}
		else
		{	// メッセージを表示するアドレス先とデータアドレスを保存する
			if ( bMsgJapanese )	// 日本語
			{	ptr0 = (u16 *)((u8 *)BG_VRAM + BG0_TOP) + NEWSPAPER_END_MSG_J_TOP ;
				ptr2 = (u16 *)newspaper_END_msgJ_U;
				ptr3 = (u16 *)newspaper_END_msgJ_D;
				s4_msgSize = sizeof( newspaper_END_msgJ_U )/sizeof(u16);
				s4_msgWidth = NEWSPAPER_END_MSG_J_W ;
			}
			else // 英語
			{	ptr0 = (u16 *)((u8 *)BG_VRAM + BG0_TOP) + NEWSPAPER_END_MSG_E_TOP ;
				ptr2 = (u16 *)newspaper_END_msgE_U;
				ptr3 = (u16 *)newspaper_END_msgE_D;
				s4_msgSize = sizeof( newspaper_END_msgE_U )/sizeof(u16);
				s4_msgWidth = NEWSPAPER_END_MSG_E_W ;
			}
			ptr1 = ptr0 + SCREEN_CHR_WIDTH;	// １行下
			
			sLocalSeq++;
			uLocalTime = 0;
		}
	break;

	case NEWS_E4:
		// メッセージを表示する
		if ( ( time & 3 ) == 3 )
		{
			if ( uLocalTime < s4_msgSize )
			{
				*ptr0++ = *ptr2++;
				*ptr1++ = *ptr3++;

				if ( ++uLocalTime % s4_msgWidth == 0 )
				{
					ptr0 += ( 0x40 - s4_msgWidth );	// 改行
					ptr1 = ptr0 + SCREEN_CHR_WIDTH;
				}
			}
			else
			{	sLocalSeq++;
				uLocalTime = 0;
			}
		}
	break;

	case NEWS_E5:
		if ( uLocalTime++ == 180 ) //NEWSPAPER_EXIT_TIME )
		{	// Scene ４ でさげた音量を元に戻す
			m4aMPlayVolumeControl( &m4a_mplay000, M4A_TRACK_FULL, M4A_VOLUME_MAX );
			uLocalTime = 0;
			sLocalSeq++;
		}
	break;

	case NEWS_E6:
		if ( uLocalTime++ == 180 )
		{	uLocalTime = 0;
			sLocalSeq++;
		}
	break;

	case NEWS_E7:

		// PUSH START
		if ( ucPerfect == PERFECT_YES )
			newspaper_END_push_start_Anime2( uLocalTime, &pPushStart ); // 王冠カーソル
		else
			newspaper_END_push_start_Anime0( uLocalTime, &pPushStart ); // 手カーソル

		uLocalTime++;

		if ( usTrg & ( A_BUTTON | START_BUTTON ) )
		{	// 効果音
			m4aSongNumStartOrChange( S_BUTTON_A );
			uLocalTime = 0;
			sLocalSeq++;
		}
	break;

	case NEWS_E8:

		bDone = 0;

		// PUSH START
		if ( ucPerfect == PERFECT_YES )
			bDone = newspaper_END_push_start_Anime3( uLocalTime, &pPushStart ); // 王冠カーソル
		else
			bDone = newspaper_END_push_start_Anime1( uLocalTime, &pPushStart ); // 手カーソル

		uLocalTime++;

		if ( bDone )
		{	// 音量を下げる
			m4aMPlayVolumeControl( &m4a_mplay000, M4A_TRACK_FULL, M4A_VOLUME_21 );
			sGameSeq++;
		}
	break;
	}


	//// ＯＢＪのセット
	pObj = (u16 *)OamBuf;

	// THE END
	if ( sLocalSeq >= NEWS_E6 )
	{	newspaper_END_the_end_Anime0( uLocalTime, &pTheEnd );
		pObj = SetObj( pTheEnd, pObj, LCD_CENTER_X, LCD_CENTER_Y +8);
	}

	// PUSH START
	pObj = SetObj( pPushStart, pObj, LCD_CENTER_X -12, 160 );

	EndObj( pObj );

}
#undef	BG0_TOP;
#undef	BG1_TOP;
#undef	BG2_TOP;




//--------------------------------------------------------------
//// Scene ５　ＷＡＲＩＯＬＡＮＤ４
//--------------------------------------------------------------

//==============================================================
//		Ｖカウント関数
//==============================================================
static void TitVCountIntr0(void)
{
	*(vu16*)REG_BG0VOFS = 95; //96;
	*(vu16*)REG_BG0HOFS = -( usFadeTimer << 3 );
}

//--------------------------------------------------------------
static void Wario4_Init()
{
#define	BG0_TOP		0x8000	// 512x256
#define	BG0L_TOP	BG0_TOP
#define	BG0R_TOP	(BG0_TOP + 0x800)
#define	BG1_TOP		0x9000	// 256x256
#define	BG2_TOP		0xa000	// 512x256
#define	BG2L_TOP	BG2_TOP
#define	BG2R_TOP	(BG2_TOP + 0x800)
#define	BG3_TOP		0xb000	// 512x256
#define	BG3L_TOP	BG3_TOP
#define	BG3R_TOP	(BG3_TOP + 0x800)

	if ( bQuickStart )
	{
		Init();

		// ＢＧＭ　フェードアウト
		m4aMPlayFadeOut( &m4a_mplay001, M4A_FADEOUT_2 );
		m4aSongNumStartOrChange( S_BUTTON_TITLE_IN );
		m4aSongNumStartOrChange( M_BGM_TITLE );
	}
	else
	{
		DmaClear(3, 0x03ff03ff, (u32 *)((u8 *)BG_VRAM + BG2L_TOP), 0x40*16, 32);
		DmaClear(3, 0x03ff03ff, (u32 *)((u8 *)BG_VRAM + BG2R_TOP), 0x40*16, 32);
	}

	// パレット
	DmaCopy(3, scene5_obj_Palette, OBJ_PLTT, sizeof( scene5_obj_Palette ), 16);
	DmaCopy(3, scene5_bg_Palette, BG_PLTT, sizeof( scene5_bg_Palette ), 16);

	if ( bQuickStart )
	{	u16 *p;
		// “ＷＡＲＩＯＬＡＮＤ４”タイトルロゴを転送
		p = bMsgJapanese ? (u16 *)warioGBA_logo : (u16 *)wario4_logo;
		UnPackScreen( p, (u16 *)((u8 *)BG_VRAM + BG0_TOP) );

		// ワリオ車（ＯＢＪ）のパレット
		scene5_car_palette_change( 15 );
	}
	else // 夜景画面を転送
	{
		UnPackScreen( (u16 *)scene5_bg0_nightL,  (u16 *)((u8 *)BG_VRAM + BG0L_TOP) );
		UnPackScreen( (u16 *)scene5_bg0_nightLR, (u16 *)((u8 *)BG_VRAM + BG0L_TOP) );
		UnPackScreen( (u16 *)scene5_bg0_nightR,  (u16 *)((u8 *)BG_VRAM + BG0R_TOP) );
		UnPackScreen( (u16 *)scene5_bg0_nightLR, (u16 *)((u8 *)BG_VRAM + BG0R_TOP) );
	}

	// 砂漠画面を転送
	UnPackScreen( (u16 *)scene5_bg1, (u16 *)((u8 *)BG_VRAM + BG1_TOP) );
	UnPackScreen( (u16 *)scene5_bg2L, (u16 *)((u8 *)BG_VRAM + BG2L_TOP) );
	UnPackScreen( (u16 *)scene5_bg2R, (u16 *)((u8 *)BG_VRAM + BG2R_TOP) );
	UnPackScreen( (u16 *)scene5_bg3L, (u16 *)((u8 *)BG_VRAM + BG3L_TOP) );
	UnPackScreen( (u16 *)scene5_bg3R, (u16 *)((u8 *)BG_VRAM + BG3R_TOP) );

	//各ＢＧをセット
	// (BG0) 512x256 16color
	*(vu16*)REG_BG0CNT = BG_COLOR_16 | BG_SCREEN_SIZE_1 | BG_PRIORITY_0
		| ((BG0_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	// (BG1) 256x256 16color
	*(vu16*)REG_BG1CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_1
		| ((BG1_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	// (BG2) 512x256 16color
	*(vu16*)REG_BG2CNT = BG_COLOR_16 | BG_SCREEN_SIZE_1 | BG_PRIORITY_2
		| ((BG2_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	// (BG3) 512x256 16color
	*(vu16*)REG_BG3CNT = BG_COLOR_16 | BG_SCREEN_SIZE_1 | BG_PRIORITY_3
		| ((BG3_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);

	// BG0 の初期スクロール値
	bg_scroll_x = bQuickStart ? 0 : 0 ;
	bg_scroll_y = bQuickStart ? -2 : 80 ;	// 2 : 80 ;
	*(vu16*)REG_BG0HOFS = bg_scroll_x;
	*(vu16*)REG_BG0VOFS = bg_scroll_y;

	// αブレンド設定
	*(vu16*)REG_BLDCNT = BLD_BG1_2ND | BLD_BG2_2ND | BLD_BG3_2ND | //BLD_OBJ_2ND |
						 BLD_A_BLEND_MODE |
						 BLD_BG0_1ST ; //| BLD_OBJ_1ST ;
	uEVA = 16;
	uEVB = 0;
	*(vu16*)REG_BLDALPHA = (uEVB<<8)|uEVA;//係数 EVB EVA


	// PUSHSTART (OBJ) の位置を設定しておく
	if ( bQuickStart )
	{	s5_pushstart_x = OB_PUSHSTART_X;
		s5_car_x = OB_SCENE5_CAR_X;
		s5_car_y = OB_SCENE5_CAR_Y;
	}
	else
	{	s5_pushstart_x = 256 + 64;
		s5_car_x = OB_SCENE5_CAR_X + 200;
		s5_car_y = OB_SCENE5_CAR_Y;
	}

	// 超ハード？　チェック		ucPerfect "g_gmap.h"
	s5_super_hard = ( ucPerfect == PERFECT_YES ) ? 1 : 0 ;

	//モード０
    *(vu16 *)REG_DISPCNT = DISP_MODE_0;
}

static void Wario4_Exec( int time )
{
	int	 i, x, y;
	u16  size;
	u16  *p;
	u16  *pObj;

	switch ( sLocalSeq )
	{
	case S5_00:	// ＢＧキャラクタ転送
		LZ77UnCompVram( (u8 *)scene5_bg_Char, (u16 *)BG_VRAM );
		LZ77UnCompVram( (u8 *)scene5_bg_title_Char, (u16 *)((u8 *)BG_VRAM + 0x200*32) ); // ChrNo.200h〜
		sLocalSeq++;
	break;

	case S5_01: // ＯＢＪキャラクタ転送
		LZ77UnCompVram( (u8 *)scene5_obj_Char, (u16 *)OBJ_MODE0_VRAM );
		if ( bQuickStart )	sLocalSeq = S5_4;
		else
		{	//Ｖカウンタ一致割込みをセット
			SetVcountFunc( TitVCountIntr0 );
			*(vu16*)REG_STAT &= 0xff;
			*(vu16*)REG_STAT |= (( 151 << 8 )| 0x20 );
			*(vu16*)REG_IE |= V_COUNT_INTR_FLAG;	//VCOUNT-INT ON

			sLocalSeq++;
		}

		V_Wait();

		*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_OBJ_BG_ALL_ON;
	break;

	case S5_0:

		// ワリオ車を右から左に移動させる
		if ( s5_car_x > OB_SCENE5_CAR_X )
			s5_car_x--;

		// 夜景を左から右にスクロールさせる
		*(vu16*)REG_BG0HOFS = -(time << 1);
	
		// 夜景を上から下にスクロールさせる
		if ( bg_scroll_y > 0 )
		{	if		( bg_scroll_y > 10 && ((time & 3 ) == 3 ) )	bg_scroll_y--;
			else if ( bg_scroll_y >  4 && ((time & 7 ) == 7 ) )	bg_scroll_y--;
			else { if ((time & 15 ) == 15 )	bg_scroll_y--; }
		}
		*(vu16*)REG_BG0VOFS = bg_scroll_y;

		// αブレンドにより夜景画面から砂漠画面に移す
		if ( time > WARIO4_NIGHT_EXIT_TIME  && ((time & 15) == 15 ) )
		{
			if( uEVA > 0 )	uEVA--;
			if( uEVB < 16 )	uEVB++;
			*(vu16*)REG_BLDALPHA = ( uEVB << 8 ) | uEVA ;	//αブレンド係数EVB EVA

			// ワリオ車（ＯＢＪ）のパレットチェンジ
			scene5_car_palette_change( uEVB );

			// 終了？
			if ( uEVB == 16 )
			{	*(vu16*)REG_IE &= ~V_COUNT_INTR_FLAG;	//VCOUNT-INT OFF
				*(vu16*)REG_BG0VOFS = 0;
				sLocalSeq++;
			}
		}
	break;

	case S5_1:
		if ( uLocalTime < 8 )
		{	// BG0 512x256 を少しづつクリアーする（ ８ライン分づつ８回に分けて）
			u32* dst = (u32 *)((u8 *)BG_VRAM + BG0_TOP + 0x40*8 * uLocalTime++);
			DmaClear(3, 0x03ff03ff, dst, 32*sizeof(u16)*8, 32);
		}
		else
		{	// “ＷＡＲＩＯＬＡＮＤ４”タイトルロゴを転送
			p = bMsgJapanese ? (u16 *)warioGBA_logo : (u16 *)wario4_logo;
			UnPackScreen( p, (u16 *)((u8 *)BG_VRAM + BG0_TOP) );
			
			bg_scroll_x = 0;	//-2;
			bg_scroll_y = -2;	//2;
			*(vu16*)REG_BG0HOFS = bg_scroll_x;
			*(vu16*)REG_BG0VOFS = bg_scroll_y;
			
			uLocalTime = 0;
			sLocalSeq++;
		}
	break;

	case S5_2:
		if ( uLocalTime++ > 300 )
		{
			// αブレンドにより“ＷＡＲＩＯＬＡＮＤ４”を徐々に表示させる
			if ( (time & 15) == 15 )
			{
				if( uEVA < 16 )	uEVA++;
				if( uEVB > 0 )	uEVB--;
				*(vu16*)REG_BLDALPHA = ( uEVB << 8 ) | uEVA ;
			}

			// 終了？
			if ( uEVA == 16 )
				sLocalSeq++;
		}
	break;

	case S5_3:
			s5_pushstart_x -= 8;

			if ( s5_pushstart_x < OB_PUSHSTART_X )
				s5_pushstart_x = OB_PUSHSTART_X;

	case S5_4:
			if ( s5_pushstart_x == OB_PUSHSTART_X )
			{
				//オートデモ用フェードアウトの準備
				SetBLDDownMin( BLD_ALL );
				uLocalTime = 0;
				sLocalSeq++;
			}
	break;

	case S5_5:

		// オートデモ開始
		if ( usTrg )	// 何かのキーが押されたら、デモ開始用カウンタをクリアする
		{
			uLocalTime = 0;
			uEVY = 0;
			*(vu16*)REG_BLDY = 0;
		}

#if TITLE_DEBUG_MODE
		if ( usTrg & R_BUTTON )	// デバッグ用
			uLocalTime |= DEMO_START_TIME;
#endif
		if ( ++uLocalTime > DEMO_START_TIME )
		{
			if ( FadeInc(3) )
				AutoDemo_Ready_Run();	// "gmap\Demo_AutoRun.c"
		}
		else
		{	if ( usTrg == A_BUTTON || usTrg == START_BUTTON )
			{
				m4aSongNumStartOrChange( S_BUTTON_START_TITLE ); //( S_BUTTON_A1 )
				WarioVoiceSet( WV_FIGHT );
				uLocalTime = 0;
				sLocalSeq++;
			}
		}
	break;

	case S5_6:
			if ( uLocalTime++ < 16 )
				s5_car_x++;	// 車が後ろに少しさがる
			else
			{	// ホイルスピン煙の初期化
				s5_smoke_x = s5_car_x +40;
				s5_smoke_y = s5_car_y -14;
				uLocalTime = 0;
				sLocalSeq++;
			}
	break;

	case S5_7:
	case S5_7_1:
			if (( s5_car_x -= 4 ) < -100 )
			{
				SetBLDDownMin( BLD_ALL ); // black 0
				sLocalSeq++;
			}
	break;

	case S5_8:
			if ( FadeInc(0) )
				sGameSeq++;
	break;
	}


	//// ＯＢＪセット
	pObj = (u16 *)OamBuf;

	// ホイルスピン時の煙（ワリオ車より手前に出す）１回限り
	if ( sLocalSeq == S5_7 )
	{
		if ( scene5_Anime15( uLocalTime++, &p ) )
			sLocalSeq++;
		pObj = SetObj( p, pObj, s5_smoke_x, s5_smoke_y );
		s5_smoke_x++;
	}

	// ワリオ車(OBJ)の動き
	pObj = scene5_car_move( pObj, sLocalSeq, time );

	// PUSH START
	if ( sLocalSeq >= S5_3 )
	{	scene5_Anime16( &p );
		pObj = SetObj( p, pObj, s5_pushstart_x, OB_PUSHSTART_Y );
	}

	// 手カーソル（超ハード時は王冠に変更）
	if ( sLocalSeq == S5_5 ) //（選択時）
	{	if ( s5_super_hard ) scene5_Anime17( time, &p );
		else				 scene5_Anime6( time, &p );
		pObj = SetObj( p, pObj, OB_CURSOR_X, OB_CURSOR_Y );
	}
	if ( sLocalSeq >= S5_6 ) //（決定時）
	{	if ( s5_super_hard ) scene5_Anime18( time, &p );
		else				 scene5_Anime7( time, &p );
		pObj = SetObj( p, pObj, OB_CURSOR_X, OB_CURSOR_Y );
	}

	EndObj( pObj );


	*(vu16*)REG_BG1HOFS = -(time << 2);	// 砂漠の地面をスクロールさせる
	*(vu16*)REG_BG2HOFS = -(time >> 3);	// 砂漠の岩山をスクロールさせる
	*(vu16*)REG_BG3HOFS = -(time >> 4);	// 砂漠の空をスクロールさせる


	//// クイックスタートチェック
	if ( sLocalSeq < S5_4 ) // 夜景画面等をスキップする
	{
		if ( usTrg & (START_BUTTON | A_BUTTON) )
		{	*(vu16*)REG_IE &= ~V_COUNT_INTR_FLAG;	//VCOUNT-INT OFF
			sGameSeq = TL_QUICK_INIT;
		}
	}

#if TITLE_DEBUG_MODE
	debug_bg_scroll( 0 );	// BG0 is scrolled by key.
	debug_EVABY_control();	// EVA, EVB is controled by key.
#endif

}

// ワリオ車(OBJ)の動き
static u16 * scene5_car_move( u16* pBuf, int seq, int time )
{
	u16  *p  = (u16 *)0;
	int  x, y, t;

	x = s5_car_x;
	y = s5_car_y;

	if ( seq == S5_0 )
	{
		scene5_Anime10( time, &p ); // ヘッドライトで照らされた地面
		pBuf = SetObj( p, pBuf, x -84, y );

		scene5_Anime11( time, &p ); // ヘッドライトの光
		pBuf = SetObj( p, pBuf, x -38, y -26);

		s5_car_t = 0;	
	}

	if ( seq >= S5_5 )
	{
		scene5_Anime14( &p ); // @2001 Nintendo
		pBuf = SetObj( p, pBuf, LCD_CENTER_X -24, 155);
	}

	if ( seq > S5_0 )
	{
		t = time << 3;

		x = ( t + 500 ) & 2047;
		if ( x > 400 ) x = 400;
		scene5_Rock1( &p );	// 岩１
		pBuf = SetObj( p, pBuf, x -64, 160 );

		x = ( t + 800 ) & 2047;
		if ( x > 400 ) x = 400;
		scene5_Rock2( &p );	// 岩２
		pBuf = SetObj( p, pBuf, x -64, 160 );

		x = ( t + 1300 ) & 2047;
		if ( x > 400 ) x = 400;
		scene5_Rock3( &p );	// 岩３
		pBuf = SetObj( p, pBuf, x -64, 160 );

		x = ( t + 2000 ) & 2047;
		if ( x > 400 ) x = 400;
		scene5_Rock4( &p );	// 岩４
		pBuf = SetObj( p, pBuf, x -64, 160 );

		// 車を前後に揺らす
		x = s5_car_x - FixMul( _Sin( s5_car_t++ & 0xff ), 4 );

		scene5_Anime2( time, &p ); // 砂煙（ワリオ車より手前）
		pBuf = SetObj( p, pBuf, x +64, y );
	}

	scene5_Anime9( time, &p ); // ヘッドライトとテールランプ
	pBuf = SetObj( p, pBuf, x, y );

	scene5_Anime1( time, &p ); // 車体
	pBuf = SetObj( p, pBuf, x, y );

	scene5_Tire( &p ); // タイヤ(前後)
	pBuf = SetObj( p, pBuf, x -19, y -11 );
	pBuf = SetObj( p, pBuf, x +36, y -11 );

	scene5_Anime0( time, &p ); // 車体(奥)
	pBuf = SetObj( p, pBuf, x, y );

	SetObjPABCD( 0, time * -16 & 0xff, 0x100, 0x100 ); // 回転拡大縮小パラメータ０

	return	pBuf;
}
#undef	BG0_TOP
#undef	BG0L_TOP
#undef	BG0R_TOP
#undef	BG1_TOP
#undef	BG2_TOP
#undef	BG2L_TOP
#undef	BG2R_TOP
#undef	BG3_TOP
#undef	BG3L_TOP
#undef	BG3R_TOP

//--------------------------------------------------------------
//// Scene ６　ピラミッド
//--------------------------------------------------------------
static void Pyramid_Init( void )
{
#define	BG0_TOP		0x8000	// 256x256
#define	BG1_TOP		0x8800	// 256x256
#define	BG2_TOP		0x9000	// 256x256
#define	BG3_TOP		0x9800	// 256x256

	int  i;
	u16  *dst;

	//パレット
	DmaCopy(3, pyramid_bg_Palette, BG_PLTT, sizeof( pyramid_bg_Palette ), 16);
	DmaCopy(3, pyramid_obj_Palette, OBJ_PLTT, sizeof( pyramid_obj_Palette ), 16);

	// ChrNo.0x3fc をべたにする
	DmaClear(3, 0xffffffff, (u8 *)BG_VRAM + 32*1020, 32, 32);

	//キャラクター転送
	LZ77UnCompVram( (u8 *)pyramid_bg_Char, (u16 *)BG_VRAM );
	LZ77UnCompVram( (u8 *)pyramid_obj_Char, (u16 *)OBJ_MODE0_VRAM );

	// ＢＧ０画面作成
	dst = (u16 *)((u8 *)BG_VRAM + BG0_TOP);
	for ( i = 0 ; i < 18 ; i++ , dst += 32 )
		DmaCopy(3, (u16 *)pyramid_bg0, dst, sizeof( pyramid_bg0 ), 16);

	UnPackScreen( (u16 *)pyramid_bg1, (u16 *)((u8 *)BG_VRAM + BG1_TOP) );
	UnPackScreen( (u16 *)pyramid_bg2, (u16 *)((u8 *)BG_VRAM + BG2_TOP) );
	UnPackScreen( (u16 *)pyramid_bg3, (u16 *)((u8 *)BG_VRAM + BG3_TOP) );

	// スクロールするので、上端データを下端３段にコピーしておく
	dst = (u16 *)((u8 *)BG_VRAM + BG3_TOP);
	DmaCopy(3, dst, dst +928, 30*sizeof(u16), 16);
	DmaCopy(3, dst, dst +960, 30*sizeof(u16), 16);
	DmaCopy(3, dst, dst +992, 30*sizeof(u16), 16);


	//ＢＧ０〜３をセット
	*(vu16*)REG_BG0CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_1
		| ((BG0_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);

	*(vu16*)REG_BG1CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_0
		| ((BG1_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG2CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_2
		| ((BG2_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG3CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_3
		| ((BG3_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);

	//モード０（ＯＢＪキャラクタの転送がまだなので画面はバックドロップのみ表示）
    *(vu16 *)REG_DISPCNT = DISP_MODE_0;

#if TITLE_DEBUG_MODE
	// ピラミッドＢＧＭ　スタート
	m4aSongNumStartOrChange( M_BGM_TITLE_PYRAMID );
#endif
}

static void Pyramid_Exec( int time )
{
	int	i;
	u16 *p, *p2;
	u16 *pObj = (u16 *)OamBuf;

	switch ( sLocalSeq )
	{
	case S6_1:
		ob_rotate = 0;
		ob_scale_x = 0x140; //0x220;	// 0x200;
		ob_scale_y = 0x140; //0x220;	// 0x200;
		ob_pos_x = 120;
		ob_pos_y = 180;	//188;	// 180;
		s6_smoke_x = ob_pos_x;
		s6_smoke_y = ob_pos_y + FixMul( 16, ob_scale_y );
		for ( i = 3 ; i >= 0 ; i-- )
		{	s6_smoke_ya[i] = ob_pos_y + FixMul( 16, ob_scale_y ) + i*6;
			s6_smoke_xa[i] = ob_pos_x;
		}

		s6_bg1_y = 0;
		s6_bg2_y = -24;
		*(vu16*)REG_BG2VOFS = s6_bg2_y;
		*(vu16*)REG_BG3VOFS = s6_bg2_y;
		s6_iwaL_x = 120;
		s6_iwaL_y =  64;
		s6_iwaR_x = 120;
		s6_iwaR_y =  64;

		// 音量を下げる	(tb)=M4A_TRACK_FULL, (vo)=M4A_VOLUME_10	"g_sound.h"
		m4aMPlayVolumeControl( &m4a_mplay000, M4A_TRACK_FULL, M4A_VOLUME_9 );

		uLocalTime = 0;
		sLocalSeq++;
	break;

	case S6_2:
		if ( uLocalTime == 0 )
		{
			// αブレンド設定
			uEVA = 17; // 前置デクリメント( --uEVA )をするので＋１してある
			uEVB = 0;
			*(vu16*)REG_BLDALPHA = ( 0/*EVB*/ << 8 ) | 16/*EVA*/ ;
			*(vu16*)REG_BLDCNT = BLD_BG2_2ND | BLD_BG3_2ND | BLD_A_BLEND_MODE | BLD_BG0_1ST ;

			*(vu16 *)REG_DISPCNT |= DISP_OBJ_ON | DISP_BG_ALL_ON;
		}
		else if ( uLocalTime == 125 ) // ２秒ほどなにもしない（背景のみ表示）
		{	uLocalTime = 0;
			sLocalSeq++;
			break;
		}
		uLocalTime++;
	break;

	case S6_3:
		// 岩壁を左右にスクロールする
		if ( s6_iwaL_x > 64 && (time & 3) == 3 )
		{
			s6_iwaL_x--;	// 64 dot 左へ
			s6_iwaR_x++;	// 64 dot 右へ

			pyramid_palette_change( uLocalTime++ / 8 );
		}
		// 岩壁と地面を下にスクロールする
		if ( s6_iwaL_y < 72 && (time & 31) == 31 )
		{
			s6_iwaL_y++;	// 8 dot 下へ
			s6_iwaR_y++;

			*(vu16*)REG_BG1VOFS = --s6_bg1_y;
		}
		// ワリオが縮小しながら走る
		if ( ob_pos_y > 116  && (time & 3) == 3 )
		{
			ob_pos_y--;
			ob_scale_x -= 1; //4;
			ob_scale_y -= 1; //4;
		}
		// 走るときの土煙
		for ( i = 3 ; i >= 0 ; i-- )
		{	u16 x;
			if ( pyramid_Anime3( time + i*6, &p ) )
				s6_smoke_ya[i] = ob_pos_y + FixMul( 16, ob_scale_y ) + i*6;
			x = ( i & 1 ) ? 4 : -4 ;
			pObj = SetObj( p, pObj, s6_smoke_x + i*x, s6_smoke_ya[i] );
		}
		// 走るポーズ
		pyramid_Anime2( time, &p );
		pObj = SetObj( p, pObj, ob_pos_x, ob_pos_y );

		if ( ob_scale_x == 0x100 )
		{
			ob_pos_y += 18;	//// ＯＢＪ中心座標位置の補正
			uLocalTime = 0;
			sLocalSeq++;
		}
	break;

	case S6_4:
		// 待機ポーズ
		pyramid_Anime1( time, &p );
		pObj = SetObj( p, pObj, ob_pos_x, ob_pos_y );

		if ( uLocalTime >= 32 && uLocalTime < 96 && ((uLocalTime & 7) == 7) )
		{
			*(vu16*)REG_BG1VOFS = --s6_bg1_y;
			*(vu16*)REG_BG2VOFS = ++s6_bg2_y;
			*(vu16*)REG_BG3VOFS =   s6_bg2_y;

			s6_iwaL_y++;	// 8 dot 下へ
			s6_iwaR_y++;
			ob_pos_y++;
		}
		uLocalTime++;
		
		// αブレンド
		if ( uEVA )
		{	if (( time & 7 ) == 7 )
				*(vu16*)REG_BLDALPHA = ( ++uEVB << 8 ) | --uEVA ;
		}
		else
		{
			uLocalTime = 0;
			sLocalSeq++;
		}
	break;

	case S6_5:
		// ワリオはガッツポーズ
		i = pyramid_Anime0( uLocalTime++, &p );
		pObj = SetObj( p, pObj, ob_pos_x, ob_pos_y );

		if ( uLocalTime == 32 )
			WarioVoiceSet( WV_HAPPY_2 );

		if ( i )
		{	uLocalTime = 20; // 次回に溜めポーズはしない
			sLocalSeq++;
		}
	break;

	case S6_6:
		pyramid_Anime1( uLocalTime, &p );	// 待機ポーズ
		pObj = SetObj( p, pObj, ob_pos_x, ob_pos_y );

		if ( uLocalTime++ == 110 )	// 1.5秒 110-20=90
		{	ob_pos_y -= 18;	//// ＯＢＪ中心座標位置の補正
			uLocalTime = 0;
			sLocalSeq++;
		}
	break;

	case S6_7:
		// ワリオが縮小しながら走る
		if ( (time & 3 ) == 3 )
		{	if ( ob_pos_y < 160 )
			{
				ob_pos_y++;
				ob_scale_x -= 4;
				ob_scale_y -= 4;
			}
			else
			{
				SetBLDUpMin( BLD_BD | BLD_OBJ | BLD_BG3 | BLD_BG2 | BLD_BG1 );	// white 0

				*(vu16*)REG_DISPCNT = DISP_OBJ_ON | DISP_BG3_ON | DISP_BG2_ON | DISP_BG1_ON;
				uLocalTime = 0;
				sLocalSeq++;
			}
		}
		// 走るときの土煙
		if ( pyramid_Anime3( time, &p ) )
		{//	s6_smoke_x = ob_pos_x;
			s6_smoke_y = ob_pos_y + FixMul( 16, ob_scale_y );
		}
		p2 = pObj + 2;
		pObj = SetObj( p, pObj, s6_smoke_x, s6_smoke_y );
		*p2 |= ( 1 << OAM_PRIORITY_SHIFT );

		// 走るポーズ
		pyramid_Anime2( time, &p );
		p2 = pObj + 2;
		pObj = SetObj( p, pObj, ob_pos_x, ob_pos_y );
		*p2 |= ( 1 << OAM_PRIORITY_SHIFT );
	break;

	case S6_8:
		if ( FadeInc(7) )
			sGameSeq++;
	break;

	}

	if ( sLocalSeq >= S6_2 )
	{
		pObj = SetObj( (u16 *)pyramid_iwa_L, pObj, s6_iwaL_x, s6_iwaL_y );
		pObj = SetObj( (u16 *)pyramid_iwa_R, pObj, s6_iwaR_x, s6_iwaR_y );
		pObj = SetObj( (u16 *)pyramid_grass_L, pObj, s6_iwaL_x +16, s6_iwaL_y );
		pObj = SetObj( (u16 *)pyramid_grass_R, pObj, s6_iwaR_x -16, s6_iwaR_y );
	}

	// ＯＢＪ回転拡大縮小パラメータ０をセットする
	SetObjPABCD( 0, ob_rotate, ob_scale_x, ob_scale_y );

	EndObj( pObj );


#if	TITLE_DEBUG_MODE
	debug_ob_param_control();	//	キー入力によりＯＢＪをコントロールする
#endif
}
#undef	BG0_TOP
#undef	BG1_TOP
#undef	BG2_TOP
#undef	BG3_TOP


//--------------------------------------------------------------
//// Scene 7　ピラミッドの入口から
//--------------------------------------------------------------
static void Scene7_Init( void )
{
#define	BG0_TOP		0x8000	// 512x256
#define	BG0L_TOP	BG0_TOP
#define	BG0R_TOP	(BG0_TOP + 0x800)
#define	BG1_TOP		0x9000	// 512x256
#define	BG1L_TOP	BG1_TOP
#define	BG1R_TOP	(BG1_TOP + 0x800)
#define	BG2_TOP		0xa000	// 512x256
#define	BG2L_TOP	BG2_TOP
#define	BG2R_TOP	(BG2_TOP + 0x800)
#define	S7_BLD_BG		( BLD_BD | BLD_BG0 | BLD_BG1 | BLD_BG2 | BLD_OBJ )

	//パレット（ 猫と輝きＯＢＪはパレットＮｏ．１２〜展開する）
	DmaCopy(3, scene7_bg_Palette, BG_PLTT, sizeof(scene7_bg_Palette), 16);
	DmaCopy(3, scene7_obj_Palette, (u16 *)OBJ_PLTT + 16*12, sizeof(scene7_obj_Palette), 16);
	//パレット（ 土煙ＯＢＪはパレットＮｏ．４に展開する）
	DmaCopy(3, scene7_smoke_Palette, (u16 *)OBJ_PLTT + 16*4, sizeof(scene7_smoke_Palette), 16);

	//ＢＧ、ＯＢＪ(猫と輝き)　キャラクター転送
	LZ77UnCompVram( (u8 *)scene7_bg_Char, (u16 *)BG_VRAM );
	LZ77UnCompVram( (u8 *)scene7_obj_Char, (u16 *)OBJ_MODE3_VRAM ); // ChrNo.200h〜
	LZ77UnCompVram( (u8 *)scene7_smoke_Char1, (u16 *)((u8 *)OBJ_MODE0_VRAM + 0x94*32) ); // ChrNo.94<96
	LZ77UnCompVram( (u8 *)scene7_smoke_Char2, (u16 *)((u8 *)OBJ_MODE0_VRAM + 0xb4*32) ); // ChrNo.B4<B6

	//スクリーンをセット
	DmaClear(3, 0x03FF, BG_VRAM+BG0_TOP, 32*19*sizeof(u16), 16);
	UnPackScreen( (u16 *)scene7_bg1_1, (u16 *)((u8 *)BG_VRAM + BG0_TOP ) );
	DmaClear(3, 0x03FF, BG_VRAM+BG1_TOP, 32*19*sizeof(u16), 16);
	UnPackScreen( (u16 *)scene7_bg1_2, (u16 *)((u8 *)BG_VRAM + BG1_TOP ) );
	DmaClear(3, 0x93A0, (u16 *)((u8 *)BG_VRAM + BG2_TOP) +0x1c0, 32*6*sizeof(u16), 16);
	UnPackScreen( (u16 *)scene7_bg1_3, (u16 *)((u8 *)BG_VRAM + BG2_TOP ) );


	// 香月さんワリオをセット
	Title_Wario_Palette();	// "TL_wario.c"
	Title_Wario_Pattern( W_NORMAL, WALK, R_MUKI );	// kind, stat, muki
	ob_pos_x = -32;
	ob_pos_y = 160 +32 -12 -16;
	s7_smoke_x = ob_pos_x;
	s7_smoke_y = ob_pos_y;
	s7_smoke_t = 0;

	//ＢＧ０〜２をセット
	*(vu16*)REG_BG0CNT = BG_COLOR_16 | BG_SCREEN_SIZE_1 | BG_PRIORITY_0
		| ((BG0_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG1CNT = BG_COLOR_16 | BG_SCREEN_SIZE_1 | BG_PRIORITY_1
		| ((BG1_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG2CNT = BG_COLOR_16 | BG_SCREEN_SIZE_1 | BG_PRIORITY_2
		| ((BG2_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);

	bg_scroll_x = 0;
	bg_scroll_y = 16;

	SetBLDUpMax( S7_BLD_BG );	// white 16

	V_Wait();

	*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_OBJ_ON |
							DISP_BG0_ON | DISP_BG1_ON | DISP_BG2_ON ;
}

static void Scene7_Exec( int time )
{
	int i;

	u16 *p,	*pObj, *pCat = 0;
	u16	pri, cont = 0, trg = 0;

	switch ( sLocalSeq )
	{

	//// ピラミッド入口シーン
	case S7_100:
		FadeDec(3);	// white -> normal

		// ピラミッドスクロール
		if ( bg_scroll_x < 16 && (time & 3 ) == 3 )
		{
			*(vu16*)REG_BG0HOFS = ++bg_scroll_x;
			*(vu16*)REG_BG0VOFS = --bg_scroll_y;
			*(vu16*)REG_BG1HOFS = bg_scroll_x;
			*(vu16*)REG_BG1VOFS = bg_scroll_y;
		}

		// 背景スクロール
		if ( (time & 7 ) == 7 )
			*(vu16*)REG_BG2HOFS = bg_scroll_x >> 1;

		// ワリオ移動
		if ( ob_pos_y > 112 )
			ob_pos_y--;

		if ( ob_pos_x < LCD_CENTER_X )
		{
			cont = R_KEY;

			if ( ob_pos_x < 40 )
				ob_pos_x++;
			else
				ob_pos_x += 2;
		}
		else
		{	uLocalTime = 0;
			sLocalSeq++;
		}
	break;

	case S7_101:
		if ( uLocalTime == 0 )
		{	Title_Wario_Pattern( W_NORMAL, UPFACE, R_MUKI );
			WarioVoiceSet( WV_FIGHT );
		}
		if ( ++uLocalTime == 50 )
		{	uLocalTime = 0;
			sLocalSeq++;
		}
	break;

	case S7_102:
		cont = R_KEY;

		if ( uLocalTime++ == 0 )
			Title_Wario_Pattern( W_NORMAL, WALK, R_MUKI );
		else
		{	if ( ob_pos_x < 272 )
				ob_pos_x += 2;
			else
			{	SetBLDDownMin( S7_BLD_BG );	// black 0
				sLocalSeq++;
			}
		}
	break;

	//// 通路シーン
	case S7_200:
		if ( FadeInc(1) )	// normal -> black
		{
			LZ77UnCompVram( (u16 *)scene7_bg2, (u16 *)((u8 *)BG_VRAM + BG0_TOP ) );
			bg_scroll_x = 0;
			bg_scroll_y = 0;
			*(vu16*)REG_BG0HOFS = 0;
			*(vu16*)REG_BG0VOFS = 0;
			*(vu16*)REG_BG1HOFS = 0;
			*(vu16*)REG_BG1VOFS = 0;
			ob_pos_x = -32;
			ob_pos_y = 88;
			s7_smoke_x = ob_pos_x;
			s7_smoke_y = ob_pos_y;
			s7_cat_x = 424;
			uLocalTime2 = 0;
			sLocalSeq++;

			// 音量を下げる	(tb)=M4A_TRACK_FULL, (vo)=M4A_VOLUME_10	"g_sound.h"
			m4aMPlayVolumeControl( &m4a_mplay000, M4A_TRACK_FULL, M4A_VOLUME_10 );

			// BGM 開始
			m4aSongNumStartOrChange( M_BGM_TITLE_PYRAMID_IN );

			*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_OBJ_ON |
							DISP_BG0_ON | DISP_BG1_ON ;

		}
	break;

	case S7_201:
		FadeDec(1);		// black -> normal

		// ワリオ移動
		cont = R_KEY;
		if ( ob_pos_x < 56 )
			ob_pos_x += 2;
		else
		{	uLocalTime = 0;
			sLocalSeq++;
		}
	break;

	case S7_202:
		// ワリオ斜面移動
		cont = R_KEY;
		i = uLocalTime * 56 / 112 ;	// ワリオ斜面移動の傾きは (144-88)/(168-56) (ydot/xdot)
		ob_pos_y = 88 + i;

		bg_scroll_x += 2;
		bg_scroll_y = i;
		s7_smoke_x -= 2;
		s7_smoke_y = ob_pos_y -8;
		*(vu16*)REG_BG0HOFS = bg_scroll_x;
		*(vu16*)REG_BG0VOFS = bg_scroll_y;
		*(vu16*)REG_BG1HOFS = bg_scroll_x;
		*(vu16*)REG_BG1VOFS = bg_scroll_y;

		uLocalTime += 2;
		if ( uLocalTime > 112 )
			sLocalSeq++;
	break;

	case S7_203:
		cont = R_KEY;
		bg_scroll_x += 2;
		s7_smoke_x -= 2;
		*(vu16*)REG_BG0HOFS = bg_scroll_x;
		*(vu16*)REG_BG1HOFS = bg_scroll_x;
		if ( bg_scroll_x == 272 )
		{
			Title_Wario_Pattern( W_NORMAL, STOP, R_MUKI );
			uLocalTime = 0;
			sLocalSeq++;
		}

		// 猫　待機
		scene7_cat_Anime2( 0, &pCat );
	break;

	case S7_204:
		// 猫　走り出す
		if ( scene7_cat_Anime2( uLocalTime++, &pCat ) )
		{	uLocalTime = 0;
			sLocalSeq++;

			// 効果音
			m4aSongNumStartOrChange( S_DEMO_TITLE_CAT_1 );
			WarioVoiceSet( WV_PYRAMID_CAT );
		}
	break;

	case S7_205:
		// 猫　走る
		scene7_cat_Anime1( uLocalTime++, &pCat );
		s7_cat_x += 2;
		if ( s7_cat_x == 600 )
		{
			Title_Wario_Pattern( W_NORMAL, WALK, R_MUKI );
			sLocalSeq++;
		}
	break;

	case S7_206:
		// ワリオ移動
		cont = R_KEY;
		if ( ob_pos_x < 256 )
			ob_pos_x += 2;
		else
			sLocalSeq++;
	break;

	//// 穴部屋シーン
	case S7_300:
		if ( FadeInc(1) )	// normal -> black
		{
			LZ77UnCompVram( (u16 *)scene7_bg3_1, (u16 *)((u8 *)BG_VRAM + BG0_TOP ) );
			LZ77UnCompVram( (u16 *)scene7_bg3_2, (u16 *)((u8 *)BG_VRAM + BG1_TOP ) );
			*(vu16*)REG_BG0HOFS = 0;
			*(vu16*)REG_BG0VOFS = 0;
			*(vu16*)REG_BG1HOFS = 0;
			*(vu16*)REG_BG1VOFS = 0;
			ob_pos_x = -32;
			ob_pos_y = 144;
			s7_smoke_x = ob_pos_x;
			s7_smoke_y = ob_pos_y;
			uLocalTime = 0;
			sLocalSeq++;
		}
	break;

	case S7_301:
		FadeDec(1);		// black -> normal

		// ワリオ移動
		if ( ob_pos_x < 48 )
		{
			ob_pos_x += 2;
			cont = R_KEY;
		}
		if ( ob_pos_x == 48 -2 )
			Title_Wario_Pattern( W_NORMAL, STOP, R_MUKI );

		// 猫　穴に飛び込む
		if ( scene7_cat_Anime0( uLocalTime++, &pCat ) )
		{
			Title_Wario_Pattern( W_NORMAL, WALK, R_MUKI );
			sLocalSeq++;
		}
		if ( uLocalTime == 217 ) // 飛び込むパターン時 
			// 効果音
			m4aSongNumStartOrChange( S_DEMO_TITLE_CAT_DOWN );
	break;

	case S7_302:
		// ワリオ移動
		cont = R_KEY;
		if ( ob_pos_x < 96 )
			ob_pos_x += 2;
		else
		{	Title_Wario_Pattern( W_NORMAL, HIP, R_MUKI );
			// 効果音
			m4aSongNumStartOrChange( S_DEMO_TITLE_WARIO_DOWN );
			sLocalSeq++;
		}

	break;

	case S7_303:
		// ワリオ穴に入る
		ob_pos_x++;
		i = ob_pos_x - 104;			// y = -A(x-X)^2 + Y;
		ob_pos_y = i*i/8 + 136;		//	X=104, Y=136, A=1/8(x=96,y=144)

		if ( ob_pos_y > 200 )
			sLocalSeq++;

		if ( ob_pos_x < 104 )
			cont = R_KEY;	// ジャンプ時に土煙を１回出すため
	break;

	case S7_400:
		if ( FadeInc(1) )	// normal -> black
			sGameSeq++;
	break;
	}


	////　ＯＢＪ設定

	// 香月さんワリオをセット
	pri = 1;
	pObj = Title_Wario_Move( ob_pos_x, ob_pos_y, pri, cont, trg );
	if ( pObj > pObjEnd ) pObjEnd = pObj;

	// 通路の猫
	if ( sLocalSeq >= S7_203 && sLocalSeq < S7_300 )
		pObj = SetObj( pCat, pObj, s7_cat_x - bg_scroll_x, 144 );

	// 穴部屋の猫
	if ( sLocalSeq == S7_301 )
		pObj = SetObj( pCat, pObj, 152, 144 );


	// 輝き
	if ( sLocalSeq > S7_300 )
	{
		static u16 xpos[] = { 16, 24,  80, 184, 224, 216,  72, 152};
		static u16 ypos[] = { 16, 72, 152, 136, 112,  24,  44,  96};

		for ( i = 0 ; i < 8 ; i++ )
		{	scene7_glitter_Anime0( time + i*6, &p );
			pObj = SetObj( p, pObj, xpos[i], ypos[i] );
		}
	}
	else if ( sLocalSeq > S7_200 )
	{
		static u16 xpos[] = { 12, 100,  52, 184, 136, /*212,*/ 244, 284, 324, /*360,*/ 408, 448, 484, 504 };
		static u16 ypos[] = { 28,  48, 100, 112, 188, /*160,*/ 208, 140, 204, /*176,*/ 128, 208, 132, 200 };

		for ( i = 0 ; i < 12 ; i++ )
		{	scene7_glitter_Anime0( time + i*6, &p );
			pObj = SetObj( p, pObj, xpos[i] - bg_scroll_x, ypos[i] - bg_scroll_y );
		}
	}
	else
	{
		static u16 xpos[] = {  36,  96, 164, 168, 228, 248};
		static u16 ypos[] = { 144, 120, 140,  44,   8,  68};

		for ( i = 0 ; i < 6 ; i++ )
		{	scene7_glitter_Anime0( time + i*6, &p );
			pObj = SetObj( p, pObj, xpos[i] - bg_scroll_x, ypos[i] - bg_scroll_y );
		}
	}

	// ワリオの土煙
	if ( cont == R_KEY )
	{
		if ( scene7_smoke_Anime22( s7_smoke_t++, &p ) )
		{
			s7_smoke_x = ob_pos_x;
			s7_smoke_y = ob_pos_y;
		}
		pObj = SetObj( p, pObj, s7_smoke_x, s7_smoke_y );
	}
	else
		s7_smoke_t = 0;


	EndObj( pObj );

	////　ＢＧＭ設定
	if ( sLocalSeq > S7_200 && sLocalSeq < S7_300 )
	{	
		BOOL bSet = FALSE;
		u16 /*tb,*/ vo, te;
		s16	pi;
		u8  md, ls;
		
		if ( uLocalTime2++ == 60 )
		{
			vo = M4A_VOLUME_11;
			pi = M4A_PITCH_11;
			md = M4A_MODDEPTH_11;
			ls = M4A_LFOSPEED_11;
			te = M4A_TEMPO_11;
			bSet = TRUE;
		}
		else if ( uLocalTime2 == 120 )
		{
			vo = M4A_VOLUME_12;
			pi = M4A_PITCH_12;
			md = M4A_MODDEPTH_12;
			ls = M4A_LFOSPEED_12;
			te = M4A_TEMPO_12;
			bSet = TRUE;
		}
		else if ( uLocalTime2 == 180 )
		{
			vo = M4A_VOLUME_13;
			pi = M4A_PITCH_13;
			md = M4A_MODDEPTH_13;
			ls = M4A_LFOSPEED_13;
			te = M4A_TEMPO_13;
			bSet = TRUE;
		}
		else if ( uLocalTime2 == 240 )
		{
			vo = M4A_VOLUME_14;
			pi = M4A_PITCH_14;
			md = M4A_MODDEPTH_14;
			ls = M4A_LFOSPEED_14;
			te = M4A_TEMPO_14;
			bSet = TRUE;
		}
		else if ( uLocalTime2 == 300 )
		{
			vo = M4A_VOLUME_15;
			pi = M4A_PITCH_15;
			md = M4A_MODDEPTH_15;
			ls = M4A_LFOSPEED_15;
			te = M4A_TEMPO_15;
			bSet = TRUE;
		}
		else if ( uLocalTime2 == 360 )
		{
			m4aMPlayStop( &m4a_mplay000 );
		}

		if ( bSet )
		{
			m4aMPlayVolumeControl( &m4a_mplay000, M4A_TRACK_FULL, vo );
			m4aMPlayPitchControl ( &m4a_mplay000, M4A_TRACK_FULL, pi );
			m4aMPlayModDepthSet  ( &m4a_mplay000, M4A_TRACK_FULL, md );
			m4aMPlayLFOSpeedSet  ( &m4a_mplay000, M4A_TRACK_FULL, ls );
			m4aMPlayTempoControl ( &m4a_mplay000, te );
		}
	}

#if TITLE_DEBUG_MODE
	debug_ob_param_control();
	debug_bg_scroll( 0 );
	debug_bg_scroll( 1 );
#endif

}
#undef	BG0_TOP
#undef	BG0L_TOP
#undef	BG0R_TOP
#undef	BG1_TOP
#undef	BG1L_TOP
#undef	BG1R_TOP
#undef	BG2_TOP
#undef	BG2L_TOP
#undef	BG2R_TOP


//--------------------------------------------------------------
//// Scene 8　ピラミッドの中の穴
//--------------------------------------------------------------
static void Scene8_Init( void )
{
#define	BG0_TOP		0x8000	// 512x256
#define	S8_BLD_BG	( BLD_BD | BLD_BG0 | BLD_OBJ )

	//パレット
	DmaCopy(3, scene8_bg_Palette, BG_PLTT, sizeof(scene8_bg_Palette), 16);
	DmaCopy(3, scene8_obj_Palette, OBJ_PLTT, sizeof(scene8_obj_Palette), 16);
	//キャラクター転送
	LZ77UnCompVram( (u8 *)scene8_bg_Char, (u16 *)BG_VRAM );
	LZ77UnCompVram( (u8 *)scene8_obj_Char, (u16 *)OBJ_MODE0_VRAM );
	//スクリーンをセット
	UnPackScreen( (u16 *)scene8_bg, (u16 *)((u8 *)BG_VRAM + BG0_TOP ) );
	//ＢＧ０をセット
	*(vu16*)REG_BG0CNT = BG_COLOR_16 | BG_SCREEN_SIZE_1 | BG_PRIORITY_0
		| ((BG0_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);


	// 落下ワリオの初期値
	ob_pos_x = LCD_CENTER_X;
	ob_pos_y = LCD_CENTER_Y;
	ob_scale_x = ob_scale_y = 0x300;	// 3.0 倍
	ob_rotate = 0;
	// ＯＢＪ回転拡大縮小パラメータ０をセットする
	SetObjPABCD( 0, ob_rotate, ob_scale_x, ob_scale_y );


	SetBLDDownMax( S8_BLD_BG );	// black 16

	V_Wait();

	*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_BG0_ON ;
}

static void Scene8_Exec( int time )
{
	u16 *pObj, *p;

	switch ( sLocalSeq )
	{
	case S8_0:
		if ( FadeDec(1) )	// black -> normal
		{
			*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_OBJ_ON | DISP_BG0_ON ;
			WarioVoiceSet( WV_CIRCLE ); // ワリオの声
			sLocalSeq++;
		}
	break;

	case S8_1:
		// 落下ワリオを縮小する
		ob_scale_x -= 0x10;	// -= 12/256
		ob_scale_y -= 0x10;	// -= 12/256
		if ( ob_scale_x < 0x10 )
			sLocalSeq++;
	break;

	case S8_2:
		if ( FadeInc(1) )	// normal -> black
			sGameSeq++;
	break;
	}

	//// ＯＢＪセット
	pObj = (u16 *)OamBuf;

	if ( sLocalSeq < 2 )
	{
		scene8_Anime0( &p ); // 落下ワリオ
		pObj = SetObj( p, pObj, ob_pos_x, ob_pos_y );
		// ＯＢＪ回転拡大縮小パラメータ０をセットする
		SetObjPABCD( 0, ob_rotate, ob_scale_x, ob_scale_y );
	}

	EndObj( pObj );
}
#undef	BG0_TOP


//--------------------------------------------------------------
//// Scene 9　ピラミッドから脱出
//--------------------------------------------------------------

// 拡大表示においてお宝の位置補正をする
static void TresurePosCorrection( int (*animefunc)(int, u16**) )
{
	int i = usEndingType;

	if ( animefunc == scene9_wario_Anime1 || // 走る時のお宝袋
		 animefunc == scene9_wario_Anime7 || // 立ちポーズ時のお宝袋
		 animefunc == scene9_wario_Anime9 )  // ジャンプ時のお宝袋
	{
		static s16 correctionX[] = { -18, -16, -16,  -8 };
		static s16 correctionY[] = { -12, -16, -16, -16 };
		s9_TreasureOffX = correctionX[i];
		s9_TreasureOffY = correctionY[i];
	}
	else if ( animefunc == scene9_wario_Anime3 || // 登る時のお宝袋
			  animefunc == scene9_wario_Anime5 )  // ずり落ちる時のお宝袋
	{
		static s16 correctionY[] = { -22, -18, -16, -8 };
		s9_TreasureOffX = -16;
		s9_TreasureOffY = correctionY[i];
	}
}

// 落ちる外壁破片の初期化
static void	scene9_fragment_Init( int randomSeed )
{
	int i;
	s16 *px, *py;

	px = (u16 *)s9_fragment_xa;
	py = (u16 *)s9_fragment_ya;

	for ( i = 0 ; i < 8 ; i++ )
	{	randomSeed = ( randomSeed * 109 + 1021 ) % 240;
		*px++ = randomSeed;
		randomSeed = ( randomSeed * 109 + 1021 ) % 256;
		*py++ = randomSeed;
	}

	s9_RandomSeed = randomSeed;
}

// 落ちる外壁破片の移動
static void	scene9_fragment_move( int speed_x )
{
	int i;
	u16 *px;
	u16 *py = (u16 *)s9_fragment_ya;

	*py++ += 3;
	*py++ += 3;
	*py++ += 3;
	*py++ += 4;
	*py++ += 4;
	*py++ += 3;
	*py++ += 4;
	*py++ += 4;

	px = (u16 *)s9_fragment_xa;
	py = (u16 *)s9_fragment_ya;
	for ( i = 0 ; i < 8 ; i++, px++, py++ )
	{
		if ( speed_x )
			*px += speed_x;

		*py &= 255;

		if (( *py & ~3 ) == 200 ) // 200, 201, 202, 203 
		{
			s9_RandomSeed = ( s9_RandomSeed * 109 + 1021 ) % 240;
			*px = s9_RandomSeed;
		}
	}
}

static void Scene9_Init( void )
{
#define	BG0_TOP		0x8000	// 512x256
#define	BG0L_TOP	BG0_TOP
#define	BG0R_TOP	(BG0_TOP + 0x800)
#define	BG1_TOP		0x9000	// 512x256
#define	BG1L_TOP	BG1_TOP
#define	BG1R_TOP	(BG1_TOP + 0x800)
#define	BG2_TOP		0xa000	// 512x256
#define	BG2L_TOP	BG2_TOP
#define	BG2R_TOP	(BG2_TOP + 0x800)
#define	S9_BLD_BG		( BLD_BD | BLD_BG0 | BLD_BG1 | BLD_BG2 | BLD_OBJ )

	//パレット
	DmaCopy(3, scene7_bg_Palette, BG_PLTT, sizeof(scene7_bg_Palette), 16);
	DmaCopy(3, scene9_obj_Palette, OBJ_PLTT, sizeof(scene9_obj_Palette), 16);

	//キャラクター
	LZ77UnCompVram( (u8 *)scene7_bg_Char, (u16 *)BG_VRAM );
	LZ77UnCompVram( (u8 *)scene9_obj_Char, (u16 *)OBJ_MODE0_VRAM );

	//スクリーン
	DmaClear(3, 0x03ff03ff, (u32 *)((u8 *)BG_VRAM + BG0_TOP), 0x800, 32 );
	DmaClear(3, 0xa0c5a0c5, (u32 *)((u8 *)BG_VRAM + BG1_TOP), 0x800, 32 );
	UnPackScreen( (u16 *)scene7_bg_pit, (u16 *)((u8 *)BG_VRAM + BG1_TOP ) );

	//ＢＧ０〜２をセット
	*(vu16*)REG_BG0CNT = BG_COLOR_16 | BG_SCREEN_SIZE_1 | BG_PRIORITY_0
		| ((BG0_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG1CNT = BG_COLOR_16 | BG_SCREEN_SIZE_1 | BG_PRIORITY_1
		| ((BG1_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG2CNT = BG_COLOR_16 | BG_SCREEN_SIZE_1 | BG_PRIORITY_2
		| ((BG2_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);


	// 縦穴シーンの初期値
	bg_scroll_x = 0;
	bg_scroll_y = 0;
	ob_pos_x = LCD_CENTER_X;
	ob_pos_y = 220;
	s9_cat_x = LCD_CENTER_X;
	s9_cat_y = ob_pos_y -16;

	// 落ちる外壁破片の初期値
	scene9_fragment_Init( 0 );

	SetBLDDownMax( S9_BLD_BG );	// black 16

	V_Wait();

	*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_OBJ_ON |
							DISP_BG0_ON | DISP_BG1_ON | DISP_BG2_ON ;
}

static void Scene9_Exec( int time )
{
	int i;
	u16 *pObj, *p, *pWario=0, *pTreasure=0, *pCat=0, *pDoctor=0, *pSmoke=0;

	//// 地震の揺れ具合
	static u16 shake_y[] = { 1, 2, 1, 0, -1, -2, -1, 0 };
	u16 offset_y = shake_y[ time & 7 ];

	int nTreasure = usTreasureCount;
	s9_TreasureOffX = 0;
	s9_TreasureOffY = 0;


	switch ( sLocalSeq )
	{
	//// 縦穴シーン
	case S9_1:
		if ( FadeDec(1) )	// black -> normal
		{
			// ワリオが壁をよじ登っている
			scene9_wario_Anime2( time, &pWario );
			if ( nTreasure )
			{	scene9_wario_Anime3( time, &pTreasure );
				TresurePosCorrection( scene9_wario_Anime3 );
			}
			if ( time & 1 )
				ob_pos_y--;

			if ( ob_pos_y < -64 )
			{	uLocalTime = 0;
				sLocalSeq++;
			}

			// 猫
			i = uLocalTime++ & 128 ? 4 : 8 ;
			scene9_cat_Anime2( i, &pCat );
			if ( s9_cat_y > -64 )
				s9_cat_y = ob_pos_y -16;
		}
	break;

#define	S9_WARIO_Y	180
#define	S9_CAT_X	128
#define	S9_DOCTOR_X	104

	//// 穴部屋シーン（ワリオが穴から出てくる）
	case S9_100:

		if ( FadeInc(1) )	// normal -> black
		{
			LZ77UnCompVram( (u16 *)scene7_bg3_1, (u16 *)((u8 *)BG_VRAM + BG0_TOP ) );
			LZ77UnCompVram( (u16 *)scene7_bg3_2, (u16 *)((u8 *)BG_VRAM + BG1_TOP ) );

			bg_scroll_x = 0;
			bg_scroll_y = 0;
			ob_pos_x = LCD_CENTER_X;
			ob_pos_y = S9_WARIO_Y;
			s9_cat_x = S9_CAT_X;
		//	s9_cat_y = 184;		// y = 1/8(x-104)^2 + 112;
			s9_doctor_x = S9_DOCTOR_X;
		//	s9_doctor_y = 208;	// y = 1/2(x-116)^2 + 136;

			sLocalSeq++;
		}
	break;

	case S9_101:
		if ( FadeDec(1) )	// black -> normal
		{
			// 猫　穴から飛び出る
			if ( s9_cat_x > 88 )
			{	if ( time & 1 )
				{	s9_cat_x--;
					i = s9_cat_x - 104;
					s9_cat_y = i*i/8 + 112;	// y = -A(x-104)^2 + 112  (x=88,y=144):A=1/8
				}
				i = s9_cat_x > 96 ? 10 : 6 ;
				scene9_cat_Anime0( i, &pCat ); // 猫　穴から飛び出る（走るパターンを代用）
			}
			else // 猫　右に振り向く
				if ( scene9_cat_Anime1( uLocalTime++, &pCat ) )
				{	uLocalTime = 0;
					sLocalSeq++;
				}

			// 効果音==============================================
			if ( s9_cat_x == S9_CAT_X -8 )
				m4aSongNumStartOrChange( S_WARIO_JUMP_1 ); // 猫ジャンプ
			// ====================================================
		}
	break;

	case S9_102:

		// 猫　右を向いている
		scene9_cat_Anime1( 100, &pCat );

		if ( uLocalTime++ > 160 )
		{
			// 博士　穴から飛び出してくる
			if ( s9_doctor_x < LCD_CENTER_X )
			{	// 穴からジャンプ
				scene9_doctor_flip_Anime1( 0, &pDoctor );
				if ( time & 1 )
					s9_doctor_x++;
				i = s9_doctor_x - 116;
				s9_doctor_y = i*i/2 + 136;	// y = -A(x-116)^2 + 136	(x=120,y=144):A=1/2
			}
			else if ( s9_doctor_x < 152 )
			{	// ワリオを踏みつけて更にジャンプ
				scene9_doctor_flip_Anime1( 8, &pDoctor );
				s9_doctor_x++;
				i = s9_doctor_x - 136;
				s9_doctor_y = i*i/16 + 128;	// y = -A(x-136)^2 + 128	(x=152,y=144):A=1/16
			}
			else if ( s9_doctor_x == 152 )
			{	uLocalTime = 0;
				sLocalSeq++;
			}

			// 効果音===================================
			if ( s9_doctor_x == S9_DOCTOR_X +2 )
				m4aSongNumStartOrChange( S_WARIO_JUMP_1 ); // ジャンプ

			if ( s9_doctor_x == LCD_CENTER_X )
				m4aSongNumStartOrChange( S_WARIO_BUMP ); // ワリオ踏みつけられる
			// =========================================
		}

		// ワリオ登ってくる
		if ( s9_doctor_x < LCD_CENTER_X )
		{	scene9_wario_Anime2( time, &pWario );
			if ( nTreasure )
			{	scene9_wario_Anime3( time, &pTreasure );
				TresurePosCorrection( scene9_wario_Anime3 );
			}
			if (( time & 3 ) == 3 )
				ob_pos_y--;
		}
		else // ワリオずり落ちる
		{	scene9_wario_Anime4( time, &pWario );
			if ( nTreasure )
			{	scene9_wario_Anime5( time, &pTreasure );
				TresurePosCorrection( scene9_wario_Anime5 );
			}
			ob_pos_y++;

			// 効果音==============================================
			if ( s9_doctor_x == LCD_CENTER_X + 2 )
				m4aSongNumStartOrChange( S_WARIO_LADDER_FALLDOWN ); // ワリオずり落ちる
			// ====================================================
		}
	break;

	case S9_103:
		// 猫　右を向いている(博士を見る）
		scene9_cat_Anime1( 28, &pCat );

		if ( uLocalTime > 160 )
		{	uLocalTime = 0;
			sLocalSeq++;
		}
		else if ( uLocalTime > 88 )
		{
			scene9_doctor_Anime0( uLocalTime, &pDoctor );
		}
		else // 博士　右往左往する
		{	if ( uLocalTime & 8 )
			{	scene9_doctor_Anime0( uLocalTime, &pDoctor );
				s9_doctor_x--;
			}
			else
			{	scene9_doctor_flip_Anime0( uLocalTime, &pDoctor );
				if ( uLocalTime > 4 ) // 右に行き過ぎないように調整
					s9_doctor_x++;
			}
		}
		s9_doctor_y = 144;

		uLocalTime++;


		// ワリオずり落ちている
		if ( uLocalTime < 40 )
		{	ob_pos_y++;
		}
		else // ワリオ登ってくる
		{	scene9_wario_Anime2( time, &pWario );
			if ( nTreasure )
			{	scene9_wario_Anime3( time, &pTreasure );
				TresurePosCorrection( scene9_wario_Anime3 );
			}
			if (( time & 3 ) == 3 )
				ob_pos_y--;
		}

	break;

	case S9_104:
		// 猫　右を向いている
		scene9_cat_Anime1( 100, &pCat );

		// 博士　穴を飛び越える
		if ( s9_doctor_x > 88 )
		{	scene9_doctor_Anime1( time, &pDoctor );
			s9_doctor_x--;
			i = s9_doctor_x - 120;
			s9_doctor_y = i*i*3/128 + 120;	// y = -A(x-120)^2 + 120	(x=152,y=144):A=3/128
		}
		else if ( s9_doctor_x > -32 )// 博士　走る
		{	scene9_doctor_Anime0( time, &pDoctor );
			s9_doctor_x -= 2;
		}
		else
		{	uLocalTime = 0;
			sLocalSeq++;
		}

		// ワリオ登ってくる
		scene9_wario_Anime2( time, &pWario );
		if ( nTreasure )
		{	scene9_wario_Anime3( time, &pTreasure );
			TresurePosCorrection( scene9_wario_Anime3 );
		}
		if (( time & 3 ) == 3 )
			ob_pos_y--;
	break;

	case S9_105:

		if ( ob_pos_x > 96 )
		{
			// ワリオジャンプ
			if ( nTreasure ) // お宝が有る時
			{	scene9_wario_Anime8( time, &pWario );
				scene9_wario_Anime9( time, &pTreasure );
				TresurePosCorrection( scene9_wario_Anime9 );
			}
			else // お宝が無い時
				scene9_wario_no_item_Anime4( time, &pWario );

			ob_pos_x--;
			i = ob_pos_x - 104;
			ob_pos_y = i*i/8 + 136;	// y = -A(x-104)^2 + 136	(x=96,y=144):A=1/8

			// 効果音=====================================
			if ( ob_pos_x == LCD_CENTER_X -2 )
				m4aSongNumStartOrChange( S_WARIO_JUMP_1 ); // ジャンプ
			// ===========================================
		
			// 猫　右を向いている
			scene9_cat_Anime1( 100, &pCat );
		}
		else
		{	// ワリオ立ちポーズ
			if ( nTreasure ) // お宝が有る時
			{	scene9_wario_Anime6( time, &pWario );
				scene9_wario_Anime7( time, &pTreasure );
				TresurePosCorrection( scene9_wario_Anime7 );
			}
			else // お宝が無い時
				scene9_wario_no_item_Anime3( time, &pWario );

			// 猫　左に振り向く
			if ( scene9_cat_Anime2( uLocalTime++, &pCat ) )
			{
				uLocalTime = 0;
				sLocalSeq++;
			}
		}
	break;

	case S9_106:

		if ( s9_cat_x > -32 )
		{	// 猫　走る
			scene9_cat_Anime0( time, &pCat );
			s9_cat_x -= 2;
			
			// ワリオ立ちポーズ
			if ( nTreasure ) // お宝が有る時
			{	scene9_wario_Anime6( time, &pWario );
				scene9_wario_Anime7( time, &pTreasure );
				TresurePosCorrection( scene9_wario_Anime7 );
			}
			else // お宝が無い時
				scene9_wario_no_item_Anime3( time, &pWario );
		}
		else
		{	// ワリオ走る
			if ( nTreasure ) // お宝が有る時
			{	scene9_wario_Anime0( time, &pWario );
				scene9_wario_Anime1( time, &pTreasure );
				TresurePosCorrection( scene9_wario_Anime1 );
			}
			else // お宝が無い時
				scene9_wario_no_item_Anime0( time, &pWario );

			ob_pos_x -= 2;
			if ( ob_pos_x < -32 )
			{	uLocalTime = 0;
				sLocalSeq++;
			}
		}
	break;

	//// 通路シーン
	case S9_200:
		if ( FadeInc(1) )	// normal -> black
		{
			LZ77UnCompVram( (u16 *)scene7_bg2, (u16 *)((u8 *)BG_VRAM + BG0_TOP ) );
			bg_scroll_x = (512 -240);
			bg_scroll_y = 56;
			*(vu16*)REG_BG0HOFS = bg_scroll_x;
			*(vu16*)REG_BG0VOFS = bg_scroll_y;
			*(vu16*)REG_BG1HOFS = bg_scroll_x;
			*(vu16*)REG_BG1VOFS = bg_scroll_y;

			s9_cat_x = 256 + bg_scroll_x;
			s9_cat_y = 144 + bg_scroll_y;
			ob_pos_x = 296 + bg_scroll_x;
			ob_pos_y = 144 + bg_scroll_y;

			V_Wait();
			*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_OBJ_ON | DISP_BG0_ON | DISP_BG1_ON ;
			
			sLocalSeq++;
		}
	break;

	case S9_201:
		FadeDec(1);	// black -> normal

		if ( 0 < bg_scroll_x && bg_scroll_x < 56 )
		{	if ( time & 1 ) //坂道では速さを半分にする
			{	bg_scroll_x--;
				bg_scroll_y--;
			}
		}
		else
			if ( bg_scroll_x > 0 )
				bg_scroll_x--;

	/*	if ( bg_scroll_x > 0 )
			bg_scroll_x--;

		if ( 0 < bg_scroll_x && bg_scroll_x < 56 )
			bg_scroll_y--;
	*/		

		// ワリオ走る
		if ( nTreasure ) // お宝が有る時
		{	scene9_wario_Anime0( time, &pWario );
			scene9_wario_Anime1( time, &pTreasure );
			TresurePosCorrection( scene9_wario_Anime1 );
		}
		else // お宝が無い時
			scene9_wario_no_item_Anime0( time, &pWario );

		if ( ob_pos_x > -32 )
			ob_pos_x -= 2;
		else
		{	uLocalTime = 0;
			sLocalSeq++;
		}
		if ( 64 <= ob_pos_x && ob_pos_x < 168 )
		{	ob_pos_x++; // -=2 +1 == -1 坂道では速さを半分にする　
			ob_pos_y = (ob_pos_x - 64)*14/13 + 88;
		}
		// 猫　走る
		scene9_cat_Anime0( time, &pCat );

		if ( s9_cat_x > -32 )
			s9_cat_x -= 2;
		if ( 64 <= s9_cat_x && s9_cat_x < 168 )
		{	s9_cat_x++; // -=2 +1 == -1	坂道では速さを半分にする
			s9_cat_y = (s9_cat_x - 64)*14/13 + 88;
		}
	break;


	//// ピラミッド入口シーン
	case S9_300:
		if ( FadeInc(1) )	// normal -> black
		{
			//スクリーンをセット
			DmaClear(3, 0x03FF, BG_VRAM+BG0_TOP, 32*19*sizeof(u16), 16);
			UnPackScreen( (u16 *)scene7_bg1_1, (u16 *)((u8 *)BG_VRAM + BG0_TOP ) );
			DmaClear(3, 0x03FF, BG_VRAM+BG1_TOP, 32*19*sizeof(u16), 16);
			UnPackScreen( (u16 *)scene7_bg1_2, (u16 *)((u8 *)BG_VRAM + BG1_TOP ) );
			DmaClear(3, 0x93A0, (u16 *)((u8 *)BG_VRAM + BG2_TOP) +0x1c0, 32*6*sizeof(u16), 16);
			UnPackScreen( (u16 *)scene7_bg1_3, (u16 *)((u8 *)BG_VRAM + BG2_TOP ) );

			bg_scroll_x = 16;
			bg_scroll_y = 0;
			*(vu16*)REG_BG0HOFS = bg_scroll_x;
			*(vu16*)REG_BG0VOFS = bg_scroll_y;
			*(vu16*)REG_BG1HOFS = bg_scroll_x;
			*(vu16*)REG_BG1VOFS = bg_scroll_y;

			s9_cat_x = 240 + bg_scroll_x;
			s9_cat_y = 112 + bg_scroll_y;
			ob_pos_x = 280 + bg_scroll_x;
			ob_pos_y = 112 + bg_scroll_y;

			V_Wait();
			*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_OBJ_ON |
									DISP_BG0_ON | DISP_BG1_ON | DISP_BG2_ON ;
			sLocalSeq++;
		}
	break;

	case S9_301:
		if ( FadeDec(1) )	// black -> normal
			scene9_smoke2_Anime0( time, &pSmoke ); // 煙

		// ワリオ走る
		if ( nTreasure ) // お宝が有る時
		{	scene9_wario_Anime0( time, &pWario );
			scene9_wario_Anime1( time, &pTreasure );
			TresurePosCorrection( scene9_wario_Anime1 );
		}
		else // お宝が無い時
			scene9_wario_no_item_Anime0( time, &pWario );

		if ( ob_pos_x > -32 )
			ob_pos_x -= 2;
		else
		{	SetBLDUpMin( S9_BLD_BG );	// white 0
			uLocalTime = 0;
			sLocalSeq++;
		}
		if ( ob_pos_x < 32 )
			ob_pos_y = (32 - ob_pos_x)*6/5 + 112;

		// 猫　走る
		scene9_cat_Anime0( time, &pCat );

		if ( s9_cat_x > -32 )
			s9_cat_x -= 2;
		if ( s9_cat_x < 32 )
			s9_cat_y = (32 - s9_cat_x)*6/5 + 112;

	break;

	case S9_400:
		if ( FadeInc(7) )	// normal -> white
			sGameSeq++;
	break;
	}

	//// 地震
	*(vu16*)REG_BG0HOFS = bg_scroll_x;
	*(vu16*)REG_BG0VOFS = bg_scroll_y + offset_y;
	*(vu16*)REG_BG1HOFS = bg_scroll_x;
	*(vu16*)REG_BG1VOFS = bg_scroll_y + offset_y;


	////　ＯＢＪ設定
	pObj = (u16 *)OamBuf;

	// 落ちる外壁破片
	if ( sLocalSeq <= S9_300 )
	{	u16 *px = (u16 *)s9_fragment_xa;
		u16 *py = (u16 *)s9_fragment_ya;
		
		// 落ちる外壁破片の移動
		int speed = bg_scroll_x > 0 ? 1 : 0 ;
		scene9_fragment_move( speed );

		scene9_fragment_Anime0( time, &p );
		pObj = SetObj( p, pObj, *px++, *py++ );
		scene9_fragment_Anime1( time, &p );
		pObj = SetObj( p, pObj, *px++, *py++ );
		scene9_fragment_Anime2( time, &p );
		pObj = SetObj( p, pObj, *px++, *py++ );
		scene9_fragment_Anime3( time, &p );
		pObj = SetObj( p, pObj, *px++, *py++ );
		scene9_fragment_Anime4( time, &p );
		pObj = SetObj( p, pObj, *px++, *py++ );
		scene9_fragment_Anime0( time +24, &p );
		pObj = SetObj( p, pObj, *px++, *py++ );
		scene9_fragment_Anime0( time +56, &p );
		pObj = SetObj( p, pObj, *px++, *py++ );
		scene9_fragment_Anime0( time +72, &p );
		pObj = SetObj( p, pObj, *px++, *py++ );
	}

	// 煙
	if ( sLocalSeq == S9_301 )
		pObj = SetObj( pSmoke, pObj, 216, 88 );

	// 猫
	pObj = SetObj( pCat, pObj, s9_cat_x -bg_scroll_x, s9_cat_y +1 -bg_scroll_y -offset_y );

	// 博士
	pObj = SetObj( pDoctor, pObj, s9_doctor_x -bg_scroll_x, s9_doctor_y -bg_scroll_y -offset_y );

	// お宝袋（ワリオが穴を登っている時）
	if ( sLocalSeq < S9_105 )
		pObj = SetObj( pTreasure, pObj, ob_pos_x - bg_scroll_x + s9_TreasureOffX,
						ob_pos_y - bg_scroll_y - offset_y + s9_TreasureOffY);
	// ワリオ
	pObj = SetObj( pWario, pObj, ob_pos_x -bg_scroll_x, ob_pos_y -bg_scroll_y -offset_y );

	// お宝袋（ワリオが穴を登った後）
	if ( sLocalSeq >= S9_105 )
	{	pObj = SetObj( pTreasure, pObj, ob_pos_x - bg_scroll_x + s9_TreasureOffX,
						ob_pos_y - bg_scroll_y - offset_y + s9_TreasureOffY);
	}
	// 宝物拡大縮小パラメータ０
	if ( nTreasure )
		SetObjPABCD( 0, 0, sTreasureScale,  sTreasureScale );

	EndObj( pObj );
}
#undef	BG0_TOP
#undef	BG0L_TOP
#undef	BG0R_TOP
#undef	BG1_TOP
#undef	BG1L_TOP
#undef	BG1R_TOP
#undef	BG2_TOP
#undef	BG2L_TOP
#undef	BG2R_TOP

//--------------------------------------------------------------
//// Scene １０　ピラミッドの崩壊
//--------------------------------------------------------------

static int S10_GetTreasureY(void)
{
	if		( usEndingType == 0 ) return S10_TREASURE_Y0;
	else if ( usEndingType == 1 ) return S10_TREASURE_Y1;
	else if ( usEndingType == 2 ) return S10_TREASURE_Y2;
	else  /* usEndingType == 3 */ return S10_TREASURE_Y3;
}

static void Scene10_Init( void )
{
#define	BG0_TOP		0x8000	// 256x256
#define	BG1_TOP		0x8800	// 256x256
#define	BG2_TOP		0x9000	// 256x256
#define	BG3_TOP		0x9800	// 256x256
#define	S10_BLD_BG		( BLD_ALL )

	s16 *p;

	//パレット
	DmaCopy(3, scene10_bg_Palette, BG_PLTT, sizeof( scene10_bg_Palette ), 16);
	DmaCopy(3, scene10_obj_Palette, OBJ_PLTT, sizeof( scene10_obj_Palette ), 16);

	//キャラクター
	LZ77UnCompVram( (u8 *)pyramid_bg_Char, (u16 *)BG_VRAM );
	LZ77UnCompVram( (u8 *)scene10_jungle_Char, (u16 *)((u8 *)BG_VRAM + 32 * 0x220) );
	LZ77UnCompVram( (u8 *)scene10_light_Char, (u16 *)((u8 *)BG_VRAM + 32 * 0x340) );
	LZ77UnCompVram( (u8 *)scene10_obj_Char, (u16 *)OBJ_MODE0_VRAM );

	//スクリーン
	DmaClear(3, 0x03ff03ff, (u32 *)((u8 *)BG_VRAM + BG0_TOP), 0x800*4, 32);	// BG(256x256) ４枚分 
	UnPackScreen( (u16 *)scene10_jungle, (u16 *)((u8 *)BG_VRAM + BG0_TOP) );
	UnPackScreen( (u16 *)pyramid_bg2, (u16 *)((u8 *)BG_VRAM + BG1_TOP) );
	UnPackScreen( (u16 *)pyramid_bg3, (u16 *)((u8 *)BG_VRAM + BG2_TOP) );
	UnPackScreen( (u16 *)scene10_texture, (u16 *)((u8 *)BG_VRAM + BG3_TOP) );

	//ＢＧ０〜３をセット
	*(vu16*)REG_BG0CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_0
		| ((BG0_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG1CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_1
		| ((BG1_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG2CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_2
		| ((BG2_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG3CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_3
		| ((BG3_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	
	SetBLDUpMax( S10_BLD_BG );	// white 16

	s10_pyramid_y = -16;
	*(vu16*)REG_BG0VOFS = 0;
	*(vu16*)REG_BG1VOFS = s10_pyramid_y;
	*(vu16*)REG_BG2VOFS = 0;
	*(vu16*)REG_BG3VOFS = 0;

	s10_treasure_y = S10_GetTreasureY();

	ob_pos_x = 136;
	ob_pos_y = 144;
	s10_cat_x = 136;
	s10_cat_y = 144;

	s10_bAccessoriesMoveDone = 0;	// アクセサリー移動終了フラグ
	s10_accessoriesDoneCount = 0;	// 移動終了アクセサリーの個数

	s10_wario_is_surprised = FALSE;	// ワリオびっくりする

	V_Wait();

	*(vu16*)REG_WINOUT = ( WIN_BG3_ON <<8 ) | WIN_ALL_ON ;	// OBJwindow | WindowOUT

	*(vu16*)REG_DISPCNT = DISP_MODE_0 | DISP_OBJWIN_ON | DISP_OBJ_BG_ALL_ON ;

	// ＢＧＭ　フェードアウト	// Song_Player() "g_gmap.h"
	m4aMPlayFadeOut( mplay_table[ Song_Player(M_ENDING_HURRYUP) ].ma, M4A_FADEOUT_24 );

	// 効果音
	m4aSongNumStartOrChange( S_ENDING_EARTHQUAKE_PYRAMID );
}

// キラキラＯＢＪに拡大パラメータ番号をセットする
static void S10_KiraSetPABCDNumber( u16 *pAccessories, u16 *pObj, u16 num )
{
	if ( pAccessories )
	{
		u16 count = *pAccessories;
		u16 *p = (u16 *)pObj - 4 * count ; 

		num <<= 9;

		while ( count-- )
		{
			*p |= 0x0300; // ２倍拡大 ON
			*p++ -= 4;	// Ｙ座標補正
			*p |= num;	// パラメータ番号
			*p++ -= 4;	// Ｘ座標補正
			*p++;
			*p++;
		}
	}
}

static void Scene10_Exec( int time )
{
	int t, t2;
	s16 x, y, w, h;
	BOOL bDone, bAccessoriesMove = FALSE;
	u16 *pObj, *p, *pCat=0, *pWario=0, *pAccessories=0, *pEffect=0;


	switch ( sLocalSeq )
	{
	case S10_1:

		if ( FadeDec(15) )	// white -> normal
		{
			// ピラミッド沈下
			if ( s10_pyramid_y > -120 )
			{	if (( time & 7 ) == 7 )
					*(vu16*)REG_BG1VOFS = s10_pyramid_y--;
			}
			else
			{	uLocalTime = 0;
				sLocalSeq++;
			}
		}

		// ピラミッドを左右に揺らす
		*(vu16*)REG_BG1HOFS = ( time & 3 ) -1;	// -1,0,1

		// 猫とワリオ
		scene10_cat_wario_Anime0( time, &pWario );

	break;

	case S10_2:
		// 猫とワリオ
		if ( uLocalTime < 120 )	// ２秒
			scene10_cat_wario_Anime1( uLocalTime, &pWario ); // 顔を見合す二人
		else if ( uLocalTime < 240 )	// ４秒
		{	scene10_cat_wario_Anime4( uLocalTime -120, &pWario ); // 笑う二人
			// 効果音==============================================
			if ( uLocalTime == 120 )
				m4aSongNumStartOrChange( M_ENDING_PRINCESS );
			// ====================================================
		}
		else
		{	if ( scene10_cat_wario_Anime5( uLocalTime -240, &pWario ) )// 何か？に気付く猫
			{	uLocalTime = 0;
				uLocalTime2 = 0;
				sLocalSeq++;
				break;
			}
		}
		uLocalTime++;
	break;

	case S10_3:

		// アクセサリーの登場
		bAccessoriesMove = TRUE;

		// 猫
		if ( s10_bAccessoriesMoveDone )
		{	// 効果音===========================================
			m4aSongNumStartOrChange( S_DEMO_MAP_PYRAMID_SHINE );
			//==================================================

			if ( s10_accessoriesDoneCount == 1 )
			{	s10_wario_is_surprised = TRUE;
				s10_wario_time = 0;
			}
				
			uLocalTime2 = 8;
		}
		if ( uLocalTime2 > 0 )
		{	scene10_cat_wario_Anime7( 0, &pCat ); // 白（光る）
			uLocalTime2--;
		}
		else
			scene10_cat_wario_Anime6( 0, &pCat ); // 黒色（通常）

		// ワリオ
		if ( s10_wario_is_surprised )
			scene10_cat_wario_Anime8( s10_wario_time++, &pWario ); // 驚いて尻餅をつく
		else
			scene10_cat_wario_Anime2( uLocalTime, &pWario ); // 立ちポーズ

		uLocalTime++;

		if ( s10_accessoriesDoneCount == 4 )
		{	uLocalTime2 = 0;
			uLocalTime = 0;
			sLocalSeq++;
		}

	break;

	case S10_4:
		s10_cat_x = 96;
		s10_cat_y = 144;

		// 猫　お姫様に変身（変身直後は bDone==2 を返す）
		if ( usEndingType == 0 )
			bDone = scene10_princess_change_Anime3( uLocalTime, &pCat );
		else if ( usEndingType == 1 )
			bDone = scene10_princess_change_Anime2( uLocalTime, &pCat );
		else if ( usEndingType == 2 )
			bDone = scene10_princess_change_Anime0( uLocalTime, &pCat );
		else if ( usEndingType == 3 )
			bDone = scene10_princess_change_Anime1( uLocalTime, &pCat );

		// 変身直後？
		if ( bDone == 2 )
			s10_wario_is_surprised = FALSE;

		// ワリオ
		if ( s10_wario_is_surprised )
			scene10_cat_wario_Anime8( s10_wario_time++, &pWario ); // 驚いて尻餅をついている
		else
		{	scene10_cat_wario_Anime9( uLocalTime2, &pWario ); // 目をパチパチしている

			// 変身直後の光エフェクト
			scene10_etc_Anime8( uLocalTime2, &pEffect );

			uLocalTime2++;
		}

		// 猫が変身中のＯＢＪウィンド内背景(BG3)をスクロールさせる
		*(vu16*)REG_BG3VOFS = time ;

		uLocalTime++;

		if ( bDone == 1 )
			if ( FadeInc(7) )
				sGameSeq++;
	break;
	}

	//// ＯＢＪセット
	pObj = (u16 *)OamBuf;


	// アクセサリー
	if ( bAccessoriesMove )
	{
		t = uLocalTime -1;	// S10_3 で uLocalTime++ されている

		// 効果音============================================
		if ( t == 0 )
			m4aSongNumStartOrChange( S_DEMO_MAP_ITEM_FLY_1 );
		if ( t == 90 )
			m4aSongNumStartOrChange( S_DEMO_MAP_ITEM_FLY_2 );
		// ==================================================


		s10_bAccessoriesMoveDone = 0;

		// 注意！　最後に出てくるアクセサリーが一番手前になる
		if ( t >= 45 )
		{	// イアリング
			scene10_etc_Anime3( t -45, &pAccessories );
			if ( scene10_accessories_D_move( t -45, &x, &y, &w, &h ) )
			{	s10_bAccessoriesMoveDone |= 1;
				s10_accessoriesDoneCount++;
			}
			pObj = SetObj( pAccessories, pObj, x, y );
			SetObjPABCD( 4, 0, w, h );
		}

		if ( t >= 30 )
		{	// 首飾り
			scene10_etc_Anime2( t -30, &pAccessories );
			if ( scene10_accessories_C_move( t -30, &x, &y, &w, &h ) )
			{	s10_bAccessoriesMoveDone |= 1;
				s10_accessoriesDoneCount++;
			}
			pObj = SetObj( pAccessories, pObj, x, y );
			SetObjPABCD( 3, 0, w, h );
		}

		if ( t >= 15 )
		{	// 王冠
			scene10_etc_Anime1( t -15, &pAccessories );
			if ( scene10_accessories_B_move( t -15, &x, &y, &w, &h ) )
			{	s10_bAccessoriesMoveDone |= 1;
				s10_accessoriesDoneCount++;
			}
			pObj = SetObj( pAccessories, pObj, x, y );
			SetObjPABCD( 2, 0, w, h );
		}

		// 腕輪
		scene10_etc_Anime0( t, &pAccessories );
		if ( scene10_accessories_A_move( t, &x, &y, &w, &h ) )
		{	s10_bAccessoriesMoveDone |= 1;
			s10_accessoriesDoneCount++;
		}
		pObj = SetObj( pAccessories, pObj, x, y );
		SetObjPABCD( 1, 0, w, h );

// キラキラ	
#define S10_KIRAKIRA( TIME, TYPE, PARAM )	\
		if ( t >= TIME ) \
		{	t2 = t - TIME; \
			scene10_etc_Anime6( t2, &pAccessories ); \
			if ( !scene10_kira_##TYPE##_move( t2, &x, &y, &w, &h ) ) \
			{	pObj = SetObj( pAccessories, pObj, x, y ); \
				S10_KiraSetPABCDNumber( pAccessories, pObj, PARAM ); \
				SetObjPABCD( PARAM, 0, w, h ); \
			} \
		}

		// 注意！　最後に出てくるアクセサリーのキラキラが一番手前になる
		S10_KIRAKIRA( 45, D1, 29 )
		S10_KIRAKIRA( 49, D2, 30 )
		S10_KIRAKIRA( 53, D3, 31 )
		S10_KIRAKIRA( 57, D4, 31 )
		S10_KIRAKIRA( 61, D5, 31 )
		S10_KIRAKIRA( 65, D6, 31 )
		S10_KIRAKIRA( 69, D7, 31 )
		S10_KIRAKIRA( 73, D8, 31 )

		S10_KIRAKIRA( 30, C1, 21 )
		S10_KIRAKIRA( 34, C2, 22 )
		S10_KIRAKIRA( 38, C3, 23 )
		S10_KIRAKIRA( 42, C4, 24 )
		S10_KIRAKIRA( 46, C5, 25 )
		S10_KIRAKIRA( 50, C6, 26 )
		S10_KIRAKIRA( 54, C7, 27 )
		S10_KIRAKIRA( 58, C8, 28 )

		S10_KIRAKIRA( 15, B1, 13 )
		S10_KIRAKIRA( 19, B2, 14 )
		S10_KIRAKIRA( 23, B3, 15 )
		S10_KIRAKIRA( 27, B4, 16 )
		S10_KIRAKIRA( 31, B5, 17 )
		S10_KIRAKIRA( 35, B6, 18 )
		S10_KIRAKIRA( 39, B7, 19 )
		S10_KIRAKIRA( 43, B8, 20 )

		S10_KIRAKIRA( 0, A1, 5 )
		S10_KIRAKIRA( 4, A2, 6 )
		S10_KIRAKIRA( 8, A3, 7 )
		S10_KIRAKIRA( 12, A4, 8 )
		S10_KIRAKIRA( 16, A5, 9 )
		S10_KIRAKIRA( 20, A6, 10 )
		S10_KIRAKIRA( 24, A7, 11 )
		S10_KIRAKIRA( 28, A8, 12 )
	}

	// 宝袋
	if ( usTreasureCount )
	{	scene10_etc_Anime4( uLocalTime, &p );
		pObj = SetObj( p, pObj, S10_TREASURE_X, s10_treasure_y );
		SetObjPABCD( 0, 0, sTreasureScale, sTreasureScale );
	}

	// 変身後の光エフェクト
	if		( usEndingType == 0 )	y = s10_cat_y -12;
	else if ( usEndingType == 1 )	y = s10_cat_y -20;
	else if ( usEndingType == 2 )	y = s10_cat_y -24;
	else   /* usEndingType == 3 */	y = s10_cat_y -24;
	pObj = SetObj( pEffect, pObj, s10_cat_x, y );

	// 猫（お姫様）
	pObj = SetObj( pCat, pObj, s10_cat_x, s10_cat_y );

	// ワリオ
	pObj = SetObj( pWario, pObj, ob_pos_x, ob_pos_y );

	// ピラミッドが沈下するときの煙
	if ( sLocalSeq == S10_1 )
	{
		scene10_kemuri_Anime2( time, &p );
		pObj = SetObj( p, pObj, 56 +4, 128 );

		scene10_kemuri_Anime0( time, &p );
		pObj = SetObj( p, pObj,  72, 128 +2 );
		pObj = SetObj( p, pObj,  88, 128 +6 );
		pObj = SetObj( p, pObj, 104, 128 +10 );
		pObj = SetObj( p, pObj, 120, 128 +12 );
		pObj = SetObj( p, pObj, 136, 128 +8 );
		pObj = SetObj( p, pObj, 152, 128 +4 );
		pObj = SetObj( p, pObj, 168, 128 );

		scene10_kemuri_Anime1( time, &p );
		pObj = SetObj( p, pObj, 184 -4, 128  );
	}

	EndObj( pObj );
}
#undef	BG0_TOP
#undef	BG1_TOP
#undef	BG2_TOP
#undef	BG3_TOP


//--------------------------------------------------------------
//// キスシーン
//--------------------------------------------------------------
static void Kiss_Init( void )
{
#define	BG0_TOP		0x8000	// 512x256
#define	BG1_TOP		0x9000	// 256x256
#define	BG2_TOP		0x9800	// 256x256
#define	BG3_TOP		0xA000	// 256x256
#define	KISS_BLD_BG		( BLD_ALL )

	// エンディングタイプ
	int nEndingType = usEndingType;

	DmaClear(3, 0x03ff03ff, (u32 *)((u8 *)BG_VRAM + BG0_TOP), 0x800*5, 32);	// BG(256x256) ５枚分 

	// パレット
	DmaCopy(3, kiss_wario_Palette, BG_PLTT, sizeof(kiss_wario_Palette), 16);
	DmaCopy(3, kiss_princess_Palette, (u16 *)BG_PLTT +16, sizeof(kiss_princess_Palette), 16);

	if ( nEndingType == 0 )
	{	// お姫様１
		LZ77UnCompVram( (u8 *)kiss_princess1_Char, (u16 *)((u8 *)BG_VRAM + 32 * 0x200) );
		UnPackScreen( (u16 *)kiss_princess1, (u16 *)((u8 *)BG_VRAM + BG0_TOP) );
		// ワリオ　アンハッピー
		LZ77UnCompVram( (u8 *)kiss_wario_unhappy_Char, (u16 *)BG_VRAM );
		UnPackScreen( (u16 *)kiss_wario_unhappy, (u16 *)((u8 *)BG_VRAM + BG1_TOP) );
	}
	else if ( nEndingType == 1 )
	{	// お姫様２
		LZ77UnCompVram( (u8 *)kiss_princess2_Char, (u16 *)((u8 *)BG_VRAM + 32 * 0x200) );
		UnPackScreen( (u16 *)kiss_princess2, (u16 *)((u8 *)BG_VRAM + BG0_TOP) );
		// ワリオ　アンハッピー
		LZ77UnCompVram( (u8 *)kiss_wario_unhappy_Char, (u16 *)BG_VRAM );
		UnPackScreen( (u16 *)kiss_wario_unhappy, (u16 *)((u8 *)BG_VRAM + BG1_TOP) );
	}
	else if ( nEndingType == 2 )
	{	// お姫様３
		LZ77UnCompVram( (u8 *)kiss_princess3_Char, (u16 *)((u8 *)BG_VRAM + 32 * 0x200) );
		UnPackScreen( (u16 *)kiss_princess3, (u16 *)((u8 *)BG_VRAM + BG0_TOP) );
		// ワリオ　ハッピー
		LZ77UnCompVram( (u8 *)kiss_wario_happy_Char, (u16 *)BG_VRAM );
		UnPackScreen( (u16 *)kiss_wario_happy, (u16 *)((u8 *)BG_VRAM + BG1_TOP) );
	}
	else //if ( nEndingType == 3 )
	{	// お姫様４
		LZ77UnCompVram( (u8 *)kiss_princess4_Char, (u16 *)((u8 *)BG_VRAM + 32 * 0x200) );
		UnPackScreen( (u16 *)kiss_princess4, (u16 *)((u8 *)BG_VRAM + BG0_TOP) );
		// ワリオ　ハッピー
		LZ77UnCompVram( (u8 *)kiss_wario_happy_Char, (u16 *)BG_VRAM );
		UnPackScreen( (u16 *)kiss_wario_happy, (u16 *)((u8 *)BG_VRAM + BG1_TOP) );
	}

	// 背景
	DmaCopy(3, kiss_bg_Palette, (u16 *)BG_PLTT +224, sizeof(kiss_bg_Palette), 16);
	LZ77UnCompVram( (u8 *)kiss_bg_Char, (u16 *)((u8 *)BG_VRAM + 32 * 0x380) );
	UnPackScreen( (u16 *)kiss_bg_rose, (u16 *)((u8 *)BG_VRAM + BG2_TOP) );
	LZ77UnCompVram( (u8 *)kiss_bg, (u16 *)((u8 *)BG_VRAM + BG3_TOP) );


	// メッセージ（ＯＢＪ）
	DmaCopy(3, kiss_obj_Palette, (u16 *)OBJ_PLTT, sizeof(kiss_obj_Palette), 16);
	LZ77UnCompVram( (u8 *)kiss_obj_Char, (u16 *)OBJ_MODE0_VRAM );


	//ＢＧ０〜３をセット
	*(vu16*)REG_BG0CNT = BG_COLOR_16 | BG_SCREEN_SIZE_1 | BG_PRIORITY_0
		| ((BG0_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG1CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_1
		| ((BG1_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG2CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_2
		| ((BG2_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG3CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_3
		| ((BG3_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);

	// お姫様とワリオのスクロール初期値をセット
	Kiss_princess_move( usEndingType, 0, &kiss_princess_x, &kiss_princess_y );
	Kiss_wario_move( usEndingType, 0, &kiss_wario_x, &kiss_wario_y );
	*(s16*)REG_BG0HOFS = kiss_princess_x;
	*(s16*)REG_BG0VOFS = kiss_princess_y;
	*(s16*)REG_BG1HOFS = kiss_wario_x;
	*(s16*)REG_BG2VOFS = kiss_wario_y;

	kiss_bMsgON = FALSE;
	kiss_bMsgDone = FALSE;

	uLocalTime2 = 0;
	uEVA = 0;
	uEVB = 16;

	V_Wait();

	SetBLDUpMax( KISS_BLD_BG );	// white 16

//	*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_OBJ_BG_ALL_ON ;
	*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_OBJ_ON |
							DISP_BG0_ON | DISP_BG1_ON | DISP_BG3_ON ;
}

static void Kiss_Exec( int time )
{
	BOOL bDone = FALSE;
	u16	*pMessage = 0;
	s16 x, y;

	switch ( sLocalSeq )
	{
	case KISS_0:
		if ( FadeDec(3) ) // white -> normal
		{
			*(vu16 *)REG_BLDALPHA = ( uEVB << 8) | uEVA ;
			*(vu16 *)REG_BLDCNT = BLD_BG2_1ST | BLD_A_BLEND_MODE | BLD_BG3_2ND ;
			*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_OBJ_BG_ALL_ON ;
			sLocalSeq++;
		}
	break;

	case KISS_1:
		// バラの背景を表示する
		if (( time & 3 ) == 3 )
		{
			if ( uEVA > 6 && uEVB > 8 )		// 16 >= uEVB >= 8
				uEVB--;

			if ( uEVA < 14 )				//  0 <= uEVA <= 14
			{	uEVA++;
				*(vu16 *)REG_BLDALPHA = ( uEVB << 8) | uEVA ;
			}
			else
				sLocalSeq++;
		}
	break;

	case KISS_2:

		// メッセージ表示開始
		kiss_bMsgON = TRUE;

		// メッセージ終了？
		if ( kiss_bMsgDone == TRUE )
			sLocalSeq++;
	break;

	case KISS_3:
		// バラの背景のを消去する
		if (( time & 3 ) == 3 )
		{
			if ( uEVB < 16 )
				uEVB++;

			if ( uEVA > 0 )
			{	uEVA--;
				*(vu16 *)REG_BLDALPHA = ( uEVB << 8) | uEVA ;
			}
			else
			{	//SetBLDUpMin( BLD_BG0 | BLD_BG1 | BLD_BG3 );	// white 0	ＯＢＪはブレンドしない
				SetBLDUpMin( KISS_BLD_BG );
				*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_OBJ_ON |
							DISP_BG0_ON | DISP_BG1_ON | DISP_BG3_ON ;
				sLocalSeq++;
			}
		}
	break;

	case KISS_4:
		if ( FadeInc(7) ) // normal -> white
			sGameSeq++;
	break;
	}

	// お姫様とワリオのスクロール
	Kiss_princess_move( usEndingType, time, &kiss_princess_x, &kiss_princess_y );
	Kiss_wario_move( usEndingType, time, &kiss_wario_x, &kiss_wario_y );
	*(s16*)REG_BG0HOFS = kiss_princess_x;
	*(s16*)REG_BG0VOFS = kiss_princess_y;
	*(s16*)REG_BG1HOFS = kiss_wario_x;
	*(s16*)REG_BG2VOFS = kiss_wario_y;

	// 背景スクロール
	*(vu16*)REG_BG2HOFS = -(time >> 1);
	*(vu16*)REG_BG3HOFS = -(time >> 2);

	// メッセージ（ＯＢＪ）
	if ( kiss_bMsgON )
	{	if ( bMsgJapanese )
			kiss_bMsgDone = Kiss_Message_J_Anime0( uLocalTime2++, &pMessage );
		else
			kiss_bMsgDone = Kiss_Message_E_Anime0( uLocalTime2++, &pMessage );

		EndObj(SetObj( pMessage, (u16 *)OamBuf, LCD_CENTER_X, LCD_CENTER_Y +60 ));
	}
}
#undef	BG0_TOP
#undef	BG1_TOP
#undef	BG2_TOP
#undef	BG3_TOP

//--------------------------------------------------------------
//// Scene １１	昇天するお姫様
//--------------------------------------------------------------

// 光の粒の初期化
static void	scene11_stars_Init( int randomSeed )
{
	int i;
	s16 *px = (u16 *)s11_stars_xa;
	s16 *py = (u16 *)s11_stars_ya;

	for ( i = 0 ; i < 8 ; i++ )
	{	randomSeed = ( randomSeed * 109 + 1021 ) % 64;
		*px++ = ( randomSeed +24 ) * 0x100 ; // 小数計算用に256倍しておく
		randomSeed = ( randomSeed * 109 + 1021 ) % 32;
		*py++ = randomSeed;
	}

	s11_RandomSeed = randomSeed;
}

// 光の粒の移動
static void	scene11_stars_move( void )
{
	int i;
	s16 *px = (s16 *)s11_stars_xa;
	s16 *py = (s16 *)s11_stars_ya;

	*py++ += 1;
	*py++ += 1;
	*py++ += 1;
	*py++ += 1;
	*py++ += 1;
	*py++ += 1;
	*py++ += 1;
	*py++ += 1;

	*px++ += (0x100*20/144);
	*px++ += (0x100*20/144);
	*px++ += (0x100*20/144);
	*px++ += (0x100*20/144);
	*px++ += (0x100*20/144);
	*px++ += (0x100*20/144);
	*px++ += (0x100*20/144);
	*px++ += (0x100*20/144);

	px = (s16 *)s11_stars_xa;
	py = (s16 *)s11_stars_ya;
	for ( i = 0 ; i < 8 ; i++, px++, py++ )
	{
		if ( *py > 32 )
		{	*py -= 40;
			s11_RandomSeed = ( s11_RandomSeed * 109 + 1021 ) % 64;
			*px = ( s11_RandomSeed +24 ) * 0x100 ;
		}
	}
}

static void Scene11_Init( void )
{
#define	BG0_TOP		0x8000	// 256x512
#define	BG1_TOP		0x9000	// 256x256
#define	BG2_TOP		0x9800	// 256x256
#define	S11_BLD_BG		( BLD_OBJ | BLD_BG1 | BLD_BG2 )
#define	S11_DISP_MODE	( DISP_MODE_0 | DISP_OBJ_ON | DISP_BG1_ON | DISP_BG2_ON )


	//パレット
	DmaCopy(3, scene10_bg_Palette, BG_PLTT, sizeof( scene10_bg_Palette ), 16);
	DmaCopy(3, scene10_obj_Palette, OBJ_PLTT, sizeof( scene10_obj_Palette ), 16);

	//キャラクター
	LZ77UnCompVram( (u8 *)pyramid_bg_Char, (u16 *)BG_VRAM );
	LZ77UnCompVram( (u8 *)scene10_jungle_Char, (u16 *)((u8 *)BG_VRAM + 32 * 0x220) );
	LZ77UnCompVram( (u8 *)scene10_light_Char, (u16 *)((u8 *)BG_VRAM + 32 * 0x340) );
	LZ77UnCompVram( (u8 *)scene10_obj_Char, (u16 *)OBJ_MODE0_VRAM );

	//スクリーン
	DmaClear(3, 0x43404340, (u32 *)((u8 *)BG_VRAM + BG0_TOP), 0x800*2, 32);
	UnPackScreen( (u16 *)scene10_light, (u16 *)((u8 *)BG_VRAM + BG0_TOP) );
	DmaClear(3, 0x03ff03ff, (u32 *)((u8 *)BG_VRAM + BG1_TOP), 0x800, 32);
	UnPackScreen( (u16 *)scene10_jungle, (u16 *)((u8 *)BG_VRAM + BG1_TOP) );
	UnPackScreen( (u16 *)pyramid_bg3, (u16 *)((u8 *)BG_VRAM + BG2_TOP) );

	//ＢＧ０〜３をセット
	*(vu16*)REG_BG0CNT = BG_COLOR_16 | BG_SCREEN_SIZE_2 | BG_PRIORITY_0
		| ((BG0_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG1CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_1
		| ((BG1_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG2CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_2
		| ((BG2_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	

//	s11_light_y = 160;
//	s11_light_x = s11_light_y*5/38; // 20/144
	*(vu16*)REG_BG0HOFS = 0; //s11_light_x;
	*(vu16*)REG_BG0VOFS = 0; //s11_light_y;
	*(vu16*)REG_BG1VOFS = 0;
	*(vu16*)REG_BG2VOFS = 0;
	*(vu16*)REG_BG3VOFS = 0;
	ob_pos_x = 136;
	ob_pos_y = 144;
	s11_princess_x = 96;
	s11_princess_y = 144;
	s11_treasure_x = S10_TREASURE_X;
	s11_treasure_y = S10_GetTreasureY();
	s11_treasure_yTop = s11_treasure_y -4;
	if		( usEndingType == 0 ) s11_treasure_speed = 0;
	else if ( usEndingType == 1 ) s11_treasure_speed = 1;
	else if ( usEndingType == 2 ) s11_treasure_speed = 3;
	else	/*usEndingType == 3*/ s11_treasure_speed = 7;

	uLocalTime2 = 0;

	s11_bPriority = FALSE;

	// 光の粒の初期化
	scene11_stars_Init( 0 );

	uEVA = 0;
	uEVB = 16;

	V_Wait();

	SetBLDUpMax( S11_BLD_BG );	// white 16

	*(vu16 *)REG_DISPCNT = S11_DISP_MODE;
}

// 待ち状態のお姫さま
static void Princess_Wait_Anime( int time, u16** pPrincess )
{
	int t = time & 511;

	// お姫様
	if ( usEndingType == 0 )
		scene10_princess_change_Anime3( t +270, pPrincess );
	else if ( usEndingType == 1 )
		scene10_princess_change_Anime2( t +318, pPrincess );
	else if ( usEndingType == 2 )
		scene10_princess_change_Anime0( t +298, pPrincess );
	else if ( usEndingType == 3 )
		scene10_princess_change_Anime1( t +296, pPrincess );
}

// お姫様のアニメーション
static void Princess_Anime( int time, u16 **pPrincess )
{
	if ( usEndingType == 0 )
		scene10_princess_Anime2( time, pPrincess );
	else if ( usEndingType == 1 )
		scene10_princess_Anime3( time, pPrincess );
	else if ( usEndingType == 2 )
		scene10_princess_Anime0( time, pPrincess );
	else if ( usEndingType == 3 )
		scene10_princess_Anime1( time, pPrincess );
}

// お姫様にαブレンドをかけるために優先順位を変える
static void S11_PrincessPriorityChange( u16 *pPrincess, u16 *pObj )
{
	if ( pPrincess )
	{
		u16 count = *pPrincess;
		u16 *p = pObj - 4 * count ; 

		while ( count-- )
		{
			*p++ |= 0x0400; // 半透明 ON
			*p++;
			*p++ |= 0x0400; // OBJ Priority 2
			*p++;
		}
	}
}

static void Scene11_Exec( int time )
{
	int t;
	s16	x, y;
	BOOL bAngelMove = FALSE;

	u16 *pObj, *p, *pPrincess=0, *pWario=0, *pAngel=0, *pTreasure=0;

	switch ( sLocalSeq )
	{
	case S11_0:
		if ( FadeDec(7) )
		{	if ( uLocalTime++ == 120 )
			{
				//αブレンド
			//	uEVA = 0;
			//	uEVB = 16;
				*(vu16*)REG_BLDALPHA = ( uEVB << 8 ) | uEVA ;
				*(vu16*)REG_BLDCNT = BLD_BG1_2ND | BLD_BG2_2ND | BLD_OBJ_2ND |
									 BLD_A_BLEND_MODE | BLD_BG0_1ST ;
				*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_OBJ_ON |
										DISP_BG0_ON | DISP_BG1_ON | DISP_BG2_ON ;
				sLocalSeq++;
			}
		}

		// 待ち状態のお姫さま
		Princess_Wait_Anime( time, &pPrincess );

		s11_bPriority = TRUE;	// お姫様のプライオリティを変更する

		// ワリオ放心状態
		scene10_cat_wario_Anime10( 0, &pWario );
	break;

	case S11_1:
		// αブレンド
		if (( time & 15 ) == 15 )
		{	if( uEVA < 10 )	uEVA++;
			if( uEVB > 10 )	uEVB--;
			*(vu16*)REG_BLDALPHA = ( uEVB << 8) | uEVA ;

			// 効果音=========================================
			if ( uEVA == 2 )
				m4aSongNumStartOrChange( S_BOSS_FLOWERNA_UP );
			// ===============================================

			if ( uEVA == 10 )
			{	uLocalTime = 0;
				sLocalSeq++;
			}
		}

		// 待ち状態のお姫さま
		Princess_Wait_Anime( time, &pPrincess );
		// ワリオ放心状態
		scene10_cat_wario_Anime10( 0, &pWario );
	break;

/*	case S11_2:
		// 光の移動
		if ( s11_light_y > 0 )
		{	s11_light_y -= 8;
			s11_light_x = s11_light_y*5/38 ; // 20/144

			// 効果音=========================================
			if ( s11_light_y == 160 -8 )
				m4aSongNumStartOrChange( S_BOSS_FLOWERNA_UP );
			// ===============================================
		}
		else
		{	s11_light_x = s11_light_y = 0;
			s11_bPriority = TRUE;	// お姫様のプライオリティを変更する
		}
		*(vu16*)REG_BG0HOFS = s11_light_x;
		*(vu16*)REG_BG0VOFS = s11_light_y;

		// 待ち状態のお姫さま
		Princess_Wait_Anime( time, &pPrincess );
		// ワリオ放心状態
		scene10_cat_wario_Anime10( 0, &pWario );

		if ( uLocalTime++ == 120 ) // ２秒待ち
		{	uLocalTime = 0;
			sLocalSeq++;
		}
	break;
*/
	case S11_3:

		// ワリオ放心状態
		scene10_cat_wario_Anime10( 0, &pWario );

		// お姫様の移動
		Princess_Wait_Anime( time, &pPrincess );
		scene11_princess_move( usEndingType, uLocalTime, &s11_princess_x, &s11_princess_y );

		if ( uLocalTime++ == 231 )
		{	uLocalTime2 = 0;
			sLocalSeq++;
		}
	break;

	case S11_4:

		// 天使たちの登場
		bAngelMove = TRUE;

		// お姫様の昇天
		if ( uLocalTime < 359 )
			Princess_Wait_Anime( time, &pPrincess ); // 待ち状態
		else
			Princess_Anime( uLocalTime, &pPrincess ); // 昇天

		if ( scene11_princess_move( usEndingType, uLocalTime, &s11_princess_x, &s11_princess_y ) )
		{	bAngelMove = FALSE;
			sLocalSeq++;
		}

		// ワリオ
		if ( uLocalTime < 480 )
			scene10_cat_wario_Anime10( uLocalTime, &pWario );
		else // 見上げる
			scene10_cat_wario_Anime16( uLocalTime -480, &pWario );


		uLocalTime++;
		uLocalTime2++;
	break;

	case S11_5:
		// αブレンド
		if (( time & 15 ) == 15 )
		{	if( uEVA > 0 )	uEVA--;
			if( uEVB < 16 )	uEVB++;
			*(vu16*)REG_BLDALPHA = ( uEVB << 8) | uEVA ;

			if ( uEVA == 0 )
			{	uLocalTime = 0;
				sLocalSeq++;
			}
		}

		// ワリオ　見上げている
		scene10_cat_wario_Anime15( 0, &pWario );
	break;

	case S11_6:
		// ワリオ　見上げている
		scene10_cat_wario_Anime15( 0, &pWario );

		if ( uLocalTime++ == 120 )
		{	uLocalTime = 0;
			sLocalSeq++;
		}
	break;

	case S11_7:
		// ワリオ
		if ( uLocalTime < 65 )
			scene10_cat_wario_Anime14( 0, &pWario ); // 放心状態
		else if ( uLocalTime < 120 )
		{	scene10_cat_wario_Anime11( uLocalTime -65 , &pWario ); // 復帰
			// 効果音============================================
			if ( uLocalTime == 65 )
				m4aSongNumStartOrChange( S_ENDING_WARIO_STAND );
			// ==================================================
		}
		else if ( uLocalTime < 312 )
			scene10_cat_wario_Anime12( uLocalTime -120, &pWario ); // 待機ポーズ
		else
		{
		/*	// 宝袋がない場合はワリオが左に走るシーケンスに移行
			if ( usTreasureCount == 0 )
			{	uLocalTime = 0;
				sLocalSeq = S11_102;
				break;
			}
		*/	
			// 効果音============================================
			if ( uLocalTime == 312 )
				m4aSongNumStartOrChange( S_ENDING_WARIO_TURN );
			// ==================================================

			if ( scene10_cat_wario_Anime13( uLocalTime -312, &pWario ) ) // 右に向く
			{	uLocalTime = 0;
				sLocalSeq++;
				break;
			}
		}

		uLocalTime++;
	break;

	case S11_100:

		if ( ob_pos_x < S10_TREASURE_X )
		{	// ワリオ　宝の方へ走る
			scene10_wario_run_Anime0( uLocalTime, &pWario );
			ob_pos_x += 2;
		}
		else
		{	int speed;

			// ワリオ　右向きで待機
			scene10_wario_run_Anime1( uLocalTime, &pWario );

			// 宝物を持ち上げる
			if (( time & s11_treasure_speed ) == s11_treasure_speed )
			{
				if ( s11_treasure_y > s11_treasure_yTop )
					s11_treasure_y--;
				else
				{	uLocalTime = 0;
					sLocalSeq++;
					break;
				}
			}
		}
		uLocalTime++;
	break;

	case S11_101:
		if ( usTreasureCount == 0 ) // 宝袋がない場合
		{	// ワリオ　きょろきょろする
			if ( scene10_wario_run_Anime3( uLocalTime, &pWario ) )
			{	uLocalTime = 0;
				sLocalSeq++;
				break;
			}
		}
		else
		{	// 担がれた宝袋の座標値をセット
			if ( uLocalTime == 0 )
			{	static u16 xpos[] = {	S10_TREASURE_X -16,
										S10_TREASURE_X -14,
										S10_TREASURE_X -10,
										S10_TREASURE_X -9
				};
				static u16 ypos[] = {	S10_TREASURE_Y0 -9,
										S10_TREASURE_Y1 -6,
										S10_TREASURE_Y2 -2,
										S10_TREASURE_Y3 +2
				};
				s11_treasure_x = xpos[usEndingType];
				s11_treasure_y = ypos[usEndingType];
			}

			// ワリオ　荷物を担ぐ
			scene10_wario_run2_Anime3( uLocalTime, &pTreasure ); // 宝袋
			if ( scene10_wario_run2_Anime2( uLocalTime, &pWario ) )
			{
				uLocalTime = 0;
				sLocalSeq++;
				break;
			}
		}
		uLocalTime++;
	break;

	case S11_102:
		// ワリオ　左側に走っていく
		if ( usTreasureCount > 0 )
		{	scene10_wario_run2_Anime0( uLocalTime, &pWario ); // 宝袋あり
			scene10_wario_run2_Anime1( uLocalTime, &pTreasure ); //	宝袋
		}
		else
			scene10_wario_run_Anime2( uLocalTime, &pWario ); // 宝袋なし

		ob_pos_x -= 2;
		s11_treasure_x -= 2;

		if ( ob_pos_x < -64 )
		{	SetBLDDownMin( S11_BLD_BG ); // black 0
			*(vu16 *)REG_DISPCNT = S11_DISP_MODE;
			uLocalTime = 0;
			sLocalSeq++;
		}
		
		uLocalTime++;
	break;

	case S11_103:
		if ( FadeInc(7) )	// normal -> black
			sGameSeq++;
	break;
	}

	//// ＯＢＪセット
	pObj = (u16 *)OamBuf;


	// 宝物
	if ( sLocalSeq <= S11_100 )
	{
		if ( usTreasureCount )
		{	scene10_etc_Anime4( uLocalTime, &pTreasure );
			pObj = SetObj( pTreasure, pObj, s11_treasure_x, s11_treasure_y );
			SetObjPABCD( 0, 0, sTreasureScale, sTreasureScale );
		}
	}

	// 光の粒の移動
	if ( uEVA > 7 )
	{	u16 *px = (u16 *)s11_stars_xa;
		u16 *py = (u16 *)s11_stars_ya;
		scene11_stars_move();

		if ( scene10_etc_Anime7( time, &p ) )
		{	*py = -( s11_RandomSeed * 109 + 1021 ) % 24;
			s11_RandomSeed = ( s11_RandomSeed * 109 + 1021 ) % 64;
			*px = ( s11_RandomSeed +24 ) * 0x100 ;
		}
		pObj = SetObj( p, pObj, *px++/0x100, *py++ );

		if ( scene10_etc_Anime7( time +9, &p ) )
		{	*py = -( s11_RandomSeed * 109 + 1021 ) % 24;
			s11_RandomSeed = ( s11_RandomSeed * 109 + 1021 ) % 64;
			*px = ( s11_RandomSeed +24 ) * 0x100 ;
		}
		pObj = SetObj( p, pObj, *px++/0x100, *py++ );
	
		if ( scene10_etc_Anime7( time +18, &p ) )
		{	*py = -( s11_RandomSeed * 109 + 1021 ) % 24;
			s11_RandomSeed = ( s11_RandomSeed * 109 + 1021 ) % 64;
			*px = ( s11_RandomSeed +24 ) * 0x100 ;
		}
		pObj = SetObj( p, pObj, *px++/0x100, *py++ );
	
		if ( scene10_etc_Anime7( time +27, &p ) )
		{	*py = -( s11_RandomSeed * 109 + 1021 ) % 24;
			s11_RandomSeed = ( s11_RandomSeed * 109 + 1021 ) % 64;
			*px = ( s11_RandomSeed +24 ) * 0x100 ;
		}
		pObj = SetObj( p, pObj, *px++/0x100, *py++ );
	
		if ( scene10_etc_Anime7( time +36, &p ) )
		{	*py = -( s11_RandomSeed * 109 + 1021 ) % 24;
			s11_RandomSeed = ( s11_RandomSeed * 109 + 1021 ) % 64;
			*px = ( s11_RandomSeed +24 ) * 0x100 ;
		}
		pObj = SetObj( p, pObj, *px++/0x100, *py++ );

		if ( scene10_etc_Anime7( time +45, &p ) )
		{	*py = -( s11_RandomSeed * 109 + 1021 ) % 24;
			s11_RandomSeed = ( s11_RandomSeed * 109 + 1021 ) % 64;
			*px = ( s11_RandomSeed +24 ) * 0x100 ;
		}
		pObj = SetObj( p, pObj, *px++/0x100, *py++ );

		if ( scene10_etc_Anime7( time +54, &p ) )
		{	*py = -( s11_RandomSeed * 109 + 1021 ) % 24;
			s11_RandomSeed = ( s11_RandomSeed * 109 + 1021 ) % 64;
			*px = ( s11_RandomSeed +24 ) * 0x100 ;
		}
		pObj = SetObj( p, pObj, *px++/0x100, *py++ );

		if ( scene10_etc_Anime7( time +63, &p ) )
		{	*py = -( s11_RandomSeed * 109 + 1021 ) % 24;
			s11_RandomSeed = ( s11_RandomSeed * 109 + 1021 ) % 64;
			*px = ( s11_RandomSeed +24 ) * 0x100 ;
		}
		pObj = SetObj( p, pObj, *px++/0x100, *py++ );
		
	}
/*	if (1)
	{	u16 *px = (u16 *)s11_stars_xa;
		u16 *py = (u16 *)s11_stars_ya;
		scene11_stars_move();
		scene10_etc_Anime7( time, &p );
		pObj = SetObj( p, pObj, *px++/0x100, *py++ );
		scene10_etc_Anime7( time+9, &p );
		pObj = SetObj( p, pObj, *px++/0x100, *py++ );
		scene10_etc_Anime7( time+18, &p );
		pObj = SetObj( p, pObj, *px++/0x100, *py++ );
		scene10_etc_Anime7( time+27, &p );
		pObj = SetObj( p, pObj, *px++/0x100, *py++ );
		scene10_etc_Anime7( time+36, &p );
		pObj = SetObj( p, pObj, *px++/0x100, *py++ );
		scene10_etc_Anime7( time+45, &p );
		pObj = SetObj( p, pObj, *px++/0x100, *py++ );
		scene10_etc_Anime7( time+54, &p );
		pObj = SetObj( p, pObj, *px++/0x100, *py++ );
		scene10_etc_Anime7( time+63, &p );
		pObj = SetObj( p, pObj, *px++/0x100, *py++ );
	}
*/
	// 天使
	if ( bAngelMove )
	{
		t = uLocalTime2 < 116 ? 0 : uLocalTime2 ;

		// 天使Ａ
		scene10_princess_Anime5( t, &pAngel );
		scene11_angel_A_move( uLocalTime2, &x, &y );
		pObj = SetObj( pAngel, pObj, x, y );

		// 天使Ｂ
		scene10_princess_Anime4( t +7, &pAngel );
		scene11_angel_B_move( uLocalTime2, &x, &y );
		pObj = SetObj( pAngel, pObj, x, y );

		// 天使Ｃ
		scene10_princess_Anime6( t, &pAngel );
		scene11_angel_C_move( uLocalTime2, &x, &y );
		pObj = SetObj( pAngel, pObj, x, y );

		// 天使Ｄ
		scene10_princess_Anime7( t +7, &pAngel );
		scene11_angel_D_move( uLocalTime2, &x, &y );
		pObj = SetObj( pAngel, pObj, x, y );

		// 天使のキラキラ
		if ( t > (116 + 100) )
		{	t -= (116 + 100);
			scene10_etc_Anime6( t, &pAngel );
			scene11_kira_A1_move( t, &x, &y );
			pObj = SetObj( pAngel, pObj, x, y );
			S11_PrincessPriorityChange( pAngel, pObj );

			scene10_etc_Anime6( t, &pAngel );
			scene11_kira_A2_move( t, &x, &y );
			pObj = SetObj( pAngel, pObj, x, y );
			S11_PrincessPriorityChange( pAngel, pObj );
			
			scene10_etc_Anime6( t, &pAngel );
			scene11_kira_B1_move( t, &x, &y );
			pObj = SetObj( pAngel, pObj, x, y );
			S11_PrincessPriorityChange( pAngel, pObj );

			scene10_etc_Anime6( t, &pAngel );
			scene11_kira_B2_move( t, &x, &y );
			pObj = SetObj( pAngel, pObj, x, y );
			S11_PrincessPriorityChange( pAngel, pObj );
	
			scene10_etc_Anime6( t, &pAngel );
			scene11_kira_C1_move( t, &x, &y );
			pObj = SetObj( pAngel, pObj, x, y );
			S11_PrincessPriorityChange( pAngel, pObj );

			scene10_etc_Anime6( t, &pAngel );
			scene11_kira_C2_move( t, &x, &y );
			pObj = SetObj( pAngel, pObj, x, y );
			S11_PrincessPriorityChange( pAngel, pObj );

			scene10_etc_Anime6( t, &pAngel );
			scene11_kira_D1_move( t, &x, &y );
			pObj = SetObj( pAngel, pObj, x, y );
			S11_PrincessPriorityChange( pAngel, pObj );

			scene10_etc_Anime6( t, &pAngel );
			scene11_kira_D2_move( t, &x, &y );
			pObj = SetObj( pAngel, pObj, x, y );
			S11_PrincessPriorityChange( pAngel, pObj );
		}
	}

	// お姫様
	pObj = SetObj( pPrincess, pObj, s11_princess_x, s11_princess_y );
	if ( s11_bPriority )
		S11_PrincessPriorityChange( pPrincess, pObj );

	// ワリオ
	pObj = SetObj( pWario, pObj, ob_pos_x, ob_pos_y );

	// 宝物
	if ( sLocalSeq > S11_100 )
	{
		if ( usTreasureCount )
		{	pObj = SetObj( pTreasure, pObj, s11_treasure_x, s11_treasure_y );
			SetObjPABCD( 0, 0, sTreasureScale, sTreasureScale );
		}
	}

	EndObj( pObj );

}
#undef	BG0_TOP
#undef	BG1_TOP
#undef	BG2_TOP


//--------------------------------------------------------------
//// 超ハードメッセージ表示
//--------------------------------------------------------------

//	ucEndingMessageKind	"g_select.h"

static void Super_Hard_Init( void )
{
#define	BG0_TOP		0x8000	// 256x256
#define	BG1_TOP		0x8800	// 256x256
#define	BG2_TOP		0x9000	// 256x256
#define	SHARD_BLD_BG	( BLD_BD | BLD_OBJ | BLD_BG0 | BLD_BG1 | BLD_BG2 )

	u16 *p;

	DmaClear(3, 0x03ff03ff, (u32 *)((u8 *)BG_VRAM + BG0_TOP), 0x800*3, 32);	// BG(256x256) ４枚分 

	//パレット
	DmaCopy(3, super_hard_Palette, (u16 *)BG_PLTT, sizeof(super_hard_Palette), 16);
	DmaCopy(3, newspaper_END_obj_Palette, (u16 *)OBJ_PLTT, sizeof(newspaper_END_obj_Palette), 16);

	//キャラクタ
	LZ77UnCompVram( (u8 *)super_hard_Char, (u16 *)BG_VRAM );
	LZ77UnCompVram( (u8 *)newspaper_END_obj_Char, (u16 *)OBJ_MODE0_VRAM );

	//スクリーン
	UnPackScreen( (u16 *)super_hard_bg, (u16 *)((u8 *)BG_VRAM + BG2_TOP) );

	// NORMAL_MESSAGEは「ボスが復活した。12コゲットしよう」
	if ( ucEndingMessageKind == NORMAL_MESSAGE )
	{	UnPackScreen( (u16 *)super_hard_board, (u16 *)((u8 *)BG_VRAM + BG1_TOP) );
		p = bMsgJapanese ? (u16 *)super_hard_J : (u16 *)super_hard_E ;
	}
	// ALL_GET_MESSAGEは「ボスが復活した。」だけ
	else if ( ucEndingMessageKind == ALL_GET_MESSAGE )
	{	UnPackScreen( (u16 *)super_hard_board_00, (u16 *)((u8 *)BG_VRAM + BG1_TOP) );
		p = bMsgJapanese ? (u16 *)super_hard_J00 : (u16 *)super_hard_E00 ;
	}
	// SHARD_MESSAGEは「げきむずが遊べるようになった。」
	else //if ( ucEndingMessageKind == SHARD_MESSAGE )
	{	p = bMsgJapanese ? (u16 *)super_hard_board_J12 : (u16 *)super_hard_board_E12 ;
		UnPackScreen( p, (u16 *)((u8 *)BG_VRAM + BG1_TOP) );
		p = bMsgJapanese ? (u16 *)super_hard_J12 : (u16 *)super_hard_E12 ;
	}
	UnPackScreen( p, (u16 *)((u8 *)BG_VRAM + BG0_TOP) );

	//ＢＧ０〜２をセット
	*(vu16*)REG_BG0CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_0
		| ((BG0_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG1CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_1
		| ((BG1_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);
	*(vu16*)REG_BG2CNT = BG_COLOR_16 | BG_SCREEN_SIZE_0 | BG_PRIORITY_2
		| ((BG2_TOP/0x800) << BG_SCREEN_BASE_SHIFT) | (0 << BG_CHAR_BASE_SHIFT);

	sH_bDone = FALSE;

	V_Wait();

	SetBLDDownMax( SHARD_BLD_BG );	// black 16

	*(vu16 *)REG_DISPCNT = DISP_MODE_0 | DISP_OBJ_ON |
							DISP_BG0_ON | DISP_BG1_ON | DISP_BG2_ON ;
}

static void Super_Hard_Exec( int time )
{
	u16 *pPushStart;

	switch ( sLocalSeq )
	{
	case SH_0:
		if ( FadeDec(3) )	// black -> normal
			sLocalSeq++;
	break;

	case SH_1:
		if ( usTrg & ( A_BUTTON | START_BUTTON ) )
		{	// 効果音
			m4aSongNumStartOrChange( S_BUTTON_A1 );
			uLocalTime = 0;
			sLocalSeq++;
		}
	break;

	case SH_2:
		if ( sH_bDone == TRUE );
			sLocalSeq++;
	break;

	case SH_3:
		if ( FadeInc(3) ) // normal -> black
		{	// 音量を上げる
			m4aMPlayVolumeControl( &m4a_mplay000, M4A_TRACK_FULL, M4A_VOLUME_MAX );
			sGameSeq++;
		}
	break;
	}


	//// ＯＢＪのセット

	// PUSH START
	if ( sLocalSeq < SH_2 )
	{	if ( ucPerfect == PERFECT_YES )
			newspaper_END_push_start_Anime2( uLocalTime, &pPushStart ); // 王冠カーソル（選択時）
		else
			newspaper_END_push_start_Anime0( uLocalTime, &pPushStart ); // 手カーソル（選択時）
	}
	else
	{	if ( ucPerfect == PERFECT_YES )
			sH_bDone = newspaper_END_push_start_Anime3( uLocalTime, &pPushStart ); // 王冠カーソル（決定時）
		else
			sH_bDone = newspaper_END_push_start_Anime1( uLocalTime, &pPushStart ); // 手カーソル（決定時）
	}

	EndObj( SetObj( pPushStart, (u16 *)OamBuf, LCD_CENTER_X -12, 160 ) );

	uLocalTime++;
}
#undef	BG0_TOP
#undef	BG1_TOP
#undef	BG2_TOP



//--------------------------------------------------------------
//// エンディングの種類、宝物の個数を得る
//--------------------------------------------------------------
static void GetEndingType( void )
{
	int i = 0;

	// 宝物の個数を得る
	if ( ucKakera1GetFlg )	i++;	// "g_tmsc.h"
	if ( ucKakera2GetFlg )	i++;
	if ( ucKakera3GetFlg )	i++;
	if ( ucKakera4GetFlg )	i++;
	if ( ucKakera5GetFlg )	i++;
	if ( ucKakera6GetFlg )	i++;
	if ( ucKakera7GetFlg )	i++;
	if ( ucKakera8GetFlg )	i++;
	if ( ucKakera9GetFlg )	i++;
	if ( ucKakera10GetFlg )	i++;
	if ( ucKakera11GetFlg )	i++;
	if ( ucKakera12GetFlg )	i++;

	usTreasureCount = i;	// 宝物個数　０〜１２

	// エンディングタイプ（４種類）
	if ( i < 2 )
	{	usEndingType = 0;		// タイプ
		sTreasureScale = 0xA0;	// 宝物の表示拡大率	0.625
	}
	else if ( i < 6 )
	{	usEndingType = 1;
		sTreasureScale = 0xE0;	// 0.875
	}
	else if ( i < 12 )
	{	usEndingType = 2;
		sTreasureScale = 0x120;	// 1.125
	}
	else /* i == 12 */
	{	usEndingType = 3;
		sTreasureScale = 0x180;	// 1.5
	}
}

//**************************************************************
// 回転拡大縮小パラメータを計算する（ＢＧ用）
//**************************************************************
static u16 * bg_pabcd_calc( u16 *buf, int rotate, int scale_x, int scale_y, int p0x, int p0y )
{
	s16	pa, pb, pc, pd;
	s32 x, y, tmp;

	rotate &= 0xff;	// 一周２５６等分

	// 回転拡大縮小係数を計算する
    pa = FixMul( _Cos( rotate ), FixInverse( scale_x )); //pa= cosθ*(1/α)
    pb = FixMul( _Sin( rotate ), FixInverse( scale_x )); //pb= sinθ*(1/α)
    pc = FixMul(-_Sin( rotate ), FixInverse( scale_y )); //pc=-sinθ*(1/β)
    pd = FixMul( _Cos( rotate ), FixInverse( scale_y )); //pd= cosθ*(1/β)

	// 参照開始点を計算する　回転の中心座標が(p0x, p0y)
	x = (s32)( p0x << 8 ) - pa * p0x - pb * p0y;
	y = (s32)( p0y << 8 ) - pc * p0x - pd * p0y;

	// ＸＹスクロール
	tmp = (s32)bg_offset_x;
	x += ( tmp << 8 );
	tmp = (s32)bg_offset_y;
	y += ( tmp << 8 );
//	x += ( ((s32)LCD_CENTER_X - p0x ) << 8 );	// 画面の中心を回転の中心とする 
//	y += ( ((s32)LCD_CENTER_Y - p0y ) << 8 );

	*buf++ = pa;
	*buf++ = pb;
	*buf++ = pc;
	*buf++ = pd;
	*buf++ = x & 0xffff; // L
	*buf++ = (x >> 16);  // H
	*buf++ = y & 0xffff; // L
	*buf++ = (y >> 16);  // H

	return buf;
}

//**************************************************************
// 回転拡大縮小パラメータを計算する（ＯＢＪ用）
//**************************************************************
static void SetObjPABCD(int index, int rotate, int scale_x, int scale_y)
{
	u16 *pa = (u16 *)OamBuf + 16 * index + 3;

	rotate &= 0xff;	// 一周２５６等分

    *pa	= FixMul( _Cos( rotate ), FixInverse( scale_x )); //pa= cosθ*(1/α)
	pa += 4;
	*pa	= FixMul( _Sin( rotate ), FixInverse( scale_x )); //pb= sinθ*(1/α)
	pa += 4;
    *pa = FixMul(-_Sin( rotate ), FixInverse( scale_y )); //pc=-sinθ*(1/β)
	pa += 4;
    *pa = FixMul( _Cos( rotate ), FixInverse( scale_y )); //pd= cosθ*(1/β)

	if ( ++pa > pObjEnd )
		pObjEnd = pa;
}

//**************************************************************
//	キー入力によりＯＢＪをコントロールする
//**************************************************************
#if TITLE_DEBUG_MODE
static void debug_ob_param_control( void )
{
	// ＡＢボタンで初期化
	if ((usCont & (A_BUTTON|B_BUTTON)) == (A_BUTTON|B_BUTTON))
	{
		ob_param_init();
		return;
	}

	// Ｂボタン ＋ 十字キーで拡大縮小、ＬＲボタンで回転
	if (usCont & B_BUTTON)
	{
		if (usCont & U_KEY)		if ((ob_scale_y += 0x10) > 0x400) ob_scale_y = 0x400;
		if (usCont & D_KEY)		if ((ob_scale_y -= 0x08) < 0x40 ) ob_scale_y = 0x40;
		if (usCont & L_KEY)		if ((ob_scale_x -= 0x08) < 0x40 ) ob_scale_x = 0x40;
		if (usCont & R_KEY)		if ((ob_scale_x += 0x10) > 0x400) ob_scale_x = 0x400;
		if (usCont & R_BUTTON)	ob_rotate++;
		if (usCont & L_BUTTON)	ob_rotate--;
	}
	else
	{	//  十字ボタンで移動
		if (usCont & U_KEY)	ob_pos_y--;
		if (usCont & D_KEY) ob_pos_y++;
		if (usCont & R_KEY)	ob_pos_x++;
		if (usCont & L_KEY)	ob_pos_x--;

		// ＬＲボタンでパレットチェンジ
		if (usCont & R_BUTTON) if(ob_palette > SCENE4_CAR_MIN_PALETTE) ob_palette--;
		if (usCont & L_BUTTON) if(ob_palette < SCENE4_CAR_MAX_PALETTE) ob_palette++;

		// Ａボタンで２倍角の ON,OFF
		if (usTrg & A_BUTTON)	ob_affine ^= 1;
	}
}

//**************************************************************
// キー入力により角度、縮小率を変化させる
//**************************************************************
static void debug_bg_param_control( void )
{
	//  ＡＢボタンで初期化
	if ((usCont & (A_BUTTON|B_BUTTON)) == (A_BUTTON|B_BUTTON))
	{
		bg_param_init();
		return;
	}

	//	Ｂボタン ＋ 十字キーで拡大縮小
	if (usCont & B_BUTTON)
	{
		if (usCont & U_KEY)	bg_scale_y += 0x10;
		if (usCont & D_KEY) bg_scale_y -= 0x08;
		if (usCont & L_KEY) bg_scale_x -= 0x08;
		if (usCont & R_KEY) bg_scale_x += 0x10;
	}
	//	Ａボタン ＋ 十字キーで拡大縮小
	else if (usCont & A_BUTTON)
	{
		if (usCont & (U_KEY|R_KEY)){ bg_scale_x += 0x10;	bg_scale_y += 0x10; }
		if (usCont & (D_KEY|L_KEY)){ bg_scale_x -= 0x08;	bg_scale_y -= 0x08; }
	}
	else
	{	//  十字キーで中心を移動
		if (usCont & U_KEY)	bg_pos_y++;
		if (usCont & D_KEY)	bg_pos_y--;
		if (usCont & L_KEY)	bg_pos_x--;
		if (usCont & R_KEY)	bg_pos_x++;
	}

	// ＬＲボタンで回転
	if (usCont & R_BUTTON)	bg_rotate++;
	if (usCont & L_BUTTON)	bg_rotate--;


	// 数値範囲制限
	if (usCont & (A_BUTTON|B_BUTTON) &&	usCont & (U_KEY|D_KEY|L_KEY|R_KEY))
	{
		if		(bg_scale_x < 0x40)		bg_scale_x = 0x40;
		else if (bg_scale_x > 0x400)	bg_scale_x = 0x400;
		if		(bg_scale_y < 0x40)		bg_scale_y = 0x40;
		else if (bg_scale_y > 0x400)	bg_scale_y = 0x400;
	}
}

//******************************************************************
// キー入力によりブレンド係数(EVA,EVB) か 輝度変更係数(EVY)を変化させる
//******************************************************************
static void debug_EVABY_control( void )
{
	if ( usCont & B_BUTTON )
	{
		// 輝度変更係数(EVY)を変更
		if ( usTrg & (L_BUTTON | R_BUTTON) )
		{
			if ( usTrg & L_BUTTON )	{ if( uEVY > 0 )  uEVY--; }
			else					{ if( uEVY < 16 ) uEVY++; }

			*(vu16*)REG_BLDY = uEVY;	//係数 EVY
		}
	}
	else
	{	// αブレンド係数(EVA,EVB)を変更
		if ( usTrg & (L_BUTTON | R_BUTTON) )
		{
			if ( usTrg & L_BUTTON )
			{
				if( uEVA > 0 )	uEVA--;
				if( uEVB < 16 )	uEVB++;
			}
			else
			{
				if( uEVA < 16 )	uEVA++;
				if( uEVB > 0 )	uEVB--;
			}

			*(vu16*)REG_BLDALPHA = (uEVB << 8) | uEVA;
		}
	}
}

//**************************************************************
// キー入力によりＢＧをスクロールさせる
//**************************************************************
static void debug_bg_scroll( int bg )
{
	vu16 *pH, *pV;

	switch ( bg & 3 )
	{
	case 0:	pH = (vu16 *)REG_BG0HOFS;	pV = (vu16 *)REG_BG0VOFS;	break;
	case 1:	pH = (vu16 *)REG_BG1HOFS;	pV = (vu16 *)REG_BG1VOFS;	break;
	case 2:	pH = (vu16 *)REG_BG2HOFS;	pV = (vu16 *)REG_BG2VOFS;	break;
	case 3:	pH = (vu16 *)REG_BG3HOFS;	pV = (vu16 *)REG_BG3VOFS;	break;
	}

	if ( usCont & B_BUTTON )
	{
		if ( usCont & L_KEY )	*pH = --bg_scroll_x;
		if ( usCont & R_KEY )	*pH = ++bg_scroll_x;
		if ( usCont & U_KEY )	*pV = --bg_scroll_y;
		if ( usCont & D_KEY )	*pV = ++bg_scroll_y;
	}
}

//**************************************************************
// キー入力によりシーンを変える
//**************************************************************
static void debug_scene_control( void )
{
	switch ( usTrg )
	{
	case D_KEY:
		if ( sGameSeq < TL_SEQ_MAX )	sGameSeq++;
		usFadeTimer = 0;
	break;
	case U_KEY:
		if ( sGameSeq >= 3 )	sGameSeq -= 3;
		else					sGameSeq = 0;
		usFadeTimer = 0;
	break;
	case R_KEY:
		sGameSeq = 0;
	break;
	}
}
#endif



//***************************************************************
//***************************************************************
//***************************************************************
//***************************************************************
//***************************************************************
//***************************************************************

//***************************************************************
//
//		ヘルパー関数
//
//***************************************************************

// Ｖブランク待ち
static void V_Wait(void)
{
	usIntrCheck &= V_BLANK_INTR_FLAG ^ 0xffff;	// Clear V-INT Check Flag

	while(1)
	{
		Halt();	//CPU停止
		if(usIntrCheck & V_BLANK_INTR_FLAG)	break;	//VBLK終了
	}
}

// u16矩形データをコピーする
static void BlockCopy( u16 *src, u16 *dst, u16 srcWidth, u16 srcHeight, u16 dstWidth )
{
	int w, h;
	u16 *d;

	for (h = srcHeight ; h ; h--)
	{
		d = dst;

		for (w = srcWidth ; w ; w--)
			*d++ = *src++;

		dst += dstWidth;
	}
}

// ＯＢＪをセットする
static u16* SetObj( u16 *src, u16 *dst, int x, int y )
{
	if ( src )
	{
		u16 size = *src++;

		while ( size-- )
		{
			*dst++ = ( *src & 0xff00 ) | (( *src + y ) & 0xff );
			src++;
			*dst++ = ( *src & 0xfe00 ) | (( *src + x ) & 0x1ff );
			src++;
			*dst++ = *src++;
			dst++;
		}

		if ( dst > pObjEnd ) pObjEnd = dst;
	}

	return	dst;
}

// ＯＢＪ終端までにあるゴミＯＢＪを画面外に出す
static void EndObj( u16 *dst )
{
	while ( dst < (u16 *)pObjEnd )
	{
		*dst++ = 208;	// Ypos = 208
		*dst++ = 0;		// Xpos = 0  8x8 size
		dst += 2;
	}

	uObjSize = (u32)pObjEnd - (u32)OamBuf ;
}

//**************************************************************
// ＢＧ表示レジスタを初期化する
//**************************************************************
static void bg_regs_init(void)
{
    *(vu16 *)REG_BG0HOFS = 0;
    *(vu16 *)REG_BG0VOFS = 0;
    *(vu16 *)REG_BG1HOFS = 0;
    *(vu16 *)REG_BG1VOFS = 0;
    *(vu16 *)REG_BG2HOFS = 0;
    *(vu16 *)REG_BG2VOFS = 0;
    *(vu16 *)REG_BG3HOFS = 0;
    *(vu16 *)REG_BG3VOFS = 0;

    *(vs16 *)REG_BG2PA = 0x100;
    *(vs16 *)REG_BG2PB = 0;
    *(vs16 *)REG_BG2PC = 0;
    *(vs16 *)REG_BG2PD = 0x100;
    *(vu16 *)REG_BG2X_L = 0;
    *(vu16 *)REG_BG2X_H = 0;
    *(vu16 *)REG_BG2Y_L = 0;
    *(vu16 *)REG_BG2Y_H = 0;

    *(vs16 *)REG_BG3PA = 0x100;
    *(vs16 *)REG_BG3PB = 0;
    *(vs16 *)REG_BG3PC = 0;
    *(vs16 *)REG_BG3PD = 0x100;
    *(vu16 *)REG_BG3X_L = 0;
    *(vu16 *)REG_BG3X_H = 0;
    *(vu16 *)REG_BG3Y_L = 0;
    *(vu16 *)REG_BG3Y_H = 0;

    *(vu16 *)REG_MOSAIC = 0;
//  *(vu16 *)REG_BLDCNT    = 0x0000;
//  *(vu16 *)REG_BLDALPHA  = 0x0000; //0x000f;

}


//**************************************************************
//// 圧縮スクリーンデータの展開
//**************************************************************
static void UnPackScreen( u16 *src, u16 *dst )
{
	u16 *d;
	u16 offset;
	u16 size, data;

	while ( *src )
	{
		offset = (*src >> 5 ) & 0x3ff;	// <d14-5> (u16*)アドレスオフセット（０〜３ＦＦ）
		size = (*src & 31) + 1;		// <d4-0>	 データ個数（0-31 → １〜３２個）
		d = dst + offset;

		if (*src++ & 0x8000) // <d15>==1 の場合はデータ値を個数分展開する
		{	data = *src++;
			while ( size-- )
				*d++ = data;
		}
		else // <d15>==0 の場合はデータ値をインクリメントしながら個数分展開する
		{	data = *src++;
			while ( size-- )
				*d++ = data++;
		}
	}
}


//**************************************************************
//// フェードイン・フェードアウト
//**************************************************************
static void SetBLDDownMin( u16 bg )
{
	uEVY = 0;
	*(vu16*)REG_BLDY = 0;
	*(vu16*)REG_BLDCNT = ( BLD_DOWN_MODE | bg );
}
static void SetBLDDownMax( u16 bg )
{
	uEVY = 16;
	*(vu16*)REG_BLDY = 16;
	*(vu16*)REG_BLDCNT = ( BLD_DOWN_MODE | bg );
}
static void SetBLDUpMin( u16 bg )
{
	uEVY = 0;
	*(vu16*)REG_BLDY = 0;
	*(vu16*)REG_BLDCNT = ( BLD_UP_MODE | bg );
}
static void SetBLDUpMax( u16 bg )
{
	uEVY = 16;
	*(vu16*)REG_BLDY = 16;
	*(vu16*)REG_BLDCNT = ( BLD_UP_MODE | bg );
}
static BOOL FadeInc( u16 interval )
{
	if (( usFadeTimer & interval ) == interval )
	{
		if ( uEVY < 16 )
			++uEVY;

		*(vu16*)REG_BLDY = uEVY;
	}

	return uEVY == 16 ? TRUE : FALSE ;
}
static BOOL FadeDec( u16 interval )
{
	if (( usFadeTimer & interval ) == interval )
	{
		if ( uEVY > 0 )
			--uEVY;

		*(vu16*)REG_BLDY = uEVY;
	}

	return uEVY == 0 ? TRUE : FALSE ;
}

//**************************************************************
//end


