--- a/hedgewars/uUtils.pas Thu Aug 11 23:05:14 2016 +0300
+++ b/hedgewars/uUtils.pas Sun Dec 17 00:09:24 2017 +0100
@@ -42,6 +42,7 @@
function EnumToStr(const en : TCapGroup) : shortstring; overload;
function EnumToStr(const en : TSprite) : shortstring; overload;
function EnumToStr(const en : TMapGen) : shortstring; overload;
+function EnumToStr(const en : TWorldEdge) : shortstring; overload;
function Min(a, b: LongInt): LongInt; inline;
function MinD(a, b: double) : double; inline;
@@ -76,6 +77,8 @@
function GetLaunchX(at: TAmmoType; dir: LongInt; angle: LongInt): LongInt;
function GetLaunchY(at: TAmmoType; angle: LongInt): LongInt;
+function CalcWorldWrap(X, radius: LongInt): LongInt;
+
function read1stLn(filePath: shortstring): shortstring;
function readValueFromINI(key, filePath: shortstring): shortstring;
@@ -296,6 +299,11 @@
EnumToStr := GetEnumName(TypeInfo(TMapGen), ord(en))
end;
+function EnumToStr(const en: TWorldEdge) : shortstring; overload;
+begin
+EnumToStr := GetEnumName(TypeInfo(TWorldEdge), ord(en))
+end;
+
function Min(a, b: LongInt): LongInt;
begin
@@ -530,6 +538,7 @@
function GetLaunchX(at: TAmmoType; dir: LongInt; angle: LongInt): LongInt;
begin
+at:= at; dir:= dir; angle:= angle; // parameter hint suppression because code below is currently disabled
GetLaunchX:= 0
(*
if (Ammoz[at].ejectX <> 0) or (Ammoz[at].ejectY <> 0) then
@@ -540,6 +549,7 @@
function GetLaunchY(at: TAmmoType; angle: LongInt): LongInt;
begin
+at:= at; angle:= angle; // parameter hint suppression because code below is currently disabled
GetLaunchY:= 0
(*
if (Ammoz[at].ejectX <> 0) or (Ammoz[at].ejectY <> 0) then
@@ -548,6 +558,31 @@
GetLaunchY:= 0*)
end;
+// Takes an X coordinate and corrects if according to the world edge rules
+// Wrap-around: X will be wrapped
+// Bouncy: X will be kept inside the legal land (taking radius into account)
+// Other world edges: Just returns X
+// radius is a radius (gear radius) tolerance for an appropriate distance from bouncy world edges.
+// Set radius to 0 if you don't care.
+function CalcWorldWrap(X, radius: LongInt): LongInt;
+begin
+ if WorldEdge = weWrap then
+ begin
+ if X < leftX then
+ X:= X + (rightX - leftX)
+ else if X > rightX then
+ X:= X - (rightX - leftX);
+ end
+ else if WorldEdge = weBounce then
+ begin
+ if (X + radius) < leftX then
+ X:= leftX + radius
+ else if (X - radius) > rightX then
+ X:= rightX - radius;
+ end;
+ CalcWorldWrap:= X;
+end;
+
function CheckNoTeamOrHH: boolean;
begin
CheckNoTeamOrHH:= (CurrentTeam = nil) or (CurrentHedgehog^.Gear = nil);