/* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
|
|   Card.h
|       カード
+ -------------------------------------------------------------------------------------------------
|
|	カードの描画情報を持つ
|	カードのデータはm_ciの中にまとめて管理(呼び出し長くなるけど)
|
|
+ _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */

#pragma once

class animeCalcClass;
class Scene;
class TextureManager;
class CardData;

// 頂点バッファのフォーマット定義
#define CARD_VERTEX_FVF (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX2)

// 頂点バッファ構造体
typedef struct
{
	VEC3	p;		// 座標
	DWORD	color;	// 色
	VEC2	t1;		// テクスチャ座標
	VEC2	t2;		// テクスチャ座標
}CARD_VERTEX;

// カードステート
enum{
	CARD_AWAKE,		// アウェイク
	CARD_FALL,		// フォール
};

// カード表裏
enum{
	CARD_FRONT,		// 表
	CARD_BACK,		// 裏
};

// 選択状態
enum{
	SELECT_NON,
	SELECT_ON,
	SELECT_LOCK,
};

// カードデータ
enum{
	CI_NAME,
	CI_CARDNO,
	CI_COLOR,
	CI_POWER,
	CI_GUARD,
	CI_LEVEL,
	CI_STRIKE,
	CI_LINK,
	CI_FRAME,
	CI_BOOST,
	CI_TYPE,
	CI_LINKREQ,
	CI_SKILLTYPE,
	CI_RACE,
	CI_SERNO,
	CD_REVERSE,
	CD_SELECT,
	CD_AWAKE,
};

// カードクラス
class Card
{
	private:
		animeCalcClass*	m_anime;			// アニメ
		animeCalcClass* m_pBrightAnime;		// 光沢アニメ
		Scene*			m_pCamera;			// カメラ
		TextureManager*	m_pTexMan;			// テクスチャ管理
		CardData*		m_pCardData;		// カードデータ

	public:
		LPDIRECT3DVERTEXBUFFER9	m_pVB;		// 頂点バッファ
		D3DXMATRIX	m_world;				// ワールド行列
		VEC3		m_vPos[4];				// 頂点座標(ローカル)
		bool		m_isCreate;				// 生成フラグ
		bool		m_isTransDraw;			// 透過描画フラグ
		VEC3		m_pos;					// 座標
		VEC3		m_degree;				// 角度
		float		m_scale;				// 拡大率
		int			m_id;					// 識別子
		int			m_texID;				// テクスチャ番号
		int			m_sleeveTexID;			// スリーブテクスチャ番号
		int			m_brightTexID;			// 光沢テクスチャ番号
		VecCE		m_listEffect;			// 影響カードリスト
		CARD_INFO	m_ci;					// カード情報
		int			m_reverse;				// 表か裏か
		int			m_awake;				// アウェイク・フォール
		bool		m_focus;				// フォーカスがあるか
		int			m_select;				// 選択されているか
		int			m_zone;					// ゾーン
		int			m_num;					// 位置
		int			m_ply;					// プレイヤー
		int			m_useSkill[SKILL_MAX];	// 効果使用回数
		VecTV		m_addPower;				// 加算パワー
		VecTV		m_addLink;				// 加算リンク
		VecTV		m_addStrike;			// 加算ストライク
		VecTV		m_addLevel;				// 加算レベル

	private:
		void	release(void);

	public:
		Card();
		~Card();

		void	init(CardData* pCD);
		void	update	(void);
		void	draw	(void);

		// カードデータ破棄
		void	deleteData		(void);
		// カード登録確認
		inline bool	isExistData	(void){ return((m_ci.serNo != NON_CARD)); };
		// 影響リストに含まれているか
		bool	isExistEffect	(CARD_EFFECT ce);

		void setData	(int serNo);
		void setPos		(float x, float y, float z);
		void setPos		(VEC3 pos);
		void setDegree	(float x, float y, float z);
		void setDegree	(VEC3 deg);
		void setScale	(float scale);

		void setAwake	(void){ m_awake = CARD_AWAKE; }
		void setFall	(void){ m_awake = CARD_FALL; }
		bool isAwake	(void){ return(m_awake == CARD_AWAKE); }
		bool isFall		(void){ return(m_awake == CARD_FALL); }

		void setFront	(void){ m_reverse = CARD_FRONT; }
		void setBack	(void){ m_reverse = CARD_BACK; }
		bool isFront	(void){ return(m_reverse == CARD_FRONT); }
		bool isBack		(void){ return(m_reverse == CARD_BACK); }

		VEC3 getDispPos	(void);

		// 加算値取得
		int getAddPower	(void);
		int getAddStrike(void);
		int getAddLink	(void);
		int getAddLevel	(void);
		// 合計値取得
		inline int getSumPower	(void){ return(m_ci.power	+ getAddPower()	); };
		inline int getSumStrike	(void){ return(m_ci.strike	+ getAddStrike()	); };
		inline int getSumLink	(void){ return(m_ci.link	+ getAddLink()		); };
		inline int getSumLevel	(void){ return(m_ci.level	+ getAddLevel()	); };

		animeCalcClass*	getAnimeCalc(void){ return(m_anime); }
};

typedef vector<Card*>				VecpCard;
typedef vector<Card*>::iterator		ItepCard;

