#pragma once #include #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( delay_cast_mod_per_enhance * 100.f ) * nEnhance; } // =================== // 공격력 증가(물리) int GetPowerByEnhance( int nEnhance ) const { return static_cast( nEnhance * var[4] ); }; // 공격력 증가(물리 1타) int GetPowerOneByEnhance( int nEnhance ) const { return static_cast( nEnhance * var[5] ); }; // 공격력 증가(물리 방향) int GetPowerDirectByEnhance( int nEnhance ) const { return static_cast( nEnhance * var[5] ); }; // 공격력 증가(마법) int GetMagicByEnhance( int nEnhance ) const { return static_cast( nEnhance * var[2] ); }; // 공격력 증가(마법 1타) int GetMagicOneByEnhance( int nEnhance ) const { return static_cast( nEnhance * var[5] ); }; // 공격력 증가(마법 방향) int GetMagicAreaByEnhance( int nEnhance ) const { return static_cast( nEnhance * var[4] ); }; // 흡수율 HP int GetAbsorptionHPByEnhance( int nEnhance ) const { return static_cast( var[4] * 100.f ) * nEnhance; }; // 흡수율 MP int GetAbsorptionMPByEnhance( int nEnhance ) const { return static_cast( var[5] * 100.f ) * nEnhance; }; // 마법 흡수율 HP int GetMagicAbsorptionHPByEnhance( int nEnhance ) const { return static_cast( var[4] * 100.f ) * nEnhance; }; // 마법 흡수율 MP int GetMagicAbsorptionMPByEnhance( int nEnhance ) const { return static_cast( var[5] * 100.f ) * nEnhance; }; // 공격력 증폭(물리) int GetIncreaseByEnhance( int nEnhance ) const { return static_cast( var[4] * 100.f ) * nEnhance; }; // 공격력 증폭(물리 1타) int GetIncreaseOneByEnhance( int nEnhance ) const { return static_cast( var[5] * 100.f ) * nEnhance; }; // 지속효과 성공률(물리 저주 계열) int GetStateSuccessByEnhance( int nEnhance ) const { return static_cast( nEnhance * var[5] ); }; // 지속효과 연타 공격력 강화 int GetStatePowerOneByEnhance( int nEnhance ) const { return static_cast( nEnhance * var[7] ); }; // 지속효과 마법 공격력 강화 int GetStateMagicPowerByEnhance( int nEnhance ) const { return static_cast( nEnhance * var[2] ); }; // 버프/디버프 성능 int GetStatePowerByEnhance( int nEnhance ) const { return static_cast( nEnhance * var[2] ); }; // 획복량/회복률 int GetRecoveryByEnhance( int nEnhance ) const { return static_cast( nEnhance * var[6] ); }; int GetRecoveryPerByEnhance( int nEnhance ) const { return static_cast( var[7] * 100.f ) * nEnhance; }; // 부활시 EXP 복구률 int GetExpIncreaseByRevival( int nEnhance ) const { return static_cast( var[3] * 100.f ) * nEnhance; }; // HP 흡수량 int GetAbsorptionHPPointByEnhance( int nEnhance ) const { return static_cast( nEnhance * var[4] ); }; // MP 흡수량 int GetAbsorptionMPPointByEnhance( int nEnhance ) const { return static_cast( nEnhance * var[5] ); }; // 테이밍 성공률 int GetTamingSuccessByEnhance( int nEnhance ) const { return static_cast( var[1] * 100.f ) * nEnhance; }; // 초당 mp 소모 int GetCostMPPerSecondByEnhance( int nEnhance ) const { return static_cast( 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()