Files
2026-06-01 12:46:52 +02:00

1034 lines
40 KiB
C++

#pragma once
#include <mmo/ArType.h>
#include "ItemBase.h"
#include "CreatureBase.h"
#include "GameRule.h"
struct SkillBase
{
enum
{
MAX_SKILL_LEVEL = 50,
MAX_TOGGLE_GROUP = 20,
MAX_SKILL_VALUE = 20,
TOGGLE_REFRESH_TIME = 2000, // 토글형 스킬은 5초마다 다시 걸어줌
TOGGLE_LIVE_TIME = 6000, // 토글형 스킬로 발동된 지속효과는 11초간 유지됨
TOGGLE_TRANSFORMATION = 60000, // 토글형 스킬로 발동된 지속효과는 11초간 유지됨
};
enum
{
ST_INVALID = 0,
ST_VALID = 1,
ST_SYSTEM = 2,
};
enum //
{
DISTRIBUTION_TYPE_NO_LIMIT = 0,
DISTRIBUTION_TYPE_DISTRIBUTE = 1,
DISTRIBUTION_TYPE_RANDOM = 2,
DISTRIBUTION_TYPE_SEQUENTIAL_TARGET = 3,
DISTRIBUTION_TYPE_SEQUENTIAL_CASTER = 4,
};
enum //
{
CHAIN_TYPE_DISTANCE = 0,
CHAIN_TYPE_RANDOM = 1,
CHAIN_TYPE_HP_LOSS = 2,
CHAIN_TYPE_HP_LOSS_PERCENTAGE = 3,
};
enum //
{
SKILL_EFFECT_TARGET_LIMIT_ANY_BODY = 0,
SKILL_EFFECT_TARGET_LIMIT_NOT_ENEMY = 1,
SKILL_EFFECT_TARGET_LIMIT_ONLY_ALLY = 2,
SKILL_EFFECT_TARGET_LIMIT_ONLY_ENEMY = 3,
};
enum
{
REGION_TYPE_DIRECTION = 0, // 일자형
REGION_TYPE_ARC_CIRCLE = 1, // 부채꼴형
REGION_TYPE_CROSS = 2, // 십자가형
};
enum // effect type
{
EF_MISC = 0,
EF_RESPAWN_MONSTER_NEAR = 2, // 몬스터 전용 스킬 유형
EF_PARAMETER_INC = 3,
EF_PARAMETER_AMP = 4,
EF_RESPAWN_MONSTER_RANDOMLY = 5, // 랜덤 소환 주문서용 스킬 유형
EF_RESPAWN_MONSTER_WITH_DIFF_CODE = 6, // 소환 주문서용 스킬 유형
EF_PHYSICAL_SINGLE_DAMAGE_T1 = 101,
EF_PHYSICAL_MULTIPLE_DAMAGE_T1 = 102,
EF_PHYSICAL_SINGLE_DAMAGE_T2 = 103,
EF_PHYSICAL_MULTIPLE_DAMAGE_T2 = 104,
EF_PHYSICAL_DIRECTIONAL_DAMAGE = 105,
EF_PHYSICAL_SINGLE_DAMAGE_T3 = 106,
EF_PHYSICAL_MULTIPLE_DAMAGE_T3 = 107,
EF_PHYSICAL_MULTIPLE_DAMAGE_TRIPLE_ATTACK_OLD = 108,
EF_PHYSICAL_SINGLE_REGION_DAMAGE_OLD = 111,
EF_PHYSICAL_MULTIPLE_REGION_DAMAGE_OLD = 112,
EF_PHYSICAL_SINGLE_SPECIAL_REGION_DAMAGE_OLD = 113,
EF_PHYSICAL_SINGLE_DAMAGE_WITH_SHIELD = 117,
EF_PHYSICAL_ABSORB_DAMAGE = 121,
EF_PHYSICAL_MULTIPLE_SPECIAL_REGION_DAMAGE_OLD = 122,
EF_PHYSICAL_SINGLE_DAMAGE_ADD_ENERGY_OLD = 125, // 30003번 유형으로 대체
EF_PHYSICAL_SINGLE_DAMAGE_KNOCKBACK_OLD = 131,
EF_PHYSICAL_SINGLE_REGION_DAMAGE_KNOCKBACK_OLD = 132,
EF_PHYSICAL_SINGLE_DAMAGE_WITHOUT_WEAPON_RUSH_KNOCK_BACK = 151,
EF_PHYSICAL_SINGLE_DAMAGE_RUSH_KNOCKBACK_OLD = 152,
EF_PHYSICAL_SINGLE_DAMAGE_RUSH_KNOCKBACK_REGION = 153,
EF_MAGIC_SINGLE_DAMAGE_T1_OLD = 201, // 폐기 -> 231로 전환
EF_MAGIC_MULTIPLE_DAMAGE_T1_OLD = 202, // 폐기 -> 232로 전환
EF_MAGIC_SINGLE_DAMAGE_T2_OLD = 203, // 폐기 -> 231로 전환
EF_MAGIC_MULTIPLE_DAMAGE_T2_OLD = 204, // 폐기 -> 232로 전환
EF_MAGIC_MULTIPLE_DAMAGE_T3_OLD = 205,
EF_MAGIC_MULTIPLE_DAMAGE_T1_DEAL_SUMMON_HP_OLD = 206, // 폐기 -> 233으로 전환
EF_MAGIC_SINGLE_REGION_DAMAGE_OLD = 211, // 폐기 -> 261로 전환
EF_MAGIC_MULTIPLE_REGION_DAMAGE_OLD = 212, // 폐기 -> 263으로 전환
EF_MAGIC_SPECIAL_REGION_DAMAGE_OLD = 213, // 폐기 -> 262로 전환
EF_MAGIC_MULTIPLE_REGION_DAMAGE_T2_OLD = 214, // 기존에 없던 것 -> 263으로 추가
EF_MAGIC_ABSORB_DAMAGE_OLD = 221, // 폐기 -> 235로 전환
EF_MAGIC_SINGLE_DAMAGE = 231,
EF_MAGIC_MULTIPLE_DAMAGE = 232,
EF_MAGIC_MULTIPLE_DAMAGE_DEAL_SUMMON_HP = 233,
EF_MAGIC_SINGLE_DAMAGE_OR_DEATH = 234,
EF_MAGIC_DAMAGE_WITH_ABSORB_HP_MP = 235,
EF_MAGIC_SINGLE_PERCENT_DAMAGE = 236,
EF_MAGIC_SINGLE_PERCENT_MANABURN = 237,
EF_MAGIC_SINGLE_PERCENT_OF_MAX_MP_MANABURN = 238,
EF_MAGIC_SINGLE_DAMAGE_ADD_RANDOM_STATE = 239,
EF_MAGIC_SINGLE_DAMAGE_BY_CONSUMING_TARGETS_STATE = 240, // 1체마법공격: 특정 지속효과 부여시 발동
EF_MAGIC_MULTIPLE_DAMAGE_AT_ONCE = 241, // 1체마법공격: 한방 연타
EF_MAGIC_SINGLE_REGION_DAMAGE = 261,
EF_MAGIC_SPECIAL_REGION_DAMAGE = 262,
EF_MAGIC_MULTIPLE_REGION_DAMAGE = 263,
EF_MAGIC_REGION_PERCENT_DAMAGE = 264,
EF_MAGIC_SINGLE_REGION_DAMAGE_USING_CORPSE = 265,
EF_ADD_HP_MP_BY_ABSORB_HP_MP = 266,
EF_MAGIC_SINGLE_REGION_DAMAGE_BY_SUMMON_DEAD= 267,
EF_MAGIC_SINGLE_REGION_DAMAGE_ADD_RANDOM_STATE=268,
EF_MAGIC_MULTIPLE_REGION_DAMAGE_AT_ONCE = 269,
EF_AREA_EFFECT_MAGIC_DAMAGE = 271,
EF_AREA_EFFECT_MAGIC_DAMAGE_AND_HEAL = 272,
EF_AREA_EFFECT_MAGIC_DAMAGE_AND_HEAL_T2 = 273,
EF_ADD_STATE = 301,
EF_ADD_REGION_STATE = 302,
EF_CASTING_CANCEL_WITH_ADD_STATE = 304,
EF_ADD_STATE_BY_SELF_COST = 305,
EF_ADD_REGION_STATE_BY_SELF_COST = 306,
EF_ADD_STATE_BY_TARGET_TYPE = 307,
EF_ADD_STATES_WITH_EACH_DIFF_LV = 308,
EF_ADD_STATES_WITH_EACH_DIFF_LV_DURATION = 309,
EF_ADD_STATE_STEP_BY_STEP = 310,
EF_ADD_STATE_TO_CASTER_AND_TARGET = 311,
EF_ADD_RANDOM_STATE = 312,
EF_ADD_RANDOM_REGION_STATE = 313,
EF_ADD_STATE_BY_USING_ITEM = 314,
EF_AREA_EFFECT_MAGIC_DAMAGE_OLD = 352, // 폐기 -> 271로 전환
EF_AREA_EFFECT_HEAL = 353,
EF_TRAP_PHYSICAL_DAMAGE = 381,
EF_TRAP_MAGICAL_DAMAGE = 382,
EF_TRAP_MULTIPLE_PHYSICAL_DAMAGE = 383,
EF_TRAP_MULTIPLE_MAGICAL_DAMAGE = 384,
EF_REMOVE_BAD_STATE = 401,
EF_REMOVE_GOOD_STATE = 402,
EF_ADD_HP = 501,
EF_ADD_MP = 502,
EF_RESURRECTION = 504,
EF_ADD_HP_MP = 505,
EF_ADD_HP_MP_BY_SUMMON_DAMAGE = 506,
EF_ADD_HP_MP_BY_SUMMON_DEAD = 507,
EF_ADD_REGION_HP_MP = 508,
EF_ADD_HP_BY_ITEM = 509,
EF_ADD_MP_BY_ITEM = 510,
EF_CORPSE_ABSORB = 511,
EF_ADD_HP_MP_BY_STEAL_SUMMON_HP_MP = 512,
EF_ADD_HP_MP_WITH_LIMIT_PERCENT = 513,
EF_ADD_REGION_HP = 521,
EF_ADD_REGION_MP = 522,
EF_SUMMON = 601,
EF_UNSUMMON = 602,
EF_UNSUMMON_AND_ADD_STATE = 605,
EF_TOGGLE_AURA = 701,
EF_TOGGLE_DIFFERENTIAL_AURA = 702, // 이름 애매하구로...-_-
EF_TAUNT = 900,
EF_REGION_TAUNT = 901,
EF_REMOVE_HATE = 902,
EF_REGION_REMOVE_HATE = 903,
EF_REGION_REMOVE_HATE_OF_TARGET = 904,
EF_CORPSE_EXPLOSION = 1001,
EF_CREATE_ITEM = 9001,
EF_ACTIVATE_FIELD_PROP = 9501,
EF_REGION_HEAL_BY_FIELD_PROP = 9502,
EF_AREA_EFFECT_HEAL_BY_FIELD_PROP = 9503,
// passive
//EF_DOUBLE_WEAPON = 10011, // 사용되지 않는 유형(없어짐)
EF_WEAPON_MASTERY = 10001,
EF_BATTLE_PARAMTER_INCREASE = 10002,
EF_BLOCK_INCREASE = 10003,
EF_ATTACK_RANGE_INCREASE = 10004,
EF_RESISTANCE_INCREASE = 10005,
EF_MAGIC_REGISTANCE_INCREASE = 10006,
EF_SPECIALIZE_ARMOR = 10007,
EF_INCREASE_BASE_ATTRIBUTE = 10008,
EF_INCREASE_EXTENSION_ATTRIBUTE = 10009, // 화살 데미지 감소 옵션 추가해야됨
EF_SPECIALIZE_ARMOR_AMP = 10010, // 직업의상 특화: 증폭
EF_AMPLIFY_BASE_ATTRIBUTE = 10011, // 기본 능력치 증폭
EF_MAGIC_TRAINING = 10012,
EF_HUNTING_TRAINING = 10013, // 계열별 데미지 증감
EF_BOW_TRAINING = 10014,
EF_INCREASE_STAT = 10015,
EF_AMPLIFY_STAT = 10016,
EF_INCREASE_HP_MP = 10021, // HP/MP 최대치/회복량 증가
EF_AMPLIFY_HP_MP = 10022, // HP/MP 최대치/회복량 증폭
EF_HEALING_AMPLIFY = 10023,
EF_HEALING_AMPLIFY_BY_ITEM = 10024, // 아이템으로 인한 회복량 증폭
EF_HEALING_AMPLIFY_BY_REST = 10025, // 앉아있을 때 HP, MP 리젠 증폭
EF_HATE_AMPLIFY = 10026, // 위협수준 증폭
EF_INCREASE_SUMMON_HP_MP_SP = 10031, // 편성된 소환수의 HP/MP/SP 최대치/회복량 증가
EF_AMPLIFY_SUMMON_HP_MP_SP = 10032, // 편성된 소환수의 HP/MP/SP 최대치/회복량 증폭
EF_BELT_ON_PARAMETER_INC = 10035, // 소환수 카드 스텟 중 벨트 장착시 스텟(힘/체/지능 등등) 증가 패시브
EF_BELT_ON_ATTRIBUTE_INC = 10036, // 소환수 카드 스텟 중 벨트 장착시 기본 속성(공/방/회피 등등) 증가 패시브
EF_BELT_ON_ATTRIBUTE_EX_INC = 10037, // 소환수 카드 스텟 중 벨트 장착시 확장 속성(HP/MP, 블럭률, 크리율 등등) 증가 패시브
EF_BELT_ON_ATTRIBUTE_EX2_INC = 10038, // 소환수 카드 스텟 중 벨트 장착시 확장 속성(시전, 캐스팅, 화살 데미지 감소 등등) 증가 패시브
// AziaMafia BeltPet = 2000000000 + 10038 in StringResource
EF_BELT_ON_ATTRIBUTE_EX3_INC = 10138,
EF_BELT_ON_ATTRIBUTE_EX4_INC = 10139,
EF_BELT_ON_ATTRIBUTE_EX5_INC = 10140,
EF_BELT_ON_ATTRIBUTE_EX6_INC = 10141,
EF_BELT_ON_ATTRIBUTE_EX7_INC = 10142,
EF_UNIT_EXPERT = 10041,
EF_BELT_ON_PARAMETER_AMP = 10042, // 크리처 : 카드 스탯 : 증폭
EF_BELT_ON_ATTRIBUTE_AMP = 10043, // 크리처 : 카드 기본능력치 : 증폭
EF_BELT_ON_ATTRIBUTE_EX_AMP = 10044, // 크리처 : 카드 확장능력치 : 증폭
EF_BELT_ON_ATTRIBUTE_EX2_AMP = 10045, // 크리처 : 카드 확장능력치 : 증폭
EF_SUMMON_ITEM_EXPERT = 10046, // 크리처 : 아이템 성능 적용률 지정
EF_ADD_STATE_ON_ATTACK = 10048, // 공격 시 일정 확률로 지속 효과를 부가, 패시브.
EF_ADD_STATE_BY_SELF_ON_ATTACK = 10049, // 공격 시 일정 확률로 자신에게 지속 효과를 부가, 패시브.
EF_ADD_STATE_ON_BEING_ATTACKED = 10050, // 피격 시 일정 확률로 지속 효과를 부가, 패시브.
EF_ADD_STATE_BY_SELF_ON_BEING_ATTACKED = 10051, // 피격 시 일정 확률로 자신에게 지속 효과를 부가, 패시브.
EF_ADD_STATE_BY_SELF_ON_KILL = 10052, // 대상이 죽었을 경우 일정 확률로 자신에게 지속 효과를 부가, 패시브.
EF_ADD_STATE_ON_CRITICAL_ATTACK = 10053, // 크리티컬 공격 시 일정 확률로 지속 효과를 부가, 패시브.
EF_ADD_STATE_BY_SELF_ON_CRITICAL_ATTACK = 10054, // 크리티컬 공격 시 일정 확률로 자신에게 지속 효과를 부가, 패시브.
EF_ADD_STATE_ON_BEING_CRITICAL_ATTACKED = 10055, // 크리티컬 피격 시 일정 확률로 지속 효과를 부가, 패시브.
EF_ADD_STATE_BY_SELF_ON_BEING_CRITICAL_ATTACKED = 10056, // 크리티컬 피격 시 일정 확률로 자신에게 지속 효과를 부가, 패시브.
EF_ADD_STATE_ON_AVOID = 10057, // 회피 시 일정 확률로 지속 효과를 부가, 패시브.
EF_ADD_STATE_BY_SELF_ON_AVOID = 10058, // 회피 시 일정 확률로 자신에게 지속 효과를 부가, 패시브.
EF_ADD_STATE_ON_BLOCK = 10059, // 블럭 시 일정 확률로 지속 효과를 부가, 패시브.
EF_ADD_STATE_BY_SELF_ON_BLOCK = 10060, // 블럭 시 일정 확률로 자신에게 지속 효과를 부가, 패시브.
EF_ADD_STATE_ON_PERFECT_BLOCK = 10061, // 퍼펙트 블럭 시 일정 확률로 지속 효과를 부가, 패시브.
EF_ADD_STATE_BY_SELF_ON_PERFECT_BLOCK = 10062, // 퍼펙트 블럭 시 일정 확률로 자신에게 지속 효과를 부가, 패시브.
EF_ADD_ENERGY_ON_ATTACK = 32262, // 공격 시 기공 생성
EF_ADD_ENERGY_ON_BEING_ATTACKED = 32263, // 피격 시 기공 생성
EF_INC_SKILL_COOL_TIME_ON_ATTACK = 10063, // 공격 시 일정 확률로 지정된 스킬의 쿨타임을 증가
EF_INC_SKILL_COOL_TIME_ON_BEING_ATTACKED = 10064, // 피격 시 일정 확률로 지정된 스킬의 쿨타임을 증가
EF_INC_SKILL_COOL_TIME_ON_KILL = 10065, // 대상이 죽었을 경우 일정 확률로 지정된 스킬의 쿨타임을 증가
EF_INC_SKILL_COOL_TIME_ON_CRITICAL_ATTACK = 10066, // 크리티컬 공격 시 일정 확률로 지정된 스킬의 쿨타임을 증가
EF_INC_SKILL_COOL_TIME_ON_BEING_CRITICAL_ATTACKED = 10067, // 크리티컬 피격 시 일정 확률로 지정된 스킬의 쿨타임을 증가
EF_INC_SKILL_COOL_TIME_ON_AVOID = 10068, // 회피 시 일정 확률로 지정된 스킬의 쿨타임을 증가
EF_INC_SKILL_COOL_TIME_ON_BLOCK = 10069, // 블럭 시 일정 확률로 지정된 스킬의 쿨타임을 증가
EF_INC_SKILL_COOL_TIME_ON_PERFECT_BLOCK = 10070, // 퍼펙트 블럭 시 일정 확률로 지정된 스킬의 쿨타임을 증가
EF_INC_SKILL_COOL_TIME_ON_SKILL_OF_ID = 32281, // 특정 스킬 시전 시 일정 확률로 지정된 스킬의 쿨타임을 증가
// 3월 23일부터 신규 정리 유형(기존 유형 대체로 추가됨)
EF_PHYSICAL_SINGLE_DAMAGE = 30001, // 물리 공격
EF_PHYSICAL_SINGLE_DAMAGE_ABSORB = 30002, // 물리 공격: 흡수
EF_PHYSICAL_SINGLE_DAMAGE_ADD_ENERGY = 30003, // 물리 공격: 명중시 기공 생성
EF_PHYSICAL_SINGLE_DAMAGE_RUSH = 30004, // 물리 공격: 돌진
EF_PHYSICAL_SINGLE_DAMAGE_RUSH_KNOCKBACK = 30005, // 물리 공격: 돌진: 넉백
EF_PHYSICAL_SINGLE_DAMAGE_KNOCKBACK = 30006, // 물리 공격: 넉백
EF_PHYSICAL_SINGLE_REGION_DAMAGE_KNOCKBACK = 30007, // 물리 공격: 넉백: 타겟 중심 범위
EF_PHYSICAL_SINGLE_REGION_DAMAGE_KNOCKBACK_SELF = 30008, // 물리 공격: 넉백: 술자 중심 범위
EF_PHYSICAL_REALTIME_MULTIPLE_DAMAGE = 30009, // 물리 공격: 실시간 연타
EF_PHYSICAL_MULTIPLE_DAMAGE_TRIPLE_ATTACK = 30010, // 물리 공격: 한 방 연타 - 연타 횟수 3단계 적용
EF_PHYSICAL_SINGLE_REGION_DAMAGE = 30011, // 물리 공격: 타겟 중심 범위
EF_PHYSICAL_MULTIPLE_REGION_DAMAGE = 30012, // 물리 공격: 한 방 연타: 타겟 중심 범위
EF_PHYSICAL_SINGLE_SPECIAL_REGION_DAMAGE = 30013, // 물리 공격: 특수 범위
EF_PHYSICAL_MULTIPLE_SPECIAL_REGION_DAMAGE = 30014, // 물리 공격: 특수 범위: 한 방 연타: 타겟 중심 범위
EF_PHYSICAL_MULTIPLE_SPECIAL_REGION_DAMAGE_SELF = 30015, // 물리 공격: 특수 범위: 한 방 연타: 술자 중심 범위
EF_PHYSICAL_MULTIPLE_DAMAGE = 30016, // 물리 공격: 한 방 연타
EF_PHYSICAL_REALTIME_MULTIPLE_DAMAGE_KNOCKBACK = 30017, // 물리 공격: 실시간 연타: 마지막 타격시 넉백
EF_PHYSICAL_REALTIME_MULTIPLE_REGION_DAMAGE = 30018, // 물리 공격: 실시간 연타: 타겟 중심 범위
EF_PHYSICAL_SINGLE_DAMAGE_BY_CONSUMING_TARGETS_STATE = 30019, // 물리 공격: 특정 지속효과 부여시 발동
EF_PHYSICAL_SINGLE_REGION_DAMAGE_ADDING_MAGICAL_DAMAGE = 30020, // 물리 공격: 타겟 중심 범위: 마법공격력 추가
EF_PHYSICAL_SINGLE_REGION_DAMAGE_WITH_CAST_CANCEL = 30030, // 물리 공격: 타겟 중심 범위: 성공시 캐스팅 캔슬
EF_RESURRECTION_WITH_RECOVER = 30501, // 부활: HP, MP, EXP 복구
EF_REMOVE_STATE_GROUP = 30601, // 지속효과 그룹 제거
EF_LOTTO = 30701, // 루피 뻥튀기 스킬
EF_WEAPON_TRAINING = 31001, // 무기 수련: 증폭
EF_AMPLIFY_BASE_ATTRIBUTE_OLD = 31002, // 기본 능력치 증폭
EF_AMPLIFY_EXT_ATTRIBUTE = 31003, // 확장 능력치 증폭
EF_AMPLIFY_EXP_FOR_SUMMON = 32001, // 크리처 경험치 획득량 증폭
EF_ENHANCE_SKILL = 32011, // 강화 스킬
EF_MAGIC_SINGLE_DAMAGE_WITH_PHYSICAL_DAMAGE = 32021, // 1체 마법 공격 : 표준 + 물리 공격
// TODO : 작명 센스가 구리다. 조금 더 나은 이름을 찾자.
EF_INC_DAMAGE_BY_TARGET_STATE = 32031, // 공격 대상에게 걸려 있는 지속 효과 조건이 일치하면 입히는 피해량 증가
EF_AMP_DAMAGE_BY_TARGET_STATE = 32032, // 공격 대상에게 걸려 있는 지속 효과 조건이 일치하면 입히는 피해량 증폭
EF_TRANFER_HEALING = 32051, // 회복 주문 사용시 자신에게 일정 수치의 회복량 이전
EF_PHYSICAL_CHAIN_DAMAGE = 32061, // 연쇄 물리 공격
EF_MAGIC_CHAIN_DAMAGE = 32062, // 연쇄 마법 공격
EF_CHAIN_HEAL = 32063, // 연쇄 회복
EF_PHYSICAL_SINGLE_DAMAGE_DEMINISHED_HP_MP = 32141, // 물리 공격: 대상의 소모된 HP/MP에 비례하여 추가 데미지
EF_MODIFY_SKILL_COST = 32171, // 스킬 사용 소모 수치 감소
EF_RESIST_HARMFUL_STATE = 32183, // 해로운 지속효과에 대한 추가 저항
EF_INC_SKILL_COOL_TIME = 32191, // 재사용 시간 증감 (증가형)
EF_AMP_SKILL_COOL_TIME = 32192, // 재사용 시간 증감 (증폭형)
EF_INC_DAMAGE_INC_CRIT_RATE_BY_TARGET_HP_RATIO = 32201, // 입히는 피해량 증가/크리티컬 확률 증가 (생명력 % 조건)
EF_AMP_DAMAGE_INC_CRIT_RATE_BY_TARGET_HP_RATIO = 32202, // 입히는 피해량 증폭/크리티컬 확률 증가 (생명력 % 조건)
EF_ABSORB_DAMAGE = 32211, // 데미지의 일부를 HP/MP로 회복
EF_STEAL_HP_MP = 32212, // 적의 HP/MP의 일부를 스틸
EF_PHYSICAL_SINGLE_DAMAGE_PROP_REMAIN_MP = 32251, // 물리 공격: 자신의 남은 MP를 반영하여 추가 데미지 입힘
EF_REPLENISH_ENERGY_HP_MP = 32261, // 기공을 최대치로 충전하고 그에 비례하여 HP/MP 회복
EF_INCREASE_ENERGY_UNCONSUMPTION_RATE = 32264, // 일정 확률로 기공을 소모하지 않는다.
EF_INC_PARAM_AMPLIFY_HEAL = 32271, // 파라메터 증가 + 자신의 HP/MP 회복률 증폭
EF_AMP_PARAM_AMPLIFY_HEAL = 32272, // 파라메터 증폭 + 자신의 HP/MP 회복률 증폭
EF_INC_PARAM_BY_STATE = 32291, // 설정한 지속 효과 중 1개 이상 걸리면 파라메터 증가
EF_AMP_PARAM_BY_STATE = 32292, // 설정한 지속 효과 중 1개 이상 걸리면 파라메터 증폭
EF_INC_PARAM_BASED_PARAM = 32301, // 원본 비트셋 총합의 일정 비율만큼 파라미터 증가
EF_INC_SUMMON_PARAM_BASED_PARAM = 32302, // 아바타 원본 비트셋 총합의 일정 비율 만큼 크리처 파라미터 증가
EF_INC_SUMMON_PARAM_BASED_SUMMON_PARAM = 32303, // 크리처 원본 비트셋 총합의 일정 비율 만큼 크리처 파라미터 증가
EF_INC_PARAM_BASED_SUMMON_PARAM = 32304, // 크리처 원본 비트셋 총합의 일정 비율 만큼 아바타 파라미터 증가
};
enum // interrupt type
{
IT_ABSOLUTE = 0, // 방해, 캔슬을 당하지 않는 스킬
IT_DELAY = 1, // 캐스팅 방해를 받는 스킬
IT_CANCEL = 2, // 캐스팅캔슬을 당하는 스킬
};
enum // interrupt level
{
IL_LOW = 0, // 낮음 : 0.2초의 캐스팅 감소 혹은 20%의 확률로 캐스팅이 캔슬됨
IL_MEDIUM = 1, // 보통 : 0.5초의 캐스팅 감소 혹은 50%의 확률로 캐스팅이 캔슬됨
IL_HIGH = 2, // 높음 : 1초의 캐스팅 감소 혹은 100%의 확률로 캐스팅이 캔슬됨
};
enum // skill class/category
{
SC_PHYSICAL = 1,
SC_MAGICAL = 2,
SC_EVERY = 99,
};
enum
{
TF_ADD_STATE = 1 << 1,
};
enum
{
TARGET_MISC = 0,
TARGET_TARGET = 1,
TARGET_REGION_WITH_TARGET = 2,
TARGET_REGION_WITHOUT_TARGET = 3,
TARGET_REGION = 4,
TARGET_TARGET_EXCEPT_CASTER = 6,
TARGET_PARTY = 21,
TARGET_GUILD = 22,
TARGET_ATTACKTEAM = 23,
TARGET_SUMMON = 31,
TARGET_PARTY_SUMMON = 32,
TARGET_REGION_NEAR_MAIN_SUMMON_WITHOUT_TARGET = 44, // 메인 크리처 주변 범위(크리처 자신 제외)
TARGET_SELF_WITH_SUMMON = 45, // 자신과 자신의 크리처 모두
TARGET_PARTY_WITH_SUMMON = 51, // 파티원 전원 + 파티원 전원의 크리처
TARGET_MASTER = 101, // 자신의 소환자(소환수 전용)
TARGET_SELF_WITH_MASTER = 102, // 자신과 자신의 소환자(소환수 전용)
TARGET_CREATURE_TYPE_NONE = 201,
TARGET_CREATURE_TYPE_FIRE = 202,
TARGET_CREATURE_TYPE_WATER = 203,
TARGET_CREATURE_TYPE_WIND = 204,
TARGET_CREATURE_TYPE_EARTH = 205,
TARGET_CREATURE_TYPE_LIGHT = 206,
TARGET_CREATURE_TYPE_DARK = 207,
};
//사용가능/불가/강제 공격 처리
enum
{
USE_SELF = 0, //자신
USE_ALLY, //파티원
USE_GUILD, //길드원
USE_NEUTRAL, //중립
USE_PURPLE, //보라
USE_ENEMY, //적
};
enum
{
NEED_TARGET_SELF = 0,
NEED_TARGET_TARGET = 1,
NEED_TARGET_GROUND = 2,
};
enum
{
NEED_STATE_EXHAUSE_NONE = 0, // 스킬 시전 시 필요 지속효과, 소모하지 않음
NEED_STATE_EXHAUSE_ALL = 1, // 스킬 시전 시 필요 지속효과, 모두 소모
NEED_STATE_EXHAUSE_SPECIFIC = 2, // 스킬 시전 시 필요 지속효과, 필요 지속 레벨만큼만 소모
};
int GetID() const { return uid; }
int GetNameID() const { return name_id; }
bool IsValid() const { return is_valid != ST_INVALID; } //구현 여부
bool IsSystemSkill() const { return is_valid == ST_SYSTEM; } //귀환 스킬등, 존재하지만 스킬창에 보여지면 안 되는 것
bool IsPassive() const { return !is_active; } //패시브, 액티브 인가?
bool IsPhysicalSkill() const { return !is_spell_act; } //물리스킬, 마법 인가?
bool IsMagicalSkill() const { return !!is_spell_act; }
bool IsHarmful() const { return !!is_harmful; }
char IsNeedTarget() const { return is_need_target; }//타겟이 필요한가?
bool IsValidToCorpse() const { return !!is_corpse; } //시체가 필요한가?
bool IsToggle() const { return !!is_toggle; } //토글형 인가?
int GetCastRange() const { return cast_range; }
int GetValidRange() const { return valid_range; }
int GetCastCancelType() const { return cancel_type; }
int GetCastCancelLevel() const { return cancel_level; }
int GetToggleGroup() const { return toggle_group; }
int GetSkillTargetType() const { return target; }
int GetSkillEffectType() const { return effect_type; }
int GetElementalType() const { return elemental; }
bool CheckEffectType( int nFlag ) const { return !!(effect_flag & nFlag); }
bool IsNeedShield() const { return !!vf_shield_only; }
bool IsNeedWeapon() const { return !vf_is_not_need_weapon; }
bool IsUseableWeapon( ItemBase::ItemClass c ) const
{
switch( c )
{
case ItemBase::CLASS_ONEHAND_SWORD : if( vf_one_hand_sword ) return true; break;
case ItemBase::CLASS_TWOHAND_SWORD : if( vf_two_hand_sword ) return true; break;
case ItemBase::CLASS_DOUBLE_DAGGER : if( vf_double_dagger ) return true; break;
case ItemBase::CLASS_DOUBLE_SWORD : if( vf_double_sword ) return true; break;
case ItemBase::CLASS_DAGGER : if( vf_dagger ) return true; break;
case ItemBase::CLASS_TWOHAND_SPEAR : if( vf_spear ) return true; break;
case ItemBase::CLASS_TWOHAND_AXE : if( vf_axe ) return true; break;
case ItemBase::CLASS_ONEHAND_AXE : if( vf_one_hand_axe ) return true; break;
case ItemBase::CLASS_DOUBLE_AXE : if( vf_double_axe ) return true; break;
case ItemBase::CLASS_ONEHAND_MACE : if( vf_one_hand_mace ) return true; break;
case ItemBase::CLASS_TWOHAND_MACE : if( vf_two_hand_mace ) return true; break;
case ItemBase::CLASS_LIGHT_BOW : if( vf_lightbow ) return true; break;
case ItemBase::CLASS_HEAVY_BOW : if( vf_heavybow ) return true; break;
case ItemBase::CLASS_CROSSBOW : if( vf_crossbow ) return true; break;
<<<<<<< HEAD
case ItemBase::CLASS_ONEHAND_STAFF : if( vf_one_hand_staff ) return true; break;
case ItemBase::CLASS_TWOHAND_STAFF : if( vf_two_hand_staff ) return true; break;
case ItemBase::CLASS_SHIELD : if( vf_shield_only ) return true; break;
case ItemBase::CLASS_DOUBLE_CROSSBOW: if (vf_crossbow) return true; break; // Double Crossbow
=======
// AziaMafia Double Arba
//case ItemBase::CLASS_DOUBLE_CROSSBOW: if (vf_crossbow) return true; break;
case ItemBase::CLASS_ONEHAND_STAFF : if( vf_one_hand_staff ) return true; break;
case ItemBase::CLASS_TWOHAND_STAFF : if( vf_two_hand_staff ) return true; break;
case ItemBase::CLASS_SHIELD : if( vf_shield_only ) return true; break;
// From ZONE source; dual crossbows
case ItemBase::CLASS_DOUBLE_CROSSBOW: if( vf_crossbow ) return true; break; // ZONE DOUBLE CROSSBOW USING VF_CROSSBOW skill_db
>>>>>>> a34328224e914a577b99c79ec6e8ffbcea554a05
default: return false;
}
return false;
}
bool IsUseableOnAvatar() const { return !!tf_avatar; }
bool IsUseableOnMonster() const { return !!tf_monster; }
bool IsUseableOnSummon() const { return !!tf_summon; }
bool IsLimitedAddedSkill() const { return !!skill_lvup_limit; }
int GetCoolTimeGroupId() const { return cool_time_group_id; }
int GetProbabilityOnHit( int slv ) const { return probability_on_hit + slv * probability_inc_by_slv; }
int GetStateId() const { return state_id; }
int GetStateLevel( int skill_lv, int enhance_lv ) const { return state_level_base + int( state_level_per_skl*skill_lv ) + int(state_level_per_enhance*enhance_lv); }
int GetStateSecond( int skill_lv, int enhance_lv ) const { return int( state_second+state_second_per_skl*(skill_lv) ) + int(state_second_per_enhance*enhance_lv); }
int GetCostEXP( int skill_lv, int enhance ) const { return cost_exp + cost_exp_per_enhance*enhance; }
int GetCostJP( int skill_lv, int enhance ) const { return cost_jp + cost_jp_per_enhance*enhance; }
int GetCostItemCode() const { return cost_item; }
const __int64 GetCostItemCount( int skill_lv ) const { return cost_item_count + ( skill_lv * cost_item_count_per_skl ); }
int GetCostHP( int skill_lv ) const { return cost_hp + cost_hp_per_skl*(skill_lv); }
float GetCostHPPercent( int skill_lv ) const { return cost_hp_per + cost_hp_per_skl_per * skill_lv; }
int GetCostMP( int skill_lv, int enhance ) const { return cost_mp + cost_mp_per_skl*(skill_lv) + cost_mp_per_enhance*(enhance); }
float GetCostMPPercent( int skill_lv ) const { return cost_mp_per + cost_mp_per_skl_per * skill_lv; }
c_fixed10 GetCostEnergy( int skill_lv ) const
{
c_fixed10 result = cost_energy + cost_energy_per_skl*(skill_lv);
if( result > GameRule::ENERGY_MAX ) result = GameRule::ENERGY_MAX;
return result;
}
int GetNeedLevel() const { return need_level; }
int GetNeedHP() const { return need_hp; }
int GetNeedMP() const { return need_mp; }
AR_UNIT GetFireRange() const { return AR_UNIT(valid_range * GameRule::DEFAULT_UNIT_SIZE); }
AR_TIME GetCoolTime( int skill_lv, int enhance ) const { return AR_TIME( GetCoolTimeAsFloat( skill_lv, enhance ) * 100.0f ); }
AR_TIME GetCommonDelay() const { return AR_TIME( GetCommonDelayAsFloat() * 100.0f ); }
AR_TIME GetCastDelay( int skill_lv, int enhance ) const { return AR_TIME( GetCastDelayAsFloat( skill_lv, enhance ) * 100.0f ); }
float GetCoolTimeAsFloat( int skill_lv, int enhance ) const {if( GameRule::bIgnoreSkillCoolTime ) return 0; return delay_cooltime * ( delay_cooltime_mod_per_enhance * enhance + 1.0f ) + delay_cooltime_per_skl * skill_lv; }
float GetCommonDelayAsFloat() const { return delay_common < 0.0f ? 0.0f : delay_common; }
float GetCastDelayAsFloat( int skill_lv, int enhance ) const { return ( delay_cast + delay_cast_per_skl * (skill_lv) ) * ( delay_cast_mod_per_enhance * enhance + 1.0f ); }
int GetHitBonus( int enhance, int level_diff ) const { return hit_bonus + enhance * hit_bonus_enhace + level_diff * percentage; }
c_fixed10 GetVar( int idx ) const { return var[idx]; }
c_fixed10 GetVar1() const { return var[0]; }
c_fixed10 GetVar2() const { return var[1]; }
c_fixed10 GetVar3() const { return var[2]; }
c_fixed10 GetVar4() const { return var[3]; }
int GetHateMod() const { return int(hate_mod); }
int GetCriticalBonus( int skill_lv ) const { return critical_bonus + critical_bonus_per_skl * skill_lv; }
// 강화 단계에 따른 수치 ========================
// 카드/스킬 공통
// MP 소모
// 캐스팅 증가율
int GetCastDelayByEnhance( int nEnhance ) const { return static_cast<int>( delay_cast_mod_per_enhance * 100.f ) * nEnhance; }
// ===================
// 공격력 증가(물리)
int GetPowerByEnhance( int nEnhance ) const { return static_cast<int>( nEnhance * var[4] ); };
// 공격력 증가(물리 1타)
int GetPowerOneByEnhance( int nEnhance ) const { return static_cast<int>( nEnhance * var[5] ); };
// 공격력 증가(물리 방향)
int GetPowerDirectByEnhance( int nEnhance ) const { return static_cast<int>( nEnhance * var[5] ); };
// 공격력 증가(마법)
int GetMagicByEnhance( int nEnhance ) const { return static_cast<int>( nEnhance * var[2] ); };
// 공격력 증가(마법 1타)
int GetMagicOneByEnhance( int nEnhance ) const { return static_cast<int>( nEnhance * var[5] ); };
// 공격력 증가(마법 방향)
int GetMagicAreaByEnhance( int nEnhance ) const { return static_cast<int>( nEnhance * var[4] ); };
// 흡수율 HP
int GetAbsorptionHPByEnhance( int nEnhance ) const { return static_cast<int>( var[4] * 100.f ) * nEnhance; };
// 흡수율 MP
int GetAbsorptionMPByEnhance( int nEnhance ) const { return static_cast<int>( var[5] * 100.f ) * nEnhance; };
// 마법 흡수율 HP
int GetMagicAbsorptionHPByEnhance( int nEnhance ) const { return static_cast<int>( var[4] * 100.f ) * nEnhance; };
// 마법 흡수율 MP
int GetMagicAbsorptionMPByEnhance( int nEnhance ) const { return static_cast<int>( var[5] * 100.f ) * nEnhance; };
// 공격력 증폭(물리)
int GetIncreaseByEnhance( int nEnhance ) const { return static_cast<int>( var[4] * 100.f ) * nEnhance; };
// 공격력 증폭(물리 1타)
int GetIncreaseOneByEnhance( int nEnhance ) const { return static_cast<int>( var[5] * 100.f ) * nEnhance; };
// 지속효과 성공률(물리 저주 계열)
int GetStateSuccessByEnhance( int nEnhance ) const { return static_cast<int>( nEnhance * var[5] ); };
// 지속효과 연타 공격력 강화
int GetStatePowerOneByEnhance( int nEnhance ) const { return static_cast<int>( nEnhance * var[7] ); };
// 지속효과 마법 공격력 강화
int GetStateMagicPowerByEnhance( int nEnhance ) const { return static_cast<int>( nEnhance * var[2] ); };
// 버프/디버프 성능
int GetStatePowerByEnhance( int nEnhance ) const { return static_cast<int>( nEnhance * var[2] ); };
// 획복량/회복률
int GetRecoveryByEnhance( int nEnhance ) const { return static_cast<int>( nEnhance * var[6] ); };
int GetRecoveryPerByEnhance( int nEnhance ) const { return static_cast<int>( var[7] * 100.f ) * nEnhance; };
// 부활시 EXP 복구률
int GetExpIncreaseByRevival( int nEnhance ) const { return static_cast<int>( var[3] * 100.f ) * nEnhance; };
// HP 흡수량
int GetAbsorptionHPPointByEnhance( int nEnhance ) const { return static_cast<int>( nEnhance * var[4] ); };
// MP 흡수량
int GetAbsorptionMPPointByEnhance( int nEnhance ) const { return static_cast<int>( nEnhance * var[5] ); };
// 테이밍 성공률
int GetTamingSuccessByEnhance( int nEnhance ) const { return static_cast<int>( var[1] * 100.f ) * nEnhance; };
// 초당 mp 소모
int GetCostMPPerSecondByEnhance( int nEnhance ) const { return static_cast<int>( nEnhance * var[2] ); };
// ==============================================
int GetNeedStateId() const { return need_state_id; }
unsigned char GetNeedStateLevel() const { return need_state_level; }
char NeedStateExhaust() const { return need_state_exhaust; }
int GetNeedJobPoint( int skill_lv ) const
{
if( skill_lv > MAX_SKILL_LEVEL )
skill_lv = MAX_SKILL_LEVEL;
int jp = need_jp[ skill_lv - 1 ];
if( jp < 0 ) jp = 0;
return jp;
}
int GetNeedTalentPoint( int skill_lv ) const
{
if( skill_lv > MAX_SKILL_LEVEL )
skill_lv = MAX_SKILL_LEVEL;
int tp = need_jp[ skill_lv - 1 ];
if( tp > 0 ) tp = 0;
return -tp;
}
void SetNeedJobPoint( int skill_lv, int jp )
{
if( skill_lv > MAX_SKILL_LEVEL ) return;
need_jp[ skill_lv - 1 ] = jp;
}
//사용가능/불가/강제 공격 처리 - 가져다 쓰는게 애매하다..
char IsUsable( char nUseIndex ) const
{
switch( nUseIndex )
{
case USE_SELF : return uf_self; //자신
case USE_ALLY : return uf_party; //파티원
case USE_GUILD : return uf_guild; //길드원
case USE_NEUTRAL : return uf_neutral; //중립
case USE_PURPLE : return uf_purple; //보라
case USE_ENEMY : return uf_enemy; //적
}
return 0; //사용 원천 불가
}
// 효과 타입
int GetEffectType() const { return effect_type; }
int GetEnhancedSkillId() const { return skill_enchant_link_id; }
// 헤이트 비율
int GetHatePoint( int lv, int point, int enhance ) const
{
// -1 : 데미지와 무관하게 일정값이 적용 ([헤이트], [SLv:헤이트] 수치로 적용)
// 0 : 헤이트 부가 안함
// 0 : 데미지, 힐량과 비례하여 값을 비율로 적용 (부가할 헤이트 = 데미지 * [헤이트비율]) (옆의 두 값은 무시한다)
if( hate_mod == 0 ) return 0;
if( hate_mod < 0 ) return (int)( hate_basic + lv * hate_slv + enhance * hate_enhance );
return (int)( hate_basic + point * hate_mod );
}
protected:
int uid; // id
int name_id;
char is_valid; // 구현 여부
char elemental; // 무속성 0 화속성 1 수속성 2 풍속성 3 토속성 4 명속성 5 암속성 6
char is_active; // 액티브 스킬이면 1
char is_spell_act; // 전투기술이면 0, 마법이면 1
char is_harmful; // 피해를 주는 스킬이면 1
char is_need_target; // 셀프0 타겟1 지면2
char is_corpse; // 시체에게 사용가능?
char is_toggle; // 토글형 스킬?
char cancel_type; // 캐스팅 캔슬 타입
char cancel_level; // 캐스팅 캔슬 위험도
int toggle_group; // 토글 그룹
int cast_range; // 캐스트 가능 거리
int valid_range; // 유효 적용 거리, 캐스트 시전중 타겟과의 거리가 valid_range 보다 커지면, 시전 취소
int cost_exp;
int cost_exp_per_enhance;
int cost_jp;
int cost_jp_per_enhance;
int cost_hp;
int cost_hp_per_skl;
int cost_mp; // mp
int cost_mp_per_skl; // 스킬레벨당 mp
int cost_mp_per_enhance; // 스킬레벨당 mp
float cost_hp_per; // 소모 hp(퍼센트)
float cost_hp_per_skl_per; // 스킬 렙당 소모 hp(퍼센트)
float cost_mp_per; // 소모 mp(퍼센트)
float cost_mp_per_skl_per; // 스킬 렙당 소모 mp(퍼센트)
c_fixed10 cost_energy;
c_fixed10 cost_energy_per_skl;
int cost_item;
int cost_item_count;
int cost_item_count_per_skl;
int need_level;
int need_hp;
int need_mp;
int need_state_id;
unsigned char need_state_level;
char need_state_exhaust;
char vf_one_hand_sword;
char vf_two_hand_sword;
char vf_double_sword;
char vf_dagger;
char vf_double_dagger;
char vf_spear;
char vf_axe;
char vf_one_hand_axe;
char vf_double_axe;
char vf_one_hand_mace;
char vf_two_hand_mace;
char vf_lightbow;
char vf_heavybow;
char vf_crossbow;
char vf_one_hand_staff;
char vf_two_hand_staff;
char vf_shield_only;
char vf_is_not_need_weapon;
float delay_cast;
float delay_cast_per_skl;
float delay_cast_mod_per_enhance;
float delay_common;
float delay_cooltime;
float delay_cooltime_per_skl;
float delay_cooltime_mod_per_enhance;
// 자신 파티원 길드원 중립 보라 적 아바타 소환수 몬스터
int cool_time_group_id;
char uf_self;
char uf_party;
char uf_guild;
char uf_neutral;
char uf_purple;
char uf_enemy;
char tf_avatar;
char tf_summon;
char tf_monster;
char skill_lvup_limit;
short target;
short effect_type; // 효과 타임
int skill_enchant_link_id; // 강화 스킬 id
int state_id;
int state_level_base;
float state_level_per_skl;
float state_level_per_enhance;
AR_TIME state_second;
AR_TIME state_second_per_skl;
AR_TIME state_second_per_enhance;
int probability_on_hit;
int probability_inc_by_slv;
short hit_bonus;
short hit_bonus_enhace;
short percentage;
float hate_mod;
int hate_basic;
float hate_slv;
float hate_enhance;
int critical_bonus; // 크리율 증가
int critical_bonus_per_skl; // 레벨당 크리율 증가
c_fixed10 var[MAX_SKILL_VALUE];
int need_jp[ MAX_SKILL_LEVEL ];
char effect_flag;
char is_projectile;
float projectile_speed;
float projectile_acceleration;
};
struct SkillTree
{
int skill_tree_id ; // 스킬 트리 아이디
int skill_id ; // 스킬아이디
int skill_group_id ; // SummonRandomSkillResource SID
int min_skill_lv ; // 필요 스킬 조건이 적용될 스킬 최소 레벨(전직 후 중첩 조건 발생 방지)
int max_skill_lv ; // 스킬 맥스 레벨
int lv ; // 스킬 학습 레벨
int job_lv ; // 스킬 학습 직업 레벨
float jp_ratio ; // 스킬 JP 소모 비율
int need_skill_id[3] ; // 필요 스킬 아이디
int need_skill_lv[3] ; // 필요 스킬 레벨
int min_enhance ; // 필요 강화 최소치
int max_enhance ; // 필요 강화 최대치
};
#pragma pack( 1 )
// 스킬 사용 결과
struct SkillResult
{
enum
{
// type
DAMAGE = 0,
MAGIC_DAMAGE = 1,
DAMAGE_WITH_KNOCK_BACK = 2,
RESULT = 10,
ADD_HP = 20, // HP가 소모될 때도 사용
ADD_MP = 21, // MP가 소모될 때도 사용
ADD_HP_MP_SP = 22,
REBIRTH = 23,
RUSH = 30,
CHAIN_DAMAGE = 40,
CHAIN_MAGIC_DAMAGE = 41,
CHAIN_HEAL = 42,
NOT_USE = 100,
};
enum
{
// ResultType의 SuccessType
ADD_STATE = 10,
REMOVE_STATE = 11,
ADD_HATE = 12,
TURN_ON = 21,
TURN_OFF = 22,
SUMMON_DEAD = 30,
TARGET_DEAD = 31,
CREATE_ITEM = 40,
RESPAWN_MONSTER = 41,
};
enum
{
// DamageType의 flag
CRITICAL = ( 1 << 0 ),
MISS = ( 1 << 1 ),
BLOCK = ( 1 << 2 ),
PERFECT_BLOCK = ( 1 << 3 ),
};
int GetType() const { return damage.type; }
AR_HANDLE GetTargetHandle() const { return damage.hTarget; }
int GetDamage() const { return damage.damage; }
struct DamageType
{
unsigned char type;
AR_HANDLE hTarget;
int target_hp;
char damage_type;
int damage;
int flag;
unsigned short elemental_damage[ Elemental::TYPE_COUNT ];
};
struct DamageWithKnockBackType
{
unsigned char type;
AR_HANDLE hTarget;
int target_hp;
char damage_type;
int damage;
int flag;
unsigned short elemental_damage[ Elemental::TYPE_COUNT ];
AR_UNIT x, y;
unsigned char speed;
AR_TIME knock_back_time;
};
struct ResultType
{
unsigned char type;
AR_HANDLE hTarget;
//int target_hp;
bool bResult;
int success_type;
};
struct AddHPType // Add MP 도 동일하게 사용
{
unsigned char type;
AR_HANDLE hTarget;
int target_hp;
int nIncHP;
};
struct AddHPMPSPType
{
unsigned char type;
AR_HANDLE hTarget;
int target_hp;
int nIncHP;
int nIncMP;
int nIncSP;
int target_mp;
};
struct RushType
{
unsigned char type;
AR_HANDLE hTarget;
//int target_hp;
bool bResult;
AR_UNIT x, y;
float face;
unsigned char speed;
};
struct RebirthType
{
unsigned char type;
AR_HANDLE hTarget;
int target_hp;
int nIncHP;
int nIncMP;
int nRecoveryEXP;
short target_mp;
};
struct ChainDamageType
{
unsigned char type;
AR_HANDLE hTarget;
int target_hp;
char damage_type;
int damage;
int flag;
unsigned short elemental_damage[ Elemental::TYPE_COUNT ];
AR_HANDLE hFrom;
};
struct ChainHealType
{
unsigned char type;
AR_HANDLE hTarget;
int target_hp;
int nIncHP;
AR_HANDLE hFrom;
};
// 서버에서 공용으로 사용하기 위한 데이터
union
{
DamageType damage;
DamageWithKnockBackType damage_kb;
ResultType result;
AddHPType add_hp;
AddHPMPSPType add_hp_mp_sp;
RushType rush;
RebirthType rebirth;
ChainDamageType chain_damage;
ChainHealType chain_heal;
};
SkillResult()
{
memset( this, 0, sizeof( *this ) );
}
};
struct ATTACK_INFO
{
short damage; // -1 이면 MISS, -2 면 failed, -3이면 너무 멀리 떨어져 있음, -4면 너무 빨리 공격했음 (스핵?)
unsigned char flag;
unsigned short elemental_damage[ Elemental::TYPE_COUNT ]; // 추가데미지
unsigned char hp_percentage; // HP %
ATTACK_INFO()
{
damage = 0; // -1 이면 MISS, -2 면 failed, -3이면 너무 멀리 떨어져 있음, -4면 너무 빨리 공격했음 (스핵?)
flag = 0;
memset( elemental_damage, 0, sizeof( elemental_damage ) );
hp_percentage = 0;
}
};
#pragma pack()