mirror of
https://github.com/DrBeef/Raze.git
synced 2024-11-16 01:11:28 +00:00
39314586ac
The main change consist of adding a key press (and release) callback whose only purpose is to be used from m32script as EVENT_KEYPRESS. When entering that event, the RETURN variable will be set to the keystatus code of the key, and whether it was pressed or released can be checked by looking at keystatus[] at that code (ifholdkey and ifhitkey do this). The purpose of this, then, is to be able to remap keys in a more general (and complicated) fashion than is possible with the mapster32.cfg 'remap' option. Various other additions build around this central one: - add an example EVENT_KEYPRESS to a.m32, among other things emulating the keypad arrows with Alt-<normal arrows> for notebook convenience; disabled initially - a.m32: set 'owner' with Alt-KP2: now Alt-Shift-KP2, because of collision with the above - new m32script command: setkey <keycode>, setting keystatus[<keycode>] to 1 (note: may be restricted to use in EVENT_KEYPRESS only in the future) - fix indexing an m32script array with a defined label, there used to be a 'not a gamevar' error instead - add the following constant labels for some key codes: KEY_SCROLL, KEY_F1 .. KEY_F12 git-svn-id: https://svn.eduke32.com/eduke32@2122 1a8010ca-5511-0410-912e-c29ae57300e0
600 lines
12 KiB
C
600 lines
12 KiB
C
//-------------------------------------------------------------------------
|
|
/*
|
|
Copyright (C) 1996, 2003 - 3D Realms Entertainment
|
|
Copyright (C) 2000, 2003 - Matt Saettler (EDuke Enhancements)
|
|
Copyright (C) 2004, 2007 - EDuke32 developers
|
|
|
|
This file is part of EDuke32
|
|
|
|
EDuke32 is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License version 2
|
|
as published by the Free Software Foundation.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
*/
|
|
//-------------------------------------------------------------------------
|
|
|
|
#ifndef _m32def_h_
|
|
#define _m32def_h_
|
|
|
|
// the parsing routines aren't good at error recovery yet...
|
|
#define ABORTERRCNT 1
|
|
|
|
// these two are for m32def.c
|
|
#define C_CUSTOMERROR(Text, ...) do { \
|
|
C_ReportError(-1); \
|
|
initprintf("%s:%d: error: " Text "\n", g_szScriptFileName, g_lineNumber, ## __VA_ARGS__); \
|
|
C_PrintErrorPosition(); \
|
|
g_numCompilerErrors++; \
|
|
} while (0)
|
|
#define C_CUSTOMWARNING(Text, ...) do { \
|
|
C_ReportError(-1); \
|
|
initprintf("%s:%d: warning: " Text "\n", g_szScriptFileName, g_lineNumber, ## __VA_ARGS__); \
|
|
C_PrintErrorPosition(); \
|
|
g_numCompilerWarnings++; \
|
|
} while (0)
|
|
|
|
extern void C_PrintErrorPosition();
|
|
extern void C_ReportError(int32_t iError);
|
|
|
|
extern char g_szScriptFileName[BMAX_PATH];
|
|
extern int32_t g_totalLines, g_lineNumber;
|
|
extern int32_t g_numCompilerErrors, g_numCompilerWarnings;
|
|
|
|
extern int32_t g_didDefineSomething;
|
|
|
|
extern instype *g_scriptPtr;
|
|
|
|
void C_Compile(const char *filenameortext, int32_t isfilename);
|
|
void C_CompilationInfo(void);
|
|
|
|
void registerMenuFunction(const char *funcname, ofstype scriptofs);
|
|
void M32_PostScriptExec(void);
|
|
|
|
typedef struct
|
|
{
|
|
int32_t ofs; // offset into script[]
|
|
int32_t codesize;
|
|
uint16_t numlocals; // number of local int32_t vars to allocate
|
|
char name[MAXLABELLEN];
|
|
} statesinfo_t;
|
|
|
|
extern statesinfo_t *statesinfo;
|
|
extern int32_t g_stateCount;
|
|
|
|
|
|
typedef struct
|
|
{
|
|
const char *name;
|
|
int16_t lId;
|
|
int16_t flags; // 1: read-only
|
|
int32_t min, max;
|
|
} memberlabel_t;
|
|
|
|
extern const memberlabel_t SectorLabels[];
|
|
extern const memberlabel_t WallLabels[];
|
|
extern const memberlabel_t SpriteLabels[];
|
|
extern const memberlabel_t LightLabels[];
|
|
|
|
|
|
typedef struct {
|
|
const char* token;
|
|
int32_t val;
|
|
} tokenmap_t;
|
|
|
|
extern const tokenmap_t iter_tokens[];
|
|
|
|
enum vmflags
|
|
{
|
|
VMFLAG_RETURN = 1,
|
|
VMFLAG_BREAK = 2,
|
|
VMFLAG_ERROR = 4,
|
|
};
|
|
|
|
enum miscvmflags
|
|
{
|
|
VMFLAG_MISC_UPDATEHL = 1,
|
|
VMFLAG_MISC_UPDATEHLSECT = 2,
|
|
VMFLAG_MISC_INTERACTIVE = 4,
|
|
};
|
|
|
|
typedef struct {
|
|
int32_t g_i;
|
|
// VM state: either ==0 (top-level), >=1 and < MAXEVENTS+1 (event),
|
|
// or >= MAXEVENTS+1 and < MAXEVENTS+1+g_stateCount (state)
|
|
int32_t g_st;
|
|
spritetype *g_sp;
|
|
uint32_t flags; //g_errorFlag, g_returnFlag;
|
|
|
|
// 1:updatehighlight, 2:updatehighlightsector, 4:interactive (from menu)?
|
|
uint32_t miscflags;
|
|
} vmstate_t;
|
|
|
|
extern vmstate_t vm;
|
|
extern vmstate_t vm_default;
|
|
|
|
|
|
extern int32_t g_errorLineNum;
|
|
extern int32_t g_tw;
|
|
extern const char *keyw[];
|
|
|
|
enum SystemString_t {
|
|
STR_MAPFILENAME,
|
|
STR_VERSION,
|
|
};
|
|
|
|
enum ScriptError_t
|
|
{
|
|
ERROR_CLOSEBRACKET,
|
|
ERROR_EVENTONLY,
|
|
// ERROR_EXCEEDSMAXTILES,
|
|
ERROR_EXPECTEDKEYWORD,
|
|
ERROR_FOUNDWITHIN,
|
|
ERROR_ISAKEYWORD,
|
|
ERROR_NOENDSWITCH,
|
|
ERROR_NOTAGAMEDEF,
|
|
ERROR_NOTAGAMEVAR,
|
|
ERROR_NOTAGAMEARRAY,
|
|
ERROR_GAMEARRAYBNC,
|
|
ERROR_GAMEARRAYBNO,
|
|
ERROR_INVALIDARRAYWRITE,
|
|
ERROR_EXPECTEDSIMPLEVAR,
|
|
ERROR_OPENBRACKET,
|
|
ERROR_PARAMUNDEFINED,
|
|
ERROR_SYMBOLNOTRECOGNIZED,
|
|
ERROR_SYNTAXERROR,
|
|
ERROR_VARREADONLY,
|
|
ERROR_ARRAYREADONLY,
|
|
ERROR_VARTYPEMISMATCH,
|
|
ERROR_LABELINUSE,
|
|
// WARNING_BADGAMEVAR,
|
|
WARNING_DUPLICATECASE,
|
|
WARNING_DUPLICATEDEFINITION,
|
|
WARNING_LABELSONLY,
|
|
WARNING_NAMEMATCHESVAR,
|
|
// WARNING_CONSTANTBITSIZE,
|
|
WARNING_OUTSIDEDRAWSPRITE,
|
|
};
|
|
|
|
|
|
enum SectorLabel_t
|
|
{
|
|
SECTOR_WALLPTR,
|
|
SECTOR_WALLNUM,
|
|
SECTOR_CEILINGZ,
|
|
SECTOR_FLOORZ,
|
|
SECTOR_CEILINGSTAT,
|
|
SECTOR_FLOORSTAT,
|
|
SECTOR_CEILINGPICNUM,
|
|
SECTOR_CEILINGSLOPE,
|
|
SECTOR_CEILINGSHADE,
|
|
SECTOR_CEILINGPAL,
|
|
SECTOR_CEILINGXPANNING,
|
|
SECTOR_CEILINGYPANNING,
|
|
SECTOR_FLOORPICNUM,
|
|
SECTOR_FLOORSLOPE,
|
|
SECTOR_FLOORSHADE,
|
|
SECTOR_FLOORPAL,
|
|
SECTOR_FLOORXPANNING,
|
|
SECTOR_FLOORYPANNING,
|
|
SECTOR_VISIBILITY,
|
|
SECTOR_ALIGNTO,
|
|
SECTOR_LOTAG,
|
|
SECTOR_HITAG,
|
|
SECTOR_EXTRA,
|
|
SECTOR_END
|
|
};
|
|
|
|
enum WallLabel_t
|
|
{
|
|
WALL_X,
|
|
WALL_Y,
|
|
WALL_POINT2,
|
|
WALL_NEXTWALL,
|
|
WALL_NEXTSECTOR,
|
|
WALL_CSTAT,
|
|
WALL_PICNUM,
|
|
WALL_OVERPICNUM,
|
|
WALL_SHADE,
|
|
WALL_PAL,
|
|
WALL_XREPEAT,
|
|
WALL_YREPEAT,
|
|
WALL_XPANNING,
|
|
WALL_YPANNING,
|
|
WALL_LOTAG,
|
|
WALL_HITAG,
|
|
WALL_EXTRA,
|
|
WALL_END
|
|
};
|
|
|
|
enum SpriteLabel_t
|
|
{
|
|
SPRITE_X, // 0
|
|
SPRITE_Y,
|
|
SPRITE_Z,
|
|
SPRITE_CSTAT,
|
|
SPRITE_PICNUM,
|
|
SPRITE_SHADE, // 5
|
|
SPRITE_PAL,
|
|
SPRITE_CLIPDIST,
|
|
SPRITE_DETAIL,
|
|
SPRITE_XREPEAT,
|
|
SPRITE_YREPEAT, // 10
|
|
SPRITE_XOFFSET,
|
|
SPRITE_YOFFSET,
|
|
SPRITE_SECTNUM,
|
|
SPRITE_STATNUM,
|
|
SPRITE_ANG, // 15
|
|
SPRITE_OWNER,
|
|
SPRITE_XVEL,
|
|
SPRITE_YVEL,
|
|
SPRITE_ZVEL,
|
|
SPRITE_LOTAG, // 20
|
|
SPRITE_HITAG,
|
|
SPRITE_EXTRA,
|
|
|
|
LIGHT_X, // must be first here
|
|
LIGHT_Y,
|
|
LIGHT_Z, // 25
|
|
LIGHT_HORIZ,
|
|
LIGHT_RANGE,
|
|
LIGHT_ANGLE,
|
|
LIGHT_FADERADIUS,
|
|
LIGHT_RADIUS, // 30
|
|
LIGHT_SECTOR,
|
|
LIGHT_R,
|
|
LIGHT_G,
|
|
LIGHT_B,
|
|
LIGHT_PRIORITY, // 35
|
|
LIGHT_TILENUM,
|
|
LIGHT_MINSHADE,
|
|
LIGHT_MAXSHADE,
|
|
LIGHT_ACTIVE,
|
|
|
|
SPRITE_END
|
|
};
|
|
|
|
enum IterationTypes_t
|
|
{
|
|
ITER_ALLSPRITES,
|
|
ITER_ALLSECTORS,
|
|
ITER_ALLWALLS,
|
|
ITER_ACTIVELIGHTS,
|
|
ITER_SELSPRITES,
|
|
ITER_SELSECTORS,
|
|
ITER_SELWALLS,
|
|
ITER_DRAWNSPRITES,
|
|
// ---
|
|
ITER_SPRITESOFSECTOR,
|
|
ITER_WALLSOFSECTOR,
|
|
ITER_LOOPOFWALL,
|
|
ITER_RANGE,
|
|
ITER_END
|
|
};
|
|
|
|
enum ScriptKeywords_t
|
|
{
|
|
// basic commands
|
|
CON_NULLOP,
|
|
CON_DEFINE,
|
|
CON_INCLUDE,
|
|
CON_DEFSTATE,
|
|
CON_ENDS,
|
|
CON_STATE,
|
|
CON_ONEVENT,
|
|
CON_ENDEVENT,
|
|
CON_GAMEVAR,
|
|
|
|
// control flow (except if*)
|
|
CON_ELSE,
|
|
CON_RETURN,
|
|
CON_BREAK,
|
|
CON_SWITCH,
|
|
CON_CASE,
|
|
CON_DEFAULT,
|
|
CON_ENDSWITCH,
|
|
CON_GETCURRADDRESS,
|
|
CON_JUMP,
|
|
CON_LEFTBRACE,
|
|
CON_RIGHTBRACE,
|
|
|
|
#if 0
|
|
// more basic commands
|
|
CON_SETSECTOR,
|
|
CON_GETSECTOR,
|
|
CON_SETWALL,
|
|
CON_GETWALL,
|
|
CON_SETSPRITE, //+
|
|
CON_GETSPRITE, //+
|
|
CON_GETTSPR,
|
|
CON_SETTSPR,
|
|
#endif
|
|
|
|
// arrays
|
|
CON_GAMEARRAY,
|
|
CON_SETARRAY,
|
|
CON_GETARRAYSIZE,
|
|
CON_RESIZEARRAY,
|
|
CON_COPY,
|
|
/// CON_WRITEARRAYTOFILE,
|
|
/// CON_READARRAYFROMFILE,
|
|
|
|
// var ops
|
|
CON_RANDVAR,
|
|
CON_DISPLAYRANDVAR,
|
|
CON_SETVAR,
|
|
CON_ADDVAR,
|
|
CON_SUBVAR,
|
|
CON_MULVAR,
|
|
CON_DIVVAR,
|
|
CON_MODVAR,
|
|
CON_ANDVAR,
|
|
CON_ORVAR,
|
|
CON_XORVAR,
|
|
CON_SHIFTVARL,
|
|
CON_SHIFTVARR,
|
|
// varvar ops
|
|
CON_RANDVARVAR,
|
|
CON_DISPLAYRANDVARVAR,
|
|
CON_SETVARVAR,
|
|
CON_ADDVARVAR,
|
|
CON_SUBVARVAR,
|
|
CON_MULVARVAR,
|
|
CON_DIVVARVAR,
|
|
CON_MODVARVAR,
|
|
CON_ANDVARVAR,
|
|
CON_ORVARVAR,
|
|
CON_XORVARVAR,
|
|
CON_SHIFTVARVARL,
|
|
CON_SHIFTVARVARR,
|
|
CON_SIN,
|
|
CON_COS,
|
|
|
|
// random
|
|
CON_DISPLAYRAND,
|
|
|
|
// other math
|
|
CON_ITOF,
|
|
CON_FTOI,
|
|
CON_CLAMP,
|
|
CON_INV,
|
|
CON_SQRT,
|
|
CON_MULSCALE,
|
|
CON_DIVSCALE,
|
|
CON_DIST,
|
|
CON_LDIST,
|
|
CON_CALCHYPOTENUSE,
|
|
CON_GETANGLE,
|
|
CON_GETINCANGLE,
|
|
CON_A2XY,
|
|
CON_AH2XYZ,
|
|
|
|
CON_COLLECTSECTORS,
|
|
CON_SORT,
|
|
CON_FOR,
|
|
|
|
// if & while var
|
|
CON_IFVARL,
|
|
CON_IFVARLE,
|
|
CON_IFVARG,
|
|
CON_IFVARGE,
|
|
CON_IFVARE,
|
|
CON_IFVARN,
|
|
CON_IFVARAND,
|
|
CON_IFVAROR,
|
|
CON_IFVARXOR,
|
|
CON_IFVAREITHER,
|
|
CON_IFVARBOTH,
|
|
CON_WHILEVARN,
|
|
CON_WHILEVARL,
|
|
|
|
// if & while varvar
|
|
CON_IFVARVARL,
|
|
CON_IFVARVARLE,
|
|
CON_IFVARVARG,
|
|
CON_IFVARVARGE,
|
|
CON_IFVARVARE,
|
|
CON_IFVARVARN,
|
|
CON_IFVARVARAND,
|
|
CON_IFVARVAROR,
|
|
CON_IFVARVARXOR,
|
|
CON_IFVARVAREITHER,
|
|
CON_IFVARVARBOTH,
|
|
CON_WHILEVARVARN,
|
|
CON_WHILEVARVARL,
|
|
|
|
// other if*
|
|
CON_IFHITKEY,
|
|
CON_IFHOLDKEY,
|
|
CON_IFRND,
|
|
|
|
// if* using current sprite
|
|
CON_IFANGDIFFL,
|
|
CON_IFSPRITEPAL,
|
|
CON_IFHIGHLIGHTED,
|
|
CON_IFACTOR,
|
|
CON_IFSOUND,
|
|
CON_IFPDISTL,
|
|
CON_IFPDISTG,
|
|
/// CON_IFGAPZL,
|
|
/// CON_IFFLOORDISTL,
|
|
/// CON_IFCEILINGDISTL,
|
|
|
|
CON_IFINSIDE,
|
|
|
|
CON_IFEITHERALT,
|
|
CON_IFEITHERCTRL,
|
|
CON_IFEITHERSHIFT,
|
|
CON_IFAWAYFROMWALL,
|
|
CON_IFCANSEE,
|
|
CON_IFONWATER,
|
|
CON_IFINWATER,
|
|
CON_IFOUTSIDE,
|
|
/// CON_IFHITSPACE,
|
|
/// CON_IFINSPACE,
|
|
/// CON_IFINOUTERSPACE,
|
|
/// CON_IFCANSEETARGET,
|
|
CON_IFNOSOUNDS,
|
|
CON_IFIN3DMODE,
|
|
CON_IFAIMINGSPRITE,
|
|
CON_IFAIMINGWALL,
|
|
CON_IFAIMINGSECTOR,
|
|
CON_IFINTERACTIVE,
|
|
|
|
// keyboard
|
|
CON_RESETKEY,
|
|
CON_SETKEY,
|
|
|
|
// BUILD functions
|
|
CON_INSERTSPRITE,
|
|
CON_DUPSPRITE,
|
|
CON_TDUPSPRITE,
|
|
CON_DELETESPRITE,
|
|
CON_LASTWALL,
|
|
CON_UPDATECURSECTNUM,
|
|
CON_UPDATESECTOR,
|
|
CON_UPDATESECTORZ,
|
|
CON_GETZRANGE,
|
|
CON_CLIPMOVE,
|
|
CON_LINEINTERSECT,
|
|
CON_RAYINTERSECT,
|
|
CON_HITSCAN,
|
|
CON_CANSEE,
|
|
CON_CANSEESPR,
|
|
CON_NEARTAG,
|
|
CON_ROTATEPOINT,
|
|
CON_DRAGPOINT,
|
|
CON_GETCEILZOFSLOPE,
|
|
CON_GETFLORZOFSLOPE,
|
|
CON_ALIGNCEILSLOPE,
|
|
CON_ALIGNFLORSLOPE,
|
|
CON_BSETSPRITE, // was CON_SETSPRITE
|
|
CON_SETFIRSTWALL,
|
|
CON_CHANGESPRITESTAT,
|
|
CON_CHANGESPRITESECT,
|
|
CON_HEADSPRITESTAT,
|
|
CON_PREVSPRITESTAT,
|
|
CON_NEXTSPRITESTAT,
|
|
CON_HEADSPRITESECT,
|
|
CON_PREVSPRITESECT,
|
|
CON_NEXTSPRITESECT,
|
|
CON_SECTOROFWALL,
|
|
CON_FIXREPEATS,
|
|
CON_GETCLOSESTCOL,
|
|
|
|
// stuff
|
|
CON_UPDATEHIGHLIGHT,
|
|
CON_UPDATEHIGHLIGHTSECTOR,
|
|
CON_SETHIGHLIGHT,
|
|
CON_SETHIGHLIGHTSECTOR,
|
|
CON_ADDLOGVAR,
|
|
CON_ADDLOG,
|
|
CON_DEBUG,
|
|
|
|
// strings
|
|
CON_DEFINEQUOTE,
|
|
CON_REDEFINEQUOTE,
|
|
CON_PRINT,
|
|
CON_QUOTE,
|
|
CON_ERRORINS,
|
|
CON_PRINTMESSAGE16,
|
|
CON_PRINTMESSAGE256,
|
|
CON_PRINTEXT256,
|
|
CON_PRINTEXT16,
|
|
CON_DRAWLABEL,
|
|
CON_GETNUMBER16,
|
|
CON_GETNUMBER256,
|
|
CON_GETNUMBERFROMUSER,
|
|
CON_QSPRINTF,
|
|
CON_QSTRCAT,
|
|
CON_QSTRCPY,
|
|
CON_QSTRLEN,
|
|
// CON_QGETSYSSTR,
|
|
CON_QSTRNCAT,
|
|
CON_QSUBSTR,
|
|
|
|
// findnear*
|
|
CON_FINDNEARSPRITE,
|
|
CON_FINDNEARSPRITEVAR,
|
|
CON_FINDNEARSPRITE3D,
|
|
CON_FINDNEARSPRITE3DVAR,
|
|
CON_FINDNEARSPRITEZ,
|
|
CON_FINDNEARSPRITEZVAR,
|
|
|
|
CON_GETTICKS,
|
|
CON_GETTIMEDATE,
|
|
CON_SETASPECT,
|
|
|
|
// vvv stuff using current sprite
|
|
CON_SETI,
|
|
CON_SIZEAT,
|
|
CON_CSTAT,
|
|
CON_CSTATOR,
|
|
CON_CLIPDIST,
|
|
CON_SPRITEPAL,
|
|
CON_CACTOR,
|
|
CON_SPGETLOTAG,
|
|
CON_SPGETHITAG,
|
|
CON_SECTGETLOTAG,
|
|
CON_SECTGETHITAG,
|
|
CON_GETTEXTUREFLOOR,
|
|
CON_GETTEXTURECEILING,
|
|
/// CON_KILLIT,
|
|
|
|
// left to define later/undecided
|
|
|
|
// sound
|
|
CON_SOUNDVAR,
|
|
CON_SOUNDONCEVAR,
|
|
CON_STOPALLSOUNDS,
|
|
CON_STOPSOUNDVAR,
|
|
CON_GLOBALSOUNDVAR,
|
|
CON_GETSOUNDFLAGS,
|
|
/// CON_SOUND,
|
|
/// CON_SOUNDONCE,
|
|
/// CON_STOPSOUND,
|
|
/// CON_GLOBALSOUND,
|
|
|
|
// drawing
|
|
/// CON_MYOS,
|
|
/// CON_MYOSPAL,
|
|
/// CON_MYOSX,
|
|
/// CON_MYOSPALX,
|
|
/// CON_MINITEXT,
|
|
/// CON_GAMETEXT,
|
|
/// CON_DIGITALNUMBER,
|
|
/// CON_SHOWVIEW,
|
|
/// CON_GAMETEXTZ,
|
|
/// CON_DIGITALNUMBERZ,
|
|
CON_DRAWLINE16,
|
|
CON_DRAWLINE16B,
|
|
CON_DRAWLINE16Z,
|
|
CON_DRAWCIRCLE16,
|
|
CON_DRAWCIRCLE16B,
|
|
CON_DRAWCIRCLE16Z,
|
|
CON_ROTATESPRITE16,
|
|
CON_ROTATESPRITE,
|
|
CON_SETGAMEPALETTE,
|
|
|
|
/// CON_TIME,
|
|
/// CON_GETANGLETOTARGET,
|
|
/// CON_ANGOFF,
|
|
/// CON_ANGOFFVAR,
|
|
/// CON_PRECACHE,
|
|
/// CON_SAVEGAMEVAR,
|
|
/// CON_READGAMEVAR,
|
|
/// CON_SETDEFNAME,
|
|
/// CON_SETCFGNAME,
|
|
|
|
CON_END
|
|
};
|
|
|
|
#endif
|