Rednukem: WW2GI events

# Conflicts:
#	source/rr/src/events_defs.h
#	source/rr/src/game.cpp
#	source/rr/src/gameexec.h
This commit is contained in:
nukeykt 2020-02-07 20:47:54 +09:00 committed by Christoph Oelckers
parent 47572cc01a
commit 972f2c4f0d
7 changed files with 506 additions and 268 deletions

View file

@ -216,22 +216,23 @@ void G_SetupCheats(void)
} }
} }
static void doinvcheat(DukePlayer_t * const pPlayer, int32_t invidx, int32_t defaultnum) static void doinvcheat(DukePlayer_t * const pPlayer, int32_t invidx, int32_t defaultnum, int event)
{ {
defaultnum = VM_OnEventWithReturn(event, pPlayer->i, myconnectindex, defaultnum);
if (defaultnum >= 0) if (defaultnum >= 0)
pPlayer->inv_amount[invidx] = defaultnum; pPlayer->inv_amount[invidx] = defaultnum;
} }
static void G_CheatGetInv(DukePlayer_t *pPlayer) static void G_CheatGetInv(DukePlayer_t *pPlayer)
{ {
doinvcheat(pPlayer, GET_STEROIDS, 400); doinvcheat(pPlayer, GET_STEROIDS, 400, EVENT_CHEATGETSTEROIDS);
if (!RR) doinvcheat(pPlayer, GET_HEATS, 1200); if (!RR) doinvcheat(pPlayer, GET_HEATS, 1200, EVENT_CHEATGETHEAT);
doinvcheat(pPlayer, GET_BOOTS, RR ? 2000 : 200); doinvcheat(pPlayer, GET_BOOTS, RR ? 2000 : 200, EVENT_CHEATGETBOOT);
doinvcheat(pPlayer, GET_SHIELD, 100); doinvcheat(pPlayer, GET_SHIELD, 100, EVENT_CHEATGETSHIELD);
doinvcheat(pPlayer, GET_SCUBA, 6400); doinvcheat(pPlayer, GET_SCUBA, 6400, EVENT_CHEATGETSCUBA);
doinvcheat(pPlayer, GET_HOLODUKE, 2400); doinvcheat(pPlayer, GET_HOLODUKE, 2400, EVENT_CHEATGETHOLODUKE);
doinvcheat(pPlayer, GET_JETPACK, RR ? 600 : 1600); doinvcheat(pPlayer, GET_JETPACK, RR ? 600 : 1600, EVENT_CHEATGETJETPACK);
doinvcheat(pPlayer, GET_FIRSTAID, pPlayer->max_player_health); doinvcheat(pPlayer, GET_FIRSTAID, pPlayer->max_player_health, EVENT_CHEATGETFIRSTAID);
} }
static void end_cheat(DukePlayer_t * const pPlayer) static void end_cheat(DukePlayer_t * const pPlayer)

View file

