diff options
Diffstat (limited to 'src/map/script.h')
-rw-r--r-- | src/map/script.h | 339 |
1 files changed, 301 insertions, 38 deletions
diff --git a/src/map/script.h b/src/map/script.h index a1fbe31f0..511497a66 100644 --- a/src/map/script.h +++ b/src/map/script.h @@ -2,8 +2,8 @@ * This file is part of Hercules. * http://herc.ws - http://github.com/HerculesWS/Hercules * - * Copyright (C) 2012-2015 Hercules Dev Team - * Copyright (C) Athena Dev Teams + * Copyright (C) 2012-2020 Hercules Dev Team + * Copyright (C) Athena Dev Teams * * Hercules is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -50,7 +50,7 @@ struct item_data; #define NUM_WHISPER_VAR 10 /// Maximum amount of elements in script arrays -#define SCRIPT_MAX_ARRAYSIZE (UINT_MAX - 1) +#define SCRIPT_MAX_ARRAYSIZE (INT_MAX - 1) #define SCRIPT_BLOCK_SIZE 512 @@ -64,6 +64,9 @@ struct item_data; #define SCRIPT_EQUIP_TABLE_SIZE 20 +#define MAX_MENU_OPTIONS 0xFF +#define MAX_MENU_LENGTH 0x800 + //#define SCRIPT_DEBUG_DISP //#define SCRIPT_DEBUG_DISASM //#define SCRIPT_DEBUG_HASH @@ -143,7 +146,6 @@ struct item_data; /// Returns if this a reference to a param #define reference_toparam(data) ( script->str_data[reference_getid(data)].type == C_PARAM ) /// Returns if this a reference to a variable -//##TODO confirm it's C_NAME [FlavioJS] #define reference_tovariable(data) ( script->str_data[reference_getid(data)].type == C_NAME ) /// Returns the unique id of the reference (id and index) #define reference_getuid(data) ( (data)->u.num ) @@ -178,6 +180,8 @@ struct item_data; #define BUILDIN(x) bool buildin_ ## x (struct script_state* st) +#define get_buildin_name(st) ( script->get_str((int)(script_getdata((st), 0)->u.num)) ) + #define script_fetch(st, n, t) do { \ if( script_hasdata((st),(n)) ) \ (t)=script_getnum((st),(n)); \ @@ -235,6 +239,7 @@ typedef enum c_op { C_SUB_PRE, // --a C_RE_EQ, // ~= C_RE_NE, // ~! + C_POW, // ** } c_op; /// Script queue options @@ -335,7 +340,241 @@ enum { MF_RESET, MF_NOTOMB, MF_NOCASHSHOP, - MF_NOVIEWID + MF_NOAUTOLOOT, + MF_NOVIEWID, + MF_PAIRSHIP_STARTABLE, + MF_PAIRSHIP_ENDABLE, + MF_NOSTORAGE, + MF_NOGSTORAGE +}; + +enum navigation_service { + NAV_NONE = 0, + NAV_AIRSHIP_ONLY = 1, + NAV_SCROLL_ONLY = 10, + NAV_AIRSHIP_AND_SCROLL = NAV_AIRSHIP_ONLY + NAV_SCROLL_ONLY, //11 + NAV_KAFRA_ONLY = 100, + NAV_KAFRA_AND_AIRSHIP = NAV_KAFRA_ONLY + NAV_AIRSHIP_ONLY, // 101 + NAV_KAFRA_AND_SCROLL = NAV_KAFRA_ONLY + NAV_SCROLL_ONLY, // 110 + NAV_ALL = NAV_AIRSHIP_ONLY + NAV_SCROLL_ONLY + NAV_KAFRA_ONLY // 111-255 +}; + +/** + * Unit Types for script handling. + */ +enum script_unit_types { + UNIT_PC = 0, + UNIT_NPC, + UNIT_PET, + UNIT_MOB, + UNIT_HOM, + UNIT_MER, + UNIT_ELEM, +}; + +/** + * Unit Data Types for script handling. + */ +enum script_unit_data_types { + UDT_TYPE = 0, + UDT_SIZE, + UDT_LEVEL, + UDT_HP, + UDT_MAXHP, + UDT_SP, + UDT_MAXSP, + UDT_MASTERAID, + UDT_MASTERCID, + UDT_MAPIDXY, + UDT_WALKTOXY, + UDT_SPEED, + UDT_MODE, + UDT_AI, + UDT_SCOPTION, + UDT_SEX, + UDT_CLASS, + UDT_HAIRSTYLE, + UDT_HAIRCOLOR, + UDT_HEADBOTTOM, + UDT_HEADMIDDLE, + UDT_HEADTOP, + UDT_CLOTHCOLOR, + UDT_SHIELD, + UDT_WEAPON, + UDT_LOOKDIR, + UDT_CANMOVETICK, + UDT_STR, + UDT_AGI, + UDT_VIT, + UDT_INT, + UDT_DEX, + UDT_LUK, + UDT_ATKRANGE, + UDT_ATKMIN, + UDT_ATKMAX, + UDT_MATKMIN, + UDT_MATKMAX, + UDT_DEF, + UDT_MDEF, + UDT_HIT, + UDT_FLEE, + UDT_PDODGE, + UDT_CRIT, + UDT_RACE, + UDT_ELETYPE, + UDT_ELELEVEL, + UDT_AMOTION, + UDT_ADELAY, + UDT_DMOTION, + UDT_HUNGER, + UDT_INTIMACY, + UDT_LIFETIME, + UDT_MERC_KILLCOUNT, + UDT_STATPOINT, + UDT_ROBE, + UDT_BODY2, + UDT_GROUP, + UDT_DAMAGE_TAKEN_RATE, + UDT_MAX +}; + +/** + * Item Info types. + */ +enum script_iteminfo_types { + ITEMINFO_BUYPRICE = 0, + ITEMINFO_SELLPRICE, + ITEMINFO_TYPE, + ITEMINFO_MAXCHANCE, + ITEMINFO_SEX, + ITEMINFO_LOC, + ITEMINFO_WEIGHT, + ITEMINFO_ATK, + ITEMINFO_DEF, + ITEMINFO_RANGE, + ITEMINFO_SLOTS, + ITEMINFO_SUBTYPE, + ITEMINFO_ELV, + ITEMINFO_WLV, + ITEMINFO_VIEWID, + ITEMINFO_MATK, + ITEMINFO_VIEWSPRITE, + ITEMINFO_TRADE, + ITEMINFO_ELV_MAX, + ITEMINFO_DROPEFFECT_MODE, + ITEMINFO_DELAY, + ITEMINFO_CLASS_BASE_1, + ITEMINFO_CLASS_BASE_2, + ITEMINFO_CLASS_BASE_3, + ITEMINFO_CLASS_UPPER, + // ITEMINFO_FLAG_AVAILABLE, + ITEMINFO_FLAG_NO_REFINE, + ITEMINFO_FLAG_DELAY_CONSUME, + ITEMINFO_FLAG_AUTOEQUIP, + ITEMINFO_FLAG_AUTO_FAVORITE, + ITEMINFO_FLAG_BUYINGSTORE, + ITEMINFO_FLAG_BINDONEQUIP, + ITEMINFO_FLAG_KEEPAFTERUSE, + ITEMINFO_FLAG_FORCE_SERIAL, + ITEMINFO_FLAG_NO_OPTIONS, + ITEMINFO_FLAG_DROP_ANNOUNCE, + ITEMINFO_FLAG_SHOWDROPEFFECT, + ITEMINFO_STACK_AMOUNT, + ITEMINFO_STACK_FLAG, + ITEMINFO_ITEM_USAGE_FLAG, + ITEMINFO_ITEM_USAGE_OVERRIDE, + ITEMINFO_GM_LV_TRADE_OVERRIDE, + ITEMINFO_ID, + ITEMINFO_AEGISNAME, + ITEMINFO_NAME, + ITEMINFO_MAX +}; + +/** + * Mercenary Info types. + */ +enum script_mercinfo_types { + MERCINFO_ID = 0, + MERCINFO_CLASS, + MERCINFO_NAME, + MERCINFO_FAITH, + MERCINFO_CALLS, + MERCINFO_KILLCOUNT, + MERCINFO_LIFETIME, + MERCINFO_LEVEL, + MERCINFO_GID, + + MERCINFO_MAX +}; + +/** + * Pet Info types. + */ +enum script_petinfo_types { + PETINFO_ID = 0, + PETINFO_CLASS, + PETINFO_NAME, + PETINFO_INTIMACY, + PETINFO_HUNGRY, + PETINFO_RENAME, + PETINFO_GID, + PETINFO_EGGITEM, + PETINFO_FOODITEM, + PETINFO_ACCESSORYITEM, + PETINFO_ACCESSORYFLAG, + PETINFO_EVO_EGGID, + PETINFO_AUTOFEED, + + PETINFO_MAX +}; + +/** + * Player blocking actions related flags. + */ +enum pcblock_action_flag { + PCBLOCK_NONE = 0x000, + PCBLOCK_MOVE = 0x001, + PCBLOCK_ATTACK = 0x002, + PCBLOCK_SKILL = 0x004, + PCBLOCK_USEITEM = 0x008, + PCBLOCK_CHAT = 0x010, + PCBLOCK_IMMUNE = 0x020, + PCBLOCK_SITSTAND = 0x040, + PCBLOCK_COMMANDS = 0x080, + PCBLOCK_NPC = 0x100, + PCBLOCK_ALL = 0x1FF, +}; + +/** + * Types of Siege (WoE) + */ +enum siege_type { + SIEGE_TYPE_FE, + SIEGE_TYPE_SE, + SIEGE_TYPE_TE, + SIEGE_TYPE_MAX +}; + +/** + * Types of MadoGear + */ +enum mado_type { + MADO_ROBOT = 0x00, + // unused = 0x01, + MADO_SUITE = 0x02, +#ifndef MADO_MAX + MADO_MAX +#endif +}; + +/** + * Option flags for itemskill() script command. + **/ +enum itemskill_flag { + ISF_NONE = 0x00, + ISF_CHECKCONDITIONS = 0x01, // Check skill conditions and consume them. + ISF_INSTANTCAST = 0x02, // Cast skill instantaneously. + ISF_CASTONSELF = 0x04, // Forcefully cast skill on invoking character without showing the target selection cursor. }; /** @@ -343,8 +582,8 @@ enum { **/ struct Script_Config { - unsigned warn_func_mismatch_argtypes : 1; - unsigned warn_func_mismatch_paramnum : 1; + bool warn_func_mismatch_argtypes; + bool warn_func_mismatch_paramnum; int check_cmdcount; int check_gotocount; int input_min_value; @@ -394,11 +633,20 @@ struct script_data { struct reg_db *ref; ///< Reference to the scope's variables }; +/** + * A script string buffer, used to hold strings used by the script engine. + */ +VECTOR_STRUCT_DECL(script_string_buf, char); + +/** + * Script buffer, used to hold parsed script data. + */ +VECTOR_STRUCT_DECL(script_buf, unsigned char); + // Moved defsp from script_state to script_stack since // it must be saved when script state is RERUNLINE. [Eoe / jA 1094] struct script_code { - int script_size; - unsigned char *script_buf; + struct script_buf script_buf; struct reg_db local; ///< Local (npc) vars unsigned short instances; }; @@ -493,8 +741,8 @@ struct script_syntax_data { int index; // Number of the syntax used in the script int last_func; // buildin index of the last parsed function unsigned int nested_call; //Dont really know what to call this - bool lang_macro_active; - struct DBMap *strings; // string map parsed (used when exporting strings only) + bool lang_macro_active; // Used to generate translation strings + bool lang_macro_fmtstring_active; // Used to generate translation strings struct DBMap *translation_db; //non-null if this npc has any translated strings to be linked }; @@ -517,16 +765,16 @@ struct script_array { unsigned int *members;/* member list */ }; -struct script_string_buf { - char *ptr; - size_t pos,size; +struct string_translation_entry { + uint8 lang_id; + char string[]; }; struct string_translation { int string_id; uint8 translations; - unsigned int len; - char *buf; + int len; + uint8 *buf; // Array of struct string_translation_entry }; /** @@ -566,7 +814,7 @@ struct script_interface { int string_list_size; int string_list_pos; /* */ - unsigned short current_item_id; + int current_item_id; /* */ struct script_label_entry *labels; int label_count; @@ -576,8 +824,7 @@ struct script_interface { /* */ /// temporary buffer for passing around compiled bytecode /// @see add_scriptb, set_label, parse_script - unsigned char* buf; - int pos, size; + struct script_buf buf; /* */ struct script_syntax_data syntax; /* */ @@ -611,26 +858,22 @@ struct script_interface { /* */ unsigned int *generic_ui_array; unsigned int generic_ui_array_size; - /* Set during startup when attempting to export the lang, unset after server initialization is over */ - FILE *lang_export_fp; - char *lang_export_file;/* for lang_export_fp */ /* set and unset on npc_parse_script */ const char *parser_current_npc_name; /* */ int buildin_mes_offset; + int buildin_mesf_offset; int buildin_select_offset; int buildin_lang_macro_offset; + int buildin_lang_macro_fmtstring_offset; /* */ struct DBMap *translation_db;/* npc_name => DBMap (strings) */ - char **translation_buf;/* */ - uint32 translation_buf_size; + VECTOR_DECL(uint8 *) translation_buf; /* */ char **languages; uint8 max_lang_id; /* */ - struct script_string_buf parse_simpleexpr_str; - struct script_string_buf lang_export_line_buf; - struct script_string_buf lang_export_unescaped_buf; + struct script_string_buf parse_simpleexpr_strbuf; /* */ int parse_cleanup_timer_id; /* */ @@ -657,10 +900,12 @@ struct script_interface { struct script_data* (*push_val)(struct script_stack* stack, enum c_op type, int64 val, struct reg_db *ref); struct script_data *(*get_val) (struct script_state* st, struct script_data* data); char* (*get_val_ref_str) (struct script_state* st, struct reg_db *n, struct script_data* data); + char* (*get_val_pc_ref_str) (struct script_state* st, struct reg_db *n, struct script_data* data); char* (*get_val_scope_str) (struct script_state* st, struct reg_db *n, struct script_data* data); char* (*get_val_npc_str) (struct script_state* st, struct reg_db *n, struct script_data* data); char* (*get_val_instance_str) (struct script_state* st, const char* name, struct script_data* data); int (*get_val_ref_num) (struct script_state* st, struct reg_db *n, struct script_data* data); + int (*get_val_pc_ref_num) (struct script_state* st, struct reg_db *n, struct script_data* data); int (*get_val_scope_num) (struct script_state* st, struct reg_db *n, struct script_data* data); int (*get_val_npc_num) (struct script_state* st, struct reg_db *n, struct script_data* data); int (*get_val_instance_num) (struct script_state* st, const char* name, struct script_data* data); @@ -688,8 +933,9 @@ struct script_interface { void (*run_autobonus) (const char *autobonus,int id, int pos); void (*cleararray_pc) (struct map_session_data* sd, const char* varname, void* value); void (*setarray_pc) (struct map_session_data* sd, const char* varname, uint32 idx, void* value, int* refcache); - int (*config_read) (char *cfgName); + bool (*config_read) (const char *filename, bool imported); int (*add_str) (const char* p); + int (*add_variable) (const char *varname); const char* (*get_str) (int id); int (*search_str) (const char* p); void (*setd_sub) (struct script_state *st, struct map_session_data *sd, const char *varname, int elem, const void *value, struct reg_db *ref); @@ -706,8 +952,8 @@ struct script_interface { const char * (*parse_syntax_close) (const char *p); const char * (*parse_syntax_close_sub) (const char *p, int *flag); const char * (*parse_syntax) (const char *p); - c_op (*get_com) (unsigned char *scriptbuf, int *pos); - int (*get_num) (unsigned char *scriptbuf, int *pos); + c_op (*get_com) (const struct script_buf *scriptbuf, int *pos); + int (*get_num) (const struct script_buf *scriptbuf, int *pos); const char* (*op2name) (int op); void (*reportsrc) (struct script_state *st); void (*reportdata) (struct script_data *data); @@ -724,21 +970,28 @@ struct script_interface { int (*add_word) (const char *p); const char* (*parse_callfunc) (const char *p, int require_paren, int is_custom); void (*parse_nextline) (bool first, const char *p); - const char* (*parse_variable) (const char *p); - const char* (*parse_simpleexpr) (const char *p); - const char* (*parse_expr) (const char *p); - const char* (*parse_line) (const char *p); - void (*read_constdb) (void); + const char *(*parse_variable) (const char *p); + const char *(*parse_simpleexpr) (const char *p); + const char *(*parse_simpleexpr_paren) (const char *p); + const char *(*parse_simpleexpr_number) (const char *p); + const char *(*parse_simpleexpr_string) (const char *p); + const char *(*parse_simpleexpr_name) (const char *p); + void (*add_translatable_string) (const struct script_string_buf *string, const char *start_point); + const char *(*parse_expr) (const char *p); + const char *(*parse_line) (const char *p); + void (*read_constdb) (bool reload); void (*constdb_comment) (const char *comment); void (*load_parameters) (void); const char* (*print_line) (StringBuf *buf, const char *p, const char *mark, int line); void (*errorwarning_sub) (StringBuf *buf, const char *src, const char *file, int start_line, const char *error_msg, const char *error_pos); int (*set_reg) (struct script_state *st, struct map_session_data *sd, int64 num, const char *name, const void *value, struct reg_db *ref); void (*set_reg_ref_str) (struct script_state* st, struct reg_db *n, int64 num, const char* name, const char *str); + void (*set_reg_pc_ref_str) (struct script_state* st, struct reg_db *n, int64 num, const char* name, const char *str); void (*set_reg_scope_str) (struct script_state* st, struct reg_db *n, int64 num, const char* name, const char *str); void (*set_reg_npc_str) (struct script_state* st, struct reg_db *n, int64 num, const char* name, const char *str); void (*set_reg_instance_str) (struct script_state* st, int64 num, const char* name, const char *str); void (*set_reg_ref_num) (struct script_state* st, struct reg_db *n, int64 num, const char* name, int val); + void (*set_reg_pc_ref_num) (struct script_state* st, struct reg_db *n, int64 num, const char* name, int val); void (*set_reg_scope_num) (struct script_state* st, struct reg_db *n, int64 num, const char* name, int val); void (*set_reg_npc_num) (struct script_state* st, struct reg_db *n, int64 num, const char* name, int val); void (*set_reg_instance_num) (struct script_state* st, int64 num, const char* name, int val); @@ -749,11 +1002,14 @@ struct script_interface { void (*op_2num) (struct script_state *st, int op, int i1, int i2); void (*op_2) (struct script_state *st, int op); void (*op_1) (struct script_state *st, int op); - void (*check_buildin_argtype) (struct script_state *st, int func); + bool (*check_buildin_argtype) (struct script_state *st, int func); void (*detach_state) (struct script_state *st, bool dequeue_event); int (*db_free_code_sub) (union DBKey key, struct DBData *data, va_list ap); void (*add_autobonus) (const char *autobonus); int (*menu_countoptions) (const char *str, int max_count, int *total); + int (*buildin_recovery_sub) (struct map_session_data *sd); + int (*buildin_recovery_pc_sub) (struct map_session_data *sd, va_list ap); + int (*buildin_recovery_bl_sub) (struct block_list *bl, va_list ap); int (*buildin_areawarp_sub) (struct block_list *bl, va_list ap); int (*buildin_areapercentheal_sub) (struct block_list *bl, va_list ap); void (*buildin_delitem_delete) (struct map_session_data *sd, int idx, int *amount, bool delete_items); @@ -778,6 +1034,7 @@ struct script_interface { int (*buildin_mobuseskill_sub) (struct block_list *bl, va_list ap); int (*cleanfloor_sub) (struct block_list *bl, va_list ap); int (*run_func) (struct script_state *st); + bool (*sprintf_helper) (struct script_state *st, int start, struct StringBuf *out); const char *(*getfuncname) (struct script_state *st); // for ENABLE_CASE_CHECK unsigned int (*calc_hash_ci) (const char *p); @@ -807,16 +1064,22 @@ struct script_interface { unsigned short (*mapindexname2id) (struct script_state *st, const char* name); int (*string_dup) (char *str); void (*load_translations) (void); - void (*load_translation) (const char *file, uint8 lang_id, uint32 *total); + bool (*load_translation_addstring) (const char *file, uint8 lang_id, const char *msgctxt, const struct script_string_buf *msgid, const struct script_string_buf *msgstr); + int (*load_translation_file) (const char *file, uint8 lang_id); + int (*load_translation) (const char *directory, uint8 lang_id); int (*translation_db_destroyer) (union DBKey key, struct DBData *data, va_list ap); void (*clear_translations) (bool reload); int (*parse_cleanup_timer) (int tid, int64 tick, int id, intptr_t data); uint8 (*add_language) (const char *name); - const char *(*get_translation_file_name) (const char *file); + const char *(*get_translation_dir_name) (const char *directory); void (*parser_clean_leftovers) (void); void (*run_use_script) (struct map_session_data *sd, struct item_data *data, int oid); void (*run_item_equip_script) (struct map_session_data *sd, struct item_data *data, int oid); void (*run_item_unequip_script) (struct map_session_data *sd, struct item_data *data, int oid); + void (*run_item_rental_end_script) (struct map_session_data *sd, struct item_data *data, int oid); + void (*run_item_rental_start_script) (struct map_session_data *sd, struct item_data *data, int oid); + void (*run_item_lapineddukddak_script) (struct map_session_data *sd, struct item_data *data, int oid); + bool (*sellitemcurrency_add) (struct npc_data *nd, struct script_state* st, int argIndex); }; #ifdef HERCULES_CORE |