server/game/src/skill.h

248 lines
6.2 KiB
C++

#ifndef __INC_METIN_II_GAME_CSkillManager_H__
#define __INC_METIN_II_GAME_CSkillManager_H__
#include <libpoly/include/Poly.h>
enum ESkillFlags
{
SKILL_FLAG_ATTACK = (1 << 0), // 공격 기술
SKILL_FLAG_USE_MELEE_DAMAGE = (1 << 1), // 기본 밀리 타격치를 b 값으로 사용
SKILL_FLAG_COMPUTE_ATTGRADE = (1 << 2), // 공격등급을 계산한다
SKILL_FLAG_SELFONLY = (1 << 3), // 자신에게만 쓸 수 있음
SKILL_FLAG_USE_MAGIC_DAMAGE = (1 << 4), // 기본 마법 타격치를 b 값으로 사용
SKILL_FLAG_USE_HP_AS_COST = (1 << 5), // HP를 SP대신 쓴다
SKILL_FLAG_COMPUTE_MAGIC_DAMAGE = (1 << 6),
SKILL_FLAG_SPLASH = (1 << 7),
SKILL_FLAG_GIVE_PENALTY = (1 << 8), // 쓰고나면 잠시동안(3초) 2배 데미지를 받는다.
SKILL_FLAG_USE_ARROW_DAMAGE = (1 << 9), // 기본 화살 타격치를 b 값으로 사용
SKILL_FLAG_PENETRATE = (1 << 10), // 방어무시
SKILL_FLAG_IGNORE_TARGET_RATING = (1 << 11), // 상대 레이팅 무시
SKILL_FLAG_SLOW = (1 << 12), // 슬로우 공격
SKILL_FLAG_STUN = (1 << 13), // 스턴 공격
SKILL_FLAG_HP_ABSORB = (1 << 14), // HP 흡수
SKILL_FLAG_SP_ABSORB = (1 << 15), // SP 흡수
SKILL_FLAG_FIRE_CONT = (1 << 16), // FIRE 지속 데미지
SKILL_FLAG_REMOVE_BAD_AFFECT = (1 << 17), // 나쁜효과 제거
SKILL_FLAG_REMOVE_GOOD_AFFECT = (1 << 18), // 나쁜효과 제거
SKILL_FLAG_CRUSH = (1 << 19), // 상대방을 날림
SKILL_FLAG_POISON = (1 << 20), // 독 공격
SKILL_FLAG_TOGGLE = (1 << 21), // 토글
SKILL_FLAG_DISABLE_BY_POINT_UP = (1 << 22), // 찍어서 올릴 수 없다.
SKILL_FLAG_CRUSH_LONG = (1 << 23), // 상대방을 멀리 날림
SKILL_FLAG_WIND = (1 << 24), // 바람 속성
SKILL_FLAG_ELEC = (1 << 25), // 전기 속성
SKILL_FLAG_FIRE = (1 << 26), // 불 속성
};
enum
{
SKILL_PENALTY_DURATION = 3,
SKILL_TYPE_HORSE = 5,
};
enum ESkillIndexes
{
SKILL_RESERVED = 0,
// 무사 전사 계열
// A
SKILL_SAMYEON = 1, // 삼연참(세번베기)
SKILL_PALBANG, // 팔방풍우
// S
SKILL_JEONGWI, // 전귀혼
SKILL_GEOMKYUNG, // 검경
SKILL_TANHWAN, // 탄환격
// 무사 기공 계열
// A
SKILL_GIGONGCHAM = 16, // 기공참
SKILL_GYOKSAN, // 격산타우
SKILL_DAEJINGAK, // 대진각
// S
SKILL_CHUNKEON, // 천근추
SKILL_GEOMPUNG, // 검풍
// 자객 암살 계열
// A
SKILL_AMSEOP = 31, // 암습
SKILL_GUNGSIN, // 궁신탄영
SKILL_CHARYUN, // 차륜살
// S
SKILL_EUNHYUNG, // 은형법
SKILL_SANGONG, // 산공분
// 자객 궁수 계열
// A
SKILL_YEONSA = 46, // 연사
SKILL_KWANKYEOK, // 관격술
SKILL_HWAJO, // 화조파
// S
SKILL_GYEONGGONG, // 경공술
SKILL_GIGUNG, // 기궁
// 수라 검
// A
SKILL_SWAERYUNG = 61, // 쇄령지
SKILL_YONGKWON, // 용권파
// S
SKILL_GWIGEOM, // 귀검
SKILL_TERROR, // 공포
SKILL_JUMAGAP, // 주마갑
SKILL_PABEOB, // 파법술
// 수라 마법
// A
SKILL_MARYUNG = 76, // 마령
SKILL_HWAYEOMPOK, // 화염폭
SKILL_MUYEONG, // 무영진
// S
SKILL_MANASHILED, // 흑신수호
SKILL_TUSOK, // 투속마령
SKILL_MAHWAN, // 마환격
// 무당 용신
// A
SKILL_BIPABU = 91,
SKILL_YONGBI, // 용비광사파
SKILL_PAERYONG, // 패룡나한무
// S
//SKILL_BUDONG, // 부동박부
SKILL_HOSIN, // 호신
SKILL_REFLECT, // 보호
SKILL_GICHEON, // 기천대공
// 무당 뇌신
// A
SKILL_NOEJEON = 106, // 뇌전령
SKILL_BYEURAK, // 벼락
SKILL_CHAIN, // 체인라이트닝
// S
SKILL_JEONGEOP, // 정업인
SKILL_KWAESOK, // 이동속도업
SKILL_JEUNGRYEOK, // 증력술
// 공통 스킬
// 7
SKILL_7_A_ANTI_TANHWAN = 112,
SKILL_7_B_ANTI_AMSEOP,
SKILL_7_C_ANTI_SWAERYUNG,
SKILL_7_D_ANTI_YONGBI,
// 8
SKILL_8_A_ANTI_GIGONGCHAM,
SKILL_8_B_ANTI_YEONSA,
SKILL_8_C_ANTI_MAHWAN,
SKILL_8_D_ANTI_BYEURAK,
// 보조 스킬
SKILL_LEADERSHIP = 121, // 통솔력
SKILL_COMBO = 122, // 연계기
SKILL_CREATE = 123, // 제조
SKILL_MINING = 124,
SKILL_LANGUAGE1 = 126, // 신수어 능력
SKILL_LANGUAGE2 = 127, // 천조어 능력
SKILL_LANGUAGE3 = 128, // 진노어 능력
SKILL_POLYMORPH = 129, // 둔갑
SKILL_HORSE = 130, // 승마 스킬
SKILL_HORSE_SUMMON = 131, // 말 소환 스킬
SKILL_HORSE_WILDATTACK = 137, // 난무
SKILL_HORSE_CHARGE = 138, // 돌격
SKILL_HORSE_ESCAPE = 139, // 탈출
SKILL_HORSE_WILDATTACK_RANGE = 140, // 난무(활)
SKILL_ADD_HP = 141, // 증혈
SKILL_RESIST_PENETRATE = 142, // 철통
GUILD_SKILL_START = 151,
GUILD_SKILL_EYE = 151,
GUILD_SKILL_BLOOD = 152,
GUILD_SKILL_BLESS = 153,
GUILD_SKILL_SEONGHWI = 154,
GUILD_SKILL_ACCEL = 155,
GUILD_SKILL_BUNNO = 156,
GUILD_SKILL_JUMUN = 157,
GUILD_SKILL_TELEPORT = 158,
GUILD_SKILL_DOOR = 159,
GUILD_SKILL_END = 162,
GUILD_SKILL_COUNT = GUILD_SKILL_END - GUILD_SKILL_START + 1,
};
class CSkillProto
{
public:
char szName[64];
DWORD dwVnum; // 번호
DWORD dwType; // 0: 전직업, 1: 무사, 2: 자객, 3: 수라, 4: 무당
BYTE bMaxLevel; // 최대 수련도
BYTE bLevelLimit; // 레벨제한
int iSplashRange; // 스플래쉬 거리 제한
BYTE bPointOn; // 어디에 결과값을 적용 시키는가? (타격치, MAX HP, HP REGEN 등등등)
CPoly kPointPoly; // 결과값 만드는 공식
CPoly kSPCostPoly; // 사용 SP 공식
CPoly kDurationPoly; // 지속 시간 공식
CPoly kDurationSPCostPoly; // 지속 SP 공식
CPoly kCooldownPoly; // 쿨다운 시간 공식
CPoly kMasterBonusPoly; // 마스터일 때 보너스 공식
CPoly kSplashAroundDamageAdjustPoly; // 스플래쉬 공격일 경우 주위 적에게 입히는 데미지 감소 비율
DWORD dwFlag; // 스킬옵션
DWORD dwAffectFlag; // 스킬에 맞은 경우 적용되는 Affect
BYTE bLevelStep; // 한번에 올리는데 필요한 스킬 포인트 수
DWORD preSkillVnum; // 배우는데 필요한 이전에 배워야할 스킬
BYTE preSkillLevel; // 이전에 배워야할 스킬의 레벨
int lMaxHit;
BYTE bSkillAttrType;
// 2차 적용
BYTE bPointOn2;
CPoly kPointPoly2;
CPoly kDurationPoly2;
DWORD dwFlag2;
DWORD dwAffectFlag2;
DWORD dwTargetRange;
bool IsChargeSkill()
{
return dwVnum == SKILL_TANHWAN || dwVnum == SKILL_HORSE_CHARGE;
}
// 3차 적용
BYTE bPointOn3;
CPoly kPointPoly3;
CPoly kDurationPoly3;
CPoly kGrandMasterAddSPCostPoly;
void SetPointVar(const std::string& strName, double dVar);
void SetDurationVar(const std::string& strName, double dVar);
void SetSPCostVar(const std::string& strName, double dVar);
};
class CSkillManager : public singleton<CSkillManager>
{
public:
CSkillManager();
virtual ~CSkillManager();
bool Initialize(TSkillTable * pTab, int iSize);
CSkillProto * Get(DWORD dwVnum);
CSkillProto * Get(const char * c_pszSkillName);
protected:
std::map<DWORD, CSkillProto *> m_map_pkSkillProto;
};
#endif