#ifndef	__ROLEATTR_H_2003_09_01__
#define __ROLEATTR_H_2003_09_01__
#include "RoleBaseInc.h"


#define Def_Base_TB_Total_Unit_ 400

struct RoleValueData
{
	//----------------------------------------------------------------------
	//	全域資料
	//----------------------------------------------------------------------
	static bool	InitTable( char* Path );    //重檔案載入參數

    static void CalBaseTB( );                //計算基本的TB表
 
	//----------------------------------------------------------------------
	RoleTableStruct			Table;			//目前此角色的 Table資料
	//----------------------------------------------------------------------
	RoleValueData*			Target;			//運算目標 
	//----------------------------------------------------------------------
	MagicEffectStruct		Effect;			//法術影響
	MagicSpellFlagStruct	AssistMagicSetting;	//輔助法術特殊類型	
	RoleActionStruct		Action;			//目前的行動狀態
    RoleActionStruct		LAction;		//目前的行動狀態
	//----------------------------------------------------------------------
	SkillValueStruct*		SkillValue;		//技能資料
	BaseAbilityStruct*		Ability;		//目前職業的能力
    SkillValueStruct	    MaxSkillValue;		//技能資料
	//----------------------------------------------------------------------
    static FixFightArgumentStruct   FixArg;     //固定參數表
    static FightArgumentStruct      RaceArg[ _MAX_RACE_COUNT_ ];        //種族參數表
    static FightArgumentStruct      VocArg [ _MAX_VOCATION_COUNT_ ];    //職業參數表
    static FightArgumentStruct      SexArg [ _MAX_SEX_COUNT_ ];         //性別參數表

	static EqWearSkillStruct JobWearSkill[ _MAX_VOCATION_COUNT_ ];	//每個職頁所會的裝備能力

    static float    BaseStrTB[_MAX_RACE_COUNT_][_MAX_VOCATION_COUNT_][_MAX_SEX_COUNT_][ _MAX_LEVEL_+1 ];
    static float    BaseStaTB[_MAX_RACE_COUNT_][_MAX_VOCATION_COUNT_][_MAX_SEX_COUNT_][ _MAX_LEVEL_+1 ];
    static float    BaseIntTB[_MAX_RACE_COUNT_][_MAX_VOCATION_COUNT_][_MAX_SEX_COUNT_][ _MAX_LEVEL_+1 ];
    static float    BaseMndTB[_MAX_RACE_COUNT_][_MAX_VOCATION_COUNT_][_MAX_SEX_COUNT_][ _MAX_LEVEL_+1 ];
    static float    BaseAgiTB[_MAX_RACE_COUNT_][_MAX_VOCATION_COUNT_][_MAX_SEX_COUNT_][ _MAX_LEVEL_+1 ];
    static float    BaseHPTB[_MAX_RACE_COUNT_][_MAX_VOCATION_COUNT_][_MAX_SEX_COUNT_][ _MAX_LEVEL_+1 ];
    static float    BaseMPTB[_MAX_RACE_COUNT_][_MAX_VOCATION_COUNT_][_MAX_SEX_COUNT_][ _MAX_LEVEL_+1 ];

    static int      PointCost[ 200 ];

    static float    BaseDefAbrTB[ Def_Base_TB_Total_Unit_ ];
    static float    BaseMDefAbrTB[ Def_Base_TB_Total_Unit_ ];
    static float    BaseMPowTB[ Def_Base_TB_Total_Unit_ ];

    static int      SkillValueBase[ _MAX_LEVEL_ ][ _MAX_SKILLVALUE_BASETYPE ];				//熟練度代表的數值 S+[0] S[1] S-[2]依此類推
    static int      JobSkillValue[ _MAX_SKILLVALUE_TYPE ][ _MAX_VOCATION_COUNT_ ];

	static int		WeaponBaseDelayTime[ _MAX_SKILLVALUE_TYPE ];							//各種武器的基本延遲時間
	static float	WeaponBaseDmg[ _MAX_SKILLVALUE_TYPE ];									//各種武器的基本傷害比( 要乘上該等極GM的傷害 )

	static vector<ResistArgumentStruct>		ResistArgList;									//抗性數值表
    //============================================================================
    FightArgumentStruct     Arg;		//自己的參數
	FightArgumentStruct     Arg_Sub;    //副職的參數

	//基本數值
	Race_ENUM				Race;
	Sex_ENUM				Sex;
	Voc_ENUM    			Voc;
    Voc_ENUM    			Voc_Sub;
    int                     Level;
    int                     Level_Sub;          //副職等級()
    GameObjectWeaponENUM    MainWeaponType;     //主手是否可攻擊
    GameObjectWeaponENUM    SecWeaponType;      //副手是否可攻擊

	int						MainAttackRange;	//武器攻擊範圍
	int						SecAttackRange;		//武器攻擊範圍

	//----------------------------------------------------------------------
	//原始數值
    //----------------------------------------------------------------------
    struct 
    {
        //查表得到
        float   BaseStr;
        float   BaseSta;
        float   BaseInt;
        float   BaseMnd;
        float   BaseAgi;
        float   BaseHP;
        float   BaseMP;
//        float   BaseSP;

