//##############################################################
//
//				基本定義
//
//##############################################################
#ifndef	GLOBAL_H_INCLUDED
#define	GLOBAL_H_INCLUDED

#ifdef	GLOBAL_VALUE_DEFINE		//定義と外部宣言を使い分けて
#define	GLOBAL					//複数のファイルへのincludeを可能にする
#else
#define	GLOBAL	extern
#endif							//end

#include	"g_select.h"
#include	"g_gmap.h"
#include	"g_enemy.h"
#include	"g_tmsc.h"
#include	"g_sound.h"
#include	"g_pause.h"
#include	"g_shop.h"


//**************************************************************
//
//**************************************************************
GLOBAL	void	ResetKey(void);
GLOBAL	void	SoundFadeOut(void);


//**************************************************************
//
//**************************************************************
GLOBAL	s16		sMainSeq, sGameSeq;
GLOBAL	s8		cNextFlg, cGmStartFlg, cVblkFlg;
GLOBAL	u8		ucMainTimer;

GLOBAL	vu16	usIntrCheck;				//割り込み チェック
GLOBAL	u32		IntrMainBuf[0x200];			//割り込みメインルーチン用バッファ

GLOBAL	OamData	OamBuf[128];				//OAM バッファ
GLOBAL	u16		usCont, usCont2, usTrg;		//キー入力
GLOBAL	u8		ucCntObj;					//OBJのトータル数のカウンタ
GLOBAL	u16		usObjScaleX, usObjScaleY;	//OBJ拡大率
GLOBAL	u16		usObjRotate;				//回転

GLOBAL	s16		sBgPosX, sBgPosY;			//スクリーンの中心座標
GLOBAL	s32		iBgStartX, iBgStartY;		//参照開始点
GLOBAL	u16		usBgMosaic;
GLOBAL	u16		usBgScaleX, usBgScaleY;		//拡大率
GLOBAL	u16		usBgRotate;					//256で１回転
GLOBAL	s16		sBgPa, sBgPb, sBgPc, sBgPd;	//拡大縮小回転
GLOBAL	u16		usBgEvy, usBgEva, usBgEvb;
GLOBAL	u16		usBg0Hofs, usBg0Vofs;
GLOBAL	u16		usBg1Hofs, usBg1Vofs;
GLOBAL	u16		usBg2Hofs, usBg2Vofs;
GLOBAL	u16		usBg3Hofs, usBg3Vofs;
GLOBAL	u16		usBg0PosX, usBg0PosY;
GLOBAL	u8		ucAffObj;
GLOBAL	u8		cBgMode, cBgPage;

GLOBAL	u16		usFadeTimer;
GLOBAL	u16		usGatePosX, usGatePosY;
GLOBAL	u8		ucDemoSwitch;



//##############################################################
//
//				香月
//
//##############################################################
//**************************************************************
//
//			ワリオ定義
//
//**************************************************************
#define WR_LIFE_INI		4		//ハート初期値（ノーマル）
#define WR_LIFE_INI2	4		//ハート初期値（ハード）
#define WR_LIFE_MAX		8		//ハート
#define WR_LIFE2_MAX	8		//ニンニク
#define	WLIFT_LAST		12		//敵持ち上げ最終状態
#define	WMISS_TIME		0x60	//ミス状態の時間
#define	WHEART_TIME		0x0a	//ハート回復時間
#define	WJISIN_POW1		0x30	//ヒップアタック時間
#define	WJISIN_POW2		0x40	//パワーヒップ時間

#define	ANY_KEY			(A_BUTTON|B_BUTTON|R_KEY|L_KEY|U_KEY|D_KEY)
#define	DS_BUTTON		(R_BUTTON|L_BUTTON)


//==============================================================
//
//==============================================================
enum GM_SEQ
{
	GM_INIT,				//初期設定
	GM_FADE_IN,				//フェードイン
	GM_MAIN,				//ゲームメイン
	GM_FADE_OUT,			//フェードアウト
	GM_GATE,				//ゲート越え中
	GM_BG_SCROLL,			//ＢＧ強制スクロール
	GM_STAGE_END,			//ステージエンド
	GM_BPAUSE,				//ボス面専用ポーズ
	GM_DEBUGG,				//デバッグモード
};

