diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uUtils.pas --- 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);