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,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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user