#ifndef __PROGRAMCOMMON_SKILL_ATTR_CALCULATOR_H #define __PROGRAMCOMMON_SKILL_ATTR_CALCULATOR_H #pragma once #include #include class SCItemSlot; class Player; //================================================================================================== namespace nsSkill { ; // NOTE: f110808.5L, adrenaline configuration struct AdrenalineConfiguration { #define ADRENALINE_ATTR_OFFSET(_attr_type_) eOFFSET_##_attr_type_ enum { ADRENALINE_ATTR_OFFSET(eATTR_BASE_MELEE_MIN_ATTACK_POWER), ADRENALINE_ATTR_OFFSET(eATTR_BASE_MELEE_MAX_ATTACK_POWER), ADRENALINE_ATTR_OFFSET(eATTR_BASE_RANGE_MIN_ATTACK_POWER), ADRENALINE_ATTR_OFFSET(eATTR_BASE_RANGE_MAX_ATTACK_POWER), //#if !defined(_NA001605_EP2_ATTRIBUTES_RENEWAL_) // eATTR_BASE_MAGICAL_MIN_ATTACK_POWER, eATTR_BASE_MAGICAL_MAX_ATTACK_POWER, // eATTR_BASE_MAGICAL_DEFENSE_POWER, //#endif // ADRENALINE_ATTR_OFFSET(eATTR_BASE_MELEE_DEFENSE_POWER), ADRENALINE_ATTR_OFFSET(eATTR_BASE_RANGE_DEFENSE_POWER), // ADRENALINE_ATTR_OFFSET(eATTR_MOVE_SPEED), ADRENALINE_ATTR_OFFSET(eATTR_ATTACK_SPEED), ADRENALINE_ATTR_OFFSET(eATTR_PHYSICAL_ATTACK_SUCCESS_RATIO), ADRENALINE_ATTR_OFFSET(eATTR_MAX_HP), // MaxCounts }; #undef ADRENALINE_ATTR_OFFSET // static const Attributes::Operation kSkillAttrTypeArray[MaxCounts]; int skill_attr_values[MaxCounts]; }; // }; //end of namespace //================================================================================================== class SkillAttrCalculator { public: SkillAttrCalculator(Attributes& attributes) : attributes_(attributes) {} virtual ~SkillAttrCalculator() {} // (f100812.2L) add an interface to support external module can access add rule filter static bool IsPassedAddAttr(eATTR_TYPE attr_type); static void ModifyAttrKindAndCalculatedValue(uint8_t value_type, //eVALUE_TYPE uint8_t* attr_kind, //eATTR_KIND int * value); // eVALUE_TYPE float AddAttr(eATTR_TYPE attr_type, int value_type, int value, bool skip_update = false); float DelAttr(eATTR_TYPE attr_type, int value_type, int value, bool skip_update = false); #ifdef _NA_008220_20150414_BUG_ETHERBULLET_ATTR // ¿¡Å׸£ÅºÈ¯ µ©Áõ·ü °»½ÅÀ» À§ÇÑ ÇÔ¼ö // ÀÌ ÇÔ¼ö´Â Attr ¼³°è¿¡ ¸Å¿ì ºÎÀûÀýÇÑ ÇÔ¼ö // ƯÁ¤ ¸ñÀû¿¡ ÀÇÇØ¼­¸¸ »ç¿ëµÇµµ·Ï ÇÑ´Ù. //ƯÁ¤ AttrÀÇ ¼öÄ¡¸¦ 0À¸·Î ¼¼ÆÃÇÑ´Ù float ClearAttr(eATTR_TYPE attr_type, int value_type, bool skip_update = false); #endif //_NA_008220_20150414_BUG_ETHERBULLET_ATTR void Clear(); int ApplyDragonFormation(BOOL bApply, SLOTCODE skill_code, DWORD cur_hp = 0); // NOTE: f110808.5L, adrenaline configuration static bool GetCurrentAdrenalineConfiguration( nsSkill::AdrenalineConfiguration* const adrenaline_data, SLOTCODE skill_code, const Attributes& summoner_attr); #if SUN_CODE_RENEWAL // CHANGES: f110808.5L, prevent the overlapped attribute calculation bool ApplyAdrenaline(bool applied, SLOTCODE skill_code, const nsSkill::AdrenalineConfiguration& adrenaline_data); #else bool ApplyAdrenaline(BOOL bApply, SLOTCODE skill_code, const Attributes& summoner_attr); #endif // (arguments) // total_apply_x8bits : 0 - add apply rider option // 1 - sub apply rider option // 2~4 - add apply parts option // 5~7 - sub apply parts option bool ApplyRidingRider(bool is_apply, BOOL is_pc_room, const SCItemSlot& rider_item, const nsSlot::RiderUpdateBits& total_apply_x8bits); private: // attr_type filteringÀº È£Ãâ Àü¿¡ ¼öÇàÇÒ °Í + eATTR_INCREASE_STAT_POINTÀº È£ÃâÇÏÁö ¸» °Í // (WARNING) no-update function inline void _CalcAttrValue(bool is_add, AttrValue& attr_value, int value_type, int value); bool _CanApplyRiderOption(eATTR_TYPE attr_type) const; private: bool IsRecoverAttr(eATTR_TYPE attr_type); // Add¸¦ ÇÑ ´ÙÀ½¿¡ ´Ù½Ã Del(º¹±Í)¸¦ ÇÏ´Â ¼Ó¼ºÀΰ¡ protected: Attributes& attributes_; // __DISABLE_COPY(SkillAttrCalculator); }; // (f100812.2L) add an interface to support external module can access add rule filter inline bool SkillAttrCalculator::IsPassedAddAttr(eATTR_TYPE attr_type) { // °ø°Ý·Â, ¹æ¾î·ÂÀº Option ¼öÄ¡¸¦ º¯°æÇÒ »Ó Base ¼öÄ¡¸¦ º¯°æÇÏÁö´Â ¾Ê´Â´Ù! if (attr_type == eATTR_BASE_MELEE_MIN_ATTACK_POWER || attr_type == eATTR_BASE_RANGE_MIN_ATTACK_POWER || #if !defined(_NA001605_EP2_ATTRIBUTES_RENEWAL_) attr_type == eATTR_BASE_MAGICAL_MIN_ATTACK_POWER || attr_type == eATTR_BASE_MAGICAL_DEFENSE_POWER || #endif attr_type == eATTR_BASE_MELEE_DEFENSE_POWER || attr_type == eATTR_BASE_RANGE_DEFENSE_POWER) { return false; } return true; } // (CHANGES) (WAVERIX) move to header inline bool SkillAttrCalculator::IsRecoverAttr(eATTR_TYPE attr_type) { if (attr_type == eATTR_CUR_HP || attr_type == eATTR_CUR_MP) { return false; } else { return true; } } // (NOTE) StatÀÇ º¯È­´Â ÀåºñÀÇ ÀåÂø °ü·Ã ¹®Á¦¿¡ Áöµ¶ÇÏ°Ô ÀÇÁ¸µÇ¾î ÀÖ´Ù. (SetOptionÆ÷ÇÔ) // µû¶ó¼­ ¹®Á¦°ø°£À» ÃÖ´ëÇÑ ÁÙÀ̱â À§Çؼ­´Â StatÀÇ º¯È­´Â ¾øµµ·Ï ÇÏ´Â ÂÊÀÌ Àý´ë ¾ÈÀüÇÏ´Ù. // ±âȹ°ú ÇùÀÇÇÒ ÇÊ¿ä ÀÖÁö¸¸, Rider|Parts°è¿­ÀÌ StatÀÇ º¯È­¸¦ ÀÏÀ¸Å°Áö ¾Ê´Â ÂÊÀº µ¿ÀÇÇϸ®¶ó »ý°¢ÇÑ´Ù. inline bool SkillAttrCalculator::_CanApplyRiderOption(eATTR_TYPE attr_type) const { switch (attr_type) { case eATTR_STR: // ÈûÃß°¡ case eATTR_DEX: // ¹ÎøÃß°¡ case eATTR_INT: // Áö·ÂÃß°¡ case eATTR_VIT: // ü·ÂÃß°¡ case eATTR_SPR: // Á¤½Å·ÂÃß°¡ case eATTR_INCREASE_STAT_POINT: return false; } return true; } #endif //__PROGRAMCOMMON_SKILL_ATTR_CALCULATOR_H