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:
parent
4d962d6f87
commit
35c3301dda
@ -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]);
|
||||||
|
@ -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.
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user