Subversion Repositories eduke32

Rev

Rev 386 | Rev 412 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5 Plagman 1
//-------------------------------------------------------------------------
2
/*
3
Copyright (C) 2005 - EDuke32 team
4
 
5
This file is part of EDuke32
6
 
7
EDuke32 is free software; you can redistribute it and/or
8
modify it under the terms of the GNU General Public License version 2
9
as published by the Free Software Foundation.
10
 
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14
 
15
See the GNU General Public License for more details.
16
 
17
You should have received a copy of the GNU General Public License
18
along with this program; if not, write to the Free Software
19
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20
*/
21
//-------------------------------------------------------------------------
22
 
23
#include "duke3d.h"
24
#include "gamedef.h"
25
 
26
#include "osd.h"
27
 
28
int conversion = 13;
29
 
398 terminx 30
char compilefile[BMAX_PATH] = "(none)";  // file we're currently compiling
5 Plagman 31
static char parsing_item_name[MAXVARLABEL] = "(none)", previous_item_name[MAXVARLABEL] = "NULL";
32
 
398 terminx 33
short total_lines,line_number;
297 terminx 34
static short checking_ifelse,parsing_state;
5 Plagman 35
char g_szBuf[1024];
36
 
37
long *casescriptptr=NULL;      // the pointer to the start of the case table in a switch statement
38
// first entry is 'default' code.
39
int casecount = 0;
297 terminx 40
signed short checking_switch = 0, current_event = -1;
5 Plagman 41
char labelsonly = 0, nokeywordcheck = 0, dynamicremap = 0;
42
static short num_braces = 0;    // init to some sensible defaults
43
 
92 terminx 44
int redefined_quote_count = 0;
5 Plagman 45
 
46
long *aplWeaponClip[MAX_WEAPONS];       // number of items in magazine
47
long *aplWeaponReload[MAX_WEAPONS];     // delay to reload (include fire)
48
long *aplWeaponFireDelay[MAX_WEAPONS];      // delay to fire
49
long *aplWeaponHoldDelay[MAX_WEAPONS];      // delay after release fire button to fire (0 for none)
50
long *aplWeaponTotalTime[MAX_WEAPONS];      // The total time the weapon is cycling before next fire.
51
long *aplWeaponFlags[MAX_WEAPONS];      // Flags for weapon
52
long *aplWeaponShoots[MAX_WEAPONS];     // what the weapon shoots
53
long *aplWeaponSpawnTime[MAX_WEAPONS];      // the frame at which to spawn an item
54
long *aplWeaponSpawn[MAX_WEAPONS];      // the item to spawn
55
long *aplWeaponShotsPerBurst[MAX_WEAPONS];  // number of shots per 'burst' (one ammo per 'burst'
56
long *aplWeaponWorksLike[MAX_WEAPONS];      // What original the weapon works like
57
long *aplWeaponInitialSound[MAX_WEAPONS];   // Sound made when initialy firing. zero for no sound
58
long *aplWeaponFireSound[MAX_WEAPONS];      // Sound made when firing (each time for automatic)
59
long *aplWeaponSound2Time[MAX_WEAPONS];     // Alternate sound time
60
long *aplWeaponSound2Sound[MAX_WEAPONS];    // Alternate sound sound ID
61
long *aplWeaponReloadSound1[MAX_WEAPONS];    // Sound of magazine being removed
62
long *aplWeaponReloadSound2[MAX_WEAPONS];    // Sound of magazine being inserted
63
 
64
int g_iReturnVarID=-1;      // var ID of "RETURN"
65
int g_iWeaponVarID=-1;      // var ID of "WEAPON"
66
int g_iWorksLikeVarID=-1;   // var ID of "WORKSLIKE"
67
int g_iZRangeVarID=-1;      // var ID of "ZRANGE"
68
int g_iAngRangeVarID=-1;    // var ID of "ANGRANGE"
69
int g_iAimAngleVarID=-1;    // var ID of "AUTOAIMANGLE"
70
int g_iLoTagID=-1;          // var ID of "LOTAG"
71
int g_iHiTagID=-1;          // var ID of "HITAG"
72
int g_iTextureID=-1;        // var ID of "TEXTURE"
73
int g_iThisActorID=-1;      // var ID of "THISACTOR"
74
 
75
long *actorLoadEventScrptr[MAXTILES];
76
 
77
long *apScriptGameEvent[MAXGAMEEVENTS];
78
long *parsing_event=NULL;
79
 
80
MATTGAMEVAR aGameVars[MAXGAMEVARS];
81
int iGameVarCount=0;
82
 
83
MATTGAMEVAR aDefaultGameVars[MAXGAMEVARS];  // the 'original' values
84
 
85
extern long qsetmode;
86
 
335 terminx 87
enum labeltypes
88
{
255 terminx 89
    LABEL_ANY    = -1,
90
    LABEL_DEFINE = 1,
91
    LABEL_STATE  = 2,
92
    LABEL_ACTOR  = 4,
93
    LABEL_ACTION = 8,
94
    LABEL_AI     = 16,
95
    LABEL_MOVE   = 32,
5 Plagman 96
};
97
 
335 terminx 98
static char *labeltypenames[] =
99
    {
100
        "define",
101
        "state",
102
        "actor",
103
        "action",
104
        "ai",
105
        "move"
106
    };
5 Plagman 107
 
108
static char *translatelabeltype(long type)
109
{
110
    int i;
111
    char x[64];
112
 
113
    x[0] = 0;
335 terminx 114
    for (i=0;i<6;i++)
115
    {
5 Plagman 116
        if (!(type & (1<<i))) continue;
117
        if (x[0]) Bstrcat(x, " or ");
118
        Bstrcat(x, labeltypenames[i]);
119
    }
120
    return strdup(x);
121
}
122
 
123
#define NUMKEYWORDS (signed int)(sizeof(keyw)/sizeof(keyw[0]))
124
 
125
char *keyw[] = {
126
                   "definelevelname",          // 0  defines level name
127
                   "actor",                    // 1  defines an actor
128
                   "addammo",                  // 2  adds ammo to a weapon
129
                   "ifrnd",                    // 3  checks against a randomizer
130
                   "enda",                     // 4  ends an actor definition
131
                   "ifcansee",                 // 5  checks if the player can see an object
132
                   "ifhitweapon",              // 6  checks if an object was hit by a weapon
133
                   "action",                   // 7  defines an action if used outside a state or actor, otherwise triggers actor to perform action
134
                   "ifpdistl",                 // 8  checks if player distance is less than value
135
                   "ifpdistg",                 // 9  checks if player distance is more than value
136
                   "else",                     // 10 used with if checks
137
                   "strength",                 // 11 sets health
138
                   "break",                    // 12 stops processing
139
                   "shoot",                    // 13 shoots a projectile
140
                   "palfrom",                  // 14 used for player screen shading effect, sets p->pals_time and p->pals[0-2]
141
                   "sound",                    // 15 plays a sound that was defined with definesound
142
                   "fall",                     // 16 causes actor to fall to sector floor height
143
                   "state",                    // 17 begins defining a state if used outside a state or actor, otherwise calls a state
144
                   "ends",                     // 18 ends defining a state
145
                   "define",                   // 19 defines a value
146
                   "<null>",                   // 20 was previously used to define a comment
147
                   "ifai",                     // 21 checks if actor is currently performing a specific ai function
148
                   "killit",                   // 22 kills an actor
149
                   "addweapon",                // 23 adds a weapon to the closest player
150
                   "ai",                       // 24 sets an ai function to be used by an actor
151
                   "addphealth",               // 25 adds health to the player
152
                   "ifdead",                   // 26 checks if actor is dead
153
                   "ifsquished",               // 27 checks if actor has been squished
154
                   "sizeto",                   // 28 gradually increases actor size until it matches parameters given
155
                   "{",                        // 29 used to indicate segments of code
156
                   "}",                        // 30 used to indicate segments of code
157
                   "spawn",                    // 31 spawns an actor
158
                   "move",                     // 32
159
                   "ifwasweapon",              // 33
160
                   "ifaction",                 // 34
161
                   "ifactioncount",            // 35
162
                   "resetactioncount",         // 36
163
                   "debris",                   // 37
164
                   "pstomp",                   // 38
165
                   "<null>",                   // 39 was previously used to define the start of a comment block
166
                   "cstat",                    // 40
167
                   "ifmove",                   // 41
168
                   "resetplayer",              // 42
169
                   "ifonwater",                // 43
170
                   "ifinwater",                // 44
171
                   "ifcanshoottarget",         // 45
172
                   "ifcount",                  // 46
173
                   "resetcount",               // 47
174
                   "addinventory",             // 48
175
                   "ifactornotstayput",        // 49
176
                   "hitradius",                // 50
177
                   "ifp",                      // 51
178
                   "count",                    // 52
179
                   "ifactor",                  // 53
180
                   "music",                    // 54
181
                   "include",                  // 55
182
                   "ifstrength",               // 56
183
                   "definesound",              // 57
184
                   "guts",                     // 58
185
                   "ifspawnedby",              // 59
186
                   "gamestartup",              // 60
187
                   "wackplayer",               // 61
188
                   "ifgapzl",                  // 62
189
                   "ifhitspace",               // 63
190
                   "ifoutside",                // 64
191
                   "ifmultiplayer",            // 65
192
                   "operate",                  // 66
193
                   "ifinspace",                // 67
194
                   "debug",                    // 68
195
                   "endofgame",                // 69
196
                   "ifbulletnear",             // 70
197
                   "ifrespawn",                // 71
198
                   "iffloordistl",             // 72
199
                   "ifceilingdistl",           // 73
200
                   "spritepal",                // 74
201
                   "ifpinventory",             // 75
202
                   "betaname",                 // 76
203
                   "cactor",                   // 77
204
                   "ifphealthl",               // 78
205
                   "definequote",              // 79
206
                   "quote",                    // 80
207
                   "ifinouterspace",           // 81
208
                   "ifnotmoving",              // 82
209
                   "respawnhitag",             // 83
210
                   "tip",                      // 84
211
                   "ifspritepal",              // 85
212
                   "money",                    // 86
213
                   "soundonce",                // 87
214
                   "addkills",                 // 88
215
                   "stopsound",                // 89
216
                   "ifawayfromwall",           // 90
217
                   "ifcanseetarget",           // 91
218
                   "globalsound",              // 92
219
                   "lotsofglass",              // 93
220
                   "ifgotweaponce",            // 94
221
                   "getlastpal",               // 95
222
                   "pkick",                    // 96
223
                   "mikesnd",                  // 97
224
                   "useractor",                // 98
225
                   "sizeat",                   // 99
226
                   "addstrength",              // 100  [#]
227
                   "cstator",                  // 101
228
                   "mail",                     // 102
229
                   "paper",                    // 103
230
                   "tossweapon",               // 104
231
                   "sleeptime",                // 105
232
                   "nullop",                   // 106
233
                   "definevolumename",         // 107
234
                   "defineskillname",          // 108
235
                   "ifnosounds",               // 109
236
                   "clipdist",                 // 110
237
                   "ifangdiffl",               // 111
238
                   "gamevar",                  // 112
239
                   "ifvarl",                   // 113
240
                   "ifvarg",                   // 114
241
                   "setvarvar",                // 115
242
                   "setvar",                   // 116
243
                   "addvarvar",                // 117
244
                   "addvar",                   // 118
245
                   "ifvarvarl",                // 119
246
                   "ifvarvarg",                // 120
247
                   "addlogvar",                // 121
248
                   "addlog",                   // 122
249
                   "onevent",                  // 123
250
                   "endevent",                 // 124
251
                   "ifvare",                   // 125
252
                   "ifvarvare",                // 126
253
                   "spgetlotag",               // 127
254
                   "spgethitag",               // 128
255
                   "sectgetlotag",             // 129
256
                   "sectgethitag",             // 130
257
                   "ifsound",                  // 131
258
                   "gettexturefloor",          // 132
259
                   "gettextureceiling",        // 133
260
                   "inittimer",                // 134
261
                   "starttrack",               // 135
262
                   "randvar",                  // 136
263
                   "enhanced",                 // 137
264
                   "getangletotarget",         // 138
265
                   "getactorangle",            // 139
266
                   "setactorangle",            // 140
267
                   "mulvar",                   // 141
268
                   "mulvarvar",                // 142
269
                   "divvar",                   // 143
270
                   "divvarvar",                // 144
271
                   "modvar",                   // 145
272
                   "modvarvar",                // 146
273
                   "andvar",                   // 147
274
                   "andvarvar",                // 148
275
                   "orvar",                    // 149
276
                   "orvarvar",                 // 150
277
                   "getplayerangle",           // 151
278
                   "setplayerangle",           // 152
279
                   "lockplayer",               // 153
280
                   "setsector",                // 154
281
                   "getsector",                // 155
282
                   "setactor",                 // 156
283
                   "getactor",                 // 157
284
                   "setwall",                  // 158
285
                   "getwall",                  // 159
286
                   "findnearactor",            // 160
287
                   "findnearactorvar",         // 161
288
                   "setactorvar",              // 162
289
                   "getactorvar",              // 163
290
                   "espawn",                   // 164
291
                   "getplayer",                // 165
292
                   "setplayer",                // 166
293
                   "sqrt",                     // 167
294
                   "eventloadactor",           // 168
295
                   "espawnvar",                // 169
296
                   "getuserdef",               // 170
297
                   "setuserdef",               // 171
298
                   "subvarvar",                // 172
299
                   "subvar",                   // 173
300
                   "ifvarn",                   // 174
301
                   "ifvarvarn",                // 175
302
                   "ifvarand",                 // 176
303
                   "ifvarvarand",              // 177
304
                   "myos",                     // 178
305
                   "myospal",                  // 179
306
                   "displayrand",              // 180
307
                   "sin",                      // 181
308
                   "xorvarvar",                // 182
309
                   "xorvar",                   // 183
310
                   "randvarvar",               // 184
311
                   "myosx",                    // 185
312
                   "myospalx",                 // 186
313
                   "gmaxammo",                 // 187
314
                   "smaxammo",                 // 188
315
                   "startlevel",               // 189
316
                   "eshoot",                   // 190
317
                   "qspawn",                   // 191
318
                   "rotatesprite",             // 192
319
                   "defineprojectile",         // 193
320
                   "spriteshadow",             // 194
321
                   "cos",                      // 195
322
                   "eshootvar",                // 196
323
                   "findnearactor3d",          // 197
324
                   "findnearactor3dvar",       // 198
325
                   "flash",                    // 199
326
                   "qspawnvar",                // 200
327
                   "eqspawn",                  // 201
328
                   "eqspawnvar",               // 202
329
                   "minitext",                 // 203
330
                   "gametext",                 // 204
331
                   "digitalnumber",            // 205
332
                   "addweaponvar",             // 206
333
                   "setprojectile",            // 207
334
                   "angoff",                   // 208
335
                   "updatesector",             // 209
336
                   "insertspriteq",            // 210
337
                   "angoffvar",                // 211
338
                   "whilevarn",                // 212
339
                   "switch",                   // 213
340
                   "case",                     // 214
341
                   "default",                  // 215
342
                   "endswitch",                // 216
343
                   "shootvar",                 // 217
344
                   "soundvar",                 // 218
345
                   "findplayer",               // 219
346
                   "findotherplayer",          // 220
347
                   "activatebysector",         // 221 sectnum, spriteid
348
                   "operatesectors",           // 222 sectnum, spriteid
349
                   "operaterespawns",          // 223 lotag
350
                   "operateactivators",        // 224 lotag, player index
351
                   "operatemasterswitches",    // 225 lotag
352
                   "checkactivatormotion",     // 226 lotag
353
                   "zshoot",                   // 227 zvar projnum
354
                   "dist",                     // 228 sprite1 sprite2
355
                   "ldist",                    // 229 sprite1 sprite2
356
                   "shiftvarl",                // 230
357
                   "shiftvarr",                // 231
358
                   "spritenvg",                // 232
359
                   "getangle",                 // 233
360
                   "whilevarvarn",             // 234
361
                   "hitscan",                  // 235
362
                   "time",                     // 236
363
                   "getplayervar",             // 237
364
                   "setplayervar",             // 238
365
                   "mulscale",                 // 239
366
                   "setaspect",                // 240
251 terminx 367
                   "ezshoot",                  // 241
5 Plagman 368
                   "spritenoshade",            // 242
369
                   "movesprite",               // 243
370
                   "checkavailweapon",         // 244
371
                   "soundoncevar",             // 245
372
                   "updatesectorz",            // 246
373
                   "stopallsounds",            // 247
374
                   "ssp",                      // 248
375
                   "stopsoundvar",             // 249
376
                   "displayrandvar",           // 250
377
                   "displayrandvarvar",        // 251
378
                   "checkavailinven",          // 252
379
                   "globalsoundvar",           // 253
380
                   "guniqhudid",               // 254
381
                   "getprojectile",            // 255
382
                   "getthisprojectile",        // 256
383
                   "setthisprojectile",        // 257
384
                   "definecheat",              // 258
385
                   "cheatkeys",                // 259
386
                   "userquote",                // 260
387
                   "precache",                 // 261
121 terminx 388
                   "definegamefuncname",       // 262
5 Plagman 389
                   "redefinequote",            // 263
290 terminx 390
                   "qsprintf",                 // 264
5 Plagman 391
                   "getpname",                 // 265
392
                   "qstrcat",                  // 266
393
                   "qstrcpy",                  // 267
394
                   "setsprite",                // 268
395
                   "rotatepoint",              // 269
396
                   "dragpoint",                // 270
397
                   "getzrange",                // 271
398
                   "changespritestat",         // 272
399
                   "getceilzofslope",          // 273
400
                   "getflorzofslope",          // 274
401
                   "neartag",                  // 275
402
                   "definegametype",           // 276
403
                   "changespritesect",         // 277
404
                   "spriteflags",              // 278
405
                   "savegamevar",              // 279
406
                   "readgamevar",              // 280
407
                   "findnearsprite",           // 281
408
                   "findnearspritevar",        // 282
409
                   "findnearsprite3d",         // 283
410
                   "findnearsprite3dvar",      // 284
411
                   "dynamicremap",             // 285
412
                   "setinput",                 // 286
413
                   "getinput",                 // 287
29 terminx 414
                   "save",                                         // 288
97 terminx 415
                   "cansee",                   // 289
106 terminx 416
                   "canseespr",                // 290
169 terminx 417
                   "findnearactorz",           // 291
418
                   "findnearactorzvar",        // 292
419
                   "findnearspritez",          // 293
420
                   "findnearspritezvar",       // 294
276 terminx 421
                   "zshootvar",                            // 295
422
                   "ezshootvar",                           // 296
277 terminx 423
                   "getcurraddress",               // 297
424
                   "jump",                                         // 298
305 terminx 425
                   "qstrlen",                              // 299
329 terminx 426
                   "getincangle",              // 300
5 Plagman 427
                   "<null>"
428
               };
