diff --git a/CMakeLists.txt b/CMakeLists.txt index 5940c3ac2..4ff710c97 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -341,6 +341,7 @@ if(RUN_TESTS) SourceT/drlg_l4_test.cpp SourceT/effects_test.cpp SourceT/file_util_test.cpp + SourceT/player_test.cpp SourceT/scrollrt_test.cpp) endif() diff --git a/Source/player.cpp b/Source/player.cpp index 771cf43f0..b69c4a207 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -1797,7 +1797,6 @@ void StartPlrHit(int pnum, int dam, BOOL forcehit) plr[pnum]._pmode = PM_GOTHIT; FixPlayerLocation(pnum, pd); - plr[pnum]._pVar8 = 1; FixPlrWalkTags(pnum); dPlayer[plr[pnum]._px][plr[pnum]._py] = pnum + 1; SetPlayerOld(pnum); @@ -3277,35 +3276,19 @@ BOOL PM_DoGotHit(int pnum) app_fatal("PM_DoGotHit: illegal player %d", pnum); } -#ifdef HELLFIRE - if (plr[pnum]._pIFlags & (ISPL_FASTRECOVER | ISPL_FASTERRECOVER | ISPL_FASTESTRECOVER)) { - frame = 3; - if (plr[pnum]._pIFlags & ISPL_FASTERRECOVER) - frame = 4; - if (plr[pnum]._pIFlags & ISPL_FASTESTRECOVER) - frame = 5; - if (plr[pnum]._pVar8 > 1 && plr[pnum]._pVar8 < frame) { - plr[pnum]._pVar8 = frame; - } - if (plr[pnum]._pVar8 > plr[pnum]._pHFrames) - plr[pnum]._pVar8 = plr[pnum]._pHFrames; - } - - if (plr[pnum]._pVar8 == plr[pnum]._pHFrames) { -#else frame = plr[pnum]._pAnimFrame; if (plr[pnum]._pIFlags & ISPL_FASTRECOVER && frame == 3) { plr[pnum]._pAnimFrame++; } if (plr[pnum]._pIFlags & ISPL_FASTERRECOVER && (frame == 3 || frame == 5)) { - plr[pnum]._pAnimFrame++; + if (!gbIsHellfire || !(plr[pnum]._pIFlags & ISPL_FASTESTRECOVER)) + plr[pnum]._pAnimFrame++; } if (plr[pnum]._pIFlags & ISPL_FASTESTRECOVER && (frame == 1 || frame == 3 || frame == 5)) { plr[pnum]._pAnimFrame++; } if (plr[pnum]._pAnimFrame >= plr[pnum]._pHFrames) { -#endif StartStand(pnum, plr[pnum]._pdir); ClearPlrPVars(pnum); if (random_(3, 4) != 0) { @@ -3315,9 +3298,6 @@ BOOL PM_DoGotHit(int pnum) return TRUE; } -#ifdef HELLFIRE - plr[pnum]._pVar8++; -#endif return FALSE; } diff --git a/SourceT/player_test.cpp b/SourceT/player_test.cpp new file mode 100644 index 000000000..cb7cac8ff --- /dev/null +++ b/SourceT/player_test.cpp @@ -0,0 +1,106 @@ +#include +#include "all.h" + +namespace dvl { +extern int PM_DoGotHit(int pnum); +} + +int RunBlockTest(bool hellfire, int frames, int flags) +{ + dvl::gbIsHellfire = hellfire; + + int pnum = 0; + dvl::plr[pnum]._pAnimFrame = 1; + dvl::plr[pnum]._pHFrames = frames; + dvl::plr[pnum]._pVar8 = 1; + dvl::plr[pnum]._pIFlags = flags; + dvl::plr[pnum]._pmode = 7; + dvl::plr[pnum]._pGFXLoad = -1; + + int i = 1; + for (; i < 100; i++) { + dvl::PM_DoGotHit(pnum); + if (dvl::plr[pnum]._pmode != 7) + break; + dvl::plr[pnum]._pAnimFrame++; + } + + return i; +} + +#define NORM 0 +#define BAL dvl::ISPL_FASTRECOVER +#define STA dvl::ISPL_FASTERRECOVER +#define HAR dvl::ISPL_FASTESTRECOVER +#define BALSTA (dvl::ISPL_FASTRECOVER | dvl::ISPL_FASTERRECOVER) +#define BALHAR (dvl::ISPL_FASTRECOVER | dvl::ISPL_FASTESTRECOVER) +#define STAHAR (dvl::ISPL_FASTERRECOVER | dvl::ISPL_FASTESTRECOVER) +#define ZEN (dvl::ISPL_FASTRECOVER | dvl::ISPL_FASTERRECOVER | dvl::ISPL_FASTESTRECOVER) +#define WAR 6 +#define ROU 7 +#define SRC 8 + +int BlockData[][4] = { + { 6, false, WAR, NORM }, // D + { 7, false, ROU, NORM }, // D + { 8, false, SRC, NORM }, // D + { 6, true, WAR, NORM }, // HF + { 7, true, ROU, NORM }, // HF + { 8, true, SRC, NORM }, // HF + + { 5, false, WAR, BAL }, // D + { 6, false, ROU, BAL }, // D + { 7, false, SRC, BAL }, // D + { 5, true, WAR, BAL }, // HF + { 6, true, ROU, BAL }, // HF + { 7, true, SRC, BAL }, // HF + + { 4, false, WAR, STA }, // D + { 5, false, ROU, STA }, // D + { 6, false, SRC, STA }, // D + { 4, true, WAR, STA }, // HF + { 5, true, ROU, STA }, // HF + { 6, true, SRC, STA }, // HF + + { 3, false, WAR, HAR }, // D + { 4, false, ROU, HAR }, // D + { 5, false, SRC, HAR }, // D + { 3, true, WAR, HAR }, // HF + { 4, true, ROU, HAR }, // HF + { 5, true, SRC, HAR }, // HF + + { 4, false, WAR, BALSTA }, // D + { 5, false, ROU, BALSTA }, // D + { 6, false, SRC, BALSTA }, // D + { 4, true, WAR, BALSTA }, // HF + { 5, true, ROU, BALSTA }, // HF + { 6, true, SRC, BALSTA }, // HF + + { 3, false, WAR, BALHAR }, // D + { 4, false, ROU, BALHAR }, // D + { 5, false, SRC, BALHAR }, // D + { 3, true, WAR, BALHAR }, // HF + { 4, true, ROU, BALHAR }, // HF + { 5, true, SRC, BALHAR }, // HF + + { 3, false, WAR, STAHAR }, // D + { 4, false, ROU, STAHAR }, // D + { 5, false, SRC, STAHAR }, // D + { 3, true, WAR, STAHAR }, // HF + { 4, true, ROU, STAHAR }, // HF + { 5, true, SRC, STAHAR }, // HF + + { 2, false, WAR, ZEN }, // D + { 3, false, ROU, ZEN }, // D + { 4, false, SRC, ZEN }, // D + { 3, true, WAR, ZEN }, // HF + { 4, true, ROU, ZEN }, // HF + { 5, true, SRC, ZEN }, // HF +}; + +TEST(Player, PM_DoGotHit) +{ + for (int i = 0; i < sizeof(BlockData) / sizeof(*BlockData); i++) { + EXPECT_EQ(BlockData[i][0], RunBlockTest(BlockData[i][1], BlockData[i][2], BlockData[i][3])); + } +}