Clean up Summoner Power skill checks (#4999)

* Centralized the Summoner Power skill tree checks into one function.
* Fixes a couple passive skill bonuses not being recalculated when reaching 20 investment points.
Thanks to @exneval and @Balferian!
This commit is contained in:
Aleos 2020-06-06 22:42:30 -04:00 committed by GitHub
parent 4d962d6f87
commit 35c3301dda
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 55 additions and 26 deletions

View File

@ -4944,14 +4944,11 @@ static void battle_attack_sc_bonus(struct Damage* wd, struct block_list *src, st
} }
if ((wd->flag&(BF_LONG|BF_MAGIC)) == BF_LONG) { if ((wd->flag&(BF_LONG|BF_MAGIC)) == BF_LONG) {
if (sd && pc_checkskill(sd, SU_POWEROFLIFE) > 0) { if (sd && pc_checkskill(sd, SU_POWEROFLIFE) > 0 && pc_checkskill_summoner(sd, SUMMONER_POWER_LIFE) >= 20) {
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); ATK_ADDRATE(wd->damage, wd->damage2, 20);
RE_ALLATK_ADDRATE(wd, 20); RE_ALLATK_ADDRATE(wd, 20);
} }
} }
}
if (sd != nullptr && !anger_id) if (sd != nullptr && !anger_id)
ARR_FIND(0, MAX_PC_FEELHATE, anger_id, status_get_class(target) == sd->hate_mob[anger_id]); ARR_FIND(0, MAX_PC_FEELHATE, anger_id, status_get_class(target) == sd->hate_mob[anger_id]);

View File

@ -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); clif_deleteskill(sd,skill_id);
} else } else
clif_addskill(sd,skill_id); 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); status_calc_pc(sd, SCO_NONE);
break; 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); clif_deleteskill(sd,skill_id);
} else } else
clif_addskill(sd,skill_id); 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); status_calc_pc(sd, SCO_NONE);
break; 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; 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) * Check if we still have the correct weapon to continue the skill (actually status)
* If not ending it * If not ending it
@ -7618,7 +7648,7 @@ void pc_skillup(struct map_session_data *sd,uint16 skill_id)
int lv, range, upgradable; int lv, range, upgradable;
sd->status.skill[idx].lv++; sd->status.skill[idx].lv++;
sd->status.skill_point--; 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. status_calc_pc(sd,SCO_NONE); // Only recalculate for passive skills.
else if( sd->status.skill_point == 0 && pc_is_taekwon_ranker(sd) ) else if( sd->status.skill_point == 0 && pc_is_taekwon_ranker(sd) )
pc_calc_skilltree(sd); // Required to grant all TK Ranker skills. pc_calc_skilltree(sd); // Required to grant all TK Ranker skills.

View File

@ -1050,6 +1050,13 @@ public:
extern AttendanceDatabase attendance_db; 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); void pc_set_reg_load(bool val);
int pc_split_atoi(char* str, int* val, char sep, int max); int pc_split_atoi(char* str, int* val, char sep, int max);
int pc_class2idx(int class_); 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); 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(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); 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); bool pc_checkequip2(struct map_session_data *sd, unsigned short nameid, int min, int max);

View File

@ -601,7 +601,7 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk
hp += hp * 10 / 100; hp += hp * 10 / 100;
#endif #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 #ifdef RENEWAL
hp_bonus += 20; hp_bonus += 20;
#else #else

View File

@ -3319,8 +3319,7 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) {
bonus += 1000; bonus += 1000;
if (pc_checkskill(sd, SU_POWEROFSEA) > 0) { if (pc_checkskill(sd, SU_POWEROFSEA) > 0) {
bonus += 1000; bonus += 1000;
if ((pc_checkskill(sd, SU_TUNABELLY) + pc_checkskill(sd, SU_TUNAPARTY) + pc_checkskill(sd, SU_BUNCHOFSHRIMP) + pc_checkskill(sd, SU_FRESHSHRIMP) + if (pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20)
pc_checkskill(sd, SU_GROOMING) + pc_checkskill(sd, SU_PURRING) + pc_checkskill(sd, SU_SHRIMPARTY)) > 19)
bonus += 3000; bonus += 3000;
} }
if ((skill_lv = pc_checkskill(sd, NV_BREAKTHROUGH)) > 0) if ((skill_lv = pc_checkskill(sd, NV_BREAKTHROUGH)) > 0)
@ -3497,8 +3496,7 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) {
bonus += 100; bonus += 100;
if (pc_checkskill(sd, SU_POWEROFSEA) > 0) { if (pc_checkskill(sd, SU_POWEROFSEA) > 0) {
bonus += 100; bonus += 100;
if ((pc_checkskill(sd, SU_TUNABELLY) + pc_checkskill(sd, SU_TUNAPARTY) + pc_checkskill(sd, SU_BUNCHOFSHRIMP) + pc_checkskill(sd, SU_FRESHSHRIMP) + if (pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20)
pc_checkskill(sd, SU_GROOMING) + pc_checkskill(sd, SU_PURRING) + pc_checkskill(sd, SU_SHRIMPARTY)) > 19)
bonus += 300; bonus += 300;
} }
if ((skill_lv = pc_checkskill(sd, NV_BREAKTHROUGH)) > 0) if ((skill_lv = pc_checkskill(sd, NV_BREAKTHROUGH)) > 0)
@ -5622,11 +5620,8 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag)
if (sd->bonus.ematk > 0) if (sd->bonus.ematk > 0)
status->matk_min += sd->bonus.ematk; status->matk_min += sd->bonus.ematk;
if (pc_checkskill(sd, SU_POWEROFLAND) > 0) { if (pc_checkskill(sd, SU_POWEROFLAND) > 0 && pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20)
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; status->matk_min += status->matk_min * 20 / 100;
}
if ((skill_lv = pc_checkskill(sd, NV_TRANSCENDENCE)) > 0) if ((skill_lv = pc_checkskill(sd, NV_TRANSCENDENCE)) > 0)
status->matk_min += 15 * skill_lv + (skill_lv > 4 ? 25 : 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 val2 += rnd() % (max - min); // Heal
if (sd) { if (sd) {
if (pc_checkskill(sd, SU_POWEROFSEA)) { if (pc_checkskill(sd, SU_POWEROFSEA) > 0) {
val2 += val2 * 10 / 100; 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) + if (pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20)
pc_checkskill(sd, SU_GROOMING) + pc_checkskill(sd, SU_PURRING) + pc_checkskill(sd, SU_SHRIMPARTY)) > 19)
val2 += val2 * 20 / 100; val2 += val2 * 20 / 100;
} }
if (pc_checkskill(sd, SU_SPIRITOFSEA)) if (pc_checkskill(sd, SU_SPIRITOFSEA) > 0)
val2 *= 2; // Doubles HP val2 *= 2; // Doubles HP
} }
tick_time = 10000 - ((val1 - 1) * 1000); tick_time = 10000 - ((val1 - 1) * 1000);