429
 
430
LABELS sectorlabels[]= {
431
                           { "wallptr", SECTOR_WALLPTR, 0, 0 },
432
                           { "wallnum", SECTOR_WALLNUM, 0, 0 },
433
                           { "ceilingz", SECTOR_CEILINGZ, 0, 0 },
434
                           { "floorz", SECTOR_FLOORZ, 0, 0 },
435
                           { "ceilingstat", SECTOR_CEILINGSTAT, 0, 0 },
436
                           { "floorstat", SECTOR_FLOORSTAT, 0, 0 },
437
                           { "ceilingpicnum", SECTOR_CEILINGPICNUM, 0, 0 },
438
                           { "ceilingslope", SECTOR_CEILINGSLOPE, 0, 0 },
439
                           { "ceilingshade", SECTOR_CEILINGSHADE, 0, 0 },
440
                           { "ceilingpal", SECTOR_CEILINGPAL, 0, 0 },
441
                           { "ceilingxpanning", SECTOR_CEILINGXPANNING, 0, 0 },
442
                           { "ceilingypanning", SECTOR_CEILINGYPANNING, 0, 0 },
443
                           { "floorpicnum", SECTOR_FLOORPICNUM, 0, 0 },
444
                           { "floorslope", SECTOR_FLOORSLOPE, 0, 0 },
445
                           { "floorshade", SECTOR_FLOORSHADE, 0, 0 },
446
                           { "floorpal", SECTOR_FLOORPAL, 0, 0 },
447
                           { "floorxpanning", SECTOR_FLOORXPANNING, 0, 0 },
448
                           { "floorypanning", SECTOR_FLOORYPANNING, 0, 0 },
449
                           { "visibility", SECTOR_VISIBILITY, 0, 0 },
450
                           { "alignto", SECTOR_ALIGNTO, 0, 0 },
451
                           { "lotag", SECTOR_LOTAG, 0, 0 },
452
                           { "hitag", SECTOR_HITAG, 0, 0 },
453
                           { "extra", SECTOR_EXTRA, 0, 0 },
454
                           { "", -1, 0, 0  }     // END OF LIST
455
                       };
456
 
457
LABELS walllabels[]= {
458
                         { "x", WALL_X, 0, 0 },
459
                         { "y", WALL_Y, 0, 0 },
460
                         { "point2", WALL_POINT2, 0, 0 },
461
                         { "nextwall", WALL_NEXTWALL, 0, 0 },
462
                         { "nextsector", WALL_NEXTSECTOR, 0, 0 },
463
                         { "cstat", WALL_CSTAT, 0, 0 },
464
                         { "picnum", WALL_PICNUM, 0, 0 },
465
                         { "overpicnum", WALL_OVERPICNUM, 0, 0 },
466
                         { "shade", WALL_SHADE, 0, 0 },
467
                         { "pal", WALL_PAL, 0, 0 },
468
                         { "xrepeat", WALL_XREPEAT, 0, 0 },
469
                         { "yrepeat", WALL_YREPEAT, 0, 0 },
470
                         { "xpanning", WALL_XPANNING, 0, 0 },
471
                         { "ypanning", WALL_YPANNING, 0, 0 },
472
                         { "lotag", WALL_LOTAG, 0, 0 },
473
                         { "hitag", WALL_HITAG, 0, 0 },
474
                         { "extra", WALL_EXTRA, 0, 0 },
475
                         { "", -1, 0, 0  }     // END OF LIST
476
                     };
477
 
478
LABELS actorlabels[]= {
479
                          { "x", ACTOR_X, 0, 0 },
480
                          { "y", ACTOR_Y, 0, 0 },
481
                          { "z", ACTOR_Z, 0, 0 },
482
                          { "cstat", ACTOR_CSTAT, 0, 0 },
483
                          { "picnum", ACTOR_PICNUM, 0, 0 },
484
                          { "shade", ACTOR_SHADE, 0, 0 },
485
                          { "pal", ACTOR_PAL, 0, 0 },
486
                          { "clipdist", ACTOR_CLIPDIST, 0, 0 },
487
                          { "detail", ACTOR_DETAIL, 0, 0 },
488
                          { "xrepeat", ACTOR_XREPEAT, 0, 0 },
489
                          { "yrepeat", ACTOR_YREPEAT, 0, 0 },
490
                          { "xoffset", ACTOR_XOFFSET, 0, 0 },
491
                          { "yoffset", ACTOR_YOFFSET, 0, 0 },
492
                          { "sectnum", ACTOR_SECTNUM, 0, 0 },
493
                          { "statnum", ACTOR_STATNUM, 0, 0 },
494
                          { "ang", ACTOR_ANG, 0, 0 },
495
                          { "owner", ACTOR_OWNER, 0, 0 },
496
                          { "xvel", ACTOR_XVEL, 0, 0 },
497
                          { "yvel", ACTOR_YVEL, 0, 0 },
498
                          { "zvel", ACTOR_ZVEL, 0, 0 },
499
                          { "lotag", ACTOR_LOTAG, 0, 0 },
500
                          { "hitag", ACTOR_HITAG, 0, 0 },
501
                          { "extra", ACTOR_EXTRA, 0, 0 },
502
 
503
                          // hittype labels...
504
                          { "htcgg", ACTOR_HTCGG, 0, 0 },
505
                          { "htpicnum", ACTOR_HTPICNUM, 0, 0 },
506
                          { "htang", ACTOR_HTANG, 0, 0 },
507
                          { "htextra", ACTOR_HTEXTRA, 0, 0 },
508
                          { "htowner", ACTOR_HTOWNER, 0, 0 },
509
                          { "htmovflag", ACTOR_HTMOVFLAG, 0, 0 },
510
                          { "httempang", ACTOR_HTTEMPANG, 0, 0 },
511
                          { "htactorstayput", ACTOR_HTACTORSTAYPUT, 0, 0 },
512
                          { "htdispicnum", ACTOR_HTDISPICNUM, 0, 0 },
513
                          { "httimetosleep", ACTOR_HTTIMETOSLEEP, 0, 0 },
514
                          { "htfloorz", ACTOR_HTFLOORZ, 0, 0 },
515
                          { "htceilingz", ACTOR_HTCEILINGZ, 0, 0 },
516
                          { "htlastvx", ACTOR_HTLASTVX, 0, 0 },
517
                          { "htlastvy", ACTOR_HTLASTVY, 0, 0 },
518
                          { "htbposx", ACTOR_HTBPOSX, 0, 0 },
519
                          { "htbposy", ACTOR_HTBPOSY, 0, 0 },
520
                          { "htbposz", ACTOR_HTBPOSZ, 0, 0 },
521
                          { "htg_t", ACTOR_HTG_T, LABEL_HASPARM2, 8 },
522
 
523
                          // model flags
524
 
525
                          { "angoff", ACTOR_ANGOFF, 0, 0 },
526
                          { "pitch", ACTOR_PITCH, 0, 0 },
527
                          { "roll", ACTOR_ROLL, 0, 0 },
528
                          { "mdxoff", ACTOR_MDXOFF, 0, 0 },
529
                          { "mdyoff", ACTOR_MDYOFF, 0, 0 },
530
                          { "mdzoff", ACTOR_MDZOFF, 0, 0 },
531
                          { "", -1, 0, 0  }     // END OF LIST
532
                      };
533
 
