* Station AI overlay * implement * Bunch of ports * Fix a heap of bugs and basic scouting * helldivers * Shuffle interactions a bit * navmap stuff * Revert "navmap stuff" This reverts commit d1f89dd4be83233e22cf5dd062b2581f3c6da062. * AI wires implemented * Fix examines * Optimise the overlay significantly * Back to old static * BUI radial working * lots of work * Saving work * thanks fork * alright * pc * AI upload console * AI upload * stuff * Fix copy-paste shitcode * AI actions * navmap work * Fixes * first impressions * a * reh * Revert "navmap work" This reverts commit 6f63fea6e9245e189f368f97be3e32e9b210580e. # Conflicts: # Content.Client/Silicons/StationAi/StationAiOverlay.cs * OD * radar * weh * Fix examines * scoop mine eyes * fixes * reh * Optimise * Final round of optimisations * Fixes * fixes
75 lines
2.1 KiB
C#
75 lines
2.1 KiB
C#
namespace Content.Shared.NPC;
|
|
|
|
public abstract partial class SharedPathfindingSystem
|
|
{
|
|
public static void GridCast(Vector2i start, Vector2i end, Vector2iCallback callback)
|
|
{
|
|
// https://gist.github.com/Pyr3z/46884d67641094d6cf353358566db566
|
|
// declare all locals at the top so it's obvious how big the footprint is
|
|
int dx, dy, xinc, yinc, side, i, error;
|
|
|
|
// starting cell is always returned
|
|
if (!callback(start))
|
|
return;
|
|
|
|
xinc = (end.X < start.X) ? -1 : 1;
|
|
yinc = (end.Y < start.Y) ? -1 : 1;
|
|
dx = xinc * (end.X - start.X);
|
|
dy = yinc * (end.Y - start.Y);
|
|
var ax = start.X;
|
|
var ay = start.Y;
|
|
|
|
if (dx == dy) // Handle perfect diagonals
|
|
{
|
|
// I include this "optimization" for more aesthetic reasons, actually.
|
|
// While Bresenham's Line can handle perfect diagonals just fine, it adds
|
|
// additional cells to the line that make it not a perfect diagonal
|
|
// anymore. So, while this branch is ~twice as fast as the next branch,
|
|
// the real reason it is here is for style.
|
|
|
|
// Also, there *is* the reason of performance. If used for cell-based
|
|
// raycasts, for example, then perfect diagonals will check half as many
|
|
// cells.
|
|
|
|
while (dx --> 0)
|
|
{
|
|
ax += xinc;
|
|
ay += yinc;
|
|
if (!callback(new Vector2i(ax, ay)))
|
|
return;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
// Handle all other lines
|
|
|
|
side = -1 * ((dx == 0 ? yinc : xinc) - 1);
|
|
|
|
i = dx + dy;
|
|
error = dx - dy;
|
|
|
|
dx *= 2;
|
|
dy *= 2;
|
|
|
|
while (i --> 0)
|
|
{
|
|
if (error > 0 || error == side)
|
|
{
|
|
ax += xinc;
|
|
error -= dy;
|
|
}
|
|
else
|
|
{
|
|
ay += yinc;
|
|
error += dx;
|
|
}
|
|
|
|
if (!callback(new Vector2i(ax, ay)))
|
|
return;
|
|
}
|
|
}
|
|
|
|
public delegate bool Vector2iCallback(Vector2i index);
|
|
}
|