summaryrefslogtreecommitdiff
path: root/src/map/skill.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/skill.h')
-rw-r--r--src/map/skill.h174
1 files changed, 138 insertions, 36 deletions
diff --git a/src/map/skill.h b/src/map/skill.h
index eff9ed7fc..fdeaefe01 100644
--- a/src/map/skill.h
+++ b/src/map/skill.h
@@ -23,6 +23,7 @@
#include "map/map.h" // struct block_list
#include "map/status.h" // enum sc_type
+#include "map/unitdefines.h" // enum unit_dir
#include "common/hercules.h"
#include "common/db.h"
#include "common/mmo.h" // MAX_SKILL_DB, struct square
@@ -49,7 +50,7 @@ struct status_change_entry;
#define MAX_ARROW_RESOURCE 5
#define MAX_SKILL_ABRA_DB 210
#define MAX_SKILL_IMPROVISE_DB 30
-#define MAX_SKILL_LEVEL 10
+#define MAX_SKILL_LEVEL 20
#define MAX_SKILL_UNIT_LAYOUT 45
#define MAX_SQUARE_LAYOUT 5 // 11*11 Placement of a maximum unit
#define MAX_SKILL_UNIT_COUNT ((MAX_SQUARE_LAYOUT*2+1)*(MAX_SQUARE_LAYOUT*2+1))
@@ -59,6 +60,10 @@ struct status_change_entry;
#define MAX_SKILLUNITGROUPTICKSET 25
#define MAX_SKILL_NAME_LENGTH 32
+#ifndef MAX_SKILL_DESC_LENGTH
+ #define MAX_SKILL_DESC_LENGTH 50
+#endif
+
// Custom Skill Ranges is used in skill_get_index, to allocate indexes based on ID and gaps between 2 SkillID
#ifndef CUSTOM_SKILL_RANGES
#define CUSTOM_SKILL_RANGES
@@ -1723,41 +1728,83 @@ enum {
UNT_MAX = 0x190
};
+/** Constants to identify the auto-cast type. **/
+enum autocast_type {
+ AUTOCAST_NONE = 0,
+ AUTOCAST_TEMP, // Used when type is only required during the execution of the calling instance. (For example bAutoSpell* skills.)
+ AUTOCAST_ABRA, // Used for Abracadabra (Hocus pocus).
+ AUTOCAST_IMPROVISE, // Used for Improvised Song.
+ AUTOCAST_ITEM, // Used for itemskill() script command.
+};
+
+/** Constants for allowed skill use while interacting with NPC. **/
+enum skill_enabled_npc_flags {
+ SKILLENABLEDNPC_NONE = 0, //!< Don't allow using any skills while interacting with NPC.
+ SKILLENABLEDNPC_SELF = 1, //!< Allow using non-damaging self skills while interacting with NPC.
+ SKILLENABLEDNPC_ALL = 2, //!< Allow using all skills while interacting with NPC.
+};
+
/**
* Structures
**/
+/** A container holding all required items. **/
+struct skill_required_item_data {
+ struct {
+ int id;
+ int amount[MAX_SKILL_LEVEL];
+ } item[MAX_SKILL_ITEM_REQUIRE];
+ bool any[MAX_SKILL_LEVEL];
+};
+
struct skill_condition {
int weapon,ammo,ammo_qty,hp,sp,zeny,spiritball,mhp,state;
+ int msp;
int itemid[MAX_SKILL_ITEM_REQUIRE],amount[MAX_SKILL_ITEM_REQUIRE];
+ int equip_id[MAX_SKILL_ITEM_REQUIRE];
+ int equip_amount[MAX_SKILL_ITEM_REQUIRE];
};
// Database skills
struct s_skill_db {
int nameid;
- char name[MAX_SKILL_NAME_LENGTH];
- char desc[40];
- int range[MAX_SKILL_LEVEL],hit,inf,element[MAX_SKILL_LEVEL],nk,splash[MAX_SKILL_LEVEL],max;
+ char name[MAX_SKILL_NAME_LENGTH + 1];
+ char desc[MAX_SKILL_DESC_LENGTH + 1];
+ int range[MAX_SKILL_LEVEL];
+ int hit[MAX_SKILL_LEVEL];
+ int inf;
+ int element[MAX_SKILL_LEVEL];
+ int nk;
+ int splash[MAX_SKILL_LEVEL];
+ int max;
int num[MAX_SKILL_LEVEL];
int cast[MAX_SKILL_LEVEL],walkdelay[MAX_SKILL_LEVEL],delay[MAX_SKILL_LEVEL];
#ifdef RENEWAL_CAST
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 inf2,maxcount[MAX_SKILL_LEVEL],skill_type;
+ int castcancel[MAX_SKILL_LEVEL];
+ int cast_def_rate[MAX_SKILL_LEVEL];
+ int inf2;
+ int maxcount[MAX_SKILL_LEVEL];
+ int skill_type[MAX_SKILL_LEVEL];
int blewcount[MAX_SKILL_LEVEL];
int hp[MAX_SKILL_LEVEL],sp[MAX_SKILL_LEVEL],mhp[MAX_SKILL_LEVEL],hp_rate[MAX_SKILL_LEVEL],sp_rate[MAX_SKILL_LEVEL],zeny[MAX_SKILL_LEVEL];
- int weapon,ammo,ammo_qty[MAX_SKILL_LEVEL],state,spiritball[MAX_SKILL_LEVEL];
- int itemid[MAX_SKILL_ITEM_REQUIRE],amount[MAX_SKILL_ITEM_REQUIRE];
+ int msp[MAX_SKILL_LEVEL];
+ int weapon;
+ int ammo;
+ int ammo_qty[MAX_SKILL_LEVEL];
+ int state[MAX_SKILL_LEVEL];
+ int spiritball[MAX_SKILL_LEVEL];
int castnodex[MAX_SKILL_LEVEL], delaynodex[MAX_SKILL_LEVEL];
- int nocast;
- int unit_id[2];
+ int unit_id[MAX_SKILL_LEVEL][2];
int unit_layout_type[MAX_SKILL_LEVEL];
int unit_range[MAX_SKILL_LEVEL];
- int unit_interval;
- int unit_target;
+ int unit_interval[MAX_SKILL_LEVEL];
+ int unit_target[MAX_SKILL_LEVEL];
int unit_flag;
+ struct skill_required_item_data req_items;
+ struct skill_required_item_data req_equip;
};
struct s_skill_unit_layout {
@@ -1943,8 +1990,8 @@ struct skill_interface {
int unit_group_newid;
/* accesssors */
int (*get_index) (int skill_id);
- int (*get_type) (int skill_id);
- int (*get_hit) (int skill_id);
+ int (*get_type) (int skill_id, int skill_lv);
+ int (*get_hit) (int skill_id, int skill_lv);
int (*get_inf) (int skill_id);
int (*get_ele) (int skill_id, int skill_lv);
int (*get_nk) (int skill_id);
@@ -1954,13 +2001,19 @@ struct skill_interface {
int (*get_splash) (int skill_id, int skill_lv);
int (*get_hp) (int skill_id, int skill_lv);
int (*get_mhp) (int skill_id, int skill_lv);
+ int (*get_msp) (int skill_id, int skill_lv);
int (*get_sp) (int skill_id, int skill_lv);
int (*get_hp_rate) (int skill_id, int skill_lv);
int (*get_sp_rate) (int skill_id, int skill_lv);
- int (*get_state) (int skill_id);
+ int (*get_state) (int skill_id, int skill_lv);
int (*get_spiritball) (int skill_id, int skill_lv);
+ int (*get_item_index) (int skill_id, int skill_lv);
int (*get_itemid) (int skill_id, int item_idx);
- int (*get_itemqty) (int skill_id, int item_idx);
+ int (*get_itemqty) (int skill_id, int item_idx, int skill_lv);
+ bool (*get_item_any_flag) (int skill_id, int skill_lv);
+ int (*get_equip_id) (int skill_id, int item_idx);
+ int (*get_equip_amount) (int skill_id, int item_idx, int skill_lv);
+ bool (*get_equip_any_flag) (int skill_id, int skill_lv);
int (*get_zeny) (int skill_id, int skill_lv);
int (*get_num) (int skill_id, int skill_lv);
int (*get_cast) (int skill_id, int skill_lv);
@@ -1970,19 +2023,19 @@ struct skill_interface {
int (*get_time2) (int skill_id, int skill_lv);
int (*get_castnodex) (int skill_id, int skill_lv);
int (*get_delaynodex) (int skill_id, int skill_lv);
- int (*get_castdef) (int skill_id);
+ int (*get_castdef) (int skill_id, int skill_lv);
int (*get_weapontype) (int skill_id);
int (*get_ammotype) (int skill_id);
int (*get_ammo_qty) (int skill_id, int skill_lv);
- int (*get_unit_id) (int skill_id, int flag);
+ int (*get_unit_id) (int skill_id, int skill_lv, 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);
- int (*get_unit_target) (int skill_id);
- int (*get_unit_interval) (int skill_id);
- int (*get_unit_bl_target) (int skill_id);
+ int (*get_unit_target) (int skill_id, int skill_lv);
+ int (*get_unit_interval) (int skill_id, int skill_lv);
+ int (*get_unit_bl_target) (int skill_id, int skill_lv);
int (*get_unit_layout_type) (int skill_id, int skill_lv);
int (*get_unit_range) (int skill_id, int skill_lv);
int (*get_cooldown) (int skill_id, int skill_lv);
@@ -1994,7 +2047,7 @@ struct skill_interface {
int (*get_casttype2) (int index);
bool (*is_combo) (int skill_id);
int (*name2id) (const char* name);
- int (*isammotype) (struct map_session_data *sd, int skill_id);
+ int (*isammotype) (struct map_session_data *sd, int skill_id, int skill_lv);
int (*castend_id) (int tid, int64 tick, int id, intptr_t data);
int (*castend_pos) (int tid, int64 tick, int id, intptr_t data);
int (*castend_map) ( struct map_session_data *sd,uint16 skill_id, const char *mapname);
@@ -2002,7 +2055,7 @@ struct skill_interface {
int (*addtimerskill) (struct block_list *src, int64 tick, int target, int x, int y, uint16 skill_id, uint16 skill_lv, int type, int flag);
int (*additional_effect) (struct block_list* src, struct block_list *bl, uint16 skill_id, uint16 skill_lv, int attack_type, int dmg_lv, int64 tick);
int (*counter_additional_effect) (struct block_list* src, struct block_list *bl, uint16 skill_id, uint16 skill_lv, int attack_type, int64 tick);
- int (*blown) (struct block_list* src, struct block_list* target, int count, int8 dir, int flag);
+ int (*blown) (struct block_list* src, struct block_list* target, int count, enum unit_dir dir, int flag);
int (*break_equip) (struct block_list *bl, unsigned short where, int rate, int flag);
int (*strip_equip) (struct block_list *bl, unsigned short where, int rate, int lv, int time);
struct skill_unit_group* (*id2group) (int group_id);
@@ -2010,7 +2063,7 @@ struct skill_interface {
struct skill_unit *(*initunit) (struct skill_unit_group *group, int idx, int x, int y, int val1, int val2);
int (*delunit) (struct skill_unit *su);
struct skill_unit_group *(*init_unitgroup) (struct block_list* src, int count, uint16 skill_id, uint16 skill_lv, int unit_id, int limit, int interval);
- int (*del_unitgroup) (struct skill_unit_group *group, const char* file, int line, const char* func);
+ int (*del_unitgroup) (struct skill_unit_group *group);
int (*clear_unitgroup) (struct block_list *src);
int (*clear_group) (struct block_list *bl, int flag);
int (*unit_onplace) (struct skill_unit *src, struct block_list *bl, int64 tick);
@@ -2019,9 +2072,12 @@ struct skill_interface {
int (*cast_fix_sc) ( struct block_list *bl, int time);
int (*vf_cast_fix) ( struct block_list *bl, double time, uint16 skill_id, uint16 skill_lv);
int (*delay_fix) ( struct block_list *bl, uint16 skill_id, uint16 skill_lv);
- bool (*is_item_skill) (struct map_session_data *sd, int skill_id, int skill_lv);
+ int (*check_condition_required_equip) (struct map_session_data *sd, int skill_id, int skill_lv);
int (*check_condition_castbegin) (struct map_session_data *sd, uint16 skill_id, uint16 skill_lv);
+ int (*check_condition_required_items) (struct map_session_data *sd, int skill_id, int skill_lv);
+ bool (*items_required) (struct map_session_data *sd, int skill_id, int skill_lv);
int (*check_condition_castend) (struct map_session_data *sd, uint16 skill_id, uint16 skill_lv);
+ int (*get_any_item_index) (struct map_session_data *sd, int skill_id, int skill_lv);
int (*consume_requirement) (struct map_session_data *sd, uint16 skill_id, uint16 skill_lv, short type);
struct skill_condition (*get_requirement) (struct map_session_data *sd, uint16 skill_id, uint16 skill_lv);
int (*check_pc_partner) (struct map_session_data *sd, uint16 skill_id, uint16* skill_lv, int range, int cast_flag);
@@ -2045,6 +2101,7 @@ struct skill_interface {
int (*not_ok_hom) (uint16 skill_id, struct homun_data *hd);
int (*not_ok_hom_unknown) (uint16 skill_id, struct homun_data *hd);
int (*not_ok_mercenary) (uint16 skill_id, struct mercenary_data *md);
+ void (*validate_autocast_data) (struct map_session_data *sd, int skill_id, int skill_lv);
int (*chastle_mob_changetarget) (struct block_list *bl,va_list ap);
int (*can_produce_mix) ( struct map_session_data *sd, int nameid, int trigger, int qty);
int (*produce_mix) ( struct map_session_data *sd, uint16 skill_id, int nameid, int slot1, int slot2, int slot3, int qty );
@@ -2064,7 +2121,7 @@ struct skill_interface {
int (*check_unit_range_sub) (struct block_list *bl, va_list ap);
int (*check_unit_range2) (struct block_list *bl, int x, int y, uint16 skill_id, uint16 skill_lv);
int (*check_unit_range2_sub) (struct block_list *bl, va_list ap);
- void (*toggle_magicpower) (struct block_list *bl, uint16 skill_id);
+ void (*toggle_magicpower) (struct block_list *bl, uint16 skill_id, int skill_lv);
int (*magic_reflect) (struct block_list* src, struct block_list* bl, int type);
int (*onskillusage) (struct map_session_data *sd, struct block_list *bl, uint16 skill_id, int64 tick);
int (*cell_overlap) (struct block_list *bl, va_list ap);
@@ -2085,8 +2142,8 @@ struct skill_interface {
bool (*dance_switch) (struct skill_unit* su, int flag);
int (*check_condition_char_sub) (struct block_list *bl, va_list ap);
int (*check_condition_mob_master_sub) (struct block_list *bl, va_list ap);
- void (*brandishspear_first) (struct square *tc, uint8 dir, int16 x, int16 y);
- void (*brandishspear_dir) (struct square* tc, uint8 dir, int are);
+ void (*brandishspear_first) (struct square *tc, enum unit_dir dir, int16 x, int16 y);
+ void (*brandishspear_dir) (struct square* tc, enum unit_dir dir, int are);
int (*get_fixed_cast) (int skill_id, int skill_lv);
int (*sit_count) (struct block_list *bl, va_list ap);
int (*sit_in) (struct block_list *bl, va_list ap);
@@ -2105,24 +2162,68 @@ struct skill_interface {
int (*unit_timer_sub) (union DBKey key, struct DBData *data, va_list ap);
void (*init_unit_layout) (void);
void (*init_unit_layout_unknown) (int skill_idx, int pos);
+ void (*validate_id) (struct config_setting_t *conf, struct s_skill_db *sk, int conf_index);
+ bool (*name_contains_invalid_character) (const char *name);
+ void (*validate_name) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_max_level) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_description) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_range) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_hittype) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_skilltype) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_skillinfo) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_attacktype) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_element) (struct config_setting_t *conf, struct s_skill_db *sk);
- void (*validate_skillinfo) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_damagetype) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_splash_range) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_number_of_hits) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_interrupt_cast) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_cast_def_rate) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_number_of_instances) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_knock_back_tiles) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_cast_time) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_act_delay) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_walk_delay) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_skill_data1) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_skill_data2) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_cooldown) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_fixed_cast_time) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_castnodex) (struct config_setting_t *conf, struct s_skill_db *sk, bool delay);
+ void (*validate_hp_cost) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_sp_cost) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_hp_rate_cost) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_sp_rate_cost) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_max_hp_trigger) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_max_sp_trigger) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_zeny_cost) (struct config_setting_t *conf, struct s_skill_db *sk);
+ int (*validate_weapontype_sub) (const char *type, bool on, struct s_skill_db *sk);
void (*validate_weapontype) (struct config_setting_t *conf, struct s_skill_db *sk);
+ int (*validate_ammotype_sub) (const char *type, bool on, struct s_skill_db *sk);
void (*validate_ammotype) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_ammo_amount) (struct config_setting_t *conf, struct s_skill_db *sk);
+ int (*validate_state_sub) (const char *state);
void (*validate_state) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_spirit_sphere_cost) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_item_requirements_sub_item_amount) (struct config_setting_t *conf, struct s_skill_db *sk, int item_index);
+ void (*validate_item_requirements_sub_items) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_item_requirements_sub_any_flag) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_item_requirements) (struct config_setting_t *conf, struct s_skill_db *sk);
- void (*validate_unit_target) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_equip_requirements_sub_item_amount) (struct config_setting_t *conf, struct s_skill_db *sk, int item_index);
+ void (*validate_equip_requirements_sub_items) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_equip_requirements_sub_any_flag) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_equip_requirements) (struct config_setting_t *conf, struct s_skill_db *sk);
+ int (*validate_requirements_item_name) (const char *name);
+ void (*validate_requirements) (struct config_setting_t *conf, struct s_skill_db *sk);
+ int (*validate_unit_id_sub) (int unit_id);
+ void (*validate_unit_id) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_unit_layout) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_unit_range) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_unit_interval) (struct config_setting_t *conf, struct s_skill_db *sk);
+ int (*validate_unit_flag_sub) (const char *type, bool on, struct s_skill_db *sk);
void (*validate_unit_flag) (struct config_setting_t *conf, struct s_skill_db *sk);
+ int (*validate_unit_target_sub) (const char *target);
+ void (*validate_unit_target) (struct config_setting_t *conf, struct s_skill_db *sk);
+ void (*validate_unit) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_additional_fields) (struct config_setting_t *conf, struct s_skill_db *sk);
- bool (*validate_skilldb) (struct s_skill_db *skt, const char *source);
- int (*validate_weapontype_sub) (const char *type, bool on, struct s_skill_db *sk);
- int (*validate_ammotype_sub) (const char *type, bool on, struct s_skill_db *sk);
- int (*validate_unit_flag_sub) (const char *type, bool on, struct s_skill_db *sk);
bool (*read_skilldb) (const char *filename);
void (*config_set_level) (struct config_setting_t *conf, int *arr);
void (*level_set_value) (int *arr, int value);
@@ -2163,7 +2264,7 @@ struct skill_interface {
void (*attack_display_unknown) (int *attack_type, struct block_list* src, struct block_list *dsrc, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag, int *type, struct Damage *dmg, int64 *damage);
int (*attack_copy_unknown) (int *attack_type, struct block_list* src, struct block_list *dsrc, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag);
int (*attack_dir_unknown) (int *attack_type, struct block_list* src, struct block_list *dsrc, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag);
- void (*attack_blow_unknown) (int *attack_type, struct block_list* src, struct block_list *dsrc, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag, int *type, struct Damage *dmg, int64 *damage, int8 *dir);
+ void (*attack_blow_unknown) (int *attack_type, struct block_list* src, struct block_list *dsrc, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag, int *type, struct Damage *dmg, int64 *damage, enum unit_dir *dir);
void (*attack_post_unknown) (int *attack_type, struct block_list* src, struct block_list *dsrc, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag);
bool (*timerskill_dead_unknown) (struct block_list *src, struct unit_data *ud, struct skill_timerskill *skl);
void (*timerskill_target_unknown) (int tid, int64 tick, struct block_list *src, struct block_list *target, struct unit_data *ud, struct skill_timerskill *skl);
@@ -2190,6 +2291,7 @@ struct skill_interface {
int (*splash_target) (struct block_list* bl);
int (*check_npc_chaospanic) (struct block_list *bl, va_list args);
int (*count_wos) (struct block_list *bl, va_list ap);
+ int (*get_linked_song_dance_id) (int skill_id);
};
#ifdef HERCULES_CORE