534
LABELS playerlabels[]= {
535
                           { "zoom", PLAYER_ZOOM, 0, 0 },
536
                           { "exitx", PLAYER_EXITX, 0, 0 },
537
                           { "exity", PLAYER_EXITY, 0, 0 },
538
                           { "loogiex", PLAYER_LOOGIEX, LABEL_HASPARM2, 64 },
539
                           { "loogiey", PLAYER_LOOGIEY, LABEL_HASPARM2, 64 },
540
                           { "numloogs", PLAYER_NUMLOOGS, 0, 0 },
541
                           { "loogcnt", PLAYER_LOOGCNT, 0, 0 },
542
                           { "posx", PLAYER_POSX, 0, 0 },
543
                           { "posy", PLAYER_POSY, 0, 0 },
544
                           { "posz", PLAYER_POSZ, 0, 0 },
545
                           { "horiz", PLAYER_HORIZ, 0, 0 },
546
                           { "ohoriz", PLAYER_OHORIZ, 0, 0 },
547
                           { "ohorizoff", PLAYER_OHORIZOFF, 0, 0 },
548
                           { "invdisptime", PLAYER_INVDISPTIME, 0, 0 },
549
                           { "bobposx", PLAYER_BOBPOSX, 0, 0 },
550
                           { "bobposy", PLAYER_BOBPOSY, 0, 0 },
551
                           { "oposx", PLAYER_OPOSX, 0, 0 },
552
                           { "oposy", PLAYER_OPOSY, 0, 0 },
553
                           { "oposz", PLAYER_OPOSZ, 0, 0 },
554
                           { "pyoff", PLAYER_PYOFF, 0, 0 },
555
                           { "opyoff", PLAYER_OPYOFF, 0, 0 },
556
                           { "posxv", PLAYER_POSXV, 0, 0 },
557
                           { "posyv", PLAYER_POSYV, 0, 0 },
558
                           { "poszv", PLAYER_POSZV, 0, 0 },
559
                           { "last_pissed_time", PLAYER_LAST_PISSED_TIME, 0, 0 },
560
                           { "truefz", PLAYER_TRUEFZ, 0, 0 },
561
                           { "truecz", PLAYER_TRUECZ, 0, 0 },
562
                           { "player_par", PLAYER_PLAYER_PAR, 0, 0 },
563
                           { "visibility", PLAYER_VISIBILITY, 0, 0 },
564
                           { "bobcounter", PLAYER_BOBCOUNTER, 0, 0 },
565
                           { "weapon_sway", PLAYER_WEAPON_SWAY, 0, 0 },
566
                           { "pals_time", PLAYER_PALS_TIME, 0, 0 },
567
                           { "randomflamex", PLAYER_RANDOMFLAMEX, 0, 0 },
568
                           { "crack_time", PLAYER_CRACK_TIME, 0, 0 },
569
                           { "aim_mode", PLAYER_AIM_MODE, 0, 0 },
570
                           { "ang", PLAYER_ANG, 0, 0 },
571
                           { "oang", PLAYER_OANG, 0, 0 },
572
                           { "angvel", PLAYER_ANGVEL, 0, 0 },
573
                           { "cursectnum", PLAYER_CURSECTNUM, 0, 0 },
574
                           { "look_ang", PLAYER_LOOK_ANG, 0, 0 },
575
                           { "last_extra", PLAYER_LAST_EXTRA, 0, 0 },
576
                           { "subweapon", PLAYER_SUBWEAPON, 0, 0 },
577
                           { "ammo_amount", PLAYER_AMMO_AMOUNT, LABEL_HASPARM2, MAX_WEAPONS },
578
                           { "wackedbyactor", PLAYER_WACKEDBYACTOR, 0, 0 },
579
                           { "frag", PLAYER_FRAG, 0, 0 },
580
                           { "fraggedself", PLAYER_FRAGGEDSELF, 0, 0 },
581
                           { "curr_weapon", PLAYER_CURR_WEAPON, 0, 0 },
582
                           { "last_weapon", PLAYER_LAST_WEAPON, 0, 0 },
583
                           { "tipincs", PLAYER_TIPINCS, 0, 0 },
584
                           { "horizoff", PLAYER_HORIZOFF, 0, 0 },
585
                           { "wantweaponfire", PLAYER_WANTWEAPONFIRE, 0, 0 },
586
                           { "holoduke_amount", PLAYER_HOLODUKE_AMOUNT, 0, 0 },
587
                           { "newowner", PLAYER_NEWOWNER, 0, 0 },
588
                           { "hurt_delay", PLAYER_HURT_DELAY, 0, 0 },
589
                           { "hbomb_hold_delay", PLAYER_HBOMB_HOLD_DELAY, 0, 0 },
590
                           { "jumping_counter", PLAYER_JUMPING_COUNTER, 0, 0 },
591
                           { "airleft", PLAYER_AIRLEFT, 0, 0 },
592
                           { "knee_incs", PLAYER_KNEE_INCS, 0, 0 },
593
                           { "access_incs", PLAYER_ACCESS_INCS, 0, 0 },
594
                           { "fta", PLAYER_FTA, 0, 0 },
595
                           { "ftq", PLAYER_FTQ, 0, 0 },
596
                           { "access_wallnum", PLAYER_ACCESS_WALLNUM, 0, 0 },
597
                           { "access_spritenum", PLAYER_ACCESS_SPRITENUM, 0, 0 },
598
                           { "kickback_pic", PLAYER_KICKBACK_PIC, 0, 0 },
599
                           { "got_access", PLAYER_GOT_ACCESS, 0, 0 },
600
                           { "weapon_ang", PLAYER_WEAPON_ANG, 0, 0 },
601
                           { "firstaid_amount", PLAYER_FIRSTAID_AMOUNT, 0, 0 },
602
                           { "somethingonplayer", PLAYER_SOMETHINGONPLAYER, 0, 0 },
603
                           { "on_crane", PLAYER_ON_CRANE, 0, 0 },
604
                           { "i", PLAYER_I, 0, 0 },
605
                           { "one_parallax_sectnum", PLAYER_ONE_PARALLAX_SECTNUM, 0, 0 },
606
                           { "over_shoulder_on", PLAYER_OVER_SHOULDER_ON, 0, 0 },
607
                           { "random_club_frame", PLAYER_RANDOM_CLUB_FRAME, 0, 0 },
608
                           { "fist_incs", PLAYER_FIST_INCS, 0, 0 },
609
                           { "one_eighty_count", PLAYER_ONE_EIGHTY_COUNT, 0, 0 },
610
                           { "cheat_phase", PLAYER_CHEAT_PHASE, 0, 0 },
611
                           { "dummyplayersprite", PLAYER_DUMMYPLAYERSPRITE, 0, 0 },
612
                           { "extra_extra8", PLAYER_EXTRA_EXTRA8, 0, 0 },
613
                           { "quick_kick", PLAYER_QUICK_KICK, 0, 0 },
614
                           { "heat_amount", PLAYER_HEAT_AMOUNT, 0, 0 },
615
                           { "actorsqu", PLAYER_ACTORSQU, 0, 0 },
616
                           { "timebeforeexit", PLAYER_TIMEBEFOREEXIT, 0, 0 },
617
                           { "customexitsound", PLAYER_CUSTOMEXITSOUND, 0, 0 },
618
                           { "weaprecs[16]", PLAYER_WEAPRECS, 0, 0 },
619
                           { "weapreccnt", PLAYER_WEAPRECCNT, 0, 0 },
620
                           { "interface_toggle_flag", PLAYER_INTERFACE_TOGGLE_FLAG, 0, 0 },
621
                           { "rotscrnang", PLAYER_ROTSCRNANG, 0, 0 },
622
                           { "dead_flag", PLAYER_DEAD_FLAG, 0, 0 },
623
                           { "show_empty_weapon", PLAYER_SHOW_EMPTY_WEAPON, 0, 0 },
624
                           { "scuba_amount", PLAYER_SCUBA_AMOUNT, 0, 0 },
625
                           { "jetpack_amount", PLAYER_JETPACK_AMOUNT, 0, 0 },
626
                           { "steroids_amount", PLAYER_STEROIDS_AMOUNT, 0, 0 },
627
                           { "shield_amount", PLAYER_SHIELD_AMOUNT, 0, 0 },
628
                           { "holoduke_on", PLAYER_HOLODUKE_ON, 0, 0 },
629
                           { "pycount", PLAYER_PYCOUNT, 0, 0 },
630
                           { "weapon_pos", PLAYER_WEAPON_POS, 0, 0 },
631
                           { "frag_ps", PLAYER_FRAG_PS, 0, 0 },
632
                           { "transporter_hold", PLAYER_TRANSPORTER_HOLD, 0, 0 },
633
                           { "last_full_weapon", PLAYER_LAST_FULL_WEAPON, 0, 0 },
634
                           { "footprintshade", PLAYER_FOOTPRINTSHADE, 0, 0 },
635
                           { "boot_amount", PLAYER_BOOT_AMOUNT, 0, 0 },
636
                           { "scream_voice", PLAYER_SCREAM_VOICE, 0, 0 },
637
                           { "gm", PLAYER_GM, 0, 0 },
638
                           { "on_warping_sector", PLAYER_ON_WARPING_SECTOR, 0, 0 },
639
                           { "footprintcount", PLAYER_FOOTPRINTCOUNT, 0, 0 },
640
                           { "hbomb_on", PLAYER_HBOMB_ON, 0, 0 },
641
                           { "jumping_toggle", PLAYER_JUMPING_TOGGLE, 0, 0 },
642
                           { "rapid_fire_hold", PLAYER_RAPID_FIRE_HOLD, 0, 0 },
643
                           { "on_ground", PLAYER_ON_GROUND, 0, 0 },
644
                           { "name", PLAYER_NAME,  LABEL_ISSTRING, 32 },
645
                           { "inven_icon", PLAYER_INVEN_ICON, 0, 0 },
646
                           { "buttonpalette", PLAYER_BUTTONPALETTE, 0, 0 },
647
                           { "jetpack_on", PLAYER_JETPACK_ON, 0, 0 },
648
                           { "spritebridge", PLAYER_SPRITEBRIDGE, 0, 0 },
649
                           { "lastrandomspot", PLAYER_LASTRANDOMSPOT, 0, 0 },
650
                           { "scuba_on", PLAYER_SCUBA_ON, 0, 0 },
651
                           { "footprintpal", PLAYER_FOOTPRINTPAL, 0, 0 },
652
                           { "heat_on", PLAYER_HEAT_ON, 0, 0 },
653
                           { "holster_weapon", PLAYER_HOLSTER_WEAPON, 0, 0 },
654
                           { "falling_counter", PLAYER_FALLING_COUNTER, 0, 0 },
655
                           { "gotweapon", PLAYER_GOTWEAPON, LABEL_HASPARM2, MAX_WEAPONS },
656
                           { "refresh_inventory", PLAYER_REFRESH_INVENTORY, 0, 0 },
657
                           { "palette", PLAYER_PALETTE, 0, 0 },
658
                           { "toggle_key_flag", PLAYER_TOGGLE_KEY_FLAG, 0, 0 },
659
                           { "knuckle_incs", PLAYER_KNUCKLE_INCS, 0, 0 },
660
                           { "walking_snd_toggle", PLAYER_WALKING_SND_TOGGLE, 0, 0 },
661
                           { "palookup", PLAYER_PALOOKUP, 0, 0 },
662
                           { "hard_landing", PLAYER_HARD_LANDING, 0, 0 },
663
                           { "max_+_rooms", PLAYER_MAX_SECRET_ROOMS, 0, 0 },
664
                           { "secret_rooms", PLAYER_SECRET_ROOMS, 0, 0 },
665
                           { "pals", PLAYER_PALS, LABEL_HASPARM2, 2 },
666
                           { "max_actors_killed", PLAYER_MAX_ACTORS_KILLED, 0, 0 },
667
                           { "actors_killed", PLAYER_ACTORS_KILLED, 0, 0 },
668
                           { "return_to_center", PLAYER_RETURN_TO_CENTER, 0, 0 },
669
                           { "runspeed", PLAYER_RUNSPEED, 0, 0 },
670
                           { "sbs", PLAYER_SBS, 0, 0 },
671
                           { "reloading", PLAYER_RELOADING, 0, 0 },
672
                           { "auto_aim", PLAYER_AUTO_AIM, 0, 0 },
172 terminx 673
                           { "movement_lock", PLAYER_MOVEMENT_LOCK, 0, 0 },
5 Plagman 674
                           { "sound_pitch", PLAYER_SOUND_PITCH, 0, 0 },
675
                           { "weaponswitch", PLAYER_WEAPONSWITCH, 0, 0 },
268 terminx 676
                           { "team", PLAYER_TEAM, 0, 0 },
5 Plagman 677
                           { "", -1, 0, 0  }     // END OF LIST
678
                       };
679
 
680
LABELS projectilelabels[]= {
681
                               { "workslike", PROJ_WORKSLIKE, 0, 0 },
682
                               { "spawns", PROJ_SPAWNS, 0, 0 },
683
                               { "sxrepeat", PROJ_SXREPEAT, 0, 0 },
684
                               { "syrepeat", PROJ_SYREPEAT, 0, 0 },
685
                               { "sound", PROJ_SOUND, 0, 0 },
686
                               { "isound", PROJ_ISOUND, 0, 0 },
687
                               { "vel", PROJ_VEL, 0, 0 },
688
                               { "extra", PROJ_EXTRA, 0, 0 },
689
                               { "decal", PROJ_DECAL, 0, 0 },
690
                               { "trail", PROJ_TRAIL, 0, 0 },
691
                               { "txrepeat", PROJ_TXREPEAT, 0, 0 },
692
                               { "tyrepeat", PROJ_TYREPEAT, 0, 0 },
693
                               { "toffset", PROJ_TOFFSET, 0, 0 },
694
                               { "tnum", PROJ_TNUM, 0, 0 },
695
                               { "drop", PROJ_DROP, 0, 0 },
696
                               { "cstat", PROJ_CSTAT, 0, 0 },
697
                               { "clipdist", PROJ_CLIPDIST, 0, 0 },
698
                               { "shade", PROJ_SHADE, 0, 0 },
699
                               { "xrepeat", PROJ_XREPEAT, 0, 0 },
700
                               { "yrepeat", PROJ_YREPEAT, 0, 0 },
701
                               { "pal", PROJ_PAL, 0, 0 },
702
                               { "extra_rand", PROJ_EXTRA_RAND, 0, 0 },
703
                               { "hitradius", PROJ_HITRADIUS, 0, 0 },
704
                               { "velmult", PROJ_VEL_MULT, 0, 0 },
705
                               { "offset", PROJ_OFFSET, 0, 0 },
706
                               { "bounces", PROJ_BOUNCES, 0, 0 },
707
                               { "bsound", PROJ_BSOUND, 0, 0 },
708
                               { "range", PROJ_RANGE, 0, 0 },
709
                               { "", -1, 0, 0  }     // END OF LIST
710
                           };
711
 
