Bad Boy JH
2010-12-03 07:15:04
I don't know HOW important these procedures might be, but they may prove useful in such things as FishingSpot clicking, and the carpet in the demon random.
function InRangeBetter(Value, Border1, Border2: Integer): Boolean;
begin
Result := InRange(Value, Border1, Border2) or InRange(Value, Border2, Border1);
end;
function XToY(X: Integer; Point1, Point2: TPoint): Integer;
var
M: Extended;
begin
M := 1.0 * (Point2.y - Point1.y) / (Point2.x - Point1.x);
Result := Round((X - Point1.x) * M) + Point1.y;
end;
function PointInTriangle(ThePoint: TPoint; TrianglePoint1, TrianglePoint2, TrianglePoint3: TPoint): Boolean;
var
Error: Boolean;
begin
if not InRange(ThePoint.x, Min(Min(TrianglePoint1.x, TrianglePoint2.x), TrianglePoint3.x), Max(Max(TrianglePoint1.x, TrianglePoint2.x), TrianglePoint3.x)) then
Exit;
if ((TrianglePoint1.x < ThePoint.x) and (TrianglePoint2.x < ThePoint.x)) or ((TrianglePoint1.x > ThePoint.x) and (TrianglePoint2.x > ThePoint.x)) then
Result := InRangeBetter(ThePoint.y, XToY(ThePoint.x, TrianglePoint1, TrianglePoint3), XToY(ThePoint.x, TrianglePoint2, TrianglePoint3)) else
if ((TrianglePoint1.x < ThePoint.x) and (TrianglePoint3.x < ThePoint.x)) or ((TrianglePoint1.x > ThePoint.x) and (TrianglePoint3.x > ThePoint.x)) then
Result := InRangeBetter(ThePoint.y, XToY(ThePoint.x, TrianglePoint1, TrianglePoint2), XToY(ThePoint.x, TrianglePoint2, TrianglePoint3)) else
if ((TrianglePoint2.x < ThePoint.x) and (TrianglePoint3.x < ThePoint.x)) or ((TrianglePoint2.x > ThePoint.x) and (TrianglePoint3.x > ThePoint.x)) then
Result := InRangeBetter(ThePoint.y, XToY(ThePoint.x, TrianglePoint1, TrianglePoint2), XToY(ThePoint.x, TrianglePoint1, TrianglePoint3)) else
if ThePoint.x = TrianglePoint1.x then
begin
if InRangeBetter(TrianglePoint1.x, TrianglePoint2.x, TrianglePoint3.x) then
Result := InRangeBetter(ThePoint.y, TrianglePoint1.y, XToY(ThePoint.x, TrianglePoint2, TrianglePoint3)) else
Result := ThePoint.y = TrianglePoint1.y;
end else
if ThePoint.x = TrianglePoint2.x then
begin
if InRangeBetter(TrianglePoint2.x, TrianglePoint1.x, TrianglePoint3.x) then
Result := InRangeBetter(ThePoint.y, TrianglePoint2.y, XToY(ThePoint.x, TrianglePoint1, TrianglePoint3)) else
Result := ThePoint.y = TrianglePoint1.y;
end else
if ThePoint.x = TrianglePoint3.x then
begin
if InRangeBetter(TrianglePoint3.x, TrianglePoint1.x, TrianglePoint2.x) then
Result := InRangeBetter(ThePoint.y, TrianglePoint3.y, XToY(ThePoint.x, TrianglePoint1, TrianglePoint2)) else
Result := ThePoint.y = TrianglePoint1.y;
end;
end;
function PointInAbstractBox(P1, P2, P3, P4, MainPoint: TPoint): Boolean;
begin
Result := PointInTriangle(MainPoint, P1, P2, P3) or
PointInTriangle(MainPoint, P1, P2, P4) or
PointInTriangle(MainPoint, P1, P3, P4) or
PointInTriangle(MainPoint, P2, P3, P4);
end;
procedure ClickTileBox(TileBox: TBox; ClickType: Integer);
var
P1, P2, P3, P4, ClickPoint: TPoint;
I, X, Y: Integer;
TPA: TPointArray;
begin
repeat
ClickPoint.x := RandomRange(Min(Min(Min(P1.x, P2.x), P3.x), P4.x), Max(Max(Max(P1.x, P2.x), P3.x), P4.x) + 1);
ClickPoint.y := RandomRange(Min(Min(Min(P1.y, P2.y), P3.y), P4.y), Max(Max(Max(P1.y, P2.y), P3.y), P4.y) + 1);
//Possibly needs a failsafe here, however odds of it not getting a point, are minimal
until PointInAbstractBox(P1, P2, P3, P4, ClickPoint);
case ClickType of
1 : Mouse(ClickPoint.x, ClickPoint.y, 0, 0, True);
2 : Mouse(ClickPoint.x, ClickPoint.y, 0, 0, False);
3 : Mouse(ClickPoint.x, ClickPoint.y, 0, 0);
else
Writeln('Unsupported Clicktype - ' + IntToStr(ClickType));
end;
end;
procedure ClickTile(TheTile: TTile; ClickType: Integer);
begin
ClickTileBox(TheTile.x, TheTile.y, TheTile.x, TheTile.y, ClickType);
end;