Converts the Skill Tree Tables file into YAML (#6070)

* Converts the Skill Tree Tables file into YAML.
* Includes CSV2YAML converter.
* Corrected the tree according to the client (SkillInfoList)
* Removed 3rd jobs tree from pre-renewal, some required stats not being loaded by default

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
This commit is contained in:
Atemo
2021-12-14 00:00:33 +01:00
committed by GitHub
parent 8eef9f9d36
commit b644bcfe69
17 changed files with 11035 additions and 12560 deletions

View File

@@ -3966,7 +3966,7 @@ static bool mob_clone_disabled_skills(uint16 skill_id) {
int mob_clone_spawn(struct map_session_data *sd, int16 m, int16 x, int16 y, const char *event, int master_id, enum e_mode mode, int flag, unsigned int duration)
{
int mob_id;
int i,j,inf, fd;
int inf, fd;
struct mob_data *md;
struct status_data *status;
@@ -4015,122 +4015,132 @@ int mob_clone_spawn(struct map_session_data *sd, int16 m, int16 x, int16 y, cons
sd->fd = 0;
//Go Backwards to give better priority to advanced skills.
for (i=0,j = MAX_SKILL_TREE-1;j>=0 && i< MAX_MOBSKILL ;j--) {
uint16 skill_id = skill_tree[pc_class2idx(sd->status.class_)][j].skill_id;
uint16 sk_idx = 0;
std::shared_ptr<s_skill_tree> tree = skill_tree_db.find(sd->status.class_);
if (!skill_id || !(sk_idx = skill_get_index(skill_id)) || sd->status.skill[sk_idx].lv < 1 ||
skill_get_inf2_(skill_id, { INF2_ISWEDDING, INF2_ISGUILD }) ||
mob_clone_disabled_skills(skill_id)
)
continue;
//Normal aggressive mob, disable skills that cannot help them fight
//against players (those with flags UF_NOMOB and UF_NOPC are specific
//to always aid players!) [Skotlex]
if (!(flag&1) &&
skill_get_unit_id(skill_id) &&
skill_get_unit_flag_(skill_id, { UF_NOMOB, UF_NOPC }))
continue;
/**
* The clone should be able to cast the skill (e.g. have the required weapon) bugreport:5299)
**/
if( !skill_check_condition_castbegin(sd,skill_id,sd->status.skill[sk_idx].lv) )
continue;
if( tree != nullptr && !tree->skills.empty() ){
std::vector<uint16> skill_list;
std::shared_ptr<s_mob_skill> ms = std::make_shared<s_mob_skill>();
for (const auto &it : tree->skills)
skill_list.push_back(it.first);
std::sort(skill_list.rbegin(), skill_list.rend());
ms->skill_id = skill_id;
ms->skill_lv = sd->status.skill[sk_idx].lv;
ms->state = MSS_ANY;
ms->permillage = 500*battle_config.mob_skill_rate/100; //Default chance of all skills: 5%
ms->emotion = -1;
ms->cancel = 0;
ms->casttime = skill_castfix(&sd->bl,skill_id, ms->skill_lv);
ms->delay = 5000+skill_delayfix(&sd->bl,skill_id, ms->skill_lv);
ms->msg_id = 0;
for (const auto &it : skill_list) {
if (db->skill.size() >= MAX_MOBSKILL)
break;
uint16 skill_id = it;
uint16 sk_idx = 0;
inf = skill_get_inf(skill_id);
if (inf&INF_ATTACK_SKILL) {
ms->target = MST_TARGET;
ms->cond1 = MSC_ALWAYS;
if (skill_get_range(skill_id, ms->skill_lv) > 3)
ms->state = MSS_ANYTARGET;
else
ms->state = MSS_BERSERK;
} else if(inf&INF_GROUND_SKILL) {
if (skill_get_inf2(skill_id, INF2_ISTRAP)) { //Traps!
ms->state = MSS_IDLE;
ms->target = MST_AROUND2;
ms->delay = 60000;
} else if (skill_get_unit_target(skill_id) == BCT_ENEMY) { //Target Enemy
ms->state = MSS_ANYTARGET;
if (!skill_id || !(sk_idx = skill_get_index(skill_id)) || sd->status.skill[sk_idx].lv < 1 ||
skill_get_inf2_(skill_id, { INF2_ISWEDDING, INF2_ISGUILD }) ||
mob_clone_disabled_skills(skill_id)
)
continue;
//Normal aggressive mob, disable skills that cannot help them fight
//against players (those with flags UF_NOMOB and UF_NOPC are specific
//to always aid players!) [Skotlex]
if (!(flag&1) &&
skill_get_unit_id(skill_id) &&
skill_get_unit_flag_(skill_id, { UF_NOMOB, UF_NOPC }))
continue;
/**
* The clone should be able to cast the skill (e.g. have the required weapon) bugreport:5299)
**/
if( !skill_check_condition_castbegin(sd,skill_id,sd->status.skill[sk_idx].lv) )
continue;
std::shared_ptr<s_mob_skill> ms = std::make_shared<s_mob_skill>();
ms->skill_id = skill_id;
ms->skill_lv = sd->status.skill[sk_idx].lv;
ms->state = MSS_ANY;
ms->permillage = 500*battle_config.mob_skill_rate/100; //Default chance of all skills: 5%
ms->emotion = -1;
ms->cancel = 0;
ms->casttime = skill_castfix(&sd->bl,skill_id, ms->skill_lv);
ms->delay = 5000+skill_delayfix(&sd->bl,skill_id, ms->skill_lv);
ms->msg_id = 0;
inf = skill_get_inf(skill_id);
if (inf&INF_ATTACK_SKILL) {
ms->target = MST_TARGET;
ms->cond1 = MSC_ALWAYS;
} else { //Target allies
ms->target = MST_FRIEND;
ms->cond1 = MSC_FRIENDHPLTMAXRATE;
ms->cond2 = 95;
}
} else if (inf&INF_SELF_SKILL) {
if (skill_get_inf2(skill_id, INF2_NOTARGETSELF)) { //auto-select target skill.
ms->target = MST_TARGET;
ms->cond1 = MSC_ALWAYS;
if (skill_get_range(skill_id, ms->skill_lv) > 3) {
if (skill_get_range(skill_id, ms->skill_lv) > 3)
ms->state = MSS_ANYTARGET;
} else {
ms->state = MSS_BERSERK;
}
} else { //Self skill
ms->target = MST_SELF;
ms->cond1 = MSC_MYHPLTMAXRATE;
ms->cond2 = 90;
ms->permillage = 2000;
//Delay: Remove the stock 5 secs and add half of the support time.
ms->delay += -5000 +(skill_get_time(skill_id, ms->skill_lv) + skill_get_time2(skill_id, ms->skill_lv))/2;
if (ms->delay < 5000)
ms->delay = 5000; //With a minimum of 5 secs.
}
} else if (inf&INF_SUPPORT_SKILL) {
ms->target = MST_FRIEND;
ms->cond1 = MSC_FRIENDHPLTMAXRATE;
ms->cond2 = 90;
if (skill_id == AL_HEAL)
ms->permillage = 5000; //Higher skill rate usage for heal.
else if (skill_id == ALL_RESURRECTION)
ms->cond2 = 1;
//Delay: Remove the stock 5 secs and add half of the support time.
ms->delay += -5000 +(skill_get_time(skill_id, ms->skill_lv) + skill_get_time2(skill_id, ms->skill_lv))/2;
if (ms->delay < 2000)
ms->delay = 2000; //With a minimum of 2 secs.
if (i+1 < MAX_MOBSKILL) { //duplicate this so it also triggers on self.
ms->target = MST_SELF;
ms->cond1 = MSC_MYHPLTMAXRATE;
db->skill.insert(db->skill.begin() + i, ms);
++i;
}
} else {
switch (skill_id) { //Certain Special skills that are passive, and thus, never triggered.
case MO_TRIPLEATTACK:
case TF_DOUBLE:
case GS_CHAINACTION:
else
ms->state = MSS_BERSERK;
} else if(inf&INF_GROUND_SKILL) {
if (skill_get_inf2(skill_id, INF2_ISTRAP)) { //Traps!
ms->state = MSS_IDLE;
ms->target = MST_AROUND2;
ms->delay = 60000;
} else if (skill_get_unit_target(skill_id) == BCT_ENEMY) { //Target Enemy
ms->state = MSS_ANYTARGET;
ms->target = MST_TARGET;
ms->cond1 = MSC_ALWAYS;
ms->permillage = skill_id==MO_TRIPLEATTACK?(3000-ms->skill_lv*100):(ms->skill_lv*500);
ms->delay -= 5000; //Remove the added delay as these could trigger on "all hits".
break;
default: //Untreated Skill
continue;
}
}
if (battle_config.mob_skill_rate!= 100)
ms->permillage = ms->permillage*battle_config.mob_skill_rate/100;
if (battle_config.mob_skill_delay != 100)
ms->delay = ms->delay*battle_config.mob_skill_delay/100;
} else { //Target allies
ms->target = MST_FRIEND;
ms->cond1 = MSC_FRIENDHPLTMAXRATE;
ms->cond2 = 95;
}
} else if (inf&INF_SELF_SKILL) {
if (skill_get_inf2(skill_id, INF2_NOTARGETSELF)) { //auto-select target skill.
ms->target = MST_TARGET;
ms->cond1 = MSC_ALWAYS;
if (skill_get_range(skill_id, ms->skill_lv) > 3) {
ms->state = MSS_ANYTARGET;
} else {
ms->state = MSS_BERSERK;
}
} else { //Self skill
ms->target = MST_SELF;
ms->cond1 = MSC_MYHPLTMAXRATE;
ms->cond2 = 90;
ms->permillage = 2000;
//Delay: Remove the stock 5 secs and add half of the support time.
ms->delay += -5000 +(skill_get_time(skill_id, ms->skill_lv) + skill_get_time2(skill_id, ms->skill_lv))/2;
if (ms->delay < 5000)
ms->delay = 5000; //With a minimum of 5 secs.
}
} else if (inf&INF_SUPPORT_SKILL) {
ms->target = MST_FRIEND;
ms->cond1 = MSC_FRIENDHPLTMAXRATE;
ms->cond2 = 90;
if (skill_id == AL_HEAL)
ms->permillage = 5000; //Higher skill rate usage for heal.
else if (skill_id == ALL_RESURRECTION)
ms->cond2 = 1;
//Delay: Remove the stock 5 secs and add half of the support time.
ms->delay += -5000 +(skill_get_time(skill_id, ms->skill_lv) + skill_get_time2(skill_id, ms->skill_lv))/2;
if (ms->delay < 2000)
ms->delay = 2000; //With a minimum of 2 secs.
db->skill.push_back(ms);
++i;
if (db->skill.size() < MAX_MOBSKILL) { //duplicate this so it also triggers on self.
ms->target = MST_SELF;
ms->cond1 = MSC_MYHPLTMAXRATE;
db->skill.push_back(ms);
}
} else {
switch (skill_id) { //Certain Special skills that are passive, and thus, never triggered.
case MO_TRIPLEATTACK:
case TF_DOUBLE:
case GS_CHAINACTION:
ms->state = MSS_BERSERK;
ms->target = MST_TARGET;
ms->cond1 = MSC_ALWAYS;
ms->permillage = skill_id==MO_TRIPLEATTACK?(3000-ms->skill_lv*100):(ms->skill_lv*500);
ms->delay -= 5000; //Remove the added delay as these could trigger on "all hits".
break;
default: //Untreated Skill
continue;
}
}
if (battle_config.mob_skill_rate!= 100)
ms->permillage = ms->permillage*battle_config.mob_skill_rate/100;
if (battle_config.mob_skill_delay != 100)
ms->delay = ms->delay*battle_config.mob_skill_delay/100;
db->skill.push_back(ms);
}
}
/**