public List<Vector2i> pathTo(Area area, Vector2i point) { point = point - area.origin; int d = area.distanceToLocal(point); List<Vector2i> result = new List<Vector2i>(d); if (d <= 0) return result; Vector2i[] path = new Vector2i[d]; path[0] = point; int checkFirst = 0; int currentValue = d; for (int i = 1; i < d; ++i) { Vector2i current = path[i - 1]; for (int j = 0; j < 4; ++j) { Vector2i potential = current + Vector2i.directions4[(checkFirst + j) % 4]; int potentialValue = area.distanceToLocal(potential); if (potentialValue < 0) continue; if (potentialValue < currentValue) { currentValue = potentialValue; path[i] = potential; checkFirst = j; break; } } } for (int i = 0; i < d; ++i) { result.Add(area.origin + path[d - i - 1]); } return result; }