        float   MoveSpeed_Per;      //npc基本的移動力
		MagicResistStruct   Resist;	//npc抗性的移動力

    }Bas;
    //============================================================================
	struct 
	{
		float   Main_DMG;           //主手攻擊力
		float   Main_DMG_Per;       //攻擊力(%)
		float	Main_CriticalHit;
		float	Main_ATKSpeed_Per;
		float	Main_HitRate;
		float   Main_MagicAtk[ EM_MagicResist_MAXCOUNT ];

		float   Sec_DMG;			//副手攻擊力		
		float   Sec_DMG_Per;        //攻擊力(%)
		float	Sec_CriticalHit;
		float	Sec_ATKSpeed_Per;
		float	Sec_HitRate;
		float   Sec_MagicAtk[ EM_MagicResist_MAXCOUNT ];

		float	Def[ EM_Armor_MaxCount ];				//各類型所產生的防禦值

		float	Body[ EM_WearEqType_MaxCount ];
	}Mid;
	//----------------------------------------------------------------------
	//最後算出的結果
    //----------------------------------------------------------------------
    struct  
    {
        float	STR;			// 力量
        float	STA;			// 耐力
        float	MND;			// 智慧
        float   INT;            // 聰明
        float	AGI;			// 敏捷
        float   LUK;

        float	MaxHP;		    // 體力
        float	MaxMP;		    // 魔力
        float   MaxSP;			// 主職 SP
		float	MaxSP_Sub;		// 副職 SP

        float	ATK;			// 攻擊
        float	DEF;			// 防禦

        float	MDEF;		    // 防禦
        float	MATK;		    // 攻擊

        float	HitRate;		// 命中
        float	DodgeRate;	    // 閃避

        float	CriticalHit;
		float	CriticalHitPower;		//Critical傷害倍率

		float	MagicCriticalHit;
		float	MagicCriticalHitPower;	//魔法 Critical傷害倍率

        float	ParryRate;

        float	ReHP;
        float	ReMP;
//        float   ReSP;

		float	Main_CriticalHit;
        float 	Main_ATKSpeed_Per;
        float   Main_DMG;           //主手攻擊力
		float	Main_HitRate;

		float	Sec_CriticalHit;
        float 	Sec_ATKSpeed_Per;
        float   Sec_DMG;			//副手攻擊力
		float	Sec_HitRate;

		float   MoveSpeed;
		float   DMG;

        float   MPow;           	//魔法增強率
        float   MAbr;           	//魔法防禦吸收率
        float   Abr;            	//防禦吸收率
        float   AB;             	//防禦吸收點數

		float	ManaDecrease;		//mp消耗減少(%)

		EqWearSkillStruct	WearSkill;//裝置能力

        MagicResistStruct   Resist;

		SkillValueStruct	SkillValue;	
    }Fin;
    
	//----------------------------------------------------------------------	
	// 一般函式
	//----------------------------------------------------------------------	
	//重設此角色的 Table 資料
	void	ReSetTable();
	//初始化所有的裝備或法術產生的暫時效果
	void	Init_MidValue();
    //全部重新計算
    void	Calculate();
    //攻擊力傷害計算
    float	MainAtkDamage( ATTACK_DMGTYPE_ENUM DmgType );
    float	SecAtkDamage( ATTACK_DMGTYPE_ENUM DmgType );
	
	//先計算裝備能力
	void	CalWearSkill();

	//計算物理傷害　被防禦修正
	float	CalWeaponDMG( float DMG );

	//計算法術傷害　被魔防修正
	float	CalMagicDMG( float DMG );
	

	//取得法術抗性值對應的 處理的類別
	static	ResistArgType_ENUM	GetResistType( int ResistValue );

protected:
	//----------------------------------------------------------------------	
	//各項數值簡易算式
	//----------------------------------------------------------------------	
	float	_STR();
	float	_STA();
	float	_INT();
	float	_MND();
	float	_AGI();
	float	_LUK();

    //--------------------------------------    
    float	_MaxHP();	    // 體力
    float	_MaxMP();	    // 魔力
    float   _MaxSP();
	float   _MaxSP_Sub();

    float	_ATK();			// 攻擊
    float	_DEF();			// 防禦

    float	_MDEF();	    // 防禦
    float	_MATK();	    // 攻擊

    float	_HitRate();		// 命中
	float	_Main_HitRate();
	float	_Sec_HitRate();

    float	_DodgeRate();   // 閃避

    float	_CriticalHit();
	float	_CriticalHitPower();

	float	_MagicCriticalHit();
	float	_MagicCriticalHitPower();


    float	_Main_CriticalHit();
    float	_Sec_CriticalHit();
    float	_ParryRate();

    float	_ReHP();
    float	_ReMP();
//    float   _ReSP();
    
    float   _Main_ATKSpeed_Per();
    float 	_Sec_ATKSpeed_Per();
    float   _MoveSpeed();
	
//	float	_Main_HitRate();
//	float	_Sec_HitRate();
    
    //--------------------------------------    
    float   _DMG();
    float   _MainDMG();
    float   _SecDMG();

    float   _MPow();           //魔法增強率
    float   _MAbr();           //魔法防禦吸收率
    float   _Abr();            //防禦吸收率
    float   _AB();             //防禦吸收點數

	float	_ManaDecrease();	//mp消耗減少(%)

	EqWearSkillStruct _EqWearSkill();

	void	_SkillValueCal();
};


#endif