
/* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

	FILE	: Phase.h

+ ------ Explanation of file --------------------------------------------------------------------------

	アニメの都合上fillを挟まないといけない処理を
	同一フレーム内で処理してはいけない

+ _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */

#ifndef _Phase_H_
#define _Phase_H_

#include "Button.h"

class Scene;
class Mouse;
class Field;
class Skill;
class Dialog;
class Card;
class animeCalcClass;
class TextGraphic;

// フェイズ
enum{
	PHASE_NON	= -2,	// 無し
	PHASE_INIT,			// 初期
	// m_btn[]用にここが0から
	PHASE_AWAKE	= 0,	// アウェイク
	PHASE_DRAW,			// ドロー
	PHASE_ENERGY,		// エナジー
	PHASE_MAIN,			// メイン
	PHASE_ATTACK,		// アタック
	PHASE_END,			// エンド
	PHASE_TURN,			// ターン終了
	PHASE_OPPO,			// 相手ターン

	PHASE_NUM	= 6,
};

// 詳細
enum{
	// 初期
	PHASE_INIT_ZERO,		// Lv0をサーチ
	PHASE_INIT_ZERO_PUT,	// Lv0をセット
	PHASE_INIT_SHUFFLE,		// デッキシャッフル
	PHASE_INIT_JANKEN,		// じゃんけん
	PHASE_INIT_DRAW,		// ドロー
	PHASE_INIT_HAND,		// 手札交換
	PHASE_INIT_ENERGY,		// エナジーセット
	PHASE_INIT_OPEN,		// Lv0を表に
	// メイン
	PHASE_MAIN_FREE,			// 移行処理
	PHASE_MAIN_SHIFT_PRG_SEL,	// PRGシフト対象選択
	PHASE_MAIN_SHIFT_PRG_ENE,	// PRGシフトエナジー使用
	PHASE_MAIN_SHIFT_PRG_ON,	// PRGシフト
	PHASE_MAIN_SHIFT_AC_ENE,	// ACシフトエナジー使用
	PHASE_MAIN_SHIFT_AC_ON,		// ACシフト
	PHASE_MAIN_PRG_INVOKE,		// PRG発動
	PHASE_MAIN_AC_INVOKE,		// AC発動
	// アタック
	PHASE_ATTACK_SELECT,		// 移行処理
	PHASE_ATTACK_FALL,			// フォール
	PHASE_ATTACK_GUARD_SEND,	// ガード移行
	PHASE_ATTACK_GUARD,			// ガード
	PHASE_ATTACK_GUARD_RECV,	// ガード終了
	PHASE_ATTACK_ISLINK,		// リンクするか
	PHASE_ATTACK_LINK,			// リンク
	PHASE_ATTACK_ISATTACK,		// 攻撃通過判定
	PHASE_ATTACK_DAMAGE_TEMP,	// ダメージ前処理
	PHASE_ATTACK_DAMAGE,		// ダメージ
	PHASE_ATTACK_RESET,			// そのバトル中処理終了
	// エンド
	PHASE_END_RESET,			// 能力値リセット
	PHASE_END_DUMP_HAND,		// 手札枚数制限
};

#define PLY_MY			(phase.m_my)		// 自分
#define PLY_OPPO		(!phase.m_my)		// 相手

#define PHASE_CARD_MAX	10

enum DISPTEXT{
	DISPTEXT_PRG1,			// プログレスパワー
	DISPTEXT_PRG2,
	DISPTEXT_PRG3,
	DISPTEXT_PRG4,
	DISPTEXT_DECK,			// デッキ枚数
	DISPTEXT_DISCARD,		// 捨札枚数
	DISPTEXT_DISCARD_FRAME,	// 捨札フレーム数
	DISPTEXT_DISCARD_ALL,	// 捨札0フレーム数
	DISPTEXT_EXCUDE,		// 除外枚数

	DISPTEXT_MAX,
};

class Phase
{
	private:
		Scene*	m_pCamera;				// カメラ
		Mouse*	m_pMouse;				// マウス
		Field*	m_pField;				// フィールド
		Skill*	m_pSkill;				// スキル
		Dialog*	m_pDialog;				// ダイアログ

		TextGraphic*	m_pDispText[PLY_NUM][DISPTEXT_MAX];	// ガイド表示テキスト

	private:
		void	release(void);			// 解放

public:
		Phase();
		~Phase();

		int		m_my;					// 操作対象プレイヤー
		int		m_turn;					// 現在のターン
		int		m_phase;				// 現在のフェイズ
		int		m_state;				// 現在何をしているか
		int		m_selectNum;			// 選択数上限
		bool	m_canOpenDlg;			// ダイアログ生成可能フラグ
		Card*	m_card[PHASE_CARD_MAX];	// 汎用カードポインタ
		Button	m_btn[PHASE_NUM];		// フェイズ移行ボタン
		bool	m_isLink;				// リンクするか
		int		m_linkNum;				// リンク回数
		int		m_drawNum;				// ドロー枚数
		int		m_drawNow;				// 何枚引いたか
		int		m_skillNum;				// 効果発動対象番号
		bool	m_isRemake;				// リメイク処理か

		void init(Field* pField, Skill* pSkill, Dialog* pDlg);	// 初期化
		void update(void);	// 更新
		void draw(void);	// 描画

		void updateGuide	(void);		// ガイド更新
		void updateRemake	(void);		// リメイク更新
		void updatePhase	(void);		// フェイズ更新
		void updateList		(void);		// リスト更新

		void changePhase	(int phase);// フェイズ変更

		void initPhase	(void);	// 初期
		void awakePhase	(void);	// アウェイクフェイズ
		void drawPhase	(void);	// ドローフェイズ
		void energyPhase(void);	// エナジーフェイズ
		void mainPhase	(void);	// メインフェイズ
		void attackPhase(void);	// アタックフェイズ
		void endPhase	(void);	// エンドフェイズ
		void turnPhase	(void);	// ターン変更
		void oppoPhase	(void);	// 相手ターン

		void mainFree	(void);	// メイン：移行処理

		inline void deleteCard	(void){ for(int i = 0; i < PHASE_CARD_MAX; i++){ m_card[i] = NULL; } }

		bool checkDraw(int num, bool isDraw);	// ドロー処理

#if defined (_LOCAL_)
		int  m_cnt;
		bool m_isChange;			// プレイヤーが逆になっているか
		bool changePlayer(void);	// 全カードの座標を入れ替える
#endif
};

extern Phase phase;

#endif /* _Phase_H_ */