Subversion Repositories eduke32

Rev

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