1 //-------------------------------------------------------------------------
2 /*
3 Copyright (C) 1996, 2003 - 3D Realms Entertainment
4 Copyright (C) 2000, 2003 - Matt Saettler (EDuke Enhancements)
5 Copyright (C) 2004, 2007 - EDuke32 developers
6 
7 This file is part of EDuke32
8 
9 EDuke32 is free software; you can redistribute it and/or
10 modify it under the terms of the GNU General Public License version 2
11 as published by the Free Software Foundation.
12 
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16 
17 See the GNU General Public License for more details.
18 
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
22 */
23 //-------------------------------------------------------------------------
24 
25 #ifndef m32def_h_
26 #define m32def_h_
27 
28 // the parsing routines aren't good at error recovery yet...
29 #define ABORTERRCNT 1
30 
31 // these two are for m32def.c
32 #define C_CUSTOMERROR(Text, ...) do { \
33     C_ReportError(-1);                                                  \
34     initprintf("%s:%d: error: " Text "\n", g_szScriptFileName, g_lineNumber, ## __VA_ARGS__); \
35     C_PrintErrorPosition();  \
36     g_numCompilerErrors++; \
37     } while (0)
38 #define C_CUSTOMWARNING(Text, ...) do { \
39     C_ReportError(-1);                                                  \
40     initprintf("%s:%d: warning: " Text "\n", g_szScriptFileName, g_lineNumber, ## __VA_ARGS__); \
41     C_PrintErrorPosition();    \
42     g_numCompilerWarnings++; \
43     } while (0)
44 
45 extern void C_PrintErrorPosition();
46 extern void C_ReportError(int32_t iError);
47 
48 extern char g_szScriptFileName[BMAX_PATH];
49 extern int32_t g_totalLines, g_lineNumber;
50 extern int32_t g_numCompilerErrors, g_numCompilerWarnings;
51 
52 extern int32_t g_didDefineSomething;
53 
54 extern instype *g_scriptPtr;
55 
56 void C_Compile(const char *filenameortext, int32_t isfilename);
57 void C_CompilationInfo(void);
58 
59 void registerMenuFunction(const char *funcname, int32_t stateidx);
60 void M32_PostScriptExec(void);
61 
62 typedef struct
63 {
64     int32_t ofs;  // offset into script[]
65     int32_t codesize;
66     uint16_t numlocals;  // number of local int32_t vars to allocate
67     char name[MAXLABELLEN];
68 } statesinfo_t;
69 
70 extern statesinfo_t *statesinfo;
71 extern int32_t g_stateCount;
72 
73 
74 typedef struct
75 {
76     const char *name;
77     int16_t lId;
78     int16_t flags;  // 1: read-only
79     int32_t min, max;
80 } memberlabel_t;
81 
82 extern memberlabel_t const SectorLabels[];
83 extern memberlabel_t const WallLabels[];
84 extern memberlabel_t const SpriteLabels[];
85 extern memberlabel_t const LightLabels[];
86 
87 
88 typedef struct {
89     const char* token;
90     int32_t val;
91 } tokenmap_t;
92 
93 extern const tokenmap_t iter_tokens[];
94 
95 enum vmflags
96 {
97     VMFLAG_RETURN = 1,
98     VMFLAG_BREAK = 2,
99     VMFLAG_ERROR = 4,
100 };
101 
102 enum miscvmflags
103 {
104     VMFLAG_MISC_UPDATEHL = 1,
105     VMFLAG_MISC_UPDATEHLSECT = 2,
106     VMFLAG_MISC_INTERACTIVE = 4,
107 };
108 
109 typedef struct {
110     int32_t spriteNum;
111     // VM state: either ==0 (top-level), >=1 and < MAXEVENTS+1 (event),
112     // or >= MAXEVENTS+1 and < MAXEVENTS+1+g_stateCount (state)
113     int32_t g_st;
114     union {
115         spritetype * pSprite;
116         uspritetype const * pUSprite;
117     };
118     uint32_t flags;  // g_errorFlag, g_returnFlag;
119 
120     // 1:updatehighlight, 2:updatehighlightsector, 4:interactive (from menu)?
121     uint32_t miscflags;
122 } vmstate_t;
123 
124 extern vmstate_t vm;
125 extern vmstate_t vm_default;
126 
127 
128 extern int32_t g_errorLineNum;
129 extern int32_t g_tw;
130 extern const char *keyw[];
131 
132 enum SystemString_t {
133     STR_MAPFILENAME,
134     STR_VERSION,
135 };
136 
137 enum ScriptError_t
138 {
139     ERROR_CLOSEBRACKET,
140     ERROR_EVENTONLY,
141 //    ERROR_EXCEEDSMAXTILES,
142     ERROR_EXPECTEDKEYWORD,
143     ERROR_FOUNDWITHIN,
144     ERROR_ISAKEYWORD,
145     ERROR_NOENDSWITCH,
146     ERROR_NOTAGAMEDEF,
147     ERROR_NOTAGAMEVAR,
148     ERROR_NOTAGAMEARRAY,
149     ERROR_GAMEARRAYBNC,
150     ERROR_GAMEARRAYBNO,
151     ERROR_INVALIDARRAYWRITE,
152     ERROR_EXPECTEDSIMPLEVAR,
153     ERROR_OPENBRACKET,
154     ERROR_PARAMUNDEFINED,
155     ERROR_SYMBOLNOTRECOGNIZED,
156     ERROR_SYNTAXERROR,
157     ERROR_VARREADONLY,
158     ERROR_ARRAYREADONLY,
159     ERROR_VARTYPEMISMATCH,
160     ERROR_LABELINUSE,
161 //    WARNING_BADGAMEVAR,
162     WARNING_DUPLICATECASE,
163     WARNING_DUPLICATEDEFINITION,
164     WARNING_LABELSONLY,
165     WARNING_NAMEMATCHESVAR,
166 //    WARNING_CONSTANTBITSIZE,
167     WARNING_OUTSIDEDRAWSPRITE,
168 };
169 
170 
171 enum SectorLabel_t
172 {
173     SECTOR_WALLPTR,
174     SECTOR_WALLNUM,
175     SECTOR_CEILINGZ,
176     SECTOR_FLOORZ,
177     SECTOR_CEILINGSTAT,
178     SECTOR_FLOORSTAT,
179     SECTOR_CEILINGPICNUM,
180     SECTOR_CEILINGSLOPE,
181     SECTOR_CEILINGSHADE,
182     SECTOR_CEILINGPAL,
183     SECTOR_CEILINGXPANNING,
184     SECTOR_CEILINGYPANNING,
185     SECTOR_FLOORPICNUM,
186     SECTOR_FLOORSLOPE,
187     SECTOR_FLOORSHADE,
188     SECTOR_FLOORPAL,
189     SECTOR_FLOORXPANNING,
190     SECTOR_FLOORYPANNING,
191     SECTOR_VISIBILITY,
192     SECTOR_FOGPAL,
193     SECTOR_LOTAG,
194     SECTOR_HITAG,
195     SECTOR_EXTRA,
196     SECTOR_END
197 };
198 
199 enum WallLabel_t
200 {
201     WALL_X,
202     WALL_Y,
203     WALL_POINT2,
204     WALL_NEXTWALL,
205     WALL_NEXTSECTOR,
206     WALL_CSTAT,
207     WALL_PICNUM,
208     WALL_OVERPICNUM,
209     WALL_SHADE,
210     WALL_PAL,
211     WALL_XREPEAT,
212     WALL_YREPEAT,
213     WALL_XPANNING,
214     WALL_YPANNING,
215     WALL_LOTAG,
216     WALL_HITAG,
217     WALL_EXTRA,
218     WALL_END
219 };
220 
221 enum SpriteLabel_t
222 {
223     SPRITE_X,  // 0
224     SPRITE_Y,
225     SPRITE_Z,
226     SPRITE_CSTAT,
227     SPRITE_PICNUM,
228     SPRITE_SHADE,  // 5
229     SPRITE_PAL,
230     SPRITE_CLIPDIST,
231     SPRITE_BLEND,
232     SPRITE_XREPEAT,
233     SPRITE_YREPEAT,  // 10
234     SPRITE_XOFFSET,
235     SPRITE_YOFFSET,
236     SPRITE_SECTNUM,
237     SPRITE_STATNUM,
238     SPRITE_ANG,  // 15
239     SPRITE_OWNER,
240     SPRITE_XVEL,
241     SPRITE_YVEL,
242     SPRITE_ZVEL,
243     SPRITE_LOTAG,  // 20
244     SPRITE_HITAG,
245     SPRITE_EXTRA,
246 
247     LIGHT_X,  // must be first here
248     LIGHT_Y,
249     LIGHT_Z,  // 25
250     LIGHT_HORIZ,
251     LIGHT_RANGE,
252     LIGHT_ANGLE,
253     LIGHT_FADERADIUS,
254     LIGHT_RADIUS,  // 30
255     LIGHT_SECTOR,
256     LIGHT_R,
257     LIGHT_G,
258     LIGHT_B,
259     LIGHT_PRIORITY,  // 35
260     LIGHT_TILENUM,
261     LIGHT_MINSHADE,
262     LIGHT_MAXSHADE,
263     LIGHT_ACTIVE,
264 
265     SPRITE_END
266 };
267 
268 enum IterationTypes_t
269 {
270     ITER_ALLSPRITES,
271     ITER_ALLSECTORS,
272     ITER_ALLWALLS,
273     ITER_ACTIVELIGHTS,
274     ITER_SELSPRITES,
275     ITER_SELSECTORS,
276     ITER_SELWALLS,
277     ITER_DRAWNSPRITES,
278 // ---
279     ITER_SPRITESOFSECTOR,
280     ITER_WALLSOFSECTOR,
281     ITER_LOOPOFWALL,
282     ITER_RANGE,
283     ITER_END
284 };
285 
286 enum ScriptKeywords_t
287 {
288 // basic commands
289     CON_NULLOP,
290     CON_DEFINE,
291     CON_INCLUDE,
292     CON_DEFSTATE,
293     CON_ENDS,
294     CON_STATE,
295     CON_ONEVENT,
296     CON_ENDEVENT,
297     CON_GAMEVAR,
298 
299 // control flow (except if*)
300     CON_ELSE,
301     CON_RETURN,
302     CON_BREAK,
303     CON_SWITCH,
304     CON_CASE,
305     CON_DEFAULT,
306     CON_ENDSWITCH,
307     CON_GETCURRADDRESS,
308     CON_JUMP,
309     CON_LEFTBRACE,
310     CON_RIGHTBRACE,
311 
312 #if 0
313 // more basic commands
314     CON_SETSECTOR,
315     CON_GETSECTOR,
316     CON_SETWALL,
317     CON_GETWALL,
318     CON_SETSPRITE, //+
319     CON_GETSPRITE, //+
320     CON_GETTSPR,
321     CON_SETTSPR,
322 #endif
323 
324 // arrays
325     CON_GAMEARRAY,
326     CON_SETARRAY,
327     CON_GETARRAYSIZE,
328     CON_RESIZEARRAY,
329     CON_COPY,
330 ///    CON_WRITEARRAYTOFILE,
331 ///    CON_READARRAYFROMFILE,
332 
333 // var ops
334     CON_RANDVAR,
335     CON_DISPLAYRANDVAR,
336     CON_SETVAR,
337     CON_ADDVAR,
338     CON_SUBVAR,
339     CON_MULVAR,
340     CON_DIVVAR,
341     CON_MODVAR,
342     CON_ANDVAR,
343     CON_ORVAR,
344     CON_XORVAR,
345     CON_SHIFTVARL,
346     CON_SHIFTVARR,
347 // varvar ops
348     CON_RANDVARVAR,
349     CON_DISPLAYRANDVARVAR,
350     CON_SETVARVAR,
351     CON_ADDVARVAR,
352     CON_SUBVARVAR,
353     CON_MULVARVAR,
354     CON_DIVVARVAR,
355     CON_MODVARVAR,
356     CON_ANDVARVAR,
357     CON_ORVARVAR,
358     CON_XORVARVAR,
359     CON_SHIFTVARVARL,
360     CON_SHIFTVARVARR,
361     CON_SIN,
362     CON_COS,
363 
364 // random
365     CON_DISPLAYRAND,
366 
367 // other math
368     CON_ITOF,
369     CON_FTOI,
370     CON_CLAMP,
371     CON_INV,
372     CON_SQRT,
373     CON_MULSCALE,
374     CON_DIVSCALE,
375     CON_SCALEVAR,
376     CON_DIST,
377     CON_LDIST,
378     CON_CALCHYPOTENUSE,
379     CON_GETANGLE,
380     CON_GETINCANGLE,
381     CON_A2XY,
382     CON_AH2XYZ,
383 
384     CON_COLLECTSECTORS,
385     CON_SORT,
386     CON_FOR,
387 
388 // if & while var
389     CON_IFVARL,
390     CON_IFVARLE,
391     CON_IFVARG,
392     CON_IFVARGE,
393     CON_IFVARA,
394     CON_IFVARAE,
395     CON_IFVARB,
396     CON_IFVARBE,
397     CON_IFVARE,
398     CON_IFVARN,
399     CON_IFVARAND,
400     CON_IFVAROR,
401     CON_IFVARXOR,
402     CON_IFVAREITHER,
403     CON_IFVARBOTH,
404     CON_WHILEVARN,
405     CON_WHILEVARL,
406 
407 // if & while varvar
408     CON_IFVARVARL,
409     CON_IFVARVARLE,
410     CON_IFVARVARG,
411     CON_IFVARVARGE,
412     CON_IFVARVARA,
413     CON_IFVARVARAE,
414     CON_IFVARVARB,
415     CON_IFVARVARBE,
416     CON_IFVARVARE,
417     CON_IFVARVARN,
418     CON_IFVARVARAND,
419     CON_IFVARVAROR,
420     CON_IFVARVARXOR,
421     CON_IFVARVAREITHER,
422     CON_IFVARVARBOTH,
423     CON_WHILEVARVARN,
424     CON_WHILEVARVARL,
425 
426 // other if*
427     CON_IFHITKEY,
428     CON_IFHOLDKEY,
429     CON_IFRND,
430 
431 // if* using current sprite
432     CON_IFANGDIFFL,
433     CON_IFSPRITEPAL,
434     CON_IFHIGHLIGHTED,
435     CON_IFACTOR,
436     CON_IFSOUND,
437     CON_IFPDISTL,
438     CON_IFPDISTG,
439 ///    CON_IFGAPZL,
440 ///    CON_IFFLOORDISTL,
441 ///    CON_IFCEILINGDISTL,
442 
443     CON_IFINSIDE,
444 
445     CON_IFEITHERALT,
446     CON_IFEITHERCTRL,
447     CON_IFEITHERSHIFT,
448     CON_IFAWAYFROMWALL,
449     CON_IFCANSEE,
450     CON_IFONWATER,
451     CON_IFINWATER,
452     CON_IFOUTSIDE,
453 ///    CON_IFHITSPACE,
454 ///    CON_IFINSPACE,
455 ///    CON_IFINOUTERSPACE,
456 ///    CON_IFCANSEETARGET,
457     CON_IFNOSOUNDS,
458     CON_IFIN3DMODE,
459     CON_IFAIMINGSPRITE,
460     CON_IFAIMINGWALL,
461     CON_IFAIMINGSECTOR,
462     CON_IFINTERACTIVE,
463 
464 // keyboard
465     CON_RESETKEY,
466     CON_SETKEY,
467 
468 // BUILD functions
469     CON_INSERTSPRITE,
470     CON_DUPSPRITE,
471     CON_TDUPSPRITE,
472     CON_DELETESPRITE,
473     CON_GETSPRITELINKTYPE,
474     CON_LASTWALL,
475     CON_UPDATECURSECTNUM,
476     CON_UPDATESECTOR,
477     CON_UPDATESECTORZ,
478     CON_UPDATESECTORNEIGHBOR,
479     CON_UPDATESECTORNEIGHBORZ,
480     CON_GETZRANGE,
481     CON_CLIPMOVE,
482     CON_LINEINTERSECT,
483     CON_RAYINTERSECT,
484     CON_HITSCAN,
485     CON_CANSEE,
486     CON_CANSEESPR,
487     CON_NEARTAG,
488     CON_ROTATEPOINT,
489     CON_DRAGPOINT,
490     CON_GETCEILZOFSLOPE,
491     CON_GETFLORZOFSLOPE,
492     CON_ALIGNCEILSLOPE,
493     CON_ALIGNFLORSLOPE,
494     CON_BSETSPRITE,  // was CON_SETSPRITE
495     CON_SETFIRSTWALL,
496     CON_CHANGESPRITESTAT,
497     CON_CHANGESPRITESECT,
498     CON_HEADSPRITESTAT,
499     CON_PREVSPRITESTAT,
500     CON_NEXTSPRITESTAT,
501     CON_HEADSPRITESECT,
502     CON_PREVSPRITESECT,
503     CON_NEXTSPRITESECT,
504     CON_SECTOROFWALL,
505     CON_FIXREPEATS,
506     CON_GETCLOSESTCOL,
507 
508 // stuff
509     CON_UPDATEHIGHLIGHT,
510     CON_UPDATEHIGHLIGHTSECTOR,
511     CON_SETHIGHLIGHT,
512     CON_SETHIGHLIGHTSECTOR,
513     CON_ADDLOGVAR,
514     CON_ADDLOG,
515     CON_DEBUG,
516 
517 // strings
518     CON_DEFINEQUOTE,
519     CON_REDEFINEQUOTE,
520     CON_PRINT,
521     CON_QUOTE,
522     CON_ERRORINS,
523     CON_PRINTMESSAGE16,
524     CON_PRINTMESSAGE256,
525     CON_PRINTEXT256,
526     CON_PRINTEXT16,
527     CON_DRAWLABEL,
528     CON_GETNUMBER16,
529     CON_GETNUMBER256,
530     CON_GETNUMBERFROMUSER,
531     CON_QSPRINTF,
532     CON_QSTRCAT,
533     CON_QSTRCPY,
534     CON_QSTRLEN,
535 //    CON_QGETSYSSTR,
536     CON_QSTRNCAT,
537     CON_QSUBSTR,
538 
539 // findnear*
540     CON_FINDNEARSPRITE,
541     CON_FINDNEARSPRITEVAR,
542     CON_FINDNEARSPRITE3D,
543     CON_FINDNEARSPRITE3DVAR,
544     CON_FINDNEARSPRITEZ,
545     CON_FINDNEARSPRITEZVAR,
546 
547     CON_GETTICKS,
548     CON_GETTIMEDATE,
549     CON_SETASPECT,
550 
551 // vvv stuff using current sprite
552     CON_SETI,
553     CON_SIZEAT,
554     CON_CSTAT,
555     CON_CSTATOR,
556     CON_CLIPDIST,
557     CON_SPRITEPAL,
558     CON_CACTOR,
559     CON_SPGETLOTAG,
560     CON_SPGETHITAG,
561     CON_SECTGETLOTAG,
562     CON_SECTGETHITAG,
563     CON_GETTEXTUREFLOOR,
564     CON_GETTEXTURECEILING,
565 ///    CON_KILLIT,
566 
567 // left to define later/undecided
568 
569 // sound
570     CON_SOUNDVAR,
571     CON_SOUNDONCEVAR,
572     CON_STOPALLSOUNDS,
573     CON_STOPSOUNDVAR,
574     CON_GLOBALSOUNDVAR,
575     CON_GETSOUNDFLAGS,
576 ///    CON_SOUND,
577 ///    CON_SOUNDONCE,
578 ///    CON_STOPSOUND,
579 ///    CON_GLOBALSOUND,
580 
581 // drawing
582 ///    CON_MYOS,
583 ///    CON_MYOSPAL,
584 ///    CON_MYOSX,
585 ///    CON_MYOSPALX,
586 ///    CON_MINITEXT,
587 ///    CON_GAMETEXT,
588 ///    CON_DIGITALNUMBER,
589 ///    CON_SHOWVIEW,
590 ///    CON_GAMETEXTZ,
591 ///    CON_DIGITALNUMBERZ,
592     CON_DRAWLINE16,
593     CON_DRAWLINE16B,
594     CON_DRAWLINE16Z,
595     CON_DRAWLINE256,
596     CON_DRAWCIRCLE16,
597     CON_DRAWCIRCLE16B,
598     CON_DRAWCIRCLE16Z,
599     CON_ROTATESPRITEA,
600     CON_ROTATESPRITE16,
601     CON_ROTATESPRITE,
602     CON_SETGAMEPALETTE,
603 
604 ///    CON_TIME,
605 ///    CON_GETANGLETOTARGET,
606 ///    CON_ANGOFF,
607 ///    CON_ANGOFFVAR,
608 ///    CON_PRECACHE,
609 ///    CON_SAVEGAMEVAR,
610 ///    CON_READGAMEVAR,
611 ///    CON_SETDEFNAME,
612 ///    CON_SETCFGNAME,
613 
614     CON_END
615 };
616 
617 #endif
618