1 | // Copyright (c) Athena Dev Teams - Licensed under GNU GPL |
---|
2 | // For more information, see LICENCE in the main folder |
---|
3 | |
---|
4 | #ifndef _SCRIPT_H_ |
---|
5 | #define _SCRIPT_H_ |
---|
6 | |
---|
7 | extern int potion_flag; //For use on Alchemist improved potions/Potion Pitcher. [Skotlex] |
---|
8 | extern int potion_hp, potion_per_hp, potion_sp, potion_per_sp; |
---|
9 | extern int potion_target; |
---|
10 | |
---|
11 | extern struct Script_Config { |
---|
12 | unsigned warn_func_mismatch_paramnum : 1; |
---|
13 | int check_cmdcount; |
---|
14 | int check_gotocount; |
---|
15 | int input_min_value; |
---|
16 | int input_max_value; |
---|
17 | |
---|
18 | const char *die_event_name; |
---|
19 | const char *kill_pc_event_name; |
---|
20 | const char *kill_mob_event_name; |
---|
21 | const char *login_event_name; |
---|
22 | const char *logout_event_name; |
---|
23 | const char *loadmap_event_name; |
---|
24 | const char *baselvup_event_name; |
---|
25 | const char *joblvup_event_name; |
---|
26 | } script_config; |
---|
27 | |
---|
28 | typedef enum c_op { |
---|
29 | C_NOP, // end of script/no value (nil) |
---|
30 | C_POS, |
---|
31 | C_INT, // number |
---|
32 | C_PARAM, // parameter variable (see pc_readparam/pc_setparam) |
---|
33 | C_FUNC, // buildin function call |
---|
34 | C_STR, // string (free'd automatically) |
---|
35 | C_CONSTSTR, // string (not free'd) |
---|
36 | C_ARG, // start of argument list |
---|
37 | C_NAME, |
---|
38 | C_EOL, // end of line (extra stack values are cleared) |
---|
39 | C_RETINFO, |
---|
40 | C_USERFUNC, // internal script function |
---|
41 | C_USERFUNC_POS, // internal script function label |
---|
42 | |
---|
43 | // operators |
---|
44 | C_OP3, // a ? b : c |
---|
45 | C_LOR, // a || b |
---|
46 | C_LAND, // a && b |
---|
47 | C_LE, // a <= b |
---|
48 | C_LT, // a < b |
---|
49 | C_GE, // a >= b |
---|
50 | C_GT, // a > b |
---|
51 | C_EQ, // a == b |
---|
52 | C_NE, // a != b |
---|
53 | C_XOR, // a ^ b |
---|
54 | C_OR, // a | b |
---|
55 | C_AND, // a & b |
---|
56 | C_ADD, // a + b |
---|
57 | C_SUB, // a - b |
---|
58 | C_MUL, // a * b |
---|
59 | C_DIV, // a / b |
---|
60 | C_MOD, // a % b |
---|
61 | C_NEG, // - a |
---|
62 | C_LNOT, // ! a |
---|
63 | C_NOT, // ~ a |
---|
64 | C_R_SHIFT, // a >> b |
---|
65 | C_L_SHIFT // a << b |
---|
66 | } c_op; |
---|
67 | |
---|
68 | struct script_data { |
---|
69 | enum c_op type; |
---|
70 | union script_data_val { |
---|
71 | int num; |
---|
72 | char *str; |
---|
73 | } u; |
---|
74 | struct linkdb_node** ref; |
---|
75 | }; |
---|
76 | |
---|
77 | // Moved defsp from script_state to script_stack since |
---|
78 | // it must be saved when script state is RERUNLINE. [Eoe / jA 1094] |
---|
79 | struct script_code { |
---|
80 | int script_size; |
---|
81 | unsigned char* script_buf; |
---|
82 | struct linkdb_node* script_vars; |
---|
83 | }; |
---|
84 | |
---|
85 | struct script_stack { |
---|
86 | int sp;// number of entries in the stack |
---|
87 | int sp_max;// capacity of the stack |
---|
88 | int defsp; |
---|
89 | struct script_data *stack_data;// stack |
---|
90 | struct linkdb_node **var_function; // ÖË¶Ï |
---|
91 | }; |
---|
92 | |
---|
93 | struct script_state { |
---|
94 | struct script_stack* stack; |
---|
95 | int start,end; |
---|
96 | int pos,state; |
---|
97 | int rid,oid; |
---|
98 | struct script_code *script, *scriptroot; |
---|
99 | struct sleep_data { |
---|
100 | int tick,timer,charid; |
---|
101 | } sleep; |
---|
102 | }; |
---|
103 | |
---|
104 | struct script_reg { |
---|
105 | int index; |
---|
106 | int data; |
---|
107 | }; |
---|
108 | |
---|
109 | struct script_regstr { |
---|
110 | int index; |
---|
111 | char* data; |
---|
112 | }; |
---|
113 | |
---|
114 | enum script_parse_options { |
---|
115 | SCRIPT_USE_LABEL_DB = 0x1,// records labels in scriptlabel_db |
---|
116 | SCRIPT_IGNORE_EXTERNAL_BRACKETS = 0x2,// ignores the check for {} brackets around the script |
---|
117 | SCRIPT_RETURN_EMPTY_SCRIPT = 0x4// returns the script object instead of NULL for empty scripts |
---|
118 | }; |
---|
119 | |
---|
120 | const char* skip_space(const char* p); |
---|
121 | void script_error(const char* src, const char* file, int start_line, const char* error_msg, const char* error_pos); |
---|
122 | |
---|
123 | struct script_code* parse_script(const char* src,const char* file,int line,int options); |
---|
124 | void run_script_sub(struct script_code *rootscript,int pos,int rid,int oid, char* file, int lineno); |
---|
125 | void run_script(struct script_code*,int,int,int); |
---|
126 | |
---|
127 | int set_var(struct map_session_data *sd, char *name, void *val); |
---|
128 | int conv_num(struct script_state *st,struct script_data *data); |
---|
129 | const char* conv_str(struct script_state *st,struct script_data *data); |
---|
130 | void setd_sub(struct script_state *st, struct map_session_data *sd, char *varname, int elem, void *value, struct linkdb_node **ref); |
---|
131 | int run_script_timer(int tid, unsigned int tick, int id, intptr data); |
---|
132 | void run_script_main(struct script_state *st); |
---|
133 | |
---|
134 | void script_stop_sleeptimers(int id); |
---|
135 | struct linkdb_node* script_erase_sleepdb(struct linkdb_node *n); |
---|
136 | void script_free_stack(struct script_stack*); |
---|
137 | void script_free_code(struct script_code* code); |
---|
138 | void script_free_vars(struct linkdb_node **node); |
---|
139 | |
---|
140 | struct DBMap* script_get_label_db(void); |
---|
141 | struct DBMap* script_get_userfunc_db(void); |
---|
142 | |
---|
143 | int script_config_read(char *cfgName); |
---|
144 | int do_init_script(void); |
---|
145 | int do_final_script(void); |
---|
146 | int add_str(const char *p); |
---|
147 | int script_reload(void); |
---|
148 | |
---|
149 | extern char mapreg_txt[]; |
---|
150 | |
---|
151 | #endif /* _SCRIPT_H_ */ |
---|