712
LABELS userdefslabels[]= {
713
                             //        { "<null>", 1, 0, 0 },
714
                             { "god", USERDEFS_GOD, 0, 0 },
715
                             { "warp_on", USERDEFS_WARP_ON, 0, 0 },
716
                             { "cashman", USERDEFS_CASHMAN, 0, 0 },
717
                             { "eog", USERDEFS_EOG, 0, 0 },
718
                             { "showallmap", USERDEFS_SHOWALLMAP, 0, 0 },
719
                             { "show_help", USERDEFS_SHOW_HELP, 0, 0 },
720
                             { "scrollmode", USERDEFS_SCROLLMODE, 0, 0 },
721
                             { "clipping", USERDEFS_CLIPPING, 0, 0 },
722
                             { "user_name", USERDEFS_USER_NAME, LABEL_HASPARM2, MAXPLAYERS },
723
                             { "ridecule", USERDEFS_RIDECULE, LABEL_HASPARM2 | LABEL_ISSTRING, 10 },
724
                             { "savegame", USERDEFS_SAVEGAME, LABEL_HASPARM2 | LABEL_ISSTRING, 10 },
725
                             { "pwlockout", USERDEFS_PWLOCKOUT, LABEL_ISSTRING, 128 },
726
                             { "rtsname;", USERDEFS_RTSNAME,  LABEL_ISSTRING, 128 },
727
                             { "overhead_on", USERDEFS_OVERHEAD_ON, 0, 0 },
728
                             { "last_overhead", USERDEFS_LAST_OVERHEAD, 0, 0 },
729
                             { "showweapons", USERDEFS_SHOWWEAPONS, 0, 0 },
730
 
731
                             { "pause_on", USERDEFS_PAUSE_ON, 0, 0 },
732
                             { "from_bonus", USERDEFS_FROM_BONUS, 0, 0 },
733
                             { "camerasprite", USERDEFS_CAMERASPRITE, 0, 0 },
734
                             { "last_camsprite", USERDEFS_LAST_CAMSPRITE, 0, 0 },
735
                             { "last_level", USERDEFS_LAST_LEVEL, 0, 0 },
736
                             { "secretlevel", USERDEFS_SECRETLEVEL, 0, 0 },
737
 
738
                             { "const_visibility", USERDEFS_CONST_VISIBILITY, 0, 0 },
739
                             { "uw_framerate", USERDEFS_UW_FRAMERATE, 0, 0 },
740
                             { "camera_time", USERDEFS_CAMERA_TIME, 0, 0 },
741
                             { "folfvel", USERDEFS_FOLFVEL, 0, 0 },
742
                             { "folavel", USERDEFS_FOLAVEL, 0, 0 },
743
                             { "folx", USERDEFS_FOLX, 0, 0 },
744
                             { "foly", USERDEFS_FOLY, 0, 0 },
745
                             { "fola", USERDEFS_FOLA, 0, 0 },
746
                             { "reccnt", USERDEFS_RECCNT, 0, 0 },
747
 
748
                             { "entered_name", USERDEFS_ENTERED_NAME, 0, 0 },
749
                             { "screen_tilting", USERDEFS_SCREEN_TILTING, 0, 0 },
750
                             { "shadows", USERDEFS_SHADOWS, 0, 0 },
751
                             { "fta_on", USERDEFS_FTA_ON, 0, 0 },
752
                             { "executions", USERDEFS_EXECUTIONS, 0, 0 },
753
                             { "auto_run", USERDEFS_AUTO_RUN, 0, 0 },
754
                             { "coords", USERDEFS_COORDS, 0, 0 },
755
                             { "tickrate", USERDEFS_TICKRATE, 0, 0 },
756
                             { "m_coop", USERDEFS_M_COOP, 0, 0 },
757
                             { "coop", USERDEFS_COOP, 0, 0 },
758
                             { "screen_size", USERDEFS_SCREEN_SIZE, 0, 0 },
759
                             { "lockout", USERDEFS_LOCKOUT, 0, 0 },
760
                             { "crosshair", USERDEFS_CROSSHAIR, 0, 0 },
761
                             { "wchoice[MAXPLAYERS][MAX_WEAPONS]", USERDEFS_WCHOICE, 0, 0 },
762
                             { "playerai", USERDEFS_PLAYERAI, 0, 0 },
763
                             { "respawn_monsters", USERDEFS_RESPAWN_MONSTERS, 0, 0 },
764
                             { "respawn_items", USERDEFS_RESPAWN_ITEMS, 0, 0 },
765
                             { "respawn_inventory", USERDEFS_RESPAWN_INVENTORY, 0, 0 },
766
                             { "recstat", USERDEFS_RECSTAT, 0, 0 },
767
                             { "monsters_off", USERDEFS_MONSTERS_OFF, 0, 0 },
768
                             { "brightness", USERDEFS_BRIGHTNESS, 0, 0 },
769
                             { "m_respawn_items", USERDEFS_M_RESPAWN_ITEMS, 0, 0 },
770
                             { "m_respawn_monsters", USERDEFS_M_RESPAWN_MONSTERS, 0, 0 },
771
                             { "m_respawn_inventory", USERDEFS_M_RESPAWN_INVENTORY, 0, 0 },
772
                             { "m_recstat", USERDEFS_M_RECSTAT, 0, 0 },
773
                             { "m_monsters_off", USERDEFS_M_MONSTERS_OFF, 0, 0 },
774
                             { "detail", USERDEFS_DETAIL, 0, 0 },
775
                             { "m_ffire", USERDEFS_M_FFIRE, 0, 0 },
776
                             { "ffire", USERDEFS_FFIRE, 0, 0 },
777
                             { "m_player_skill", USERDEFS_M_PLAYER_SKILL, 0, 0 },
778
                             { "m_level_number", USERDEFS_M_LEVEL_NUMBER, 0, 0 },
779
                             { "m_volume_number", USERDEFS_M_VOLUME_NUMBER, 0, 0 },
780
                             { "multimode", USERDEFS_MULTIMODE, 0, 0 },
781
                             { "player_skill", USERDEFS_PLAYER_SKILL, 0, 0 },
782
                             { "level_number", USERDEFS_LEVEL_NUMBER, 0, 0 },
783
                             { "volume_number", USERDEFS_VOLUME_NUMBER, 0, 0 },
784
                             { "m_marker", USERDEFS_M_MARKER, 0, 0 },
785
                             { "marker", USERDEFS_MARKER, 0, 0 },
786
                             { "mouseflip", USERDEFS_MOUSEFLIP, 0, 0 },
787
                             { "statusbarscale", USERDEFS_STATUSBARSCALE, 0, 0 },
788
                             { "drawweapon", USERDEFS_DRAWWEAPON, 0, 0 },
789
                             { "mouseaiming", USERDEFS_MOUSEAIMING, 0, 0 },
790
                             { "weaponswitch", USERDEFS_WEAPONSWITCH, 0, 0 },
38 terminx 791
                             { "democams", USERDEFS_DEMOCAMS, 0, 0 },
53 terminx 792
                             { "color", USERDEFS_COLOR, 0, 0 },
89 terminx 793
                             { "msgdisptime", USERDEFS_MSGDISPTIME, 0, 0 },
128 terminx 794
                             { "statusbarmode", USERDEFS_STATUSBARMODE, 0, 0 },
147 terminx 795
                             { "m_noexits", USERDEFS_M_NOEXITS, 0, 0 },
796
                             { "noexits", USERDEFS_NOEXITS, 0, 0 },
148 terminx 797
                             { "autovote", USERDEFS_AUTOVOTE, 0, 0 },
150 terminx 798
                             { "automsg", USERDEFS_AUTOMSG, 0, 0 },
152 terminx 799
                             { "idplayers", USERDEFS_IDPLAYERS, 0, 0 },
268 terminx 800
                             { "team", USERDEFS_TEAM, 0, 0 },
296 terminx 801
                             { "myx", USERDEFS_MYX, 0, 0 },
802
                             { "omyx", USERDEFS_OMYX, 0, 0 },
803
                             { "myxvel", USERDEFS_MYXVEL, 0, 0 },
804
                             { "myy", USERDEFS_MYY, 0, 0 },
805
                             { "omyy", USERDEFS_OMYY, 0, 0 },
806
                             { "myyvel", USERDEFS_MYYVEL, 0, 0 },
807
                             { "myz", USERDEFS_MYZ, 0, 0 },
808
                             { "omyz", USERDEFS_OMYZ, 0, 0 },
809
                             { "myzvel", USERDEFS_MYZVEL, 0, 0 },
810
                             { "myhoriz", USERDEFS_MYHORIZ, 0, 0 },
811
                             { "omyhoriz", USERDEFS_OMYHORIZ, 0, 0 },
812
                             { "myhorizoff", USERDEFS_MYHORIZOFF, 0, 0 },
813
                             { "omyhorizoff", USERDEFS_OMYHORIZOFF, 0, 0 },
814
                             { "myang", USERDEFS_MYANG, 0, 0 },
815
                             { "omyang", USERDEFS_OMYANG, 0, 0 },
816
                             { "mycursectnum", USERDEFS_MYCURSECTNUM, 0, 0 },
817
                             { "myjumpingcounter", USERDEFS_MYJUMPINGCOUNTER, 0, 0 },
818
                             { "myjumpingtoggle", USERDEFS_MYJUMPINGTOGGLE, 0, 0 },
819
                             { "myonground", USERDEFS_MYONGROUND, 0, 0 },
820
                             { "myhardlanding", USERDEFS_MYHARDLANDING, 0, 0 },
821
                             { "myreturntocenter", USERDEFS_MYRETURNTOCENTER, 0, 0 },
5 Plagman 822
                             { "", -1, 0, 0  }     // END OF LIST
823
                         };
824
 
825
LABELS inputlabels[]= {
29 terminx 826
                          { "avel", INPUT_AVEL, 0, 0 },
827
                          { "horz", INPUT_HORZ, 0, 0 },
828
                          { "fvel", INPUT_FVEL, 0, 0 },
829
                          { "svel", INPUT_SVEL, 0, 0 },
830
                          { "bits", INPUT_BITS, 0, 0 },
275 terminx 831
                          { "extbits", INPUT_EXTBITS, 0, 0 },
29 terminx 832
                          { "", -1, 0, 0  }     // END OF LIST
833
                      };
5 Plagman 834
 
398 terminx 835
static void skipcomments(void)
5 Plagman 836
{
837
    char c;
838
    while ((c = *textptr))
839
    {
840
        if (c == ' ' || c == '\t' || c == '\r')
841
            textptr++;
335 terminx 842
        else if (c == '\n')
843
        {
5 Plagman 844
            line_number++;
845
            textptr++;
846
        }
847
        else if (c == '/' && textptr[1] == '/')
848
        {
849
            if (!(error || warning) && condebug > 1)
850
                initprintf("%s:%ld: debug: got comment.\n",compilefile,line_number);
333 terminx 851
            while (*textptr != 0x0a && *textptr != 0x0d && *textptr != 0)
5 Plagman 852
                textptr++;
853
        }
854
        else if (c == '/' && textptr[1] == '*')
855
        {
856
            if (!(error || warning) && condebug > 1)
857
                initprintf("%s:%ld: debug: got start of comment block.\n",compilefile,line_number);
858
            while (*textptr && !(textptr[0] == '*' && textptr[1] == '/'))
859
            {
860
                if (*textptr == '\n')
861
                    line_number++;
862
                textptr++;
863
            }
864
            if ((!(error || warning) && condebug > 1) && (textptr[0] == '*' && textptr[1] == '/'))
865
                initprintf("%s:%ld: debug: got end of comment block.\n",compilefile,line_number);
866
            if (!*textptr)
867
            {
331 terminx 868
                if (!(error || warning) && condebug)
5 Plagman 869
                    initprintf("%s:%ld: debug: EOF in comment!\n",compilefile,line_number);
870
                ReportError(-1);
871
                initprintf("%s:%ld: error: found `/*' with no `*/'.\n",compilefile,line_number);
872
                parsing_state = num_braces = 0;
873
                parsing_actor = 0;
874
                error++;
875
                break;
876
            }
877
            else textptr+=2;
878
        }
879
        else break;
880
    }
881
}
882
 
