diff options
author | Kenpachi Developer <Kenpachi.Developer@gmx.de> | 2020-05-17 00:50:37 +0200 |
---|---|---|
committer | Kenpachi Developer <Kenpachi.Developer@gmx.de> | 2020-06-01 02:01:55 +0200 |
commit | f9ea7676708eebef5006466e8e108b863f7106d9 (patch) | |
tree | ffd3d22bac6d5b72e8d4c9e2a49c05652ae638ab /src/map | |
parent | 29a544a23092e6b1703905f4719ebca412e9558b (diff) | |
download | hercules-f9ea7676708eebef5006466e8e108b863f7106d9.tar.gz hercules-f9ea7676708eebef5006466e8e108b863f7106d9.tar.bz2 hercules-f9ea7676708eebef5006466e8e108b863f7106d9.tar.xz hercules-f9ea7676708eebef5006466e8e108b863f7106d9.zip |
Make InterruptCast can be grouped by levels
Diffstat (limited to 'src/map')
-rw-r--r-- | src/map/skill.c | 43 | ||||
-rw-r--r-- | src/map/skill.h | 5 | ||||
-rw-r--r-- | src/map/unit.c | 4 |
3 files changed, 41 insertions, 11 deletions
diff --git a/src/map/skill.c b/src/map/skill.c index 8be97842e..5ac1bdf71 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -539,14 +539,26 @@ static int skill_get_inf2(int skill_id) return skill->dbs->db[idx].inf2; } -static int skill_get_castcancel(int skill_id) +/** + * Gets a skill's cast interruptibility by its ID and level. + * + * @param skill_id The skill's ID. + * @param skill_lv The skill's level. + * @return The skill's cast interruptibility corresponding to the passed level. Defaults to 0 in case of error. + * + **/ +static int skill_get_castcancel(int skill_id, int skill_lv) { - int idx; if (skill_id == 0) return 0; - idx = skill->get_index(skill_id); + + Assert_ret(skill_lv > 0); + + int idx = skill->get_index(skill_id); + Assert_ret(idx != 0); - return skill->dbs->db[idx].castcancel; + + return skill->dbs->db[idx].castcancel[skill_get_lvl_idx(skill_lv)]; } static int skill_get_maxcount(int skill_id, int skill_lv) @@ -20923,12 +20935,29 @@ static void skill_validate_interrupt_cast(struct config_setting_t *conf, struct nullpo_retv(conf); nullpo_retv(sk); - sk->castcancel = 0; + skill->level_set_value(sk->castcancel, 0); + + struct config_setting_t *t = libconfig->setting_get_member(conf, "InterruptCast"); + + if (t != NULL && config_setting_is_group(t)) { + for (int i = 0; i < MAX_SKILL_LEVEL; i++) { + char lv[6]; // Big enough to contain "Lv999" in case of custom MAX_SKILL_LEVEL. + safesnprintf(lv, sizeof(lv), "Lv%d", i + 1); + int interrupt_cast; + + if (libconfig->setting_lookup_bool(t, lv, &interrupt_cast) == CONFIG_TRUE) + sk->castcancel[i] = (interrupt_cast != 0) ? 1 : 0; + } + + return; + } int interrupt_cast; - if (libconfig->setting_lookup_bool(conf, "InterruptCast", &interrupt_cast) == CONFIG_TRUE) - sk->castcancel = (interrupt_cast != 0) ? 1 : 0; + if (libconfig->setting_lookup_bool(conf, "InterruptCast", &interrupt_cast) == CONFIG_TRUE) { + if (interrupt_cast != 0) + skill->level_set_value(sk->castcancel, 1); + } } /** diff --git a/src/map/skill.h b/src/map/skill.h index af8f3774b..598917f2a 100644 --- a/src/map/skill.h +++ b/src/map/skill.h @@ -1764,7 +1764,8 @@ struct s_skill_db { int fixed_cast[MAX_SKILL_LEVEL]; #endif int upkeep_time[MAX_SKILL_LEVEL],upkeep_time2[MAX_SKILL_LEVEL],cooldown[MAX_SKILL_LEVEL]; - int castcancel,cast_def_rate; + int castcancel[MAX_SKILL_LEVEL]; + int cast_def_rate; int inf2; int maxcount[MAX_SKILL_LEVEL]; int skill_type[MAX_SKILL_LEVEL]; @@ -1997,7 +1998,7 @@ struct skill_interface { int (*get_ammo_qty) (int skill_id, int skill_lv); int (*get_unit_id) (int skill_id, int flag); int (*get_inf2) (int skill_id); - int (*get_castcancel) (int skill_id); + int (*get_castcancel) (int skill_id, int skill_lv); int (*get_maxcount) (int skill_id, int skill_lv); int (*get_blewcount) (int skill_id, int skill_lv); int (*get_unit_flag) (int skill_id); diff --git a/src/map/unit.c b/src/map/unit.c index 53e517045..223a4a82b 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -1152,7 +1152,7 @@ static int unit_stop_walking(struct block_list *bl, int flag) static int unit_skilluse_id(struct block_list *src, int target_id, uint16 skill_id, uint16 skill_lv) { int casttime = skill->cast_fix(src, skill_id, skill_lv); - int castcancel = skill->get_castcancel(skill_id); + int castcancel = skill->get_castcancel(skill_id, skill_lv); int ret = unit->skilluse_id2(src, target_id, skill_id, skill_lv, casttime, castcancel); struct map_session_data *sd = BL_CAST(BL_PC, src); @@ -1790,7 +1790,7 @@ static int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill static int unit_skilluse_pos(struct block_list *src, short skill_x, short skill_y, uint16 skill_id, uint16 skill_lv) { int casttime = skill->cast_fix(src, skill_id, skill_lv); - int castcancel = skill->get_castcancel(skill_id); + int castcancel = skill->get_castcancel(skill_id, skill_lv); int ret = unit->skilluse_pos2(src, skill_x, skill_y, skill_id, skill_lv, casttime, castcancel); struct map_session_data *sd = BL_CAST(BL_PC, src); |