diff --git a/source/blood/src/aihand.cpp b/source/blood/src/aihand.cpp index 44301402fc..6ff69f9f26 100644 --- a/source/blood/src/aihand.cpp +++ b/source/blood/src/aihand.cpp @@ -126,7 +126,7 @@ static void thinkChase(spritetype *pSprite, XSPRITE *pXSprite) if (nDist < pDudeInfo->seeDist && klabs(nDeltaAngle) <= pDudeInfo->periphery) { aiSetTarget(pXSprite, pXSprite->target); - if (nDist < 0x233 && klabs(nDeltaAngle) < 85 && gGameOptions.nGameType == kGameTypeSinglePlayer) + if (nDist < 0x233 && klabs(nDeltaAngle) < 85 && (!VanillaMode() || gGameOptions.nGameType == kGameTypeSinglePlayer)) aiNewState(pSprite, pXSprite, &handJump); return; } diff --git a/source/blood/src/blood.cpp b/source/blood/src/blood.cpp index 3e120f1c8d..aea79e87ce 100644 --- a/source/blood/src/blood.cpp +++ b/source/blood/src/blood.cpp @@ -114,8 +114,6 @@ char *pUserTiles = NULL; char *pUserSoundRFF = NULL; char *pUserRFF = NULL; -int gChokeCounter = 0; - double g_gameUpdateTime, g_gameUpdateAndDrawTime; double g_gameUpdateAvgTime = 0.001; @@ -582,6 +580,7 @@ void G_Polymer_UnInit(void) PLAYER gPlayerTemp[kMaxPlayers]; int gHealthTemp[kMaxPlayers]; +int gChokeCounter[kMaxPlayers]; vec3_t startpos; int16_t startang, startsectnum; @@ -739,6 +738,7 @@ void StartLevel(GAMEOPTIONS *gameOptions) } else if ((gGameOptions.nGameType == kGameTypeTeams) && !VanillaMode()) // if ctf mode and went to next level, reset scores playerResetScores(i); + gChokeCounter[i] = 0; playerStart(i, 1); } if (gameOptions->uGameFlags&kGameFlagContinuing) // if episode is in progress, restore player stats @@ -777,7 +777,6 @@ void StartLevel(GAMEOPTIONS *gameOptions) netResetState(); gCacheMiss = 0; gFrame = 0; - gChokeCounter = 0; if (!gDemo.at1) gGameMenuMgr.Deactivate(); levelTryPlayMusicOrNothing(gGameOptions.nEpisode, gGameOptions.nLevel); @@ -1114,8 +1113,18 @@ void ProcessFrame(void) } for (int i = connecthead; i >= 0; i = connectpoint2[i]) { + PLAYER *pPlayer = &gPlayer[i]; viewBackupView(i); - playerProcess(&gPlayer[i]); + playerProcess(pPlayer); + if (pPlayer->hand == 1) + { + gChokeCounter[i] += (kTicsPerFrame<<1); + while (gChokeCounter[i] >= kTicsPerSec) + { + gChoke.Process(pPlayer); + gChokeCounter[i] -= kTicsPerSec; + } + } } trProcessBusy(); evProcess((int)gFrameClock); @@ -1132,15 +1141,6 @@ void ProcessFrame(void) viewUpdateDelirium(); viewUpdateShake(); sfxUpdate3DSounds(); - if (gMe->hand == 1) - { - gChokeCounter += (kTicsPerFrame<<1); - while (gChokeCounter >= kTicsPerSec) - { - gChoke.Process(gMe); - gChokeCounter -= kTicsPerSec; - } - } gLevelTime++; gFrame++; gFrameClock += kTicsPerFrame; diff --git a/source/blood/src/player.cpp b/source/blood/src/player.cpp index e0f22511ce..1cb40786cb 100644 --- a/source/blood/src/player.cpp +++ b/source/blood/src/player.cpp @@ -2009,10 +2009,12 @@ void playerProcess(PLAYER *pPlayer) pPlayer->painEffect = ClipLow(pPlayer->painEffect-kTicsPerFrame, 0); pPlayer->blindEffect = ClipLow(pPlayer->blindEffect-kTicsPerFrame, 0); pPlayer->pickupEffect = ClipLow(pPlayer->pickupEffect-kTicsPerFrame, 0); - if (pPlayer == gMe && gMe->pXSprite->health == 0) - pPlayer->hand = 0; if (!pXSprite->health) + { + if (!VanillaMode() || pPlayer == gMe) + pPlayer->hand = 0; return; + } pPlayer->isUnderwater = 0; if (pPlayer->posture == kPostureSwim) { diff --git a/source/blood/src/view.cpp b/source/blood/src/view.cpp index 5a196876b1..24ba779ac5 100644 --- a/source/blood/src/view.cpp +++ b/source/blood/src/view.cpp @@ -4033,10 +4033,9 @@ void viewDrawScreen(void) gViewMap.Process(cX, cY, nAng); } viewDrawInterface(delta); - int zn = ((gView->zWeapon-gView->zView-(12<<8))>>7)+220; - PLAYER *pPSprite = &gPlayer[gMe->pSprite->type-kDudePlayer1]; - if (IsPlayerSprite(gMe->pSprite) && pPSprite->hand == 1) + if (IsPlayerSprite(gView->pSprite) && (gView->hand == 1)) { + int zn = ((gView->zWeapon-gView->zView-(12<<8))>>7)+220; gChoke.Draw(160, zn); } if (byte_1A76C6)