//SCAR Plugin. Created for SCAR Divi by Kaitnieks & Freddy1990 // currently you can't call SCAR functions from plugin library SKyPlugin; uses FastShareMem, SysUtils; {$R *.res} type TPoint = record x, y: Integer; end; TPointArray = array of TPoint; TRockObject = record Width, Height, x1, y1, x2, y2, mx, my, Color : Integer; P: TPointArray; end; TRockObjectArray = array of TRockObject; //--------------------------------------- // Functions to be called from SCAR function NearbyPointInArrayEx(const P: TPoint; w, h:Integer; a: TPointArray): Boolean; var i: Integer; begin Result := False; for i := 0 to High(a) do if (Abs(P.x - a[i].x) <= w) and (Abs(P.y - a[i].y) <= h) then begin Result := True; Exit; end; end; function NearbyPointInArray(const P: TPoint; Dist:Integer; a: TPointArray): Boolean; begin Result := NearbyPointInArrayEx(P, Dist, Dist, a); end; function RockPoints(const Points: TPointArray; Dist: Integer): TRockObjectArray; stdcall; var Color, Tol, PL, PPL, I, n, L: Integer; SetIt: Boolean; begin Pl := Length(Points); if (Pl = 0) then exit; for I := 0 to PL do begin if (I < Pl-1) then begin PPL := Length(Result)-1; for n := 0 to PPL do if (NearbyPointInArray(Points[i], Dist, Result[n].P)) then begin L := length(Result[n].P); SetLength(Result[n].P, l + 1); Result[n].P[L] := Points[i]; if (Result[n].x1 > Points[i].x) then Result[n].x1 := Points[i].x; if (Result[n].y1 > Points[i].y) then Result[n].y1 := Points[i].y; if (Result[n].x2 < Points[i].x) then Result[n].x2 := Points[i].x; if (Result[n].y2 < Points[i].y) then Result[n].y2 := Points[i].y; Break; end; if (PPL < n) then begin L := Length(Result); SetLength(Result, L + 1); SetLength(Result[L].P, 1); Result[L].P[0] := Points[i]; Result[l].x1 := 516; Result[l].y1 := 338; SetIt := True; end; end; if (i > 1) and (SetIt) then begin L := Length(Result); Result[L-1].Width := Result[L-1].x2 - Result[L-1].x1; Result[L-1].Height := Result[L-1].y2 - Result[L-1].y1; Result[L-1].mx := Result[L-1].x1 + Result[L-1].Width shr 1; Result[L-1].my := Result[L-1].y1 + Result[L-1].Height shr 1; SetIt := False; end; end; end; //******************************** // Change this accordingly to your function count function GetFunctionCount(): Integer; stdcall; export; begin Result := 1; end; //******************************* // Change this accordingly to your function definitions function GetFunctionInfo(x: Integer; var ProcAddr: Pointer; var ProcDef: PChar): Integer; stdcall; begin case x of 0: begin ProcAddr := @RockPoints; StrPCopy(ProcDef, 'function RockPoints(Points: TPointArray; Dist: Integer): TRockObjectArray;'); end; else x := -1; end; Result := x; end; //******************************** // Change this accordingly to your type count function GetTypeCount(): Integer; stdcall; export; begin Result := 2; end; //******************************* // Types you want to add function GetTypeInfo(x: Integer; var sType, sTypeDef: string): Integer; stdcall; begin case x of 0: begin sType := 'TRockObject'; sTypeDef := 'record Width, Height, x1, y1, x2, y2, mx, my, Color: Integer; P: TPointArray; end;'; end; 1: begin sType := 'TRockObjectArray'; sTypeDef := 'array of TRockObject'; end; else x := -1; end; Result := x; end; //*************************** // Don't change below this exports GetFunctionCount; exports GetFunctionInfo; exports GetTypeCount; exports GetTypeInfo; end.