398 terminx 883
static void DefineProjectile(long lVar1, long lLabelID, long lVar2)
5 Plagman 884
{
331 terminx 885
    switch (lLabelID)
5 Plagman 886
    {
337 terminx 887
    case PROJ_WORKSLIKE:
888
        projectile[lVar1].workslike=lVar2;
889
        break;
5 Plagman 890
 
337 terminx 891
    case PROJ_SPAWNS:
892
        projectile[lVar1].spawns=lVar2;
893
        break;
5 Plagman 894
 
337 terminx 895
    case PROJ_SXREPEAT:
896
        projectile[lVar1].sxrepeat=lVar2;
897
        break;
5 Plagman 898
 
337 terminx 899
    case PROJ_SYREPEAT:
900
        projectile[lVar1].syrepeat=lVar2;
901
        break;
5 Plagman 902
 
337 terminx 903
    case PROJ_SOUND:
904
        projectile[lVar1].sound=lVar2;
905
        break;
5 Plagman 906
 
337 terminx 907
    case PROJ_ISOUND:
908
        projectile[lVar1].isound=lVar2;
909
        break;
5 Plagman 910
 
337 terminx 911
    case PROJ_VEL:
912
        projectile[lVar1].vel=lVar2;
913
        break;
5 Plagman 914
 
337 terminx 915
    case PROJ_EXTRA:
916
        projectile[lVar1].extra=lVar2;
917
        break;
5 Plagman 918
 
337 terminx 919
    case PROJ_DECAL:
920
        projectile[lVar1].decal=lVar2;
921
        break;
5 Plagman 922
 
337 terminx 923
    case PROJ_TRAIL:
924
        projectile[lVar1].trail=lVar2;
925
        break;
5 Plagman 926
 
337 terminx 927
    case PROJ_TXREPEAT:
928
        projectile[lVar1].txrepeat=lVar2;
929
        break;
5 Plagman 930
 
337 terminx 931
    case PROJ_TYREPEAT:
932
        projectile[lVar1].tyrepeat=lVar2;
933
        break;
5 Plagman 934
 
337 terminx 935
    case PROJ_TOFFSET:
936
        projectile[lVar1].toffset=lVar2;
937
        break;
5 Plagman 938
 
337 terminx 939
    case PROJ_TNUM:
940
        projectile[lVar1].tnum=lVar2;
941
        break;
5 Plagman 942
 
337 terminx 943
    case PROJ_DROP:
944
        projectile[lVar1].drop=lVar2;
945
        break;
5 Plagman 946
 
337 terminx 947
    case PROJ_CSTAT:
948
        projectile[lVar1].cstat=lVar2;
949
        break;
5 Plagman 950
 
337 terminx 951
    case PROJ_CLIPDIST:
952
        projectile[lVar1].clipdist=lVar2;
953
        break;
5 Plagman 954
 
337 terminx 955
    case PROJ_SHADE:
956
        projectile[lVar1].shade=lVar2;
957
        break;
5 Plagman 958
 
337 terminx 959
    case PROJ_XREPEAT:
960
        projectile[lVar1].xrepeat=lVar2;
961
        break;
5 Plagman 962
 
337 terminx 963
    case PROJ_YREPEAT:
964
        projectile[lVar1].yrepeat=lVar2;
965
        break;
5 Plagman 966
 
337 terminx 967
    case PROJ_PAL:
968
        projectile[lVar1].pal=lVar2;
969
        break;
5 Plagman 970
 
337 terminx 971
    case PROJ_EXTRA_RAND:
972
        projectile[lVar1].extra_rand=lVar2;
973
        break;
5 Plagman 974
 
337 terminx 975
    case PROJ_HITRADIUS:
976
        projectile[lVar1].hitradius=lVar2;
977
        break;
5 Plagman 978
 
337 terminx 979
    case PROJ_VEL_MULT:
980
        projectile[lVar1].velmult=lVar2;
981
        break;
5 Plagman 982
 
337 terminx 983
    case PROJ_OFFSET:
984
        projectile[lVar1].offset=lVar2;
985
        break;
5 Plagman 986
 
337 terminx 987
    case PROJ_BOUNCES:
988
        projectile[lVar1].bounces=lVar2;
989
        break;
5 Plagman 990
 
337 terminx 991
    case PROJ_BSOUND:
992
        projectile[lVar1].bsound=lVar2;
993
        break;
5 Plagman 994
 
337 terminx 995
    case PROJ_RANGE:
996
        projectile[lVar1].range=lVar2;
997
        break;
5 Plagman 998
 
337 terminx 999
    default:
1000
        break;
5 Plagman 1001
    }
1002
 
1003
    //  defaultprojectile[lVar1] = projectile[lVar1];
1004
    Bmemcpy(&defaultprojectile[lVar1], &projectile[lVar1], sizeof(projectile[lVar1]));
1005
 
1006
    return;
1007
}
1008
 
1009
char CheckEventSync(int iEventID)
1010
{
331 terminx 1011
    if (parsing_event || parsing_actor)
5 Plagman 1012
    {
331 terminx 1013
        switch (iEventID)
5 Plagman 1014
        {
337 terminx 1015
        case EVENT_CHEATGETSTEROIDS:
1016
        case EVENT_CHEATGETHEAT:
1017
        case EVENT_CHEATGETBOOT:
1018
        case EVENT_CHEATGETSHIELD:
1019
        case EVENT_CHEATGETSCUBA:
1020
        case EVENT_CHEATGETHOLODUKE:
1021
        case EVENT_CHEATGETJETPACK:
1022
        case EVENT_CHEATGETFIRSTAID:
1023
        case EVENT_DISPLAYWEAPON:
1024
        case EVENT_DRAWWEAPON:
1025
        case EVENT_DISPLAYCROSSHAIR:
1026
        case EVENT_DISPLAYREST:
1027
        case EVENT_ENTERLEVEL:
1028
        case EVENT_FAKEDOMOVETHINGS:
1029
        case EVENT_GETLOADTILE:
1030
        case EVENT_GETMENUTILE:
1031
        case EVENT_INIT:
1032
        case EVENT_LOGO:
1033
            return 0;
1034
        default:
1035
            return 1;
5 Plagman 1036
        }
1037
    }
1038
    return 1;
1039
}
1040
 
1041
void AddLog(char *psz)
1042
{
1043
    Bstrcpy(tempbuf,psz);
331 terminx 1044
    if (tempbuf[Bstrlen(psz)] != '\n')
5 Plagman 1045
        Bstrcat(tempbuf,"\n");
1046
    if (qsetmode == 200) OSD_Printf(tempbuf);
1047
    else initprintf(tempbuf);
1048
}
1049
 
398 terminx 1050
static long GetDefID(char *szGameLabel)
5 Plagman 1051
{
1052
    int i;
331 terminx 1053
    for (i=0;i<iGameVarCount;i++)
5 Plagman 1054
    {
331 terminx 1055
        if (aGameVars[i].szLabel != NULL)
5 Plagman 1056
        {
333 terminx 1057
            if (Bstrcmp(szGameLabel, aGameVars[i].szLabel) == 0)
102 terminx 1058
            {
1059
                return i;
1060
            }
5 Plagman 1061
        }
1062
    }
1063
    return -1;
1064
}
1065
 
398 terminx 1066
static char ispecial(char c)
5 Plagman 1067
{
331 terminx 1068
    if (c == 0x0a)
5 Plagman 1069
    {
1070
        line_number++;
1071
        return 1;
1072
    }
1073
 
331 terminx 1074
    if (c == ' ' || c == 0x0d)
5 Plagman 1075
        return 1;
1076
 
1077
    return 0;
1078
}
1079
 
398 terminx 1080
static inline int isaltok(char c)
5 Plagman 1081
{
333 terminx 1082
    return (isalnum(c) || c == '{' || c == '}' || c == '/' || c == '*' || c == '-' || c == '_' || c == '.');
5 Plagman 1083
}
1084
 
398 terminx 1085
static long getlabelid(LABELS *pLabel, char *psz)
5 Plagman 1086
{
1087
    // find the label psz in the table pLabel.
1088
    // returns the ID for the label, or -1
1089
 
1090
    long l=-1;
1091
    int i;
1092
 
331 terminx 1093
    for (i=0;pLabel[i].lId >=0 ; i++)
5 Plagman 1094
    {
331 terminx 1095
        if (!Bstrcasecmp(pLabel[i].name,psz))
5 Plagman 1096
        {
1097
            l= pLabel[i].lId;
1098
            break;  // stop for loop
1099
        }
1100
    }
1101
    return l;
1102
}
1103
 
398 terminx 1104
static long getlabeloffset(LABELS *pLabel, char *psz)
5 Plagman 1105
{
1106
    // find the label psz in the table pLabel.
1107
    // returns the offset in the array for the label, or -1
1108
    int i;
1109
 
331 terminx 1110
    for (i=0;pLabel[i].lId >=0 ; i++)
5 Plagman 1111
    {
331 terminx 1112
        if (!Bstrcasecmp(pLabel[i].name,psz))
5 Plagman 1113
        {
1114
            //    printf("Label has flags of %02X\n",pLabel[i].flags);
1115
            return i;
1116
        }
1117
    }
1118
    return -1;
1119
}
1120
 
398 terminx 1121
static void getlabel(void)
5 Plagman 1122
{
1123
    long i;
1124
 
1125
    skipcomments();
1126
 
333 terminx 1127
    while (isalnum(*textptr) == 0)
5 Plagman 1128
    {
331 terminx 1129
        if (*textptr == 0x0a) line_number++;
5 Plagman 1130
        textptr++;
333 terminx 1131
        if (*textptr == 0)
5 Plagman 1132
            return;
1133
    }
1134
 
1135
    i = 0;
333 terminx 1136
    while (ispecial(*textptr) == 0 && *textptr!=']' && *textptr!='\t' && *textptr!='\n' && *textptr!='\r')
5 Plagman 1137
        label[(labelcnt<<6)+i++] = *(textptr++);
1138
 
1139
    label[(labelcnt<<6)+i] = 0;
1140
    if (!(error || warning) && condebug > 1)
1141
        initprintf("%s:%ld: debug: got label `%s'.\n",compilefile,line_number,label+(labelcnt<<6));
1142
}
1143
 
398 terminx 1144
static long keyword(void)
5 Plagman 1145
{
1146
    long i;
1147
    char *temptextptr;
1148
 
1149
    skipcomments();
1150
 
1151
    temptextptr = textptr;
1152
 
333 terminx 1153
    while (isaltok(*temptextptr) == 0)
5 Plagman 1154
    {
1155
        temptextptr++;
333 terminx 1156
        if (*temptextptr == 0)
5 Plagman 1157
            return 0;
1158
    }
1159
 
1160
    i = 0;
333 terminx 1161
    while (isaltok(*temptextptr))
5 Plagman 1162
    {
1163
        tempbuf[i] = *(temptextptr++);
1164
        i++;
1165
    }
1166
    tempbuf[i] = 0;
331 terminx 1167
    for (i=0;i<NUMKEYWORDS;i++)
333 terminx 1168
        if (Bstrcmp(tempbuf,keyw[i]) == 0)
5 Plagman 1169
            return i;
1170
 
1171
    return -1;
1172
}
1173
 
398 terminx 1174
static long transword(void) //Returns its code #
5 Plagman 1175
{
1176
    long i, l;
1177
 
1178
    skipcomments();
1179
 
333 terminx 1180
    while (isaltok(*textptr) == 0)
5 Plagman 1181
    {
331 terminx 1182
        if (*textptr == 0x0a) line_number++;
333 terminx 1183
        if (*textptr == 0)
5 Plagman 1184
            return -1;
1185
        textptr++;
1186
    }
1187
 
1188
    l = 0;
333 terminx 1189
    while (isaltok(*(textptr+l)) && !(*(textptr + l) == '.'))
5 Plagman 1190
    {
1191
        tempbuf[l] = textptr[l];
1192
        l++;
1193
    }
333 terminx 1194
    while (isaltok(*(textptr+l)))
5 Plagman 1195
    {
1196
        tempbuf[l] = textptr[l];
1197
        l++;
1198
    }
1199
    tempbuf[l] = 0;
1200
 
331 terminx 1201
    for (i=0;i<NUMKEYWORDS;i++)
5 Plagman 1202
    {
333 terminx 1203
        if (Bstrcmp(tempbuf,keyw[i]) == 0)
5 Plagman 1204
        {
1205
            *scriptptr = i;
1206
            textptr += l;
1207
            scriptptr++;
1208
            if (!(error || warning) && condebug)
1209
                initprintf("%s:%ld: debug: translating keyword `%s'.\n",compilefile,line_number,keyw[i]);
1210
            return i;
1211
        }
1212
    }
1213
 
1214
    textptr += l;
1215
 
333 terminx 1216
    if (tempbuf[0] == '{' && tempbuf[1] != 0)
5 Plagman 1217
    {
1218
        ReportError(-1);
1219
        initprintf("%s:%ld: error: expected a SPACE or CR between `{' and `%s'.\n",compilefile,line_number,tempbuf+1);
1220
    }
333 terminx 1221
    else if (tempbuf[0] == '}' && tempbuf[1] != 0)
5 Plagman 1222
    {
1223
        ReportError(-1);
1224
        initprintf("%s:%ld: error: expected a SPACE or CR between `}' and `%s'.\n",compilefile,line_number,tempbuf+1);
1225
    }
1226
    else ReportError(ERROR_EXPECTEDKEYWORD);
1227
    error++;
1228
    return -1;
1229
}
1230
 
398 terminx 1231
static void transvartype(int type)
5 Plagman 1232
{
91 terminx 1233
    int i=0,f=0;
5 Plagman 1234
 
1235
    skipcomments();
331 terminx 1236
    if (!type && !labelsonly && (isdigit(*textptr) || ((*textptr == '-') && (isdigit(*(textptr+1))))))
5 Plagman 1237
    {
1238
        if (!(error || warning) && condebug)
1239
            initprintf("%s:%ld: debug: accepted constant %ld in place of gamevar.\n",compilefile,line_number,atol(textptr));
1240
        *scriptptr++=MAXGAMEVARS;
1241
        *scriptptr++=atol(textptr);
1242
        getlabel();
1243
        return;
1244
    }
331 terminx 1245
    else if ((*textptr == '-') && !isdigit(*(textptr+1)))
5 Plagman 1246
    {
331 terminx 1247
        if (!type)
5 Plagman 1248
        {
1249
            if (!(error || warning) && condebug)
1250
                initprintf("%s:%ld: debug: flagging gamevar as negative.\n",compilefile,line_number,atol(textptr));
1251
            f = (MAXGAMEVARS<<1);
1252
        }
1253
        else
1254
        {
1255
            error++;
1256
            ReportError(ERROR_SYNTAXERROR);
1257
            getlabel();
1258
            return;
1259
        }
1260
    }
1261
    getlabel();
331 terminx 1262
    if (!nokeywordcheck)
1263
        for (i=0;i<NUMKEYWORDS;i++)
333 terminx 1264
            if (Bstrcmp(label+(labelcnt<<6),keyw[i]) == 0)
5 Plagman 1265
            {
1266
                error++;
1267
                ReportError(ERROR_ISAKEYWORD);
1268
                return;
1269
            }
1270
    i=GetDefID(label+(labelcnt<<6));
331 terminx 1271
    if (i<0)
5 Plagman 1272
    {
331 terminx 1273
        if (!type && !labelsonly)
5 Plagman 1274
        {
1275
            Bstrcpy(tempbuf,label+(labelcnt<<6));
331 terminx 1276
            for (i=0;i<labelcnt;i++)
5 Plagman 1277
            {
333 terminx 1278
                if (Bstrcmp(tempbuf,label+(i<<6)) == 0 && (labeltype[i] & LABEL_DEFINE))
5 Plagman 1279
                {
1280
                    if (!(error || warning) && condebug)
1281
                        initprintf("%s:%ld: debug: accepted defined label `%s' instead of gamevar.\n",compilefile,line_number,label+(i<<6));
1282
                    *scriptptr++=MAXGAMEVARS;
1283
                    *scriptptr++=labelcode[i];
1284
                    textptr++;
1285
                    return;
1286
                }
1287
            }
1288
            error++;
1289
            ReportError(ERROR_NOTAGAMEVAR);
1290
            textptr++;
1291
            return;
1292
        }
1293
        else
1294
        {
1295
            error++;
1296
            ReportError(ERROR_NOTAGAMEVAR);
1297
            textptr++;
1298
            return;
1299
        }
1300
    }
331 terminx 1301
    if (type == GAMEVAR_FLAG_READONLY && aGameVars[i].dwFlags & GAMEVAR_FLAG_READONLY)
5 Plagman 1302
    {
1303
        error++;
1304
        ReportError(ERROR_VARREADONLY);
1305
        return;
1306
    }
331 terminx 1307
    else if (aGameVars[i].dwFlags & type)
5 Plagman 1308
    {
1309
        error++;
1310
        ReportError(ERROR_VARTYPEMISMATCH);
1311
        return;
1312
    }
331 terminx 1313
    if ((aGameVars[i].dwFlags & GAMEVAR_FLAG_SYNCCHECK) && parsing_actor && CheckEventSync(current_event))
5 Plagman 1314
    {
1315
        ReportError(-1);
1316
        initprintf("%s:%ld: warning: found local gamevar `%s' used within %s.\n",compilefile,line_number,label+(labelcnt<<6),parsing_event?"a synced event":"an actor");
1317
    }
1318
    if (!(error || warning) && condebug > 1)
1319
        initprintf("%s:%ld: debug: accepted gamevar `%s'.\n",compilefile,line_number,label+(labelcnt<<6));
1320
    i |= f;
1321
    *scriptptr++=i;
1322
}
1323
 
