132 lines
2.1 KiB
C++
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;
|
|
}
|