diablo2-web/tools/d2moo-oracle/src/path_misc.cpp

132 lines
2.1 KiB
C++

// Direction helpers used by the Act I dirt-path search (DrlgOutPlace.cpp: sub_6FD80750 calls
// sub_6FDAB750 at lines 265 and 376).
//
// Copied verbatim from D2MOO `source/D2Common/src/Path/PathMisc.cpp` (commit 5596f5c, lines 25-58,
// 767-856; MIT License, Copyright (c) 2020-2025 The Phrozen Keep community). PathMisc.cpp itself is
// not compiled into the oracle because it drags in the unit/path runtime. The previous ad-hoc
// runner stubbed sub_6FDAB750 to `return 0`, which silently corrupted every D2MOO dirt path.
#include <Path/PathMisc.h>
struct D2UnkPathStrc
{
int8_t unk0x00;
int8_t unk0x01;
int8_t unk0x02;
};
//1.10f: D2Common.0x6FDD2158
//1.13c: D2Common.0x6FDDC320
static const D2UnkPathStrc stru_6FDD2158[25] =
{
{ 5, 4, 6 },
{ 4, 5, 6 },
{ 4, 3, 5 },
{ 4, 3, 2 },
{ 3, 4, 2 },
{ 6, 5, 4 },
{ 5, 4, 6 },
{ 4, 3, 5 },
{ 3, 4, 2 },
{ 2, 3, 4 },
{ 6, 7, 5 },
{ 6, 7, 5 },
{ 6, 7, 5 },
{ 2, 1, 3 },
{ 2, 1, 3 },
{ 6, 7, 0 },
{ 7, 0, 6 },
{ 0, 1, 7 },
{ 1, 0, 2 },
{ 2, 1, 0 },
{ 7, 0, 6 },
{ 0, 7, 6 },
{ 0, 1, 7 },
{ 0, 1, 2 },
{ 1, 0, 2 },
};
//D2Common.0x6FDAB610
int __fastcall sub_6FDAB610(int nX1, int nY1, int nX2, int nY2)
{
int nAbsDiffX = 0;
int nAbsDiffY = 0;
int nDiffX = 0;
int nDiffY = 0;
nDiffX = nX2 - nX1;
nDiffY = nY2 - nY1;
nAbsDiffX = nDiffX;
nAbsDiffY = nDiffY;
if (nAbsDiffX < 0)
{
nAbsDiffX = -nAbsDiffX;
}
if (nAbsDiffY < 0)
{
nAbsDiffY = -nAbsDiffY;
}
if (nAbsDiffX < 2 * nAbsDiffY)
{
if (nAbsDiffY >= 2 * nAbsDiffX)
{
if (nDiffX < 0)
{
if (nDiffY < -1)
{
return 5;
}
else if (nDiffY > 1)
{
nDiffY = 2;
}
return nDiffY + 7;
}
nDiffX &= 1;
}
}
else
{
if (nDiffY >= 0)
{
nDiffY &= 1;
}
else
{
nDiffY = -1;
}
}
if (nDiffX < -1)
{
nDiffX = -2;
}
else if (nDiffX > 1)
{
nDiffX = 2;
}
if (nDiffY < -1)
{
return 5 * nDiffX + 10;
}
else if (nDiffY > 1)
{
nDiffY = 2;
}
return nDiffY + 5 * nDiffX + 12;
}
//D2Common.0x6FDAB750
int __fastcall sub_6FDAB750(int nX1, int nY1, int nX2, int nY2)
{
return stru_6FDD2158[sub_6FDAB610(nX1, nY1, nX2, nY2)].unk0x00;
}