enum WAR_PARA
{
	R_MUKI = R_KEY,
	L_MUKI = L_KEY,
	U_MUKI = U_KEY,
	D_MUKI = D_KEY,
	RL_MUKI = (R_KEY|L_KEY),
	UD_MUKI = (U_KEY|D_KEY),
	ALL_MUKI = (R_KEY|L_KEY|U_KEY|D_KEY),
};

enum WAR_SPEED
{
//共通
	MV_SHIFT = 3,
	G_ACCY = 8,				//重力

	DWN_SPEEDX = 40,
	JB_SPEEDY = 128,
	HP_SPEEDY = 48,
	FZ_SPEEDY = 120,

	STR_SPEEDX = 20,
	STR_ACCX = 1,
	STR_BRKX = 2,

//ノーマル
	WK_SPEEDX = 64,			//横移動スピード
	DS_SPEEDX = 128,		//ダッシュ
	AT_SPEEDX = 96,			//アタック
	SWK_SPEEDX = 32,		//しゃがみ
	AF_SPEEDX = 32,			//アタック跳ね返り
	FP_SPEEDX = 32,			//跳ね返り
	LF_SPEEDX = 40,			//重い物持ち歩き
	DBK_SPEEDX = 48,

	JP_SPEEDY = 176,		//ジャンプ
	SJ_SPEEDY = 128,		//しゃがみジャンプ
	AF_SPEEDY = 80,			//アタック跳ね返り
	AFS_SPEEDY = 48,		//アタック跳ね返り(小）
	FP_SPEEDY = 96,			//転がり跳ね返り
	MS_SPEEDY = 64,			//ミス
	HJ_SPEEDY = 64,			//敵はじき
	DK_SPEEDY = 32,			//土管

	WK_ACCX = 6,
	DS_ACCX = 2,
	AT_ACCX = 4,
	SS_ACCX = 2,
	JP_ACCX = 10,
	WK_BRKX = 32,
	DS_BRKX = 3,

	LDM_DX = 4,				//Ｘ方向補正
	LDM_DY = 4,				//Ｙ方向補正
	AT_TIME = 46,

//泳ぎ
	SWH_SPEEDX = 128,
	SWL_SPEEDX = 32,
	SWF_SPEEDX = 36,
	SWP_SPEEDX = 16,

	SWC_SPEEDY = 108,
	SWH_SPEEDY = 128,
	SWL_SPEEDY = 32,
	SWF_SPEEDY = 36,
	SWJ_SPEEDY = 128,		//水から飛び出し

	SW_BRKX = 4,
	SW_BRKY = 4,
	SWF_BRKX = 2,
	SWF_BRKY = 2,

	WTL_SPEED = 32,			//水流（遅い）
	WTH_SPEED = 96,			//水流（早い）
	SW3_DY = 16,			//立ち泳ぎ補正
	SWMS_TIME = 0x50,		//水中ダメージ時間

//炎
	FR_SPEEDX = 96,
	FRM_SPEEDX = 32,
	FRS_SPEEDX = 16,
	FRJ_SPEEDY = 168,
	FR_TIME = 180,

//デブ
	DB_SPEEDX = 32,
	DBJ_SPEEDY = 108,
	DEBU_CT = 8,
	DEBU_TIME = 360,

//氷
	IC_SPEEDX = 96,

//ゾンビ
	ZB_SPEEDX = 24,
	ZBJ_SPEEDY = 108,

//雪だるま
	SNW_SPEEDX = 32,		//横移動スピード
	SNR1_SPEEDX = 64,
	SNR2_SPEEDX = 96,
	SNR3_SPEEDX = 128,
	SNJ_SPEEDY = 96,		//ジャンプスピード
	SNW_TIME = 0x30,

//ばね
	BN_SPEEDX = 32,			//横移動スピード
	BNJ_SPEEDY = 128,		//ジャンプスピード

//風船
	BLN_SPEEDX = 32,		//横移動スピード
	BLN_SPEEDY = 24,		//上昇スピード
	BLJ_SPEEDY = 108,		//加速スピード
	BLN_DY = 0x08,			//Ｙ補正地

//吸血鬼
	VP_SPEEDX = 64,			//横移動スピード
	VPJ_SPEEDY = 128,		//ジャンプスピード

//こうもり
	BT_SPEEDX = 32,			//横移動スピード
	BT_SPEEDY = 32,			//上昇スピード
	BTJ_SPEEDY = 128,		//ジャンプスピード
	BT_JTIME = 12,

//つぶれ
	TB_SPEEDX = 32,
	TBJ_SPEEDY = 138,
};


