srb2lua {
	name = "SRB2 Lua Script";
	comment_begin = "--[[", "/*";
	comment_end =  "]]", "*/";
	comment_line = "--", "//";
	case_sensitive = true;
	block_begin = "{";
	block_end = "}";
	word_block_begin = "do", "function", "if";
	word_block_end = "end";

	keywords = {
		and, break, continue, do, else, elseif, end, false, for, function,
		if, in, local, nil, not, or, repeat, return, then, true, until, while,
		$1, $2, $3, $4, $5, $6, $7, $8, $9,
	}

	properties = {
		// Namespaces
		input, ease, hud, coroutine, string, io, table, os,

		// Userdata
		players, mobjs, skins, mapthings, sectors, subsectors, lines, sides, vertexes, polyobjects,
	}

	constants = {
		false,
		true,
		nil,

		// Integer type limits
		INT8_MIN,
		INT8_MAX,
		INT16_MIN,
		INT16_MAX,
		INT32_MIN,
		INT32_MAX,

		UINT8_MAX,
		UINT16_MAX,
		UINT32_MAX,

		// Angles
		ANG1,
		ANG2,
		ANG10,
		ANG15,
		ANG20,
		ANG30,
		ANG60,
		ANG64h,
		ANG105,
		ANG210,
		ANG255,
		ANG340,
		ANG350,

		ANGLE_11hh,
		ANGLE_22h,
		ANGLE_45,
		ANGLE_67h,
		ANGLE_90,
		ANGLE_112h,
		ANGLE_135,
		ANGLE_157h,
		ANGLE_180,
		ANGLE_202h,
		ANGLE_225,
		ANGLE_247h,
		ANGLE_270,
		ANGLE_292h,
		ANGLE_315,
		ANGLE_337h,

		ANGLE_MAX,

		// Miscellaneous
		FRACUNIT,
		FRACBITS,
		TICRATE,
		MUSICRATE,
		RING_DIST,
		PUSHACCEL,
		MODID,
		MODVERSION,
		CODEBASE,
		VERSION,
		VERSIONSTRING,
		SUBVERSION,
		FLOATSPEED,
		MAXSTEPMOVE,
		USERANGE,
		MELEERANGE,
		MISSILERANGE,
		ONFLOORZ,
		ONCEILINGZ,
		INFLIVES,
		JOYAXISRANGE,

		// Object flags (MF_*)
		MF_SPECIAL,
		MF_SOLID,
		MF_SHOOTABLE,
		MF_NOSECTOR,
		MF_NOBLOCKMAP,
		MF_PAPERCOLLISION,
		MF_PUSHABLE,
		MF_BOSS,
		MF_SPAWNCEILING,
		MF_NOGRAVITY,
		MF_AMBIENT,
		MF_SLIDEME,
		MF_NOCLIP,
		MF_FLOAT,
		MF_BOXICON,
		MF_MISSILE,
		MF_SPRING,
		MF_BOUNCE,
		MF_MONITOR,
		MF_NOTHINK,
		MF_FIRE,
		MF_NOCLIPHEIGHT,
		MF_ENEMY,
		MF_SCENERY,
		MF_PAIN,
		MF_STICKY,
		MF_NIGHTSITEM,
		MF_NOCLIPTHING,
		MF_GRENADEBOUNCE,
		MF_RUNSPAWNFUNC,

		// Secondary object flags (MF2_*)
		MF2_AXIS,
		MF2_TWOD,
		MF2_DONTRESPAWN,
		MF2_DONTDRAW,
		MF2_AUTOMATIC,
		MF2_RAILRING,
		MF2_BOUNCERING,
		MF2_EXPLOSION,
		MF2_SCATTER,
		MF2_BEYONDTHEGRAVE,
		MF2_SLIDEPUSH,
		MF2_CLASSICPUSH,
		MF2_INVERTAIMABLE,
		MF2_INFLOAT,
		MF2_DEBRIS,
		MF2_NIGHTSPULL,
		MF2_JUSTATTACKED,
		MF2_FIRING,
		MF2_SUPERFIRE,
		MF2_SHADOW,
		MF2_STRONGBOX,
		MF2_OBJECTFLIP,
		MF2_SKULLFLY,
		MF2_FRET,
		MF2_BOSSNOTRAP,
		MF2_BOSSFLEE,
		MF2_BOSSDEAD,
		MF2_AMBUSH,
		MF2_LINKDRAW,
		MF2_SHIELD,
		MF2_SPLAT,

		// Extra object flags (MFE_*)
		MFE_ONGROUND,
		MFE_JUSTHITFLOOR,
		MFE_TOUCHWATER,
		MFE_UNDERWATER,
		MFE_JUSTSTEPPEDDOWN,
		MFE_VERTICALFLIP,
		MFE_GOOWATER,
		MFE_TOUCHLAVA,
		MFE_PUSHED,
		MFE_SPRUNG,
		MFE_APPLYPMOMZ,
		MFE_TRACERANGLE,

		// Mapthing flags (MTF_*)
		MTF_EXTRA,
		MTF_OBJECTFLIP,
		MTF_OBJECTSPECIAL,
		MTF_AMBUSH,

		// Translucency levels (tr_*, TR_*)
		tr_trans10,
		tr_trans20,
		tr_trans30,
		tr_trans40,
		tr_trans50,
		tr_trans60,
		tr_trans70,
		tr_trans80,
		tr_trans90,

		TR_TRANS10,
		TR_TRANS20,
		TR_TRANS30,
		TR_TRANS40,
		TR_TRANS50,
		TR_TRANS60,
		TR_TRANS70,
		TR_TRANS80,
		TR_TRANS90,

		NUMTRANSMAPS,

		// Frame flags (FF_*)
		FF_FRAMEMASK,
		FF_BLENDMASK,
		FF_TRANSMASK,
		FF_BRIGHTMASK,

		FF_BLENDSHIFT,
		FF_TRANSSHIFT,

		FF_SPR2SUPER,
		FF_SPR2ENDSTATE,
		FF_SPR2MIDSTART,

		FF_ADD,
		FF_SUBTRACT,
		FF_REVERSESUBTRACT,
		FF_MODULATE,

		FF_TRANS10,
		FF_TRANS20,
		FF_TRANS30,
		FF_TRANS40,
		FF_TRANS50,
		FF_TRANS60,
		FF_TRANS70,
		FF_TRANS80,
		FF_TRANS90,

		FF_FULLBRIGHT,
		FF_FULLDARK,
		FF_SEMIBRIGHT,

		FF_PAPERSPRITE,
		FF_FLOORSPRITE,

		FF_VERTICALFLIP,
		FF_HORIZONTALFLIP,

		FF_ANIMATE,
		FF_GLOBALANIM,
		FF_RANDOMANIM,

		// Render flags (RF_*)
		RF_SPLATMASK,
		RF_BRIGHTMASK,
		RF_SPRITETYPEMASK,

		RF_HORIZONTALFLIP,
		RF_VERTICALFLIP,
		RF_ABSOLUTEOFFSETS,
		RF_FLIPOFFSETS,
		RF_SLOPESPLAT,
		RF_OBJECTSLOPESPLAT,
		RF_NOSPLATBILLBOARD,
		RF_NOSPLATROLLANGLE,
		RF_FULLBRIGHT,
		RF_FULLDARK,
		RF_SEMIBRIGHT,
		RF_NOCOLORMAPS,
		RF_PAPERSPRITE,
		RF_FLOORSPRITE,
		RF_SHADOWDRAW,
		RF_SHADOWEFFECTS,
		RF_DROPSHADOW,

		// Blending modes (AST_*)
		AST_COPY,
		AST_TRANSLUCENT,
		AST_ADD,
		AST_SUBTRACT,
		AST_REVERSESUBTRACT,
		AST_MODULATE,
		AST_OVERLAY,

		// Sound flags (SF_*)
		SF_TOTALLYSINGLE,
		SF_NOMULTIPLESOUND,
		SF_OUTSIDESOUND,
		SF_X2AWAYSOUND,
		SF_X4AWAYSOUND,
		SF_X8AWAYSOUND,
		SF_NOINTERRUPT,

		// Colormap constants (TC_*)
		TC_DEFAULT,
		TC_BOSS,
		TC_METALSONIC,
		TC_ALLWHITE,
		TC_RAINBOW,
		TC_BLINK,
		TC_DASHMODE,

		// Direction constants (DI_*)
		DI_NODIR,
		DI_EAST,
		DI_NORTHEAST,
		DI_NORTH,
		DI_NORTHWEST,
		DI_WEST,
		DI_SOUTHWEST,
		DI_SOUTH,
		DI_SOUTHEAST,

		NUMDIRS,

		// Damage/Death types (DMG_*)
		DMG_WATER,
		DMG_FIRE,
		DMG_ELECTRIC,
		DMG_SPIKE,
		DMG_NUKE,
		DMG_CANHURTSELF,

		DMG_INSTAKILL,
		DMG_DROWNED,
		DMG_SPACEDROWN,
		DMG_DEATHPIT,
		DMG_CRUSHED,
		DMG_SPECTATOR,
		DMG_DEATHMASK,

		// Skin flags (SF_*)
		SF_SUPER,
		SF_NOSUPERSPIN,
		SF_NOSPINDASHDUST,
		SF_HIRES,
		SF_NOSKID,
		SF_NOSPEEDADJUST,
		SF_RUNONWATER,
		SF_NOJUMPSPIN,
		SF_NOJUMPDAMAGE,
		SF_STOMPDAMAGE,
		SF_MARIODAMAGE,
		SF_MACHINE,
		SF_DASHMODE,
		SF_FASTEDGE,
		SF_MULTIABILITY,
		SF_NONIGHTSROTATION,
		SF_NONIGHTSSUPER,
		SF_NOSUPERSPRITES,
		SF_NOSUPERJUMPBOOST,
		SF_CANBUSTWALLS,
		SF_NOSHIELDABILITY,

		// Character abilities (CA_*, CA2_*)
		CA_NONE,
		CA_THOK,
		CA_FLY,
		CA_GLIDEANDCLIMB,
		CA_HOMINGTHOK,
		CA_SWIM,
		CA_DOUBLEJUMP,
		CA_FLOAT,
		CA_SLOWFALL,
		CA_TELEKINESIS,
		CA_FALLSWITCH,
		CA_JUMPBOOST,
		CA_AIRDRILL,
		CA_JUMPTHOK,
		CA_BOUNCE,
		CA_TWINSPIN,

		CA2_NONE,
		CA2_SPINDASH,
		CA2_GUNSLINGER,
		CA2_MELEE,

		// Player states (PST_*)
		PST_LIVE,
		PST_DEAD,
		PST_REBORN,

		// Skin sounds (SKS*)
		SKSPLPAN1,
		SKSPLPAN2,
		SKSPLPAN3,
		SKSPLPAN4,

		SKSPLDET1,
		SKSPLDET2,
		SKSPLDET3,
		SKSPLDET4,

		SKSPLVCT1,
		SKSPLVCT2,
		SKSPLVCT3,
		SKSPLVCT4,

		SKSSPIN,
		SKSPUTPUT,
		SKSPUDPUD,
		SKSTHOK,
		SKSSPNDSH,
		SKSZOOM,
		SKSSKID,
		SKSGASP,
		SKSJUMP,

		// Player flags (PF_*)
		PF_FLIPCAM,
		PF_ANALOGMODE,
		PF_DIRECTIONCHAR,
		PF_AUTOBRAKE,
		PF_GODMODE,
		PF_NOCLIP,
		PF_INVIS,
		PF_ATTACKDOWN,
		PF_SPINDOWN,
		PF_JUMPDOWN,
		PF_WPNDOWN,
		PF_STASIS,
		PF_JUMPSTASIS,
		PF_FULLSTASIS,
		PF_APPLYAUTOBRAKE,
		PF_STARTJUMP,
		PF_JUMPED,
		PF_NOJUMPDAMAGE,
		PF_SPINNING,
		PF_STARTDASH,
		PF_THOKKED,
		PF_SHIELDABILITY,
		PF_GLIDING,
		PF_BOUNCING,
		PF_SLIDING,
		PF_TRANSFERTOCLOSEST,
		PF_DRILLING,
		PF_GAMETYPEOVER,
		PF_TAGIT,
		PF_FORCESTRAFE,
		PF_CANCARRY,
		PF_FINISHED,

		// Player animation (PA_*)
		PA_ETC,
		PA_IDLE,
		PA_EDGE,
		PA_WALK,
		PA_RUN,
		PA_DASH,
		PA_PAIN,
		PA_ROLL,
		PA_JUMP,
		PA_SPRING,
		PA_FALL,
		PA_ABILITY,
		PA_ABILITY2,
		PA_RIDE,

		// Shield types/flags (SH_*)
		SH_NONE,
		SH_PITY,
		SH_WHIRLWIND,
		SH_ARMAGEDDON,
		SH_PINK,
		SH_ELEMENTAL,
		SH_ATTRACT,
		SH_FLAMEAURA,
		SH_BUBBLEWRAP,
		SH_THUNDERCOIN,
		SH_FORCE,
		SH_FORCEHP,
		SH_FIREFLOWER,
		SH_STACK,
		SH_NOSTACK,
		SH_PROTECTFIRE,
		SH_PROTECTWATER,
		SH_PROTECTELECTRIC,
		SH_PROTECTSPIKE,

		// Player powers (pw_*)
		pw_invulnerability,
		pw_sneakers,
		pw_flashing,
		pw_shield,
		pw_carry,
		pw_tailsfly,
		pw_underwater,
		pw_spacetime,
		pw_extralife,
		pw_pushing,
		pw_justsprung,
		pw_noautobrake,
		pw_super,
		pw_gravityboots,
		pw_infinityring,
		pw_automaticring,
		pw_bouncering,
		pw_scatterring,
		pw_granadering,
		pw_explosionring,
		pw_railring,
		pw_emeralds,
		pw_nights_superloop,
		pw_nights_helper,
		pw_nights_linkfreeze,
		pw_nocontrol,
		pw_dye,
		pw_justlaunched,
		pw_ignorelatch,
		pw_strong,

		// Carry types (CR_*)
		CR_NONE,
		CR_GENERIC,
		CR_PLAYER,
		CR_NIGHTSMODE,
		CR_NIGHTSFALL,
		CR_BRAKGOOP,
		CR_ZOOMTUBE,
		CR_ROPEHANG,
		CR_MACESPIN,
		CR_MINECART,
		CR_ROLLOUT,
		CR_PTERABYTE,
		CR_DUSTDEVIL,

		// pw_strong types (STR_*)
		STR_NONE,
		STR_ANIM,
		STR_PUNCH,
		STR_TAIL,
		STR_STOMP,
		STR_UPPER,
		STR_GUARD,
		STR_HEAVY,
		STR_DASH,
		STR_WALL,
		STR_FLOOR,
		STR_CEILING,
		STR_SPRING,
		STR_SPIKE,
		STR_ATTACK,
		STR_BUST,
		STR_FLY,
		STR_GLIDE,
		STR_TWINSPIN,
		STR_MELEE,
		STR_BOUNCE,
		STR_METAL,

		// Emeralds
		EMERALD1,
		EMERALD2,
		EMERALD3,
		EMERALD4,
		EMERALD5,
		EMERALD6,
		EMERALD7,

		// Button flags (BT_*)
		BT_WEAPONMASK,
		BT_WEAPONNEXT,
		BT_WEAPONPREV,
		BT_ATTACK,
		BT_SPIN,
		BT_CAMLEFT,
		BT_CAMRIGHT,
		BT_TOSSFLAG,
		BT_JUMP,
		BT_FIRENORMAL,
		BT_CUSTOM1,
		BT_CUSTOM2,
		BT_CUSTOM3,

		// Mouse button flags (MB_*)
		MB_BUTTON1,
		MB_BUTTON2,
		MB_BUTTON3,
		MB_BUTTON4,
		MB_BUTTON5,
		MB_BUTTON6,
		MB_BUTTON7,
		MB_BUTTON8,
		MB_SCROLLUP,
		MB_SCROLLDOWN,

		// Current weapon (WEP_*)
		WEP_AUTO,
		WEP_BOUNCE,
		WEP_SCATTER,
		WEP_GRENADE,
		WEP_EXPLODE,
		WEP_RAIL,

		NUMWEAPONS,

		// Ring weapon flags (RW_*)
		RW_AUTO,
		RW_BOUNCE,
		RW_SCATTER,
		RW_GRENADE,
		RW_EXPLODE,
		RW_RAILS,

		// P_FlashPal palettes (PAL_*)
		PAL_WHITE,
		PAL_MIXUP,
		PAL_RECYCLE,
		PAL_NUKE,
		PAL_INVERT,

		// Gotflag flags (GF_*)
		GF_REDFLAG,
		GF_BLUEFLAG,

		// TypeOfLevel flags (TOL_*)
		TOL_SP,
		TOL_COOP,
		TOL_COMPETITION,
		TOL_RACE,
		TOL_MATCH,
		TOL_TAG,
		TOL_CTF,
		TOL_CUSTOM,
		TOL_2D,
		TOL_MARIO,
		TOL_NIGHTS,
		TOL_ERZ3,
		TOL_XMAS,

		// Gametypes (GT_*)
		GT_COOP,
		GT_COMPETITION,
		GT_RACE,
		GT_MATCH,
		GT_TEAMMATCH,
		GT_TAG,
		GT_HIDEANDSEEK,
		GT_CTF,

		// Intermission types (int_*)
		int_none,
		int_coop,
		int_match,
		int_teammatch,
		int_ctf,
		int_race,
		int_competition,
		int_spec,

		// Marathon mode flags (MA_*)
		MA_RUNNING,
		MA_INIT,
		MA_NOCUTSCENES,
		MA_INGAME,

		// Weather flags (PRECIP_*)
		PRECIP_NONE,
		PRECIP_STORM,
		PRECIP_SNOW,
		PRECIP_RAIN,
		PRECIP_BLANK,
		PRECIP_STORM_NORAIN,
		PRECIP_STORM_NOSTRIKES,

		// Level flags (LF_*)
		LF_SCRIPTISFILE,
		LF_SPEEDMUSIC,
		LF_NOSSMUSIC,
		LF_NORELOAD,
		LF_NOZONE,
		LF_SAVEGAME,
		LF_MIXNIGHTSCOUNTDOWN,
		LF_WARNINGTITLE,
		LF_NOTITLECARDFIRST,
		LF_NOTITLECARDRESPAWN,
		LF_NOTITLECARDRECORDATTACK,
		LF_NOTITLECARD,

		// Menu flags (LF2_*)
		LF2_HIDEINMENU,
		LF2_HIDEINSTATS,
		LF2_RECORDATTACK,
		LF2_NIGHTSATTACK,
		LF2_NOVISITNEEDED,
		LF2_WIDEICON,

		// NiGHTS grades (GRADE_*)
		GRADE_F,
		GRADE_E,
		GRADE_D,
		GRADE_C,
		GRADE_B,
		GRADE_A,
		GRADE_S,

		// Linedef flags (ML_*)
		ML_IMPASSIBLE,
		ML_BLOCKMONSTERS,
		ML_TWOSIDED,
		ML_DONTPEGTOP,
		ML_DONTPEGBOTTOM,
		ML_EFFECT1,
		ML_NOCLIMB,
		ML_EFFECT2,
		ML_EFFECT3,
		ML_EFFECT4,
		ML_EFFECT5,
		ML_NETONLY,
		ML_NONET,
		ML_EFFECT6,
		ML_BOUNCY,
		ML_TFERLINE,

		// Reserved linedef tags (LE_*)
		LE_AXE,
		LE_KOOPA,
		LE_CAPSULE0,
		LE_CAPSULE1,
		LE_CAPSULE2,
		LE_BRAKPLATFORM,
		LE_TURRET,
		LE_BRAKVILEATTACK,
		LE_BOSS4DROP,
		LE_BOSSDEAD,
		LE_ALLBOSSESDEAD,
		LE_PINCHPHASE,
		LE_PARAMWIDTH,

		// FOF flags (FOF_*, FF_* for backwards compat)
		FOF_EXISTS,
		FOF_BLOCKPLAYER,
		FOF_BLOCKOTHERS,
		FOF_SOLID,
		FOF_RENDERSIDES,
		FOF_RENDERPLANES,
		FOF_RENDERALL,
		FOF_SWIMMABLE,
		FOF_NOSHADE,
		FOF_CUTSOLIDS,
		FOF_CUTEXTRA,
		FOF_CUTLEVEL,
		FOF_CUTSPRITES,
		FOF_BOTHPLANES,
		FOF_EXTRA,
		FOF_TRANSLUCENT,
		FOF_FOG,
		FOF_INVERTPLANES,
		FOF_ALLSIDES,
		FOF_INVERTSIDES,
		FOF_DOUBLESHADOW,
		FOF_FLOATBOB,
		FOF_NORETURN,
		FOF_CRUMBLE,
		FOF_GOOWATER,
		FOF_MARIO,
		FOF_BUSTUP,
		FOF_QUICKSAND,
		FOF_PLATFORM,
		FOF_REVERSEPLATFORM,
		FOF_RIPPLE,
		FOF_COLORMAPONLY,
		FOF_BOUNCY,
		FOF_SPLAT,

		FF_SHATTERBOTTOM,
		FF_INTANGIBLEFLATS,
		FF_SHATTER,
		FF_SPINBUST,
		FF_STRONGBUST,

		// Slope flags (SL_*)
		SL_NOPHYSICS,
		SL_DYNAMIC,

		// PolyObject flags (POF_*)
		POF_CLIPLINES,
		POF_CLIPPLANES,
		POF_SOLID,
		POF_TESTHEIGHT,
		POF_RENDERSIDES,
		POF_RENDERTOP,
		POF_RENDERBOTTOM,
		POF_RENDERPLANES,
		POF_RENDERALL,
		POF_INVERT,
		POF_INVERTPLANES,
		POF_INVERTPLANESONLY,
		POF_PUSHABLESTOP,
		POF_LDEXEC,
		POF_ONESIDE,
		POF_NOSPECIALS,
		POF_SPLAT,

		// Sector special flags (SSF_*)
		SSF_OUTERSPACE,
		SSF_DOUBLESTEPUP,
		SSF_NOSTEPDOWN,
		SSF_WINDCURRENT,
		SSF_CONVEYOR,
		SSF_SPEEDPAD,
		SSF_STARPOSTACTIVATOR,
		SSF_EXIT,
		SSF_SPECIALSTAGEPIT,
		SSF_RETURNFLAG,
		SSF_REDTEAMBASE,
		SSF_BLUETEAMBASE,
		SSF_FAN,
		SSF_SUPERTRANSFORM,
		SSF_FORCESPIN,
		SSF_ZOOMTUBESTART,
		SSF_ZOOMTUBEEND,
		SSF_FINISHLINE,
		SSF_ROPEHANG,
		SSF_JUMPFLIP,
		SSF_GRAVITYOVERRIDE,

		// Emblem flags (GE_*/ME_*)
		GE_NIGHTSPULL,
		GE_NIGHTSITEM,
		ME_ALLEMERALDS,
		ME_ULTIMATE,
		ME_PERFECT,

		// Jingle types (JT_*)
		JT_NONE,
		JT_OTHER,
		JT_MASTER,
		JT_1UP,
		JT_SHOES,
		JT_INV,
		JT_MINV,
		JT_DROWN,
		JT_SUPER,
		JT_GOVER,
		JT_NIGHTSTIMEOUT,
		JT_SSTIMEOUT,

		// Console variable flags (CV_*)
		CV_SAVE,
		CV_CALL,
		CV_NETVAR,
		CV_NOINIT,
		CV_FLOAT,
		CV_NOTINNET,
		CV_MODIFIED,
		CV_SHOWMODIF,
		CV_SHOWMODIFONETIME,
		CV_NOSHOWHELP,
		CV_HIDDEN,
		CV_CHEAT,
		CV_ALLOWLUA,

		// Command flags (COM_*)
		COM_ADMIN,
		COM_SPLITSCREEN,
		COM_LOCAL,

		// Video flags (V_*)
		V_PARAMMASK,
		V_SCALEPATCHMASK,
		V_SPACINGMASK,
		V_CHARCOLORMASK,
		V_ALPHAMASK,
		V_BLENDMASK,

		V_NOSCALEPATCH,
		V_SMALLSCALEPATCH,
		V_MEDSCALEPATCH,

		V_6WIDTHSPACE,
		V_OLDSPACING,
		V_MONOSPACE,

		V_MAGENTAMAP,
		V_YELLOWMAP,
		V_GREENMAP,
		V_BLUEMAP,
		V_REDMAP,
		V_GRAYMAP,
		V_ORANGEMAP,
		V_SKYMAP,
		V_PURPLEMAP,
		V_AQUAMAP,
		V_PERIDOTMAP,
		V_AZUREMAP,
		V_BROWNMAP,
		V_ROSYMAP,
		V_INVERTMAP,

		V_10TRANS,
		V_20TRANS,
		V_30TRANS,
		V_40TRANS,
		V_TRANSLUCENT,
		V_60TRANS,
		V_70TRANS,
		V_80TRANS,
		V_90TRANS,

		V_HUDTRANS,
		V_HUDTRANSHALF,
		V_HUDTRANSDOUBLE,

		V_ADD,
		V_SUBTRACT,
		V_REVERSESUBTRACT,
		V_MODULATE,

		V_ALLOWLOWERCASE,
		V_FLIP,
		V_CENTERNAMETAG,

		V_SNAPTOTOP,
		V_SNAPTOBOTTOM,
		V_SNAPTOLEFT,
		V_SNAPTORIGHT,

		V_AUTOFADEOUT,
		V_RETURN8,
		V_NOSCALESTART,
		V_PERPLAYER,

		V_CHARCOLORSHIFT,
		V_ALPHASHIFT,
		V_BLENDSHIFT,

		// HUD items (HUD_*)
		HUD_LIVES,
		HUD_RINGS,
		HUD_RINGSNUM,
		HUD_RINGSNUMTICS,
		HUD_SCORE,
		HUD_SCORENUM,
		HUD_TIME,
		HUD_MINUTES,
		HUD_TIMECOLON,
		HUD_SECONDS,
		HUD_TIMETICCOLON,
		HUD_TICS,
		HUD_HUNTPICS,
		HUD_POWERUPS,

		// Kick reasons (KR_*)
		KR_KICK,
		KR_PINGLIMIT,
		KR_SYNCH,
		KR_TIMEOUT,
		KR_BAN,
		KR_LEAVE,

		// Gamestates (GS_*)
		GS_NULL,
		GS_LEVEL,
		GS_INTERMISSION,
		GS_CONTINUING,
		GS_TITLESCREEN,
		GS_TIMEATTACK,
		GS_CREDITS,
		GS_EVALUATION,
		GS_GAMEEND,
		GS_INTRO,
		GS_ENDING,
		GS_CUTSCENE,
		GS_DEDICATEDSERVER,
		GS_WAITINGPLAYERS,

		// Gametype rules (GTR_*)
		GTR_CAMPAIGN,
		GTR_RINGSLINGER,
		GTR_SPECTATORS,
		GTR_LIVES,
		GTR_TEAMS,
		GTR_FIRSTPERSON,
		GTR_POWERSTONES,
		GTR_TEAMFLAGS,
		GTR_FRIENDLY,
		GTR_SPECIALSTAGES,
		GTR_EMERALDTOKENS,
		GTR_EMERALDHUNT,
		GTR_RACE,
		GTR_TAG,
		GTR_POINTLIMIT,
		GTR_TIMELIMIT,
		GTR_OVERTIME,
		GTR_HURTMESSAGES,
		GTR_FRIENDLYFIRE,
		GTR_STARTCOUNTDOWN,
		GTR_HIDEFROZEN,
		GTR_BLINDFOLDED,
		GTR_RESPAWNDELAY,
		GTR_PITYSHIELD,
		GTR_DEATHPENALTY,
		GTR_NOSPECTATORSPAWN,
		GTR_DEATHMATCHSTARTS,
		GTR_SPAWNINVUL,
		GTR_SPAWNENEMIES,
		GTR_ALLOWEXIT,
		GTR_NOTITLECARD,
		GTR_CUTSCENES,

		// Game controls (GC_*)
		GC_NULL,
		GC_FORWARD,
		GC_BACKWARD,
		GC_STRAFELEFT,
		GC_STRAFERIGHT,
		GC_TURNLEFT,
		GC_TURNRIGHT,
		GC_WEAPONNEXT,
		GC_WEAPONPREV,
		GC_WEPSLOT1,
		GC_WEPSLOT2,
		GC_WEPSLOT3,
		GC_WEPSLOT4,
		GC_WEPSLOT5,
		GC_WEPSLOT6,
		GC_WEPSLOT7,
		GC_WEPSLOT8,
		GC_WEPSLOT9,
		GC_WEPSLOT10,
		GC_FIRE,
		GC_FIRENORMAL,
		GC_TOSSFLAG,
		GC_SPIN,
		GC_CAMTOGGLE,
		GC_CAMRESET,
		GC_LOOKUP,
		GC_LOOKDOWN,
		GC_CENTERVIEW,
		GC_MOUSEAIMING,
		GC_TALKKEY,
		GC_TEAMKEY,
		GC_SCORES,
		GC_JUMP,
		GC_CONSOLE,
		GC_PAUSE,
		GC_SYSTEMMENU,
		GC_SCREENSHOT,
		GC_RECORDGIF,
		GC_VIEWPOINTNEXT,
		GC_VIEWPOINT,
		GC_VIEWPOINTPREV,
		GC_CUSTOM1,
		GC_CUSTOM2,
		GC_CUSTOM3,

		NUM_GAMECONTROLS,

		// Game joyaxes (JA_*)
		JA_NONE,
		JA_TURN,
		JA_MOVE,
		JA_LOOK,
		JA_STRAFE,
		JA_DIGITAL,
		JA_JUMP,
		JA_SPIN,
		JA_FIRE,
		JA_FIRENORMAL,

		// Bot types (BOT_*)
		BOT_NONE,
		BOT_2PAI,
		BOT_2PHUMAN,
		BOT_MPAI,

		// Dashmode constants (DASHMODE_*)
		DASHMODE_THRESHOLD,
		DASHMODE_MAX,

		// Skincolors (other)
		MAXSKINCOLORS,
		FIRSTSUPERCOLOR,
		NUMSUPERCOLORS,

		// Possible value arrays (CV_*)
		CV_YesNo,
		CV_OnOff,
		CV_TrueFalse,
		CV_Unsigned,
		CV_Natural,

		// Userdata
		sprnames,
		spr2names,
		states,
		mobjinfo,
		skincolors,
		S_Sfx, sfxinfo,
		powers,
		mapheaderinfo,
		sidenum,
		hudinfo,
		spriteinfo,
		spr2defaults,
		gamekeydown,

		// Aliases
		FU,
		V_50TRANS,
		CV_HIDEN,
	}

	functions {
		// Basic Math
		abs = "int a";
		min = "int a, int b";
		max = "int a, int b";

		// Angle Math
		sin = "angle a";
		cos = "angle a";
		tan = "angle a";

		asin = "fixed x";
		acos = "fixed x";

		FixedAngle = "fixed a";
		AngleFixed = "angle a";
		InvAngle = "angle a";

		// Fixed-point Math
		FixedMul = "fixed a, fixed b";
		FixedInt = "fixed a";
		FixedDiv = "fixed a, fixed b";
		FixedRem = "fixed a, fixed b";
		FixedSqrt = "fixed a";
		FixedHypot = "fixed a, fixed b";
		FixedFloor = "fixed a";
		FixedTrunc = "fixed a";
		FixedRound = "fixed a";
		FixedCeil = "fixed a";

		// Miscellanous
		GetSecSpecial = "int special, int section";
		All7Emeralds = "int flags";
		ColorOpposite = "int color";

		// Easing library
		ease.linear = "fixed t, [fixed start], [fixed end]";
		ease.insine = "fixed t, [fixed start], [fixed end]";
		ease.outsine = "fixed t, [fixed start], [fixed end]";
		ease.inoutsine = "fixed t, [fixed start], [fixed end]";
		ease.inquad = "fixed t, [fixed start], [fixed end]";
		ease.outquad = "fixed t, [fixed start], [fixed end]";
		ease.inoutquad = "fixed t, [fixed start], [fixed end]";
		ease.incubic = "fixed t, [fixed start], [fixed end]";
		ease.outcubic = "fixed t, [fixed start], [fixed end]";
		ease.inoutcubic = "fixed t, [fixed start], [fixed end]";
		ease.inquart = "fixed t, [fixed start], [fixed end]";
		ease.outquart = "fixed t, [fixed start], [fixed end]";
		ease.inoutquart = "fixed t, [fixed start], [fixed end]";
		ease.inquint = "fixed t, [fixed start], [fixed end]";
		ease.outquint = "fixed t, [fixed start], [fixed end]";
		ease.inoutquint = "fixed t, [fixed start], [fixed end]";
		ease.inexpo = "fixed t, [fixed start], [fixed end]";
		ease.outexpo = "fixed t, [fixed start], [fixed end]";
		ease.inoutexpo = "fixed t, [fixed start], [fixed end]";
		ease.inback = "fixed t, [fixed start], [fixed end]", "fixed t, fixed end";
		ease.outback = "fixed t, [fixed start], [fixed end]", "fixed t, fixed end";
		ease.inoutback = "fixed t, [fixed start], [fixed end]", "fixed t, fixed end";

		// HUD library
		hud.enable = "string huditem";
		hud.disable = "string huditem";
		hud.enabled = "string huditem";
		hud.add = "function(*) func, string type";

		// Drawing functions (weird)
		v.patchExists = "string name";
		v.cachePatch = "string name";
		v.getSpritePatch = "string/int sprite, [int frame], [int rotation], [angle rollangle]";
		v.getSprite2Patch = "string/int skin, string/int sprite2, [boolean super], [int frame], [int rotation], [angle rollangle]";

		v.draw = "int x, int y, patch_t patch, [int flags], [colormap c]";
		v.drawScaled = "fixed x, fixed y, fixed scale, patch_t patch, [int flags], [colormap c]";
		v.drawStretched = "fixed x, fixed y, fixed hscale, fixed vscale, patch_t patch, [int flags], [colormap c]";
		v.drawCropped = "fixed x, fixed y, fixed hscale, fixed vscale, patch_t patch, [int flags], [colormap c], fixed sx, fixed sy, fixed w, fixed h";

		v.drawNum = "int x, int y, int num, [int flags]";
		v.drawPaddedNum = "int x, int y, int num, [int digits], [int flags]";
		v.drawFill = "[int x], [int y], [int width], [int height], [int color]";

		v.drawString = "int/fixed x, int/fixed y, string text, [int flags], [string alignment]";
		v.drawNameTag = "int x, int y, string text, [int flags], [int basecolor], [int outlinecolor]";
		v.drawScaledNameTag = "fixed x, fixed y, string text, [int flags], [fixed scale], [int basecolor], [int outlinecolor]";
		v.drawLevelTitle = "int x, int y, string text, [int flags]";

		v.stringWidth = "string text, [int flags], [string widthtype]";
		v.nameTagWidth = "string text";
		v.levelTitleWidth = "string text";
		v.levelTitleHeight = "string text";

		v.getColormap = "string/int skin, [int color]";
		v.getStringColormap = "int textcolor";

		v.fadeScreen = "int color, int strength";

		v.width; v.height;
		v.dupx; v.dupy;
		v.renderer;

		v.userTransFlag;
		v.localTransFlag;

		v.RandomFixed;
		v.RandomByte;
		v.RandomKey = "int a";
		v.RandomRange = "int a, int b";
		v.SignedRandom;
		v.RandomChance = "fixed p";

		// Console library
		CONS_Printf = "player_t player, string text";

		COM_AddCommand = "string name, function fn, [int flags]";
		COM_BufAddText = "player_t player, string text";
		COM_BufInsertText = "player_t player, string text";

		CV_RegisterVar = "table{} t";
		CV_FindVar = "string var";
		CV_Set = "consvar_t cvar, string/int value";
		CV_StealthSet = "consvar_t cvar, string/int value";
		CV_AddValue = "consvar_t cvar, int increment";

		// Blockmap Search
		searchBlockmap = "string searchtype, function fn, mobj_t refmobj, [fixed x1], [fixed x2], [fixed y1], [fixed y2]";

		// Input library
		input.gameControlDown = "int gc";
		input.gameControl2Down = "int gc";
		input.gameControlToKeyNum = "int gc";
		input.gameControl2ToKeyNum = "int gc";
		input.joyAxis = "int axissel";
		input.joy2Axis = "int axissel";
		input.keyNumToName = "int keynum";
		input.keyNameToNum = "string keyname";
		input.keyNumPrintable = "string keyname";
		input.shiftKeyNum = "string keynum";
		input.getMouseGrab;
		input.setMouseGrab = "boolean grab";
		input.getCursorPosition;

		// Base functions
		print = "string output, [...]";
		chatprint = "string output, [boolean sound]";
		chatprintf = "player_t player, string output, [boolean sound]";
		freeslot = "string resource, [...]";
		addHook = "string hook, function fn, [int/string extra]";
		super = "mobj_t actor, int var1, int var2";
		IsPlayerAdmin = "player_t player";
		userdataType = "* v";
		reserveLuaBanks;
		registerMetatable = "table{} metatable";
		userdataMetatable = "string userdataname";
		getTimeMicros;

		// G_Game
		G_BuildMapName = "[int map]";
		G_BuildMapTitle = "[int map]";
		G_FindMap = "string query";
		G_FindMapByNameOrCode = "string query";
		G_DoReborn = "int playernum";
		G_EnoughPlayersFinished;
		G_SetCustomExitVars = "[int nextmap], [int skipstats]";
		G_ExitLevel;
		G_IsSpecialStage = "[int map]";
		G_AddGametype = "table{} t";
		G_GametypeUsesLives;
		G_GametypeUsesCoopLives;
		G_GametypeUsesCoopStarposts;
		G_GametypeHasTeams;
		G_GametypeHasSpectators;
		G_RingSlingerGametype;
		G_PlatformGametype;
		G_CoopGametype;
		G_TagGametype;
		G_CompetitionGametype;
		G_AddPlayer = "int skin, int color, string name, int bottype";
		G_RemovePlayer = "int player num";
		G_TicsToHours = "int tics";
		G_TicsToMinutes = "int tics, [boolean full]";
		G_TicsToSeconds = "int tics";
		G_TicsToCentiseconds = "int tics";
		G_TicsToMilliseconds = "int tics";

		// M_Random
		P_RandomFixed;
		P_RandomByte;
		P_RandomKey = "int a";
		P_RandomRange = "int a, int b";
		P_SignedRandom;
		P_RandomChance = "fixed p";

		// M_Menu
		M_MoveColorAfter = "UINT16 color, UINT16 target";
		M_MoveColorBefore = "UINT16 color, UINT16 target";
		M_GetColorAfter = "UINT16 color";
		M_GetColorBefore = "UINT16 color";

		// M_Map
		M_MapNumber = "string name";

		// P_Enemy
		P_CheckMeleeRange = "mobj_t actor";
		P_JetbCheckMeleeRange = "mobj_t actor";
		P_FaceStabCheckMeleeRange = "mobj_t actor";
		P_SkimCheckMeleeRange = "mobj_t actor";
		P_CheckMissileRange = "mobj_t actor";
		P_NewChaseDir = "mobj_t actor";
		P_LookForPlayers = "mobj_t actor, [fixed dist], [boolean allaround], [boolean tracer]";

		// P_Inter
		P_RemoveShield = "player_t player";
		P_DamageMobj = "mobj_t target, [mobj_t inflictor], [mobj_t source], [int damage], [int damagetype]";
		P_KillMobj = "mobj_t target, [mobj_t inflictor], [mobj_t source], [int damagetype]";
		P_PlayerRingBurst = "player_t player, [int numrings]";
		P_PlayerWeaponPanelBurst = "player_t player";
		P_PlayerWeaponAmmoBurst = "player_t player";
		P_PlayerWeaponPanelOrAmmoBurst = "player_t player";
		P_PlayerEmeraldBurst = "player_t player, [boolean burst]";
		P_PlayerFlagBurst = "player_t player, [boolean burst]";
		P_PlayRinglossSound = "mobj_t source, [player_t player]";
		P_PlayDeathSound = "mobj_t source, [player_t player]";
		P_PlayVictorySound = "mobj_t source, [player_t player]";
		P_PlayLivesJingle = "player_t player";
		P_CanPickupItem = "player_t player, [boolean weapon]";
		P_DoNightsScore = "player_t player";
		P_DoMatchSuper = "player_t player";

		// P_Map
		P_CheckPosition = "mobj_t mobj, fixed x, fixed y";
		P_TryMove = "mobj_t mobj, fixed x, fixed y, [boolean allowdropoff]";
		P_Move = "mobj_t actor, int speed";
		P_SetOrigin = "mobj_t mobj, fixed x, fixed y, fixed z";
		P_MoveOrigin = "mobj_t mobj, fixed x, fixed y, fixed z";
		P_SlideMove = "mobj_t mobj";
		P_BounceMove = "mobj_t mobj";
		P_CheckSight = "mobj_t source, mobj_t target";
		P_CheckHoopPosition = "mobj_t hoop, fixed x, fixed y, fixed z, fixed radius";
		P_RadiusAttack = "mobj_t inflictor, mobj_t source, fixed radius, [int damagetype], [boolean sightcheck]";
		P_FloorzAtPos = "fixed x, fixed y, fixed z, fixed height";
		P_CeilingzAtPos = "fixed x, fixed y, fixed z, fixed height";
		P_DoSpring = "mobj_t spring, mobj_t object";
		P_TryCameraMove = "camera_t cam, fixed x, fixed y";
		P_TeleportCameraMove = "camera_t cam, fixed x, fixed y, fixed z";

		// P_Maputl
		P_AproxDistance = "fixed dx, fixed dy";
		P_ClosestPointOnLine = "fixed x, fixed y, line_t line";
		P_PointOnLineSide = "fixed x, fixed y, line_t line";

		// P_Mobj
		P_SpawnMobj = "fixed x, fixed y, fixed z, int type";
		P_SpawnMobjFromMobj = "mobj_t origin, fixed x, fixed y, fixed z, int type";
		P_RemoveMobj = "mobj_t mobj";
		P_IsValidSprite2 = "mobj_t mobj, int sprite2";
		P_SpawnLockOn = "player_t player, mobj_t target, state state";
		P_SpawnMissile = "mobj_t source, mobj_t dest, int type";
		P_SpawnXYZMissile = "mobj_t source, mobj_t dest, int type, fixed x, fixed y, fixed z";
		P_SpawnPointMissile = "mobj_t source, fixed dest_x, fixed dest_y, fixed dest_z, int type, fixed x, fixed y, fixed z";
		P_SpawnAlteredDirectionMissile = "mobj_t source, int type, fixed x, fixed y, fixed z, int angle_shift";
		P_ColorTeamMissile = "mobj_t missile, player_t player";
		P_SPMAngle = "mobj_t source, int type, angle angle, [int allowaim], [int flags2]";
		P_SpawnPlayerMissile = "mobj_t source, int type, [int flags2]";
		P_MobjFlip = "mobj_t mobj";
		P_GetMobjGravity = "mobj_t mobj";
		P_WeaponOrPanel = "int type";
		P_FlashPal = "player_t player, int type, int duration";
		P_GetClosestAxis = "mobj_t source";
		P_SpawnParaloop = "fixed x, fixed y, fixed z, fixed radius, int number, int type, angle rotangle, [int state], [boolean spawncenter]";
		P_BossTargetPlayer = "mobj_t actor, [boolean closest]";
		P_SupermanLook4Players = "mobj_t actor";
		P_SetScale = "mobj_t mobj, fixed scale";
		P_InsideANonSolidFFloor = "mobj_t mobj, ffloor_t rover";
		P_CheckDeathPitCollide = "mobj_t mobj";
		P_CheckSolidLava = "ffloor_t rover";
		P_CanRunOnWater = "player_t player, ffloor_t rover";
		P_MaceRotate = "mobj_t center, int baserot, int baseprevrot";
		P_CreateFloorSpriteSlope = "mobj_t mobj";
		P_RemoveFloorSpriteSlope = "mobj_t mobj";
		P_RailThinker = "mobj_t mobj";
		P_XYMovement = "mobj_t mobj";
		P_RingXYMovement = "mobj_t mobj";
		P_SceneryXYMovement = "mobj_t mobj";
		P_ZMovement = "mobj_t mobj";
		P_RingZMovement = "mobj_t mobj";
		P_SceneryZMovement = "mobj_t mobj";
		P_PlayerZMovement = "mobj_t mobj";

		// P_Polyobj
		polyobjects.GetForNum = "polyobj_t polyobject, int id";

		// P_Slopes
		P_GetZAt = "pslope_t slope, fixed x, fixed y";
		P_ButteredSlope = "mobj_t mobj";

		// P_Spec
		P_Thrust = "mobj_t mobj, angle angle, fixed move";
		P_SetMobjStateNF = "mobj_t mobj, int statenum";
		P_DoSuperTransformation = "player_t player, [boolean giverings]";
		P_ExplodeMissile = "mobj_t missile";
		P_PlayerTouchingSectorSpecial = "player_t player, int section, int specialnum";
		P_FindLowestFloorSurrounding = "sector_t sector";
		P_FindHighestFloorSurrounding = "sector_t sector";
		P_FindLowestCeilingSurrounding = "sector_t sector";
		P_FindHighestFloorSurrounding = "sector_t sector";
		P_FindNextHighestFloor = "sector_t sector, [fixed currentheight]";
		P_FindNextLowestFloor = "sector_t sector, [fixed currentheight]";
		P_FindSpecialLineFromTag = "int special, int tag, [int start]";
		P_SwitchWeather = "int weathernum, [player_t player]";
		P_LinedefExecute = "int tag, [mobj_t actor], [sector_t caller]";
		P_SpawnLightningFlash = "sector_t sector";
		P_FadeLight = "int tag, int destvalue, int speed, [boolean ticbased], [boolean force]";
		P_ThingOnSpecial3DFloor = "mobj_t mobj";
		P_IsFlagAtBase = "int type";
		P_SetupLevelSky = "int skynum, [player_t player]";
		P_SetSkyboxMobj = "[mobj_t mobj], [boolean/int centerpoint], [player_t user]";
		P_StartQuake = "fixed intensity, int time, [table{} epicenter], [fixed radius]";
		EV_CrumbleChain = "[sector_t sector], ffloor_t rover";
		EV_StartCrumble = "sector_t sector, ffloor_t rover, [boolean floating], [player_t player], [fixed origalpha], [boolean crumblereturn]";

		// P_User
		P_GetPlayerHeight = "player_t player";
		P_GetPlayerSpinHeight = "player_t player";
		P_GetPlayerControlDirection = "player_t player";
		P_AddPlayerScore = "player_t player, int amount";
		P_StealPlayerScore = "player_t player, int amount";
		P_GetJumpFlags = "player_t player";
		P_PlayerInPain = "player_t player";
		P_DoPlayerPain = "player_t player, [mobj_t source], [mobj_t inflictor]";
		P_ResetPlayer = "player_t player";
		P_PlayerCanDamage = "player_t player, mobj_t mobj";
		P_IsObjectInGoop = "mobj_t mobj";
		P_IsObjectOnGround = "mobj_t mobj";
		P_InSpaceSector = "mobj_t mobj";
		P_InQuicksand = "mobj_t mobj";
		P_SetObjectMomZ = "mobj_t mobj, fixed momz, [boolean relative]";
		P_RestoreMusic = "player_t player";
		P_SpawnShieldOrb = "player_t player";
		P_SpawnGhostMobj = "mobj_t mobj";
		P_GivePlayerRings = "player_t player, int amount";
		P_GivePlayerLives = "player_t player, int amount";
		P_GiveCoopLives = "player_t player, int amount, [boolean playsound]";
		P_ResetScore = "player_t player";
		P_DoJumpShield = "player_t player";
		P_DoBubbleBounce = "player_t player";
		P_BlackOw = "player_t player";
		P_ElementalFire = "player_t player, [boolean cropcircle]";
		P_DoPlayerFinish = "player_t player";
		P_DoPlayerExit = "player_t player";
		P_InstaThrust = "mobj_t mobj, angle angle, fixed move";
		P_ReturnThrustX = "[mobj_t mobj], angle angle, fixed move";
		P_ReturnThrustY = "[mobj_t mobj], angle angle, fixed move";
		P_LookForEnemies = "player_t player, [boolean nonenemies], [boolean bullet]";
		P_NukeEnemies = "mobj_t inflictor, mobj_t source, fixed radius";
		P_HomingAttack = "mobj_t source, mobj_t target";
		P_SuperReady = "player_t player";
		P_DoJump = "player_t player, [boolean soundandstate]";
		P_SpawnThokMobj = "player_t player";
		P_SpawnSpinMobj = "player_t player, int type";
		P_Telekinesis = "player_t player, fixed thrust, fixed range";
		P_SwitchShield = "player_t player, int shield";
		P_PlayJingle = "player_t player, int jingletype";
		P_PlayJingleMusic = "player_t player, string musname, [int musflags], [boolean looping], [int jingletype]";
		P_SpawnSkidDust = "player_t player, fixed radius, [int sound]";
		P_EarthQuake = "mobj_t inflictor, mobj_t source, fixed radius";
		P_PlayerFullbright = "player_t player";
		P_MovePlayer = "player_t player";
		P_PlayerCanEnterSpinGaps = "player_t player";
		P_PlayerShouldUseSpinHeight = "player_t player";

		// R_Data
		R_TextureNumForName = "string name";
		R_CheckTextureNumForName = "string name";
		R_TextureNameForNum = "int number";
		R_CheckTextureNameForNum = "int number";

		// R_Draw
		R_GetColorByName = "string name";
		R_GetSuperColorByName = "string name";
		R_GetNameByColor = "int color";

		// R_Defs
		R_PointToAngle = "fixed x, fixed y";
		R_PointToAngle2 = "fixed x, fixed y, fixed dest_x, fixed dest_y";
		R_PointToDist = "fixed x, fixed y";
		R_PointToDist2 = "fixed x, fixed y, fixed dest_x, fixed dest_y";
		R_PointInSubsector = "fixed x, fixed y";
		R_PointInSubsectorOrNil = "fixed x, fixed y";

		// R_Things
		R_Char2Frame = "string char";
		R_Frame2Char = "int frame";
		R_SetPlayerSkin = "player_t player, int/string skin";
		R_SkinUsable = "player_t player, int/string skin";

		// S_Sound
		S_StartSound = "[mobj_t/sector_t origin], int soundnum, [player_t player]";
		S_StartSoundAtVolume = "[mobj_t/sector_t origin], int soundnum, UINT8 volume, [player_t player]";
		S_StopSound = "mobj_t/sector_t origin";
		S_StopSoundByID = "mobj_t/sector_t origin, int soundnum";
		S_ChangeMusic = "string musname, [boolean looping], [player_t player], [int mflags], [int position], [int prefadems], [int fadeinms]";
		S_SpeedMusic = "fixed musspeed, [player_t player]";
		S_StopMusic = "[player_t player]";
		S_SetInternalMusicVolume = "int volume, [player_t player]";
		S_StopFadingMusic = "[player_t player]";
		S_FadeMusic = "int target_volume, int ms, [player_t player]";
		S_FadeOutStopMusic = "int ms, [player_t player]";
		S_OriginPlaying = "mobj_t/sector_t origin";
		S_IdPlaying = "int soundnum";
		S_SoundPlaying = "mobj_t/sector_t origin, int soundnum";
		S_StartMusicCaption = "string caption, int lifespan, [player_t player]";
		S_GetMusicLength;
		S_GetMusicPosition;
		S_SetMusicPosition = "int position";
		S_MusicType;
		S_MusicExists = "string musname, [boolean checkmidi], [boolean checkdigi]";
		S_MusicPlaying = "[player_t player]";
		S_MusicPaused = "[player_t player]";
		S_MusicName = "[player_t player]";
		S_SetMusicLoopPoint = "UINT32 looppoint, [player_t player]";
		S_GetMusicLoopPoint = "[player_t player]";
		S_PauseMusic = "[player_t player]";
		S_ResumeMusic = "[player_t player]";

		// Iterator functions
		players.iterate;
		mobjs.iterate;
		skins.iterate;
		mapthings.iterate;
		sectors.iterate;
		subsectors.iterate;
		lines.iterate;
		sides.iterate;
		vertexes.iterate;
		polyobjects.iterate;

		// Base Lua functions
		assert = "* v, [string errormsg]";
		collectgarbage = "[string opt], [int arg]";
		error = "string message, [int level]";
		dofile = "string file";
		gcinfo;
		getfenv = "[function/int f]";
		getmetatable = "object obj";
		ipairs = "table{} t";
		next = "table{} t, [int index]";
		pairs = "table{} t";
		pcall = "function fn, [* arg], [...]";
		rawequal = "* v1, * v2";
		rawget = "table{} t, * index";
		rawset = "table{} t, * index, * value";
		select = "string index, ...";
		setfenv = "function/int f, table{} t";
		setmetatable = "table{} t, table{} metatable";
		tonumber = "* e, [int base]";
		tostring = "* e";
		type = "* v";
		unpack = "table{} list, [int start], [int end]";
		xpcall = "function call, function(status) errortrap";

		// Coroutine library
		coroutine.create = "function fn";
		coroutine.resume = "thread co, [* val], [...]";
		coroutine.running;
		coroutine.status = "thread co";
		coroutine.wrap = "function fn";
		coroutine.yield = "[...]";

		// String library
		string.byte = "string s, [int start], [int end]";
		string.char = "[int charid], [...]";
		string.find = "string s, string pattern, [int start], [boolean plain]";
		string.format = "string formatstr, [...]";
		string.gmatch = "string s, string pattern";
		string.gsub = "string s, string pattern, int/string/table/function replace, [int n]";
		string.len = "string s";
		string.upper = "string s";
		string.lower = "string s";
		string.match = "string s, string pattern, [int n]";
		string.rep = "string s, int n";
		string.reverse = "string s";
		string.sub = "string s, int start, [int end]";

		// Table library
		table.concat = "table{} t, [string sep], [int start], [int end]";
		table.insert = "table{} t, [int key], * element";
		table.maxn = "table{} t";
		table.remove = "table{} t, [int key]";
		table.sort = "table{} t, [function(*) comp]";

		// I/O library
		io.open = "string filename, [string mode], function callback";
		io.openlocal = "string filename, [string mode]";
		io.close = "file* file";
		io.tmpfile;
		io.type = "* obj";

		// OS library
		os.clock;
		os.time = "[table{} time]";
		os.date = "[string format], [int time]";
		os.difftime = "int t1, int t2";
	}
}