From 34a18710fe25efaead50cf10b18a27d1d74e7c09 Mon Sep 17 00:00:00 2001 From: Haru Date: Fri, 24 Nov 2017 07:24:07 +0100 Subject: Allow using the skill DB accessors on non-skill attacks (skill_id = 0) This suppresses an assertion in the skill DB accessors when called with `skill_id = 0` (such as during normal attacks). In such case, they'll now return an appropriate zero value, as it happened before 2b4bfa5d0. Fixes #1909 Signed-off-by: Haru --- src/map/battle.h | 1 + src/map/skill.c | 235 ++++++++++++++++++++++++++++++++++++++++++------------- src/map/skill.h | 6 +- 3 files changed, 188 insertions(+), 54 deletions(-) diff --git a/src/map/battle.h b/src/map/battle.h index 4a63887c4..3ab3e2ddd 100644 --- a/src/map/battle.h +++ b/src/map/battle.h @@ -54,6 +54,7 @@ struct status_data; enum { // Flag of the final calculation + BF_NONE = 0x0000, BF_WEAPON = 0x0001, BF_MAGIC = 0x0002, BF_MISC = 0x0004, diff --git a/src/map/skill.c b/src/map/skill.c index d20178a34..1bf1880e8 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -161,23 +161,32 @@ const char *skill_get_desc(int skill_id) int skill_get_hit(int skill_id) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); return skill->dbs->db[idx].hit; } int skill_get_inf(int skill_id) { - int idx = skill->get_index(skill_id); - Assert_ret(idx != 0); + int idx; + if (skill_id == 0) + return INF_NONE; + idx = skill->get_index(skill_id); + Assert_retr(INF_NONE, idx != 0); return skill->dbs->db[idx].inf; } int skill_get_ele(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); - Assert_ret(idx != 0); - Assert_ret(skill_lv > 0); + int idx; + if (skill_id == 0) + return ELE_NEUTRAL; + idx = skill->get_index(skill_id); + Assert_retr(ELE_NEUTRAL, idx != 0); + Assert_retr(ELE_NEUTRAL, skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { int val = skill->dbs->db[idx].element[skill_get_lvl_idx(skill_lv)]; return skill_adjust_over_level(val, skill_lv, skill->dbs->db[idx].max); @@ -187,21 +196,30 @@ int skill_get_ele(int skill_id, int skill_lv) int skill_get_nk(int skill_id) { - int idx = skill->get_index(skill_id); - Assert_ret(idx != 0); + int idx; + if (skill_id == 0) + return NK_NONE; + idx = skill->get_index(skill_id); + Assert_retr(NK_NONE, idx != 0); return skill->dbs->db[idx].nk; } int skill_get_max(int skill_id) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); return skill->dbs->db[idx].max; } int skill_get_range(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -213,7 +231,10 @@ int skill_get_range(int skill_id, int skill_lv) int skill_get_splash(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -225,7 +246,10 @@ int skill_get_splash(int skill_id, int skill_lv) int skill_get_hp(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -237,7 +261,10 @@ int skill_get_hp(int skill_id, int skill_lv) int skill_get_sp(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -249,7 +276,10 @@ int skill_get_sp(int skill_id, int skill_lv) int skill_get_hp_rate(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -261,7 +291,10 @@ int skill_get_hp_rate(int skill_id, int skill_lv) int skill_get_sp_rate(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -273,14 +306,20 @@ int skill_get_sp_rate(int skill_id, int skill_lv) int skill_get_state(int skill_id) { - int idx = skill->get_index(skill_id); - Assert_ret(idx != 0); + int idx; + if (skill_id == 0) + return ST_NONE; + idx = skill->get_index(skill_id); + Assert_retr(ST_NONE, idx != 0); return skill->dbs->db[idx].state; } int skill_get_spiritball(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -292,7 +331,10 @@ int skill_get_spiritball(int skill_id, int skill_lv) int skill_get_itemid(int skill_id, int item_idx) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(item_idx >= 0 && item_idx < MAX_SKILL_ITEM_REQUIRE); return skill->dbs->db[idx].itemid[item_idx]; @@ -300,7 +342,10 @@ int skill_get_itemid(int skill_id, int item_idx) int skill_get_itemqty(int skill_id, int item_idx) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(item_idx >= 0 && item_idx < MAX_SKILL_ITEM_REQUIRE); return skill->dbs->db[idx].amount[item_idx]; @@ -308,7 +353,10 @@ int skill_get_itemqty(int skill_id, int item_idx) int skill_get_zeny(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -320,7 +368,10 @@ int skill_get_zeny(int skill_id, int skill_lv) int skill_get_num(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -332,7 +383,10 @@ int skill_get_num(int skill_id, int skill_lv) int skill_get_cast(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -344,7 +398,10 @@ int skill_get_cast(int skill_id, int skill_lv) int skill_get_delay(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -356,7 +413,10 @@ int skill_get_delay(int skill_id, int skill_lv) int skill_get_walkdelay(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -368,7 +428,10 @@ int skill_get_walkdelay(int skill_id, int skill_lv) int skill_get_time(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -380,7 +443,10 @@ int skill_get_time(int skill_id, int skill_lv) int skill_get_time2(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -392,28 +458,40 @@ int skill_get_time2(int skill_id, int skill_lv) int skill_get_castdef(int skill_id) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); return skill->dbs->db[idx].cast_def_rate; } int skill_get_weapontype(int skill_id) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); return skill->dbs->db[idx].weapon; } int skill_get_ammotype(int skill_id) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); return skill->dbs->db[idx].ammo; } int skill_get_ammo_qty(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -425,21 +503,30 @@ int skill_get_ammo_qty(int skill_id, int skill_lv) int skill_get_inf2(int skill_id) { - int idx = skill->get_index(skill_id); - Assert_ret(idx != 0); + int idx; + if (skill_id == 0) + return INF2_NONE; + idx = skill->get_index(skill_id); + Assert_retr(INF2_NONE, idx != 0); return skill->dbs->db[idx].inf2; } int skill_get_castcancel(int skill_id) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); return skill->dbs->db[idx].castcancel; } int skill_get_maxcount(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -451,7 +538,10 @@ int skill_get_maxcount(int skill_id, int skill_lv) int skill_get_blewcount(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -463,7 +553,10 @@ int skill_get_blewcount(int skill_id, int skill_lv) int skill_get_mhp(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -475,7 +568,10 @@ int skill_get_mhp(int skill_id, int skill_lv) int skill_get_castnodex(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -487,7 +583,10 @@ int skill_get_castnodex(int skill_id, int skill_lv) int skill_get_delaynodex(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -499,14 +598,20 @@ int skill_get_delaynodex(int skill_id, int skill_lv) int skill_get_type(int skill_id) { - int idx = skill->get_index(skill_id); - Assert_ret(idx != 0); + int idx; + if (skill_id == 0) + return BF_NONE; + idx = skill->get_index(skill_id); + Assert_retr(BF_NONE, idx != 0); return skill->dbs->db[idx].skill_type; } int skill_get_unit_id(int skill_id, int flag) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(flag >= 0 && flag < ARRAYLENGTH(skill->dbs->db[0].unit_id)); return skill->dbs->db[idx].unit_id[flag]; @@ -514,14 +619,20 @@ int skill_get_unit_id(int skill_id, int flag) int skill_get_unit_interval(int skill_id) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); return skill->dbs->db[idx].unit_interval; } int skill_get_unit_range(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -533,28 +644,40 @@ int skill_get_unit_range(int skill_id, int skill_lv) int skill_get_unit_target(int skill_id) { - int idx = skill->get_index(skill_id); - Assert_ret(idx != 0); + int idx; + if (skill_id == 0) + return BCT_NOONE; + idx = skill->get_index(skill_id); + Assert_retr(BCT_NOONE, idx != 0); return skill->dbs->db[idx].unit_target & BCT_ALL; } int skill_get_unit_bl_target(int skill_id) { - int idx = skill->get_index(skill_id); - Assert_ret(idx != 0); + int idx; + if (skill_id == 0) + return BL_NUL; + idx = skill->get_index(skill_id); + Assert_retr(BL_NUL, idx != 0); return skill->dbs->db[idx].unit_target & BL_ALL; } int skill_get_unit_flag(int skill_id) { - int idx = skill->get_index(skill_id); - Assert_ret(idx != 0); + int idx; + if (skill_id == 0) + return UF_NONE; + idx = skill->get_index(skill_id); + Assert_retr(UF_NONE, idx != 0); return skill->dbs->db[idx].unit_flag; } int skill_get_unit_layout_type(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -566,7 +689,10 @@ int skill_get_unit_layout_type(int skill_id, int skill_lv) int skill_get_cooldown(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); if (skill_lv > MAX_SKILL_LEVEL) { @@ -578,7 +704,10 @@ int skill_get_cooldown(int skill_id, int skill_lv) int skill_get_fixed_cast(int skill_id, int skill_lv) { - int idx = skill->get_index(skill_id); + int idx; + if (skill_id == 0) + return 0; + idx = skill->get_index(skill_id); Assert_ret(idx != 0); Assert_ret(skill_lv > 0); #ifdef RENEWAL_CAST diff --git a/src/map/skill.h b/src/map/skill.h index a0591de74..1e00e488f 100644 --- a/src/map/skill.h +++ b/src/map/skill.h @@ -76,6 +76,7 @@ struct status_change_entry; //Constants to identify the skill's inf value: enum e_skill_inf { + INF_NONE = 0x00, INF_ATTACK_SKILL = 0x01, INF_GROUND_SKILL = 0x02, INF_SELF_SKILL = 0x04, // Skills casted on self where target is automatically chosen @@ -88,6 +89,7 @@ enum e_skill_inf { //The NK value applies only to non INF_GROUND_SKILL skills //when determining skill castend function to invoke. enum e_skill_nk { + NK_NONE = 0x00, NK_NO_DAMAGE = 0x01, NK_SPLASH = 0x02|0x04, // 0x4 = splash & split NK_SPLASH_ONLY = 0x02, @@ -102,6 +104,7 @@ enum e_skill_nk { //A skill with 3 would be no damage + splash: area of effect. //Constants to identify a skill's inf2 value. enum e_skill_inf2 { + INF2_NONE = 0x00000, INF2_QUEST_SKILL = 0x00001, INF2_NPC_SKILL = 0x00002, // NPC skills are those that players can't have in their skill tree. INF2_WEDDING_SKILL = 0x00004, @@ -132,6 +135,7 @@ enum e_skill_display { }; enum { + UF_NONE = 0x0000, UF_DEFNOTENEMY = 0x0001, // If 'defunit_not_enemy' is set, the target is changed to 'friend' UF_NOREITERATION = 0x0002, // Spell cannot be stacked UF_NOFOOTSET = 0x0004, // Spell cannot be cast near/on targets @@ -158,7 +162,7 @@ enum wl_spheres { }; enum { - ST_NONE, + ST_NONE = 0, ST_HIDING, ST_CLOAKING, ST_HIDDEN, -- cgit v1.2.3-60-g2f50