//==============================================================
//
//==============================================================
enum WAR_REACT
{
	W_NORMAL,
	W_SWIM,
	W_FIRE,
	W_DEBU,
	W_ICE,
	W_ZOMBI,
	W_SNOW,
	W_BANE,
	W_BALLN,
	W_BAT,
	W_TUBURE,
	W_MASK,

//	W_VAMP,
};

enum WAR_REACT_SOUND
{
	SOUND_NML0,
	SOUND_NML1,
	SOUND_NML2,
	SOUND_NML3,
	SOUND_SWIM0,
	SOUND_SWIM1,
	SOUND_FIRE,
	SOUND_DEBU,
	SOUND_ICE,
	SOUND_ZOMBI,
	SOUND_SNOW,
	SOUND_BANE,
	SOUND_BALLN,
	SOUND_BAT,
	SOUND_TUBURE,
	SOUND_MASK,

//	SOUND_VAMP,
};

enum WAR_PLACE
{
	WP_GROUND,
	WP_OBJ,
	WP_SKY,
	WP_WATER,
	WP_SAND,
};

enum WAR_STAT_OTHER
{
	WAR_PAT = 79,			//ノーマル時状態数
	WAR_PAT2 = 16,			//水中
	WAR_PAT3 = 10,			//燃え
	WAR_PAT4 = 11,			//デブ
	WAR_PAT5 = 4,			//氷
	WAR_PAT6 = 13,			//ゾンビ
	WAR_PAT7 = 16,			//雪だるま
	WAR_PAT8 = 10,			//バネ
	WAR_PAT9 = 4,			//風船
	WAR_PAT10 = 5,			//こうもり
	WAR_PAT11 = 7,			//つぶれ
	WAR_PAT12 = 2,			//お面

//	WAR_PAT20 = 8,			//吸血鬼

	NON = 0xff,
	FLYING = 0xfe,
	LANDING = 0xfd,
	WALL = 0xfc,
};