296 terminx 1324
static inline void transvar(void)
5 Plagman 1325
{
1326
    transvartype(0);
1327
}
1328
 
296 terminx 1329
static inline void transmultvarstype(int type, char num)
5 Plagman 1330
{
1331
    char i;
331 terminx 1332
    for (i=0;i<num;i++)
5 Plagman 1333
        transvartype(type);
1334
}
1335
 
296 terminx 1336
static inline void transmultvars(char num)
5 Plagman 1337
{
1338
    transmultvarstype(0,num);
1339
}
1340
 
398 terminx 1341
static long transnum(long type)
5 Plagman 1342
{
1343
    long i, l;
1344
 
1345
    skipcomments();
1346
 
333 terminx 1347
    while (isaltok(*textptr) == 0)
5 Plagman 1348
    {
331 terminx 1349
        if (*textptr == 0x0a) line_number++;
5 Plagman 1350
        textptr++;
333 terminx 1351
        if (*textptr == 0)
5 Plagman 1352
            return -1; // eof
1353
    }
1354
 
1355
    l = 0;
333 terminx 1356
    while (isaltok(*(textptr+l)))
5 Plagman 1357
    {
1358
        tempbuf[l] = textptr[l];
1359
        l++;
1360
    }
1361
    tempbuf[l] = 0;
1362
 
331 terminx 1363
    if (!nokeywordcheck)
1364
        for (i=0;i<NUMKEYWORDS;i++)
333 terminx 1365
            if (Bstrcmp(label+(labelcnt<<6),keyw[i]) == 0)
5 Plagman 1366
            {
1367
                error++;
1368
                ReportError(ERROR_ISAKEYWORD);
1369
                textptr+=l;
1370
            }
121 terminx 1371
 
331 terminx 1372
    for (i=0;i<labelcnt;i++)
5 Plagman 1373
    {
333 terminx 1374
        if (!Bstrcmp(tempbuf,label+(i<<6)))
5 Plagman 1375
        {
1376
            char *el,*gl;
1377
 
1378
            if (labeltype[i] & type)
1379
            {
1380
                if (!(error || warning) && condebug > 1)
1381
                {
1382
                    gl = translatelabeltype(labeltype[i]);
1383
                    initprintf("%s:%ld: debug: accepted %s label `%s'.\n",compilefile,line_number,gl,label+(i<<6));
1384
                    Bfree(gl);
1385
                }
1386
                *(scriptptr++) = labelcode[i];
1387
                textptr += l;
1388
                return labeltype[i];
1389
            }
1390
            *(scriptptr++) = 0;
1391
            textptr += l;
1392
            el = translatelabeltype(type);
1393
            gl = translatelabeltype(labeltype[i]);
1394
            ReportError(-1);
1395
            initprintf("%s:%ld: warning: expected a %s, found a %s.\n",compilefile,line_number,el,gl);
1396
            Bfree(el);
1397
            Bfree(gl);
1398
            return -1;  // valid label name, but wrong type
1399
        }
1400
    }
1401
 
333 terminx 1402
    if (isdigit(*textptr) == 0 && *textptr != '-')
5 Plagman 1403
    {
1404
        ReportError(ERROR_PARAMUNDEFINED);
1405
        error++;
1406
        textptr+=l;
1407
        return -1; // error!
1408
    }
1409
 
333 terminx 1410
    if (isdigit(*textptr) && labelsonly)
5 Plagman 1411
    {
1412
        ReportError(WARNING_LABELSONLY);
1413
        //         warning++;
1414
    }
1415
    if (!(error || warning) && condebug > 1)
1416
        initprintf("%s:%ld: debug: accepted constant %ld.\n",compilefile,line_number,atol(textptr));
1417
    *scriptptr = atol(textptr);
1418
    scriptptr++;
1419
 
1420
    textptr += l;
1421
 
1422
    return 0;   // literal value
1423
}
1424
 
398 terminx 1425
static char parsecommand(void);
1426
 
1427
static long CountCaseStatements()
5 Plagman 1428
{
1429
    long lCount;
1430
    char *temptextptr;
1431
    long *savescript;
1432
    long *savecase;
1433
    short temp_line_number;
1434
 
1435
    temp_line_number=line_number;
1436
 
1437
    casecount=0;
1438
    temptextptr=textptr;
1439
    savescript=scriptptr;
1440
    savecase=casescriptptr;
1441
    casescriptptr=NULL;
1442
    //Bsprintf(g_szBuf,"CSS: %.12s",textptr);
1443
    //AddLog(g_szBuf);
331 terminx 1444
    while (parsecommand() == 0)
5 Plagman 1445
    {
1446
        //Bsprintf(g_szBuf,"CSSL: %.20s",textptr);
1447
        //AddLog(g_szBuf);
1448
        ;
1449
    }
1450
    // since we processed the endswitch, we need to re-increment checking_switch
1451
    checking_switch++;
1452
 
1453
    textptr=temptextptr;
1454
    scriptptr=savescript;
1455
 
1456
    line_number = temp_line_number;
1457
 
1458
    lCount=casecount;
1459
    casecount=0;
1460
    casescriptptr=savecase;
1461
    return lCount;
1462
}
1463
 
