Fixes Bard and Dancer Soul Link bonus (#5055)
* Fixes #4801. * Fixes Bard and Dancer not gaining the opposite class's skills. * Cleans up check to not be reliant on sketchy index checks. Thanks to @ihernandeza, @gidzdlcrz, and @Lemongrass3110!
This commit is contained in:
parent
8efd61f9b2
commit
4d962d6f87
@ -2034,37 +2034,13 @@ void pc_calc_skilltree(struct map_session_data *sd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (const auto &skill : skill_db) {
|
for (const auto &skill : skill_db) {
|
||||||
uint16 skill_id = skill.second->nameid;
|
uint16 idx = skill_get_index(skill.second->nameid);
|
||||||
uint16 idx = skill_get_index(skill_id);
|
|
||||||
|
|
||||||
// Restore original level of skills after deleting earned skills.
|
// Restore original level of skills after deleting earned skills.
|
||||||
if( sd->status.skill[idx].flag != SKILL_FLAG_PERMANENT && sd->status.skill[idx].flag != SKILL_FLAG_PERM_GRANTED && sd->status.skill[idx].flag != SKILL_FLAG_PLAGIARIZED ) {
|
if( sd->status.skill[idx].flag != SKILL_FLAG_PERMANENT && sd->status.skill[idx].flag != SKILL_FLAG_PERM_GRANTED && sd->status.skill[idx].flag != SKILL_FLAG_PLAGIARIZED ) {
|
||||||
sd->status.skill[idx].lv = (sd->status.skill[idx].flag == SKILL_FLAG_TEMPORARY) ? 0 : sd->status.skill[idx].flag - SKILL_FLAG_REPLACED_LV_0;
|
sd->status.skill[idx].lv = (sd->status.skill[idx].flag == SKILL_FLAG_TEMPORARY) ? 0 : sd->status.skill[idx].flag - SKILL_FLAG_REPLACED_LV_0;
|
||||||
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Enable Bard/Dancer spirit linked skills.
|
|
||||||
if (skill_id < DC_HUMMING || skill_id > DC_SERVICEFORYOU)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if( sd->sc.count && sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_BARDDANCER ) {
|
|
||||||
//Link Dancer skills to bard.
|
|
||||||
if( sd->status.sex ) {
|
|
||||||
if( sd->status.skill[idx - 8].lv < 10 )
|
|
||||||
continue;
|
|
||||||
sd->status.skill[idx].id = skill_id;
|
|
||||||
sd->status.skill[idx].lv = sd->status.skill[idx - 8].lv; // Set the level to the same as the linking skill
|
|
||||||
sd->status.skill[idx].flag = SKILL_FLAG_TEMPORARY; // Tag it as a non-savable, non-uppable, bonus skill
|
|
||||||
}
|
|
||||||
//Link Bard skills to dancer.
|
|
||||||
else {
|
|
||||||
if( sd->status.skill[idx].lv < 10 )
|
|
||||||
continue;
|
|
||||||
sd->status.skill[idx - 8].id = skill_id - 8;
|
|
||||||
sd->status.skill[idx - 8].lv = sd->status.skill[idx].lv; // Set the level to the same as the linking skill
|
|
||||||
sd->status.skill[idx - 8].flag = SKILL_FLAG_TEMPORARY; // Tag it as a non-savable, non-uppable, bonus skill
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Removes Taekwon Ranker skill bonus
|
// Removes Taekwon Ranker skill bonus
|
||||||
@ -2187,6 +2163,22 @@ void pc_calc_skilltree(struct map_session_data *sd)
|
|||||||
sd->status.skill[sk_idx].lv = skill_tree_get_max(skid, sd->status.class_);
|
sd->status.skill[sk_idx].lv = skill_tree_get_max(skid, sd->status.class_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Enable Bard/Dancer spirit linked skills.
|
||||||
|
if (sd->sc.count && sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_BARDDANCER) {
|
||||||
|
std::vector<std::vector<uint16>> linked_skills = { { BA_WHISTLE, DC_HUMMING },
|
||||||
|
{ BA_ASSASSINCROSS, DC_DONTFORGETME },
|
||||||
|
{ BA_POEMBRAGI, DC_FORTUNEKISS },
|
||||||
|
{ BA_APPLEIDUN, DC_SERVICEFORYOU } };
|
||||||
|
|
||||||
|
for (const auto &skill : linked_skills) {
|
||||||
|
if (pc_checkskill(sd, skill[!sd->status.sex]) < 10)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Tag it as a non-savable, non-uppable, bonus skill
|
||||||
|
pc_skill(sd, skill[sd->status.sex], 10, ADDSKILL_TEMP);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Checks if you can learn a new skill after having leveled up a skill.
|
//Checks if you can learn a new skill after having leveled up a skill.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user