enum WAR_STAT_NORMAL
{
	WALK,					//歩き
	TURN,					//振り返り
	STOP,					//止まり
	JUMPB,					//ジャンプ前
	JUMP,					//ジャンプ
	SQUAT,					//しゃがみ
	SSLIP,					//しゃがみすべり
	SWALK,					//しゃがみ歩き
	SJUMP,					//しゃがみジャンプ
	STURN,					//しゃがみ振り返り
	WKBRK,					//歩き止まり
	DSBRK,					//最速走り止まり
	SLIP,					//すべり始め（坂）
	ROLLB,					//転がり前
	ROLL,					//転がり
	RJUMP,					//転がりジャンプ
	RFLIP,					//転がり後の跳ね返り
	DOKANU,					//土管上
	DOKAND,					//土管下
	MISS,					//ダメージ
	MISS2,
	HAJIK,					//敵はじく
	ATTACK,					//アタック
	DATTACK,				//最速アタック
	AJUMP,					//アタックジャンプ
	DAJUMP,					//最速アタックジャンプ
	AFLIP,					//アタック後の跳ね返り
	HIP,					//ヒップアタック（空中）
	PHIP,					//パワーヒップアタック
	HIP2,					//ヒップアタック（地面）
	PHIP2,					//パワーヒップアタック（地面）
	FUMI,					//踏んづけ跳ね
	LIFT1,					//敵持ち上げ（軽い）
	LIFT2,					//敵持ち上げ（重い）
	THROW0,					//投げ準備
	TAME,					//投げ溜め
	THROW1,					//投げ（弱）
	THROW2,					//投げ（強）
	JTHROW,					//飛び投げ
	TAMETURN,				//溜め反転
	LDMOVE,					//はしご移動
	LDSTOP,					//はしご止まり
	LDDOWN,					//はしご飛び落り
	NETMOVEY,				//金網移動Ｙ
	NETMOVEX,				//金網移動Ｘ
	NETSTOP,				//金網止まり
	NETDOWN,				//金網飛び落り
	HANERU,					//敵地震
	AWATE,					//はしご・金網落ちる
	GATEIN,					//扉入る
	GATEOUT,				//扉出る
	UPFACE,					//上向く
	TSQUAT,					//積み木用しゃがみ
	ASERI,					//あせり
	WAIT0,					//待機ポーズ
	WAIT1,					//待機ポーズ
	BARBELL0,				//バーベル０
	BARBELL1,				//バーベル１
	ATWALK,					//オート歩き
	WAIT2,					//縄跳び
	CATCH,					//捕らえる
	JCLEAR,					//空中でボス戦クリア
	CLRWAIT,				//ボス戦クリア後
	CLRTURN,				//クリア後ターン
	CLRWALK,				//クリア後歩き
	CLRKIME,				//決めポーズ
	LSTWAIT,				//宝待ち（ラスボス）
	LSTKIME,				//決めポーズ（ラスボス）
	LSTAWATE,				//慌てる（ラスボス）

	SLEEP,					//眠り
	WAKEUP,					//目覚め
	JUMPA,					//着地
	DASH,					//最速走り
	DJUMP,					//最速ジャンプ
	JFLIP,					//跳ね返り
	CLASH,					//激突
	TAKARA,					//宝箱
	RPOUSE,					//構え
	GOWALK,					//ゴー
};

enum WAR_STAT_SWIM
{
	SWCHNG,					//泳ぎに変化
	SWIMX,					//泳ぎ左右
	SWIMY,					//泳ぎ上下
	SWIM2,					//泳ぎ（キーだけ）
	SWIM3,					//水面
	SWSTOP,					//浮き
	SWMISS,					//水中ミス
	SWHIP,					//ヒップアタック
	SWHIP2,					//ヒップ着地
	SWFLIPX,				//横はじかれ
	SWFLIPY,				//縦はじかれ
	SWGATEIN,				//扉入る
	SWDEBU,					//デブ
	SWDBHIP,				//デブヒップ
	SWAWA,					//泡
	SWBIT,					//噛まれる
};

enum WAR_STAT_FIRE
{
	FRCHNG,					//炎開始
	FRNEXT,					//炎次
	FRJNEXT,				//炎次（空中）
	FIRE0,					//燃え０
	JFIRE0,					//燃え０（空中）
	FIRE1,					//燃え１
	JFIRE1,					//燃え１（空中）
	FIRE2,					//丸燃え
	JFIRE2,					//丸燃え（空中）
	FREND,					//燃え終了
};

enum WAR_STAT_DEBU
{
	DBCHNG,					//デブ開始
	DBJCHNG,				//デブ開始（ジャンプ中）
	DBTURN,					//振り向き
	DBWALK,					//歩き
	DBJUMPB,				//ジャンプ前
	DBJUMP,					//ジャンプ中
	DBHIP,					//着地
	DBHAJIK,				//はじき
	DBEND,					//デブ終了
	DBSTOP,					//立ち止まり
	DBUFACE,				//上向き
};

enum WAR_STAT_ICE
{
	ICECHNG,				//氷開始
	ICE,					//凍り中
	ICEJUMP,
	ICEEND,					//氷終了
};

