1 //********************************************************************************************
2 //*
3 //*    This file is part of Egoboo.
4 //*
5 //*    Egoboo is free software: you can redistribute it and/or modify it
6 //*    under the terms of the GNU General Public License as published by
7 //*    the Free Software Foundation, either version 3 of the License, or
8 //*    (at your option) any later version.
9 //*
10 //*    Egoboo is distributed in the hope that it will be useful, but
11 //*    WITHOUT ANY WARRANTY; without even the implied warranty of
12 //*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 //*    General Public License for more details.
14 //*
15 //*    You should have received a copy of the GNU General Public License
16 //*    along with Egoboo.  If not, see <http://www.gnu.org/licenses/>.
17 //*
18 //********************************************************************************************
19 
20 /// @file script_compile.c
21 /// @brief Implementation of the script compiler
22 /// @details
23 
24 #include "script_compile.h"
25 
26 #include "log.h"
27 
28 #include "egoboo_vfs.h"
29 #include "egoboo_setup.h"
30 #include "egoboo_strutil.h"
31 #include "egoboo_fileutil.h"
32 #include "egoboo_math.h"
33 #include "egoboo.h"
34 
35 //--------------------------------------------------------------------------------------------
36 //-------------------------------------------------------------------------------------------
37 
38 /// The description of a single pre-defined egoscript token
39 struct s_token
40 {
41     int    iLine;
42     int    iIndex;
43     int    iValue;
44     char   cType;
45     char   cWord[MAXCODENAMESIZE];
46 };
47 typedef struct s_token token_t;
48 
49 //--------------------------------------------------------------------------------------------
50 //--------------------------------------------------------------------------------------------
51 
52 static int     iNumLine;
53 
54 static int     iLineSize;
55 static char    cLineBuffer[MAXLINESIZE] = EMPTY_CSTR;
56 
57 static int     iLoadSize;
58 static Uint8   cLoadBuffer[AISMAXLOADSIZE] = EMPTY_CSTR;
59 
60 static token_t Token;
61 
62 static const char * globalparsename = NULL;
63 
64 //--------------------------------------------------------------------------------------------
65 //--------------------------------------------------------------------------------------------
66 
67 INSTANTIATE_STATIC_ARY( OpListAry, OpList );
68 INSTANTIATE_STATIC_ARY( AisStorageAry, AisStorage );
69 
70 int    AisCompiled_offset = 0;
71 Uint32 AisCompiled_buffer[AISMAXCOMPILESIZE];
72 
73 bool_t debug_scripts     = bfalse;
74 FILE * debug_script_file = NULL;
75 
76 bool_t parseerror  = bfalse;
77 
78 const char * script_function_names[SCRIPT_FUNCTIONS_COUNT] =
79 {
80     /// Scripted AI functions (v0.10)
81     "FIFSPAWNED",                          // == 0
82     "FIFTIMEOUT",                          // == 1
83     "FIFATWAYPOINT",                       // == 2
84     "FIFATLASTWAYPOINT",                   // == 3
85     "FIFATTACKED",                         // == 4
86     "FIFBUMPED",                           // == 5
87     "FIFORDERED",                          // == 6
88     "FIFCALLEDFORHELP",                    // == 7
89     "FSETCONTENT",                         // == 8
90     "FIFKILLED",                           // == 9
91     "FIFTARGETKILLED",                     // == 10
92     "FCLEARWAYPOINTS",                     // == 11
93     "FADDWAYPOINT",                        // == 12
94     "FFINDPATH",                           // == 13
95     "FCOMPASS",                            // == 14
96     "FGETTARGETARMORPRICE",                // == 15
97     "FSETTIME",                            // == 16
98     "FGETCONTENT",                         // == 17
99     "FJOINTARGETTEAM",                     // == 18
100     "FSETTARGETTONEARBYENEMY",             // == 19
101     "FSETTARGETTOTARGETLEFTHAND",          // == 20
102     "FSETTARGETTOTARGETRIGHTHAND",         // == 21
103     "FSETTARGETTOWHOEVERATTACKED",         // == 22
104     "FSETTARGETTOWHOEVERBUMPED",           // == 23
105     "FSETTARGETTOWHOEVERCALLEDFORHELP",    // == 24
106     "FSETTARGETTOOLDTARGET",               // == 25
107     "FSETTURNMODETOVELOCITY",              // == 26
108     "FSETTURNMODETOWATCH",                 // == 27
109     "FSETTURNMODETOSPIN",                  // == 28
110     "FSETBUMPHEIGHT",                      // == 29
111     "FIFTARGETHASID",                      // == 30
112     "FIFTARGETHASITEMID",                  // == 31
113     "FIFTARGETHOLDINGITEMID",              // == 32
114     "FIFTARGETHASSKILLID",                 // == 33
115     "FELSE",                               // == 34
116     "FRUN",                                // == 35
117     "FWALK",                               // == 36
118     "FSNEAK",                              // == 37
119     "FDOACTION",                           // == 38
120     "FKEEPACTION",                         // == 39
121     "FISSUEORDER",                         // == 40
122     "FDROPWEAPONS",                        // == 41
123     "FTARGETDOACTION",                     // == 42
124     "FOPENPASSAGE",                        // == 43
125     "FCLOSEPASSAGE",                       // == 44
126     "FIFPASSAGEOPEN",                      // == 45
127     "FGOPOOF",                             // == 46
128     "FCOSTTARGETITEMID",                   // == 47
129     "FDOACTIONOVERRIDE",                   // == 48
130     "FIFHEALED",                           // == 49
131     "FSENDMESSAGE",                        // == 50
132     "FCALLFORHELP",                        // == 51
133     "FADDIDSZ",                            // == 52
134     "FEND",                                // == 53
135 
136     /// Scripted AI functions (v0.20)
137     "FSETSTATE",                           // == 54
138     "FGETSTATE",                           // == 55
139     "FIFSTATEIS",                          // == 56
140 
141     /// Scripted AI functions (v0.30)
142     "FIFTARGETCANOPENSTUFF",               // == 57
143     "FIFGRABBED",                          // == 58
144     "FIFDROPPED",                          // == 59
145     "FSETTARGETTOWHOEVERISHOLDING",        // == 60
146     "FDAMAGETARGET",                       // == 61
147     "FIFXISLESSTHANY",                     // == 62
148 
149     /// Scripted AI functions (v0.40)
150     "FSETWEATHERTIME",                     // == 63
151     "FGETBUMPHEIGHT",                      // == 64
152     "FIFREAFFIRMED",                       // == 65
153     "FUNKEEPACTION",                       // == 66
154     "FIFTARGETISONOTHERTEAM",              // == 67
155 
156     /// Scripted AI functions (v0.50)
157     "FIFTARGETISONHATEDTEAM",              // == 68
158     "FPRESSLATCHBUTTON",                   // == 69
159     "FSETTARGETTOTARGETOFLEADER",          // == 70
160     "FIFLEADERKILLED",                     // == 71
161     "FBECOMELEADER",                       // == 72
162 
163     /// Scripted AI functions (v0.60)
164     "FCHANGETARGETARMOR",                  // == 73
165     "FGIVEMONEYTOTARGET",                  // == 74
166     "FDROPKEYS",                           // == 75
167     "FIFLEADERISALIVE",                    // == 76
168     "FIFTARGETISOLDTARGET",                // == 77
169     "FSETTARGETTOLEADER",                  // == 78
170     "FSPAWNCHARACTER",                     // == 79
171     "FRESPAWNCHARACTER",                   // == 80
172     "FCHANGETILE",                         // == 81
173     "FIFUSED",                             // == 82
174     "FDROPMONEY",                          // == 83
175     "FSETOLDTARGET",                       // == 84
176     "FDETACHFROMHOLDER",                   // == 85
177     "FIFTARGETHASVULNERABILITYID",         // == 86
178     "FCLEANUP",                            // == 87
179     "FIFCLEANEDUP",                        // == 88
180     "FIFSITTING",                          // == 89
181     "FIFTARGETISHURT",                     // == 90
182     "FIFTARGETISAPLAYER",                  // == 91
183     "FPLAYSOUND",                          // == 92
184     "FSPAWNPARTICLE",                      // == 93
185     "FIFTARGETISALIVE",                    // == 94
186     "FSTOP",                               // == 95
187     "FDISAFFIRMCHARACTER",                 // == 96
188     "FREAFFIRMCHARACTER",                  // == 97
189     "FIFTARGETISSELF",                     // == 98
190     "FIFTARGETISMALE",                     // == 99
191     "FIFTARGETISFEMALE",                   // == 100
192 
193     // Scripted AI functions (v0.70)
194     "FSETTARGETTOSELF",                    // == 101
195     "FSETTARGETTORIDER",                   // == 102
196     "FGETATTACKTURN",                      // == 103
197     "FGETDAMAGETYPE",                      // == 104
198     "FBECOMESPELL",                        // == 105
199     "FBECOMESPELLBOOK",                    // == 106
200     "FIFSCOREDAHIT",                       // == 107
201     "FIFDISAFFIRMED",                      // == 108
202     "FTRANSLATEORDER",                     // == 109
203     "FSETTARGETTOWHOEVERWASHIT",           // == 110
204     "FSETTARGETTOWIDEENEMY",               // == 111
205     "FIFCHANGED",                          // == 112
206     "FIFINWATER",                          // == 113
207     "FIFBORED",                            // == 114
208     "FIFTOOMUCHBAGGAGE",                   // == 115
209     "FIFGROGGED",                          // == 116
210     "FIFDAZED",                            // == 117
211     "FIFTARGETHASSPECIALID",               // == 118
212     "FPRESSTARGETLATCHBUTTON",             // == 119
213     "FIFINVISIBLE",                        // == 120
214     "FIFARMORIS",                          // == 121
215     "FGETTARGETGROGTIME",                  // == 122
216     "FGETTARGETDAZETIME",                  // == 123
217     "FSETDAMAGETYPE",                      // == 124
218     "FSETWATERLEVEL",                      // == 125
219     "FENCHANTTARGET",                      // == 126
220     "FENCHANTCHILD",                       // == 127
221     "FTELEPORTTARGET",                     // == 128
222     "FGIVEEXPERIENCETOTARGET",             // == 129
223     "FINCREASEAMMO",                       // == 130
224     "FUNKURSETARGET",                      // == 131
225     "FGIVEEXPERIENCETOTARGETTEAM",         // == 132
226     "FIFUNARMED",                          // == 133
227     "FRESTOCKTARGETAMMOIDALL",             // == 134
228     "FRESTOCKTARGETAMMOIDFIRST",           // == 135
229     "FFLASHTARGET",                        // == 136
230     "FSETREDSHIFT",                        // == 137
231     "FSETGREENSHIFT",                      // == 138
232     "FSETBLUESHIFT",                       // == 139
233     "FSETLIGHT",                           // == 140
234     "FSETALPHA",                           // == 141
235     "FIFHITFROMBEHIND",                    // == 142
236     "FIFHITFROMFRONT",                     // == 143
237     "FIFHITFROMLEFT",                      // == 144
238     "FIFHITFROMRIGHT",                     // == 145
239     "FIFTARGETISONSAMETEAM",               // == 146
240     "FKILLTARGET",                         // == 147
241     "FUNDOENCHANT",                        // == 148
242     "FGETWATERLEVEL",                      // == 149
243     "FCOSTTARGETMANA",                     // == 150
244     "FIFTARGETHASANYID",                   // == 151
245     "FSETBUMPSIZE",                        // == 152
246     "FIFNOTDROPPED",                       // == 153
247     "FIFYISLESSTHANX",                     // == 154
248     "FSETFLYHEIGHT",                       // == 155
249     "FIFBLOCKED",                          // == 156
250     "FIFTARGETISDEFENDING",                // == 157
251     "FIFTARGETISATTACKING",                // == 158
252     "FIFSTATEIS0",                         // == 159
253     "FIFSTATEIS1",                         // == 160
254     "FIFSTATEIS2",                         // == 161
255     "FIFSTATEIS3",                         // == 162
256     "FIFSTATEIS4",                         // == 163
257     "FIFSTATEIS5",                         // == 164
258     "FIFSTATEIS6",                         // == 165
259     "FIFSTATEIS7",                         // == 166
260     "FIFCONTENTIS",                        // == 167
261     "FSETTURNMODETOWATCHTARGET",           // == 168
262     "FIFSTATEISNOT",                       // == 169
263     "FIFXISEQUALTOY",                      // == 170
264     "FDEBUGMESSAGE",                       // == 171
265 
266     /// Scripted AI functions (v0.80)
267     "FBLACKTARGET",                        // == 172
268     "FSENDMESSAGENEAR",                    // == 173
269     "FIFHITGROUND",                        // == 174
270     "FIFNAMEISKNOWN",                      // == 175
271     "FIFUSAGEISKNOWN",                     // == 176
272     "FIFHOLDINGITEMID",                    // == 177
273     "FIFHOLDINGRANGEDWEAPON",              // == 178
274     "FIFHOLDINGMELEEWEAPON",               // == 179
275     "FIFHOLDINGSHIELD",                    // == 180
276     "FIFKURSED",                           // == 181
277     "FIFTARGETISKURSED",                   // == 182
278     "FIFTARGETISDRESSEDUP",                // == 183
279     "FIFOVERWATER",                        // == 184
280     "FIFTHROWN",                           // == 185
281     "FMAKENAMEKNOWN",                      // == 186
282     "FMAKEUSAGEKNOWN",                     // == 187
283     "FSTOPTARGETMOVEMENT",                 // == 188
284     "FSETXY",                              // == 189
285     "FGETXY",                              // == 190
286     "FADDXY",                              // == 191
287     "FMAKEAMMOKNOWN",                      // == 192
288     "FSPAWNATTACHEDPARTICLE",              // == 193
289     "FSPAWNEXACTPARTICLE",                 // == 194
290     "FACCELERATETARGET",                   // == 195
291     "FIFDISTANCEISMORETHANTURN",           // == 196
292     "FIFCRUSHED",                          // == 197
293     "FMAKECRUSHVALID",                     // == 198
294     "FSETTARGETTOLOWESTTARGET",            // == 199
295     "FIFNOTPUTAWAY",                       // == 200
296     "FIFTAKENOUT",                         // == 201
297     "FIFAMMOOUT",                          // == 202
298     "FPLAYSOUNDLOOPED",                    // == 203
299     "FSTOPSOUND",                          // == 204
300     "FHEALSELF",                           // == 205
301     "FEQUIP",                              // == 206
302     "FIFTARGETHASITEMIDEQUIPPED",          // == 207
303     "FSETOWNERTOTARGET",                   // == 208
304     "FSETTARGETTOOWNER",                   // == 209
305     "FSETFRAME",                           // == 210
306     "FBREAKPASSAGE",                       // == 211
307     "FSETRELOADTIME",                      // == 212
308     "FSETTARGETTOWIDEBLAHID",              // == 213
309     "FPOOFTARGET",                         // == 214
310     "FCHILDDOACTIONOVERRIDE",              // == 215
311     "FSPAWNPOOF",                          // == 216
312     "FSETSPEEDPERCENT",                    // == 217
313     "FSETCHILDSTATE",                      // == 218
314     "FSPAWNATTACHEDSIZEDPARTICLE",         // == 219
315     "FCHANGEARMOR",                        // == 220
316     "FSHOWTIMER",                          // == 221
317     "FIFFACINGTARGET",                     // == 222
318     "FPLAYSOUNDVOLUME",                    // == 223
319     "FSPAWNATTACHEDFACEDPARTICLE",         // == 224
320     "FIFSTATEISODD",                       // == 225
321     "FSETTARGETTODISTANTENEMY",            // == 226
322     "FTELEPORT",                           // == 227
323     "FGIVESTRENGTHTOTARGET",               // == 228
324     "FGIVEWISDOMTOTARGET",                 // == 229
325     "FGIVEINTELLIGENCETOTARGET",           // == 230
326     "FGIVEDEXTERITYTOTARGET",              // == 231
327     "FGIVELIFETOTARGET",                   // == 232
328     "FGIVEMANATOTARGET",                   // == 233
329     "FSHOWMAP",                            // == 234
330     "FSHOWYOUAREHERE",                     // == 235
331     "FSHOWBLIPXY",                         // == 236
332     "FHEALTARGET",                         // == 237
333     "FPUMPTARGET",                         // == 238
334     "FCOSTAMMO",                           // == 239
335     "FMAKESIMILARNAMESKNOWN",              // == 240
336     "FSPAWNATTACHEDHOLDERPARTICLE",        // == 241
337     "FSETTARGETRELOADTIME",                // == 242
338     "FSETFOGLEVEL",                        // == 243
339     "FGETFOGLEVEL",                        // == 244
340     "FSETFOGTAD",                          // == 245
341     "FSETFOGBOTTOMLEVEL",                  // == 246
342     "FGETFOGBOTTOMLEVEL",                  // == 247
343     "FCORRECTACTIONFORHAND",               // == 248
344     "FIFTARGETISMOUNTED",                  // == 249
345     "FSPARKLEICON",                        // == 250
346     "FUNSPARKLEICON",                      // == 251
347     "FGETTILEXY",                          // == 252
348     "FSETTILEXY",                          // == 253
349     "FSETSHADOWSIZE",                      // == 254
350     "FORDERTARGET",                        // == 255
351     "FSETTARGETTOWHOEVERISINPASSAGE",      // == 256
352     "FIFCHARACTERWASABOOK",                // == 257
353 
354     /// Scripted AI functions (v0.90)
355     "FSETENCHANTBOOSTVALUES",              // == 258
356     "FSPAWNCHARACTERXYZ",                  // == 259
357     "FSPAWNEXACTCHARACTERXYZ",             // == 260
358     "FCHANGETARGETCLASS",                  // == 261
359     "FPLAYFULLSOUND",                      // == 262
360     "FSPAWNEXACTCHASEPARTICLE",            // == 263
361     "FCREATEORDER",                        // == 264
362     "FORDERSPECIALID",                     // == 265
363     "FUNKURSETARGETINVENTORY",             // == 266
364     "FIFTARGETISSNEAKING",                 // == 267
365     "FDROPITEMS",                          // == 268
366     "FRESPAWNTARGET",                      // == 269
367     "FTARGETDOACTIONSETFRAME",             // == 270
368     "FIFTARGETCANSEEINVISIBLE",            // == 271
369     "FSETTARGETTONEARESTBLAHID",           // == 272
370     "FSETTARGETTONEARESTENEMY",            // == 273
371     "FSETTARGETTONEARESTFRIEND",           // == 274
372     "FSETTARGETTONEARESTLIFEFORM",         // == 275
373     "FFLASHPASSAGE",                       // == 276
374     "FFINDTILEINPASSAGE",                  // == 277
375     "FIFHELDINLEFTHAND",                   // == 278
376     "FNOTANITEM",                          // == 279
377     "FSETCHILDAMMO",                       // == 280
378     "FIFHITVULNERABLE",                    // == 281
379     "FIFTARGETISFLYING",                   // == 282
380     "FIDENTIFYTARGET",                     // == 283
381     "FBEATMODULE",                         // == 284
382     "FENDMODULE",                          // == 285
383     "FDISABLEEXPORT",                      // == 286
384     "FENABLEEXPORT",                       // == 287
385     "FGETTARGETSTATE",                     // == 288
386 
387     /// Redone in v 0.95
388     "FIFEQUIPPED",                         // == 289
389     "FDROPTARGETMONEY",                    // == 290
390     "FGETTARGETCONTENT",                   // == 291
391     "FDROPTARGETKEYS",                     // == 292
392     "FJOINTEAM",                           // == 293
393     "FTARGETJOINTEAM",                     // == 294
394 
395     /// Below is original code again
396     "FCLEARMUSICPASSAGE",                  // == 295
397     "FCLEARENDMESSAGE",                    // == 296
398     "FADDENDMESSAGE",                      // == 297
399     "FPLAYMUSIC",                          // == 298
400     "FSETMUSICPASSAGE",                    // == 299
401     "FMAKECRUSHINVALID",                   // == 300
402     "FSTOPMUSIC",                          // == 301
403     "FFLASHVARIABLE",                      // == 302
404     "FACCELERATEUP",                       // == 303
405     "FFLASHVARIABLEHEIGHT",                // == 304
406     "FSETDAMAGETIME",                      // == 305
407     "FIFSTATEIS8",                         // == 306
408     "FIFSTATEIS9",                         // == 307
409     "FIFSTATEIS10",                        // == 308
410     "FIFSTATEIS11",                        // == 309
411     "FIFSTATEIS12",                        // == 310
412     "FIFSTATEIS13",                        // == 311
413     "FIFSTATEIS14",                        // == 312
414     "FIFSTATEIS15",                        // == 313
415     "FIFTARGETISAMOUNT",                   // == 314
416     "FIFTARGETISAPLATFORM",                // == 315
417     "FADDSTAT",                            // == 316
418     "FDISENCHANTTARGET",                   // == 317
419     "FDISENCHANTALL",                      // == 318
420     "FSETVOLUMENEARESTTEAMMATE",           // == 319
421     "FADDSHOPPASSAGE",                     // == 320
422     "FTARGETPAYFORARMOR",                  // == 321
423     "FJOINEVILTEAM",                       // == 322
424     "FJOINNULLTEAM",                       // == 323
425     "FJOINGOODTEAM",                       // == 324
426     "FPITSKILL",                           // == 325
427     "FSETTARGETTOPASSAGEID",               // == 326
428     "FMAKENAMEUNKNOWN",                    // == 327
429     "FSPAWNEXACTPARTICLEENDSPAWN",         // == 328
430     "FSPAWNPOOFSPEEDSPACINGDAMAGE",        // == 329
431     "FGIVEEXPERIENCETOGOODTEAM",           // == 330
432 
433     /// Scripted AI functions (v0.95)
434     "FDONOTHING",                          // == 331
435     "FGROGTARGET",                         // == 332
436     "FDAZETARGET",                         // == 333
437     "FENABLERESPAWN",                      // == 334
438     "FDISABLERESPAWN",                     // == 335
439 
440     /// Redone in v 1.10
441     "FDISPELTARGETENCHANTID",              // == 336
442     "FIFHOLDERBLOCKED",                    // == 337
443     "FGETSKILLLEVEL",                      // == 338
444     "FIFTARGETHASNOTFULLMANA",             // == 339
445     "FENABLELISTENSKILL",                  // == 340
446     "FSETTARGETTOLASTITEMUSED",            // == 341
447     "FFOLLOWLINK",                         // == 342  Scripted AI functions (v1.00)
448     "FIFOPERATORISLINUX",                  // == 343
449     "FIFTARGETISAWEAPON",                  // == 344
450     "FIFSOMEONEISSTEALING",                // == 345
451     "FIFTARGETISASPELL",                   // == 346
452     "FIFBACKSTABBED",                      // == 347
453     "FGETTARGETDAMAGETYPE",                // == 348
454     "FADDQUEST",                           // == 349
455     "FBEATQUESTALLPLAYERS",                // == 350
456     "FIFTARGETHASQUEST",                   // == 351
457     "FSETQUESTLEVEL",                      // == 352
458     "FADDQUESTALLPLAYERS",                 // == 353
459     "FADDBLIPALLENEMIES",                  // == 354
460     "FPITSFALL",                           // == 355
461     "FIFTARGETISOWNER",                    // == 356
462 
463     /// adding in the "speech" thing so the script can define its "ouch" sound, for instance
464     "FSETSPEECH",                  // == 357
465     "FSETMOVESPEECH",              // == 358
466     "FSETSECONDMOVESPEECH",        // == 359
467     "FSETATTACKSPEECH",            // == 360
468     "FSETASSISTSPEECH",            // == 361
469     "FSETTERRAINSPEECH",           // == 362
470     "FSETSELECTSPEECH",            // == 363
471 
472     /// Scripted AI functions (v1.10)
473     "FTAKEPICTURE",                // == 364
474     "FIFOPERATORISMACINTOSH",      // == 365
475     "FIFMODULEHASIDSZ",            // == 366
476     "FMORPHTOTARGET",              // == 367
477     "FGIVEMANAFLOWTOTARGET",       // == 368
478     "FGIVEMANARETURNTOTARGET",     // == 369
479     "FSETMONEY",                   // == 370
480     "FIFTARGETCANSEEKURSES",       // == 371
481     "FSPAWNATTACHEDCHARACTER",     // == 372
482     "FKURSETARGET",                // == 373
483     "FSETCHILDCONTENT",            // == 374
484     "FSETTARGETTOCHILD",           // == 375
485     "FSETDAMAGETHRESHOLD",         // == 376
486     "FACCELERATETARGETUP",         // == 377
487     "FSETTARGETAMMO",              // == 378
488     "FENABLEINVICTUS",             // == 379
489     "FDISABLEINVICTUS",            // == 380
490     "FTARGETDAMAGESELF",           // == 381
491     "FSETTARGETSIZE",              // == 382
492     "FIFTARGETISFACINGSELF",       // == 383
493     "FDRAWBILLBOARD",              // == 384
494     "FSETTARGETTOBLAHINPASSAGE"    // == 385
495 };
496 
497 //--------------------------------------------------------------------------------------------
498 //--------------------------------------------------------------------------------------------
499 static void   insert_space( int position );
500 static int    load_one_line( int read );
501 static void   surround_space( int position );
502 static int    get_indentation();
503 static void   fix_operators();
504 static int    parse_token( int read );
505 static void   emit_opcode( BIT_FIELD highbits );
506 static void   parse_line_by_line();
507 static Uint32 jump_goto( int index, int index_end );
508 static void   parse_jumps( int ainumber );
509 static int    ai_goto_colon( int read );
510 static void   get_code( int read );
511 
512 static void load_ai_codes_vfs( const char* loadname );
513 
514 // functions for debugging the scripts
515 #if (DEBUG_SCRIPT_LEVEL > 2) && defined(_DEBUG)
516 static void print_token();
517 static void print_line();
518 #else
519 #   define print_token()
520 #   define print_line()
521 #endif
522 
523 //--------------------------------------------------------------------------------------------
524 //--------------------------------------------------------------------------------------------
script_compiler_init()525 void script_compiler_init()
526 {
527     /// @details BB@> initalize the sctipt compiling module
528 
529     // necessary for loading up the ai script
530     init_all_ai_scripts();
531 
532     load_ai_codes_vfs( "mp_data/aicodes.txt" );
533 
534     debug_script_file = fopen( vfs_resolveWriteFilename( "/debug/script_debug.txt" ), "wt" );
535 }
536 
537 //--------------------------------------------------------------------------------------------
538 //--------------------------------------------------------------------------------------------
insert_space(int position)539 void insert_space( int position )
540 {
541     /// @details ZZ@> This function adds a space into the load line if there isn't one
542     ///    there already
543 
544     char cTmp, cSwap;
545     if ( !isspace( cLineBuffer[position] ) )
546     {
547         cTmp = cLineBuffer[position];
548         cLineBuffer[position] = ' ';
549         position++;
550         iLineSize++;
551 
552         while ( position < iLineSize )
553         {
554             cSwap = cLineBuffer[position];
555             cLineBuffer[position] = cTmp;
556             cTmp = cSwap;
557             position++;
558         }
559 
560         cLineBuffer[position] = CSTR_END; // or cTmp as cTmp == CSTR_END
561     }
562 }
563 
564 //--------------------------------------------------------------------------------------------
load_one_line(int read)565 int load_one_line( int read )
566 {
567     /// @details ZZ@> This function loads a line into the line buffer
568 
569     int stillgoing, foundtext;
570     char cTmp;
571     bool_t tabs_warning_needed;
572 
573     // Parse to start to maintain indentation
574     cLineBuffer[0] = CSTR_END;
575     iLineSize = 0;
576     stillgoing = btrue;
577 
578     // try to trap all end of line conditions so we can properly count the lines
579     tabs_warning_needed = bfalse;
580     while ( read < iLoadSize )
581     {
582         cTmp = cLoadBuffer[read];
583 
584         if ( ASCII_LINEFEED_CHAR == cTmp && C_CARRIAGE_RETURN_CHAR == cLoadBuffer[read+1] )
585         {
586             iLineSize = 0;
587             cLineBuffer[0] = CSTR_END;
588             return read + 2;
589         }
590 
591         if ( C_CARRIAGE_RETURN_CHAR == cTmp && ASCII_LINEFEED_CHAR == cLoadBuffer[read+1] )
592         {
593             iLineSize = 0;
594             cLineBuffer[0] = CSTR_END;
595             return read + 2;
596         }
597 
598         if ( ASCII_LINEFEED_CHAR == cTmp || C_CARRIAGE_RETURN_CHAR == cTmp )
599         {
600             iLineSize = 0;
601             cLineBuffer[0] = CSTR_END;
602             return read + 1;
603         }
604 
605         if ( C_TAB_CHAR == cTmp )
606         {
607             tabs_warning_needed = btrue;
608             cTmp = ' ';
609         }
610 
611         if ( !isspace( cTmp ) )
612         {
613             break;
614         }
615 
616         cLineBuffer[iLineSize] = ' ';
617         cLineBuffer[iLineSize+1] = CSTR_END;
618 
619         read++;
620         iLineSize++;
621     }
622 
623     // Parse to comment or end of line
624     foundtext = bfalse;
625     while ( read < iLoadSize )
626     {
627         cTmp = cLoadBuffer[read];
628         if ( C_CARRIAGE_RETURN_CHAR == cTmp || ASCII_LINEFEED_CHAR == cTmp )
629         {
630             break;
631         }
632 
633         if ( '/' == cTmp && '/' == cLoadBuffer[read + 1] )
634         {
635             break;
636         }
637 
638         read++;
639 
640         if ( iscntrl( cTmp ) )
641         {
642             cTmp = ' ';
643         }
644 
645         if ( !isspace( cTmp ) )
646         {
647             foundtext = btrue;
648 
649             cLineBuffer[iLineSize]   = cTmp;
650             cLineBuffer[iLineSize+1] = CSTR_END;
651             iLineSize++;
652         }
653     }
654     if ( !foundtext )
655     {
656         iLineSize = 0;
657     }
658 
659     // terminate the line buffer properly
660     cLineBuffer[iLineSize] = CSTR_END;
661 
662     if ( iLineSize > 0  && tabs_warning_needed )
663     {
664         log_warning( "Tab character used to define spacing will cause an error \"%s\"(%d) - \n    \"%s\"\n", globalparsename, Token.iLine, cLineBuffer );
665     }
666 
667     // Parse to end of line
668     while ( read < iLoadSize )
669     {
670         if ( ASCII_LINEFEED_CHAR == cLoadBuffer[read] && C_CARRIAGE_RETURN_CHAR == cLoadBuffer[read+1] )
671         {
672             read += 2;
673             break;
674         }
675         else if ( C_CARRIAGE_RETURN_CHAR == cLoadBuffer[read] && ASCII_LINEFEED_CHAR == cLoadBuffer[read+1] )
676         {
677             read += 2;
678             break;
679         }
680         else if ( CSTR_END == cLoadBuffer[read] || ASCII_LINEFEED_CHAR == cLoadBuffer[read] || C_CARRIAGE_RETURN_CHAR == cLoadBuffer[read] )
681         {
682             read += 1;
683             break;
684         }
685 
686         read++;
687     }
688 
689     return read;
690 }
691 
692 //--------------------------------------------------------------------------------------------
surround_space(int position)693 void surround_space( int position )
694 {
695     insert_space( position + 1 );
696     if ( position > 0 )
697     {
698         if ( !isspace( cLineBuffer[position-1] ) )
699         {
700             insert_space( position );
701         }
702     }
703 }
704 
705 //--------------------------------------------------------------------------------------------
get_indentation()706 int get_indentation()
707 {
708     /// @details ZZ@> This function returns the number of starting spaces in a line
709 
710     int cnt;
711     char cTmp;
712 
713     cnt = 0;
714     cTmp = cLineBuffer[cnt];
715     while ( isspace( cTmp ) )
716     {
717         cnt++;
718         cTmp = cLineBuffer[cnt];
719     }
720     if ( HAS_SOME_BITS( cnt, 1 ) )
721     {
722         log_warning( "Invalid indentation \"%s\"(%d) - \"%s\"\n", globalparsename, Token.iLine, cLineBuffer );
723         parseerror = btrue;
724     }
725 
726     cnt >>= 1;
727     if ( cnt > 15 )
728     {
729         log_warning( "Too many levels of indentation \"%s\"(%d) - \"%s\"\n", globalparsename, Token.iLine, cLineBuffer );
730         parseerror = btrue;
731         cnt = 15;
732     }
733 
734     return cnt;
735 }
736 
737 //--------------------------------------------------------------------------------------------
fix_operators()738 void fix_operators()
739 {
740     /// @details ZZ@> This function puts spaces around operators to seperate words
741     ///    better
742 
743     int cnt;
744     char cTmp;
745 
746     cnt = 0;
747 
748     while ( cnt < iLineSize )
749     {
750         cTmp = cLineBuffer[cnt];
751         if ( '+' == cTmp || '-' == cTmp || '/' == cTmp || '*' == cTmp ||
752              '%' == cTmp || '>' == cTmp || '<' == cTmp || '&' == cTmp ||
753              '=' == cTmp )
754         {
755             surround_space( cnt );
756             cnt++;
757         }
758 
759         cnt++;
760     }
761 }
762 
763 //--------------------------------------------------------------------------------------------
parse_token(int read)764 int parse_token( int read )
765 {
766     /// @details ZZ@> This function tells what code is being indexed by read, it
767     ///    will return the next spot to read from and stick the code number
768     ///    in Token.iIndex
769 
770     int cnt, wordsize;
771     char cTmp;
772     IDSZ idsz;
773 
774     // Reset the token
775     Token.iIndex   = MAX_OPCODE;
776     Token.iValue   = 0;
777     Token.cType    = '?';
778     Token.cWord[0] = CSTR_END;
779 
780     // Check bounds
781     if ( read >= iLineSize )
782         return iLineSize;
783 
784     // Skip spaces
785     cTmp = cLineBuffer[read];
786     while ( isspace( cTmp ) && read < iLineSize )
787     {
788         read++;
789         cTmp = cLineBuffer[read];
790     }
791     if ( read >= iLineSize )  { print_token(); return read; }
792 
793     // Load the word into the other buffer
794     wordsize = 0;
795     while ( !isspace( cTmp ) && CSTR_END != cTmp )
796     {
797         Token.cWord[wordsize] = cTmp;  wordsize++;
798         read++;
799         cTmp = cLineBuffer[read];
800     }
801     Token.cWord[wordsize] = CSTR_END;
802 
803     // Check for numeric constant
804     if ( 0 != isdigit( Token.cWord[0] ) )
805     {
806         sscanf( Token.cWord, "%d", &Token.iValue );
807         Token.cType  = 'C';
808         Token.iIndex = MAX_OPCODE;
809         { print_token();  return read; }
810     }
811 
812     // Check for IDSZ constant
813     if ( '[' == Token.cWord[0] )
814     {
815         idsz = MAKE_IDSZ( Token.cWord[1], Token.cWord[2], Token.cWord[3], Token.cWord[4] );
816 
817         Token.iValue = idsz;
818         Token.cType  = 'C';
819         Token.iIndex = MAX_OPCODE;
820 
821         { print_token();  return read; }
822     }
823 
824     for ( cnt = 0; cnt < OpList.count; cnt++ )
825     {
826         if ( 0 == strncmp( Token.cWord, OpList.ary[cnt].cName, MAXCODENAMESIZE ) )
827         {
828             break;
829         }
830     }
831     if ( cnt < OpList.count )
832     {
833         Token.iValue = OpList.ary[cnt].iValue;
834         Token.cType  = OpList.ary[cnt].cType;
835         Token.iIndex = cnt;
836     }
837     else if ( 0 == strcmp( Token.cWord, "=" ) )
838     {
839         Token.iValue = -1;
840         Token.cType  = 'O';
841         Token.iIndex = MAX_OPCODE;
842     }
843     else
844     {
845         // Throw out an error code if we're loggin' 'em
846         log_message( "SCRIPT ERROR: \"%s\"(%d) - unknown opcode \"%s\"\n", globalparsename, Token.iLine, Token.cWord );
847 
848         Token.iValue = -1;
849         Token.cType  = '?';
850         Token.iIndex = MAX_OPCODE;
851 
852         parseerror = btrue;
853     }
854 
855     { print_token();  return read; }
856 }
857 
858 //--------------------------------------------------------------------------------------------
emit_opcode(BIT_FIELD highbits)859 void emit_opcode( BIT_FIELD highbits )
860 {
861     // detect a constant value
862     if ( 'C' == Token.cType || 'F' == Token.cType )
863     {
864         SET_BIT( highbits, FUNCTION_BIT );
865     }
866     if ( AisCompiled_offset < AISMAXCOMPILESIZE )
867     {
868         AisCompiled_buffer[AisCompiled_offset] = highbits | Token.iValue;
869         AisCompiled_offset++;
870     }
871     else
872     {
873         log_warning( "Script index larger than array\n" );
874     }
875 }
876 
877 //--------------------------------------------------------------------------------------------
parse_line_by_line()878 void parse_line_by_line()
879 {
880     /// @details ZZ@> This function removes comments and endline codes, replacing
881     ///    them with a 0
882 
883     int read;
884     Uint32 highbits;
885     int parseposition;
886 
887     read = 0;
888     for ( Token.iLine = 0; read < iLoadSize; Token.iLine++ )
889     {
890         read = load_one_line( read );
891         if ( 0 == iLineSize ) continue;
892 
893 #if (DEBUG_SCRIPT_LEVEL > 2) && defined(_DEBUG)
894         print_line();
895 #endif
896 
897         fix_operators();
898         parseposition = 0;
899 
900         //------------------------------
901         // grab the first opcode
902 
903         highbits = SET_DATA_BITS( get_indentation() );
904         parseposition = parse_token( parseposition );
905         if ( 'F' == Token.cType )
906         {
907             if ( FEND == Token.iValue && 0 == highbits )
908             {
909                 // stop processing the lines, since we're finished
910                 break;
911             }
912 
913             //------------------------------
914             // the code type is a function
915 
916             // save the opcode
917             emit_opcode( highbits );
918 
919             // leave a space for the control code
920             Token.iValue = 0;
921             emit_opcode( 0 );
922 
923         }
924         else if ( 'V' == Token.cType )
925         {
926             //------------------------------
927             // the code type is a math operation
928 
929             int operand_index;
930             int operands = 0;
931 
932             // save in the value's opcode
933             emit_opcode( highbits );
934 
935             // save a position for the operand count
936             Token.iValue = 0;
937             operand_index = AisCompiled_offset;
938             emit_opcode( 0 );
939 
940             // handle the "="
941             highbits = 0;
942             parseposition = parse_token( parseposition );  // EQUALS
943             if ( 'O' != Token.cType || 0 != strcmp( Token.cWord, "=" ) )
944             {
945                 log_warning( "Invalid equation \"%s\"(%d) - \"%s\"\n", globalparsename, Token.iLine, cLineBuffer );
946             }
947 
948             //------------------------------
949             // grab the next opcode
950 
951             parseposition = parse_token( parseposition );
952             if ( 'V' == Token.cType || 'C' == Token.cType )
953             {
954                 // this is a value or a constant
955                 emit_opcode( 0 );
956                 operands++;
957 
958                 parseposition = parse_token( parseposition );
959             }
960             else if ( 'O' != Token.cType )
961             {
962                 // this is a function or an unknown value. do not break the script.
963                 log_warning( "Invalid operand \"%s\"(%d) - \"%s\"\n", globalparsename, Token.iLine, Token.cWord );
964 
965                 emit_opcode( 0 );
966                 operands++;
967 
968                 parseposition = parse_token( parseposition );
969             }
970 
971             // expects a OPERATOR VALUE OPERATOR VALUE OPERATOR VALUE pattern
972             while ( parseposition < iLineSize )
973             {
974                 // the current token should be an operator
975                 if ( 'O' != Token.cType )
976                 {
977                     // problem with the loop
978                     log_warning( "Expected an operator \"%s\"(%d) - \"%s\"\n", globalparsename, Token.iLine, cLineBuffer );
979                     break;
980                 }
981 
982                 // the highbits are the operator's value
983                 highbits = SET_DATA_BITS( Token.iValue );
984 
985                 // VALUE
986                 parseposition = parse_token( parseposition );
987                 if ( 'C' != Token.cType && 'V' != Token.cType )
988                 {
989                     // not having a constant or a value here breaks the function. stop processing
990                     log_warning( "Invalid operand \"%s\"(%d) - \"%s\"\n", globalparsename, Token.iLine, Token.cWord );
991                     break;
992                 }
993 
994                 emit_opcode( highbits );
995                 operands++;
996 
997                 // OPERATOR
998                 parseposition = parse_token( parseposition );
999             }
1000 
1001             AisCompiled_buffer[operand_index] = operands;  // Number of operands
1002         }
1003         else if ( 'C' == Token.cType )
1004         {
1005             log_warning( "Invalid constant \"%s\"(%d) - \"%s\"\n", globalparsename, Token.iLine, Token.cWord );
1006         }
1007         else if ( '?' == Token.cType )
1008         {
1009             // unknown opcode, do not process this line
1010             log_warning( "Invalid operand \"%s\"(%d) - \"%s\"\n", globalparsename, Token.iLine, Token.cWord );
1011         }
1012         else
1013         {
1014             log_warning( "Compiler is broken \"%s\"(%d) - \"%s\"\n", globalparsename, Token.iLine, Token.cWord );
1015             break;
1016         }
1017     }
1018 
1019     Token.iValue = FEND;
1020     Token.cType  = 'F';
1021     emit_opcode( 0 );
1022     Token.iValue = AisCompiled_offset + 1;
1023     emit_opcode( 0 );
1024 }
1025 
1026 //--------------------------------------------------------------------------------------------
jump_goto(int index,int index_end)1027 Uint32 jump_goto( int index, int index_end )
1028 {
1029     /// @details ZZ@> This function figures out where to jump to on a fail based on the
1030     ///    starting location and the following code.  The starting location
1031     ///    should always be a function code with indentation
1032 
1033     Uint32 value;
1034     int targetindent, indent;
1035 
1036     value = AisCompiled_buffer[index];  index += 2;
1037     targetindent = GET_DATA_BITS( value );
1038     indent = 100;
1039 
1040     while ( indent > targetindent && index < index_end )
1041     {
1042         value = AisCompiled_buffer[index];
1043         indent = GET_DATA_BITS( value );
1044         if ( indent > targetindent )
1045         {
1046             // Was it a function
1047             if ( HAS_SOME_BITS( value, FUNCTION_BIT ) )
1048             {
1049                 // Each function needs a jump
1050                 index++;
1051                 index++;
1052             }
1053             else
1054             {
1055                 // Operations cover each operand
1056                 index++;
1057                 value = AisCompiled_buffer[index];
1058                 index++;
1059                 index += ( value & 255 );
1060             }
1061         }
1062     }
1063 
1064     return MIN( index, index_end );
1065 }
1066 
1067 //--------------------------------------------------------------------------------------------
parse_jumps(int ainumber)1068 void parse_jumps( int ainumber )
1069 {
1070     /// @details ZZ@> This function sets up the fail jumps for the down and dirty code
1071 
1072     int index, index_end;
1073     Uint32 value, iTmp;
1074 
1075     index     = AisStorage.ary[ainumber].iStartPosition;
1076     index_end = AisStorage.ary[ainumber].iEndPosition;
1077 
1078     value = AisCompiled_buffer[index];
1079     while ( index < index_end )
1080     {
1081         value = AisCompiled_buffer[index];
1082 
1083         // Was it a function
1084         if ( HAS_SOME_BITS( value, FUNCTION_BIT ) )
1085         {
1086             // Each function needs a jump
1087             iTmp = jump_goto( index, index_end );
1088             index++;
1089             AisCompiled_buffer[index] = iTmp;
1090             index++;
1091         }
1092         else
1093         {
1094             // Operations cover each operand
1095             index++;
1096             iTmp = AisCompiled_buffer[index];
1097             index++;
1098             index += CLIP_TO_08BITS( iTmp );
1099         }
1100     }
1101 }
1102 
1103 //--------------------------------------------------------------------------------------------
ai_goto_colon(int read)1104 int ai_goto_colon( int read )
1105 {
1106     /// @details ZZ@> This function goes to spot after the next colon
1107 
1108     char cTmp;
1109 
1110     cTmp = cLoadBuffer[read];
1111 
1112     while ( ':' != cTmp && read < iLoadSize )
1113     {
1114         read++;  cTmp = cLoadBuffer[read];
1115     }
1116     if ( read < iLoadSize )  read++;
1117 
1118     return read;
1119 }
1120 
1121 //--------------------------------------------------------------------------------------------
get_code(int read)1122 void get_code( int read )
1123 {
1124     /// @details ZZ@> This function gets code names and other goodies
1125 
1126     char cTmp;
1127     int iTmp;
1128     STRING sTmp;
1129 
1130     sscanf(( char* )( cLoadBuffer + read ), "%c%d%255s", &cTmp, &iTmp, sTmp );
1131 
1132     strncpy( OpList.ary[OpList.count].cName, sTmp, SDL_arraysize( OpList.ary[OpList.count].cName ) );
1133     OpList.ary[OpList.count].cType  = toupper( cTmp );
1134     OpList.ary[OpList.count].iValue = iTmp;
1135 }
1136 
1137 //--------------------------------------------------------------------------------------------
load_ai_codes_vfs(const char * loadname)1138 void load_ai_codes_vfs( const char* loadname )
1139 {
1140     /// @details ZZ@> This function loads all of the function and variable names
1141 
1142     vfs_FILE* fileread;
1143     int read;
1144 
1145     OpList.count = 0;
1146     fileread = vfs_openRead( loadname );
1147     if ( fileread )
1148     {
1149         iLoadSize = ( int )vfs_read( cLoadBuffer, 1, AISMAXLOADSIZE, fileread );
1150         read = 0;
1151         read = ai_goto_colon( read );
1152 
1153         while ( read != iLoadSize )
1154         {
1155             get_code( read );
1156             OpList.count++;
1157             read = ai_goto_colon( read );
1158         }
1159 
1160         vfs_close( fileread );
1161     }
1162 }
1163 
1164 //--------------------------------------------------------------------------------------------
load_ai_script_vfs(const char * loadname)1165 int load_ai_script_vfs( const char *loadname )
1166 {
1167     /// @details ZZ@> This function loads a script to memory and
1168     ///    returns the index of the script, returns -1 if it fails
1169 
1170     vfs_FILE* fileread;
1171     int retval = -1;
1172 
1173     iNumLine = 0;
1174     fileread = vfs_openRead( loadname );
1175 
1176     // No such file
1177     if ( NULL == fileread )
1178     {
1179         log_debug( "I am missing a AI script (%s)\n", loadname );
1180         log_message( "       Using the default AI script instead (\"mp_data/script.txt\")\n" );
1181         return 0;           //0 == default AI script
1182     }
1183     if ( AisStorage.count >= MAX_AI )
1184     {
1185         log_warning( "Too many script files. Cannot load file \"%s\"\n", loadname );
1186         return retval;
1187     }
1188 
1189     // load the file
1190     iLoadSize = ( int )vfs_read( cLoadBuffer, 1, AISMAXLOADSIZE, fileread );
1191     vfs_close( fileread );
1192 
1193     // if the file is empty, use the default script
1194     if ( 0 == iLoadSize )
1195     {
1196         log_warning( "Script file is empty. \"%s\"\n", loadname );
1197         return retval;
1198     }
1199 
1200     // save the filename for error logging
1201     strncpy( AisStorage.ary[AisStorage.count].szName, loadname, sizeof( STRING ) );
1202     globalparsename = loadname;
1203 
1204     // initialize the start and end position
1205     AisStorage.ary[AisStorage.count].iStartPosition = AisCompiled_offset;
1206     AisStorage.ary[AisStorage.count].iEndPosition   = AisCompiled_offset;
1207 
1208     // parse/compile the scripts
1209     // parse_null_terminate_comments();
1210     parse_line_by_line();
1211 
1212     // set the end position of the script
1213     AisStorage.ary[AisStorage.count].iEndPosition = AisCompiled_offset;
1214 
1215     // determine the correct jumps
1216     parse_jumps( AisStorage.count );
1217 
1218     // get the ai script index
1219     retval = AisStorage.count;
1220 
1221     // increase the ai script index
1222     AisStorage.count++;
1223 
1224     return retval;
1225 }
1226 
1227 //--------------------------------------------------------------------------------------------
release_all_ai_scripts()1228 void release_all_ai_scripts()
1229 {
1230     /// @details ZZ@> This function resets the ai script "pointers"
1231 
1232     AisCompiled_offset = 0;
1233     AisStorage.count = 0;
1234 }
1235 
1236 //--------------------------------------------------------------------------------------------
init_all_ai_scripts()1237 void init_all_ai_scripts()
1238 {
1239     /// @details ZZ@> This function initializes the ai script "pointers"
1240 
1241     AisCompiled_offset = 0;
1242     AisStorage.count = 0;
1243 }
1244 
1245 //--------------------------------------------------------------------------------------------
1246 #if (DEBUG_SCRIPT_LEVEL > 2) && defined(_DEBUG)
print_token()1247 void print_token()
1248 {
1249     printf( "------------\n", globalparsename, Token.iLine );
1250     printf( "\tToken.iIndex == %d\n", Token.iIndex );
1251     printf( "\tToken.iValue == %d\n", Token.iValue );
1252     printf( "\tToken.cType  == \'%c\'\n", Token.cType );
1253     printf( "\tToken.cWord  == \"%s\"\n", Token.cWord );
1254 }
1255 #endif
1256 
1257 //--------------------------------------------------------------------------------------------
1258 #if (DEBUG_SCRIPT_LEVEL > 2) && defined(_DEBUG)
print_line()1259 void print_line()
1260 {
1261     int i;
1262     char cTmp;
1263 
1264     printf( "\n===========\n\tfile == \"%s\"\n\tline == %d\n", globalparsename, Token.iLine );
1265 
1266     printf( "\tline == \"" );
1267 
1268     for ( i = 0; i < iLineSize; i++ )
1269     {
1270         cTmp = cLineBuffer[i];
1271         if ( isprint( cTmp ) )
1272         {
1273             printf( "%c", cTmp );
1274         }
1275         else
1276         {
1277             printf( "\\%03d", cTmp );
1278         }
1279     };
1280 
1281     printf( "\", length == %d\n", iLineSize );
1282 }
1283 #endif
1284 
1285 /** Preparation for eliminating aicodes.txt except for introducing aliases
1286 DEFINE_FUNCTION( FIFSPAWNED,                       "IfSpawned"    )                          // == 0
1287 DEFINE_FUNCTION( FIFTIMEOUT,                       "IfTimeOut"    )                              // == 1
1288 DEFINE_FUNCTION( FIFATWAYPOINT,                    "IfAtWaypoint"    )                           // == 2
1289 DEFINE_FUNCTION( FIFATLASTWAYPOINT,                "IfAtLastWaypoint"    )                       // == 3
1290 DEFINE_FUNCTION( FIFATTACKED,                      "IfAttacked"    )                             // == 4
1291 DEFINE_FUNCTION( FIFBUMPED,                        "IfBumped"    )                               // == 5
1292 DEFINE_FUNCTION( FIFORDERED,                       "IfOrdered"    )                              // == 6
1293 DEFINE_FUNCTION( FIFCALLEDFORHELP,                 "IfCalledForHelp"    )                        // == 7
1294 DEFINE_FUNCTION( FSETCONTENT,                      "SetContent"    )                             // == 8
1295 DEFINE_FUNCTION( FIFKILLED,                        "IfKilled"    )                               // == 9
1296 DEFINE_FUNCTION( FIFTARGETKILLED,                  "IfTargetKilled"    )                         // == 10
1297 DEFINE_FUNCTION( FCLEARWAYPOINTS,                  "ClearWaypoints"    )                         // == 11
1298 DEFINE_FUNCTION( FADDWAYPOINT,                     "AddWaypoint"    )                            // == 12
1299 DEFINE_FUNCTION( FFINDPATH,                        "FindPath"    )                               // == 13
1300 DEFINE_FUNCTION( FCOMPASS,                         "Compass"    )                                // == 14
1301 DEFINE_FUNCTION( FGETTARGETARMORPRICE,             "GetTargetArmorPrice"    )                    // == 15
1302 DEFINE_FUNCTION( FSETTIME,                         "SetTime"    )                                // == 16
1303 DEFINE_FUNCTION( FGETCONTENT,                      "GetContent"    )                             // == 17
1304 DEFINE_FUNCTION( FJOINTARGETTEAM,                  "JoinTargetTeam"    )                         // == 18
1305 DEFINE_FUNCTION( FSETTARGETTONEARBYENEMY,          "SetTargetToNearbyEnemy"    )                 // == 19
1306 DEFINE_FUNCTION( FSETTARGETTOTARGETLEFTHAND,       "SetTargetToTargetLeftHand"    )              // == 20
1307 DEFINE_FUNCTION( FSETTARGETTOTARGETRIGHTHAND,      "SetTargetToTargetRightHand"    )             // == 21
1308 DEFINE_FUNCTION( FSETTARGETTOWHOEVERATTACKED,      "SetTargetToWhoeverAttacked"    )             // == 22
1309 DEFINE_FUNCTION( FSETTARGETTOWHOEVERBUMPED,        "SetTargetToWhoeverBumped"    )               // == 23
1310 DEFINE_FUNCTION( FSETTARGETTOWHOEVERCALLEDFORHELP, "SetTargetToWhoeverCalledForHelp"    )        // == 24
1311 DEFINE_FUNCTION( FSETTARGETTOOLDTARGET,            "SetTargetToOldTarget"    )                   // == 25
1312 DEFINE_FUNCTION( FSETTURNMODETOVELOCITY,           "SetTurnModeToVelocity"    )                  // == 26
1313 DEFINE_FUNCTION( FSETTURNMODETOWATCH,              "SetTurnModeToWatch"    )                     // == 27
1314 DEFINE_FUNCTION( FSETTURNMODETOSPIN,               "SetTurnModeToSpin"    )                      // == 28
1315 DEFINE_FUNCTION( FSETBUMPHEIGHT,                   "SetBumpHeight"    )                          // == 29
1316 DEFINE_FUNCTION( FIFTARGETHASID,                   "IfTargetHasID"    )                          // == 30
1317 DEFINE_FUNCTION( FIFTARGETHASITEMID,               "IfTargetHasItemID"    )                      // == 31
1318 DEFINE_FUNCTION( FIFTARGETHOLDINGITEMID,           "IfTargetHoldingItemID"    )                  // == 32
1319 DEFINE_FUNCTION( FIFTARGETHASSKILLID,              "IfTargetHasSkillID"    )                     // == 33
1320 DEFINE_FUNCTION( FELSE,                            "Else"    )                                   // == 34
1321 DEFINE_FUNCTION( FRUN,                             "Run"    )                                    // == 35
1322 DEFINE_FUNCTION( FWALK,                            "Walk"    )                                   // == 36
1323 DEFINE_FUNCTION( FSNEAK,                           "Sneak"    )                                  // == 37
1324 DEFINE_FUNCTION( FDOACTION,                        "DoAction"    )                               // == 38
1325 DEFINE_FUNCTION( FKEEPACTION,                      "KeepAction"    )                             // == 39
1326 DEFINE_FUNCTION( FISSUEORDER,                      "IssueOrder"    )                             // == 40
1327 DEFINE_FUNCTION( FDROPWEAPONS,                     "DropWeapons"    )                            // == 41
1328 DEFINE_FUNCTION( FTARGETDOACTION,                  "TargetDoAction"    )                         // == 42
1329 DEFINE_FUNCTION( FOPENPASSAGE,                     "OpenPassage"    )                            // == 43
1330 DEFINE_FUNCTION( FCLOSEPASSAGE,                    "ClosePassage"    )                           // == 44
1331 DEFINE_FUNCTION( FIFPASSAGEOPEN,                   "IfPassageOpen"    )                          // == 45
1332 DEFINE_FUNCTION( FGOPOOF,                          "GoPoof"    )                                 // == 46
1333 DEFINE_FUNCTION( FCOSTTARGETITEMID,                "CostTargetItemID"    )                       // == 47
1334 DEFINE_FUNCTION( FDOACTIONOVERRIDE,                "DoActionOverride"    )                       // == 48
1335 DEFINE_FUNCTION( FIFHEALED,                        "IfHealed"    )                               // == 49
1336 DEFINE_FUNCTION( FSENDMESSAGE,                     "SendMessage"    )                            // == 50
1337 DEFINE_FUNCTION( FCALLFORHELP,                     "CallForHelp"    )                            // == 51
1338 DEFINE_FUNCTION( FADDIDSZ,                         "AddIDSZ"    )                                // == 52
1339 DEFINE_FUNCTION( FEND,                             "End"    )                                    // == 53
1340 DEFINE_FUNCTION( FSETSTATE,                        "SetState"    )                               // == 54
1341 DEFINE_FUNCTION( FGETSTATE,                        "GetState"    )                               // == 55
1342 DEFINE_FUNCTION( FIFSTATEIS,                       "IfStateIs"    )                              // == 56
1343 DEFINE_FUNCTION( FIFTARGETCANOPENSTUFF,            "IfTargetCanOpenStuff"    )                   // == 57
1344 DEFINE_FUNCTION( FIFGRABBED,                       "IfGrabbed"    )                              // == 58
1345 DEFINE_FUNCTION( FIFDROPPED,                       "IfDropped"    )                              // == 59
1346 DEFINE_FUNCTION( FSETTARGETTOWHOEVERISHOLDING,     "SetTargetToWhoeverIsHolding"    )            // == 60
1347 DEFINE_FUNCTION( FDAMAGETARGET,                    "DamageTarget"    )                           // == 61
1348 DEFINE_FUNCTION( FIFXISLESSTHANY,                  "IfXIsLessThanY"    )                         // == 62
1349 DEFINE_FUNCTION( FSETWEATHERTIME,                  "SetWeatherTime"    )                         // == 63
1350 DEFINE_FUNCTION( FGETBUMPHEIGHT,                   "GetBumpHeight"    )                          // == 64
1351 DEFINE_FUNCTION( FIFREAFFIRMED,                    "IfReaffirmed"    )                           // == 65
1352 DEFINE_FUNCTION( FUNKEEPACTION,                    "UnkeepAction"    )                           // == 66
1353 DEFINE_FUNCTION( FIFTARGETISONOTHERTEAM,           "IfTargetIsOnOtherTeam"    )                  // == 67
1354 DEFINE_FUNCTION( FIFTARGETISONHATEDTEAM,           "IfTargetIsOnHatedTeam"    )                  // == 68
1355 DEFINE_FUNCTION( FPRESSLATCHBUTTON,                "PressLatchButton"    )                       // == 69
1356 DEFINE_FUNCTION( FSETTARGETTOTARGETOFLEADER,       "SetTargetToTargetOfLeader"    )              // == 70
1357 DEFINE_FUNCTION( FIFLEADERKILLED,                  "IfLeaderKilled"    )                         // == 71
1358 DEFINE_FUNCTION( FBECOMELEADER,                    "BecomeLeader"    )                           // == 72
1359 DEFINE_FUNCTION( FCHANGETARGETARMOR,               "ChangeTargetArmor"    )                      // == 73
1360 DEFINE_FUNCTION( FGIVEMONEYTOTARGET,               "GiveMoneyToTarget"    )                      // == 74
1361 DEFINE_FUNCTION( FDROPKEYS,                        "DropKeys"    )                               // == 75
1362 DEFINE_FUNCTION( FIFLEADERISALIVE,                 "IfLeaderIsAlive"    )                        // == 76
1363 DEFINE_FUNCTION( FIFTARGETISOLDTARGET,             "IfTargetIsOldTarget"    )                    // == 77
1364 DEFINE_FUNCTION( FSETTARGETTOLEADER,               "SetTargetToLeader"    )                      // == 78
1365 DEFINE_FUNCTION( FSPAWNCHARACTER,                  "SpawnCharacter"    )                         // == 79
1366 DEFINE_FUNCTION( FRESPAWNCHARACTER,                "RespawnCharacter"    )                       // == 80
1367 DEFINE_FUNCTION( FCHANGETILE,                      "ChangeTile"    )                             // == 81
1368 DEFINE_FUNCTION( FIFUSED,                          "IfUsed"    )                                 // == 82
1369 DEFINE_FUNCTION( FDROPMONEY,                       "DropMoney"    )                              // == 83
1370 DEFINE_FUNCTION( FSETOLDTARGET,                    "SetOldTarget"    )                           // == 84
1371 DEFINE_FUNCTION( FDETACHFROMHOLDER,                "DetachFromHolder"    )                       // == 85
1372 DEFINE_FUNCTION( FIFTARGETHASVULNERABILITYID,      "IfTargetHasVulnerabilityID"    )             // == 86
1373 DEFINE_FUNCTION( FCLEANUP,                         "CleanUp"    )                                // == 87
1374 DEFINE_FUNCTION( FIFCLEANEDUP,                     "IfCleanedUp"    )                            // == 88
1375 DEFINE_FUNCTION( FIFSITTING,                       "IfSitting"    )                              // == 89
1376 DEFINE_FUNCTION( FIFTARGETISHURT,                  "IfTargetIsHurt"    )                         // == 90
1377 DEFINE_FUNCTION( FIFTARGETISAPLAYER,               "IfTargetIsAPlayer"    )                      // == 91
1378 DEFINE_FUNCTION( FPLAYSOUND,                       "PlaySound"    )                              // == 92
1379 DEFINE_FUNCTION( FSPAWNPARTICLE,                   "SpawnParticle"    )                          // == 93
1380 DEFINE_FUNCTION( FIFTARGETISALIVE,                 "IfTargetIsAlive"    )                        // == 94
1381 DEFINE_FUNCTION( FSTOP,                            "Stop"    )                                   // == 95
1382 DEFINE_FUNCTION( FDISAFFIRMCHARACTER,              "DisaffirmCharacter"    )                     // == 96
1383 DEFINE_FUNCTION( FREAFFIRMCHARACTER,               "ReaffirmCharacter"    )                      // == 97
1384 DEFINE_FUNCTION( FIFTARGETISSELF,                  "IfTargetIsSelf"    )                         // == 98
1385 DEFINE_FUNCTION( FIFTARGETISMALE,                  "IfTargetIsMale"    )                         // == 99
1386 DEFINE_FUNCTION( FIFTARGETISFEMALE,                "IfTargetIsFemale"    )                       // == 100
1387 DEFINE_FUNCTION( FSETTARGETTOSELF,                 "SetTargetToSelf"    )                        // == 101
1388 DEFINE_FUNCTION( FSETTARGETTORIDER,                "SetTargetToRider"    )                       // == 102
1389 DEFINE_FUNCTION( FGETATTACKTURN,                   "GetAttackTurn"    )                          // == 103
1390 DEFINE_FUNCTION( FGETDAMAGETYPE,                   "GetDamageType"    )                          // == 104
1391 DEFINE_FUNCTION( FBECOMESPELL,                    "BecomeSpell"    )                            // == 105
1392 DEFINE_FUNCTION( FBECOMESPELLBOOK,                "BecomeSpellbook"    )                        // == 106
1393 DEFINE_FUNCTION( FIFSCOREDAHIT,                   "IfScoredAHit"    )                           // == 107
1394 DEFINE_FUNCTION( FIFDISAFFIRMED,                  "IfDisaffirmed"    )                          // == 108
1395 DEFINE_FUNCTION( FTRANSLATEORDER,                 "TranslateOrder"    )                         // == 109
1396 DEFINE_FUNCTION( FSETTARGETTOWHOEVERWASHIT,       "SetTargetToWhoeverWasHit"    )               // == 110
1397 DEFINE_FUNCTION( FSETTARGETTOWIDEENEMY,           "SetTargetToWideEnemy"    )                   // == 111
1398 DEFINE_FUNCTION( FIFCHANGED,                      "IfChanged"    )                              // == 112
1399 DEFINE_FUNCTION( FIFINWATER,                      "IfInWater"    )                              // == 113
1400 DEFINE_FUNCTION( FIFBORED,                        "IfBored"    )                                // == 114
1401 DEFINE_FUNCTION( FIFTOOMUCHBAGGAGE,               "IfTooMuchBaggage"    )                       // == 115
1402 DEFINE_FUNCTION( FIFGROGGED,                      "IfGrogged"    )                              // == 116
1403 DEFINE_FUNCTION( FIFDAZED,                        "IfDazed"    )                                // == 117
1404 DEFINE_FUNCTION( FIFTARGETHASSPECIALID,           "IfTargetHasSpecialID"    )                   // == 118
1405 DEFINE_FUNCTION( FPRESSTARGETLATCHBUTTON,         "PressTargetLatchButton"    )                 // == 119
1406 DEFINE_FUNCTION( FIFINVISIBLE,                    "IfInvisible"    )                            // == 120
1407 DEFINE_FUNCTION( FIFARMORIS,    "IfArmorIs"    )                              // == 121
1408 DEFINE_FUNCTION( FGETTARGETGROGTIME,    "GetTargetGrogTime"    )                      // == 122
1409 DEFINE_FUNCTION( FGETTARGETDAZETIME,    "GetTargetDazeTime"    )                      // == 123
1410 DEFINE_FUNCTION( FSETDAMAGETYPE,    "SetDamageType"    )                          // == 124
1411 DEFINE_FUNCTION( FSETWATERLEVEL,    "SetWaterLevel"    )                          // == 125
1412 DEFINE_FUNCTION( FENCHANTTARGET,    "EnchantTarget"    )                          // == 126
1413 DEFINE_FUNCTION( FENCHANTCHILD,    "EnchantChild"    )                           // == 127
1414 DEFINE_FUNCTION( FTELEPORTTARGET,    "TeleportTarget"    )                         // == 128
1415 DEFINE_FUNCTION( FGIVEEXPERIENCETOTARGET,    "GiveExperienceToTarget"    )                 // == 129
1416 DEFINE_FUNCTION( FINCREASEAMMO,    "IncreaseAmmo"    )                           // == 130
1417 DEFINE_FUNCTION( FUNKURSETARGET,    "UnkurseTarget"    )                          // == 131
1418 DEFINE_FUNCTION( FGIVEEXPERIENCETOTARGETTEAM,    "GiveExperienceToTargetTeam"    )             // == 132
1419 DEFINE_FUNCTION( FIFUNARMED,    "IfUnarmed"    )                              // == 133
1420 DEFINE_FUNCTION( FRESTOCKTARGETAMMOIDALL,    "RestockTargetAmmoIDAll"    )                 // == 134
1421 DEFINE_FUNCTION( FRESTOCKTARGETAMMOIDFIRST,    "RestockTargetAmmoIDFirst"    )               // == 135
1422 DEFINE_FUNCTION( FFLASHTARGET,    "FlashTarget"    )                            // == 136
1423 DEFINE_FUNCTION( FSETREDSHIFT,    "SetRedShift"    )                            // == 137
1424 DEFINE_FUNCTION( FSETGREENSHIFT,    "SetGreenShift"    )                          // == 138
1425 DEFINE_FUNCTION( FSETBLUESHIFT,    "SetBlueShift"    )                           // == 139
1426 DEFINE_FUNCTION( FSETLIGHT,    "SetLight"    )                               // == 140
1427 DEFINE_FUNCTION( FSETALPHA,    "SetAlpha"    )                               // == 141
1428 DEFINE_FUNCTION( FIFHITFROMBEHIND,    "IfHitFromBehind"    )                        // == 142
1429 DEFINE_FUNCTION( FIFHITFROMFRONT,    "IfHitFromFront"    )                         // == 143
1430 DEFINE_FUNCTION( FIFHITFROMLEFT,    "IfHitFromLeft"    )                          // == 144
1431 DEFINE_FUNCTION( FIFHITFROMRIGHT,    "IfHitFromRight"    )                         // == 145
1432 DEFINE_FUNCTION( FIFTARGETISONSAMETEAM,    "IfTargetIsOnSameTeam"    )                   // == 146
1433 DEFINE_FUNCTION( FKILLTARGET,    "KillTarget"    )                             // == 147
1434 DEFINE_FUNCTION( FUNDOENCHANT,    "UndoEnchant"    )                            // == 148
1435 DEFINE_FUNCTION( FGETWATERLEVEL,    "GetWaterLevel"    )                          // == 149
1436 DEFINE_FUNCTION( FCOSTTARGETMANA,    "CostTargetMana"    )                         // == 150
1437 DEFINE_FUNCTION( FIFTARGETHASANYID,    "IfTargetHasAnyID"    )                       // == 151
1438 DEFINE_FUNCTION( FSETBUMPSIZE,    "SetBumpSize"    )                            // == 152
1439 DEFINE_FUNCTION( FIFNOTDROPPED,    "IfNotDropped"    )                           // == 153
1440 DEFINE_FUNCTION( FIFYISLESSTHANX,    "IfYIsLessThanX"    )                         // == 154
1441 DEFINE_FUNCTION( FSETFLYHEIGHT,    "SetFlyHeight"    )                           // == 155
1442 DEFINE_FUNCTION( FIFBLOCKED,    "IfBlocked"    )                              // == 156
1443 DEFINE_FUNCTION( FIFTARGETISDEFENDING,    "IfTargetIsDefending"    )                    // == 157
1444 DEFINE_FUNCTION( FIFTARGETISATTACKING,    "IfTargetIsAttacking"    )                    // == 158
1445 DEFINE_FUNCTION( FIFSTATEIS0,    "IfStateIs0"    )                             // == 159
1446 DEFINE_FUNCTION( FIFSTATEIS1,    "IfStateIs1"    )                             // == 160
1447 DEFINE_FUNCTION( FIFSTATEIS2,    "IfStateIs2"    )                             // == 161
1448 DEFINE_FUNCTION( FIFSTATEIS3,    "IfStateIs3"    )                             // == 162
1449 DEFINE_FUNCTION( FIFSTATEIS4,    "IfStateIs4"    )                             // == 163
1450 DEFINE_FUNCTION( FIFSTATEIS5,    "IfStateIs5"    )                             // == 164
1451 DEFINE_FUNCTION( FIFSTATEIS6,    "IfStateIs6"    )                             // == 165
1452 DEFINE_FUNCTION( FIFSTATEIS7,    "IfStateIs7"    )                             // == 166
1453 DEFINE_FUNCTION( FIFCONTENTIS,    "IfContentIs"    )                            // == 167
1454 DEFINE_FUNCTION( FSETTURNMODETOWATCHTARGET,    "SetTurnModeToWatchTarget"    )               // == 168
1455 DEFINE_FUNCTION( FIFSTATEISNOT,    "IfStateIsNot"    )                           // == 169
1456 DEFINE_FUNCTION( FIFXISEQUALTOY,    "IfXIsEqualToY"    )                          // == 170
1457 DEFINE_FUNCTION( FDEBUGMESSAGE,    "DebugMessage"    )                           // == 171
1458 DEFINE_FUNCTION( FBLACKTARGET,    "BlackTarget"    )                            // == 172
1459 DEFINE_FUNCTION( FSENDMESSAGENEAR,    "SendMessageNear"    )                        // == 173
1460 DEFINE_FUNCTION( FIFHITGROUND,    "IfHitGround"    )                            // == 174
1461 DEFINE_FUNCTION( FIFNAMEISKNOWN,    "IfNameIsKnown"    )                          // == 175
1462 DEFINE_FUNCTION( FIFUSAGEISKNOWN,    "IfUsageIsKnown"    )                         // == 176
1463 DEFINE_FUNCTION( FIFHOLDINGITEMID,    "IfHoldingItemID"    )                        // == 177
1464 DEFINE_FUNCTION( FIFHOLDINGRANGEDWEAPON,    "IfHoldingRangedWeapon"    )                  // == 178
1465 DEFINE_FUNCTION( FIFHOLDINGMELEEWEAPON,    "IfHoldingMeleeWeapon"    )                   // == 179
1466 DEFINE_FUNCTION( FIFHOLDINGSHIELD,    "IfHoldingShield"    )                        // == 180
1467 DEFINE_FUNCTION( FIFKURSED,    "IfKursed"    )                               // == 181
1468 DEFINE_FUNCTION( FIFTARGETISKURSED,    "IfTargetIsKursed"    )                       // == 182
1469 DEFINE_FUNCTION( FIFTARGETISDRESSEDUP,    "IfTargetIsDressedUp"    )                    // == 183
1470 DEFINE_FUNCTION( FIFOVERWATER,    "IfOverWater"    )                            // == 184
1471 DEFINE_FUNCTION( FIFTHROWN,    "IfThrown"    )                               // == 185
1472 DEFINE_FUNCTION( FMAKENAMEKNOWN,    "MakeNameKnown"    )                          // == 186
1473 DEFINE_FUNCTION( FMAKEUSAGEKNOWN,    "MakeUsageKnown"    )                         // == 187
1474 DEFINE_FUNCTION( FSTOPTARGETMOVEMENT,    "StopTargetMovement"    )                     // == 188
1475 DEFINE_FUNCTION( FSETXY,    "SetXY"    )                                  // == 189
1476 DEFINE_FUNCTION( FGETXY,    "GetXY"    )                                  // == 190
1477 DEFINE_FUNCTION( FADDXY,    "AddXY"    )                                  // == 191
1478 DEFINE_FUNCTION( FMAKEAMMOKNOWN,    "MakeAmmoKnown"    )                          // == 192
1479 DEFINE_FUNCTION( FSPAWNATTACHEDPARTICLE,    "SpawnAttachedParticle"    )                  // == 193
1480 DEFINE_FUNCTION( FSPAWNEXACTPARTICLE,    "SpawnExactParticle"    )                     // == 194
1481 DEFINE_FUNCTION( FACCELERATETARGET,    "AccelerateTarget"    )                       // == 195
1482 DEFINE_FUNCTION( FIFDISTANCEISMORETHANTURN,    "IfDistanceIsMoreThanTurn"    )               // == 196
1483 DEFINE_FUNCTION( FIFCRUSHED,    "IfCrushed"    )                              // == 197
1484 DEFINE_FUNCTION( FMAKECRUSHVALID,    "MakeCrushValid"    )                         // == 198
1485 DEFINE_FUNCTION( FSETTARGETTOLOWESTTARGET,    "SetTargetToLowestTarget"    )                // == 199
1486 DEFINE_FUNCTION( FIFNOTPUTAWAY,    "IfNotPutAway"    )                           // == 200
1487 DEFINE_FUNCTION( FIFTAKENOUT,    "IfTakenOut"    )                             // == 201
1488 DEFINE_FUNCTION( FIFAMMOOUT,    "IfAmmoOut"    )                              // == 202
1489 DEFINE_FUNCTION( FPLAYSOUNDLOOPED,    "PlaySoundLooped"    )                        // == 203
1490 DEFINE_FUNCTION( FSTOPSOUND,    "StopSound"    )                              // == 204
1491 DEFINE_FUNCTION( FHEALSELF,    "HealSelf"    )                               // == 205
1492 DEFINE_FUNCTION( FEQUIP,    "Equip"    )                                  // == 206
1493 DEFINE_FUNCTION( FIFTARGETHASITEMIDEQUIPPED,    "IfTargetHasItemIDEquipped"    )              // == 207
1494 DEFINE_FUNCTION( FSETOWNERTOTARGET,    "SetOwnerToTarget"    )                       // == 208
1495 DEFINE_FUNCTION( FSETTARGETTOOWNER,    "SetTargetToOwner"    )                       // == 209
1496 DEFINE_FUNCTION( FSETFRAME,    "SetFrame"    )                               // == 210
1497 DEFINE_FUNCTION( FBREAKPASSAGE,    "BreakPassage"    )                           // == 211
1498 DEFINE_FUNCTION( FSETRELOADTIME,    "SetReloadTime"    )                          // == 212
1499 DEFINE_FUNCTION( FSETTARGETTOWIDEBLAHID,    "SetTargetToWideBlahID"    )                  // == 213
1500 DEFINE_FUNCTION( FPOOFTARGET,    "PoofTarget"    )                             // == 214
1501 DEFINE_FUNCTION( FCHILDDOACTIONOVERRIDE,    "ChildDoActionOverride"    )                  // == 215
1502 DEFINE_FUNCTION( FSPAWNPOOF,    "SpawnPoof"    )                              // == 216
1503 DEFINE_FUNCTION( FSETSPEEDPERCENT,    "SetSpeedPercent"    )                        // == 217
1504 DEFINE_FUNCTION( FSETCHILDSTATE,    "SetChildState"    )                          // == 218
1505 DEFINE_FUNCTION( FSPAWNATTACHEDSIZEDPARTICLE,    "SpawnAttachedSizedParticle"    )             // == 219
1506 DEFINE_FUNCTION( FCHANGEARMOR,    "ChangeArmor"    )                            // == 220
1507 DEFINE_FUNCTION( FSHOWTIMER,    "ShowTimer"    )                              // == 221
1508 DEFINE_FUNCTION( FIFFACINGTARGET,    "IfFacingTarget"    )                         // == 222
1509 DEFINE_FUNCTION( FPLAYSOUNDVOLUME,    "PlaySoundVolume"    )                        // == 223
1510 DEFINE_FUNCTION( FSPAWNATTACHEDFACEDPARTICLE,    "SpawnAttachedFacedParticle"    )             // == 224
1511 DEFINE_FUNCTION( FIFSTATEISODD,    "IfStateIsOdd"    )                           // == 225
1512 DEFINE_FUNCTION( FSETTARGETTODISTANTENEMY,    "SetTargetToDistantEnemy"    )                // == 226
1513 DEFINE_FUNCTION( FTELEPORT,    "Teleport"    )                               // == 227
1514 DEFINE_FUNCTION( FGIVESTRENGTHTOTARGET,    "GiveStrengthToTarget"    )                   // == 228
1515 DEFINE_FUNCTION( FGIVEWISDOMTOTARGET,    "GiveWisdomToTarget"    )                     // == 229
1516 DEFINE_FUNCTION( FGIVEINTELLIGENCETOTARGET,    "GiveIntelligenceToTarget"    )               // == 230
1517 DEFINE_FUNCTION( FGIVEDEXTERITYTOTARGET,    "GiveDexterityToTarget"    )                  // == 231
1518 DEFINE_FUNCTION( FGIVELIFETOTARGET,    "GiveLifeToTarget"    )                       // == 232
1519 DEFINE_FUNCTION( FGIVEMANATOTARGET,    "GiveManaToTarget"    )                       // == 233
1520 DEFINE_FUNCTION( FSHOWMAP,    "ShowMap"    )                                // == 234
1521 DEFINE_FUNCTION( FSHOWYOUAREHERE,    "ShowYouAreHere"    )                         // == 235
1522 DEFINE_FUNCTION( FSHOWBLIPXY,    "ShowBlipXY"    )                             // == 236
1523 DEFINE_FUNCTION( FHEALTARGET,    "HealTarget"    )                             // == 237
1524 DEFINE_FUNCTION( FPUMPTARGET,    "PumpTarget"    )                             // == 238
1525 DEFINE_FUNCTION( FCOSTAMMO,    "CostAmmo"    )                               // == 239
1526 DEFINE_FUNCTION( FMAKESIMILARNAMESKNOWN,    "MakeSimilarNamesKnown"    )                  // == 240
1527 DEFINE_FUNCTION( FSPAWNATTACHEDHOLDERPARTICLE,    "SpawnAttachedHolderParticle"    )            // == 241
1528 DEFINE_FUNCTION( FSETTARGETRELOADTIME,    "SetTargetReloadTime"    )                    // == 242
1529 DEFINE_FUNCTION( FSETFOGLEVEL,    "SetFogLevel"    )                            // == 243
1530 DEFINE_FUNCTION( FGETFOGLEVEL,    "GetFogLevel"    )                            // == 244
1531 DEFINE_FUNCTION( FSETFOGTAD,    "SetFogTAD"    )                              // == 245
1532 DEFINE_FUNCTION( FSETFOGBOTTOMLEVEL,    "SetFogBottomLevel"    )                      // == 246
1533 DEFINE_FUNCTION( FGETFOGBOTTOMLEVEL,    "GetFogBottomLevel"    )                      // == 247
1534 DEFINE_FUNCTION( FCORRECTACTIONFORHAND,    "CorrectActionForHand"    )                   // == 248
1535 DEFINE_FUNCTION( FIFTARGETISMOUNTED,    "IfTargetIsMounted"    )                      // == 249
1536 DEFINE_FUNCTION( FSPARKLEICON,    "SparkleIcon"    )                            // == 250
1537 DEFINE_FUNCTION( FUNSPARKLEICON,    "UnsparkleIcon"    )                          // == 251
1538 DEFINE_FUNCTION( FGETTILEXY,    "GetTileXY"    )                              // == 252
1539 DEFINE_FUNCTION( FSETTILEXY,    "SetTileXY"    )                              // == 253
1540 DEFINE_FUNCTION( FSETSHADOWSIZE,    "SetShadowSize"    )                          // == 254
1541 DEFINE_FUNCTION( FORDERTARGET,    "OrderTarget"    )                            // == 255
1542 DEFINE_FUNCTION( FSETTARGETTOWHOEVERISINPASSAGE,    "SetTargetToWhoeverIsInPassage"    )          // == 256
1543 DEFINE_FUNCTION( FIFCHARACTERWASABOOK,    "IfCharacterWasABook"    )                    // == 257
1544 DEFINE_FUNCTION( FSETENCHANTBOOSTVALUES,    "SetEnchantBoostValues"    )                  // == 258
1545 DEFINE_FUNCTION( FSPAWNCHARACTERXYZ,    "SpawnCharacterXYZ"    )                      // == 259
1546 DEFINE_FUNCTION( FSPAWNEXACTCHARACTERXYZ,    "SpawnExactCharacterXYZ"    )                 // == 260
1547 DEFINE_FUNCTION( FCHANGETARGETCLASS,    "ChangeTargetClass"    )                      // == 261
1548 DEFINE_FUNCTION( FPLAYFULLSOUND,    "PlayFullSound"    )                          // == 262
1549 DEFINE_FUNCTION( FSPAWNEXACTCHASEPARTICLE,    "SpawnExactChaseParticle"    )                // == 263
1550 DEFINE_FUNCTION( FCREATEORDER,    "CreateOrder"    )                            // == 264
1551 DEFINE_FUNCTION( FORDERSPECIALID,    "OrderSpecialID"    )                         // == 265
1552 DEFINE_FUNCTION( FUNKURSETARGETINVENTORY,    "UnkurseTargetInventory"    )                 // == 266
1553 DEFINE_FUNCTION( FIFTARGETISSNEAKING,    "IfTargetIsSneaking"    )                     // == 267
1554 DEFINE_FUNCTION( FDROPITEMS,    "DropItems"    )                              // == 268
1555 DEFINE_FUNCTION( FRESPAWNTARGET,    "RespawnTarget"    )                          // == 269
1556 DEFINE_FUNCTION( FTARGETDOACTIONSETFRAME,    "TargetDoActionSetFrame"    )                 // == 270
1557 DEFINE_FUNCTION( FIFTARGETCANSEEINVISIBLE,    "IfTargetCanSeeInvisible"    )                // == 271
1558 DEFINE_FUNCTION( FSETTARGETTONEARESTBLAHID,    "SetTargetToNearestBlahID"    )               // == 272
1559 DEFINE_FUNCTION( FSETTARGETTONEARESTENEMY,    "SetTargetToNearestEnemy"    )                // == 273
1560 DEFINE_FUNCTION( FSETTARGETTONEARESTFRIEND,    "SetTargetToNearestFriend"    )               // == 274
1561 DEFINE_FUNCTION( FSETTARGETTONEARESTLIFEFORM,    "SetTargetToNearestLifeform"    )             // == 275
1562 DEFINE_FUNCTION( FFLASHPASSAGE,    "FlashPassage"    )                           // == 276
1563 DEFINE_FUNCTION( FFINDTILEINPASSAGE,    "FindTileInPassage"    )                      // == 277
1564 DEFINE_FUNCTION( FIFHELDINLEFTHAND,    "IfHeldInLeftHand"    )                       // == 278
1565 DEFINE_FUNCTION( FNOTANITEM,    "NotAnItem"    )                              // == 279
1566 DEFINE_FUNCTION( FSETCHILDAMMO,    "SetChildAmmo"    )                           // == 280
1567 DEFINE_FUNCTION( FIFHITVULNERABLE,    "IfHitVulnerable"    )                        // == 281
1568 DEFINE_FUNCTION( FIFTARGETISFLYING,    "IfTargetIsFlying"    )                       // == 282
1569 DEFINE_FUNCTION( FIDENTIFYTARGET,    "IdentifyTarget"    )                         // == 283
1570 DEFINE_FUNCTION( FBEATMODULE,    "BeatModule"    )                             // == 284
1571 DEFINE_FUNCTION( FENDMODULE,    "EndModule"    )                              // == 285
1572 DEFINE_FUNCTION( FDISABLEEXPORT,    "DisableExport"    )                          // == 286
1573 DEFINE_FUNCTION( FENABLEEXPORT,    "EnableExport"    )                           // == 287
1574 DEFINE_FUNCTION( FGETTARGETSTATE,    "GetTargetState"    )                         // == 288
1575 DEFINE_FUNCTION( FIFEQUIPPED,    "IfEquipped"    )                             // == 289
1576 DEFINE_FUNCTION( FDROPTARGETMONEY,    "DropTargetMoney"    )                        // == 290
1577 DEFINE_FUNCTION( FGETTARGETCONTENT,    "GetTargetContent"    )                       // == 291
1578 DEFINE_FUNCTION( FDROPTARGETKEYS,    "DropTargetKeys"    )                         // == 292
1579 DEFINE_FUNCTION( FJOINTEAM,    "JoinTeam"    )                               // == 293
1580 DEFINE_FUNCTION( FTARGETJOINTEAM,    "TargetJoinTeam"    )                         // == 294
1581 DEFINE_FUNCTION( FCLEARMUSICPASSAGE,    "ClearMusicPassage"    )                      // == 295
1582 DEFINE_FUNCTION( FCLEARENDMESSAGE,    "ClearEndMessage"    )                        // == 296
1583 DEFINE_FUNCTION( FADDENDMESSAGE,    "AddEndMessage"    )                          // == 297
1584 DEFINE_FUNCTION( FPLAYMUSIC,    "PlayMusic"    )                              // == 298
1585 DEFINE_FUNCTION( FSETMUSICPASSAGE,    "SetMusicPassage"    )                        // == 299
1586 DEFINE_FUNCTION( FMAKECRUSHINVALID,    "MakeCrushInvalid"    )                       // == 300
1587 DEFINE_FUNCTION( FSTOPMUSIC,    "StopMusic"    )                              // == 301
1588 DEFINE_FUNCTION( FFLASHVARIABLE,    "FlashVariable"    )                          // == 302
1589 DEFINE_FUNCTION( FACCELERATEUP,    "AccelerateUp"    )                           // == 303
1590 DEFINE_FUNCTION( FFLASHVARIABLEHEIGHT,    "FlashVariableHeight"    )                    // == 304
1591 DEFINE_FUNCTION( FSETDAMAGETIME,    "SetDamageTime"    )                          // == 305
1592 DEFINE_FUNCTION( FIFSTATEIS8,    "IfStateIs8"    )                             // == 306
1593 DEFINE_FUNCTION( FIFSTATEIS9,    "IfStateIs9"    )                             // == 307
1594 DEFINE_FUNCTION( FIFSTATEIS10,    "IfStateIs10"    )                            // == 308
1595 DEFINE_FUNCTION( FIFSTATEIS11,    "IfStateIs11"    )                            // == 309
1596 DEFINE_FUNCTION( FIFSTATEIS12,    "IfStateIs12"    )                            // == 310
1597 DEFINE_FUNCTION( FIFSTATEIS13,    "IfStateIs13"    )                            // == 311
1598 DEFINE_FUNCTION( FIFSTATEIS14,    "IfStateIs14"    )                            // == 312
1599 DEFINE_FUNCTION( FIFSTATEIS15,    "IfStateIs15"    )                            // == 313
1600 DEFINE_FUNCTION( FIFTARGETISAMOUNT,    "IfTargetIsAMount"    )                       // == 314
1601 DEFINE_FUNCTION( FIFTARGETISAPLATFORM,    "IfTargetIsAPlatform"    )                    // == 315
1602 DEFINE_FUNCTION( FADDSTAT,    "AddStat"    )                                // == 316
1603 DEFINE_FUNCTION( FDISENCHANTTARGET,    "DisenchantTarget"    )                       // == 317
1604 DEFINE_FUNCTION( FDISENCHANTALL,    "DisenchantAll"    )                          // == 318
1605 DEFINE_FUNCTION( FSETVOLUMENEARESTTEAMMATE,    "SetVolumeNearestTeammate"    )               // == 319
1606 DEFINE_FUNCTION( FADDSHOPPASSAGE,    "AddShopPassage"    )                         // == 320
1607 DEFINE_FUNCTION( FTARGETPAYFORARMOR,    "TargetPayForArmor"    )                      // == 321
1608 DEFINE_FUNCTION( FJOINEVILTEAM,    "JoinEvilTeam"    )                           // == 322
1609 DEFINE_FUNCTION( FJOINNULLTEAM,    "JoinNullTeam"    )                           // == 323
1610 DEFINE_FUNCTION( FJOINGOODTEAM,    "JoinGoodTeam"    )                           // == 324
1611 DEFINE_FUNCTION( FPITSKILL,    "PitsKill"    )                               // == 325
1612 DEFINE_FUNCTION( FSETTARGETTOPASSAGEID,    "SetTargetToPassageID"    )                   // == 326
1613 DEFINE_FUNCTION( FMAKENAMEUNKNOWN,    "MakeNameUnknown"    )                        // == 327
1614 DEFINE_FUNCTION( FSPAWNEXACTPARTICLEENDSPAWN,    "SpawnExactParticleEndSpawn"    )             // == 328
1615 DEFINE_FUNCTION( FSPAWNPOOFSPEEDSPACINGDAMAGE,    "SpawnPoofSpeedSpacingDamage"    )            // == 329
1616 DEFINE_FUNCTION( FGIVEEXPERIENCETOGOODTEAM,    "GiveExperienceToGoodTeam"    )               // == 330
1617 DEFINE_FUNCTION( FDONOTHING,    "DoNothing"    )                              // == 331
1618 DEFINE_FUNCTION( FGROGTARGET,    "DazeTarget"    )                             // == 332
1619 DEFINE_FUNCTION( FDAZETARGET,    "GrogTarget"    )                             // == 333
1620 DEFINE_FUNCTION( FENABLERESPAWN,    "EnableRespawn"    )                          // == 334
1621 DEFINE_FUNCTION( FDISABLERESPAWN,    "DisableRespawn"    )                         // == 335
1622 DEFINE_FUNCTION( FDISPELTARGETENCHANTID,    "DispelTargetEnchantID"    )                  // == 336
1623 DEFINE_FUNCTION( FIFHOLDERBLOCKED,    "IfHolderBlocked"    )                        // == 337
1624 DEFINE_FUNCTION( FGETSKILLLEVEL,    "GetTargetShieldProfiency"    )                          // == 338
1625 DEFINE_FUNCTION( FIFTARGETHASNOTFULLMANA,    "IfTargetHasNotFullMana"    )                 // == 339
1626 DEFINE_FUNCTION( FENABLELISTENSKILL,    "EnableListenSkill"    )                      // == 340
1627 DEFINE_FUNCTION( FSETTARGETTOLASTITEMUSED,    "SetTargetToLastItemUsed"    )                // == 341
1628 DEFINE_FUNCTION( FFOLLOWLINK,    "FollowLink"    )                             // == 342  Scripted AI functions ( v1.00)
1629 DEFINE_FUNCTION( FIFOPERATORISLINUX,    "IfOperatorIsLinux"    )                      // == 343
1630 DEFINE_FUNCTION( FIFTARGETISAWEAPON,    "IfTargetIsAWeapon"    )                      // == 344
1631 DEFINE_FUNCTION( FIFSOMEONEISSTEALING,    "IfSomeoneIsStealing"    )                    // == 345
1632 DEFINE_FUNCTION( FIFTARGETISASPELL,    "IfTargetIsASpell"    )                       // == 346
1633 DEFINE_FUNCTION( FIFBACKSTABBED,    "IfBackstabbed"    )                          // == 347
1634 DEFINE_FUNCTION( FGETTARGETDAMAGETYPE,    "GetTargetDamageType"    )                    // == 348
1635 DEFINE_FUNCTION( FADDQUEST,    "AddTargetQuest"    )                               // == 349
1636 DEFINE_FUNCTION( FBEATQUESTALLPLAYERS,    "BeatQuestAllPlayers"    )                    // == 350
1637 DEFINE_FUNCTION( FIFTARGETHASQUEST,    "IfTargetHasQuest"    )                       // == 351
1638 DEFINE_FUNCTION( FSETQUESTLEVEL,    "SetTargetQuestLevel"    )                          // == 352
1639 DEFINE_FUNCTION( FADDQUESTALLPLAYERS,    "AddQuestAllPlayers"    )                     // == 353
1640 DEFINE_FUNCTION( FADDBLIPALLENEMIES,    "AddBlipAllEnemies"    )                      // == 354
1641 DEFINE_FUNCTION( FPITSFALL,    "PitsFall"    )                               // == 355
1642 DEFINE_FUNCTION( FIFTARGETISOWNER,    "IfTargetIsOwner"    )                        // == 356
1643 DEFINE_FUNCTION( FSETSPEECH,    "SetSpeech"    )                      // == 357
1644 DEFINE_FUNCTION( FSETMOVESPEECH,        "FSETMOVESPEECH"    )                  // == 358
1645 DEFINE_FUNCTION( FSETSECONDMOVESPEECH,        "FSETSECONDMOVESPEECH"    )            // == 359
1646 DEFINE_FUNCTION( FSETATTACKSPEECH,        "FSETATTACKSPEECH"    )                // == 360
1647 DEFINE_FUNCTION( FSETASSISTSPEECH,        "FSETASSISTSPEECH"    )                // == 361
1648 DEFINE_FUNCTION( FSETTERRAINSPEECH,        "FSETTERRAINSPEECH"    )               // == 362
1649 DEFINE_FUNCTION( FSETSELECTSPEECH,        "FSETSELECTSPEECH"    )                // == 363
1650 DEFINE_FUNCTION( FTAKEPICTURE,    "TakePicture"    )                    // == 364
1651 DEFINE_FUNCTION( FIFOPERATORISMACINTOSH,    "IfOperatorIsMacintosh"    )          // == 365
1652 DEFINE_FUNCTION( FIFMODULEHASIDSZ,    "IfModuleHasIDSZ"    )                // == 366
1653 DEFINE_FUNCTION( FMORPHTOTARGET,    "MorphToTarget"    )                  // == 367
1654 DEFINE_FUNCTION( FGIVEMANAFLOWTOTARGET,    "GiveManaFlowToTarget"    )           // == 368
1655 DEFINE_FUNCTION( FGIVEMANARETURNTOTARGET,    "GiveManaReturnToTarget"    )         // == 369
1656 DEFINE_FUNCTION( FSETMONEY,    "SetMoney"    )                       // == 370
1657 DEFINE_FUNCTION( FIFTARGETCANSEEKURSES,    "IfTargetCanSeeKurses"    )           // == 371
1658 DEFINE_FUNCTION( FSPAWNATTACHEDCHARACTER,    "SpawnAttachedCharacter"    )         // == 372
1659 DEFINE_FUNCTION( FKURSETARGET,    "KurseTarget"    )                    // == 373
1660 DEFINE_FUNCTION( FSETCHILDCONTENT,    "SetChildContent"    )                // == 374
1661 DEFINE_FUNCTION( FSETTARGETTOCHILD,    "SetTargetToChild"    )               // == 375
1662 DEFINE_FUNCTION( FSETDAMAGETHRESHOLD,    "SetDamageThreshold"    )    //
1663 
1664 DEFINE_CONSTANT(,    "BLAHDEAD"    )    //
1665 DEFINE_CONSTANT(,    "BLAHENEMIES"    )    //
1666 DEFINE_CONSTANT(,    "BLAHFRIENDS"    )    //
1667 DEFINE_CONSTANT(,    "BLAHITEMS"    )    //
1668 DEFINE_CONSTANT(,    "BLAHINVERTID"    )    //
1669 DEFINE_CONSTANT(,    "BLAHPLAYERS"    )    //
1670 
1671 DEFINE_CONSTANT(,    "STATEPARRY"    )    //
1672 DEFINE_CONSTANT(,    "STATEWANDER"    )    //
1673 DEFINE_CONSTANT(,    "STATEGUARD"    )    //
1674 DEFINE_CONSTANT(,    "STATEFOLLOW"    )    //
1675 DEFINE_CONSTANT(,    "STATESURROUND"    )    //
1676 DEFINE_CONSTANT(,    "STATERETREAT"    )    //
1677 DEFINE_CONSTANT(,    "STATECHARGE"    )    //
1678 DEFINE_CONSTANT(,    "STATECOMBAT"    )    //
1679 
1680 DEFINE_CONSTANT( GRIP_ONLY,    "GRIPONLY"    )    //
1681 DEFINE_CONSTANT( GRIP_LEFT,    "GRIPLEFT"    )    //
1682 DEFINE_CONSTANT( GRIP_RIGHT,    "GRIPRIGHT"    )    //
1683 DEFINE_CONSTANT( GRIP_ORIGIN,    "SPAWNORIGIN"    )    //
1684 DEFINE_CONSTANT( GRIP_LAST,    "SPAWNLAST"    )    //
1685 
1686 DEFINE_CONSTANT( LATCHBUTTON_LEFT,    "LATCHLEFT"    )    //
1687 DEFINE_CONSTANT( LATCHBUTTON_RIGHT,    "LATCHRIGHT"    )    //
1688 DEFINE_CONSTANT( LATCHBUTTON_JUMP,    "LATCHJUMP"    )    //
1689 DEFINE_CONSTANT( LATCHBUTTON_ALTLEFT,    "LATCHALTLEFT"    )    //
1690 DEFINE_CONSTANT( LATCHBUTTON_ALTRIGHT,    "LATCHALTRIGHT"    )    //
1691 DEFINE_CONSTANT( LATCHBUTTON_PACKLEFT,    "LATCHPACKLEFT"    )    //
1692 DEFINE_CONSTANT( LATCHBUTTON_PACKRIGHT,    "LATCHPACKRIGHT"    )    //
1693 
1694 DEFINE_CONSTANT( DAMAGE_SLASH,    "DAMAGESLASH"    )    //
1695 DEFINE_CONSTANT( DAMAGE_CRUSH,    "DAMAGECRUSH"    )    //
1696 DEFINE_CONSTANT( DAMAGE_POKE ,    "DAMAGEPOKE"    )    //
1697 DEFINE_CONSTANT( DAMAGE_HOLY ,    "DAMAGEHOLY"    )    //
1698 DEFINE_CONSTANT( DAMAGE_EVIL ,    "DAMAGEEVIL"    )    //
1699 DEFINE_CONSTANT( DAMAGE_FIRE ,    "DAMAGEFIRE"    )    //
1700 DEFINE_CONSTANT( DAMAGE_ICE  ,    "DAMAGEICE"    )    //
1701 DEFINE_CONSTANT( DAMAGE_ZAP  ,    "DAMAGEZAP"    )    //
1702 
1703 DEFINE_CONSTANT( ACTION_DA,    "ACTIONDA"    )    //
1704 DEFINE_CONSTANT( ACTION_DB,    "ACTIONDB"    )    //
1705 DEFINE_CONSTANT( ACTION_DC,    "ACTIONDC"    )    //
1706 DEFINE_CONSTANT( ACTION_DD,    "ACTIONDD"    )    //
1707 DEFINE_CONSTANT( ACTION_UA,    "ACTIONUA"    )    //
1708 DEFINE_CONSTANT( ACTION_UB,    "ACTIONUB"    )    //
1709 DEFINE_CONSTANT( ACTION_UC,    "ACTIONUC"    )    //
1710 DEFINE_CONSTANT( ACTION_UD,    "ACTIONUD"    )    //
1711 DEFINE_CONSTANT( ACTION_TA,    "ACTIONTA"    )    //
1712 DEFINE_CONSTANT( ACTION_TB,    "ACTIONTB"    )    //
1713 DEFINE_CONSTANT( ACTION_TC,    "ACTIONTC"    )    //
1714 DEFINE_CONSTANT( ACTION_TD,    "ACTIONTD"    )    //
1715 DEFINE_CONSTANT( ACTION_CA,    "ACTIONCA"    )    //
1716 DEFINE_CONSTANT( ACTION_CB,    "ACTIONCB"    )    //
1717 DEFINE_CONSTANT( ACTION_CC,    "ACTIONCC"    )    //
1718 DEFINE_CONSTANT( ACTION_CD,    "ACTIONCD"    )    //
1719 DEFINE_CONSTANT( ACTION_SA,    "ACTIONSA"    )    //
1720 DEFINE_CONSTANT( ACTION_SB,    "ACTIONSB"    )    //
1721 DEFINE_CONSTANT( ACTION_SC,    "ACTIONSC"    )    //
1722 DEFINE_CONSTANT( ACTION_SD,    "ACTIONSD"    )    //
1723 DEFINE_CONSTANT( ACTION_BA,    "ACTIONBA"    )    //
1724 DEFINE_CONSTANT( ACTION_BB,    "ACTIONBB"    )    //
1725 DEFINE_CONSTANT( ACTION_BC,    "ACTIONBC"    )    //
1726 DEFINE_CONSTANT( ACTION_BD,    "ACTIONBD"    )    //
1727 DEFINE_CONSTANT( ACTION_LA,    "ACTIONLA"    )    //
1728 DEFINE_CONSTANT( ACTION_LB,    "ACTIONLB"    )    //
1729 DEFINE_CONSTANT( ACTION_LC,    "ACTIONLC"    )    //
1730 DEFINE_CONSTANT( ACTION_LD,    "ACTIONLD"    )    //
1731 DEFINE_CONSTANT( ACTION_XA,    "ACTIONXA"    )    //
1732 DEFINE_CONSTANT( ACTION_XB,    "ACTIONXB"    )    //
1733 DEFINE_CONSTANT( ACTION_XC,    "ACTIONXC"    )    //
1734 DEFINE_CONSTANT( ACTION_XD,    "ACTIONXD"    )    //
1735 DEFINE_CONSTANT( ACTION_FA,    "ACTIONFA"    )    //
1736 DEFINE_CONSTANT( ACTION_FB,    "ACTIONFB"    )    //
1737 DEFINE_CONSTANT( ACTION_FC,    "ACTIONFC"    )    //
1738 DEFINE_CONSTANT( ACTION_FD,    "ACTIONFD"    )    //
1739 DEFINE_CONSTANT( ACTION_PA,    "ACTIONPA"    )    //
1740 DEFINE_CONSTANT( ACTION_PB,    "ACTIONPB"    )    //
1741 DEFINE_CONSTANT( ACTION_PC,    "ACTIONPC"    )    //
1742 DEFINE_CONSTANT( ACTION_PD,    "ACTIONPD"    )    //
1743 DEFINE_CONSTANT( ACTION_EA,    "ACTIONEA"    )    //
1744 DEFINE_CONSTANT( ACTION_EB,    "ACTIONEB"    )    //
1745 DEFINE_CONSTANT( ACTION_RA,    "ACTIONRA"    )    //
1746 DEFINE_CONSTANT( ACTION_ZA,    "ACTIONZA"    )    //
1747 DEFINE_CONSTANT( ACTION_ZB,    "ACTIONZB"    )    //
1748 DEFINE_CONSTANT( ACTION_ZC,    "ACTIONZC"    )    //
1749 DEFINE_CONSTANT( ACTION_ZD,    "ACTIONZD"    )    //
1750 DEFINE_CONSTANT( ACTION_WA,    "ACTIONWA"    )    //
1751 DEFINE_CONSTANT( ACTION_WB,    "ACTIONWB"    )    //
1752 DEFINE_CONSTANT( ACTION_WC,    "ACTIONWC"    )    //
1753 DEFINE_CONSTANT( ACTION_WD,    "ACTIONWD"    )    //
1754 DEFINE_CONSTANT( ACTION_JA,    "ACTIONJA"    )    //
1755 DEFINE_CONSTANT( ACTION_JB,    "ACTIONJB"    )    //
1756 DEFINE_CONSTANT( ACTION_JC,    "ACTIONJC"    )    //
1757 DEFINE_CONSTANT( ACTION_HA,    "ACTIONHA"    )    //
1758 DEFINE_CONSTANT( ACTION_HB,    "ACTIONHB"    )    //
1759 DEFINE_CONSTANT( ACTION_HC,    "ACTIONHC"    )    //
1760 DEFINE_CONSTANT( ACTION_HD,    "ACTIONHD"    )    //
1761 DEFINE_CONSTANT( ACTION_KA,    "ACTIONKA"    )    //
1762 DEFINE_CONSTANT( ACTION_KB,    "ACTIONKB"    )    //
1763 DEFINE_CONSTANT( ACTION_KC,    "ACTIONKC"    )    //
1764 DEFINE_CONSTANT( ACTION_KD,    "ACTIONKD"    )    //
1765 DEFINE_CONSTANT( ACTION_MA,    "ACTIONMA"    )    //
1766 DEFINE_CONSTANT( ACTION_MB,    "ACTIONMB"    )    //
1767 DEFINE_CONSTANT( ACTION_MC,    "ACTIONMC"    )    //
1768 DEFINE_CONSTANT( ACTION_MD,    "ACTIONMD"    )    //
1769 DEFINE_CONSTANT( ACTION_ME,    "ACTIONME"    )    //
1770 DEFINE_CONSTANT( ACTION_MF,    "ACTIONMF"    )    //
1771 DEFINE_CONSTANT( ACTION_MG,    "ACTIONMG"    )    //
1772 DEFINE_CONSTANT( ACTION_MH,    "ACTIONMH"    )    //
1773 DEFINE_CONSTANT( ACTION_MI,    "ACTIONMI"    )    //
1774 DEFINE_CONSTANT( ACTION_MJ,    "ACTIONMJ"    )    //
1775 DEFINE_CONSTANT( ACTION_MK,    "ACTIONMK"    )    //
1776 DEFINE_CONSTANT( ACTION_ML,    "ACTIONML"    )    //
1777 DEFINE_CONSTANT( ACTION_MM,    "ACTIONMM"    )    //
1778 DEFINE_CONSTANT( ACTION_MN,    "ACTIONMN"    )    //
1779 
1780 DEFINE_CONSTANT( XP_FINDSECRET,    "EXPSECRET"    )    //
1781 DEFINE_CONSTANT( XP_WINQUEST,    "EXPQUEST"    )    //
1782 DEFINE_CONSTANT( XP_USEDUNKOWN,    "EXPDARE"    )    //
1783 DEFINE_CONSTANT( XP_KILLENEMY,    "EXPKILL"    )    //
1784 DEFINE_CONSTANT( XP_KILLSLEEPY,    "EXPMURDER"    )    //
1785 DEFINE_CONSTANT( XP_KILLHATED,    "EXPREVENGE"    )    //
1786 DEFINE_CONSTANT( XP_TEAMKILL,    "EXPTEAMWORK"    )    //
1787 DEFINE_CONSTANT( XP_TALKGOOD,    "EXPROLEPLAY"    )    //
1788 
1789 DEFINE_CONSTANT(,    "MESSAGEDEATH"    )    //
1790 DEFINE_CONSTANT(,    "MESSAGEHATE"    )    //
1791 DEFINE_CONSTANT(,    "MESSAGEOUCH"    )    //
1792 DEFINE_CONSTANT(,    "MESSAGEFRAG"    )    //
1793 DEFINE_CONSTANT(,    "MESSAGEACCIDENT"    )    //
1794 DEFINE_CONSTANT(,    "MESSAGECOSTUME"    )    //
1795 
1796 DEFINE_CONSTANT(,    "ORDERMOVE"    )    //
1797 DEFINE_CONSTANT(,    "ORDERATTACK"    )    //
1798 DEFINE_CONSTANT(,    "ORDERASSIST"    )    //
1799 DEFINE_CONSTANT(,    "ORDERSTAND"    )    //
1800 DEFINE_CONSTANT(,    "ORDERTERRAIN"    )    //
1801 
1802 DEFINE_CONSTANT(,    "WHITE"    )    //
1803 DEFINE_CONSTANT(,    "RED"    )    //
1804 DEFINE_CONSTANT(,    "YELLOW"    )    //
1805 DEFINE_CONSTANT(,    "GREEN"    )    //
1806 DEFINE_CONSTANT(,    "BLUE"    )    //
1807 DEFINE_CONSTANT(,    "PURPLE"    )    //
1808 
1809 DEFINE_CONSTANT(,    "FXNOREFLECT"    )    //
1810 DEFINE_CONSTANT(,    "FXDRAWREFLECT"    )    //
1811 DEFINE_CONSTANT(,    "FXANIM"    )    //
1812 DEFINE_CONSTANT(,    "FXWATER"    )    //
1813 DEFINE_CONSTANT(,    "FXBARRIER"    )    //
1814 DEFINE_CONSTANT(,    "FXIMPASS"    )    //
1815 DEFINE_CONSTANT(,    "FXDAMAGE"    )    //
1816 DEFINE_CONSTANT(,    "FXSLIPPY"    )    //
1817 
1818 DEFINE_CONSTANT(,    "MOVEMELEE"    )    //
1819 DEFINE_CONSTANT(,    "MOVERANGED"    )    //
1820 DEFINE_CONSTANT(,    "MOVEDISTANCE"    )    //
1821 DEFINE_CONSTANT(,    "MOVERETREAT"    )    //
1822 DEFINE_CONSTANT(,    "MOVECHARGE"    )    //
1823 
1824 DEFINE_CONSTANT(,    "TEAMA"    )    //
1825 DEFINE_CONSTANT(,    "TEAMB"    )    //
1826 DEFINE_CONSTANT(,    "TEAMC"    )    //
1827 DEFINE_CONSTANT(,    "TEAMD"    )    //
1828 DEFINE_CONSTANT(,    "TEAME"    )    //
1829 DEFINE_CONSTANT(,    "TEAMF"    )    //
1830 DEFINE_CONSTANT(,    "TEAMG"    )    //
1831 DEFINE_CONSTANT(,    "TEAMH"    )    //
1832 DEFINE_CONSTANT(,    "TEAMI"    )    //
1833 DEFINE_CONSTANT(,    "TEAMJ"    )    //
1834 DEFINE_CONSTANT(,    "TEAMK"    )    //
1835 DEFINE_CONSTANT(,    "TEAML"    )    //
1836 DEFINE_CONSTANT(,    "TEAMM"    )    //
1837 DEFINE_CONSTANT(,    "TEAMN"    )    //
1838 DEFINE_CONSTANT(,    "TEAMO"    )    //
1839 DEFINE_CONSTANT(,    "TEAMP"    )    //
1840 DEFINE_CONSTANT(,    "TEAMQ"    )    //
1841 DEFINE_CONSTANT(,    "TEAMR"    )    //
1842 DEFINE_CONSTANT(,    "TEAMS"    )    //
1843 DEFINE_CONSTANT(,    "TEAMT"    )    //
1844 DEFINE_CONSTANT(,    "TEAMV"    )    //
1845 DEFINE_CONSTANT(,    "TEAMW"    )    //
1846 DEFINE_CONSTANT(,    "TEAMX"    )    //
1847 DEFINE_CONSTANT(,    "TEAMY"    )    //
1848 DEFINE_CONSTANT(,    "TEAMZ"    )    //
1849 
1850 DEFINE_CONSTANT(,    "INVENTORY"    )    //
1851 DEFINE_CONSTANT(,    "LEFT"    )    //
1852 DEFINE_CONSTANT(,    "RIGHT"    )    //
1853 
1854 DEFINE_CONSTANT(,    "EASY"    )    //
1855 DEFINE_CONSTANT(,    "NORMAL"    )    //
1856 DEFINE_CONSTANT(,    "HARD"    )    //
1857 
1858 DEFINE_VARIABLE( VARTMPX = 0,    "tmpx"    )             // == 0
1859 DEFINE_VARIABLE( VARTMPY,    "tmpy"    )                 // == 1
1860 DEFINE_VARIABLE( VARTMPDISTANCE,    "tmpdistance"    )          // == 2
1861 DEFINE_VARIABLE( VARTMPTURN,    "tmpturn"    )              // == 3
1862 DEFINE_VARIABLE( VARTMPARGUMENT,    "tmpargument"    )          // == 4
1863 DEFINE_VARIABLE( VARRAND,    "rand"    )                 // == 5
1864 DEFINE_VARIABLE( VARSELFX,    "selfx"    )                // == 6
1865 DEFINE_VARIABLE( VARSELFY,    "selfy"    )                // == 7
1866 DEFINE_VARIABLE( VARSELFTURN,    "selfturn"    )             // == 8
1867 DEFINE_VARIABLE( VARSELFCOUNTER,    "selfcounter"    )          // == 9
1868 DEFINE_VARIABLE( VARSELFORDER,    "selforder"    )            // == 10
1869 DEFINE_VARIABLE( VARSELFMORALE,    "selfmorale"    )           // == 11
1870 DEFINE_VARIABLE( VARSELFLIFE,    "selflife"    )             // == 12
1871 DEFINE_VARIABLE( VARTARGETX,    "targetx"    )              // == 13
1872 DEFINE_VARIABLE( VARTARGETY,    "targety"    )              // == 14
1873 DEFINE_VARIABLE( VARTARGETDISTANCE,    "targetdistance"    )       // == 15
1874 DEFINE_VARIABLE( VARTARGETTURN,    "targetturn"    )           // == 16
1875 DEFINE_VARIABLE( VARLEADERX,    "leaderx"    )              // == 17
1876 DEFINE_VARIABLE( VARLEADERY,    "leadery"    )              // == 18
1877 DEFINE_VARIABLE( VARLEADERDISTANCE,    "leaderdistance"    )       // == 19
1878 DEFINE_VARIABLE( VARLEADERTURN,    "leaderturn"    )           // == 20
1879 DEFINE_VARIABLE( VARGOTOX,    "gotox"    )                // == 21
1880 DEFINE_VARIABLE( VARGOTOY,    "gotoy"    )                // == 22
1881 DEFINE_VARIABLE( VARGOTODISTANCE,    "gotodistance"    )         // == 23
1882 DEFINE_VARIABLE( VARTARGETTURNTO,    "targetturnto"    )         // == 24
1883 DEFINE_VARIABLE( VARPASSAGE,    "passage"    )              // == 25
1884 DEFINE_VARIABLE( VARWEIGHT,    "weight"    )               // == 26
1885 DEFINE_VARIABLE( VARSELFALTITUDE,    "selfaltitude"    )         // == 27
1886 DEFINE_VARIABLE( VARSELFID,    "selfid"    )               // == 28
1887 DEFINE_VARIABLE( VARSELFHATEID,    "selfhateid"    )           // == 29
1888 DEFINE_VARIABLE( VARSELFMANA,    "selfmana"    )             // == 30
1889 DEFINE_VARIABLE( VARTARGETSTR,    "targetstr"    )            // == 31
1890 DEFINE_VARIABLE( VARTARGETWIS,    "targetwis"    )            // == 32
1891 DEFINE_VARIABLE( VARTARGETINT,    "targetint"    )            // == 33
1892 DEFINE_VARIABLE( VARTARGETDEX,    "targetdex"    )            // == 34
1893 DEFINE_VARIABLE( VARTARGETLIFE,    "target_life"    )           // == 35
1894 DEFINE_VARIABLE( VARTARGETMANA,    "target_mana"    )           // == 36
1895 DEFINE_VARIABLE( VARTARGETLEVEL,    "targetlevel"    )          // == 37
1896 DEFINE_VARIABLE( VARTARGETSPEEDX,    "targetspeedx"    )         // == 38
1897 DEFINE_VARIABLE( VARTARGETSPEEDY,    "targetspeedy"    )         // == 39
1898 DEFINE_VARIABLE( VARTARGETSPEEDZ,    "targetspeedz"    )         // == 40
1899 DEFINE_VARIABLE( VARSELFSPAWNX,    "selfspawnx"    )           // == 41
1900 DEFINE_VARIABLE( VARSELFSPAWNY,    "selfspawny"    )           // == 42
1901 DEFINE_VARIABLE( VARSELFSTATE,    "selfstate"    )            // == 43
1902 DEFINE_VARIABLE( VARSELFSTR,    "selfstr"    )              // == 44
1903 DEFINE_VARIABLE( VARSELFWIS,    "selfwis"    )              // == 45
1904 DEFINE_VARIABLE( VARSELFINT,    "selfint"    )              // == 46
1905 DEFINE_VARIABLE( VARSELFDEX,    "selfdex"    )              // == 47
1906 DEFINE_VARIABLE( VARSELFMANAFLOW,    "selfmanaflow"    )         // == 48
1907 DEFINE_VARIABLE( VARTARGETMANAFLOW,    "targetmanaflow"    )       // == 49
1908 DEFINE_VARIABLE( VARSELFATTACHED,    "selfattached"    )         // == 50
1909 DEFINE_VARIABLE( VARSWINGTURN,    "swingturn"    )            // == 51
1910 DEFINE_VARIABLE( VARXYDISTANCE,    "xydistance"    )           // == 52
1911 DEFINE_VARIABLE( VARSELFZ,    "selfz"    )                // == 53
1912 DEFINE_VARIABLE( VARTARGETALTITUDE,    "targetaltitude"    )       // == 54
1913 DEFINE_VARIABLE( VARTARGETZ,    "targetz"    )              // == 55
1914 DEFINE_VARIABLE( VARSELFINDEX,    "selfindex"    )            // == 56
1915 DEFINE_VARIABLE( VAROWNERX,    "ownerx"    )               // == 57
1916 DEFINE_VARIABLE( VAROWNERY,    "ownery"    )               // == 58
1917 DEFINE_VARIABLE( VAROWNERTURN,    "ownerturn"    )            // == 59
1918 DEFINE_VARIABLE( VAROWNERDISTANCE,    "ownerdistance"    )        // == 60
1919 DEFINE_VARIABLE( VAROWNERTURNTO,    "ownerturnto"    )          // == 61
1920 DEFINE_VARIABLE( VARXYTURNTO,    "xyturnto"    )             // == 62
1921 DEFINE_VARIABLE( VARSELFMONEY,    "selfmoney"    )            // == 63
1922 DEFINE_VARIABLE( VARSELFACCEL,    "selfaccel"    )            // == 64
1923 DEFINE_VARIABLE( VARTARGETEXP,    "targetexp"    )            // == 65
1924 DEFINE_VARIABLE( VARSELFAMMO,    "selfammo"    )             // == 66
1925 DEFINE_VARIABLE( VARTARGETAMMO,    "targetammo"    )           // == 67
1926 DEFINE_VARIABLE( VARTARGETMONEY,    "targetmoney"    )          // == 68
1927 DEFINE_VARIABLE( VARTARGETTURNAWAY,    "targetturnfrom"    )       // == 69
1928 DEFINE_VARIABLE( VARSELFLEVEL,    "selflevel"    )            // == 70
1929 DEFINE_VARIABLE( VARTARGETRELOADTIME,    "targetreloadtime"    )     // == 71
1930 DEFINE_VARIABLE( VARSELFCONTENT,    "selfcontent"    )          // == 72
1931 DEFINE_VARIABLE( VARSPAWNDISTANCE,    "spawndistance"    )        // == 73
1932 DEFINE_VARIABLE( VARTARGETMAXLIFE,    "targetmaxlife"    )        // == 74
1933 DEFINE_VARIABLE( VARTARGETTEAM,    "targetteam"    )           // == 75
1934 DEFINE_VARIABLE( VARTARGETARMOR,    "targetarmor"    )          // == 76
1935 DEFINE_VARIABLE( VARDIFFICULTY        // == 77,    "difficulty"    )    //
1936 
1937 DEFINE_OPERATOR( OPADD,    "+�    )    //
1938 DEFINE_OPERATOR( OPSUB,    "-"    )    //
1939 DEFINE_OPERATOR( OPAND,    "&"    )    //
1940 DEFINE_OPERATOR( OPSHR,    ">"    )    //
1941 DEFINE_OPERATOR( OPSHL,    "<"    )    //
1942 DEFINE_OPERATOR( OPMUL,    "*"    )    //
1943 DEFINE_OPERATOR( OPDIV,    "/"    )    //
1944 DEFINE_OPERATOR( OPMOD     "%"    )    //
1945 
1946 // Aliases
1947 DEFINE_FUNCTION( FIFATLASTWAYPOINT,              IfPutAway    )
1948 DEFINE_FUNCTION( FSETTARGETTOWHOEVERATTACKED,    SetTargetToWhoeverHealed    )
1949 DEFINE_FUNCTION( FIFGRABBED,    IfMounted    )
1950 DEFINE_FUNCTION( FIFDROPPED,    IfDismounted    )
1951 DEFINE_FUNCTION( FIFXISLESSTHANY,    IfYIsMoreThanX    )
1952 DEFINE_FUNCTION( FIFSITTING,    IfHeld    )
1953 DEFINE_FUNCTION( FIFYISLESSTHANX,    IfXIsMoreThanY    )
1954 DEFINE_FUNCTION( FIFSTATEIS0,    IfStateIsParry    )
1955 DEFINE_FUNCTION( FIFSTATEIS1,    IfStateIsWander    )
1956 DEFINE_FUNCTION( FIFSTATEIS2,    IfStateIsGuard    )
1957 DEFINE_FUNCTION( FIFSTATEIS3,    IfStateIsFollow    )
1958 DEFINE_FUNCTION( FIFSTATEIS4,    IfStateIsSurround    )
1959 DEFINE_FUNCTION( FIFSTATEIS5,    IfStateIsRetreat    )
1960 DEFINE_FUNCTION( FIFSTATEIS6,    IfStateIsCharge    )
1961 DEFINE_FUNCTION( FIFSTATEIS7,    IfStateIsCombat    )
1962 DEFINE_FUNCTION( FIFXISEQUALTOY,    IfYIsEqualToX    )
1963 DEFINE_FUNCTION( FIFNOTPUTAWAY,    IfNotTakenOut    )
1964 */
1965 
1966 //--------------------------------------------------------------------------------------------
1967 // int load_parsed_line( int read )
1968 // {
1969 //   /// @details ZZ@> This function loads a line into the line buffer
1970 //
1971 //   char cTmp;
1972 
1973 //   // Parse to start to maintain indentation
1974 //   iLineSize = 0;
1975 //   cTmp = cLoadBuffer[read];
1976 
1977 //   while ( CSTR_END != cTmp )
1978 //   {
1979 //       cLineBuffer[iLineSize] = cTmp;  iLineSize++;
1980 //       read++;  cTmp = cLoadBuffer[read];
1981 //   }
1982 
1983 //   cLineBuffer[iLineSize] = CSTR_END;
1984 //   read++; // skip terminating zero for next call of load_parsed_line()
1985 //   return read;
1986 // }
1987 
1988 //--------------------------------------------------------------------------------------------
1989 // void parse_null_terminate_comments()
1990 // {
1991 //   /// @details ZZ@> This function removes comments and endline codes, replacing
1992 //   ///    them with a 0
1993 //
1994 //   int read, write;
1995 
1996 //   read = 0;
1997 //   write = 0;
1998 
1999 //   while ( read < iLoadSize )
2000 //   {
2001 //       read = load_one_line( read );
2002 
2003 //       if ( iLineSize > 2 )
2004 //       {
2005 //           copy_one_line( write );
2006 //           write += iLineSize;
2007 //       }
2008 //   }
2009 // }