diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 3d4eb29329..5cf2824383 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -4944,12 +4944,9 @@ static void battle_attack_sc_bonus(struct Damage* wd, struct block_list *src, st } if ((wd->flag&(BF_LONG|BF_MAGIC)) == BF_LONG) { - if (sd && pc_checkskill(sd, SU_POWEROFLIFE) > 0) { - if ((pc_checkskill(sd, SU_SCAROFTAROU) + pc_checkskill(sd, SU_PICKYPECK) + pc_checkskill(sd, SU_ARCLOUSEDASH) + pc_checkskill(sd, SU_LUNATICCARROTBEAT) + - pc_checkskill(sd, SU_HISS) + pc_checkskill(sd, SU_POWEROFFLOCK) + pc_checkskill(sd, SU_SVG_SPIRIT)) > 19) { - ATK_ADDRATE(wd->damage, wd->damage2, 20); - RE_ALLATK_ADDRATE(wd, 20); - } + if (sd && pc_checkskill(sd, SU_POWEROFLIFE) > 0 && pc_checkskill_summoner(sd, SUMMONER_POWER_LIFE) >= 20) { + ATK_ADDRATE(wd->damage, wd->damage2, 20); + RE_ALLATK_ADDRATE(wd, 20); } } diff --git a/src/map/pc.cpp b/src/map/pc.cpp index 433ed91783..604bd0c52c 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -4541,7 +4541,7 @@ bool pc_skill(struct map_session_data* sd, uint16 skill_id, int level, enum e_ad clif_deleteskill(sd,skill_id); } else clif_addskill(sd,skill_id); - if (!skill_get_inf(skill_id)) //Only recalculate for passive skills. + if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills. status_calc_pc(sd, SCO_NONE); break; @@ -4578,7 +4578,7 @@ bool pc_skill(struct map_session_data* sd, uint16 skill_id, int level, enum e_ad clif_deleteskill(sd,skill_id); } else clif_addskill(sd,skill_id); - if (!skill_get_inf(skill_id)) //Only recalculate for passive skills. + if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills. status_calc_pc(sd, SCO_NONE); break; @@ -6232,6 +6232,36 @@ uint8 pc_checkskill(struct map_session_data *sd, uint16 skill_id) return (sd->status.skill[idx].id == skill_id) ? sd->status.skill[idx].lv : 0; } +/** + * Returns the amount of skill points invested in a Summoner's Power of Sea/Land/Life + * @param sd: Player data + * @param type: Summoner Power Type + * @return Skill points invested + */ +uint8 pc_checkskill_summoner(map_session_data *sd, e_summoner_power_type type) { + if (sd == nullptr) + return 0; + + uint8 count = 0; + + switch (type) { + case SUMMONER_POWER_SEA: + count = pc_checkskill(sd, SU_TUNABELLY) + pc_checkskill(sd, SU_TUNAPARTY) + pc_checkskill(sd, SU_BUNCHOFSHRIMP) + pc_checkskill(sd, SU_FRESHSHRIMP) + + pc_checkskill(sd, SU_GROOMING) + pc_checkskill(sd, SU_PURRING) + pc_checkskill(sd, SU_SHRIMPARTY); + break; + case SUMMONER_POWER_LAND: + count = pc_checkskill(sd, SU_SV_STEMSPEAR) + pc_checkskill(sd, SU_CN_POWDERING) + pc_checkskill(sd, SU_CN_METEOR) + pc_checkskill(sd, SU_SV_ROOTTWIST) + + pc_checkskill(sd, SU_CHATTERING) + pc_checkskill(sd, SU_MEOWMEOW) + pc_checkskill(sd, SU_NYANGGRASS); + break; + case SUMMONER_POWER_LIFE: + count = pc_checkskill(sd, SU_SCAROFTAROU) + pc_checkskill(sd, SU_PICKYPECK) + pc_checkskill(sd, SU_ARCLOUSEDASH) + pc_checkskill(sd, SU_LUNATICCARROTBEAT) + + pc_checkskill(sd, SU_HISS) + pc_checkskill(sd, SU_POWEROFFLOCK) + pc_checkskill(sd, SU_SVG_SPIRIT); + break; + } + + return count; +} + /** * Check if we still have the correct weapon to continue the skill (actually status) * If not ending it @@ -7618,7 +7648,7 @@ void pc_skillup(struct map_session_data *sd,uint16 skill_id) int lv, range, upgradable; sd->status.skill[idx].lv++; sd->status.skill_point--; - if( !skill_get_inf(skill_id) ) + if( !skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20 ) status_calc_pc(sd,SCO_NONE); // Only recalculate for passive skills. else if( sd->status.skill_point == 0 && pc_is_taekwon_ranker(sd) ) pc_calc_skilltree(sd); // Required to grant all TK Ranker skills. diff --git a/src/map/pc.hpp b/src/map/pc.hpp index b0ba030940..7e044a8ccb 100644 --- a/src/map/pc.hpp +++ b/src/map/pc.hpp @@ -1050,6 +1050,13 @@ public: extern AttendanceDatabase attendance_db; +/// Enum of Summoner Power of +enum e_summoner_power_type { + SUMMONER_POWER_LAND = 0, + SUMMONER_POWER_LIFE, + SUMMONER_POWER_SEA, +}; + void pc_set_reg_load(bool val); int pc_split_atoi(char* str, int* val, char sep, int max); int pc_class2idx(int class_); @@ -1082,6 +1089,7 @@ void pc_setinventorydata(struct map_session_data *sd); int pc_get_skillcooldown(struct map_session_data *sd, uint16 skill_id, uint16 skill_lv); uint8 pc_checkskill(struct map_session_data *sd,uint16 skill_id); +uint8 pc_checkskill_summoner(map_session_data *sd, e_summoner_power_type type); short pc_checkequip(struct map_session_data *sd,int pos,bool checkall=false); bool pc_checkequip2(struct map_session_data *sd, unsigned short nameid, int min, int max); diff --git a/src/map/skill.cpp b/src/map/skill.cpp index c9d62d67a1..d603ebe7cc 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -601,7 +601,7 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk hp += hp * 10 / 100; #endif - if (pc_checkskill(sd, SU_TUNABELLY) == 5 && pc_checkskill(sd, SU_TUNAPARTY) == 5 && pc_checkskill(sd, SU_BUNCHOFSHRIMP) == 5 && pc_checkskill(sd, SU_FRESHSHRIMP) == 5) + if (pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) #ifdef RENEWAL hp_bonus += 20; #else diff --git a/src/map/status.cpp b/src/map/status.cpp index b48a95e6ea..947f03ed47 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -3319,9 +3319,8 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) { bonus += 1000; if (pc_checkskill(sd, SU_POWEROFSEA) > 0) { bonus += 1000; - if ((pc_checkskill(sd, SU_TUNABELLY) + pc_checkskill(sd, SU_TUNAPARTY) + pc_checkskill(sd, SU_BUNCHOFSHRIMP) + pc_checkskill(sd, SU_FRESHSHRIMP) + - pc_checkskill(sd, SU_GROOMING) + pc_checkskill(sd, SU_PURRING) + pc_checkskill(sd, SU_SHRIMPARTY)) > 19) - bonus += 3000; + if (pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) + bonus += 3000; } if ((skill_lv = pc_checkskill(sd, NV_BREAKTHROUGH)) > 0) bonus += 350 * skill_lv + (skill_lv > 4 ? 250 : 0); @@ -3497,9 +3496,8 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) { bonus += 100; if (pc_checkskill(sd, SU_POWEROFSEA) > 0) { bonus += 100; - if ((pc_checkskill(sd, SU_TUNABELLY) + pc_checkskill(sd, SU_TUNAPARTY) + pc_checkskill(sd, SU_BUNCHOFSHRIMP) + pc_checkskill(sd, SU_FRESHSHRIMP) + - pc_checkskill(sd, SU_GROOMING) + pc_checkskill(sd, SU_PURRING) + pc_checkskill(sd, SU_SHRIMPARTY)) > 19) - bonus += 300; + if (pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) + bonus += 300; } if ((skill_lv = pc_checkskill(sd, NV_BREAKTHROUGH)) > 0) bonus += 30 * skill_lv + (skill_lv > 4 ? 50 : 0); @@ -5622,11 +5620,8 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag) if (sd->bonus.ematk > 0) status->matk_min += sd->bonus.ematk; - if (pc_checkskill(sd, SU_POWEROFLAND) > 0) { - if ((pc_checkskill(sd, SU_SV_STEMSPEAR) + pc_checkskill(sd, SU_CN_POWDERING) + pc_checkskill(sd, SU_CN_METEOR) + pc_checkskill(sd, SU_SV_ROOTTWIST) + - pc_checkskill(sd, SU_CHATTERING) + pc_checkskill(sd, SU_MEOWMEOW) + pc_checkskill(sd, SU_NYANGGRASS)) > 19) - status->matk_min += status->matk_min * 20 / 100; - } + if (pc_checkskill(sd, SU_POWEROFLAND) > 0 && pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20) + status->matk_min += status->matk_min * 20 / 100; if ((skill_lv = pc_checkskill(sd, NV_TRANSCENDENCE)) > 0) status->matk_min += 15 * skill_lv + (skill_lv > 4 ? 25 : 0); } @@ -11988,13 +11983,12 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty val2 += rnd() % (max - min); // Heal if (sd) { - if (pc_checkskill(sd, SU_POWEROFSEA)) { + if (pc_checkskill(sd, SU_POWEROFSEA) > 0) { val2 += val2 * 10 / 100; - if ((pc_checkskill(sd, SU_TUNABELLY) + pc_checkskill(sd, SU_TUNAPARTY) + pc_checkskill(sd, SU_BUNCHOFSHRIMP) + pc_checkskill(sd, SU_FRESHSHRIMP) + - pc_checkskill(sd, SU_GROOMING) + pc_checkskill(sd, SU_PURRING) + pc_checkskill(sd, SU_SHRIMPARTY)) > 19) - val2 += val2 * 20 / 100; + if (pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) + val2 += val2 * 20 / 100; } - if (pc_checkskill(sd, SU_SPIRITOFSEA)) + if (pc_checkskill(sd, SU_SPIRITOFSEA) > 0) val2 *= 2; // Doubles HP } tick_time = 10000 - ((val1 - 1) * 1000);