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:
222
src/map/mob.cpp
222
src/map/mob.cpp
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user