Simba Code:
function R_TileToMSEx(X, Y, Height: Extended): TPoint;
var
Z, CurveX, CurveY, CurveCosX, CurveCosY, CurveSinX, CurveSinY, TempCalculation: Extended;
CalculatedScreenPosX, CalculatedScreenPosY: Integer;
begin
try
begin
if (X < 128) or (Y < 128) or (X > 13056) or (Y > 13056) then begin
Result := Point(-1, -1);
Exit;
end;
Z := -Height;
X := X - R_GetCameraX;
Y := Y - R_GetCameraY;
Z := Z - R_GetCameraZ;
CurveX := R_GetCameraYaw;
CurveY := R_GetCameraPitch;
CurveCosX := CURVECOS[Floor(CurveX)];
CurveCosY := CURVECOS[Floor(CurveY)];
CurveSinX := CURVESIN[Floor(CurveX)];
CurveSinY := CURVESIN[Floor(CurveY)];
TempCalculation := ashr(Round((CurveCosX * X) + (Y * CurveSinX)), 16);
Y := ashr(Round((Y * CurveCosX) - (X * CurveSinX)), 16);
X := Round(TempCalculation);
TempCalculation := ashr(Round((Z * CurveCosY) - (Y * CurveSinY)), 16);
Y := ashr(Round((Z * CurveSinY) - ((-CurveCosY) * Y)), 16);
Z := Round(TempCalculation);
if (Y < 50) then begin
Result := Point(-1, -1);
Exit;
end else begin
CalculatedScreenPosX := Round((((Floor(X) shl 9) / Y)));
IncEx(CalculatedScreenPosX, 256);
CalculatedScreenPosY := Round((((Floor(Z) shl 9) / Y)));
IncEx(CalculatedScreenPosY, 167);
Result := Point(CalculatedScreenPosX, CalculatedScreenPosY);
end;
end;
except
end;
end;