From 0c440569450d0e63c707fa0e6da6cb68fcef354d Mon Sep 17 00:00:00 2001 From: helixhorned Date: Wed, 2 Jan 2013 22:33:37 +0000 Subject: [PATCH] Lunatic: getting closer to the first milestone. On the C side, zrange, angrange and autoaimang are represented as DukePlayer_t members then. git-svn-id: https://svn.eduke32.com/eduke32@3366 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/source/lunatic/con_lang.lua | 481 ++++++++++---------- polymer/eduke32/source/lunatic/control.lua | 109 ++++- polymer/eduke32/source/lunatic/defs.ilua | 13 +- polymer/eduke32/source/lunatic/dynsymlist | 6 + polymer/eduke32/source/lunatic/lunacon.lua | 121 +++-- polymer/eduke32/source/player.c | 23 +- polymer/eduke32/source/player.h | 5 +- 7 files changed, 467 insertions(+), 291 deletions(-) diff --git a/polymer/eduke32/source/lunatic/con_lang.lua b/polymer/eduke32/source/lunatic/con_lang.lua index dc0ed1219..e49c9bf3e 100644 --- a/polymer/eduke32/source/lunatic/con_lang.lua +++ b/polymer/eduke32/source/lunatic/con_lang.lua @@ -24,249 +24,256 @@ MAXSOUNDS = 4096 MAXQUOTES = 16384 MAXQUOTELEN = 128 +local STR = { + STR_MAPNAME = 0, + STR_MAPFILENAME = 1, + STR_PLAYERNAME = 2, + STR_VERSION = 3, + STR_GAMETYPE = 4, + STR_VOLUMENAME = 5, +} + +PROJ = { + PROJ_WORKSLIKE = 0, + PROJ_SPAWNS = 1, + PROJ_SXREPEAT = 2, + PROJ_SYREPEAT = 3, + PROJ_SOUND = 4, + PROJ_ISOUND = 5, + PROJ_VEL = 6, + PROJ_EXTRA = 7, + PROJ_DECAL = 8, + PROJ_TRAIL = 9, + PROJ_TXREPEAT = 10, + PROJ_TYREPEAT = 11, + PROJ_TOFFSET = 12, + PROJ_TNUM = 13, + PROJ_DROP = 14, + PROJ_CSTAT = 15, + PROJ_CLIPDIST = 16, + PROJ_SHADE = 17, + PROJ_XREPEAT = 18, + PROJ_YREPEAT = 19, + PROJ_PAL = 20, + PROJ_EXTRA_RAND = 21, + PROJ_HITRADIUS = 22, + PROJ_VEL_MULT = 23, + PROJ_OFFSET = 24, + PROJ_BOUNCES = 25, + PROJ_BSOUND = 26, + PROJ_RANGE = 27, + PROJ_FLASH_COLOR = 28, +} + +-- TODO: EVENT_INIT currently can't run since we init Lunatic state only afterwards +EVENT = { + EVENT_INIT = 0, + EVENT_ENTERLEVEL = 1, + EVENT_RESETWEAPONS = 2, + EVENT_RESETINVENTORY = 3, + EVENT_HOLSTER = 4, + EVENT_LOOKLEFT = 5, + EVENT_LOOKRIGHT = 6, + EVENT_SOARUP = 7, + EVENT_SOARDOWN = 8, + EVENT_CROUCH = 9, + EVENT_JUMP = 10, + EVENT_RETURNTOCENTER = 11, + EVENT_LOOKUP = 12, + EVENT_LOOKDOWN = 13, + EVENT_AIMUP = 14, + EVENT_FIRE = 15, + EVENT_CHANGEWEAPON = 16, + EVENT_GETSHOTRANGE = 17, + EVENT_GETAUTOAIMANGLE = 18, + EVENT_GETLOADTILE = 19, + EVENT_CHEATGETSTEROIDS = 20, + EVENT_CHEATGETHEAT = 21, + EVENT_CHEATGETBOOT = 22, + EVENT_CHEATGETSHIELD = 23, + EVENT_CHEATGETSCUBA = 24, + EVENT_CHEATGETHOLODUKE = 25, + EVENT_CHEATGETJETPACK = 26, + EVENT_CHEATGETFIRSTAID = 27, + EVENT_QUICKKICK = 28, + EVENT_INVENTORY = 29, + EVENT_USENIGHTVISION = 30, + EVENT_USESTEROIDS = 31, + EVENT_INVENTORYLEFT = 32, + EVENT_INVENTORYRIGHT = 33, + EVENT_HOLODUKEON = 34, + EVENT_HOLODUKEOFF = 35, + EVENT_USEMEDKIT = 36, + EVENT_USEJETPACK = 37, + EVENT_TURNAROUND = 38, + EVENT_DISPLAYWEAPON = 39, + EVENT_FIREWEAPON = 40, + EVENT_SELECTWEAPON = 41, + EVENT_MOVEFORWARD = 42, + EVENT_MOVEBACKWARD = 43, + EVENT_TURNLEFT = 44, + EVENT_TURNRIGHT = 45, + EVENT_STRAFELEFT = 46, + EVENT_STRAFERIGHT = 47, + EVENT_WEAPKEY1 = 48, + EVENT_WEAPKEY2 = 49, + EVENT_WEAPKEY3 = 50, + EVENT_WEAPKEY4 = 51, + EVENT_WEAPKEY5 = 52, + EVENT_WEAPKEY6 = 53, + EVENT_WEAPKEY7 = 54, + EVENT_WEAPKEY8 = 55, + EVENT_WEAPKEY9 = 56, + EVENT_WEAPKEY10 = 57, + EVENT_DRAWWEAPON = 58, + EVENT_DISPLAYCROSSHAIR = 59, + EVENT_DISPLAYREST = 60, + EVENT_DISPLAYSBAR = 61, + EVENT_RESETPLAYER = 62, + EVENT_INCURDAMAGE = 63, + EVENT_AIMDOWN = 64, + EVENT_GAME = 65, + EVENT_PREVIOUSWEAPON = 66, + EVENT_NEXTWEAPON = 67, + EVENT_SWIMUP = 68, + EVENT_SWIMDOWN = 69, + EVENT_GETMENUTILE = 70, + EVENT_SPAWN = 71, + EVENT_LOGO = 72, + EVENT_EGS = 73, + EVENT_DOFIRE = 74, + EVENT_PRESSEDFIRE = 75, + EVENT_USE = 76, + EVENT_PROCESSINPUT = 77, + EVENT_FAKEDOMOVETHINGS = 78, + EVENT_DISPLAYROOMS = 79, + EVENT_KILLIT = 80, + EVENT_LOADACTOR = 81, + EVENT_DISPLAYBONUSSCREEN = 82, + EVENT_DISPLAYMENU = 83, + EVENT_DISPLAYMENUREST = 84, + EVENT_DISPLAYLOADINGSCREEN = 85, + EVENT_ANIMATESPRITES = 86, + EVENT_NEWGAME = 87, + EVENT_SOUND = 88, + EVENT_CHECKTOUCHDAMAGE = 89, + EVENT_CHECKFLOORDAMAGE = 90, + EVENT_LOADGAME = 91, + EVENT_SAVEGAME = 92, + EVENT_PREGAME = 93, + EVENT_CHANGEMENU = 94, +} + +local SFLAG = { + SFLAG_SHADOW = 0x00000001, + SFLAG_NVG = 0x00000002, + SFLAG_NOSHADE = 0x00000004, + SFLAG_PROJECTILE = 0x00000008, + SFLAG_DECAL = 0x00000010, + SFLAG_BADGUY = 0x00000020, + SFLAG_NOPAL = 0x00000040, + SFLAG_NOEVENTCODE = 0x00000080, + SFLAG_NOLIGHT = 0x00000100, + SFLAG_USEACTIVATOR = 0x00000200, + SFLAG_NULL = 0x00000400, + SFLAG_NOCLIP = 0x00000800, + SFLAG_NOFLOORSHADOW = 0x00001000, + SFLAG_SMOOTHMOVE = 0x00002000, + SFLAG_NOTELEPORT = 0x00004000, +-- SFLAG_BADGUYSTAYPUT = 0x00008000, +-- SFLAG_CACHE = 0x00010000, +-- SFLAG_ROTFIXED = 0x00020000, +} + +STAT = { + STAT_DEFAULT = 0, + STAT_ACTOR = 1, + STAT_ZOMBIEACTOR = 2, + STAT_EFFECTOR = 3, + STAT_PROJECTILE = 4, + STAT_MISC = 5, + STAT_STANDABLE = 6, + STAT_LOCATOR = 7, + STAT_ACTIVATOR = 8, + STAT_TRANSPORT = 9, + STAT_PLAYER = 10, + STAT_FX = 11, + STAT_FALLER = 12, + STAT_DUMMYPLAYER = 13, + STAT_LIGHT = 14, + STAT_NETALLOC = 15, +} + +local GAMEFUNC = { + GAMEFUNC_MOVE_FORWARD = 0, + GAMEFUNC_MOVE_BACKWARD = 1, + GAMEFUNC_TURN_LEFT = 2, + GAMEFUNC_TURN_RIGHT = 3, + GAMEFUNC_STRAFE = 4, + GAMEFUNC_FIRE = 5, + GAMEFUNC_OPEN = 6, + GAMEFUNC_RUN = 7, + GAMEFUNC_AUTORUN = 8, + GAMEFUNC_JUMP = 9, + GAMEFUNC_CROUCH = 10, + GAMEFUNC_LOOK_UP = 11, + GAMEFUNC_LOOK_DOWN = 12, + GAMEFUNC_LOOK_LEFT = 13, + GAMEFUNC_LOOK_RIGHT = 14, + GAMEFUNC_STRAFE_LEFT = 15, + GAMEFUNC_STRAFE_RIGHT = 16, + GAMEFUNC_AIM_UP = 17, + GAMEFUNC_AIM_DOWN = 18, + GAMEFUNC_WEAPON_1 = 19, + GAMEFUNC_WEAPON_2 = 20, + GAMEFUNC_WEAPON_3 = 21, + GAMEFUNC_WEAPON_4 = 22, + GAMEFUNC_WEAPON_5 = 23, + GAMEFUNC_WEAPON_6 = 24, + GAMEFUNC_WEAPON_7 = 25, + GAMEFUNC_WEAPON_8 = 26, + GAMEFUNC_WEAPON_9 = 27, + GAMEFUNC_WEAPON_10 = 28, + GAMEFUNC_INVENTORY = 29, + GAMEFUNC_INVENTORY_LEFT = 30, + GAMEFUNC_INVENTORY_RIGHT = 31, + GAMEFUNC_HOLO_DUKE = 32, + GAMEFUNC_JETPACK = 33, + GAMEFUNC_NIGHTVISION = 34, + GAMEFUNC_MEDKIT = 35, + GAMEFUNC_TURNAROUND = 36, + GAMEFUNC_SENDMESSAGE = 37, + GAMEFUNC_MAP = 38, + GAMEFUNC_SHRINK_SCREEN = 39, + GAMEFUNC_ENLARGE_SCREEN = 40, + GAMEFUNC_CENTER_VIEW = 41, + GAMEFUNC_HOLSTER_WEAPON = 42, + GAMEFUNC_SHOW_OPPONENTS_WEAPON = 43, + GAMEFUNC_MAP_FOLLOW_MODE = 44, + GAMEFUNC_SEE_COOP_VIEW = 45, + GAMEFUNC_MOUSE_AIMING = 46, + GAMEFUNC_TOGGLE_CROSSHAIR = 47, + GAMEFUNC_STEROIDS = 48, + GAMEFUNC_QUICK_KICK = 49, + GAMEFUNC_NEXT_WEAPON = 50, + GAMEFUNC_PREVIOUS_WEAPON = 51, +-- GAMEFUNC_SHOW_CONSOLE = 52, + GAMEFUNC_SHOW_DUKEMATCH_SCORES = 53, + GAMEFUNC_DPAD_SELECT = 54, + GAMEFUNC_DPAD_AIMING = 55, +} -- KEEPINSYNC with gamedef.c:C_AddDefaultDefinitions() and the respective -- defines. These are exported to the ffi.C namespace and as literal defines -- in lunacon.lua. labels = { - { - STR_MAPNAME = 0, - STR_MAPFILENAME = 1, - STR_PLAYERNAME = 2, - STR_VERSION = 3, - STR_GAMETYPE = 4, - STR_VOLUMENAME = 5, - }, - - { - PROJ_WORKSLIKE = 0, - PROJ_SPAWNS = 1, - PROJ_SXREPEAT = 2, - PROJ_SYREPEAT = 3, - PROJ_SOUND = 4, - PROJ_ISOUND = 5, - PROJ_VEL = 6, - PROJ_EXTRA = 7, - PROJ_DECAL = 8, - PROJ_TRAIL = 9, - PROJ_TXREPEAT = 10, - PROJ_TYREPEAT = 11, - PROJ_TOFFSET = 12, - PROJ_TNUM = 13, - PROJ_DROP = 14, - PROJ_CSTAT = 15, - PROJ_CLIPDIST = 16, - PROJ_SHADE = 17, - PROJ_XREPEAT = 18, - PROJ_YREPEAT = 19, - PROJ_PAL = 20, - PROJ_EXTRA_RAND = 21, - PROJ_HITRADIUS = 22, - PROJ_VEL_MULT = 23, - PROJ_OFFSET = 24, - PROJ_BOUNCES = 25, - PROJ_BSOUND = 26, - PROJ_RANGE = 27, - PROJ_FLASH_COLOR = 28, - }, - - { - EVENT_INIT = 0, -- TODO: currently can't run since we init Lunatic state only afterwards - EVENT_ENTERLEVEL = 1, - EVENT_RESETWEAPONS = 2, - EVENT_RESETINVENTORY = 3, - EVENT_HOLSTER = 4, - EVENT_LOOKLEFT = 5, - EVENT_LOOKRIGHT = 6, - EVENT_SOARUP = 7, - EVENT_SOARDOWN = 8, - EVENT_CROUCH = 9, - EVENT_JUMP = 10, - EVENT_RETURNTOCENTER = 11, - EVENT_LOOKUP = 12, - EVENT_LOOKDOWN = 13, - EVENT_AIMUP = 14, - EVENT_FIRE = 15, - EVENT_CHANGEWEAPON = 16, - EVENT_GETSHOTRANGE = 17, - EVENT_GETAUTOAIMANGLE = 18, - EVENT_GETLOADTILE = 19, - EVENT_CHEATGETSTEROIDS = 20, - EVENT_CHEATGETHEAT = 21, - EVENT_CHEATGETBOOT = 22, - EVENT_CHEATGETSHIELD = 23, - EVENT_CHEATGETSCUBA = 24, - EVENT_CHEATGETHOLODUKE = 25, - EVENT_CHEATGETJETPACK = 26, - EVENT_CHEATGETFIRSTAID = 27, - EVENT_QUICKKICK = 28, - EVENT_INVENTORY = 29, - EVENT_USENIGHTVISION = 30, - EVENT_USESTEROIDS = 31, - EVENT_INVENTORYLEFT = 32, - EVENT_INVENTORYRIGHT = 33, - EVENT_HOLODUKEON = 34, - EVENT_HOLODUKEOFF = 35, - EVENT_USEMEDKIT = 36, - EVENT_USEJETPACK = 37, - EVENT_TURNAROUND = 38, - EVENT_DISPLAYWEAPON = 39, - EVENT_FIREWEAPON = 40, - EVENT_SELECTWEAPON = 41, - EVENT_MOVEFORWARD = 42, - EVENT_MOVEBACKWARD = 43, - EVENT_TURNLEFT = 44, - EVENT_TURNRIGHT = 45, - EVENT_STRAFELEFT = 46, - EVENT_STRAFERIGHT = 47, - EVENT_WEAPKEY1 = 48, - EVENT_WEAPKEY2 = 49, - EVENT_WEAPKEY3 = 50, - EVENT_WEAPKEY4 = 51, - EVENT_WEAPKEY5 = 52, - EVENT_WEAPKEY6 = 53, - EVENT_WEAPKEY7 = 54, - EVENT_WEAPKEY8 = 55, - EVENT_WEAPKEY9 = 56, - EVENT_WEAPKEY10 = 57, - EVENT_DRAWWEAPON = 58, - EVENT_DISPLAYCROSSHAIR = 59, - EVENT_DISPLAYREST = 60, - EVENT_DISPLAYSBAR = 61, - EVENT_RESETPLAYER = 62, - EVENT_INCURDAMAGE = 63, - EVENT_AIMDOWN = 64, - EVENT_GAME = 65, - EVENT_PREVIOUSWEAPON = 66, - EVENT_NEXTWEAPON = 67, - EVENT_SWIMUP = 68, - EVENT_SWIMDOWN = 69, - EVENT_GETMENUTILE = 70, - EVENT_SPAWN = 71, - EVENT_LOGO = 72, - EVENT_EGS = 73, - EVENT_DOFIRE = 74, - EVENT_PRESSEDFIRE = 75, - EVENT_USE = 76, - EVENT_PROCESSINPUT = 77, - EVENT_FAKEDOMOVETHINGS = 78, - EVENT_DISPLAYROOMS = 79, - EVENT_KILLIT = 80, - EVENT_LOADACTOR = 81, - EVENT_DISPLAYBONUSSCREEN = 82, - EVENT_DISPLAYMENU = 83, - EVENT_DISPLAYMENUREST = 84, - EVENT_DISPLAYLOADINGSCREEN = 85, - EVENT_ANIMATESPRITES = 86, - EVENT_NEWGAME = 87, - EVENT_SOUND = 88, - EVENT_CHECKTOUCHDAMAGE = 89, - EVENT_CHECKFLOORDAMAGE = 90, - EVENT_LOADGAME = 91, - EVENT_SAVEGAME = 92, - EVENT_PREGAME = 93, - EVENT_CHANGEMENU = 94, - }, - - { - SFLAG_SHADOW = 0x00000001, - SFLAG_NVG = 0x00000002, - SFLAG_NOSHADE = 0x00000004, - SFLAG_PROJECTILE = 0x00000008, - SFLAG_DECAL = 0x00000010, - SFLAG_BADGUY = 0x00000020, - SFLAG_NOPAL = 0x00000040, - SFLAG_NOEVENTCODE = 0x00000080, - SFLAG_NOLIGHT = 0x00000100, - SFLAG_USEACTIVATOR = 0x00000200, - SFLAG_NULL = 0x00000400, - SFLAG_NOCLIP = 0x00000800, - SFLAG_NOFLOORSHADOW = 0x00001000, - SFLAG_SMOOTHMOVE = 0x00002000, - SFLAG_NOTELEPORT = 0x00004000, --- SFLAG_BADGUYSTAYPUT = 0x00008000, --- SFLAG_CACHE = 0x00010000, --- SFLAG_ROTFIXED = 0x00020000, - }, - - { - STAT_DEFAULT = 0, - STAT_ACTOR = 1, - STAT_ZOMBIEACTOR = 2, - STAT_EFFECTOR = 3, - STAT_PROJECTILE = 4, - STAT_MISC = 5, - STAT_STANDABLE = 6, - STAT_LOCATOR = 7, - STAT_ACTIVATOR = 8, - STAT_TRANSPORT = 9, - STAT_PLAYER = 10, - STAT_FX = 11, - STAT_FALLER = 12, - STAT_DUMMYPLAYER = 13, - STAT_LIGHT = 14, - STAT_NETALLOC = 15, - }, - - { - GAMEFUNC_MOVE_FORWARD = 0, - GAMEFUNC_MOVE_BACKWARD = 1, - GAMEFUNC_TURN_LEFT = 2, - GAMEFUNC_TURN_RIGHT = 3, - GAMEFUNC_STRAFE = 4, - GAMEFUNC_FIRE = 5, - GAMEFUNC_OPEN = 6, - GAMEFUNC_RUN = 7, - GAMEFUNC_AUTORUN = 8, - GAMEFUNC_JUMP = 9, - GAMEFUNC_CROUCH = 10, - GAMEFUNC_LOOK_UP = 11, - GAMEFUNC_LOOK_DOWN = 12, - GAMEFUNC_LOOK_LEFT = 13, - GAMEFUNC_LOOK_RIGHT = 14, - GAMEFUNC_STRAFE_LEFT = 15, - GAMEFUNC_STRAFE_RIGHT = 16, - GAMEFUNC_AIM_UP = 17, - GAMEFUNC_AIM_DOWN = 18, - GAMEFUNC_WEAPON_1 = 19, - GAMEFUNC_WEAPON_2 = 20, - GAMEFUNC_WEAPON_3 = 21, - GAMEFUNC_WEAPON_4 = 22, - GAMEFUNC_WEAPON_5 = 23, - GAMEFUNC_WEAPON_6 = 24, - GAMEFUNC_WEAPON_7 = 25, - GAMEFUNC_WEAPON_8 = 26, - GAMEFUNC_WEAPON_9 = 27, - GAMEFUNC_WEAPON_10 = 28, - GAMEFUNC_INVENTORY = 29, - GAMEFUNC_INVENTORY_LEFT = 30, - GAMEFUNC_INVENTORY_RIGHT = 31, - GAMEFUNC_HOLO_DUKE = 32, - GAMEFUNC_JETPACK = 33, - GAMEFUNC_NIGHTVISION = 34, - GAMEFUNC_MEDKIT = 35, - GAMEFUNC_TURNAROUND = 36, - GAMEFUNC_SENDMESSAGE = 37, - GAMEFUNC_MAP = 38, - GAMEFUNC_SHRINK_SCREEN = 39, - GAMEFUNC_ENLARGE_SCREEN = 40, - GAMEFUNC_CENTER_VIEW = 41, - GAMEFUNC_HOLSTER_WEAPON = 42, - GAMEFUNC_SHOW_OPPONENTS_WEAPON = 43, - GAMEFUNC_MAP_FOLLOW_MODE = 44, - GAMEFUNC_SEE_COOP_VIEW = 45, - GAMEFUNC_MOUSE_AIMING = 46, - GAMEFUNC_TOGGLE_CROSSHAIR = 47, - GAMEFUNC_STEROIDS = 48, - GAMEFUNC_QUICK_KICK = 49, - GAMEFUNC_NEXT_WEAPON = 50, - GAMEFUNC_PREVIOUS_WEAPON = 51, --- GAMEFUNC_SHOW_CONSOLE = 52, - GAMEFUNC_SHOW_DUKEMATCH_SCORES = 53, - GAMEFUNC_DPAD_SELECT = 54, - GAMEFUNC_DPAD_AIMING = 55, - } + STR, + PROJ, + EVENT, + SFLAG, + STAT, + GAMEFUNC, } diff --git a/polymer/eduke32/source/lunatic/control.lua b/polymer/eduke32/source/lunatic/control.lua index 41a62dff6..01444a428 100644 --- a/polymer/eduke32/source/lunatic/control.lua +++ b/polymer/eduke32/source/lunatic/control.lua @@ -20,7 +20,7 @@ local cansee, hitscan, neartag = dc.cansee, dc.hitscan, dc.neartag local inside = dc.inside local sector, wall, sprite = dc.sector, dc.wall, dc.sprite -local spritesofsect = dc.spritesofsect +local spritesofsect, spritesofstat = dc.spritesofsect, dc.spritesofstat module(...) @@ -304,6 +304,7 @@ end local D = { -- TODO: dynamic tile remapping ACTIVATOR = 2, + RESPAWN = 9, APLAYER = 1405, FIRSTAID = 53, @@ -314,8 +315,23 @@ local D = { BOOTS = 61, HOLODUKE = 1348, + STATUE = 753, + NAKED1 = 603, + PODFEM1 = 1294, + FEM1 = 1312, + FEM2 = 1317, + FEM3 = 1321, + FEM5 = 1323, + FEM4 = 1325, + FEM6 = 1334, + FEM8 = 1336, + FEM7 = 1395, + FEM9 = 3450, + FEM10 = 4864, + ATOMICHEALTH = 100, GLASSPIECES = 1031, + TRANSPORTERSTAR = 1630, COMMANDER = 1920, JIBS2 = 2250, SCRAP1 = 2400, @@ -713,7 +729,7 @@ end function _canseetarget(spr, ps) -- NOTE: &41 ? - return cansee(spr^krandand(41), spr.sectnum, + return cansee(spr^(256*krandand(41)), spr.sectnum, ps.pos, sprite[ps.i].sectnum) end @@ -855,10 +871,55 @@ end function _flash(spr, ps) spr.shade = -127 - ps.visibility = -127 + ps.visibility = -127 -- XXX ffiC.lastvisinc = ffiC.totalclock+32 end +local function G_OperateRespawns(tag) + for i in spritesofstat(ffiC.STAT_FX) do + local spr = sprite[i] + + if (spr.lotag==tag and spr.picnum==D.RESPAWN) then + if (ffiC.ud.monsters_off~=0 and isenemytile(spr.hitag)) then + return + end + + local j = spawn(i, D.TRANSPORTERSTAR) + sprite[j].z = sprite[j].z - (32*256) + + -- Just a way to killit (see G_MoveFX(): RESPAWN__STATIC) + spr.extra = 66-12 + end + end +end + +local RESPAWN_USE_YVEL = +{ + [D.STATUE] = true, + [D.NAKED1] = true, + [D.PODFEM1] = true, + [D.FEM1] = true, + [D.FEM2] = true, + [D.FEM3] = true, + [D.FEM5] = true, + [D.FEM4] = true, + [D.FEM6] = true, + [D.FEM8] = true, + [D.FEM7] = true, + [D.FEM9] = true, + [D.FEM10] = true, +} + +function _respawnhitag(spr) + if (RESPAWN_USE_YVEL[spr.picnum]) then + if (spr.yvel ~= 0) then + G_OperateRespawns(spr.yvel) + end + else + G_OperateRespawns(spr.hitag) + end +end + local INVENTILE = { [D.FIRSTAID] = true, [D.STEROIDS] = true, @@ -879,6 +940,48 @@ function _checkrespawn(spr) return (ffiC.ud.respawn_items~=0) end +-- SOUNDS + +local function check_sound_idx(sndidx) + if (sndidx >= con_lang.MAXSOUNDS+0ULL) then + error("invalid sound number "..sndidx, 2) + end +end + +function _ianysound(aci) + check_sprite_idx(aci) + return (ffiC.A_CheckAnySoundPlaying(aci)~=0) +end + +function _sound(aci, sndidx) + check_sprite_idx(aci) + ffiC.A_PlaySound(sndidx, aci) +end + +function _globalsound(pli, sndidx) + -- TODO: conditional on coop, fake multimode + if (pli==ffiC.screenpeek) then + _sound(player[pli].i, sndidx) + end +end + +function _stopsound(aci, sndidx) + check_sprite_idx(aci) + check_sound_idx(sndidx) + -- XXX: This is weird: the checking is done wrt a sprite, but the sound not. + -- NOTE: S_StopSound() stops sound that started playing most recently. + if (ffiC.S_CheckSoundPlaying(aci, sndidx) ~= 0) then + S_StopSound(sndidx) + end +end + +function _soundonce(aci, sndidx) + check_sound_idx(sndidx) + if (ffiC.S_CheckSoundPlaying(aci, sndidx) == 0) then + _sound(aci, sndidx) + end +end + --- Exported functions --- diff --git a/polymer/eduke32/source/lunatic/defs.ilua b/polymer/eduke32/source/lunatic/defs.ilua index 6935b6e7a..769976598 100644 --- a/polymer/eduke32/source/lunatic/defs.ilua +++ b/polymer/eduke32/source/lunatic/defs.ilua @@ -164,6 +164,9 @@ local DUKEPLAYER_STRUCT = [[ uint32_t interface_toggle_flag; + int32_t zrange; + int16_t angrange, autoaimang; + uint16_t max_actors_killed, actors_killed; uint16_t gotweapon, zoom; @@ -455,6 +458,7 @@ tiledata_t g_tile[MAXTILES]; char *ScriptQuotes[]; const int32_t playerswhenstarted; +const int32_t screenpeek; int32_t lastvisinc; int16_t g_spriteDeleteQueueSize; int16_t BlimpSpawnSprites[15]; @@ -476,6 +480,11 @@ int32_t A_Spawn(int32_t j, int32_t pn); void A_AddToDeleteQueue(int32_t i); void P_DoQuote(int32_t q, DukePlayer_t *p); void G_ClearCameraView(DukePlayer_t *ps); + +int32_t A_CheckAnySoundPlaying(int32_t i); +int32_t A_PlaySound(uint32_t num, int32_t i); +int32_t S_CheckSoundPlaying(int32_t i, int32_t num); +void S_StopSound(int32_t num); ]] -- functions @@ -792,7 +801,7 @@ local player_mt = { } ffi.metatype("DukePlayer_t", player_mt) - +-- Declare all con_lang.labels constants in the global FFI namespace. for i=1,#con_lang.labels do local strbuf = {"enum {"} @@ -1077,7 +1086,7 @@ local function our_gameevent(event, func) if (event:sub(1,6) ~= "EVENT_") then event = "EVENT_"..event end - local eventidx = con_lang.labels[3][event] -- 3: event list + local eventidx = con_lang.labels.EVENT[event] if (eventidx == nil) then errorf(2, "gameevent: invalid event label %q", event) end diff --git a/polymer/eduke32/source/lunatic/dynsymlist b/polymer/eduke32/source/lunatic/dynsymlist index f4c263fa8..64f26a6a8 100644 --- a/polymer/eduke32/source/lunatic/dynsymlist +++ b/polymer/eduke32/source/lunatic/dynsymlist @@ -75,6 +75,7 @@ g_tile; ScriptQuotes; +screenpeek; playerswhenstarted; lastvisinc; g_spriteDeleteQueueSize; @@ -108,4 +109,9 @@ A_Spawn; A_AddToDeleteQueue; P_DoQuote; G_ClearCameraView; + +A_CheckAnySoundPlaying; +A_PlaySound; +S_CheckSoundPlaying; +S_StopSound; }; diff --git a/polymer/eduke32/source/lunatic/lunacon.lua b/polymer/eduke32/source/lunatic/lunacon.lua index f57c1afdb..f186cf57a 100644 --- a/polymer/eduke32/source/lunatic/lunacon.lua +++ b/polymer/eduke32/source/lunatic/lunacon.lua @@ -29,7 +29,7 @@ local ffi, ffiC if (string.dump) then bit = require("bit") -- For Rio Lua: - bit = { bor=function() return 0 end } +-- bit = { bor=function() return 0 end } require("strict") else bit = require("bit") @@ -91,8 +91,8 @@ local g_warn = { ["not-redefined"]=true, ["bad-identifier"]=true, -- How many 'if' statements are following immediately each other, -- needed to cope with CONs dangling-else resolution -local g_ifseqlevel = 0 - +local g_iflevel = 0 +local g_ifelselevel = 0 ---=== Code generation ===--- local g_have_file = {} -- [filename]=true @@ -108,7 +108,8 @@ local function getlinecol(pos) end -- fwd-decl local function new_initial_codetab() return { "local _con, _bit, _math = require'con', require'bit', require'math';", - "local sector, sprite, actor, player = sector, sprite, actor, player;" + "local sector, sprite, actor, player = sector, sprite, actor, player;", + "local gameactor=gameactor;" } end @@ -156,7 +157,7 @@ local function on_actor_end(usertype, tsamm, codetab) end local function on_state_end(statename, codetab) - -- TODO: mangle names, make them accessible from other translation units + -- TODO: mangle names addcodef("local function %s(_aci, _pli, _dist)", statename) assert(type(codetab)=="table") addcode(codetab) @@ -278,7 +279,7 @@ local function do_define_label(identifier, num) else -- conl.labels[...]: don't warn for wrong PROJ_ redefinitions if (g_warn["not-redefined"]) then - if (oldval ~= num and conl.labels[2][identifier]==nil) then + if (oldval ~= num and conl.labels.PROJ[identifier]==nil) then warnprintf("label \"%s\" not redefined with new value %d (old: %d)", identifier, num, oldval) end @@ -796,6 +797,10 @@ local function handle_move(mv, ...) return format(ACS":set_move(%s,%d)", mv, (flags[1] and bit.bor(...)) or 0) end +local function handle_debug(val) + return format("print('%s:%d: debug %d')", g_filename, getlinecol(g_lastkwpos), val) +end + -- NOTE about prefixes: most is handled by all_alt_pattern(), however commands -- that have no arguments and that are prefixes of other commands MUST be -- suffixed with a "* #sp1" pattern. @@ -961,13 +966,13 @@ local Ci = { angoff = cmd(D) / "spritext[_aci].angoff=%1", debug = cmd(D) - / "", -- TODO? + / handle_debug, endofgame = cmd(D) / "_con._endofgame(_pli,%1)", eqspawn = cmd(D), espawn = cmd(D), globalsound = cmd(D) - / "", + / "_con._globalsound(_pli,%1)", lotsofglass = cmd(D) / "_con._A_SpawnGlass(_aci,%1)", mail = cmd(D) @@ -984,13 +989,14 @@ local Ci = { save = cmd(D), sleeptime = cmd(D) / ACS".timetosleep=%1", - soundonce = cmd(D), + soundonce = cmd(D) + / "_con._soundonce(_aci,%1)", sound = cmd(D) - / "", -- TODO: all things audio... + / "_con._sound(_aci,%1)", spawn = cmd(D) - / "_con.spawn(_aci, %1)", + / "_con.spawn(_aci,%1)", stopsound = cmd(D) - / "", + / "_con._stopsound(_aci,%1)", eshoot = cmd(D), ezshoot = cmd(R,D), @@ -1003,7 +1009,7 @@ local Ci = { fall = cmd() / "_con._VM_FallSprite(_aci)", flash = cmd() - / format("_con._flash(%s,%s)", ACS"", SPS""), + / format("_con._flash(%s,%s)", SPS"", PLS""), getlastpal = cmd() / "_con._getlastpal(_aci)", insertspriteq = cmd() @@ -1011,7 +1017,7 @@ local Ci = { killit = cmd() -- NLCF / "_con.killit()", mikesnd = cmd() - / "", -- TODO + / format("_con._soundonce(_aci,%s)", SPS".yvel"), nullop = cmd() / "", -- NOTE: really generate no code pkick = cmd() @@ -1025,7 +1031,7 @@ local Ci = { resetplayer = cmd() -- NLCF / "if (_con._VM_ResetPlayer2(_pli,_aci)) then _con.longjmp() end", respawnhitag = cmd() - / "", -- TODO + / format("_con._respawnhitag(%s)", SPS""), tip = cmd() / PLS".tipincs=26", tossweapon = cmd() @@ -1176,13 +1182,13 @@ local Cif = { ifrnd = cmd(D) / "_con.rnd(%1)", ifpdistl = cmd(D) - / function(val) return "_dist<"..val end, --, "_con.sleepcheck(_aci,_dist)" end, + / function(val) return "_dist<"..val, "", "_con._sleepcheck(_aci,_dist)" end, ifpdistg = cmd(D) - / function(val) return "_dist>"..val end, --"_con.sleepcheck(_aci,_dist)" end, + / function(val) return "_dist>"..val, "", "_con._sleepcheck(_aci,_dist)" end, ifactioncount = cmd(D) - / ACS":get_acount()==%1", + / ACS":get_acount()>=%1", ifcount = cmd(D) - / ACS":get_count()==%1", + / ACS":get_count()>=%1", ifactor = cmd(D) / SPS".picnum==%1", ifstrength = cmd(D) @@ -1246,7 +1252,7 @@ local Cif = { ifnotmoving = cmd() / "_bit.band(actor[_aci].movflag,49152)>16384", ifnosounds = cmd() - / "false", + / "not _con._ianysound()", ifmultiplayer = cmd() / "false", -- TODO? ifinwater = cmd() @@ -1264,8 +1270,8 @@ local Cif = { ifclient = cmd(), ifcanshoottarget = cmd() / "_con._canshoottarget(_dist,_aci)", - ifcanseetarget = cmd() -- TODO: conditionally set timetosleep afterwards - / format("_con._canseetarget(%s,%s)", SPS"", PLS""), + ifcanseetarget = cmd() -- XXX: 1536 is SLEEPTIME + / function() return format("_con._canseetarget(%s,%s)", SPS"", PLS""), ACS".timetosleep=1536" end, ifcansee = cmd() * #sp1 / format("_con._cansee(_aci,%s)", PLS""), ifbulletnear = cmd() @@ -1396,9 +1402,12 @@ local function after_if_cmd_Cmt(subj, pos, ...) return nil end - if (type(capts[1])=="string" and (capts[2]==nil or type(capts[2])=="string") and capts[3]==nil) then - assert(capts[2]==nil or capts[2]=="_con.sleepcheck(_aci,_dist)") - return true, capts[1], capts[2] + if (capts[1] ~= nil) then + assert(#capts <= 3) + for i=1,#capts do + assert(type(capts[i]=="string")) + end + return true, unpack(capts, 1, #capts) end return true @@ -1516,39 +1525,60 @@ local t_good_identifier = Range("AZ", "az", "__") * Range("AZ", "az", "__", "09" -- This is broken in itself, so we ought to make a compatibility/modern CON switch. local t_broken_identifier = BadIdent(-((t_number + t_good_identifier) * (sp1 + Set("[]:"))) * (alphanum + Set("_/\\*?")) * (alphanum + Set("_/\\*-+?"))^0) -local g_ifStack = {} -local function begin_if_fn(condstr, endifstr) - g_ifseqlevel = g_ifseqlevel+1 +-- These two tables hold code to be inserted at a later point: either at +-- the end of the "if" body, or the end of the whole "if [else]" block. +-- For CON interpreter patterns like these: +-- VM_CONDITIONAL(); +-- +-- (Still not the same if the body returns or jumps out) +local g_endIfCode = {} +local g_endIfElseCode = {} + +local function add_deferred_code(tab, lev, str) + if (str ~= nil) then + assert(type(str)=="string") + tab[lev] = str + end +end + +local function get_deferred_code(tab, lev, code) + if (tab[lev]) then + code = code..tab[lev] + tab[lev] = nil + end + return code +end + +local function begin_if_fn(condstr, endifstr, endifelsestr) condstr = condstr or "TODO" assert(type(condstr)=="string") - if (endifstr ~= nil) then - assert(type(endifstr)=="string") - g_ifStack[#g_ifStack+1] = endifstr - end + add_deferred_code(g_endIfCode, g_iflevel, endifstr) + add_deferred_code(g_endIfElseCode, g_ifelselevel, endifelsestr) + + g_iflevel = g_iflevel+1 + g_ifelselevel = g_ifelselevel+1 return format("if (%s) then", condstr) end local function end_if_fn() - local code - if (#g_ifStack > 0) then - code = g_ifStack[#g_ifStack] - g_ifStack[#g_ifStack] = nil - end - - g_ifseqlevel = g_ifseqlevel-1 - if (code) then - -- The condition above is significant here. - -- (See lpeg.c: functioncap(), where a lua_call(..., LUA_MULTRET) is done) + g_iflevel = g_iflevel-1 + local code = get_deferred_code(g_endIfCode, g_iflevel, "") + if (code ~= "") then return code end end +local function end_if_else_fn() + g_ifelselevel = g_ifelselevel-1 + return get_deferred_code(g_endIfElseCode, g_ifelselevel, "end ") +end + local function check_else_Cmt() -- match an 'else' only at the outermost level - local good = (g_ifseqlevel==0) + local good = (g_iflevel==0) if (good) then return true, "else" end @@ -1610,7 +1640,7 @@ local Grammar = Pat{ if_stmt = con_if_begs/begin_if_fn * sp1 * Var("single_stmt") * (Pat("")/end_if_fn) * (sp1 * lpeg.Cmt(Pat("else"), check_else_Cmt) * sp1 * Var("single_stmt"))^-1 - * lpeg.Cc("end"), + * (Pat("")/end_if_else_fn), -- TODO?: SST TC has "state ... else ends" while_stmt = Keyw("whilevarvarn") * sp1 * t_rvar * sp1 * t_rvar * sp1 * Var("single_stmt") @@ -1687,7 +1717,8 @@ function parse(contents) -- local local lastkw, lastkwpos, numerrors = g_lastkw, g_lastkwpos, g_numerrors local newlineidxs = g_newlineidxs - g_ifseqlevel = 0 + g_iflevel = 0 + g_ifelselevel = 0 g_have_file[g_filename] = true -- set up new state diff --git a/polymer/eduke32/source/player.c b/polymer/eduke32/source/player.c index 658438295..a6314bc6b 100644 --- a/polymer/eduke32/source/player.c +++ b/polymer/eduke32/source/player.c @@ -342,13 +342,21 @@ static int32_t GetAutoAimAngle(int32_t i, int32_t p, int32_t atwith, Bassert((unsigned)p < MAXPLAYERS); +#ifdef LUNATIC + g_player[p].ps->autoaimang = AUTO_AIM_ANGLE; +#else Gv_SetVar(g_iAimAngleVarID, AUTO_AIM_ANGLE, i, p); +#endif if (G_HaveEvent(EVENT_GETAUTOAIMANGLE)) VM_OnEvent(EVENT_GETAUTOAIMANGLE, i, p, -1, 0); { +#ifdef LUNATIC + int32_t aimang = g_player[p].ps->autoaimang; +#else int32_t aimang = Gv_GetVar(g_iAimAngleVarID, i, p); +#endif if (aimang > 0) j = A_FindTargetSprite(&sprite[i], aimang, atwith); } @@ -445,18 +453,27 @@ static void P_PreFireHitscan(int32_t i, int32_t p, int32_t atwith, int32_t zRange=256; int32_t j = GetAutoAimAngle(i, p, atwith, 5<<8, 0+1, srcvect, 256, zvel, sa); - const DukePlayer_t *const ps = g_player[p].ps; + DukePlayer_t *const ps = g_player[p].ps; +#ifdef LUNATIC + ps->angrange = angRange; + ps->zrange = zRange; +#else Gv_SetVar(g_iAngRangeVarID,angRange, i,p); Gv_SetVar(g_iZRangeVarID,zRange,i,p); +#endif if (G_HaveEvent(EVENT_GETSHOTRANGE)) VM_OnEvent(EVENT_GETSHOTRANGE, i,p, -1, 0); -#if !defined LUNATIC_ONLY - // TODO + +#if defined LUNATIC + angRange = ps->angrange; + zRange = ps->zrange; +#else angRange=Gv_GetVar(g_iAngRangeVarID,i,p); zRange=Gv_GetVar(g_iZRangeVarID,i,p); #endif + if (accurate_autoaim_p) { if (!ps->auto_aim) diff --git a/polymer/eduke32/source/player.h b/polymer/eduke32/source/player.h index 58cca1593..675df4c07 100644 --- a/polymer/eduke32/source/player.h +++ b/polymer/eduke32/source/player.h @@ -164,7 +164,10 @@ typedef struct { int32_t autostep, autostep_sbw; uint32_t interface_toggle_flag; - +#ifdef LUNATIC + int32_t zrange; + int16_t angrange, autoaimang; +#endif uint16_t max_actors_killed, actors_killed; uint16_t gotweapon, zoom;