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

	FILE	: Skill.h

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

	カード効果
	スクリプトリーダー込み

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

#pragma once

#include "SkillDef.h"
#include "Card.h"

class Phase;
class Field;
class Dialog;

class Skill
{
	private:
		Phase*			m_pPhase;		// フェイズ
		Field*			m_pField;		// フィールド
		Dialog*			m_pDialog;		// ダイアログ

		vecScript		m_scriptList;	// スクリプト
		vecFunc*		m_pFuncList;	// 使用関数リスト

		int		m_state;		// 効果ステート
		int		m_sState;		// 詳細ステート
		int		m_skillNum;		// 発動スキル番号
		int		m_ret;			// 返り値
		Card*	m_card[10];		// 汎用カード([0]:発動カード)
		int		m_temp[10];		// 汎用数値
		int		m_linkNum;		// リンク成功回数
		int		m_invokeNum;	// 効果発動回数

	public:
		Skill();
		~Skill();

		void init(Phase* pPhase, Field* pField, Dialog* pDlg);

		// 発動
		int  invoke(Card* card, int skillNo, int code = SKILL_CODE_INVOKE);
		// 発動スキル検索
		bool searchSkill(Card* card, int skillNo);
		// 発動タイミング一致スキル検索
		int	 searchTinimg(Card* card, int timing);

	private:
		void release(void);					// 解放
		void readBinary(void);				// バイナリ読み込み
		void clear(int code, int skillNo);	// 効果終了
		void nextState(int state = 1);		// 次ステートへ

	public:
		//! 発動タイミング処理
		int stLinkStepStart(void);		// リンクステップ開始時
		int stPlayActionZone(void);		// アクションゾーンに置かれた時
		int stPlay(void);				// 登場した時
		int stAlways(void);				// 常在効果
		int stStartup(void);			// 起動効果

		//! コスト処理
		int scFall(void);				// 自身をフォール
		int scFallNum(void);			// n枚をフォール
		int scDumpHand(void);			// 手札を捨てる

		//! 条件処理
		int siLink(void);				// リンク
		int siColorNum(void);			// 指定色n枚以上
		int siUseNum(void);				// n回まで
		int siEnergyFallAll(void);		// エナジーが全てフォール

		//! 効果処理

		//! B1
		int seDraw(void);				// ドローする
		int seShuffle(void);			// シャッフルする
		int seAwake(void);				// 自身をアウェイク
		int seAwakeEnergy(void);		// エナジーをアウェイク
		int seDamage(void);				// ダメージを与える
		int seDumpHand(void);			// 手札を捨てる
		int seDumpHandOp(void);			// 相手が手札を捨てる
		int seDumpDeck(void);			// デッキを捨てる
		int seDumpDamage(void);			// ダメージを捨てる
		int seSearchDeckPrg(void);		// デッキからプログレスを手札に加える
		int seSearchDisCardPrg(void);	// 捨札からプログレスを手札に加える
		int seAddEnergy(void);			// デッキからエナジーに加える
		int sePutDisCardPrg(void);		// 捨札からプログレスを置く
		int sePowerUp(void);			// 自身の攻撃力アップ
		int sePowerUpAll(void);			// 味方全体の攻撃力アップ
		int sePowerUpNum(void);			// 味方n枚の攻撃力アップ
		int sePowerUpHand(void);		// 手札n枚ごとに攻撃力アップ
		int sePowerUpEnergy(void);		// エナジーn枚ごとに攻撃力アップ
		int seStrikeUp(void);			// 自身のストライクアップ
		int seBouncePrg(void);			// 相手プログレスを手札に戻す
		int seBouncePrgDeck(void);		// 相手プログレスをデッキに戻す
		int seRemovePrg(void);			// 相手プログレスを退却
		int seChangeHandDamage(void);	// 手札と表ダメージを入れ替える
		int seDamageFront(void);		// ダメージを表にする
		int seDeckTopMoveTorD(void);	// デッキトップを上か捨札に置く

		//! B2
		//! B3
		//! B4
		//! B5
		//1 B6
		//! B7
		//! E1
		//! PR
		//! S1
		//! S2
		//! S3
		//! S4
		//! S5
};

// 関数と関数名の関連付け
typedef int (Skill::*skillFunc)(void);
struct SKILL_NAME{
	char*		name;
	skillFunc	func;
};


