I personally use my own WalkPath function (which I have stored in an include), because I always thought the reflection one was lacking; here it is… hoping it will bring some use to anyone (and hopefully someone will try to optimize it?).
{ Feroc1ty's walking include...
Functions of the include:
fWalkPath(tpa:TTileArray);
}
procedure MoveToBox(box:TBox);
var tpt:TPoint;
ttl:TTile;
begin
repeat
ttl := Tile(RandomRange(box.x1, box.x2),RandomRange(box.y1, box.y2));
sleep(500+random(300));
until TileOnMM(ttl);
tpt := TileToMM(ttl);
Mouse(tpt.x, tpt.y, 3, 3, true);
R_FindRandoms;
FindNormalRandoms;
end;
procedure AssimilatePoint(var point:TPoint;target:TPoint;range:integer);
begin
repeat
if point.x > target.x then
begin
if (point.x - range) > target.x then
begin
point.x := point.x - range;
end else
begin
point.x := target.x;
end;
end else
begin
if point.x = target.x then break;
if (point.x + range) < target.x then
begin
point.x := point.x + range;
end else
begin
point.x := target.x;
end;
end;
until (true = true);
repeat
if point.y > target.y then
begin
if (point.y - range) > target.y then
begin
point.y := point.y - range;
end else
begin
point.y := target.y;
end;
end else
begin
if point.y = target.y then break;
if (point.y + range) < target.y then
begin
point.y := point.y + range;
end else
begin
point.y := target.y;
end;
end;
until (true=true);
end;
procedure fWalkPath(tpa:TPointArray;reverse:boolean);
var i,target:integer;
t:TPoint;
begin
fDebug('Feroc1ty Walk','Begining to walk a path in reverse('+tostr(reverse)+')');
if not reverse then
begin
for i := high(tpa) downto 0 do
begin
if TileOnMM(PointToTile(tpa[i])) then
break;
end;
if i = -1 then
begin
if DistanceTile(GetMyPos,tpa[0]) > DistanceTile(GetMyPos,tpa[high(tpa)]) then
target := high(tpa)
else
target := 0;
repeat
t := GetMyPos;
AssimilatePoint(t, tpa[target], 10);
WalkToTile(t, 4, 2);
until TileOnMM(PointToTile(tpa[target]));
i := target;
end;
for i := i to high(tpa) do
begin
MoveToBox(PtToBox(tpa[i],4));
end;
end else
begin
for i := 0 to high(tpa) do
begin
if TileOnMM(PointToTile(tpa[i])) then
break;
end;
if i = -1 then
begin
if DistanceTile(GetMyPos,tpa[0]) > DistanceTile(GetMyPos,tpa[high(tpa)]) then
target := high(tpa)
else
target := 0;
repeat
t := GetMyPos;
AssimilatePoint(t, tpa[target], 10);
WalkToTile(t, 4, 2);
until TileOnMM(PointToTile(tpa[target]));
i := target;
end;
for i := i downto 0 do
begin
MoveToBox(PtToBox(tpa[i],4));
end;
end;
R_FFlag(0);
end;