diff --git a/Source/engine/animationinfo.cpp b/Source/engine/animationinfo.cpp index b6b79741..7f2ee13e 100644 --- a/Source/engine/animationinfo.cpp +++ b/Source/engine/animationinfo.cpp @@ -64,7 +64,7 @@ void AnimationInfo::SetNewAnimation(byte *pData, int numberOfFrames, int delayLe this->pData = pData; NumberOfFrames = numberOfFrames; - CurrentFrame = 1; + CurrentFrame = 1 + numSkippedFrames; DelayCounter = 0; DelayLen = delayLen; TicksSinceSequenceStarted = 0; diff --git a/Source/player.cpp b/Source/player.cpp index 6c054be2..36308e48 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -2808,26 +2808,13 @@ bool PlrHitObj(int pnum, int mx, int my) bool PM_DoAttack(int pnum) { - int frame, dx, dy, m; + int dx, dy, m; bool didhit = false; if ((DWORD)pnum >= MAX_PLRS) { app_fatal("PM_DoAttack: illegal player %d", pnum); } - frame = plr[pnum].AnimInfo.CurrentFrame; - if (plr[pnum]._pIFlags & ISPL_QUICKATTACK && frame == 1) { - plr[pnum].AnimInfo.CurrentFrame++; - } - if (plr[pnum]._pIFlags & ISPL_FASTATTACK && (frame == 1 || frame == 3)) { - plr[pnum].AnimInfo.CurrentFrame++; - } - if (plr[pnum]._pIFlags & ISPL_FASTERATTACK && (frame == 1 || frame == 3 || frame == 5)) { - plr[pnum].AnimInfo.CurrentFrame++; - } - if (plr[pnum]._pIFlags & ISPL_FASTESTATTACK && (frame == 1 || frame == 4)) { - plr[pnum].AnimInfo.CurrentFrame += 2; - } if (plr[pnum].AnimInfo.CurrentFrame == plr[pnum]._pAFNum - 1) { PlaySfxLoc(PS_SWING, plr[pnum].position.tile.x, plr[pnum].position.tile.y); } @@ -2919,22 +2906,12 @@ bool PM_DoAttack(int pnum) bool PM_DoRangeAttack(int pnum) { - int origFrame, mistype; + int mistype; if ((DWORD)pnum >= MAX_PLRS) { app_fatal("PM_DoRangeAttack: illegal player %d", pnum); } - if (!gbIsHellfire) { - origFrame = plr[pnum].AnimInfo.CurrentFrame; - if (plr[pnum]._pIFlags & ISPL_QUICKATTACK && origFrame == 1) { - plr[pnum].AnimInfo.CurrentFrame++; - } - if (plr[pnum]._pIFlags & ISPL_FASTATTACK && (origFrame == 1 || origFrame == 3)) { - plr[pnum].AnimInfo.CurrentFrame++; - } - } - int arrows = 0; if (plr[pnum].AnimInfo.CurrentFrame == plr[pnum]._pAFNum) { arrows = 1; @@ -3041,10 +3018,6 @@ bool PM_DoBlock(int pnum) app_fatal("PM_DoBlock: illegal player %d", pnum); } - if (plr[pnum]._pIFlags & ISPL_FASTBLOCK && plr[pnum].AnimInfo.CurrentFrame != 1) { - plr[pnum].AnimInfo.CurrentFrame = plr[pnum]._pBFrames; - } - if (plr[pnum].AnimInfo.CurrentFrame >= plr[pnum]._pBFrames) { StartStand(pnum, plr[pnum]._pdir); ClearPlrPVars(pnum); @@ -3148,23 +3121,10 @@ bool PM_DoSpell(int pnum) bool PM_DoGotHit(int pnum) { - int frame; - if ((DWORD)pnum >= MAX_PLRS) { app_fatal("PM_DoGotHit: illegal player %d", pnum); } - frame = plr[pnum].AnimInfo.CurrentFrame; - if (plr[pnum]._pIFlags & ISPL_FASTRECOVER && frame == 3) { - plr[pnum].AnimInfo.CurrentFrame++; - } - if (plr[pnum]._pIFlags & ISPL_FASTERRECOVER && (frame == 3 || frame == 5)) { - plr[pnum].AnimInfo.CurrentFrame++; - } - if (plr[pnum]._pIFlags & ISPL_FASTESTRECOVER && (frame == 1 || frame == 3 || frame == 5)) { - plr[pnum].AnimInfo.CurrentFrame++; - } - if (plr[pnum].AnimInfo.CurrentFrame >= plr[pnum]._pHFrames) { StartStand(pnum, plr[pnum]._pdir); ClearPlrPVars(pnum); diff --git a/test/animationinfo_test.cpp b/test/animationinfo_test.cpp index fc408a61..590102e0 100644 --- a/test/animationinfo_test.cpp +++ b/test/animationinfo_test.cpp @@ -37,12 +37,10 @@ struct SetNewAnimationData : TestData { struct GameTickData : TestData { int _ExpectedAnimationFrame; int _ExpectedAnimationCnt; - int _FramesToSkip; - GameTickData(int expectedAnimationFrame, int expectedAnimationCnt, int framesToSkip = 0) + GameTickData(int expectedAnimationFrame, int expectedAnimationCnt) { _ExpectedAnimationFrame = expectedAnimationFrame; _ExpectedAnimationCnt = expectedAnimationCnt; - _FramesToSkip = framesToSkip; } }; @@ -84,8 +82,6 @@ void RunAnimationTest(const std::vector &vecTestData) auto gameTickData = dynamic_cast(x); if (gameTickData != nullptr) { currentGameTick += 1; - if (gameTickData->_FramesToSkip != 0) - animInfo.CurrentFrame += gameTickData->_FramesToSkip; animInfo.ProcessAnimation(); EXPECT_EQ(animInfo.CurrentFrame, gameTickData->_ExpectedAnimationFrame); EXPECT_EQ(animInfo.DelayCounter, gameTickData->_ExpectedAnimationCnt); @@ -176,22 +172,22 @@ TEST(AnimationInfo, AttackSwordWarriorWithFastestAttack) // Skipped frames and P { new SetNewAnimationData(16, 0, AnimationDistributionFlags::ProcessAnimationPending, 2, 9), // ProcessAnimation directly after StartAttack (in same GameTick). So we don't see any rendering before. - new GameTickData(2, 0), + new GameTickData(4, 0), new RenderingData(0.0f, 1), new RenderingData(0.3f, 1), new RenderingData(0.6f, 1), new RenderingData(0.8f, 2), - new GameTickData(3, 0), + new GameTickData(5, 0), new RenderingData(0.0f, 2), new RenderingData(0.3f, 3), new RenderingData(0.6f, 3), new RenderingData(0.8f, 3), - new GameTickData(4, 0), + new GameTickData(6, 0), new RenderingData(0.0f, 4), new RenderingData(0.3f, 4), new RenderingData(0.6f, 5), new RenderingData(0.8f, 5), - new GameTickData(7, 0, 2), + new GameTickData(7, 0), new RenderingData(0.0f, 5), new RenderingData(0.3f, 6), new RenderingData(0.6f, 6), @@ -371,17 +367,17 @@ TEST(AnimationInfo, BlockingSorcererWithFastBlock) // Skipped frames and ignored new RenderingData(0.3f, 1), new RenderingData(0.6f, 1), new RenderingData(0.8f, 2), - new GameTickData(1, 1), + new GameTickData(5, 1), new RenderingData(0.0f, 2), new RenderingData(0.3f, 2), new RenderingData(0.6f, 3), new RenderingData(0.8f, 3), - new GameTickData(1, 2), + new GameTickData(5, 2), new RenderingData(0.0f, 4), new RenderingData(0.3f, 4), new RenderingData(0.6f, 4), new RenderingData(0.8f, 5), - new GameTickData(2, 0), + new GameTickData(6, 0), new RenderingData(0.0f, 5), new RenderingData(0.3f, 5), new RenderingData(0.6f, 6), @@ -399,12 +395,12 @@ TEST(AnimationInfo, HitRecoverySorcererZenMode) // Skipped frames and ignored de new RenderingData(0.3f, 1), new RenderingData(0.6f, 2), new RenderingData(0.8f, 2), - new GameTickData(3, 0, 1), + new GameTickData(6, 0), new RenderingData(0.0f, 3), new RenderingData(0.3f, 3), new RenderingData(0.6f, 4), new RenderingData(0.8f, 4), - new GameTickData(7, 0, 3), + new GameTickData(7, 0), new RenderingData(0.0f, 5), new RenderingData(0.3f, 5), new RenderingData(0.6f, 6), diff --git a/test/player_test.cpp b/test/player_test.cpp index 4ee88332..420a8c87 100644 --- a/test/player_test.cpp +++ b/test/player_test.cpp @@ -11,12 +11,10 @@ extern bool PM_DoGotHit(int pnum); int RunBlockTest(int frames, int flags) { int pnum = 0; - plr[pnum].AnimInfo.CurrentFrame = 1; plr[pnum]._pHFrames = frames; - plr[pnum].actionFrame = 1; plr[pnum]._pIFlags = flags; - plr[pnum]._pmode = PM_GOTHIT; plr[pnum]._pGFXLoad = -1; + StartPlrHit(pnum, 5, direction::DIR_S); int i = 1; for (; i < 100; i++) {