forked from metin2/client
299 lines
8.9 KiB
C
299 lines
8.9 KiB
C
|
#pragma once
|
|||
|
|
|||
|
#include "../gamelib/ItemData.h"
|
|||
|
#include "../EterBase/Poly/Poly.h"
|
|||
|
|
|||
|
class CInstanceBase;
|
|||
|
|
|||
|
class CPythonSkill : public CSingleton<CPythonSkill>
|
|||
|
{
|
|||
|
public:
|
|||
|
enum
|
|||
|
{
|
|||
|
SKILL_TYPE_NONE,
|
|||
|
SKILL_TYPE_ACTIVE,
|
|||
|
SKILL_TYPE_SUPPORT,
|
|||
|
SKILL_TYPE_GUILD,
|
|||
|
SKILL_TYPE_HORSE,
|
|||
|
SKILL_TYPE_MAX_NUM,
|
|||
|
};
|
|||
|
|
|||
|
enum ESkillTableTokenType
|
|||
|
{
|
|||
|
TABLE_TOKEN_TYPE_VNUM,
|
|||
|
TABLE_TOKEN_TYPE_NAME,
|
|||
|
TABLE_TOKEN_TYPE_TYPE,
|
|||
|
TABLE_TOKEN_TYPE_LEVEL_STEP,
|
|||
|
TABLE_TOKEN_TYPE_MAX_LEVEL,
|
|||
|
TABLE_TOKEN_TYPE_LEVEL_LIMIT,
|
|||
|
TABLE_TOKEN_TYPE_POINT_ON,
|
|||
|
TABLE_TOKEN_TYPE_POINT_POLY,
|
|||
|
TABLE_TOKEN_TYPE_SP_COST_POLY,
|
|||
|
TABLE_TOKEN_TYPE_DURATION_POLY,
|
|||
|
TABLE_TOKEN_TYPE_DURATION_SP_COST_POLY,
|
|||
|
TABLE_TOKEN_TYPE_COOLDOWN_POLY,
|
|||
|
TABLE_TOKEN_TYPE_MASTER_BONUS_POLY,
|
|||
|
TABLE_TOKEN_TYPE_ATTACK_GRADE_POLY,
|
|||
|
TABLE_TOKEN_TYPE_FLAG,
|
|||
|
TABLE_TOKEN_TYPE_AFFECT_FLAG,
|
|||
|
TABLE_TOKEN_TYPE_POINT_ON2,
|
|||
|
TABLE_TOKEN_TYPE_POINT_POLY2,
|
|||
|
TABLE_TOKEN_TYPE_DURATION_POLY2,
|
|||
|
TABLE_TOKEN_TYPE_AFFECT_FLAG2,
|
|||
|
TABLE_TOKEN_TYPE_PREREQUISITE_SKILL_VNUM,
|
|||
|
TABLE_TOKEN_TYPE_PREREQUISITE_SKILL_LEVEL,
|
|||
|
TABLE_TOKEN_TYPE_SKILL_TYPE,
|
|||
|
TABLE_TOKEN_TYPE_MAX_HIT,
|
|||
|
TABLE_TOKEN_TYPE_SPLASH_AROUND_DAMAGE_ADJUST_POLY,
|
|||
|
TABLE_TOKEN_TYPE_TARGET_RANGE,
|
|||
|
TABLE_TOKEN_TYPE_SPLASH_RANGE,
|
|||
|
TABLE_TOKEN_TYPE_MAX_NUM,
|
|||
|
};
|
|||
|
|
|||
|
enum ESkillDescTokenType
|
|||
|
{
|
|||
|
DESC_TOKEN_TYPE_VNUM,
|
|||
|
DESC_TOKEN_TYPE_JOB,
|
|||
|
DESC_TOKEN_TYPE_NAME1,
|
|||
|
DESC_TOKEN_TYPE_NAME2,
|
|||
|
DESC_TOKEN_TYPE_NAME3,
|
|||
|
DESC_TOKEN_TYPE_DESCRIPTION,
|
|||
|
DESC_TOKEN_TYPE_CONDITION1,
|
|||
|
DESC_TOKEN_TYPE_CONDITION2,
|
|||
|
DESC_TOKEN_TYPE_CONDITION3,
|
|||
|
DESC_TOKEN_TYPE_CONDITION4,
|
|||
|
DESC_TOKEN_TYPE_ATTRIBUTE,
|
|||
|
DESC_TOKEN_TYPE_WEAPON,
|
|||
|
DESC_TOKEN_TYPE_ICON_NAME,
|
|||
|
DESC_TOKEN_TYPE_MOTION_INDEX,
|
|||
|
DESC_TOKEN_TYPE_MOTION_INDEX_GRADE_NUM,
|
|||
|
DESC_TOKEN_TYPE_TARGET_COUNT_FORMULA,
|
|||
|
DESC_TOKEN_TYPE_MOTION_LOOP_COUNT_FORMULA,
|
|||
|
DESC_TOKEN_TYPE_AFFECT_DESCRIPTION_1,
|
|||
|
DESC_TOKEN_TYPE_AFFECT_MIN_1,
|
|||
|
DESC_TOKEN_TYPE_AFFECT_MAX_1,
|
|||
|
DESC_TOKEN_TYPE_AFFECT_DESCRIPTION_2,
|
|||
|
DESC_TOKEN_TYPE_AFFECT_MIN_2,
|
|||
|
DESC_TOKEN_TYPE_AFFECT_MAX_2,
|
|||
|
DESC_TOKEN_TYPE_AFFECT_DESCRIPTION_3,
|
|||
|
DESC_TOKEN_TYPE_AFFECT_MIN_3,
|
|||
|
DESC_TOKEN_TYPE_AFFECT_MAX_3,
|
|||
|
DESC_TOKEN_TYPE_LEVEL_LIMIT,
|
|||
|
DESC_TOKEN_TYPE_MAX_LEVEL,
|
|||
|
DESC_TOKEN_TYPE_MAX_NUM,
|
|||
|
|
|||
|
CONDITION_COLUMN_COUNT = 3,
|
|||
|
AFFECT_COLUMN_COUNT = 3,
|
|||
|
AFFECT_STEP_COUNT = 3,
|
|||
|
};
|
|||
|
|
|||
|
enum
|
|||
|
{
|
|||
|
SKILL_ATTRIBUTE_NEED_TARGET = (1 << 0),
|
|||
|
SKILL_ATTRIBUTE_TOGGLE = (1 << 1),
|
|||
|
SKILL_ATTRIBUTE_WEAPON_LIMITATION = (1 << 2),
|
|||
|
SKILL_ATTRIBUTE_MELEE_ATTACK = (1 << 3),
|
|||
|
SKILL_ATTRIBUTE_USE_HP = (1 << 4),
|
|||
|
SKILL_ATTRIBUTE_CAN_CHANGE_DIRECTION = (1 << 5),
|
|||
|
SKILL_ATTRIBUTE_STANDING_SKILL = (1 << 6),
|
|||
|
SKILL_ATTRIBUTE_ONLY_FOR_ALLIANCE = (1 << 7),
|
|||
|
SKILL_ATTRIBUTE_CAN_USE_FOR_ME = (1 << 8),
|
|||
|
SKILL_ATTRIBUTE_NEED_CORPSE = (1 << 9),
|
|||
|
SKILL_ATTRIBUTE_FAN_RANGE = (1 << 10),
|
|||
|
SKILL_ATTRIBUTE_CAN_USE_IF_NOT_ENOUGH = (1 << 11),
|
|||
|
SKILL_ATTRIBUTE_NEED_EMPTY_BOTTLE = (1 << 12),
|
|||
|
SKILL_ATTRIBUTE_NEED_POISON_BOTTLE = (1 << 13),
|
|||
|
SKILL_ATTRIBUTE_ATTACK_SKILL = (1 << 14),
|
|||
|
SKILL_ATTRIBUTE_TIME_INCREASE_SKILL = (1 << 15), // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> attribute
|
|||
|
SKILL_ATTRIBUTE_CHARGE_ATTACK = (1 << 16),
|
|||
|
SKILL_ATTRIBUTE_PASSIVE = (1 << 17),
|
|||
|
SKILL_ATTRIBUTE_CANNOT_LEVEL_UP = (1 << 18),
|
|||
|
SKILL_ATTRIBUTE_ONLY_FOR_GUILD_WAR = (1 << 19),
|
|||
|
SKILL_ATTRIBUTE_MOVING_SKILL = (1 << 20),
|
|||
|
SKILL_ATTRIBUTE_HORSE_SKILL = (1 << 21),
|
|||
|
SKILL_ATTRIBUTE_CIRCLE_RANGE = (1 << 22),
|
|||
|
SKILL_ATTRIBUTE_SEARCH_TARGET = (1 << 23),
|
|||
|
};
|
|||
|
|
|||
|
enum
|
|||
|
{
|
|||
|
SKILL_NEED_WEAPON_SWORD = (1 << CItemData::WEAPON_SWORD),
|
|||
|
SKILL_NEED_WEAPON_DAGGER = (1 << CItemData::WEAPON_DAGGER),
|
|||
|
SKILL_NEED_WEAPON_BOW = (1 << CItemData::WEAPON_BOW),
|
|||
|
SKILL_NEED_WEAPON_TWO_HANDED = (1 << CItemData::WEAPON_TWO_HANDED),
|
|||
|
SKILL_NEED_WEAPON_DOUBLE_SWORD = (1 << CItemData::WEAPON_DAGGER),
|
|||
|
SKILL_NEED_WEAPON_BELL = (1 << CItemData::WEAPON_BELL),
|
|||
|
SKILL_NEED_WEAPON_FAN = (1 << CItemData::WEAPON_FAN),
|
|||
|
SKILL_NEED_WEAPON_ARROW = (1 << CItemData::WEAPON_ARROW),
|
|||
|
SKILL_NEED_WEAPON_EMPTY_HAND = (1 << CItemData::WEAPON_NONE),
|
|||
|
};
|
|||
|
|
|||
|
enum
|
|||
|
{
|
|||
|
VALUE_TYPE_FREE,
|
|||
|
VALUE_TYPE_MIN,
|
|||
|
VALUE_TYPE_MAX,
|
|||
|
};
|
|||
|
|
|||
|
enum
|
|||
|
{
|
|||
|
SKILL_GRADE_COUNT = 3,
|
|||
|
SKILL_EFFECT_COUNT = 4, //<2F><>ų<EFBFBD><C5B3> <20><>,<2C><>,<2C><><EFBFBD><EFBFBD> <20>̿ܿ<CCBF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20>߰<EFBFBD>.
|
|||
|
SKILL_GRADE_STEP_COUNT = 20,
|
|||
|
SKILL_GRADEGAP = 25,
|
|||
|
};
|
|||
|
|
|||
|
typedef struct SAffectData
|
|||
|
{
|
|||
|
std::string strAffectDescription;
|
|||
|
std::string strAffectMinFormula;
|
|||
|
std::string strAffectMaxFormula;
|
|||
|
} TAffectData;
|
|||
|
typedef struct SAffectDataNew
|
|||
|
{
|
|||
|
std::string strPointType;
|
|||
|
std::string strPointPoly;
|
|||
|
} TAffectDataNew;
|
|||
|
typedef struct SRequireStatData
|
|||
|
{
|
|||
|
BYTE byPoint;
|
|||
|
BYTE byLevel;
|
|||
|
} TRequireStatData;
|
|||
|
typedef struct SGradeData
|
|||
|
{
|
|||
|
std::string strName;
|
|||
|
CGraphicImage * pImage;
|
|||
|
WORD wMotionIndex;
|
|||
|
} TGradeData;
|
|||
|
typedef struct SSkillData
|
|||
|
{
|
|||
|
static DWORD MELEE_SKILL_TARGET_RANGE;
|
|||
|
// Functions
|
|||
|
SSkillData();
|
|||
|
DWORD GetTargetRange() const;
|
|||
|
BOOL CanChangeDirection();
|
|||
|
BOOL IsFanRange();
|
|||
|
BOOL IsCircleRange();
|
|||
|
BOOL IsAutoSearchTarget();
|
|||
|
BOOL IsNeedTarget();
|
|||
|
BOOL IsNeedCorpse();
|
|||
|
BOOL IsToggleSkill();
|
|||
|
BOOL IsUseHPSkill();
|
|||
|
BOOL IsStandingSkill();
|
|||
|
BOOL CanUseWeaponType(DWORD dwWeaponType);
|
|||
|
BOOL IsOnlyForAlliance();
|
|||
|
BOOL CanUseForMe();
|
|||
|
BOOL CanUseIfNotEnough();
|
|||
|
BOOL IsNeedEmptyBottle();
|
|||
|
BOOL IsNeedPoisonBottle();
|
|||
|
BOOL IsNeedBow();
|
|||
|
BOOL IsAttackSkill();
|
|||
|
BOOL IsHorseSkill();
|
|||
|
BOOL IsMovingSkill();
|
|||
|
BOOL IsTimeIncreaseSkill();
|
|||
|
BOOL IsMeleeSkill();
|
|||
|
BOOL IsChargeSkill();
|
|||
|
BOOL IsOnlyForGuildWar();
|
|||
|
|
|||
|
bool GetState(const char * c_szStateName, int * piState, int iMinMaxType = VALUE_TYPE_FREE);
|
|||
|
float ProcessFormula(CPoly * pPoly, float fSkillLevel = 0.0f, int iMinMaxType = VALUE_TYPE_FREE);
|
|||
|
const char * GetAffectDescription(DWORD dwIndex, float fSkillLevel);
|
|||
|
DWORD GetSkillCoolTime(float fSkillPoint);
|
|||
|
int GetNeedSP(float fSkillPoint);
|
|||
|
DWORD GetContinuationSP(float fSkillPoint);
|
|||
|
DWORD GetMotionLoopCount(float fSkillPoint);
|
|||
|
DWORD GetTargetCount(float fSkillPoint);
|
|||
|
DWORD GetDuration(float fSkillPoint);
|
|||
|
DWORD GetSkillMotionIndex(int iGrade=-1);
|
|||
|
BYTE GetMaxLevel();
|
|||
|
BYTE GetLevelUpPoint();
|
|||
|
bool IsCanUseSkill();
|
|||
|
BOOL IsNoMotion();
|
|||
|
|
|||
|
const std::string GetName() const;
|
|||
|
BYTE GetType() const;
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////////////
|
|||
|
///////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
// Variable
|
|||
|
BYTE byType;
|
|||
|
DWORD dwSkillIndex;
|
|||
|
BYTE byMaxLevel;
|
|||
|
BYTE byLevelUpPoint;
|
|||
|
BYTE byLevelLimit;
|
|||
|
BOOL bNoMotion;
|
|||
|
|
|||
|
std::string strName;
|
|||
|
std::string strIconFileName;
|
|||
|
std::string strDescription;
|
|||
|
std::string strMotionScriptFileName;
|
|||
|
|
|||
|
std::vector<std::string> ConditionDataVector;
|
|||
|
std::vector<TAffectData> AffectDataVector;
|
|||
|
std::vector<TAffectDataNew> AffectDataNewVector;
|
|||
|
std::vector<TRequireStatData> RequireStatDataVector;
|
|||
|
std::string strCoolTimeFormula;
|
|||
|
std::string strTargetCountFormula;
|
|||
|
std::string strMotionLoopCountFormula;
|
|||
|
std::string strNeedSPFormula;
|
|||
|
std::string strContinuationSPFormula;
|
|||
|
std::string strDuration;
|
|||
|
|
|||
|
DWORD dwSkillAttribute;
|
|||
|
DWORD dwNeedWeapon;
|
|||
|
DWORD dwTargetRange;
|
|||
|
WORD wMotionIndex; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
WORD wMotionIndexForMe; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
BOOL isRequirement;
|
|||
|
std::string strRequireSkillName;
|
|||
|
BYTE byRequireSkillLevel;
|
|||
|
|
|||
|
TGradeData GradeData[SKILL_EFFECT_COUNT];
|
|||
|
|
|||
|
CGraphicImage * pImage;
|
|||
|
|
|||
|
/////
|
|||
|
|
|||
|
static std::map<std::string, DWORD> ms_StatusNameMap;
|
|||
|
static std::map<std::string, DWORD> ms_NewMinStatusNameMap;
|
|||
|
static std::map<std::string, DWORD> ms_NewMaxStatusNameMap;
|
|||
|
static DWORD ms_dwTimeIncreaseSkillNumber;
|
|||
|
} TSkillData;
|
|||
|
|
|||
|
typedef std::map<DWORD, TSkillData> TSkillDataMap;
|
|||
|
typedef std::map<DWORD, DWORD> TSkillMotionIndexMap;
|
|||
|
typedef std::map<std::string, std::string> TPathNameMap;
|
|||
|
|
|||
|
public:
|
|||
|
CPythonSkill();
|
|||
|
virtual ~CPythonSkill();
|
|||
|
|
|||
|
void Destroy();
|
|||
|
bool RegisterSkill(DWORD dwSkillIndex, const char * c_szFileName);
|
|||
|
bool RegisterSkillTable(const char * c_szFileName);
|
|||
|
bool RegisterSkillDesc(const char * c_szFileName);
|
|||
|
BOOL GetSkillData(DWORD dwSkillIndex, TSkillData ** ppSkillData);
|
|||
|
bool GetSkillDataByName(const char * c_szName, TSkillData ** ppSkillData);
|
|||
|
|
|||
|
void SetPathName(const char * c_szFileName);
|
|||
|
const char * GetPathName();
|
|||
|
|
|||
|
void TEST();
|
|||
|
|
|||
|
protected:
|
|||
|
void __RegisterGradeIconImage(TSkillData & rData, const char * c_szHeader, const char * c_szImageName);
|
|||
|
void __RegisterNormalIconImage(TSkillData & rData, const char * c_szHeader, const char * c_szImageName);
|
|||
|
|
|||
|
protected:
|
|||
|
TSkillDataMap m_SkillDataMap;
|
|||
|
|
|||
|
std::string m_strPathName;
|
|||
|
|
|||
|
std::map<std::string, DWORD> m_SkillTypeIndexMap;
|
|||
|
std::map<std::string, DWORD> m_SkillAttributeIndexMap;
|
|||
|
std::map<std::string, DWORD> m_SkillNeedWeaponIndexMap;
|
|||
|
std::map<std::string, DWORD> m_SkillWeaponTypeIndexMap;
|
|||
|
TPathNameMap m_PathNameMap;
|
|||
|
};
|