@ -1,4 +1,4 @@
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
/* /*
Copyright (C) 2016 EDuke32 developers and contributors Copyright (C) 2016 EDuke32 developers and contributors
@ -6730,6 +6730,8 @@ static void G_CompileScripts(void)
Bmemset(sprite, 0, MAXSPRITES*sizeof(spritetype)); Bmemset(sprite, 0, MAXSPRITES*sizeof(spritetype));
Bmemset(sector, 0, MAXSECTORS*sizeof(sectortype)); Bmemset(sector, 0, MAXSECTORS*sizeof(sectortype));
Bmemset(wall, 0, MAXWALLS*sizeof(walltype)); Bmemset(wall, 0, MAXWALLS*sizeof(walltype));
VM_OnEvent(EVENT_INIT);
} }
static inline void G_CheckGametype(void) static inline void G_CheckGametype(void)

View file

@ -131,6 +131,87 @@ static void VM_DeleteSprite(int const spriteNum, int const playerNum)
} }
intptr_t apScriptEvents[MAXEVENTS]; intptr_t apScriptEvents[MAXEVENTS];
static uspritetype dummy_sprite;
static actor_t dummy_actor;
static inline void VM_DummySprite(void)
{
vm.pUSprite = &dummy_sprite;
vm.pActor = &dummy_actor;
vm.pData = &dummy_actor.t_data[0];
}
// verification that the event actually exists happens elsewhere
static FORCE_INLINE int32_t VM_EventInlineInternal__(int const eventNum, int const spriteNum, int const playerNum,
int const playerDist = -1, int32_t returnValue = 0)
{
vmstate_t const newVMstate = { spriteNum, playerNum, playerDist, 0,
&sprite[spriteNum&(MAXSPRITES-1)],
&actor[spriteNum&(MAXSPRITES-1)].t_data[0],
g_player[playerNum&(MAXPLAYERS-1)].ps,
&actor[spriteNum&(MAXSPRITES-1)] };
auto &globalReturn = aGameVars[g_returnVarID].global;
struct
{
vmstate_t vm;
intptr_t globalReturn;
int eventNum;
intptr_t const *insptr;
} const saved = { vm, globalReturn, g_currentEvent, insptr };
vm = newVMstate;
g_currentEvent = eventNum;
insptr = apScript + apScriptEvents[eventNum];
globalReturn = returnValue;
double const t = timerGetHiTicks();
if ((unsigned)spriteNum >= MAXSPRITES)
VM_DummySprite();
if ((unsigned)playerNum >= (unsigned)g_mostConcurrentPlayers)
vm.pPlayer = g_player[0].ps;
VM_Execute(true);
if (vm.flags & VM_KILL)
VM_DeleteSprite(vm.spriteNum, vm.playerNum);
// restoring these needs to happen after VM_DeleteSprite() due to event recursion
returnValue = globalReturn;
vm = saved.vm;
globalReturn = saved.globalReturn;
g_currentEvent = saved.eventNum;
insptr = saved.insptr;
return returnValue;
}
// the idea here is that the compiler inlines the call to VM_EventInlineInternal__() and gives us a set of
// functions which are optimized further based on distance/return having values known at compile time
int32_t VM_ExecuteEvent(int const nEventID, int const spriteNum, int const playerNum, int const nDist, int32_t const nReturn)
{
return VM_EventInlineInternal__(nEventID, spriteNum, playerNum, nDist, nReturn);
}
int32_t VM_ExecuteEvent(int const nEventID, int const spriteNum, int const playerNum, int const nDist)
{
return VM_EventInlineInternal__(nEventID, spriteNum, playerNum, nDist);
}
int32_t VM_ExecuteEvent(int const nEventID, int const spriteNum, int const playerNum)
{
return VM_EventInlineInternal__(nEventID, spriteNum, playerNum);
}
int32_t VM_ExecuteEventWithValue(int const nEventID, int const spriteNum, int const playerNum, int32_t const nReturn)
{
return VM_EventInlineInternal__(nEventID, spriteNum, playerNum, -1, nReturn);
}
static int32_t VM_CheckSquished(void) static int32_t VM_CheckSquished(void)
{ {

View file

@ -28,6 +28,35 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "gamedef.h" // vmstate_t #include "gamedef.h" // vmstate_t
BEGIN_RR_NS BEGIN_RR_NS
int32_t VM_ExecuteEvent(int const nEventID, int const spriteNum, int const playerNum, int const nDist, int32_t const nReturn);
int32_t VM_ExecuteEvent(int const nEventID, int const spriteNum, int const playerNum, int const nDist);
int32_t VM_ExecuteEvent(int const nEventID, int const spriteNum, int const playerNum);
int32_t VM_ExecuteEventWithValue(int const nEventID, int const spriteNum, int const playerNum, int32_t const nReturn);
static FORCE_INLINE int VM_HaveEvent(int const nEventID)
{
return !!apScriptEvents[nEventID];
}
static FORCE_INLINE int32_t VM_OnEvent(int nEventID, int spriteNum, int playerNum, int nDist, int32_t nReturn)
{
return VM_HaveEvent(nEventID) ? VM_ExecuteEvent(nEventID, spriteNum, playerNum, nDist, nReturn) : nReturn;
}
static FORCE_INLINE int32_t VM_OnEvent(int nEventID, int spriteNum, int playerNum, int nDist)
{
return VM_HaveEvent(nEventID) ? VM_ExecuteEvent(nEventID, spriteNum, playerNum, nDist) : 0;
}
static FORCE_INLINE int32_t VM_OnEvent(int nEventID, int spriteNum = -1, int playerNum = -1)
{
return VM_HaveEvent(nEventID) ? VM_ExecuteEvent(nEventID, spriteNum, playerNum) : 0;
}
static FORCE_INLINE int32_t VM_OnEventWithReturn(int nEventID, int spriteNum, int playerNum, int32_t nReturn)
{
return VM_HaveEvent(nEventID) ? VM_ExecuteEventWithValue(nEventID, spriteNum, playerNum, nReturn) : nReturn;
}
extern int32_t ticrandomseed; extern int32_t ticrandomseed;

View file

@ -302,7 +302,11 @@ static int GetAutoAimAng(int spriteNum, int playerNum, int projecTile, int zAdju
Bassert((unsigned)playerNum < MAXPLAYERS); Bassert((unsigned)playerNum < MAXPLAYERS);
int aimang = (g_player[playerNum].ps->auto_aim == 3 && (!RRRA || projecTile != RPG2)) ? AUTO_AIM_ANGLE<<1 : AUTO_AIM_ANGLE; Gv_SetVar(g_aimAngleVarID, (g_player[playerNum].ps->auto_aim == 3 && (!RRRA || projecTile != RPG2)) ? AUTO_AIM_ANGLE<<1 : AUTO_AIM_ANGLE, spriteNum, playerNum);
VM_OnEvent(EVENT_GETAUTOAIMANGLE, spriteNum, playerNum);
int aimang = Gv_GetVar(g_aimAngleVarID, spriteNum, playerNum);
if (aimang > 0) if (aimang > 0)
returnSprite = A_FindTargetSprite(&sprite[spriteNum], aimang, projecTile); returnSprite = A_FindTargetSprite(&sprite[spriteNum], aimang, projecTile);
@ -360,6 +364,14 @@ static void P_PreFireHitscan(int spriteNum, int playerNum, int projecTile, vec3_
int aimSprite = GetAutoAimAng(spriteNum, playerNum, projecTile, 5 << 8, 0 + 1, srcVect, 256, zvel, shootAng); int aimSprite = GetAutoAimAng(spriteNum, playerNum, projecTile, 5 << 8, 0 + 1, srcVect, 256, zvel, shootAng);
DukePlayer_t *const pPlayer = g_player[playerNum].ps; DukePlayer_t *const pPlayer = g_player[playerNum].ps;
Gv_SetVar(g_angRangeVarID, angRange, spriteNum, playerNum);
Gv_SetVar(g_zRangeVarID, zRange, spriteNum, playerNum);
VM_OnEvent(EVENT_GETSHOTRANGE, spriteNum, playerNum);
angRange = Gv_GetVar(g_angRangeVarID, spriteNum, playerNum);
zRange = Gv_GetVar(g_zRangeVarID, spriteNum, playerNum);
if (accurateAim) if (accurateAim)
{ {
@ -689,7 +701,7 @@ growspark_rr:
if (playerNum >= 0) if (playerNum >= 0)
P_PreFireHitscan(spriteNum, playerNum, projecTile, &startPos, &Zvel, &shootAng, P_PreFireHitscan(spriteNum, playerNum, projecTile, &startPos, &Zvel, &shootAng,
projecTile == SHOTSPARK1, 1); projecTile == SHOTSPARK1 && !WW2GI, 1);
else else
A_PreFireHitscan(pSprite, &startPos, &Zvel, &shootAng, 1); A_PreFireHitscan(pSprite, &startPos, &Zvel, &shootAng, 1);
@ -4125,6 +4137,15 @@ void P_SelectNextInvItem(DukePlayer_t *pPlayer)
pPlayer->inven_icon = ICON_NONE; pPlayer->inven_icon = ICON_NONE;
} }
// Set C-CON's WEAPON and WORKSLIKE gamevars.
void P_SetWeaponGamevars(int playerNum, const DukePlayer_t * const pPlayer)
{
Gv_SetVar(g_weaponVarID, pPlayer->curr_weapon, pPlayer->i, playerNum);
Gv_SetVar(g_worksLikeVarID,
((unsigned)pPlayer->curr_weapon < MAX_WEAPONS) ? PWEAPON(playerNum, pPlayer->curr_weapon, WorksLike) : -1,
pPlayer->i, playerNum);
}
void P_CheckWeapon(DukePlayer_t *pPlayer) void P_CheckWeapon(DukePlayer_t *pPlayer)
{ {
int playerNum; int playerNum;
@ -4179,6 +4200,8 @@ void P_CheckWeapon(DukePlayer_t *pPlayer)
pPlayer->last_weapon = pPlayer->curr_weapon; pPlayer->last_weapon = pPlayer->curr_weapon;
pPlayer->random_club_frame = 0; pPlayer->random_club_frame = 0;
pPlayer->curr_weapon = weaponNum; pPlayer->curr_weapon = weaponNum;
P_SetWeaponGamevars(playerNum, pPlayer);
VM_OnEvent(EVENT_CHANGEWEAPON, pPlayer->i, playerNum);
pPlayer->kickback_pic = 0; pPlayer->kickback_pic = 0;
if (pPlayer->holster_weapon == 1) if (pPlayer->holster_weapon == 1)
{ {
@ -4509,18 +4532,42 @@ static void P_ProcessWeapon(int playerNum)
} }
} }
#define WEAPON2_CLIP 20 #define WEAPON2_CLIP 20
if (NAM && TEST_SYNC_KEY(playerBits, SK_HOLSTER)) if (NAM_WW2GI && TEST_SYNC_KEY(playerBits, SK_HOLSTER)) // 'Holster Weapon
{ {
if (pPlayer->curr_weapon == PISTOL_WEAPON) if (NAM)
{ {
if (pPlayer->ammo_amount[PISTOL_WEAPON] > WEAPON2_CLIP) if (pPlayer->curr_weapon == PISTOL_WEAPON)
{ {
// throw away the remaining clip if (pPlayer->ammo_amount[PISTOL_WEAPON] > WEAPON2_CLIP)
pPlayer->ammo_amount[PISTOL_WEAPON] -= pPlayer->ammo_amount[PISTOL_WEAPON] % WEAPON2_CLIP; {
(*weaponFrame) = 3; // throw away the remaining clip
playerBits &= ~BIT(SK_FIRE); pPlayer->ammo_amount[PISTOL_WEAPON] -= pPlayer->ammo_amount[PISTOL_WEAPON] % WEAPON2_CLIP;
(*weaponFrame) = 3;
playerBits &= ~BIT(SK_FIRE);
}
return;
}
}
else
{
P_SetWeaponGamevars(playerNum, pPlayer);
if (VM_OnEvent(EVENT_HOLSTER, pPlayer->i, playerNum) == 0)
{
if (PWEAPON(playerNum, pPlayer->curr_weapon, Flags) & WEAPON_HOLSTER_CLEARS_CLIP)
{
int const weap = pPlayer->curr_weapon, clipcnt = PWEAPON(playerNum, weap, Clip);
if (pPlayer->ammo_amount[weap] > clipcnt && (pPlayer->ammo_amount[weap] % clipcnt) != 0)
{
pPlayer->ammo_amount[weap] -= pPlayer->ammo_amount[weap] % clipcnt;
*weaponFrame = PWEAPON(playerNum, weap, TotalTime)+1;
playerBits &= ~BIT(SK_FIRE); // not firing...
}
return;
}
} }
return;
} }
} }
#undef WEAPON2_CLIP #undef WEAPON2_CLIP
@ -4577,156 +4624,160 @@ static void P_ProcessWeapon(int playerNum)
} }
else else
{ {
switch (DYNAMICWEAPONMAP(pPlayer->curr_weapon)) P_SetWeaponGamevars(playerNum, pPlayer);
if (VM_OnEvent(EVENT_FIRE, pPlayer->i, playerNum) == 0)
{ {
case HANDBOMB_WEAPON__STATIC: switch (DYNAMICWEAPONMAP(pPlayer->curr_weapon))
pPlayer->hbomb_hold_delay = 0; {
if (pPlayer->ammo_amount[pPlayer->curr_weapon] > 0) case HANDBOMB_WEAPON__STATIC:
{ pPlayer->hbomb_hold_delay = 0;
(*weaponFrame) = 1;
}
break;
case HANDREMOTE_WEAPON__STATIC:
pPlayer->hbomb_hold_delay = 0;
(*weaponFrame) = 1;
break;
case PISTOL_WEAPON__STATIC:
if (pPlayer->ammo_amount[PISTOL_WEAPON] > 0)
{
pPlayer->ammo_amount[PISTOL_WEAPON]--;
(*weaponFrame) = 1;
}
break;
case SHOTGUN_WEAPON__STATIC:
if (pPlayer->ammo_amount[SHOTGUN_WEAPON] > 0 && pPlayer->random_club_frame == 0)
{
(*weaponFrame) = 1;
}
break;
case TRIPBOMB_WEAPON__STATIC:
case BOWLINGBALL_WEAPON__STATIC:
if (RR)
{
if (pPlayer->ammo_amount[pPlayer->curr_weapon] > 0) if (pPlayer->ammo_amount[pPlayer->curr_weapon] > 0)
{ {
//pPlayer->ammo_amount[pPlayer->curr_weapon]--;
(*weaponFrame) = 1; (*weaponFrame) = 1;
} }
break; break;
}
if (pPlayer->curr_weapon == BOWLINGBALL)
break;
if (pPlayer->ammo_amount[pPlayer->curr_weapon] > 0)
{
hitdata_t hitData;
hitscan((const vec3_t *)pPlayer, pPlayer->cursectnum, sintable[(fix16_to_int(pPlayer->q16ang) + 512) & 2047], case HANDREMOTE_WEAPON__STATIC:
sintable[fix16_to_int(pPlayer->q16ang) & 2047], fix16_to_int(F16(100) - pPlayer->q16horiz - pPlayer->q16horizoff) * 32, &hitData, pPlayer->hbomb_hold_delay = 0;
CLIPMASK1);
if ((hitData.sect < 0 || hitData.sprite >= 0) ||
(hitData.wall >= 0 && sector[hitData.sect].lotag > 2))
break;
if (hitData.wall >= 0 && wall[hitData.wall].overpicnum >= 0)
if (wall[hitData.wall].overpicnum == BIGFORCE)
break;
int spriteNum = headspritesect[hitData.sect];
while (spriteNum >= 0)
{
if (sprite[spriteNum].picnum == TRIPBOMB && klabs(sprite[spriteNum].z - hitData.pos.z) < ZOFFSET4 &&
((sprite[spriteNum].x - hitData.pos.x) * (sprite[spriteNum].x - hitData.pos.x) +
(sprite[spriteNum].y - hitData.pos.y) * (sprite[spriteNum].y - hitData.pos.y)) < (290 * 290))
break;
spriteNum = nextspritesect[spriteNum];
}
// ST_2_UNDERWATER
if (spriteNum == -1 && hitData.wall >= 0 && (wall[hitData.wall].cstat & 16) == 0)
if ((wall[hitData.wall].nextsector >= 0 && sector[wall[hitData.wall].nextsector].lotag <= 2) ||
(wall[hitData.wall].nextsector == -1 && sector[hitData.sect].lotag <= 2))
if (((hitData.pos.x - pPlayer->pos.x) * (hitData.pos.x - pPlayer->pos.x) +
(hitData.pos.y - pPlayer->pos.y) * (hitData.pos.y - pPlayer->pos.y)) < (290 * 290))
{
pPlayer->pos.z = pPlayer->opos.z;
pPlayer->vel.z = 0;
(*weaponFrame) = 1;
}
}
break;
case SHRINKER_WEAPON__STATIC:
if (pPlayer->ammo_amount[SHRINKER_WEAPON] > 0)
{
(*weaponFrame) = 1;
A_PlaySound(SHRINKER_FIRE, pPlayer->i);
}
break;
case GROW_WEAPON__STATIC:
if (pPlayer->ammo_amount[GROW_WEAPON] > 0)
{
(*weaponFrame) = 1;
A_PlaySound(RR ? 431 : EXPANDERSHOOT, pPlayer->i);
}
break;
case FREEZE_WEAPON__STATIC:
if (pPlayer->ammo_amount[FREEZE_WEAPON] > 0)
{
(*weaponFrame) = 1;
if (!RR)
A_PlaySound(CAT_FIRE, pPlayer->i);
}
break;
case RPG_WEAPON__STATIC:
case CHAINGUN_WEAPON__STATIC:
if (pPlayer->ammo_amount[pPlayer->curr_weapon] > 0)
{
(*weaponFrame) = 1;
}
break;
case DEVISTATOR_WEAPON__STATIC:
if (pPlayer->ammo_amount[pPlayer->curr_weapon] > 0)
{
(*weaponFrame) = 1; (*weaponFrame) = 1;
pPlayer->hbomb_hold_delay = !pPlayer->hbomb_hold_delay;
if (!RR)
A_PlaySound(CAT_FIRE, pPlayer->i);
}
break;
case KNEE_WEAPON__STATIC:
case SLINGBLADE_WEAPON__STATIC:
if (RRRA)
{
if (pPlayer->ammo_amount[pPlayer->curr_weapon] > 0 && !pPlayer->quick_kick)
(*weaponFrame) = 1;
break; break;
}
if (RRRA && pPlayer->curr_weapon == SLINGBLADE) break;
if (pPlayer->quick_kick == 0)
{
(*weaponFrame) = 1;
}
break;
case CHICKEN_WEAPON__STATIC: case PISTOL_WEAPON__STATIC:
case MOTORCYCLE_WEAPON__STATIC: if (pPlayer->ammo_amount[PISTOL_WEAPON] > 0)
case BOAT_WEAPON__STATIC: {
if (!RRRA) break; pPlayer->ammo_amount[PISTOL_WEAPON]--;
if (pPlayer->ammo_amount[pPlayer->curr_weapon] > 0) (*weaponFrame) = 1;
{ }
(*weaponFrame) = 1; break;
}
break; case SHOTGUN_WEAPON__STATIC:
if (pPlayer->ammo_amount[SHOTGUN_WEAPON] > 0 && pPlayer->random_club_frame == 0)
{
(*weaponFrame) = 1;
}
break;
case TRIPBOMB_WEAPON__STATIC:
case BOWLINGBALL_WEAPON__STATIC:
if (RR)
{
if (pPlayer->ammo_amount[pPlayer->curr_weapon] > 0)
{
//pPlayer->ammo_amount[pPlayer->curr_weapon]--;
(*weaponFrame) = 1;
}
break;
}
if (pPlayer->curr_weapon == BOWLINGBALL)
break;
if (pPlayer->ammo_amount[pPlayer->curr_weapon] > 0)
{
hitdata_t hitData;
hitscan((const vec3_t *)pPlayer, pPlayer->cursectnum, sintable[(fix16_to_int(pPlayer->q16ang) + 512) & 2047],
sintable[fix16_to_int(pPlayer->q16ang) & 2047], fix16_to_int(F16(100) - pPlayer->q16horiz - pPlayer->q16horizoff) * 32, &hitData,
CLIPMASK1);
if ((hitData.sect < 0 || hitData.sprite >= 0) ||
(hitData.wall >= 0 && sector[hitData.sect].lotag > 2))
break;
if (hitData.wall >= 0 && wall[hitData.wall].overpicnum >= 0)
if (wall[hitData.wall].overpicnum == BIGFORCE)
break;
int spriteNum = headspritesect[hitData.sect];
while (spriteNum >= 0)
{
if (sprite[spriteNum].picnum == TRIPBOMB && klabs(sprite[spriteNum].z - hitData.pos.z) < ZOFFSET4 &&
((sprite[spriteNum].x - hitData.pos.x) * (sprite[spriteNum].x - hitData.pos.x) +
(sprite[spriteNum].y - hitData.pos.y) * (sprite[spriteNum].y - hitData.pos.y)) < (290 * 290))
break;
spriteNum = nextspritesect[spriteNum];
}
// ST_2_UNDERWATER
if (spriteNum == -1 && hitData.wall >= 0 && (wall[hitData.wall].cstat & 16) == 0)
if ((wall[hitData.wall].nextsector >= 0 && sector[wall[hitData.wall].nextsector].lotag <= 2) ||
(wall[hitData.wall].nextsector == -1 && sector[hitData.sect].lotag <= 2))
if (((hitData.pos.x - pPlayer->pos.x) * (hitData.pos.x - pPlayer->pos.x) +
(hitData.pos.y - pPlayer->pos.y) * (hitData.pos.y - pPlayer->pos.y)) < (290 * 290))
{
pPlayer->pos.z = pPlayer->opos.z;
pPlayer->vel.z = 0;
(*weaponFrame) = 1;
}
}
break;
case SHRINKER_WEAPON__STATIC:
if (pPlayer->ammo_amount[SHRINKER_WEAPON] > 0)
{
(*weaponFrame) = 1;
A_PlaySound(SHRINKER_FIRE, pPlayer->i);
}
break;
case GROW_WEAPON__STATIC:
if (pPlayer->ammo_amount[GROW_WEAPON] > 0)
{
(*weaponFrame) = 1;
A_PlaySound(RR ? 431 : EXPANDERSHOOT, pPlayer->i);
}
break;
case FREEZE_WEAPON__STATIC:
if (pPlayer->ammo_amount[FREEZE_WEAPON] > 0)
{
(*weaponFrame) = 1;
if (!RR)
A_PlaySound(CAT_FIRE, pPlayer->i);
}
break;
case RPG_WEAPON__STATIC:
case CHAINGUN_WEAPON__STATIC:
if (pPlayer->ammo_amount[pPlayer->curr_weapon] > 0)
{
(*weaponFrame) = 1;
}
break;
case DEVISTATOR_WEAPON__STATIC:
if (pPlayer->ammo_amount[pPlayer->curr_weapon] > 0)
{
(*weaponFrame) = 1;
pPlayer->hbomb_hold_delay = !pPlayer->hbomb_hold_delay;
if (!RR)
A_PlaySound(CAT_FIRE, pPlayer->i);
}
break;
case KNEE_WEAPON__STATIC:
case SLINGBLADE_WEAPON__STATIC:
if (RRRA)
{
if (pPlayer->ammo_amount[pPlayer->curr_weapon] > 0 && !pPlayer->quick_kick)
(*weaponFrame) = 1;
break;
}
if (RRRA && pPlayer->curr_weapon == SLINGBLADE) break;
if (pPlayer->quick_kick == 0)
{
(*weaponFrame) = 1;
}
break;
case CHICKEN_WEAPON__STATIC:
case MOTORCYCLE_WEAPON__STATIC:
case BOAT_WEAPON__STATIC:
if (!RRRA) break;
if (pPlayer->ammo_amount[pPlayer->curr_weapon] > 0)
{
(*weaponFrame) = 1;
}
break;
}
} }
} }
} }
@ -5957,14 +6008,20 @@ static void P_DoJetpack(int const playerNum, int const playerBits, int const pla
if (TEST_SYNC_KEY(playerBits, SK_JUMP)) // jumping, flying up if (TEST_SYNC_KEY(playerBits, SK_JUMP)) // jumping, flying up
{ {
pPlayer->pos.z -= zAdjust; if (VM_OnEvent(EVENT_SOARUP, pPlayer->i, playerNum) == 0)
pPlayer->crack_time = 777; {
pPlayer->pos.z -= zAdjust;
pPlayer->crack_time = 777;
}
} }
if (TEST_SYNC_KEY(playerBits, SK_CROUCH)) // crouching, flying down if (TEST_SYNC_KEY(playerBits, SK_CROUCH)) // crouching, flying down
{ {
pPlayer->pos.z += zAdjust; if (VM_OnEvent(EVENT_SOARDOWN, pPlayer->i, playerNum) == 0)
pPlayer->crack_time = 777; {
pPlayer->pos.z += zAdjust;
pPlayer->crack_time = 777;
}
} }
int const Zdiff = (playerShrunk == 0 && (sectorLotag == 0 || sectorLotag == ST_2_UNDERWATER)) ? 32 : 16; int const Zdiff = (playerShrunk == 0 && (sectorLotag == 0 || sectorLotag == ST_2_UNDERWATER)) ? 32 : 16;
@ -6894,15 +6951,21 @@ check_enemy_sprite:
if (TEST_SYNC_KEY(playerBits, SK_LOOK_LEFT) && (!RRRA || !pPlayer->on_motorcycle)) if (TEST_SYNC_KEY(playerBits, SK_LOOK_LEFT) && (!RRRA || !pPlayer->on_motorcycle))
{ {
// look_left // look_left
pPlayer->look_ang -= 152; if (VM_OnEvent(EVENT_LOOKLEFT,pPlayer->i,playerNum) == 0)
pPlayer->rotscrnang += 24; {
pPlayer->look_ang -= 152;
pPlayer->rotscrnang += 24;
}
} }
if (TEST_SYNC_KEY(playerBits, SK_LOOK_RIGHT) && (!RRRA || !pPlayer->on_motorcycle)) if (TEST_SYNC_KEY(playerBits, SK_LOOK_RIGHT) && (!RRRA || !pPlayer->on_motorcycle))
{ {
// look_right // look_right
pPlayer->look_ang += 152; if (VM_OnEvent(EVENT_LOOKRIGHT,pPlayer->i,playerNum) == 0)
pPlayer->rotscrnang -= 24; {
pPlayer->look_ang += 152;
pPlayer->rotscrnang -= 24;
}
} }
if (RRRA && pPlayer->sea_sick) if (RRRA && pPlayer->sea_sick)
@ -7209,8 +7272,11 @@ check_enemy_sprite:
if (TEST_SYNC_KEY(playerBits, SK_CROUCH) && (!RRRA || !pPlayer->on_motorcycle)) if (TEST_SYNC_KEY(playerBits, SK_CROUCH) && (!RRRA || !pPlayer->on_motorcycle))
{ {
// crouching // crouching
pPlayer->pos.z += (2048+768); if (VM_OnEvent(EVENT_CROUCH,pPlayer->i,playerNum) == 0)
pPlayer->crack_time = 777; {
pPlayer->pos.z += (2048+768);
pPlayer->crack_time = 777;
}
} }
// jumping // jumping
@ -7221,8 +7287,11 @@ check_enemy_sprite:
if (pPlayer->jumping_counter == 0) if (pPlayer->jumping_counter == 0)
if ((floorZ-ceilZ) > (56<<8)) if ((floorZ-ceilZ) > (56<<8))
{ {
pPlayer->jumping_counter = 1; if (VM_OnEvent(EVENT_JUMP,pPlayer->i,playerNum) == 0)
pPlayer->jumping_toggle = 1; {
pPlayer->jumping_counter = 1;
pPlayer->jumping_toggle = 1;
}
} }
} }
@ -7822,29 +7891,42 @@ HORIZONLY:;
int centerHoriz = 0; int centerHoriz = 0;
if (TEST_SYNC_KEY(playerBits, SK_CENTER_VIEW) || pPlayer->hard_landing) if (TEST_SYNC_KEY(playerBits, SK_CENTER_VIEW) || pPlayer->hard_landing)
pPlayer->return_to_center = 9; if (VM_OnEvent(EVENT_RETURNTOCENTER, pPlayer->i,playerNum) == 0)
pPlayer->return_to_center = 9;
if (TEST_SYNC_KEY(playerBits, SK_LOOK_UP)) if (TEST_SYNC_KEY(playerBits, SK_LOOK_UP))
{ {
pPlayer->return_to_center = 9; if (VM_OnEvent(EVENT_LOOKUP, pPlayer->i, playerNum) == 0)
pPlayer->q16horiz += fix16_from_int(12<<(int)(TEST_SYNC_KEY(playerBits, SK_RUN))); {
centerHoriz++; pPlayer->return_to_center = 9;
pPlayer->q16horiz += fix16_from_int(12<<(int)(TEST_SYNC_KEY(playerBits, SK_RUN)));
centerHoriz++;
}
} }
else if (TEST_SYNC_KEY(playerBits, SK_LOOK_DOWN)) else if (TEST_SYNC_KEY(playerBits, SK_LOOK_DOWN))
{ {
pPlayer->return_to_center = 9; if (VM_OnEvent(EVENT_LOOKDOWN,pPlayer->i,playerNum) == 0)
pPlayer->q16horiz -= fix16_from_int(12<<(int)(TEST_SYNC_KEY(playerBits, SK_RUN))); {
centerHoriz++; pPlayer->return_to_center = 9;
pPlayer->q16horiz -= fix16_from_int(12<<(int)(TEST_SYNC_KEY(playerBits, SK_RUN)));
centerHoriz++;
}
} }
else if (TEST_SYNC_KEY(playerBits, SK_AIM_UP) && (!RRRA || !pPlayer->on_motorcycle)) else if (TEST_SYNC_KEY(playerBits, SK_AIM_UP) && (!RRRA || !pPlayer->on_motorcycle))
{ {
pPlayer->q16horiz += fix16_from_int(6<<(int)(TEST_SYNC_KEY(playerBits, SK_RUN))); if (VM_OnEvent(EVENT_AIMUP,pPlayer->i,playerNum) == 0)
centerHoriz++; {
pPlayer->q16horiz += fix16_from_int(6<<(int)(TEST_SYNC_KEY(playerBits, SK_RUN)));
centerHoriz++;
}
} }
else if (TEST_SYNC_KEY(playerBits, SK_AIM_DOWN) && (!RRRA || !pPlayer->on_motorcycle)) else if (TEST_SYNC_KEY(playerBits, SK_AIM_DOWN) && (!RRRA || !pPlayer->on_motorcycle))
{ {
pPlayer->q16horiz -= fix16_from_int(6<<(int)(TEST_SYNC_KEY(playerBits, SK_RUN))); if (VM_OnEvent(EVENT_AIMDOWN,pPlayer->i,playerNum) == 0)
centerHoriz++; {
pPlayer->q16horiz -= fix16_from_int(6<<(int)(TEST_SYNC_KEY(playerBits, SK_RUN)));
centerHoriz++;
}
} }
if (RR && pPlayer->recoil && *weaponFrame == 0) if (RR && pPlayer->recoil && *weaponFrame == 0)
{ {

View file

@ -492,8 +492,10 @@ static void G_DoLoadScreen(const char *statustext, int32_t percent)
} }
videoClearScreen(0); videoClearScreen(0);
int const loadScreenTile = VM_OnEventWithReturn(EVENT_GETLOADTILE, g_player[screenpeek].ps->i, screenpeek, LOADSCREEN);
rotatesprite_fs(320<<15,200<<15,65536L,0,LOADSCREEN,0,0,2+8+64+BGSTRETCH); rotatesprite_fs(320<<15,200<<15,65536L,0,loadScreenTile,0,0,2+8+64+BGSTRETCH);
int const textY = RRRA ? 140 : 90; int const textY = RRRA ? 140 : 90;
@ -641,6 +643,7 @@ void G_CacheMapData(void)
while (percentage > lpc) while (percentage > lpc)
{ {
G_HandleAsync();
Bsprintf(tempbuf, "Loaded %d%% (%d/%d textures)\n", lpc, pc, g_precacheCount); Bsprintf(tempbuf, "Loaded %d%% (%d/%d textures)\n", lpc, pc, g_precacheCount);
G_DoLoadScreen(tempbuf, lpc); G_DoLoadScreen(tempbuf, lpc);
@ -1048,6 +1051,8 @@ void P_ResetWeapons(int playerNum)
pPlayer->last_pissed_time = 0; pPlayer->last_pissed_time = 0;
pPlayer->holster_weapon = 0; pPlayer->holster_weapon = 0;
pPlayer->last_used_weapon = -1; pPlayer->last_used_weapon = -1;
VM_OnEvent(EVENT_RESETWEAPONS, pPlayer->i, playerNum);
} }
void P_ResetInventory(int playerNum) void P_ResetInventory(int playerNum)
@ -1104,6 +1109,8 @@ void P_ResetInventory(int playerNum)
g_hulkSpawn = 2; g_hulkSpawn = 2;
} }
} }
VM_OnEvent(EVENT_RESETINVENTORY, pPlayer->i, playerNum);
} }
static void resetprestat(int playerNum, int gameMode) static void resetprestat(int playerNum, int gameMode)
@ -2259,6 +2266,8 @@ int G_EnterLevel(int gameMode)
if ((gameMode & MODE_DEMO) == 0 && ud.recstat == 2) if ((gameMode & MODE_DEMO) == 0 && ud.recstat == 2)
ud.recstat = 0; ud.recstat = 0;
VM_OnEvent(EVENT_ENTERLEVEL);
//if (g_networkMode != NET_DEDICATED_SERVER) //if (g_networkMode != NET_DEDICATED_SERVER)
{ {
S_PauseSounds(false); S_PauseSounds(false);

View file

@ -3636,9 +3636,12 @@ void P_HandleSharedKeys(int playerNum)
if (TEST_SYNC_KEY(playerBits, SK_QUICK_KICK) && pPlayer->quick_kick == 0) if (TEST_SYNC_KEY(playerBits, SK_QUICK_KICK) && pPlayer->quick_kick == 0)
if (pPlayer->curr_weapon != KNEE_WEAPON || pPlayer->kickback_pic == 0) if (pPlayer->curr_weapon != KNEE_WEAPON || pPlayer->kickback_pic == 0)
{ {
pPlayer->quick_kick = 14; if (VM_OnEvent(EVENT_QUICKKICK,g_player[playerNum].ps->i,playerNum) == 0)
if (pPlayer->fta == 0 || pPlayer->ftq == 80) {
P_DoQuote(QUOTE_MIGHTY_FOOT,pPlayer); pPlayer->quick_kick = 14;
if (pPlayer->fta == 0 || pPlayer->ftq == 80)
P_DoQuote(QUOTE_MIGHTY_FOOT,pPlayer);
}
} }
} }
@ -3678,19 +3681,23 @@ void P_HandleSharedKeys(int playerNum)
if (TEST_SYNC_KEY(playerBits, SK_INVENTORY) && pPlayer->newowner == -1) // inventory button generates event for selected item if (TEST_SYNC_KEY(playerBits, SK_INVENTORY) && pPlayer->newowner == -1) // inventory button generates event for selected item
{ {
switch (pPlayer->inven_icon) if (VM_OnEvent(EVENT_INVENTORY,g_player[playerNum].ps->i,playerNum) == 0)
{ {
case ICON_JETPACK: playerBits |= BIT(SK_JETPACK); break; switch (pPlayer->inven_icon)
case ICON_HOLODUKE: playerBits |= BIT(SK_HOLODUKE); break; {
case ICON_HEATS: playerBits |= BIT(SK_NIGHTVISION); break; case ICON_JETPACK: playerBits |= BIT(SK_JETPACK); break;
case ICON_FIRSTAID: playerBits |= BIT(SK_MEDKIT); break; case ICON_HOLODUKE: playerBits |= BIT(SK_HOLODUKE); break;
case ICON_STEROIDS: playerBits |= BIT(SK_STEROIDS); break; case ICON_HEATS: playerBits |= BIT(SK_NIGHTVISION); break;
case ICON_FIRSTAID: playerBits |= BIT(SK_MEDKIT); break;
case ICON_STEROIDS: playerBits |= BIT(SK_STEROIDS); break;
}
} }
} }
if (!RR && TEST_SYNC_KEY(playerBits, SK_NIGHTVISION)) if (!RR && TEST_SYNC_KEY(playerBits, SK_NIGHTVISION))
{ {
if (pPlayer->inv_amount[GET_HEATS] > 0) if (VM_OnEvent(EVENT_USENIGHTVISION,g_player[playerNum].ps->i,playerNum) == 0
&& pPlayer->inv_amount[GET_HEATS] > 0)
{ {
pPlayer->heat_on = !pPlayer->heat_on; pPlayer->heat_on = !pPlayer->heat_on;
P_UpdateScreenPal(pPlayer); P_UpdateScreenPal(pPlayer);
@ -3702,14 +3709,17 @@ void P_HandleSharedKeys(int playerNum)
if (TEST_SYNC_KEY(playerBits, SK_STEROIDS)) if (TEST_SYNC_KEY(playerBits, SK_STEROIDS))
{ {
if (pPlayer->inv_amount[GET_STEROIDS] == 400) if (VM_OnEvent(EVENT_USESTEROIDS,g_player[playerNum].ps->i,playerNum) == 0)
{ {
pPlayer->inv_amount[GET_STEROIDS]--; if (pPlayer->inv_amount[GET_STEROIDS] == 400)
A_PlaySound(DUKE_TAKEPILLS,pPlayer->i); {
P_DoQuote(QUOTE_USED_STEROIDS,pPlayer); pPlayer->inv_amount[GET_STEROIDS]--;
A_PlaySound(DUKE_TAKEPILLS,pPlayer->i);
P_DoQuote(QUOTE_USED_STEROIDS,pPlayer);
}
if (pPlayer->inv_amount[GET_STEROIDS] > 0)
pPlayer->inven_icon = ICON_STEROIDS;
} }
if (pPlayer->inv_amount[GET_STEROIDS] > 0)
pPlayer->inven_icon = ICON_STEROIDS;
return; // is there significance to returning? return; // is there significance to returning?
} }
if (pPlayer->refresh_inventory) if (pPlayer->refresh_inventory)
@ -3760,6 +3770,17 @@ CHECKINV1:
} }
else inventoryIcon = 0; else inventoryIcon = 0;
if (TEST_SYNC_KEY(playerBits, SK_INV_LEFT)) // Inventory_Left
{
/*Gv_SetVar(g_iReturnVarID,dainv,g_player[snum].ps->i,snum);*/
inventoryIcon = VM_OnEventWithReturn(EVENT_INVENTORYLEFT,g_player[playerNum].ps->i,playerNum, inventoryIcon);
}
else if (TEST_SYNC_KEY(playerBits, SK_INV_RIGHT)) // Inventory_Right
{
/*Gv_SetVar(g_iReturnVarID,dainv,g_player[snum].ps->i,snum);*/
inventoryIcon = VM_OnEventWithReturn(EVENT_INVENTORYRIGHT,g_player[playerNum].ps->i,playerNum, inventoryIcon);
}
if (inventoryIcon >= 1) if (inventoryIcon >= 1)
{ {
pPlayer->inven_icon = inventoryIcon; pPlayer->inven_icon = inventoryIcon;
@ -4070,29 +4091,35 @@ rrtripbomb_case:
{ {
if (pPlayer->holoduke_on == -1) if (pPlayer->holoduke_on == -1)
{ {
if (pPlayer->inv_amount[GET_HOLODUKE] > 0) if (VM_OnEvent(EVENT_HOLODUKEON, g_player[playerNum].ps->i, playerNum) == 0)
{ {
pPlayer->inven_icon = ICON_HOLODUKE; if (pPlayer->inv_amount[GET_HOLODUKE] > 0)
if (pPlayer->cursectnum > -1)
{ {
int const i = A_InsertSprite(pPlayer->cursectnum, pPlayer->pos.x, pPlayer->pos.y, pPlayer->inven_icon = ICON_HOLODUKE;
pPlayer->pos.z+(30<<8), APLAYER, -64, 0, 0, fix16_to_int(pPlayer->q16ang), 0, 0, -1, 10);
pPlayer->holoduke_on = i; if (pPlayer->cursectnum > -1)
T4(i) = T5(i) = 0; {
sprite[i].yvel = playerNum; int const i = A_InsertSprite(pPlayer->cursectnum, pPlayer->pos.x, pPlayer->pos.y,
sprite[i].extra = 0; pPlayer->pos.z+(30<<8), APLAYER, -64, 0, 0, fix16_to_int(pPlayer->q16ang), 0, 0, -1, 10);
P_DoQuote(QUOTE_HOLODUKE_ON,pPlayer); pPlayer->holoduke_on = i;
A_PlaySound(TELEPORTER,pPlayer->holoduke_on); T4(i) = T5(i) = 0;
sprite[i].yvel = playerNum;
sprite[i].extra = 0;
P_DoQuote(QUOTE_HOLODUKE_ON,pPlayer);
A_PlaySound(TELEPORTER,pPlayer->holoduke_on);
}
} }
else P_DoQuote(QUOTE_HOLODUKE_NOT_FOUND,pPlayer);
} }
else P_DoQuote(QUOTE_HOLODUKE_NOT_FOUND,pPlayer);
} }
else else
{ {
A_PlaySound(TELEPORTER,pPlayer->holoduke_on); if (VM_OnEvent(EVENT_HOLODUKEOFF,g_player[playerNum].ps->i,playerNum) == 0)
pPlayer->holoduke_on = -1; {
P_DoQuote(QUOTE_HOLODUKE_OFF,pPlayer); A_PlaySound(TELEPORTER,pPlayer->holoduke_on);
pPlayer->holoduke_on = -1;
P_DoQuote(QUOTE_HOLODUKE_OFF,pPlayer);
}
} }
} }
} }
@ -4123,35 +4150,38 @@ rrtripbomb_case:
if (TEST_SYNC_KEY(playerBits, SK_MEDKIT)) if (TEST_SYNC_KEY(playerBits, SK_MEDKIT))
{ {
if (pPlayer->inv_amount[GET_FIRSTAID] > 0 && sprite[pPlayer->i].extra < pPlayer->max_player_health) if (VM_OnEvent(EVENT_USEMEDKIT,g_player[playerNum].ps->i,playerNum) == 0)
{ {
int healthDiff = pPlayer->max_player_health-sprite[pPlayer->i].extra; if (pPlayer->inv_amount[GET_FIRSTAID] > 0 && sprite[pPlayer->i].extra < pPlayer->max_player_health)
if (RR) healthDiff = 10;
if (pPlayer->inv_amount[GET_FIRSTAID] > healthDiff)
{ {
pPlayer->inv_amount[GET_FIRSTAID] -= healthDiff; int healthDiff = pPlayer->max_player_health-sprite[pPlayer->i].extra;
if (RR) healthDiff = 10;
if (pPlayer->inv_amount[GET_FIRSTAID] > healthDiff)
{
pPlayer->inv_amount[GET_FIRSTAID] -= healthDiff;
if (RR)
sprite[pPlayer->i].extra += healthDiff;
if (!RR || sprite[pPlayer->i].extra > pPlayer->max_player_health)
sprite[pPlayer->i].extra = pPlayer->max_player_health;
pPlayer->inven_icon = ICON_FIRSTAID;
}
else
{
sprite[pPlayer->i].extra += pPlayer->inv_amount[GET_FIRSTAID];
pPlayer->inv_amount[GET_FIRSTAID] = 0;
P_SelectNextInvItem(pPlayer);
}
if (RR) if (RR)
sprite[pPlayer->i].extra += healthDiff; {
if (!RR || sprite[pPlayer->i].extra > pPlayer->max_player_health) if (sprite[pPlayer->i].extra > pPlayer->max_player_health)
sprite[pPlayer->i].extra = pPlayer->max_player_health; sprite[pPlayer->i].extra = pPlayer->max_player_health;
pPlayer->inven_icon = ICON_FIRSTAID; pPlayer->drink_amt += 10;
}
if (!RR || (pPlayer->drink_amt <= 100 && !A_CheckSoundPlaying(pPlayer->i, DUKE_USEMEDKIT)))
A_PlaySound(DUKE_USEMEDKIT,pPlayer->i);
} }
else
{
sprite[pPlayer->i].extra += pPlayer->inv_amount[GET_FIRSTAID];
pPlayer->inv_amount[GET_FIRSTAID] = 0;
P_SelectNextInvItem(pPlayer);
}
if (RR)
{
if (sprite[pPlayer->i].extra > pPlayer->max_player_health)
sprite[pPlayer->i].extra = pPlayer->max_player_health;
pPlayer->drink_amt += 10;
}
if (!RR || (pPlayer->drink_amt <= 100 && !A_CheckSoundPlaying(pPlayer->i, DUKE_USEMEDKIT)))
A_PlaySound(DUKE_USEMEDKIT,pPlayer->i);
} }
} }
@ -4159,35 +4189,38 @@ rrtripbomb_case:
{ {
if (RR) if (RR)
{ {
if (pPlayer->inv_amount[GET_JETPACK] > 0 && sprite[pPlayer->i].extra < pPlayer->max_player_health) if (VM_OnEvent(EVENT_USEJETPACK,g_player[playerNum].ps->i,playerNum) == 0)
{ {
if (!A_CheckSoundPlaying(pPlayer->i, 429)) if (pPlayer->inv_amount[GET_JETPACK] > 0 && sprite[pPlayer->i].extra < pPlayer->max_player_health)
A_PlaySound(429, pPlayer->i);
pPlayer->inv_amount[GET_JETPACK] -= 100;
if (pPlayer->drink_amt > 0)
{ {
pPlayer->drink_amt -= 5; if (!A_CheckSoundPlaying(pPlayer->i, 429))
if (pPlayer->drink_amt < 0) A_PlaySound(429, pPlayer->i);
pPlayer->drink_amt = 0;
pPlayer->inv_amount[GET_JETPACK] -= 100;
if (pPlayer->drink_amt > 0)
{
pPlayer->drink_amt -= 5;
if (pPlayer->drink_amt < 0)
pPlayer->drink_amt = 0;
}
if (pPlayer->eat_amt < 100)
{
pPlayer->eat_amt += 5;
if (pPlayer->eat_amt > 100)
pPlayer->eat_amt = 100;
}
sprite[pPlayer->i].extra += 5;
pPlayer->inven_icon = 4;
if (sprite[pPlayer->i].extra > pPlayer->max_player_health)
sprite[pPlayer->i].extra = pPlayer->max_player_health;
if (pPlayer->inv_amount[GET_JETPACK] <= 0)
P_SelectNextInvItem(pPlayer);
} }
if (pPlayer->eat_amt < 100)
{
pPlayer->eat_amt += 5;
if (pPlayer->eat_amt > 100)
pPlayer->eat_amt = 100;
}
sprite[pPlayer->i].extra += 5;
pPlayer->inven_icon = 4;
if (sprite[pPlayer->i].extra > pPlayer->max_player_health)
sprite[pPlayer->i].extra = pPlayer->max_player_health;
if (pPlayer->inv_amount[GET_JETPACK] <= 0)
P_SelectNextInvItem(pPlayer);
} }
} }
else else
@ -4219,7 +4252,8 @@ rrtripbomb_case:
} }
if (TEST_SYNC_KEY(playerBits, SK_TURNAROUND) && pPlayer->one_eighty_count == 0) if (TEST_SYNC_KEY(playerBits, SK_TURNAROUND) && pPlayer->one_eighty_count == 0)
pPlayer->one_eighty_count = -1024; if (VM_OnEvent(EVENT_TURNAROUND,pPlayer->i,playerNum) == 0)
pPlayer->one_eighty_count = -1024;
} }
} }