Browse Source

Add test for PM_DoGotHit

This maintains the lack of zen combination in Hellfire but uses the
frame spacing from Diablo for both.
pull/985/head
Anders Jenbo 5 years ago
parent
commit
94e7ee9496
  1. 1
      CMakeLists.txt
  2. 24
      Source/player.cpp
  3. 106
      SourceT/player_test.cpp

1
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()

24
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;
}

106
SourceT/player_test.cpp

@ -0,0 +1,106 @@
#include <gtest/gtest.h>
#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]));
}
}
Loading…
Cancel
Save