398 terminx 1464
static char parsecommand(void)
5 Plagman 1465
{
1466
    long i, j=0, k=0, *tempscrptr;
1467
    char done, *temptextptr;
1468
 
1469
    long tw;
1470
 
335 terminx 1471
    if (((unsigned)(scriptptr-script) > MAXSCRIPTSIZE) && error == 0)
1472
    {
5 Plagman 1473
        /* Bsprintf(tempbuf,"fatal error: Size of compiled CON code exceeds maximum size! (%ud, %d)\n",(unsigned)(scriptptr-script),MAXSCRIPTSIZE); */
1474
        ReportError(-1);
1475
        initprintf("%s:%ld: internal compiler error: Aborted (%ud)\n",compilefile,line_number,(unsigned)(scriptptr-script));
1476
        initprintf(tempbuf);
1477
        error++;
1478
    }
1479
 
333 terminx 1480
    if ((error+warning) > 63 || (*textptr == '\0') || (*(textptr+1) == '\0')) return 1;
5 Plagman 1481
 
331 terminx 1482
    if (condebug)
296 terminx 1483
        ReportError(-1);
1484
 
333 terminx 1485
    if (checking_switch > 0)
5 Plagman 1486
    {
1487
        //Bsprintf(g_szBuf,"PC(): '%.25s'",textptr);
1488
        //AddLog(g_szBuf);
1489
    }
1490
    tw = transword();
1491
    //    Bsprintf(tempbuf,"%s",keyw[tw]);
1492
    //    AddLog(tempbuf);
1493
 
1494
    skipcomments(); // yes?  no?
1495
 
331 terminx 1496
    switch (tw)
5 Plagman 1497
    {
337 terminx 1498
    default:
1499
    case -1:
1500
        return 0; //End
1501
    case CON_STATE:
1502
        if (parsing_actor == 0 && parsing_state == 0)
1503
        {
1504
            getlabel();
1505
            scriptptr--;
1506
            labelcode[labelcnt] = (long) scriptptr;
1507
            labeltype[labelcnt] = LABEL_STATE;
1508
 
1509
            parsing_state = 1;
1510
            Bsprintf(parsing_item_name,"%s",label+(labelcnt<<6));
1511
            labelcnt++;
1512
            return 0;
1513
        }
1514
 
1515
        getlabel();
1516
 
1517
        for (i=0;i<NUMKEYWORDS;i++)
1518
            if (Bstrcmp(label+(labelcnt<<6),keyw[i]) == 0)
335 terminx 1519
            {
337 terminx 1520
                error++;
1521
                ReportError(ERROR_ISAKEYWORD);
335 terminx 1522
                return 0;
1523
            }
337 terminx 1524
        for (j=0;j<labelcnt;j++)
1525
        {
1526
            if (Bstrcmp(label+(j<<6),label+(labelcnt<<6)) == 0)
1527
            {
1528
                if (labeltype[j] & LABEL_STATE)
5 Plagman 1529
                {
337 terminx 1530
                    if (!(error || warning) && condebug > 1)
1531
                        initprintf("%s:%ld: debug: accepted state label `%s'.\n",compilefile,line_number,label+(j<<6));
1532
                    *scriptptr = labelcode[j];
1533
                    break;
5 Plagman 1534
                }
337 terminx 1535
                else
5 Plagman 1536
                {
337 terminx 1537
                    char *gl;
1538
                    gl = translatelabeltype(labeltype[j]);
1539
                    ReportError(-1);
1540
                    initprintf("%s:%ld: warning: expected a state, found a %s.\n",compilefile,line_number,gl);
1541
                    Bfree(gl);
1542
                    *(scriptptr-1) = CON_NULLOP; // get rid of the state, leaving a nullop to satisfy if conditions
1543
                    return 0;  // valid label name, but wrong type
5 Plagman 1544
                }
1545
            }
337 terminx 1546
        }
1547
        if (j==labelcnt)
1548
        {
1549
            ReportError(-1);
1550
            initprintf("%s:%ld: error: state `%s' not found.\n",compilefile,line_number,label+(labelcnt<<6));
1551
            error++;
1552
        }
1553
        scriptptr++;
1554
        return 0;
1555
 
1556
    case CON_ENDS:
1557
        if (parsing_state == 0)
1558
        {
1559
            ReportError(-1);
1560
            initprintf("%s:%ld: error: found `ends' without open `state'.\n",compilefile,line_number);
1561
            error++;
1562
        }
1563
        //            else
1564
        {
1565
            if (num_braces > 0)
5 Plagman 1566
            {
337 terminx 1567
                ReportError(ERROR_OPENBRACKET);
5 Plagman 1568
                error++;
1569
            }
337 terminx 1570
            if (num_braces < 0)
5 Plagman 1571
            {
337 terminx 1572
                ReportError(ERROR_CLOSEBRACKET);
5 Plagman 1573
                error++;
1574
            }
337 terminx 1575
            if (checking_switch > 0)
5 Plagman 1576
            {
337 terminx 1577
                ReportError(ERROR_NOENDSWITCH);
1578
                error++;
5 Plagman 1579
 
337 terminx 1580
                checking_switch = 0; // can't be checking anymore...
1581
            }
335 terminx 1582
 
337 terminx 1583
            parsing_state = 0;
1584
            Bsprintf(parsing_item_name,"(none)");
1585
        }
1586
        return 0;
1587
 
1588
    case CON_SETTHISPROJECTILE:
1589
    case CON_SETPROJECTILE:
1590
        if (!CheckEventSync(current_event))
1591
            ReportError(WARNING_EVENTSYNC);
1592
    case CON_GETTHISPROJECTILE:
1593
    case CON_GETPROJECTILE:
1594
    {
1595
        long lLabelID;
1596
 
1597
        // syntax getwall[<var>].x <VAR>
1598
        // gets the value of wall[<var>].xxx into <VAR>
1599
 
1600
        // now get name of .xxx
1601
        while ((*textptr != '['))
1602
        {
1603
            textptr++;
1604
        }
1605
        if (*textptr == '[')
1606
            textptr++;
1607
 
1608
        // get the ID of the DEF
1609
        if (tw == CON_SETTHISPROJECTILE)
1610
            labelsonly = 1;
1611
        transvar();
1612
        labelsonly = 0;
1613
        // now get name of .xxx
1614
        while (*textptr != '.')
1615
        {
1616
            if (*textptr == 0xa)
1617
                break;
1618
            if (!*textptr)
1619
                break;
1620
 
1621
            textptr++;
1622
        }
1623
        if (*textptr!='.')
1624
        {
1625
            error++;
1626
            ReportError(ERROR_SYNTAXERROR);
331 terminx 1627
            return 0;
337 terminx 1628
        }
1629
        textptr++;
1630
        /// now pointing at 'xxx'
1631
        getlabel();
1632
        //printf("found xxx label of '%s'\n",   label+(labelcnt<<6));
5 Plagman 1633
 
337 terminx 1634
        lLabelID=getlabeloffset(projectilelabels,label+(labelcnt<<6));
1635
        //printf("LabelID is %ld\n",lLabelID);
1636
        if (lLabelID == -1)
331 terminx 1637
        {
337 terminx 1638
            error++;
1639
            ReportError(ERROR_SYMBOLNOTRECOGNIZED);
1640
            return 0;
1641
        }
5 Plagman 1642
 
337 terminx 1643
        *scriptptr++=projectilelabels[lLabelID].lId;
5 Plagman 1644
 
337 terminx 1645
        //printf("member's flags are: %02Xh\n",playerlabels[lLabelID].flags);
5 Plagman 1646
 
337 terminx 1647
        // now at target VAR...
1648
 
1649
        // get the ID of the DEF
1650
        switch (tw)
1651
        {
1652
        case CON_SETPROJECTILE:
1653
        case CON_SETTHISPROJECTILE:
331 terminx 1654
            transvar();
337 terminx 1655
            break;
1656
        default:
1657
            transvartype(GAMEVAR_FLAG_READONLY);
1658
            break;
1659
        }
1660
        break;
1661
    }
5 Plagman 1662
 
337 terminx 1663
    case CON_GAMEVAR:
1664
        // syntax: gamevar <var1> <initial value> <flags>
1665
        // defines var1 and sets initial value.
1666
        // flags are used to define usage
1667
        // (see top of this files for flags)
1668
        //printf("Got gamedef. Getting Label. '%.20s'\n",textptr);
1669
 
1670
        if (isdigit(*textptr) || (*textptr == '-'))
1671
        {
5 Plagman 1672
            getlabel();
337 terminx 1673
            error++;
1674
            ReportError(ERROR_SYNTAXERROR);
1675
            transnum(LABEL_DEFINE);
1676
            transnum(LABEL_DEFINE);
1677
            scriptptr -= 3; // we complete the process anyways just to skip past the fucked up section
1678
            return 0;
1679
        }
5 Plagman 1680
 
337 terminx 1681
        getlabel();
1682
        //printf("Got Label '%.20s'\n",textptr);
1683
        // Check to see it's already defined
1684
 
1685
        for (i=0;i<NUMKEYWORDS;i++)
1686
            if (Bstrcmp(label+(labelcnt<<6),keyw[i]) == 0)
5 Plagman 1687
            {
1688
                error++;
337 terminx 1689
                ReportError(ERROR_ISAKEYWORD);
5 Plagman 1690
                return 0;
1691
            }
337 terminx 1692
#if 0
1693
        for (i=0;i<iGameVarCount;i++)
1694
        {
1695
            if (aGameVars[i].szLabel != NULL)
5 Plagman 1696
            {
337 terminx 1697
                if (Bstrcmp(label+(labelcnt<<6),aGameVars[i].szLabel) == 0)
1698
                {
1699
                    warning++;
1700
                    initprintf("  * WARNING.(L%ld) duplicate Game definition `%s' ignored.\n",line_number,label+(labelcnt<<6));
102 terminx 1701
                    break;
337 terminx 1702
                }
5 Plagman 1703
            }
1704
        }
337 terminx 1705
#endif
5 Plagman 1706
 
337 terminx 1707
        //printf("Translating number  '%.20s'\n",textptr);
1708
        transnum(LABEL_DEFINE); // get initial value
1709
        //printf("Done Translating number.  '%.20s'\n",textptr);
5 Plagman 1710
 
337 terminx 1711
        transnum(LABEL_DEFINE); // get flags
1712
        //Bsprintf(g_szBuf,"Adding GameVar='%s', val=%l, flags=%lX",label+(labelcnt<<6),
1713
        //      *(scriptptr-2), *(scriptptr-1));
1714
        //AddLog(g_szBuf);
1715
 
1716
        AddGameVar(label+(labelcnt<<6),*(scriptptr-2),
1717
                   (*(scriptptr-1))
1718
                   // can't define default or secret
1719
                   & (~(GAMEVAR_FLAG_DEFAULT | GAMEVAR_FLAG_SECRET))
1720
                  );
1721
        //AddLog("Added gamevar");
1722
        scriptptr -= 3; // no need to save in script...
1723
        return 0;
1724
 
1725
    case CON_DEFINE:
1726
    {
1727
        //printf("Got definition. Getting Label. '%.20s'\n",textptr);
1728
        getlabel();
1729
        //printf("Got label. '%.20s'\n",textptr);
1730
        // Check to see it's already defined
1731
 
1732
        for (i=0;i<NUMKEYWORDS;i++)
1733
            if (Bstrcmp(label+(labelcnt<<6),keyw[i]) == 0)
331 terminx 1734
            {
1735
                error++;
337 terminx 1736
                ReportError(ERROR_ISAKEYWORD);
331 terminx 1737
                return 0;
1738
            }
5 Plagman 1739
 
337 terminx 1740
        for (i=0;i<labelcnt;i++)
1741
        {
1742
            if (Bstrcmp(label+(labelcnt<<6),label+(i<<6)) == 0 && (labeltype[i] & LABEL_DEFINE))
5 Plagman 1743
            {
337 terminx 1744
                if (i >= defaultlabelcnt)
5 Plagman 1745
                {
337 terminx 1746
                    warning++;
1747
                    ReportError(WARNING_DUPLICATEDEFINITION);
5 Plagman 1748
                }
337 terminx 1749
                break;
5 Plagman 1750
            }
337 terminx 1751
        }
1752
        //printf("Translating. '%.20s'\n",textptr);
1753
        transnum(LABEL_DEFINE);
1754
        //printf("Translated. '%.20s'\n",textptr);
1755
        if (i == labelcnt)
1756
        {
1757
            //              printf("Defining Definition '%s' to be '%d'\n",label+(labelcnt<<6),*(scriptptr-1));
1758
            labeltype[labelcnt] = LABEL_DEFINE;
1759
            labelcode[labelcnt++] = *(scriptptr-1);
1760
            if (*(scriptptr-1) >= 0 && *(scriptptr-1) < MAXTILES && dynamicremap)
1761
                processnames(label+(i<<6),*(scriptptr-1));
1762
        }
1763
        scriptptr -= 2;
1764
        return 0;
1765
    }
5 Plagman 1766
 
337 terminx 1767
    case CON_PALFROM:
1768
        for (j=0;j<4;j++)
1769
        {
1770
            if (keyword() == -1)
1771
                transnum(LABEL_DEFINE);
1772
            else break;
1773
        }
5 Plagman 1774
 
337 terminx 1775
        while (j<4)
1776
        {
1777
            *scriptptr = 0;
1778
            scriptptr++;
1779
            j++;
1780
        }
1781
        return 0;
5 Plagman 1782
 
337 terminx 1783
    case CON_MOVE:
1784
        if (parsing_actor || parsing_state)
1785
        {
1786
            if (!CheckEventSync(current_event))
1787
                ReportError(WARNING_EVENTSYNC);
5 Plagman 1788
 
337 terminx 1789
            if ((transnum(LABEL_MOVE|LABEL_DEFINE) == 0) && (*(scriptptr-1) != 0) && (*(scriptptr-1) != 1))
1790
            {
1791
                ReportError(-1);
1792
                *(scriptptr-1) = 0;
1793
                initprintf("%s:%ld: warning: expected a move, found a constant.\n",compilefile,line_number);
1794
            }
1795
 
1796
            j = 0;
1797
            while (keyword() == -1)
1798
            {
1799
                transnum(LABEL_DEFINE);
1800
                scriptptr--;
1801
                j |= *scriptptr;
1802
            }
1803
            *scriptptr = j;
1804
 
1805
            scriptptr++;
1806
        }
1807
        else
5 Plagman 1808
        {
337 terminx 1809
            scriptptr--;
5 Plagman 1810
            getlabel();
1811
            // Check to see it's already defined
1812
 
331 terminx 1813
            for (i=0;i<NUMKEYWORDS;i++)
333 terminx 1814
                if (Bstrcmp(label+(labelcnt<<6),keyw[i]) == 0)
5 Plagman 1815
                {
1816
                    error++;
1817
                    ReportError(ERROR_ISAKEYWORD);
1818
                    return 0;
1819
                }
1820
 
331 terminx 1821
            for (i=0;i<labelcnt;i++)
337 terminx 1822
                if (Bstrcmp(label+(labelcnt<<6),label+(i<<6)) == 0 && (labeltype[i] & LABEL_MOVE))
5 Plagman 1823
                {
337 terminx 1824
                    warning++;
1825
                    initprintf("%s:%ld: warning: duplicate move `%s' ignored.\n",compilefile,line_number,label+(labelcnt<<6));
5 Plagman 1826
                    break;
1827
                }
331 terminx 1828
            if (i == labelcnt)
5 Plagman 1829
            {
337 terminx 1830
                labeltype[labelcnt] = LABEL_MOVE;
1831
                labelcode[labelcnt++] = (long) scriptptr;
5 Plagman 1832
            }
337 terminx 1833
            for (j=0;j<2;j++)
5 Plagman 1834
            {
337 terminx 1835
                if (keyword() >= 0) break;
1836
                transnum(LABEL_DEFINE);
5 Plagman 1837
            }
337 terminx 1838
            for (k=j;k<2;k++)
5 Plagman 1839
            {
1840
                *scriptptr = 0;
1841
                scriptptr++;
1842
            }
337 terminx 1843
        }
1844
        return 0;
5 Plagman 1845
 
337 terminx 1846
    case CON_MUSIC:
1847
    {
1848
        // NOTE: this doesn't get stored in the PCode...
1849
 
1850
        // music 1 stalker.mid dethtoll.mid streets.mid watrwld1.mid snake1.mid
1851
        //    thecall.mid ahgeez.mid dethtoll.mid streets.mid watrwld1.mid snake1.mid
1852
        scriptptr--;
1853
        transnum(LABEL_DEFINE); // Volume Number (0/4)
1854
        scriptptr--;
1855
 
1856
        k = *scriptptr-1;
1857
 
1858
        if (k >= 0) // if it's background music
1859
        {
1860
            i = 0;
1861
            // get the file name...
1862
            while (keyword() == -1)
335 terminx 1863
            {
337 terminx 1864
                while (isaltok(*textptr) == 0)
5 Plagman 1865
                {
337 terminx 1866
                    if (*textptr == 0x0a) line_number++;
1867
                    textptr++;
1868
                    if (*textptr == 0) break;
5 Plagman 1869
                }
331 terminx 1870
                j = 0;
337 terminx 1871
                while (isaltok(*(textptr+j)))
331 terminx 1872
                {
385 terminx 1873
                    tempbuf[j] = textptr[j];
337 terminx 1874
                    j++;
331 terminx 1875
                }
385 terminx 1876
                tempbuf[j] = '\0';
1877
 
1878
                if (music_fn[k][i] == NULL)
1879
                    music_fn[k][i] = Bcalloc(Bstrlen(tempbuf)+1,sizeof(char));
386 terminx 1880
                else if ((Bstrlen(tempbuf)+1) > sizeof(music_fn[k][i]))
1881
                    music_fn[k][i] = Brealloc(music_fn[k][i],(Bstrlen(tempbuf)+1));
385 terminx 1882
 
1883
                Bstrcpy(music_fn[k][i],tempbuf);
1884
 
337 terminx 1885
                textptr += j;
381 terminx 1886
                if (i > MAXLEVELS-1) break;
337 terminx 1887
                i++;
5 Plagman 1888
            }
337 terminx 1889
        }
1890
        else
1891
        {
1892
            i = 0;
1893
            while (keyword() == -1)
5 Plagman 1894
            {
337 terminx 1895
                while (isaltok(*textptr) == 0)
5 Plagman 1896
                {
337 terminx 1897
                    if (*textptr == 0x0a) line_number++;
1898
                    textptr++;
1899
                    if (*textptr == 0) break;
331 terminx 1900
                }
337 terminx 1901
                j = 0;
381 terminx 1902
 
337 terminx 1903
                while (isaltok(*(textptr+j)))
331 terminx 1904
                {
337 terminx 1905
                    env_music_fn[i][j] = textptr[j];
1906
                    j++;
331 terminx 1907
                }
337 terminx 1908
                env_music_fn[i][j] = '\0';
1909
 
1910
                textptr += j;
381 terminx 1911
                if (i > MAXVOLUMES-1) break;
337 terminx 1912
                i++;
5 Plagman 1913
            }
337 terminx 1914
        }
1915
    }
1916
    return 0;
5 Plagman 1917
 
337 terminx 1918
    case CON_INCLUDE:
1919
        scriptptr--;
1920
        while (isaltok(*textptr) == 0)
5 Plagman 1921
        {
337 terminx 1922
            if (*textptr == 0x0a) line_number++;
1923
            textptr++;
1924
            if (*textptr == 0) break;
1925
        }
1926
        j = 0;
1927
        while (isaltok(*textptr))
1928
        {
1929
            tempbuf[j] = *(textptr++);
1930
            j++;
1931
        }
1932
        tempbuf[j] = '\0';
5 Plagman 1933
 
337 terminx 1934
        {
1935
            short temp_line_number;
1936
            char  temp_ifelse_check;
1937
            char *origtptr, *mptr;
1938
            char parentcompilefile[255];
1939
            int fp;
5 Plagman 1940
 
337 terminx 1941
            fp = kopen4load(tempbuf,loadfromgrouponly);
1942
            if (fp < 0)
1943
            {
1944
                error++;
1945
                initprintf("%s:%ld: error: could not find file `%s'.\n",compilefile,line_number,tempbuf);
1946
                return 0;
1947
            }
335 terminx 1948
 
337 terminx 1949
            j = kfilelength(fp);
1950
 
1951
            mptr = (char *)Bmalloc(j+1);
1952
            if (!mptr)
5 Plagman 1953
            {
337 terminx 1954
                kclose(fp);
1955
                error++;
1956
                initprintf("%s:%ld: error: could not allocate %ld bytes to include `%s'.\n",
1957
                           line_number,compilefile,j,tempbuf);
1958
                return 0;
5 Plagman 1959
            }
1960
 
337 terminx 1961
            initprintf("Including: %s (%ld bytes)\n",tempbuf, j);
1962
            kread(fp, mptr, j);
1963
            kclose(fp);
1964
            mptr[j] = 0;
1965
 
1966
            if (*textptr == '"') // skip past the closing quote if it's there so we don't screw up the next line
1967
                textptr++;
1968
            origtptr = textptr;
1969
 
1970
            Bstrcpy(parentcompilefile, compilefile);
1971
            Bstrcpy(compilefile, tempbuf);
1972
            temp_line_number = line_number;
1973
            line_number = 1;
1974
            temp_ifelse_check = checking_ifelse;
1975
            checking_ifelse = 0;
1976
 
1977
            textptr = mptr;
1978
            do done = parsecommand();
1979
            while (!done);
1980
 
1981
            Bstrcpy(compilefile, parentcompilefile);
1982
            total_lines += line_number;
1983
            line_number = temp_line_number;
1984
            checking_ifelse = temp_ifelse_check;
1985
 
1986
            textptr = origtptr;
1987
 
1988
            Bfree(mptr);
5 Plagman 1989
        }
1990
        return 0;
1991
 
337 terminx 1992
    case CON_AI:
1993
        if (parsing_actor || parsing_state)
1994
        {
1995
            if (!CheckEventSync(current_event))
1996
                ReportError(WARNING_EVENTSYNC);
1997
            transnum(LABEL_AI);
1998
        }
1999
        else
2000
        {
5 Plagman 2001
            scriptptr--;
337 terminx 2002
            getlabel();
5 Plagman 2003
 
337 terminx 2004
            for (i=0;i<NUMKEYWORDS;i++)
2005
                if (Bstrcmp(label+(labelcnt<<6),keyw[i]) == 0)
5 Plagman 2006
                {
2007
                    error++;
337 terminx 2008
                    ReportError(ERROR_ISAKEYWORD);
5 Plagman 2009
                    return 0;
2010
                }
2011
 
337 terminx 2012
            for (i=0;i<labelcnt;i++)
2013
                if (Bstrcmp(label+(labelcnt<<6),label+(i<<6)) == 0 && (labeltype[i] & LABEL_AI))
5 Plagman 2014
                {
337 terminx 2015
                    warning++;
2016
                    initprintf("%s:%ld: warning: duplicate ai `%s' ignored.\n",compilefile,line_number,label+(labelcnt<<6));
2017
                    break;
5 Plagman 2018
                }
2019
 
337 terminx 2020
            if (i == labelcnt)
2021
            {
2022
                labeltype[labelcnt] = LABEL_AI;
2023
                labelcode[labelcnt++] = (long) scriptptr;
335 terminx 2024
            }
2025
 
337 terminx 2026
            for (j=0;j<3;j++)
5 Plagman 2027
            {
337 terminx 2028
                if (keyword() >= 0) break;
2029
                if (j == 1)
2030
                    transnum(LABEL_ACTION);
2031
                else if (j == 2)
2032
                {
2033
                    if ((transnum(LABEL_MOVE|LABEL_DEFINE) == 0) && (*(scriptptr-1) != 0) && (*(scriptptr-1) != 1))
254 terminx 2034
                    {
337 terminx 2035
                        ReportError(-1);
2036
                        *(scriptptr-1) = 0;
2037
                        initprintf("%s:%ld: warning: expected a move, found a constant.\n",compilefile,line_number);
254 terminx 2038
                    }
337 terminx 2039
                    k = 0;
2040
                    while (keyword() == -1)
5 Plagman 2041
                    {
337 terminx 2042
                        transnum(LABEL_DEFINE);
2043
                        scriptptr--;
2044
                        k |= *scriptptr;
5 Plagman 2045
                    }
337 terminx 2046
                    *scriptptr = k;
5 Plagman 2047
                    scriptptr++;
337 terminx 2048
                    return 0;
5 Plagman 2049
                }
2050
            }
337 terminx 2051
            for (k=j;k<3;k++)
5 Plagman 2052
            {
337 terminx 2053
                *scriptptr = 0;
2054
                scriptptr++;
5 Plagman 2055
            }
337 terminx 2056
        }
2057
        return 0;
5 Plagman 2058
 
337 terminx 2059
    case CON_ACTION:
2060
        if (parsing_actor || parsing_state)
2061
        {
2062
            if (!CheckEventSync(current_event))
2063
                ReportError(WARNING_EVENTSYNC);
2064
            transnum(LABEL_ACTION);
2065
        }
2066
        else
2067
        {
2068
            scriptptr--;
2069
            getlabel();
2070
            // Check to see it's already defined
5 Plagman 2071
 
337 terminx 2072
            for (i=0;i<NUMKEYWORDS;i++)
2073
                if (Bstrcmp(label+(labelcnt<<6),keyw[i]) == 0)
5 Plagman 2074
                {
337 terminx 2075
                    error++;
2076
                    ReportError(ERROR_ISAKEYWORD);
2077
                    return 0;
5 Plagman 2078
                }
337 terminx 2079
            for (i=0;i<labelcnt;i++)
2080
                if (Bstrcmp(label+(labelcnt<<6),label+(i<<6)) == 0 && (labeltype[i] & LABEL_ACTION))
5 Plagman 2081
                {
337 terminx 2082
                    warning++;
2083
                    initprintf("%s:%ld: warning: duplicate action `%s' ignored.\n",compilefile,line_number,label+(labelcnt<<6));
2084
                    break;
5 Plagman 2085
                }
337 terminx 2086
 
2087
            if (i == labelcnt)
2088
            {
2089
                labeltype[labelcnt] = LABEL_ACTION;
2090
                labelcode[labelcnt] = (long) scriptptr;
2091
                labelcnt++;
5 Plagman 2092
            }
2093
 
337 terminx 2094
            for (j=0;j<5;j++)
5 Plagman 2095
            {
337 terminx 2096
                if (keyword() >= 0) break;
2097
                transnum(LABEL_DEFINE);
5 Plagman 2098
            }
337 terminx 2099
            for (k=j;k<5;k++)
2100
            {
2101
                *scriptptr = 0;
2102
                scriptptr++;
2103
            }
2104
        }
2105
        return 0;
5 Plagman 2106
 
337 terminx 2107
    case CON_ACTOR:
2108
        if (parsing_state || parsing_actor)
2109
        {
2110
            ReportError(ERROR_FOUNDWITHIN);
2111
            error++;
2112
        }
5 Plagman 2113
 
337 terminx 2114
        num_braces = 0;
2115
        scriptptr--;
2116
        parsing_actor = scriptptr;
2117
 
2118
        skipcomments();
2119
        j = 0;
2120
        while (isaltok(*(textptr+j)))
2121
        {
2122
            parsing_item_name[j] = textptr[j];
2123
            j++;
2124
        }
2125
        parsing_item_name[j] = 0;
2126
        transnum(LABEL_DEFINE);
2127
        //         Bsprintf(parsing_item_name,"%s",label+(labelcnt<<6));
2128
        scriptptr--;
2129
        actorscrptr[*scriptptr] = parsing_actor;
2130
 
2131
        for (j=0;j<4;j++)
2132
        {
2133
            *(parsing_actor+j) = 0;
2134
            if (j == 3)
5 Plagman 2135
            {
337 terminx 2136
                j = 0;
2137
                while (keyword() == -1)
2138
                {
2139
                    transnum(LABEL_DEFINE);
2140
                    scriptptr--;
2141
                    j |= *scriptptr;
2142
                }
2143
                *scriptptr = j;
2144
                scriptptr++;
2145
                break;
5 Plagman 2146
            }
337 terminx 2147
            else
5 Plagman 2148
            {
337 terminx 2149
                if (keyword() >= 0)
5 Plagman 2150
                {
337 terminx 2151
                    for (i=4-j; i; i--) *(scriptptr++) = 0;
5 Plagman 2152
                    break;
2153
                }
337 terminx 2154
                switch (j)
5 Plagman 2155
                {
337 terminx 2156
                case 0:
2157
                    transnum(LABEL_DEFINE);
2158
                    break;
2159
                case 1:
2160
                    transnum(LABEL_ACTION);
2161
                    break;
2162
                case 2:
2163
                    if ((transnum(LABEL_MOVE|LABEL_DEFINE) == 0) && (*(scriptptr-1) != 0) && (*(scriptptr-1) != 1))
254 terminx 2164
                    {
337 terminx 2165
                        ReportError(-1);
2166
                        *(scriptptr-1) = 0;
2167
                        initprintf("%s:%ld: warning: expected a move, found a constant.\n",compilefile,line_number);
254 terminx 2168
                    }
337 terminx 2169
                    break;
5 Plagman 2170
                }
337 terminx 2171
                *(parsing_actor+j) = *(scriptptr-1);
5 Plagman 2172
            }
337 terminx 2173
        }
2174
        checking_ifelse = 0;
2175
        return 0;
2176
 
2177
    case CON_ONEVENT:
2178
        if (parsing_state || parsing_actor)
2179
        {
2180
            ReportError(ERROR_FOUNDWITHIN);
2181
            error++;
2182
        }
2183
 
2184
        num_braces = 0;
2185
        scriptptr--;
2186
        parsing_event = scriptptr;
2187
        parsing_actor = scriptptr;
2188
 
2189
        skipcomments();
2190
        j = 0;
2191
        while (isaltok(*(textptr+j)))
2192
        {
2193
            parsing_item_name[j] = textptr[j];
2194
            j++;
2195
        }
2196
        parsing_item_name[j] = 0;
2197
        labelsonly = 1;
2198
        transnum(LABEL_DEFINE);
2199
        labelsonly = 0;
2200
        scriptptr--;
2201
        j= *scriptptr;  // type of event
2202
        current_event = j;
2203
        //Bsprintf(g_szBuf,"Adding Event for %d at %lX",j, parsing_event);
2204
        //AddLog(g_szBuf);
2205
        if (j > MAXGAMEEVENTS-1 || j < 0)
2206
        {
2207
            initprintf("%s:%ld: error: invalid event ID.\n",compilefile,line_number);
2208
            error++;
335 terminx 2209
            return 0;
337 terminx 2210
        }
5 Plagman 2211
 
337 terminx 2212
        if (apScriptGameEvent[j])
2213
        {
2214
            tempscrptr = parsing_event;
2215
            parsing_event = parsing_actor = 0;
2216
            ReportError(-1);
2217
            parsing_event = parsing_actor = tempscrptr;
2218
            initprintf("%s:%ld: warning: duplicate event `%s'.\n",compilefile,line_number,parsing_item_name);
2219
        }
2220
        else apScriptGameEvent[j]=parsing_event;
5 Plagman 2221
 
337 terminx 2222
        checking_ifelse = 0;
5 Plagman 2223
 
337 terminx 2224
        return 0;
5 Plagman 2225
 
337 terminx 2226
    case CON_EVENTLOADACTOR:
2227
        if (parsing_state || parsing_actor)
2228
        {
2229
            ReportError(ERROR_FOUNDWITHIN);
2230
            error++;
2231
        }
5 Plagman 2232
 
337 terminx 2233
        num_braces = 0;
2234
        scriptptr--;
2235
        parsing_actor = scriptptr;
5 Plagman 2236
 
337 terminx 2237
        skipcomments();
2238
        j = 0;
2239
        while (isaltok(*(textptr+j)))
2240
        {
2241
            parsing_item_name[j] = textptr[j];
2242
            j++;
2243
        }
2244
        parsing_item_name[j] = 0;
2245
        transnum(LABEL_DEFINE);
2246
        scriptptr--;
2247
        actorLoadEventScrptr[*scriptptr] = parsing_actor;
5 Plagman 2248
 
337 terminx 2249
        checking_ifelse = 0;
2250
        return 0;
5 Plagman 2251
 
337 terminx 2252
    case CON_USERACTOR:
2253
        if (parsing_state || parsing_actor)
2254
        {
2255
            ReportError(ERROR_FOUNDWITHIN);
2256
            error++;
2257
        }
5 Plagman 2258
 
337 terminx 2259
        num_braces = 0;
2260
        scriptptr--;
2261
        parsing_actor = scriptptr;
5 Plagman 2262
 
337 terminx 2263
        transnum(LABEL_DEFINE);
2264
        scriptptr--;
5 Plagman 2265
 
337 terminx 2266
        skipcomments();
2267
        j = 0;
2268
        while (isaltok(*(textptr+j)))
2269
        {
2270
            parsing_item_name[j] = textptr[j];
2271
            j++;
2272
        }
2273
        parsing_item_name[j] = 0;
5 Plagman 2274
 
337 terminx 2275
        j = *scriptptr;
5 Plagman 2276
 
337 terminx 2277
        if (j > 2)
2278
        {
2279
            ReportError(-1);
2280
            initprintf("%s:%ld: warning: invalid useractor type.\n",compilefile,line_number);
296 terminx 2281
            j = 0;
337 terminx 2282
        }
267 terminx 2283
 
337 terminx 2284
        transnum(LABEL_DEFINE);
2285
        scriptptr--;
2286
        actorscrptr[*scriptptr] = parsing_actor;
2287
        actortype[*scriptptr] = j;
5 Plagman 2288
 
337 terminx 2289
        for (j=0;j<4;j++)
2290
        {
2291
            *(parsing_actor+j) = 0;
2292
            if (j == 3)
5 Plagman 2293
            {
2294