enum WAR_STAT_ZOMBI
{
	ZBCHNG,					//ゾンビ開始
	ZBWALK,					//歩き
	ZBSTOP,					//立ち止まり
	ZBJUMPB,				//ジャンプ前
	ZBJUMP,					//ジャンプ
	ZBHAJIK,				//敵はじき
	ZBBRK1,					//つぶれ（帽子へ）
	ZBBRK2,					//つぶれ
	ZBRTN,					//帽子から復帰
	ZBCAP,					//帽子
	ZBEND,					//終了
	ZBTURN,					//振り向き
	ZBJTURN,				//振り向き（空中）
};

enum WAR_STAT_SNOW
{
	SNWCHNG,
	SNWJCHNG,
	SNWWALK,
	SNWEND,
	SNWJUMPB,
	SNWJUMP,
	SNWHIP,
	SNWSTART,
	SNWSTOP,
	SNWTURN,
	SNWRL1,
	SNWJRL1,
	SNWRL2,
	SNWJRL2,
	SNWRL3,
	SNWJRL3,
};

enum WAR_STAT_BANE
{
	BNCHNG,
	BNJCHNG,
	BNDJUMP,
	BNTOP,
	BNDJUMPB,
	BNLJUMP,
	BNLIM,
	BNEND,
	BNJUMP,
	BNJUMPB,
};

enum WAR_STAT_BALLN
{
	BLLNCHNG,
	BLLNFLY,
	BLLNJUMP,
	BLLNEND,
};

enum WAR_STAT_BAT
{
	BTCHNG,
	BTFLY,
	BTTURN,
	BTSTOP,
	BTEND,
};

enum WAR_STAT_TUBURE
{
	TBCHNG,
	TBUP,
	TBSTOP,
	TBWALK,
	TBFLY,
	TBJUMP,
	TBEND,
};

enum WAR_STAT_MASK
{
	MSKCHNG,
	MSKDOWN,
};

/*
enum WAR_STAT_VAMP
{
	VPCHNG,
	VPBAT,
	VPTURN,
	VPWALK,
	VPJUMP,
	VPHAJIK,
	VPEND,
	VPSTOP,
};
*/



//**************************************************************
//
//		ワリオ構造体
//
//**************************************************************
typedef struct
{
	u8	ucReact;			//リアクション
	u8	ucStat;				//リアクション毎の状態

	u8	ucDokan;			//土管の中
	u8	ucTurn;				//振り向き中
	u8	ucMiss;				//ミス状態
	u8	ucMuteki;			//無敵状態（１のとき敵をはじく）
	u8	ucTumiki;			//積み木が乗っているか
	u8	ucJpNext;
	u8	ucJpFlg;			//0:SPEED=0 1:SPEED=規定値 2:SPEED=保持
	u8	ucJTimer;			//ジャンプ用タイマー

	u8	ucTimer;			//汎用タイマー（８ビット）
	u16	usTimer;			//汎用タイマー（１６ビット）

	u16	usMukiX;			//Ｘ向き
	u16	usMukiY;			//Ｙ向き
	u16	usPosX;				//ワリオ現座標
	u16	usPosY;				//

	s16	sMvSpeedX;			//Ｘ方向スピード
	s16	sMvSpeedY;			//Ｙ方向スピード
	u8	ucPlace;			//WAR_PLACE参照
	u16	usSlope;			//坂

	u8	ucAnmTimer;			//アニメタイマー
	u8	ucAnmPat;			//アニメパターン
	u16	*pObjData;			//OBJデータアドレス
	u8	*pChrAddr1;			//CHRデータ
	u16	usChrByte1;			//転送バイト数
	u8	*pChrAddr2;			//CHRデータ
	u16	usChrByte2;			//転送バイト数

	s16	sHitDX1;			//敵との当り座標：左上Ｘ
	s16	sHitDY1;			//左上Ｙ
	s16	sHitDX2;			//右下Ｘ
	s16	sHitDY2;			//右下Ｙ

	u8	ucAwaCount;			//泡
	u8	ucAwaKabe;
}WarDef;

GLOBAL WarDef	Wario;		//Save必要
GLOBAL WarDef	WarBk;


//==============================================================
//
//==============================================================
typedef struct
{
	u8	ucHeart;			//ハート
	u8	ucUpHeart;			//ハート増加数
	u8	ucTimer;			//ハート減らない期間
	u8	ucAnmTimer;			//ハートを増やすアニメ期間
}LifeDef;

GLOBAL LifeDef	WarLife;	//Save必要
GLOBAL LifeDef	WarLife2;	//Save必要（１／４ハート用）


//==============================================================
//
//==============================================================
typedef struct
{
	u16	usMukiX;			//Ｘ移動方向
	u16	usMukiY;			//Ｙ移動方向
	u8	ucFront;			//前方当りポジション
	u8	ucBack;				//後方当りポジション
	s16	sDX;				//当りによる補正Ｘ

	u8	ucSide;				//横壊れ有り
	u8	ucHead;				//頭壊れ有り
	u8	ucYuka;				//床壊れ有り
	u8	ucSPow;				//横壊しのパワー
	u8	ucHPow;				//頭
	u8	ucYPow;				//床
	u8	ucWSide;			//横当りで壊れたとき立てる
	u8	ucWHead;			//頭
	u8	ucWYuka;			//床
	u8	ucPlace;

	u8	ucSStop;			//横かべのとき立てる
	u8	ucHStop;			//上
	u8	ucYStop;			//床
}WHitDef;

GLOBAL WHitDef	WHit;


//==============================================================
//
//==============================================================
typedef struct
{
	u8	ucStat;				//状態
	u8	ucAnmTimer;			//アニメタイマー
	u8	ucAnmPat;			//アニメパターン
	u16	*pObjData;			//OBJデータアドレス
}CapDef;

GLOBAL CapDef	WarCap;		//Save必要
GLOBAL CapDef	WarKage;	//Save必要


//==============================================================
//
//==============================================================
typedef struct
{
	u8	ucKind;				//0:なし 1:泡 2:バネ効果 3:ダッシュ効果
							//4:こうもり煙 5:汗
	u8	ucStat;				//状態
	u8	ucAnmTimer;			//アニメタイマー
	u8	ucAnmPat;			//アニメパターン
	u16	*pObjData;			//OBJデータアドレス
}WEffDef;

GLOBAL WEffDef	WarEff;		//Save必要


//==============================================================
//
//==============================================================
typedef struct
{
	u8	ucStat;				//STATにより、持ち上げ時補正値を決める
	u8	ucWait;				//敵重量 1:軽い 2:重い 0x80立:上投げ
	s16	sDx;				//敵の補正座標Ｘ
	s16	sDy;				//敵の補正座標Ｙ
}LiftDef;

GLOBAL LiftDef	WarLift;	//Save必要


//==============================================================
//
//==============================================================
typedef struct
{
	u8	ucStat;				//
	u8	ucAnmTimer;			//アニメタイマー
	u8	ucAnmPat;			//アニメパターン
	u16	usPosX;				//Ｘ
	u16	usPosY;				//Ｙ
	s32	iAnmAddr;			//アドレス
}WJEffDef;

GLOBAL WJEffDef	WarJEff;	//Save必要
GLOBAL WJEffDef	WarJEff2;	//Save必要


//==============================================================
//
//==============================================================
typedef struct
{
	u16	bPosRec[2][0x20];
	s16	sRecNum;
	s8	cRecNum;

	u16	usStopFlg;			//動作止める
	u8	ucOffFlg;			//表示止める

	s8	cBottom;
}WSaveDef;

GLOBAL WSaveDef	WarSave;	//Save必要


//==============================================================
//
//==============================================================
typedef struct
{
	u32	uiChrAddr;
	u32	uiObjAddr;
	u8	ucTimer;
}AnmDeff;



//**************************************************************
//
//		ワリオ用変数
//
//**************************************************************
GLOBAL	u8		ucWarDisp, ucWarReactB;
GLOBAL	u16		usWarPosXB, usWarPosYB;

GLOBAL	u16		usWarStopFlg;			//動作止める
GLOBAL	u8		ucWarOffFlg;			//表示止める



//**************************************************************
#undef	GLOBAL
#endif




//**************************************************************
//end
