# HG changeset patch # User unC0Rr # Date 1672671566 -3600 # Node ID 128ace9138375ff191287485912398ae4116716c # Parent 73cdc306888fa98d55ff6aced04ebd59b8fe3c6d Introduce hwengine-future library, use Land allocated in it diff -r 73cdc306888f -r 128ace913837 CMakeLists.txt --- a/CMakeLists.txt Tue Dec 13 21:21:55 2022 +0100 +++ b/CMakeLists.txt Mon Jan 02 15:59:26 2023 +0100 @@ -139,10 +139,10 @@ add_flag_append(CMAKE_CXX_FLAGS_DEBUG "/Od") else() add_flag_append(CMAKE_C_FLAGS "-Wall -pipe") - add_flag_append(CMAKE_C_FLAGS_RELEASE "-O2") + add_flag_append(CMAKE_C_FLAGS_RELEASE "-O3") add_flag_append(CMAKE_C_FLAGS_DEBUG "-Wextra -O0") add_flag_append(CMAKE_CXX_FLAGS "-Wall -pipe") - add_flag_append(CMAKE_CXX_FLAGS_RELEASE "-O2") + add_flag_append(CMAKE_CXX_FLAGS_RELEASE "-O3") add_flag_append(CMAKE_CXX_FLAGS_DEBUG "-Wextra -O0") endif() diff -r 73cdc306888f -r 128ace913837 hedgewars/SDLh.pas --- a/hedgewars/SDLh.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/SDLh.pas Mon Jan 02 15:59:26 2023 +0100 @@ -1142,7 +1142,7 @@ procedure SDL_SetEventFilter(filter: TSDL_EventFilter); cdecl; external SDLLibName; function SDL_ShowCursor(toggle: LongInt): LongInt; cdecl; external SDLLibName; -procedure SDL_WarpMouse(x, y: Word); inline; +procedure SDL_WarpMouse(x, y: Word); function SDL_GetKeyboardState(numkeys: PLongInt): PByteArray; cdecl; external SDLLibName; @@ -1297,7 +1297,7 @@ // for sdl2 we provide a SDL_WarpMouse() which calls the right SDL_WarpMouseInWindow() function // this has the advantage of reducing 'uses' and 'ifdef' statements // (SDLwindow is a private member of uStore module) -procedure SDL_WarpMouse(x, y: Word); inline; +procedure SDL_WarpMouse(x, y: Word); begin WarpMouse(x, y); end; diff -r 73cdc306888f -r 128ace913837 hedgewars/options.inc --- a/hedgewars/options.inc Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/options.inc Mon Jan 02 15:59:26 2023 +0100 @@ -65,6 +65,8 @@ {$DEFINE _S:=} {$DEFINE _P:=} +{$optimization autoInline} + //{$DEFINE TRACEAIACTIONS} //{$DEFINE COUNTTICKS} diff -r 73cdc306888f -r 128ace913837 hedgewars/uAIAmmoTests.pas --- a/hedgewars/uAIAmmoTests.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uAIAmmoTests.pas Mon Jan 02 15:59:26 2023 +0100 @@ -25,7 +25,7 @@ amtest_Rare = $00000001; // check only several positions amtest_NoTarget = $00000002; // each pos, but no targetting amtest_MultipleAttacks = $00000004; // test could result in multiple attacks, set AttacksNum - amtest_NoTrackFall = $00000008; // skip fall tracing. + amtest_NoTrackFall = $00000008; // skip fall tracing. amtest_LaserSight = $00000010; // supports laser sighting amtest_NoVampiric = $00000020; // don't use vampirism with this ammo amtest_NoInvulnerable = $00000040; // don't use invulnerable with this with ammo @@ -151,9 +151,9 @@ ); implementation -uses uVariables, uUtils, uGearsHandlers; +uses uVariables, uUtils, uGearsHandlers, uLandUtils; -function Metric(x1, y1, x2, y2: LongInt): LongInt; inline; +function Metric(x1, y1, x2, y2: LongInt): LongInt; begin Metric:= abs(x1 - x2) + abs(y1 - y2) end; @@ -1081,7 +1081,7 @@ if ((ix and LAND_WIDTH_MASK) = 0) and ((iy and LAND_HEIGHT_MASK) = 0) then repeat - if Land[iy, ix] <> 0 then + if LandGet(iy, ix) <> 0 then inc(d); x:= x + vX; y:= y + vY; @@ -1137,7 +1137,7 @@ x:= x + vX; y:= y + vY; if ((trunc(x) and LAND_WIDTH_MASK) = 0)and((trunc(y) and LAND_HEIGHT_MASK) = 0) - and (Land[trunc(y), trunc(x)] <> 0) then + and (LandGet(trunc(y), trunc(x)) <> 0) then inc(d); until (Abs(Targ.Point.X - trunc(x)) + Abs(Targ.Point.Y - trunc(y)) < 4) or (x < 0) diff -r 73cdc306888f -r 128ace913837 hedgewars/uAIMisc.pas --- a/hedgewars/uAIMisc.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uAIMisc.pas Mon Jan 02 15:59:26 2023 +0100 @@ -71,20 +71,20 @@ procedure freeModule; procedure FillTargets; -procedure ResetTargets; inline; -procedure AddBonus(x, y: LongInt; r: Longword; s: LongInt); inline; +procedure ResetTargets; +procedure AddBonus(x, y: LongInt; r: Longword; s: LongInt); procedure FillBonuses(isAfterAttack: boolean); -procedure AwareOfExplosion(x, y, r: LongInt); inline; +procedure AwareOfExplosion(x, y, r: LongInt); function RatePlace(Gear: PGear): LongInt; -function CheckWrap(x: real): real; inline; -function TestColl(x, y, r: LongInt): boolean; inline; -function TestCollHogsOrObjects(x, y, r: LongInt): boolean; inline; -function TestCollExcludingObjects(x, y, r: LongInt): boolean; inline; -function TestCollExcludingMe(Me: PGear; x, y, r: LongInt): boolean; inline; +function CheckWrap(x: real): real; +function TestColl(x, y, r: LongInt): boolean; +function TestCollHogsOrObjects(x, y, r: LongInt): boolean; +function TestCollExcludingObjects(x, y, r: LongInt): boolean; +function TestCollExcludingMe(Me: PGear; x, y, r: LongInt): boolean; -function RateExplosion(Me: PGear; x, y, r: LongInt): LongInt; inline; -function RateExplosion(Me: PGear; x, y, r: LongInt; Flags: LongWord): LongInt; inline; +function RateExplosion(Me: PGear; x, y, r: LongInt): LongInt; +function RateExplosion(Me: PGear; x, y, r: LongInt; Flags: LongWord): LongInt; function RealRateExplosion(Me: PGear; x, y, r: LongInt; Flags: LongWord): LongInt; function RateShove(Me: PGear; x, y, r, power, kick: LongInt; gdX, gdY: real; Flags: LongWord): LongInt; function RateShotgun(Me: PGear; gdX, gdY: real; x, y: LongInt): LongInt; @@ -93,8 +93,8 @@ function RateHammer(Me: PGear): LongInt; function HHGo(Gear, AltGear: PGear; var GoInfo: TGoInfo): boolean; -function AIrndSign(num: LongInt): LongInt; inline; -function AIrndOffset(targ: TTarget; Level: LongWord): LongInt; inline; +function AIrndSign(num: LongInt): LongInt; +function AIrndOffset(targ: TTarget; Level: LongWord): LongInt; var ThinkingHH: PGear; Targets: TTargets; @@ -109,14 +109,14 @@ var dmgMod: real = 1.0; implementation -uses uCollisions, uVariables, uUtils, uGearsUtils, uAIAmmoTests; +uses uCollisions, uVariables, uUtils, uGearsUtils, uAIAmmoTests, uLandUtils; var KnownExplosion: record X, Y, Radius: LongInt end = (X: 0; Y: 0; Radius: 0); -procedure ResetTargets; inline; +procedure ResetTargets; var i: LongWord; begin if Targets.reset then @@ -200,7 +200,7 @@ else friendlyfactor:= max(30, 300 - f * 80 div max(1,e)) end; -procedure AddBonus(x, y: LongInt; r: Longword; s: LongInt); inline; +procedure AddBonus(x, y: LongInt; r: Longword; s: LongInt); begin if(bonuses.Count < MAXBONUS) then begin @@ -212,7 +212,7 @@ end; end; -procedure AddWalkBonus(x, y: LongInt; r: Longword; s: LongInt); inline; +procedure AddWalkBonus(x, y: LongInt; r: Longword; s: LongInt); begin if(walkbonuses.Count < MAXBONUS div 8) then begin @@ -334,7 +334,7 @@ end; end; -procedure AwareOfExplosion(x, y, r: LongInt); inline; +procedure AwareOfExplosion(x, y, r: LongInt); begin KnownExplosion.X:= x; KnownExplosion.Y:= y; @@ -363,17 +363,17 @@ RatePlace:= rate; end; -function CheckWrap(x: real): real; inline; +function CheckWrap(x: real): real; begin if WorldEdge = weWrap then if (x < leftX) then x:= x + (rightX - leftX) - else if x > rightX then + else if x > rightX then x:= x - (rightX - leftX); CheckWrap:= x; end; -function CheckBounds(x, y, r: Longint): boolean; inline; +function CheckBounds(x, y, r: Longint): boolean; begin CheckBounds := (((x-r) and LAND_WIDTH_MASK) = 0) and (((x+r) and LAND_WIDTH_MASK) = 0) and @@ -383,60 +383,60 @@ // Check for collision with anything -function TestCollWithEverything(x, y, r: LongInt): boolean; inline; +function TestCollWithEverything(x, y, r: LongInt): boolean; begin if not CheckBounds(x, y, r) then exit(false); - if (Land[y-r, x-r] <> 0) or - (Land[y+r, x-r] <> 0) or - (Land[y-r, x+r] <> 0) or - (Land[y+r, x+r] <> 0) then + if (LandGet(y-r, x-r) <> 0) or + (LandGet(y+r, x-r) <> 0) or + (LandGet(y-r, x+r) <> 0) or + (LandGet(y+r, x+r) <> 0) then exit(true); TestCollWithEverything := false; end; // Check for collision with non-objects -function TestCollExcludingObjects(x, y, r: LongInt): boolean; inline; +function TestCollExcludingObjects(x, y, r: LongInt): boolean; begin if not CheckBounds(x, y, r) then exit(false); - if (Land[y-r, x-r] > lfAllObjMask) or - (Land[y+r, x-r] > lfAllObjMask) or - (Land[y-r, x+r] > lfAllObjMask) or - (Land[y+r, x+r] > lfAllObjMask) then + if (LandGet(y-r, x-r) > lfAllObjMask) or + (LandGet(y+r, x-r) > lfAllObjMask) or + (LandGet(y-r, x+r) > lfAllObjMask) or + (LandGet(y+r, x+r) > lfAllObjMask) then exit(true); TestCollExcludingObjects:= false; end; // Check for collision with something other than current hedgehog or crate -function TestColl(x, y, r: LongInt): boolean; inline; +function TestColl(x, y, r: LongInt): boolean; begin if not CheckBounds(x, y, r) then exit(false); - if (Land[y-r, x-r] and lfNotCurHogCrate <> 0) or - (Land[y+r, x-r] and lfNotCurHogCrate <> 0) or - (Land[y-r, x+r] and lfNotCurHogCrate <> 0) or - (Land[y+r, x+r] and lfNotCurHogCrate <> 0) then + if (LandGet(y-r, x-r) and lfNotCurHogCrate <> 0) or + (LandGet(y+r, x-r) and lfNotCurHogCrate <> 0) or + (LandGet(y-r, x+r) and lfNotCurHogCrate <> 0) or + (LandGet(y+r, x+r) and lfNotCurHogCrate <> 0) then exit(true); TestColl:= false; end; // Check for collision with hedgehog or object -function TestCollHogsOrObjects(x, y, r: LongInt): boolean; inline; +function TestCollHogsOrObjects(x, y, r: LongInt): boolean; begin if not CheckBounds(x, y, r) then exit(false); - if (Land[y-r, x-r] and lfAllObjMask <> 0) or - (Land[y+r, x-r] and lfAllObjMask <> 0) or - (Land[y-r, x+r] and lfAllObjMask <> 0) or - (Land[y+r, x+r] and lfAllObjMask <> 0) then + if (LandGet(y-r, x-r) and lfAllObjMask <> 0) or + (LandGet(y+r, x-r) and lfAllObjMask <> 0) or + (LandGet(y-r, x+r) and lfAllObjMask <> 0) or + (LandGet(y+r, x+r) and lfAllObjMask <> 0) then exit(true); TestCollHogsOrObjects:= false; @@ -445,7 +445,7 @@ // Check for collision with something other than the given "Me" gear. // Wrapper to test various approaches. If it works reasonably, will just replace. // Right now, converting to hwFloat is a tad inefficient since the x/y were hwFloat to begin with... -function TestCollExcludingMe(Me: PGear; x, y, r: LongInt): boolean; inline; +function TestCollExcludingMe(Me: PGear; x, y, r: LongInt): boolean; var MeX, MeY: LongInt; begin if ((x and LAND_WIDTH_MASK) = 0) and ((y and LAND_HEIGHT_MASK) = 0) then @@ -453,7 +453,7 @@ MeX:= hwRound(Me^.X); MeY:= hwRound(Me^.Y); // We are still inside the hog. Skip radius test - if ((sqr(x-MeX) + sqr(y-MeY)) < 256) and (Land[y, x] and lfObjMask = 0) then + if ((sqr(x-MeX) + sqr(y-MeY)) < 256) and (LandGet(y, x) and lfObjMask = 0) then exit(false); end; TestCollExcludingMe:= TestCollWithEverything(x, y, r) @@ -566,12 +566,12 @@ end; end; -function RateExplosion(Me: PGear; x, y, r: LongInt): LongInt; inline; +function RateExplosion(Me: PGear; x, y, r: LongInt): LongInt; begin RateExplosion:= RealRateExplosion(Me, x, y, r, 0); ResetTargets; end; -function RateExplosion(Me: PGear; x, y, r: LongInt; Flags: LongWord): LongInt; inline; +function RateExplosion(Me: PGear; x, y, r: LongInt; Flags: LongWord): LongInt; begin RateExplosion:= RealRateExplosion(Me, x, y, r, Flags); ResetTargets; @@ -637,7 +637,7 @@ if pY - y < 0 then dY:= -dY; if (x and LAND_WIDTH_MASK = 0) and ((y+cHHRadius+2) and LAND_HEIGHT_MASK = 0) and - (Land[y+cHHRadius+2, x] and lfIndestructible <> 0) then + (LandGet(y+cHHRadius+2, x) and lfIndestructible <> 0) then fallDmg:= trunc(TraceFall(x, y, pX, pY, dX, dY, 0, Targets.ar[i]) * dmgMod) else fallDmg:= trunc(TraceFall(x, y, pX, pY, dX, dY, erasure, Targets.ar[i]) * dmgMod) end; @@ -831,7 +831,7 @@ ((abs(dY) < 0.15) and (abs(dX) < 0.15))) then dX:= 0; if (x and LAND_WIDTH_MASK = 0) and ((y+cHHRadius+2) and LAND_HEIGHT_MASK = 0) and - (Land[y+cHHRadius+2, x] and lfIndestructible <> 0) then + (LandGet(y+cHHRadius+2, x) and lfIndestructible <> 0) then fallDmg:= trunc(TraceFall(x, y, pX, pY, dX, dY, 0, Targets.ar[i]) * dmgMod) else fallDmg:= trunc(TraceFall(x, y, pX, pY, dX, dY, erasure, Targets.ar[i]) * dmgMod) end; @@ -1206,7 +1206,7 @@ HHJump(AltGear, jmpHJump, GoInfo); end; -function AIrndSign(num: LongInt): LongInt; inline; +function AIrndSign(num: LongInt): LongInt; begin if random(2) = 0 then AIrndSign:= num @@ -1214,7 +1214,7 @@ AIrndSign:= - num end; -function AIrndOffset(targ: TTarget; Level: LongWord): LongInt; inline; +function AIrndOffset(targ: TTarget; Level: LongWord): LongInt; begin if Level <> 1 then exit(0); // at present level 2 doesn't track falls on most things diff -r 73cdc306888f -r 128ace913837 hedgewars/uChat.pas --- a/hedgewars/uChat.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uChat.pas Mon Jan 02 15:59:26 2023 +0100 @@ -105,7 +105,7 @@ procedure UpdateCursorCoords(); forward; // relevant for UTF-8 handling -function IsFirstCharByte(c: char): boolean; inline; +function IsFirstCharByte(c: char): boolean; begin // based on https://en.wikipedia.org/wiki/UTF-8#Description IsFirstCharByte:= (byte(c) and $C0) <> $80; diff -r 73cdc306888f -r 128ace913837 hedgewars/uCollisions.pas --- a/hedgewars/uCollisions.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uCollisions.pas Mon Jan 02 15:59:26 2023 +0100 @@ -70,11 +70,11 @@ function CheckGearsLineCollision(Gear: PGear; oX, oY, tX, tY: hwFloat): PGearArray; function CheckAllGearsLineCollision(SourceGear: PGear; oX, oY, tX, tY: hwFloat): PGearArray; -function UpdateHitOrder(Gear: PGear; Order: LongInt): boolean; inline; -function UpdateHitOrder(Gear: PGear; Order: LongInt; Global: boolean): boolean; inline; -function UpdateGlobalHitOrder(Gear: PGear; Order: LongInt): boolean; inline; -procedure ClearHitOrderLeq(MinOrder: LongInt); inline; -procedure ClearGlobalHitOrderLeq(MinOrder: LongInt); inline; +function UpdateHitOrder(Gear: PGear; Order: LongInt): boolean; +function UpdateHitOrder(Gear: PGear; Order: LongInt; Global: boolean): boolean; +function UpdateGlobalHitOrder(Gear: PGear; Order: LongInt): boolean; +procedure ClearHitOrderLeq(MinOrder: LongInt); +procedure ClearGlobalHitOrderLeq(MinOrder: LongInt); procedure ClearHitOrder(); procedure RefillProximityCache(SourceGear: PGear; radius: LongInt); @@ -84,16 +84,16 @@ function TestCollisionXImpl(centerX, centerY, radius, direction: LongInt; collisionMask: Word): Word; function TestCollisionYImpl(centerX, centerY, radius, direction: LongInt; collisionMask: Word): Word; -function TestCollisionXwithGear(Gear: PGear; Dir: LongInt): Word; inline; -function TestCollisionYwithGear(Gear: PGear; Dir: LongInt): Word; inline; +function TestCollisionXwithGear(Gear: PGear; Dir: LongInt): Word; +function TestCollisionYwithGear(Gear: PGear; Dir: LongInt): Word; -function TestCollisionX(Gear: PGear; Dir: LongInt): Word; inline; -function TestCollisionY(Gear: PGear; Dir: LongInt): Word; inline; +function TestCollisionX(Gear: PGear; Dir: LongInt): Word; +function TestCollisionY(Gear: PGear; Dir: LongInt): Word; -function TestCollisionXwithXYShift(Gear: PGear; ShiftX: hwFloat; ShiftY: LongInt; Dir: LongInt): Word; inline; -function TestCollisionXwithXYShift(Gear: PGear; ShiftX: hwFloat; ShiftY: LongInt; Dir: LongInt; withGear: boolean): Word; inline; -function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: LongInt; Dir: LongInt): Word; inline; -function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: LongInt; Dir: LongInt; withGear: boolean): Word; inline; +function TestCollisionXwithXYShift(Gear: PGear; ShiftX: hwFloat; ShiftY: LongInt; Dir: LongInt): Word; +function TestCollisionXwithXYShift(Gear: PGear; ShiftX: hwFloat; ShiftY: LongInt; Dir: LongInt; withGear: boolean): Word; +function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: LongInt; Dir: LongInt): Word; +function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: LongInt; Dir: LongInt; withGear: boolean): Word; function TestCollisionXKickImpl(centerX, centerY, radius, direction: LongInt; collisionMask, kickMask: Word): TKickTest; function TestCollisionYKickImpl(centerX, centerY, radius, direction: LongInt; collisionMask, kickMask: Word): TKickTest; @@ -103,7 +103,7 @@ function TestRectangleForObstacle(x1, y1, x2, y2: LongInt; landOnly: boolean): boolean; -function CheckCoordInWater(X, Y: LongInt): boolean; inline; +function CheckCoordInWater(X, Y: LongInt): boolean; // returns: negative sign if going downhill to left, value is steepness (noslope/error = _0, 45 = _0_5) function CalcSlopeBelowGear(Gear: PGear): hwFloat; @@ -113,7 +113,7 @@ function CheckGearsUnderSprite(Sprite: TSprite; sprX, sprY, Frame: LongInt): boolean; implementation -uses uConsts, uLandGraphics, uVariables, SDLh, uLandTexture, uDebug; +uses uConsts, uLandGraphics, uVariables, SDLh, uLandTexture, uDebug, uLandUtils; type TCollisionEntry = record X, Y, Radius: LongInt; @@ -159,7 +159,7 @@ end; end; -function CheckCoordInWater(X, Y: LongInt): boolean; inline; +function CheckCoordInWater(X, Y: LongInt): boolean; begin CheckCoordInWater:= (Y > cWaterLine) or ((WorldEdge = weSea) and ((X < leftX) or (X > rightX))); @@ -221,7 +221,7 @@ function LineCollisionTest(oX, oY, dirX, dirY, dirNormSqr, dirNormBound: hwFloat; width: LongInt; Gear: PGear): - TLineCollision; inline; + TLineCollision; var toCenterX, toCenterY, r, b, bSqr, c, desc, t: hwFloat; realT: extended; @@ -367,12 +367,12 @@ end end; -function UpdateHitOrder(Gear: PGear; Order: LongInt): boolean; inline; +function UpdateHitOrder(Gear: PGear; Order: LongInt): boolean; begin UpdateHitOrder := UpdateHitOrderImpl(@ordera, Gear, Order); end; -function UpdateHitOrder(Gear: PGear; Order: LongInt; Global: boolean): boolean; inline; +function UpdateHitOrder(Gear: PGear; Order: LongInt; Global: boolean): boolean; begin if Global then UpdateHitOrder := UpdateHitOrderImpl(@globalordera, Gear, Order) @@ -380,7 +380,7 @@ UpdateHitOrder := UpdateHitOrderImpl(@ordera, Gear, Order) end; -function UpdateGlobalHitOrder(Gear: PGear; Order: LongInt): boolean; inline; +function UpdateGlobalHitOrder(Gear: PGear; Order: LongInt): boolean; begin UpdateGlobalHitOrder := UpdateHitOrderImpl(@globalordera, Gear, Order); end; @@ -408,12 +408,12 @@ end end; -procedure ClearHitOrderLeq(MinOrder: LongInt); inline; +procedure ClearHitOrderLeq(MinOrder: LongInt); begin ClearHitOrderLeqImpl(@ordera, MinOrder); end; -procedure ClearGlobalHitOrderLeq(MinOrder: LongInt); inline; +procedure ClearGlobalHitOrderLeq(MinOrder: LongInt); begin ClearHitOrderLeqImpl(@globalordera, MinOrder); end; @@ -480,8 +480,8 @@ minY := max(centerY - radius + 1, 0); maxY := min(centerY + radius - 1, LAND_HEIGHT - 1); for y := minY to maxY do - if Land[y, x] and collisionMask <> 0 then - exit(Land[y, x] and collisionMask); + if LandGet(y, x) and collisionMask <> 0 then + exit(LandGet(y, x) and collisionMask); end; TestCollisionXImpl := 0; end; @@ -499,18 +499,18 @@ minX := max(centerX - radius + 1, 0); maxX := min(centerX + radius - 1, LAND_WIDTH - 1); for x := minX to maxX do - if Land[y, x] and collisionMask <> 0 then - exit(Land[y, x] and collisionMask); + if LandGet(y, x) and collisionMask <> 0 then + exit(LandGet(y, x) and collisionMask); end; TestCollisionYImpl := 0; end; -function TestCollisionX(Gear: PGear; Dir: LongInt): Word; inline; +function TestCollisionX(Gear: PGear; Dir: LongInt): Word; begin TestCollisionX := TestCollisionXImpl(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Radius, Dir, Gear^.CollisionMask and lfLandMask); end; -function TestCollisionY(Gear: PGear; Dir: LongInt): Word; inline; +function TestCollisionY(Gear: PGear; Dir: LongInt): Word; begin TestCollisionY := TestCollisionYImpl(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Radius, Dir, Gear^.CollisionMask and lfLandMask); end; @@ -533,19 +533,19 @@ Gear^.CollisionMask:= lfAll; end; -function TestCollisionXwithGear(Gear: PGear; Dir: LongInt): Word; inline; +function TestCollisionXwithGear(Gear: PGear; Dir: LongInt): Word; begin LegacyFixupX(Gear); TestCollisionXwithGear:= TestCollisionXImpl(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Radius, Dir, Gear^.CollisionMask); end; -function TestCollisionYwithGear(Gear: PGear; Dir: LongInt): Word; inline; +function TestCollisionYwithGear(Gear: PGear; Dir: LongInt): Word; begin LegacyFixupY(Gear); TestCollisionYwithGear:= TestCollisionYImpl(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Radius, Dir, Gear^.CollisionMask); end; -function TestCollisionXwithXYShift(Gear: PGear; ShiftX: hwFloat; ShiftY: LongInt; Dir: LongInt; withGear: boolean): Word; inline; +function TestCollisionXwithXYShift(Gear: PGear; ShiftX: hwFloat; ShiftY: LongInt; Dir: LongInt; withGear: boolean): Word; var collisionMask: Word; begin if withGear then @@ -559,7 +559,7 @@ TestCollisionXwithXYShift := TestCollisionXImpl(hwRound(Gear^.X + ShiftX), hwRound(Gear^.Y) + ShiftY, Gear^.Radius, Dir, collisionMask) end; -function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: LongInt; Dir: LongInt; withGear: boolean): Word; inline; +function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: LongInt; Dir: LongInt; withGear: boolean): Word; var collisionMask: Word; begin if withGear then @@ -573,12 +573,12 @@ TestCollisionYwithXYShift := TestCollisionYImpl(hwRound(Gear^.X) + ShiftX, hwRound(Gear^.Y) + ShiftY, Gear^.Radius, Dir, collisionMask) end; -function TestCollisionXwithXYShift(Gear: PGear; ShiftX: hwFloat; ShiftY: LongInt; Dir: LongInt): Word; inline; +function TestCollisionXwithXYShift(Gear: PGear; ShiftX: hwFloat; ShiftY: LongInt; Dir: LongInt): Word; begin TestCollisionXwithXYShift:= TestCollisionXwithXYShift(Gear, ShiftX, ShiftY, Dir, true); end; -function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: LongInt; Dir: LongInt): Word; inline; +function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: LongInt; Dir: LongInt): Word; begin TestCollisionYwithXYShift:= TestCollisionYwithXYShift(Gear, ShiftX, ShiftY, Dir, true); end; @@ -599,16 +599,16 @@ minY := max(centerY - radius + 1, 0); maxY := min(centerY + radius - 1, LAND_HEIGHT - 1); for y := minY to maxY do - if Land[y, x] and collisionMask <> 0 then + if LandGet(y, x) and collisionMask <> 0 then begin TestCollisionXKickImpl.kick := false; - TestCollisionXKickImpl.collisionMask := Land[y, x] and collisionMask; + TestCollisionXKickImpl.collisionMask := LandGet(y, x) and collisionMask; exit end - else if Land[y, x] and kickMask <> 0 then + else if LandGet(y, x) and kickMask <> 0 then begin TestCollisionXKickImpl.kick := true; - TestCollisionXKickImpl.collisionMask := Land[y, x] and kickMask; + TestCollisionXKickImpl.collisionMask := LandGet(y, x) and kickMask; end; end; end; @@ -629,16 +629,16 @@ minX := max(centerX - radius + 1, 0); maxX := min(centerX + radius - 1, LAND_WIDTH - 1); for x := minX to maxX do - if Land[y, x] and collisionMask <> 0 then + if LandGet(y, x) and collisionMask <> 0 then begin TestCollisionYKickImpl.kick := false; - TestCollisionYKickImpl.collisionMask := Land[y, x] and collisionMask; + TestCollisionYKickImpl.collisionMask := LandGet(y, x) and collisionMask; exit end - else if Land[y, x] and kickMask <> 0 then + else if LandGet(y, x) and kickMask <> 0 then begin TestCollisionYKickImpl.kick := true; - TestCollisionYKickImpl.collisionMask := Land[y, x] and kickMask; + TestCollisionYKickImpl.collisionMask := LandGet(y, x) and kickMask; end; end; end; @@ -767,7 +767,7 @@ for y := y1 to y2 do for x := x1 to x2 do - if ((y and LAND_HEIGHT_MASK) = 0) and ((x and LAND_WIDTH_MASK) = 0) and (Land[y, x] > TestWord) then + if ((y and LAND_HEIGHT_MASK) = 0) and ((x and LAND_WIDTH_MASK) = 0) and (LandGet(y, x) > TestWord) then exit; TestRectangleForObstacle:= false @@ -816,7 +816,7 @@ tmpy:= collisionY + k * my; if (((tmpy) and LAND_HEIGHT_MASK) = 0) and (((tmpx) and LAND_WIDTH_MASK) = 0) then - if (Land[tmpy,tmpx] > TestWord) then + if (LandGet(tmpy,tmpx) > TestWord) then begin // remember the index belonging to the first and last collision (if in 1st half) if (i <> 0) then @@ -867,7 +867,7 @@ tmpx:= ldx + k * offset[tmpo,0]; tmpy:= ldy + k * offset[tmpo,1]; if (((tmpy) and LAND_HEIGHT_MASK) = 0) and (((tmpx) and LAND_WIDTH_MASK) = 0) - and (Land[tmpy,tmpx] > TestWord) then + and (LandGet(tmpy,tmpx) > TestWord) then begin ldx:= tmpx; ldy:= tmpy; @@ -891,7 +891,7 @@ tmpx:= rdx + k * offset[tmpo,0]; tmpy:= rdy + k * offset[tmpo,1]; if (((tmpy) and LAND_HEIGHT_MASK) = 0) and (((tmpx) and LAND_WIDTH_MASK) = 0) - and (Land[tmpy,tmpx] > TestWord) then + and (LandGet(tmpy,tmpx) > TestWord) then begin rdx:= tmpx; rdy:= tmpy; @@ -934,7 +934,7 @@ i:= x + Gear^.Radius * 2 - 2; repeat if (x and LAND_WIDTH_MASK) = 0 then - if Land[y, x] <> 0 then + if LandGet(y, x) <> 0 then if (not isColl) or (abs(x-gx) < abs(collX-gx)) then begin isColl:= true; @@ -957,7 +957,7 @@ i:= y + Gear^.Radius * 2 - 2; repeat if (y and LAND_HEIGHT_MASK) = 0 then - if Land[y, x] <> 0 then + if LandGet(y, x) <> 0 then if (not isColl) or (abs(y-gy) < abs(collY-gy)) then begin isColl:= true; @@ -1026,7 +1026,7 @@ i:= x + Gear^.Radius * 2 - 2; repeat if (x and LAND_WIDTH_MASK) = 0 then - if (Land[y, x] and lfLandMask) <> 0 then + if (LandGet(y, x) and lfLandMask) <> 0 then if (not isColl) or (abs(x-gx) < abs(collX-gx)) then begin isColl:= true; diff -r 73cdc306888f -r 128ace913837 hedgewars/uCommandHandlers.pas --- a/hedgewars/uCommandHandlers.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uCommandHandlers.pas Mon Jan 02 15:59:26 2023 +0100 @@ -586,7 +586,7 @@ if bShowAmmoMenu then bShowAmmoMenu:= false - else if not(CurrentTeam^.Extdriven) and ((Gear = nil) or ((Gear^.State and (gstAttacking or gstAttacked)) <> 0) + else if ((Gear = nil) or ((Gear^.State and (gstAttacking or gstAttacked)) <> 0) or ((Gear^.State and gstHHDriven) = 0)) then begin end diff -r 73cdc306888f -r 128ace913837 hedgewars/uCommands.pas --- a/hedgewars/uCommands.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uCommands.pas Mon Jan 02 15:59:26 2023 +0100 @@ -30,7 +30,7 @@ procedure freeModule; procedure RegisterVariable(Name: shortstring; p: TCommandHandler; Trusted: boolean; Rand: boolean); procedure RegisterVariable(Name: shortstring; p: TCommandHandler; Trusted: boolean); -procedure ParseCommand(CmdStr: shortstring; TrustedSource: boolean); inline; +procedure ParseCommand(CmdStr: shortstring; TrustedSource: boolean); procedure ParseCommand(CmdStr: shortstring; TrustedSource, ExternalSource: boolean); procedure ParseTeamCommand(s: shortstring); procedure StopMessages(Message: Longword); @@ -76,7 +76,7 @@ end; -procedure ParseCommand(CmdStr: shortstring; TrustedSource: boolean); inline; +procedure ParseCommand(CmdStr: shortstring; TrustedSource: boolean); begin ParseCommand(CmdStr, TrustedSource, false) end; diff -r 73cdc306888f -r 128ace913837 hedgewars/uDebug.pas --- a/hedgewars/uDebug.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uDebug.pas Mon Jan 02 15:59:26 2023 +0100 @@ -23,7 +23,7 @@ interface procedure OutError(Msg: shortstring; isFatalError: boolean); -//procedure TryDo(Assert: boolean; Msg: shortstring; isFatal: boolean); inline; +//procedure TryDo(Assert: boolean; Msg: shortstring; isFatal: boolean); function checkFails(Assert: boolean; Msg: shortstring; isFatal: boolean): boolean; function SDLCheck(Assert: boolean; Msg: shortstring; isFatal: boolean): boolean; diff -r 73cdc306888f -r 128ace913837 hedgewars/uFloat.pas --- a/hedgewars/uFloat.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uFloat.pas Mon Jan 02 15:59:26 2023 +0100 @@ -56,45 +56,45 @@ {$ENDIF} // Returns an hwFloat that represents the value of integer parameter i -function int2hwFloat (const i: LongInt) : hwFloat; inline; -function hwFloat2Float (const i: hwFloat) : extended; inline; +function int2hwFloat (const i: LongInt) : hwFloat; +function hwFloat2Float (const i: hwFloat) : extended; // The implemented operators -operator = (const z1, z2: hwFloat) z : boolean; inline; +operator = (const z1, z2: hwFloat) z : boolean; {$IFDEF PAS2C} -operator <> (const z1, z2: hwFloat) z : boolean; inline; +operator <> (const z1, z2: hwFloat) z : boolean; {$ENDIF} -operator + (const z1, z2: hwFloat) z : hwFloat; inline; -operator - (const z1, z2: hwFloat) z : hwFloat; inline; -operator - (const z1: hwFloat) z : hwFloat; inline; +operator + (const z1, z2: hwFloat) z : hwFloat; +operator - (const z1, z2: hwFloat) z : hwFloat; +operator - (const z1: hwFloat) z : hwFloat; -operator * (const z1, z2: hwFloat) z : hwFloat; inline; -operator * (const z1: hwFloat; const z2: LongInt) z : hwFloat; inline; -operator / (const z1: hwFloat; z2: hwFloat) z : hwFloat; inline; -operator / (const z1: hwFloat; const z2: LongInt) z : hwFloat; inline; +operator * (const z1, z2: hwFloat) z : hwFloat; +operator * (const z1: hwFloat; const z2: LongInt) z : hwFloat; +operator / (const z1: hwFloat; z2: hwFloat) z : hwFloat; +operator / (const z1: hwFloat; const z2: LongInt) z : hwFloat; -operator < (const z1, z2: hwFloat) b : boolean; inline; -operator > (const z1, z2: hwFloat) b : boolean; inline; +operator < (const z1, z2: hwFloat) b : boolean; +operator > (const z1, z2: hwFloat) b : boolean; // Various functions for hwFloat (some are inlined in the resulting code for better performance) function cstr(const z: hwFloat): shortstring; // Returns a shortstring representations of the hwFloat. -function hwRound(const t: hwFloat): LongInt; inline; // Does NOT really round but returns the integer representation of the hwFloat without fractional digits. (-_0_9 -> -0, _1_5 -> _1) -function hwAbs(const t: hwFloat): hwFloat; inline; // Returns the value of t with positive sign. -function hwSqr(const t: hwFloat): hwFloat; inline; // Returns the square value of parameter t. -function hwSqrt1(const t: hwFloat): hwFloat; inline; // Returns the the positive square root of parameter t. -function hwSqrt(const x: hwFloat): hwFloat; inline; // Returns the the positive square root of parameter t. +function hwRound(const t: hwFloat): LongInt; // Does NOT really round but returns the integer representation of the hwFloat without fractional digits. (-_0_9 -> -0, _1_5 -> _1) +function hwAbs(const t: hwFloat): hwFloat; // Returns the value of t with positive sign. +function hwSqr(const t: hwFloat): hwFloat; // Returns the square value of parameter t. +function hwSqrt1(const t: hwFloat): hwFloat; // Returns the the positive square root of parameter t. +function hwSqrt(const x: hwFloat): hwFloat; // Returns the the positive square root of parameter t. function Distance(const dx, dy: hwFloat): hwFloat; // Returns the distance between two points in 2-dimensional space, of which the parameters are the horizontal and vertical distance. function DistanceI(const dx, dy: LongInt): hwFloat; // Same as above for integer parameters. function AngleSin(const Angle: Longword): hwFloat; function AngleCos(const Angle: Longword): hwFloat; function vector2Angle(const x, y: hwFloat): LongInt; -function SignAs(const num, signum: hwFloat): hwFloat; inline; // Returns an hwFloat with the value of parameter num and the sign of signum. -function hwSign(r: hwFloat): LongInt; inline; // Returns an integer with value 1 and sign of parameter r. -function hwSignf(r: real): LongInt; inline; // Returns an integer with value 1 and sign of parameter r. -function isZero(const z: hwFloat): boolean; inline; +function SignAs(const num, signum: hwFloat): hwFloat; // Returns an hwFloat with the value of parameter num and the sign of signum. +function hwSign(r: hwFloat): LongInt; // Returns an integer with value 1 and sign of parameter r. +function hwSignf(r: real): LongInt; // Returns an integer with value 1 and sign of parameter r. +function isZero(const z: hwFloat): boolean; {$WARNINGS OFF} // some hwFloat constants @@ -195,33 +195,33 @@ uses uSinTable; -function int2hwFloat (const i: LongInt) : hwFloat; inline; +function int2hwFloat (const i: LongInt) : hwFloat; begin int2hwFloat.isNegative:= i < 0; int2hwFloat.Round:= abs(i); int2hwFloat.Frac:= 0 end; -function hwFloat2Float (const i: hwFloat) : extended; inline; +function hwFloat2Float (const i: hwFloat) : extended; begin hwFloat2Float:= i.Frac / $100000000 + i.Round; if i.isNegative then hwFloat2Float:= -hwFloat2Float; end; -operator = (const z1, z2: hwFloat) z : boolean; inline; +operator = (const z1, z2: hwFloat) z : boolean; begin z:= (z1.isNegative = z2.isNegative) and (z1.QWordValue = z2.QWordValue); end; {$IFDEF PAS2C} -operator <> (const z1, z2: hwFloat) z : boolean; inline; +operator <> (const z1, z2: hwFloat) z : boolean; begin z:= (z1.isNegative <> z2.isNegative) or (z1.QWordValue <> z2.QWordValue); end; {$ENDIF} -operator + (const z1, z2: hwFloat) z : hwFloat; inline; +operator + (const z1, z2: hwFloat) z : hwFloat; begin if z1.isNegative = z2.isNegative then begin @@ -241,7 +241,7 @@ end end; -operator - (const z1, z2: hwFloat) z : hwFloat; inline; +operator - (const z1, z2: hwFloat) z : hwFloat; begin if z1.isNegative = z2.isNegative then if z1.QWordValue > z2.QWordValue then @@ -261,12 +261,12 @@ end end; -function isZero(const z: hwFloat): boolean; inline; +function isZero(const z: hwFloat): boolean; begin isZero := z.QWordValue = 0; end; -operator < (const z1, z2: hwFloat) b : boolean; inline; +operator < (const z1, z2: hwFloat) b : boolean; begin if z1.isNegative xor z2.isNegative then b:= z1.isNegative @@ -277,7 +277,7 @@ b:= (z2.QWordValue < z1.QWordValue) = z1.isNegative end; -operator > (const z1, z2: hwFloat) b : boolean; inline; +operator > (const z1, z2: hwFloat) b : boolean; begin if z1.isNegative xor z2.isNegative then b:= z2.isNegative @@ -288,14 +288,14 @@ b:= (z1.QWordValue > z2.QWordValue) <> z2.isNegative end; -operator - (const z1: hwFloat) z : hwFloat; inline; +operator - (const z1: hwFloat) z : hwFloat; begin z:= z1; z.isNegative:= not z.isNegative end; -operator * (const z1, z2: hwFloat) z : hwFloat; inline; +operator * (const z1, z2: hwFloat) z : hwFloat; begin z.isNegative:= z1.isNegative xor z2.isNegative; @@ -310,13 +310,13 @@ end end; -operator * (const z1: hwFloat; const z2: LongInt) z : hwFloat; inline; +operator * (const z1: hwFloat; const z2: LongInt) z : hwFloat; begin z.isNegative:= z1.isNegative xor (z2 < 0); z.QWordValue:= z1.QWordValue * abs(z2) end; -operator / (const z1: hwFloat; z2: hwFloat) z : hwFloat; inline; +operator / (const z1: hwFloat; z2: hwFloat) z : hwFloat; var t: QWord; begin z.isNegative:= z1.isNegative xor z2.isNegative; @@ -337,7 +337,7 @@ end end; -operator / (const z1: hwFloat; const z2: LongInt) z : hwFloat; inline; +operator / (const z1: hwFloat; const z2: LongInt) z : hwFloat; begin z.isNegative:= z1.isNegative xor (z2 < 0); z.QWordValue:= z1.QWordValue div abs(z2) @@ -371,7 +371,7 @@ hwAbs.isNegative:= false end; -function hwSqr(const t: hwFloat): hwFloat; inline; +function hwSqr(const t: hwFloat): hwFloat; begin hwSqr.isNegative:= false; hwSqr.QWordValue:= ((QWord(t.Round) * t.Round) shl 32) + QWord(t.Round) * t.Frac * 2 + ((QWord(t.Frac) * t.Frac) shr 32); diff -r 73cdc306888f -r 128ace913837 hedgewars/uGearsHandlers.pas --- a/hedgewars/uGearsHandlers.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uGearsHandlers.pas Mon Jan 02 15:59:26 2023 +0100 @@ -36,13 +36,13 @@ (x: 0; y: 1), (x: -1; y: 0)); -procedure PrevAngle(Gear: PGear; dA: LongInt); inline; +procedure PrevAngle(Gear: PGear; dA: LongInt); begin inc(Gear^.WDTimer); Gear^.Angle := (LongInt(Gear^.Angle) - dA) and 3 end; -procedure NextAngle(Gear: PGear; dA: LongInt); inline; +procedure NextAngle(Gear: PGear; dA: LongInt); begin inc(Gear^.WDTimer); Gear^.Angle := (LongInt(Gear^.Angle) + dA) and 3 diff -r 73cdc306888f -r 128ace913837 hedgewars/uGearsHandlersMess.pas --- a/hedgewars/uGearsHandlersMess.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uGearsHandlersMess.pas Mon Jan 02 15:59:26 2023 +0100 @@ -152,7 +152,7 @@ uses uConsts, uVariables, uVisualGearsList, uRandom, uCollisions, uGearsList, uUtils, uSound , SDLh, uScript, uGearsHedgehog, uGearsUtils, uIO, uCaptions, uLandGraphics , uGearsHandlers, uTextures, uRenderUtils, uAmmos, uTeams, uLandTexture - , uStore, uAI, uStats, uLocale; + , uStore, uAI, uStats, uLocale, uLandUtils; procedure doStepPerPixel(Gear: PGear; step: TGearStepProcedure; onlyCheckIfChanged: boolean); var @@ -527,7 +527,7 @@ end else if (collV < 0) and (collH < 0) and tdX.isNegative and tdY.isNegative then Gear^.dX.isNegative := false; - + isFalling := false; Gear^.AdvBounce := 10; end; @@ -883,45 +883,45 @@ else if (cGravity.isNegative) and (yy < LAND_HEIGHT-1200) then move:=true // Solid pixel encountered - else if ((yy and LAND_HEIGHT_MASK) = 0) and ((xx and LAND_WIDTH_MASK) = 0) and (Land[yy, xx] <> 0) then - begin - lf:= Land[yy, xx] and (lfObject or lfBasic or lfIndestructible); + else if ((yy and LAND_HEIGHT_MASK) = 0) and ((xx and LAND_WIDTH_MASK) = 0) and (LandGet(yy, xx) <> 0) then + begin + lf:= LandGet(yy, xx) and (lfObject or lfBasic or lfIndestructible); if lf = 0 then lf:= lfObject; // If there's room below keep falling - if (((yy-1) and LAND_HEIGHT_MASK) = 0) and (Land[yy-1, xx] = 0) then + if (((yy-1) and LAND_HEIGHT_MASK) = 0) and (LandGet(yy-1, xx) = 0) then begin X:= X - cWindSpeed * 1600 - dX; end // If there's room below, on the sides, fill the gaps - else if (((yy-1) and LAND_HEIGHT_MASK) = 0) then + else if (((yy-1) and LAND_HEIGHT_MASK) = 0) then begin - if (((xx - 1) and LAND_WIDTH_MASK) = 0) and (Land[yy - 1, (xx - 1)] = 0) then + if (((xx - 1) and LAND_WIDTH_MASK) = 0) and (LandGet(yy - 1, (xx - 1)) = 0) then begin X:= X - _0_8; Y:= oldY; end - else if (((xx - 2) and LAND_WIDTH_MASK) = 0) and (Land[yy - 1, (xx - 2)] = 0) then + else if (((xx - 2) and LAND_WIDTH_MASK) = 0) and (LandGet(yy - 1, (xx - 2)) = 0) then begin X:= X - _1_6; Y:= oldY; end - else if (((xx + 1) and LAND_WIDTH_MASK) = 0) and (Land[yy - 1, (xx + 1)] = 0) then + else if (((xx + 1) and LAND_WIDTH_MASK) = 0) and (LandGet(yy - 1, (xx + 1)) = 0) then begin X:= X + _0_8; Y:= oldY; end - else if (((xx + 2) and LAND_WIDTH_MASK) = 0) and (Land[yy - 1, (xx + 2)] = 0) then + else if (((xx + 2) and LAND_WIDTH_MASK) = 0) and (LandGet(yy - 1, (xx + 2)) = 0) then begin X:= X + _1_6; Y:= oldY; end else - if ((((yy+1) and LAND_HEIGHT_MASK) = 0) and ((Land[yy + 1, xx] and $FF) <> 0)) then - move:=true - else + if ((((yy+1) and LAND_HEIGHT_MASK) = 0) and ((LandGet(yy + 1, xx) and $FF) <> 0)) then + move:=true + else draw:= true end // if there's an hog/object below do nothing - else if ((((yy+1) and LAND_HEIGHT_MASK) = 0) and ((Land[yy+1, xx] and $FF) <> 0)) + else if ((((yy+1) and LAND_HEIGHT_MASK) = 0) and ((LandGet(yy+1, xx) and $FF) <> 0)) then move:=true else draw:= true end @@ -948,7 +948,7 @@ for px:= 0 to Pred(s^.w) do begin lx:=xx + px; ly:=yy + py; - if (ly and LAND_HEIGHT_MASK = 0) and (lx and LAND_WIDTH_MASK = 0) and (Land[ly, lx] and $FF = 0) then + if (ly and LAND_HEIGHT_MASK = 0) and (lx and LAND_WIDTH_MASK = 0) and (LandGet(ly, lx) and $FF = 0) then begin rx:= lx; ry:= ly; @@ -956,19 +956,19 @@ begin rx:= rx div 2;ry:= ry div 2; end; - if Land[yy + py, xx + px] <= lfAllObjMask then + if LandGet(yy + py, xx + px) <= lfAllObjMask then if gun then begin LandDirty[yy div 32, xx div 32]:= 1; if LandPixels[ry, rx] = 0 then - Land[ly, lx]:= lfDamaged or lfObject - else Land[ly, lx]:= lfDamaged or lfBasic + LandSet(ly, lx, lfDamaged or lfObject) + else LandSet(ly, lx, lfDamaged or lfBasic) end - else Land[ly, lx]:= lf; + else LandSet(ly, lx, lf); if gun then - LandPixels[ry, rx]:= (Gear^.Tint shr 24 shl RShift) or - (Gear^.Tint shr 16 and $FF shl GShift) or - (Gear^.Tint shr 8 and $FF shl BShift) or + LandPixels[ry, rx]:= (Gear^.Tint shr 24 shl RShift) or + (Gear^.Tint shr 16 and $FF shl GShift) or + (Gear^.Tint shr 8 and $FF shl BShift) or (p^[px] and AMask) else LandPixels[ry, rx]:= addBgColor(LandPixels[ry, rx], p^[px]); end @@ -1519,7 +1519,7 @@ if ((y and LAND_HEIGHT_MASK) = 0) and ((x and LAND_WIDTH_MASK) = 0) then begin - LandFlags:= Land[y, x]; + LandFlags:= LandGet(y, x); if LandFlags <> 0 then inc(Gear^.Damage); isDigging:= (LandFlags and lfLandMask) <> 0; end; @@ -1761,7 +1761,7 @@ if (Gear^.Timer mod 47) = 0 then begin // ok. this was an attempt to turn off dust if not actually drilling land. I have no idea why it isn't working as expected - if (( (y + 12) and LAND_HEIGHT_MASK) = 0) and ((x and LAND_WIDTH_MASK) = 0) and (Land[y + 12, x] > 255) then + if (( (y + 12) and LAND_HEIGHT_MASK) = 0) and ((x and LAND_WIDTH_MASK) = 0) and (LandGet(y + 12, x) > 255) then for i:= 0 to 1 do AddVisualGear(x - 5 + Random(10), y + 12, vgtDust); @@ -2193,7 +2193,7 @@ // If in ready timer, or after turn, or in first 5 seconds of turn (really a window due to extra time utility) // or hunting is disabled due to seek radius of 0 then we aren't hunting - if (ReadyTimeLeft > 0) or (TurnTimeLeft = 0) or + if (ReadyTimeLeft > 0) or (TurnTimeLeft = 0) or ((TurnTimeLeft < cHedgehogTurnTime) and (cHedgehogTurnTime-TurnTimeLeft < 5000)) or (Gear^.Angle = 0) then gear^.State:= gear^.State and (not gstChooseTarget) @@ -3451,7 +3451,7 @@ begin DeleteGear(Gear); exit - end; + end; valid:= false; @@ -4245,8 +4245,8 @@ dec(playWidth, 2); for i:= 0 to LAND_HEIGHT - 1 do begin - Land[i, leftX] := 0; - Land[i, rightX] := 0; + LandSet(i, leftX, 0); + LandSet(i, rightX, 0); end; end; @@ -4254,7 +4254,7 @@ begin dec(cWaterLine); for i:= 0 to LAND_WIDTH - 1 do - Land[cWaterLine, i] := 0; + LandSet(cWaterLine, i, 0); SetAllToActive end; @@ -5038,8 +5038,8 @@ doPortalColorSwitch(); // destroy portal if ground it was attached too is gone - if (Land[hwRound(Gear^.Y), hwRound(Gear^.X)] <= lfAllObjMask) - or (Land[hwRound(Gear^.Y), hwRound(Gear^.X)] and lfBouncy <> 0) + if (LandGet(hwRound(Gear^.Y), hwRound(Gear^.X)) <= lfAllObjMask) + or (LandGet(hwRound(Gear^.Y), hwRound(Gear^.X)) and lfBouncy <> 0) or (Gear^.Timer < 1) or (Gear^.Hedgehog^.Team <> CurrentHedgehog^.Team) or CheckCoordInWater(hwRound(Gear^.X), hwRound(Gear^.Y)) then @@ -5406,12 +5406,12 @@ ty := 0; // avoid compiler hints - if ((y and LAND_HEIGHT_MASK) = 0) and ((x and LAND_WIDTH_MASK) = 0) and (Land[y, x] > 255) then + if ((y and LAND_HEIGHT_MASK) = 0) and ((x and LAND_WIDTH_MASK) = 0) and (LandGet(y, x) > 255) then begin Gear^.State := Gear^.State or gstCollision; Gear^.State := Gear^.State and (not gstMoving); - if (Land[y, x] and lfBouncy <> 0) + if (LandGet(y, x) and lfBouncy <> 0) or (not CalcSlopeTangent(Gear, x, y, tx, ty, 255)) or (DistanceI(tx,ty) < _12) then // reject shots at too irregular terrain begin @@ -5772,9 +5772,9 @@ if (not CheckCoordInWater(rX, rY)) or (not CheckCoordInWater(x, y)) then begin if ((y and LAND_HEIGHT_MASK) = 0) and ((x and LAND_WIDTH_MASK) = 0) - and (Land[y, x] <> 0) then + and (LandGet(y, x) <> 0) then begin - if ((GameFlags and gfSolidLand) <> 0) and (Land[y, x] > 255) then + if ((GameFlags and gfSolidLand) <> 0) and (LandGet(y, x) > 255) then Gear^.Damage := initHealth else if justCollided then begin @@ -6652,7 +6652,7 @@ ndY:= -AngleCos(HHGear^.Angle) * _4; if (ndX <> dX) or (ndY <> dY) or (Gear^.Message and (gmUp or gmDown) <> 0) or (((Target.X <> NoPointX) and (Target.X and LAND_WIDTH_MASK = 0) and - (Target.Y and LAND_HEIGHT_MASK = 0) and ((Land[Target.Y, Target.X] = 0)) and + (Target.Y and LAND_HEIGHT_MASK = 0) and ((LandGet(Target.Y, Target.X) = 0)) and (not CheckCoordInWater(Target.X, Target.Y))) and (CheckGearNear(gtAirMine, int2hwFloat(Target.X),int2hwFloat(Target.Y), Gear^.Radius*3, Gear^.Radius*3) = nil) and (not ((WorldEdge = weBounce) and ((Target.X > rightX) or (Target.X < leftX))))) then begin @@ -6686,7 +6686,7 @@ else if CheckCoordInWater(Target.X, Target.Y) or ((Target.X and LAND_WIDTH_MASK = 0) and (Target.Y and LAND_HEIGHT_MASK = 0) and - (Land[Target.Y, Target.X] = lfIce) and + (LandGet(Target.Y, Target.X) = lfIce) and ((Target.Y+iceHeight+5 > cWaterLine) or ((WorldEdge = weSea) and ((Target.X+iceHeight+5 > rightX) or @@ -6768,13 +6768,13 @@ begin iter^.Damage:= 0; iter^.State:= iter^.State or gstFrozen; - if (hwRound(iter^.X) < RightX-16) and (hwRound(iter^.X) > LeftX+16) and + if (hwRound(iter^.X) < RightX-16) and (hwRound(iter^.X) > LeftX+16) and (hwRound(iter^.Y) > topY+16) and (hwRound(iter^.Y) < LAND_HEIGHT-16) then begin AddCI(iter); iter^.X:= int2hwFloat(min(RightX-16,max(hwRound(iter^.X), LeftX+16))); iter^.Y:= int2hwFloat(min(LAND_HEIGHT-16,max(hwRound(iter^.Y),TopY+16))); - ForcePlaceOnLand(hwRound(iter^.X)-16, hwRound(iter^.Y)-16, sprFrozenAirMine, 0, lfIce, $FFFFFFFF, false, false, false); + ForcePlaceOnLand(hwRound(iter^.X)-16, hwRound(iter^.Y)-16, sprFrozenAirMine, 0, lfIce, $FFFFFFFF, false, false, false); iter^.State:= iter^.State or gstInvisible end else @@ -6834,7 +6834,7 @@ end else if (t > 400) and (CheckCoordInWater(gX, gY) or (((gX and LAND_WIDTH_MASK = 0) and (gY and LAND_HEIGHT_MASK = 0)) - and (Land[gY, gX] <> 0))) then + and (LandGet(gY, gX) <> 0))) then begin Target.X:= gX; Target.Y:= gY; @@ -6857,7 +6857,7 @@ Target.Y:= gY; X:= HHGear^.X; Y:= HHGear^.Y - end + end end; end end; @@ -6965,7 +6965,7 @@ tX:=Gear^.X-targ^.X; tY:=Gear^.Y-targ^.Y; // allow escaping - should maybe flag this too - if (GameTicks > Gear^.FlightTime+10000) or + if (GameTicks > Gear^.FlightTime+10000) or ((tX.Round+tY.Round > Gear^.Angle*6) and (hwRound(hwSqr(tX) + hwSqr(tY)) > sqr(Gear^.Angle*6))) then targ:= nil @@ -6974,7 +6974,7 @@ // If in ready timer, or after turn, or in first 5 seconds of turn (really a window due to extra time utility) // or mine is inactive due to lack of gsttmpflag or hunting is disabled due to seek radius of 0 // then we aren't hunting - if (ReadyTimeLeft > 0) or (TurnTimeLeft = 0) or + if (ReadyTimeLeft > 0) or (TurnTimeLeft = 0) or ((TurnTimeLeft < cHedgehogTurnTime) and (cHedgehogTurnTime-TurnTimeLeft < 5000)) or (Gear^.State and gsttmpFlag = 0) or (Gear^.Angle = 0) then @@ -7238,7 +7238,7 @@ MakeSentryStep := true end end; - + function MakeSentryJump(Sentry: PGear; maxXStep, maxYStep: LongInt): Boolean; var x, y, offsetX, offsetY, direction: LongInt; jumpTime: hwFloat; @@ -7291,7 +7291,7 @@ for i := 0 to count - 1 do begin - if (Land[hwRound(fromY), hwRound(fromX)] and mask) <> 0 then + if (LandGet(hwRound(fromY), hwRound(fromX)) and mask) <> 0 then Inc(TraceAttackPath); fromX := fromX + distX; fromY := fromY + distY; diff -r 73cdc306888f -r 128ace913837 hedgewars/uGearsHandlersRope.pas --- a/hedgewars/uGearsHandlersRope.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uGearsHandlersRope.pas Mon Jan 02 15:59:26 2023 +0100 @@ -26,7 +26,7 @@ implementation uses uConsts, uFloat, uCollisions, uVariables, uGearsList, uSound, uGearsUtils, - uAmmos, uDebug, uUtils, uGearsHedgehog, uGearsRender; + uAmmos, uDebug, uUtils, uGearsHedgehog, uGearsRender, uLandUtils; const IsNilHHFatal = false; @@ -241,7 +241,7 @@ begin lx := hwRound(nx); ly := hwRound(ny); - if ((ly and LAND_HEIGHT_MASK) = 0) and ((lx and LAND_WIDTH_MASK) = 0) and (Land[ly, lx] > lfAllObjMask) then + if ((ly and LAND_HEIGHT_MASK) = 0) and ((lx and LAND_WIDTH_MASK) = 0) and (LandGet(ly, lx) > lfAllObjMask) then begin tx := _1 / Distance(ropeDx, ropeDy); // old rope pos @@ -358,7 +358,7 @@ HHGear^.dY := HHGear^.dY * len; end; - haveCollision:= ((hwRound(Gear^.Y) and LAND_HEIGHT_MASK) = 0) and ((hwRound(Gear^.X) and LAND_WIDTH_MASK) = 0) and ((Land[hwRound(Gear^.Y), hwRound(Gear^.X)]) <> 0); + haveCollision:= ((hwRound(Gear^.Y) and LAND_HEIGHT_MASK) = 0) and ((hwRound(Gear^.X) and LAND_WIDTH_MASK) = 0) and ((LandGet(hwRound(Gear^.Y), hwRound(Gear^.X))) <> 0); if not haveCollision then begin @@ -474,7 +474,7 @@ ty := _0; while tt > _20 do begin - if ((hwRound(Gear^.Y+ty) and LAND_HEIGHT_MASK) = 0) and ((hwRound(Gear^.X+tx) and LAND_WIDTH_MASK) = 0) and (Land[hwRound(Gear^.Y+ty), hwRound(Gear^.X+tx)] > lfAllObjMask) then + if ((hwRound(Gear^.Y+ty) and LAND_HEIGHT_MASK) = 0) and ((hwRound(Gear^.X+tx) and LAND_WIDTH_MASK) = 0) and (LandGet(hwRound(Gear^.Y+ty), hwRound(Gear^.X+tx)) > lfAllObjMask) then begin Gear^.X := Gear^.X + tx; Gear^.Y := Gear^.Y + ty; diff -r 73cdc306888f -r 128ace913837 hedgewars/uGearsHedgehog.pas --- a/hedgewars/uGearsHedgehog.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uGearsHedgehog.pas Mon Jan 02 15:59:26 2023 +0100 @@ -29,7 +29,7 @@ procedure HedgehogChAngle(HHGear: PGear); procedure PickUp(HH, Gear: PGear); procedure AddPickup(HH: THedgehog; ammo: TAmmoType; cnt, X, Y: LongWord); -procedure CheckIce(Gear: PGear); inline; +procedure CheckIce(Gear: PGear); procedure PlayTaunt(taunt: Longword); function HHGetTimer(Gear: PGear): LongWord; function HHGetTimerMsg(Gear: PGear): LongWord; @@ -1529,7 +1529,7 @@ AllInactive:= false end; -procedure CheckIce(Gear: PGear); inline; +procedure CheckIce(Gear: PGear); (* var x,y,tx,ty: LongInt; tdX, tdY, slope: hwFloat; diff -r 73cdc306888f -r 128ace913837 hedgewars/uGearsRender.pas --- a/hedgewars/uGearsRender.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uGearsRender.pas Mon Jan 02 15:59:26 2023 +0100 @@ -56,7 +56,7 @@ end; implementation -uses uRender, uRenderUtils, uGearsUtils, uUtils, uVariables, uAmmos, Math, uVisualGearsList; +uses uRender, uRenderUtils, uGearsUtils, uUtils, uVariables, uAmmos, Math, uVisualGearsList, uLandUtils; procedure DrawRopeLinesRQ(Gear: PGear); var n: LongInt; @@ -72,7 +72,7 @@ if (RopePoints.Count > 0) or (Gear^.Elasticity.QWordValue > 0) then begin EnableTexture(false); - + Tint(Gear^.Tint shr 24 div 3, Gear^.Tint shr 16 and $FF div 3, Gear^.Tint shr 8 and $FF div 3, Gear^.Tint and $FF); n:= RopePoints.Count + 2; @@ -541,7 +541,7 @@ hy:= ty; wraps:= 0; inWorldBounds := ((ty and LAND_HEIGHT_MASK) or (tx and LAND_WIDTH_MASK)) = 0; - while (inWorldBounds and ((Land[ty, tx] and lfAll) = 0)) or (not inWorldBounds) do + while (inWorldBounds and ((LandGet(ty, tx) and lfAll) = 0)) or (not inWorldBounds) do begin if wraps > cMaxLaserSightWraps then break; @@ -1049,7 +1049,7 @@ ty:= hwRound(Gear^.Y) + cHHRadius + 2; if ((tx and LAND_WIDTH_MASK) = 0) and ((ty and LAND_HEIGHT_MASK) = 0) and - (Land[ty, tx] <> 0) then + (LandGet(ty, tx) <> 0) then AddVisualGear(tx - 2 + Random(4), ty - 8, vgtDust); end; @@ -1417,7 +1417,7 @@ DrawSpriteRotated(sprMineOn, x, y, 0, Gear^.DirAngle) else DrawSpriteRotated(sprMineDead, x, y, 0, Gear^.DirAngle); end; - gtAirMine: + gtAirMine: // render air mine based on its state: // frozen if (Gear^.State and gstFrozen <> 0) then diff -r 73cdc306888f -r 128ace913837 hedgewars/uGearsUtils.pas --- a/hedgewars/uGearsUtils.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uGearsUtils.pas Mon Jan 02 15:59:26 2023 +0100 @@ -22,7 +22,7 @@ interface uses uTypes, uFloat; -procedure doMakeExplosion(X, Y, Radius: LongInt; AttackingHog: PHedgehog; Mask: Longword); inline; +procedure doMakeExplosion(X, Y, Radius: LongInt; AttackingHog: PHedgehog; Mask: Longword); procedure doMakeExplosion(X, Y, Radius: LongInt; AttackingHog: PHedgehog; Mask: Longword; const Tint: LongWord); procedure AddSplashForGear(Gear: PGear; justSkipping: boolean); procedure AddBounceEffectForGear(Gear: PGear; imageScale: Single); @@ -39,7 +39,7 @@ procedure CalcRotationDirAngle(Gear: PGear); procedure ResurrectHedgehog(var gear: PGear); -procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt); inline; +procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt); procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt; skipProximity: boolean); procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt; skipProximity, deleteOnFail: boolean); function CountLand(x, y, r, c: LongInt; mask, antimask: LongWord): LongInt; @@ -47,8 +47,8 @@ function CheckGearNear(Kind: TGearType; X, Y: hwFloat; rX, rY: LongInt): PGear; function CheckGearNear(Gear: PGear; Kind: TGearType; rX, rY: LongInt): PGear; function CheckGearDrowning(var Gear: PGear): boolean; -procedure CheckCollision(Gear: PGear); inline; -procedure CheckCollisionWithLand(Gear: PGear); inline; +procedure CheckCollision(Gear: PGear); +procedure CheckCollisionWithLand(Gear: PGear); procedure AmmoShove(Ammo: PGear; Damage, Power: LongInt); procedure AmmoShoveCache(Ammo: PGear; Damage, Power: LongInt); @@ -62,7 +62,7 @@ procedure SetAllToActive; procedure SetAllHHToActive(Ice: boolean); -procedure SetAllHHToActive(); inline; +procedure SetAllHHToActive(); function GetAmmo(Hedgehog: PHedgehog): TAmmoType; function GetUtility(Hedgehog: PHedgehog): TAmmoType; @@ -83,9 +83,9 @@ uVariables, uLandGraphics, uScript, uStats, uCaptions, uTeams, uStore, uLocale, uTextures, uRenderUtils, uRandom, SDLh, uDebug, uGearsList, Math, uVisualGearsList, uGearsHandlersMess, - uGearsHedgehog; + uGearsHedgehog, uLandUtils; -procedure doMakeExplosion(X, Y, Radius: LongInt; AttackingHog: PHedgehog; Mask: Longword); inline; +procedure doMakeExplosion(X, Y, Radius: LongInt; AttackingHog: PHedgehog; Mask: Longword); begin doMakeExplosion(X, Y, Radius, AttackingHog, Mask, $FFFFFFFF); end; @@ -872,7 +872,7 @@ begin if (y and LAND_HEIGHT_MASK) = 0 then for i:= max(x - r, 0) to min(x + r, LAND_WIDTH - 1) do - if (Land[y, i] and mask <> 0) and (Land[y, i] and antimask = 0) then + if (LandGet(y, i) and mask <> 0) and (LandGet(y, i) and antimask = 0) then begin inc(count); if count = c then @@ -894,8 +894,8 @@ begin for i:= r - c + 2 to r do begin - if (Land[y, x - i] and mask <> 0) then inc(cnt); - if (Land[y, x + i] and mask <> 0) then inc(cnt); + if (LandGet(y, x - i) and mask <> 0) then inc(cnt); + if (LandGet(y, x + i) and mask <> 0) then inc(cnt); if cnt >= c then begin @@ -924,12 +924,12 @@ NoGearsToAvoid:= true end; -procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt); inline; +procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt); begin FindPlace(Gear, withFall, Left, Right, false, true); end; -procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt; skipProximity: boolean); inline; +procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt; skipProximity: boolean); begin FindPlace(Gear, withFall, Left, Right, skipProximity, true); end; @@ -959,7 +959,7 @@ repeat if GetRandom(2) = 0 then dir:= -1 else dir:= 1; x:= max(LAND_WIDTH div 2048, LongInt(GetRandom(Delta))); - if dir = 1 then x:= Left + x else x:= Right - x; + if dir = 1 then x:= Left + x else x:= Right - x; repeat cnt:= 0; y:= min(1024, topY) - Gear^.Radius shl 1; @@ -976,9 +976,9 @@ repeat inc(y); until (y >= cWaterLine) or - (ignoreOverlap and + (ignoreOverlap and (CountLand(x, y, Gear^.Radius - 1, 1, lfAll, 0) <> 0)) or - (not ignoreOverlap and + (not ignoreOverlap and (CountLand(x, y, Gear^.Radius - 1, 1, lfLandMask, 0) <> 0)); if (y - sy > Gear^.Radius * 2) and (y < cWaterLine) @@ -1166,7 +1166,7 @@ CheckGearNear := CheckGearNearImpl(Kind, Gear^.X, Gear^.Y, rX, rY, Gear); end; -procedure CheckCollision(Gear: PGear); inline; +procedure CheckCollision(Gear: PGear); begin if (TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0) or (TestCollisionYwithGear(Gear, hwSign(Gear^.dY)) <> 0) then @@ -1175,7 +1175,7 @@ Gear^.State := Gear^.State and (not gstCollision) end; -procedure CheckCollisionWithLand(Gear: PGear); inline; +procedure CheckCollisionWithLand(Gear: PGear); begin if (TestCollisionX(Gear, hwSign(Gear^.dX)) <> 0) or (TestCollisionY(Gear, hwSign(Gear^.dY)) <> 0) then @@ -1407,8 +1407,8 @@ gtFirePunch, gtKamikaze, gtWhip, gtShover]) and (((Ammo^.Data <> nil) and (PGear(Ammo^.Data) = Gear)) or (not UpdateHitOrder( - Gear, - Ammo^.WDTimer, + Gear, + Ammo^.WDTimer, (Ammo^.Kind = gtMinigunBullet) and (Ammo^.Pos <> 0)))) then continue; @@ -1496,10 +1496,10 @@ else if ((Ammo^.Kind <> gtFlame) or (Gear^.Kind = gtHedgehog)) and (Power <> 0) then begin if (Ammo^.Kind in [gtMinigunBullet]) then - begin + begin Gear^.dX:= Gear^.dX + Ammo^.dX * Power * _0_01; Gear^.dY:= Gear^.dY + Ammo^.dY * Power * _0_01 - end + end else begin Gear^.dX:= Ammo^.dX * Power * _0_01; @@ -1585,7 +1585,7 @@ end end; -procedure SetAllHHToActive; inline; +procedure SetAllHHToActive; begin SetAllHHToActive(true) end; diff -r 73cdc306888f -r 128ace913837 hedgewars/uInputHandler.pas --- a/hedgewars/uInputHandler.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uInputHandler.pas Mon Jan 02 15:59:26 2023 +0100 @@ -25,7 +25,7 @@ procedure initModule; procedure freeModule; -function KeyNameToCode(name: shortstring): LongInt; inline; +function KeyNameToCode(name: shortstring): LongInt; function KeyNameToCode(name: shortstring; Modifier: shortstring): LongInt; function KeyBindToCode(bind: shortstring): LongInt; @@ -36,7 +36,7 @@ procedure ProcessMouseMotion(xrel, yrel: LongInt); //procedure ProcessMouseWheel(x, y: LongInt); procedure ProcessMouseWheel(y: LongInt); -procedure ProcessKey(event: TSDL_KeyboardEvent); inline; +procedure ProcessKey(event: TSDL_KeyboardEvent); procedure ProcessKey(code: LongInt; KeyDown: boolean); {$IFDEF USE_AM_NUMCOLUMN} @@ -84,7 +84,7 @@ //ControllerHats: array[0..5] of array[0..19] of Byte; //ControllerButtons: array[0..5] of array[0..19] of Byte; -function KeyNameToCode(name: shortstring): LongInt; inline; +function KeyNameToCode(name: shortstring): LongInt; begin KeyNameToCode:= KeyNameToCode(name, ''); end; @@ -294,7 +294,7 @@ end end; -procedure ProcessKey(event: TSDL_KeyboardEvent); inline; +procedure ProcessKey(event: TSDL_KeyboardEvent); var code: LongInt; begin // TODO diff -r 73cdc306888f -r 128ace913837 hedgewars/uLand.pas --- a/hedgewars/uLand.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uLand.pas Mon Jan 02 15:59:26 2023 +0100 @@ -38,7 +38,6 @@ var digest: shortstring; maskOnly: boolean; - procedure PrettifyLandAlpha(); begin if (cReducedQuality and rqBlurryLand) <> 0 then @@ -64,18 +63,18 @@ begin yd:= LAND_HEIGHT - 1; repeat - while (yd > 0) and ((Land[yd, x] and targetMask) = 0) do dec(yd); + while (yd > 0) and ((LandGet(yd, x) and targetMask) = 0) do dec(yd); if (yd < 0) then yd:= 0; - while (yd < LAND_HEIGHT) and ((Land[yd, x] and targetMask) <> 0) do + while (yd < LAND_HEIGHT) and ((LandGet(yd, x) and targetMask) <> 0) do inc(yd); dec(yd); yu:= yd; - while (yu > 0 ) and ((Land[yu, x] and targetMask) <> 0) do dec(yu); - while (yu < yd ) and ((Land[yu, x] and targetMask) = 0) do inc(yu); + while (yu > 0 ) and ((LandGet(yu, x) and targetMask) <> 0) do dec(yu); + while (yu < yd ) and ((LandGet(yu, x) and targetMask) = 0) do inc(yu); if (yd < LAND_HEIGHT - 1) and ((yd - yu) >= 16) then copyToXYFromRect(tmpsurf, Surface, x mod tmpsurf^.w, 16, 1, 16, x, yd - 15); @@ -100,7 +99,7 @@ for x:= 0 to LAND_WIDTH - 1 do for y:= 0 to LAND_HEIGHT - 1 do - if Land[y, x] = 0 then + if LandGet(y, x) = 0 then if s < y then begin for i:= max(s, y - 8) to y - 1 do @@ -134,7 +133,7 @@ for y:= 0 to LAND_HEIGHT - 1 do for x:= 0 to LAND_WIDTH - 1 do - if Land[y, x] = 0 then + if LandGet(y, x) = 0 then if s < x then begin for i:= max(s, x - 8) to x - 1 do @@ -405,7 +404,7 @@ for y:= 0 to LAND_HEIGHT - 1 do begin for x:= 0 to LAND_WIDTH - 1 do - if Land[y, x] <> 0 then + if LandGet(y, x) <> 0 then if (cReducedQuality and rqBlurryLand) = 0 then LandPixels[y, x]:= p^[x]// or AMask else @@ -439,38 +438,38 @@ for x:= LongWord(leftX+2) to LongWord(rightX-2) do for y:= LongWord(topY+2) to LAND_HEIGHT-3 do - if (Land[y, x] = 0) and - (((Land[y, x-1] = lfBasic) and ((Land[y+1,x] = lfBasic)) or (Land[y-1,x] = lfBasic)) or - ((Land[y, x+1] = lfBasic) and ((Land[y-1,x] = lfBasic) or (Land[y+1,x] = lfBasic)))) then + if (LandGet(y, x) = 0) and + (((LandGet(y, x-1) = lfBasic) and ((LandGet(y+1,x) = lfBasic)) or (LandGet(y-1,x) = lfBasic)) or + ((LandGet(y, x+1) = lfBasic) and ((LandGet(y-1,x) = lfBasic) or (LandGet(y+1,x) = lfBasic)))) then begin if (cReducedQuality and rqBlurryLand) = 0 then begin - if (Land[y, x-1] = lfBasic) and (LandPixels[y, x-1] and AMask <> 0) then + if (LandGet(y, x-1) = lfBasic) and (LandPixels[y, x-1] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y, x-1] - else if (Land[y, x+1] = lfBasic) and (LandPixels[y, x+1] and AMask <> 0) then + else if (LandGet(y, x+1) = lfBasic) and (LandPixels[y, x+1] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y, x+1] - else if (Land[y-1, x] = lfBasic) and (LandPixels[y-1, x] and AMask <> 0) then + else if (LandGet(y-1, x) = lfBasic) and (LandPixels[y-1, x] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y-1, x] - else if (Land[y+1, x] = lfBasic) and (LandPixels[y+1, x] and AMask <> 0) then + else if (LandGet(y+1, x) = lfBasic) and (LandPixels[y+1, x] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y+1, x]; if (((LandPixels[y,x] and AMask) shr AShift) > 10) then LandPixels[y,x]:= (LandPixels[y,x] and (not AMask)) or (128 shl AShift) end; - Land[y,x]:= lfObject + LandSet(y, x, lfObject) end - else if (Land[y, x] = 0) and - (((Land[y, x-1] = lfBasic) and (Land[y+1,x-1] = lfBasic) and (Land[y+2,x] = lfBasic)) or - ((Land[y, x-1] = lfBasic) and (Land[y-1,x-1] = lfBasic) and (Land[y-2,x] = lfBasic)) or - ((Land[y, x+1] = lfBasic) and (Land[y+1,x+1] = lfBasic) and (Land[y+2,x] = lfBasic)) or - ((Land[y, x+1] = lfBasic) and (Land[y-1,x+1] = lfBasic) and (Land[y-2,x] = lfBasic)) or - ((Land[y+1, x] = lfBasic) and (Land[y+1,x+1] = lfBasic) and (Land[y,x+2] = lfBasic)) or - ((Land[y-1, x] = lfBasic) and (Land[y-1,x+1] = lfBasic) and (Land[y,x+2] = lfBasic)) or - ((Land[y+1, x] = lfBasic) and (Land[y+1,x-1] = lfBasic) and (Land[y,x-2] = lfBasic)) or - ((Land[y-1, x] = lfBasic) and (Land[y-1,x-1] = lfBasic) and (Land[y,x-2] = lfBasic))) then + else if (LandGet(y, x) = 0) and + (((LandGet(y, x-1) = lfBasic) and (LandGet(y+1,x-1) = lfBasic) and (LandGet(y+2,x) = lfBasic)) or + ((LandGet(y, x-1) = lfBasic) and (LandGet(y-1,x-1) = lfBasic) and (LandGet(y-2,x) = lfBasic)) or + ((LandGet(y, x+1) = lfBasic) and (LandGet(y+1,x+1) = lfBasic) and (LandGet(y+2,x) = lfBasic)) or + ((LandGet(y, x+1) = lfBasic) and (LandGet(y-1,x+1) = lfBasic) and (LandGet(y-2,x) = lfBasic)) or + ((LandGet(y+1, x) = lfBasic) and (LandGet(y+1,x+1) = lfBasic) and (LandGet(y,x+2) = lfBasic)) or + ((LandGet(y-1, x) = lfBasic) and (LandGet(y-1,x+1) = lfBasic) and (LandGet(y,x+2) = lfBasic)) or + ((LandGet(y+1, x) = lfBasic) and (LandGet(y+1,x-1) = lfBasic) and (LandGet(y,x-2) = lfBasic)) or + ((LandGet(y-1, x) = lfBasic) and (LandGet(y-1,x-1) = lfBasic) and (LandGet(y,x-2) = lfBasic))) then begin @@ -478,22 +477,22 @@ begin - if (Land[y, x-1] = lfBasic) and (LandPixels[y,x-1] and AMask <> 0) then + if (LandGet(y, x-1) = lfBasic) and (LandPixels[y,x-1] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y, x-1] - else if (Land[y, x+1] = lfBasic) and (LandPixels[y,x+1] and AMask <> 0) then + else if (LandGet(y, x+1) = lfBasic) and (LandPixels[y,x+1] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y, x+1] - else if (Land[y+1, x] = lfBasic) and (LandPixels[y+1,x] and AMask <> 0) then + else if (LandGet(y+1, x) = lfBasic) and (LandPixels[y+1,x] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y+1, x] - else if (Land[y-1, x] = lfBasic) and (LandPixels[y-1,x] and AMask <> 0) then + else if (LandGet(y-1, x) = lfBasic) and (LandPixels[y-1,x] and AMask <> 0) then LandPixels[y, x]:= LandPixels[y-1, x]; if (((LandPixels[y,x] and AMask) shr AShift) > 10) then LandPixels[y,x]:= (LandPixels[y,x] and (not AMask)) or (64 shl AShift) end; - Land[y,x]:= lfObject + LandSet(y, x, lfObject) end; AddProgress(); @@ -527,8 +526,8 @@ begin if (y <= wbm) and ((x - w1) mod (bmWidth * 2) >= bmWidth) then continue; - Land[y,x]:= lfBasic; - Land[y,lastX-x]:= lfBasic; + LandSet(y, x, lfBasic); + LandSet(y, lastX - x, lfBasic); end; end; @@ -545,8 +544,8 @@ // align battlement on inner edge, because real outer edge could be offscreen if (y <= wbm) and ((LAND_WIDTH + x - bmref) mod (bmWidth * 2) >= bmWidth) then continue; - Land[y,x]:= lfBasic; - Land[y,lastX-x]:= lfBasic; + LandSet(y, x, lfBasic); + LandSet(y, lastX - x, lfBasic); end; end; end; @@ -691,7 +690,7 @@ for y:= 0 to Pred(tmpsurf^.h) do begin for x:= 0 to Pred(tmpsurf^.w) do - SetLand(Land[cpY + y, cpX + x], p^[x]); + SetLand(cpY + y, cpX + x, p^[x]); p:= PLongwordArray(@(p^[tmpsurf^.pitch div 4])); end; @@ -756,7 +755,7 @@ for x:= LongWord(leftX) to LongWord(rightX) do begin y:= Longword(cWaterLine) - 1 - w; - Land[y, x]:= lfIndestructible; + LandSet(y, x, lfIndestructible); if (x + y) mod 32 < 16 then c:= AMask else @@ -815,7 +814,7 @@ else for y:= LongWord(topY) to LongWord(topY + 5) do for x:= LongWord(leftX) to LongWord(rightX) do - if Land[y, x] <> 0 then + if LandGet(y, x) <> 0 then begin inc(c); if c > LongWord((LAND_WIDTH div 2)) then // avoid accidental triggering @@ -834,13 +833,13 @@ for y:= 0 to LAND_HEIGHT - 1 do for x:= 0 to LAND_WIDTH - 1 do if (y < LongWord(topY)) or (x < LongWord(leftX)) or (x > LongWord(rightX)) then - Land[y, x]:= lfIndestructible; + LandSet(y, x, lfIndestructible); end else if topY > 0 then begin for y:= 0 to LongWord(topY - 1) do for x:= 0 to LAND_WIDTH - 1 do - Land[y, x]:= lfIndestructible; + LandSet(y, x, lfIndestructible); end; // Render map border for w:= 0 to (cBorderWidth-1) do @@ -850,8 +849,8 @@ for y:= LongWord(topY) to LAND_HEIGHT - 1 do begin // set land flags - Land[y, leftX + w]:= lfIndestructible; - Land[y, rightX - w]:= lfIndestructible; + LandSet(y, leftX + w, lfIndestructible); + LandSet(y, rightX - w, lfIndestructible); // paint black and yellow stripes if (y + leftX + w) mod 32 < 16 then @@ -878,7 +877,7 @@ // Top border for x:= LongWord(leftX) to LongWord(rightX) do begin - Land[topY + w, x]:= lfIndestructible; + LandSet(topY + w, x, lfIndestructible); if (topY + x + w) mod 32 < 16 then c:= AMask // black else @@ -994,7 +993,7 @@ for yy:= y * lh to y * lh + 7 do for xx:= x * lw + cbit to x * lw + cbit + 7 do if ((yy-oy) and LAND_HEIGHT_MASK = 0) and ((xx-ox) and LAND_WIDTH_MASK = 0) - and (Land[yy-oy, xx-ox] <> 0) then + and (LandGet(yy-oy, xx-ox) <> 0) then inc(t); if t > 8 then Preview[y, x]:= Preview[y, x] or ($80 shr bit); @@ -1052,7 +1051,7 @@ for yy:= y * lh - oy to y * lh + lh - 1 - oy do for xx:= x * lw - ox to x * lw + lw - 1 - ox do if (yy and LAND_HEIGHT_MASK = 0) and (xx and LAND_WIDTH_MASK = 0) - and (Land[yy, xx] <> 0) then + and (LandGet(yy, xx) <> 0) then inc(t); Preview[y, x]:= t * 255 div (lh * lw); @@ -1073,8 +1072,8 @@ landPixelDigest : LongInt; begin landPixelDigest:= 1; - for i:= 0 to LAND_HEIGHT-1 do - landPixelDigest:= Adler32Update(landPixelDigest, @Land[i,0], LAND_WIDTH*2); +// for i:= 0 to LAND_HEIGHT-1 do +// landPixelDigest:= Adler32Update(landPixelDigest, @LandGet(i,x), 2); s:= 'M' + IntToStr(syncedPixelDigest)+'|'+IntToStr(landPixelDigest); ScriptSetString('LandDigest',IntToStr(landPixelDigest)); @@ -1093,20 +1092,11 @@ maskOnly:= false; LAND_WIDTH:= 0; LAND_HEIGHT:= 0; -(* - if (cReducedQuality and rqBlurryLand) = 0 then - SetLength(LandPixels, LAND_HEIGHT, LAND_WIDTH) - else - SetLength(LandPixels, LAND_HEIGHT div 2, LAND_WIDTH div 2); - - SetLength(Land, LAND_HEIGHT, LAND_WIDTH); - SetLength(LandDirty, (LAND_HEIGHT div 32), (LAND_WIDTH div 32)); -*) end; procedure freeModule; begin - SetLength(Land, 0, 0); + DisposeLand; SetLength(LandPixels, 0, 0); SetLength(LandDirty, 0, 0); end; diff -r 73cdc306888f -r 128ace913837 hedgewars/uLandGenMaze.pas --- a/hedgewars/uLandGenMaze.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uLandGenMaze.pas Mon Jan 02 15:59:26 2023 +0100 @@ -8,7 +8,8 @@ implementation -uses uRandom, uLandOutline, uLandTemplates, uVariables, uFloat, uConsts, uLandGenTemplateBased, uUtils; +uses uRandom, uLandOutline, uLandTemplates, uVariables, uFloat, uConsts, + uLandGenTemplateBased, uUtils, uLandUtils; type direction = record x, y: LongInt; end; const DIR_N: direction = (x: 0; y: -1); @@ -403,11 +404,11 @@ for x := 0 to playWidth do for y := 0 to off_y - 1 do - Land[y, x] := 0; + LandSet(y, x, 0); for x := 0 to playWidth do for y := off_y to LAND_HEIGHT - 1 do - Land[y, x] := lfBasic; + LandSet(y, x, lfBasic); for y := 0 to num_cells_y - 1 do for x := 0 to num_cells_x - 1 do @@ -527,9 +528,9 @@ else begin x := 0; - while Land[cellsize div 2 + cellsize + off_y, x] = lfBasic do + while LandGet(cellsize div 2 + cellsize + off_y, x) = lfBasic do x := x + 1; - while Land[cellsize div 2 + cellsize + off_y, x] = 0 do + while LandGet(cellsize div 2 + cellsize + off_y, x) = 0 do x := x + 1; FillLand(x+1, cellsize div 2 + cellsize + off_y, 0, 0); end; diff -r 73cdc306888f -r 128ace913837 hedgewars/uLandGenPerlin.pas --- a/hedgewars/uLandGenPerlin.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uLandGenPerlin.pas Mon Jan 02 15:59:26 2023 +0100 @@ -11,6 +11,7 @@ , uRandom , uLandOutline // FillLand , uUtils + , uLandUtils ; var p: array[0..511] of LongInt; @@ -39,7 +40,7 @@ 4086, 4088, 4089, 4091, 4092, 4092, 4093, 4094, 4094, 4095, 4095, 4095, 4095, 4095, 4095, 4095); -function fade(t: LongInt) : LongInt; inline; +function fade(t: LongInt) : LongInt; var t0, t1: LongInt; begin t0:= fadear[t shr 8]; @@ -53,13 +54,13 @@ end; -function lerp(t, a, b: LongInt) : LongInt; inline; +function lerp(t, a, b: LongInt) : LongInt; begin lerp:= a + ((Int64(b) - a) * t shr 12) end; -function grad(hash, x, y: LongInt) : LongInt; inline; +function grad(hash, x, y: LongInt) : LongInt; var h, v, u: LongInt; begin h:= hash and 15; @@ -74,7 +75,7 @@ end; -function inoise(x, y: LongInt) : LongInt; inline; +function inoise(x, y: LongInt) : LongInt; const N = $10000; var xx, yy, u, v, A, AA, AB, B, BA, BB: LongInt; begin @@ -205,24 +206,24 @@ } if r < rCutoff then - Land[y, x]:= 0 + LandSet(y, x, 0) else if param1 = 0 then - Land[y, x]:= lfObjMask + LandSet(y, x, lfObjMask) else - Land[y, x]:= lfBasic + LandSet(y, x, lfBasic) end; end; if param1 = 0 then begin for x:= 0 to width do - if Land[height - 1, x] = lfObjMask then FillLand(x, height - 1, 0, lfBasic); + if LandGet(height - 1, x) = lfObjMask then FillLand(x, height - 1, 0, lfBasic); // strip all lfObjMask pixels for y:= minY to LAND_HEIGHT - 1 do for x:= 0 to LAND_WIDTH - 1 do - if Land[y, x] = lfObjMask then - Land[y, x]:= 0; + if LandGet(y, x) = lfObjMask then + LandSet(y, x, 0); end; playWidth:= width; diff -r 73cdc306888f -r 128ace913837 hedgewars/uLandGenTemplateBased.pas --- a/hedgewars/uLandGenTemplateBased.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uLandGenTemplateBased.pas Mon Jan 02 15:59:26 2023 +0100 @@ -330,7 +330,7 @@ ResizeLand(Template.TemplateWidth, Template.TemplateHeight); for y:= 0 to LAND_HEIGHT - 1 do for x:= 0 to LAND_WIDTH - 1 do - Land[y, x]:= lfBasic; + LandSet(y, x, lfBasic); minDistance:= sqr(cFeatureSize) div 8 + 10; //dabDiv:= getRandom(41)+60; @@ -368,13 +368,13 @@ for y:= 0 to LAND_HEIGHT - 1 do for x:= 0 to LAND_WIDTH - 1 do if (y < LongWord(topY)) or (x < LongWord(leftX)) or (x > LongWord(rightX)) then - Land[y, x]:= 0 + LandSet(y, x, 0) else begin - if Land[y, x] = 0 then - Land[y, x]:= lfBasic - else if Land[y, x] = lfBasic then - Land[y, x]:= 0; + if LandGet(y, x) = 0 then + LandSet(y, x, lfBasic) + else if LandGet(y, x) = lfBasic then + LandSet(y, x, 0); end; end; end; diff -r 73cdc306888f -r 128ace913837 hedgewars/uLandGraphics.pas --- a/hedgewars/uLandGraphics.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uLandGraphics.pas Mon Jan 02 15:59:26 2023 +0100 @@ -47,19 +47,19 @@ function DrawThickLine(X1, Y1, X2, Y2, radius: LongInt; color: Longword): Longword; procedure DumpLandToLog(x, y, r: LongInt); procedure DrawIceBreak(x, y, iceRadius, iceHeight: Longint); -function TryPlaceOnLandSimple(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace, indestructible: boolean): boolean; inline; -function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace: boolean; LandFlags: Word): boolean; inline; -function ForcePlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; LandFlags: Word; Tint: LongWord; Behind, flipHoriz, flipVert: boolean): boolean; inline; +function TryPlaceOnLandSimple(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace, indestructible: boolean): boolean; +function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace: boolean; LandFlags: Word): boolean; +function ForcePlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; LandFlags: Word; Tint: LongWord; Behind, flipHoriz, flipVert: boolean): boolean; function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace, outOfMap, force, behind, flipHoriz, flipVert: boolean; LandFlags: Word; Tint: LongWord): boolean; procedure EraseLandRectRaw(X, Y, width, height: LongWord); procedure EraseLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; LandFlags: Word; eraseOnLFMatch, onlyEraseLF, flipHoriz, flipVert: boolean); function GetPlaceCollisionTex(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt): PTexture; implementation -uses SDLh, uLandTexture, uTextures, uVariables, uUtils, uDebug, uScript; +uses SDLh, uLandTexture, uTextures, uVariables, uUtils, uDebug, uScript, uLandUtils; -procedure calculatePixelsCoordinates(landX, landY: Longint; var pixelX, pixelY: Longint); inline; +procedure calculatePixelsCoordinates(landX, landY: Longint; var pixelX, pixelY: Longint); begin if (cReducedQuality and rqBlurryLand) = 0 then begin @@ -73,33 +73,33 @@ end; end; -function drawPixelBG(landX, landY, pixelX, pixelY: Longint): Longword; inline; +function drawPixelBG(landX, landY, pixelX, pixelY: Longint): Longword; begin drawPixelBG := 0; -if (Land[LandY, landX] and lfIndestructible) = 0 then +if (LandGet(LandY, landX) and lfIndestructible) = 0 then begin - if ((Land[landY, landX] and lfBasic) <> 0) and (((LandPixels[pixelY, pixelX] and AMask) shr AShift) = 255) and (not disableLandBack) then + if ((LandGet(landY, landX) and lfBasic) <> 0) and (((LandPixels[pixelY, pixelX] and AMask) shr AShift) = 255) and (not disableLandBack) then begin LandPixels[pixelY, pixelX]:= LandBackPixel(landX, landY); inc(drawPixelBG); end - else if ((Land[landY, landX] and lfObject) <> 0) or (((LandPixels[pixelY, pixelX] and AMask) shr AShift) < 255) then + else if ((LandGet(landY, landX) and lfObject) <> 0) or (((LandPixels[pixelY, pixelX] and AMask) shr AShift) < 255) then LandPixels[pixelY, pixelX]:= ExplosionBorderColorNoA end; end; -procedure drawPixelEBC(landX, landY, pixelX, pixelY: Longint); inline; +procedure drawPixelEBC(landX, landY, pixelX, pixelY: Longint); begin -if (Land[landY, landX] and lfIndestructible = 0) and - (((Land[landY, landX] and lfBasic) <> 0) or ((Land[landY, landX] and lfObject) <> 0)) then +if (LandGet(landY, landX) and lfIndestructible = 0) and + (((LandGet(landY, landX) and lfBasic) <> 0) or ((LandGet(landY, landX) and lfObject) <> 0)) then begin LandPixels[pixelY, pixelX]:= ExplosionBorderColor; - Land[landY, landX]:= (Land[landY, landX] or lfDamaged) and (not lfIce); + LandSet(landY, landX, (LandGet(landY, landX) or lfDamaged) and (not lfIce)); LandDirty[landY div 32, landX div 32]:= 1; end; end; -function isLandscapeEdge(weight:Longint):boolean; inline; +function isLandscapeEdge(weight:Longint):boolean; begin isLandscapeEdge := (weight < 8) and (weight >= 2); end; @@ -118,7 +118,7 @@ (j > LAND_HEIGHT -1) then exit(9); - if Land[j, i] and lfLandMask and (not lfIce) = 0 then + if LandGet(j, i) and lfLandMask and (not lfIce) = 0 then inc(r) end; @@ -126,7 +126,7 @@ end; -procedure fillPixelFromIceSprite(pixelX, pixelY:Longint); inline; +procedure fillPixelFromIceSprite(pixelX, pixelY:Longint); var iceSurface: PSDL_Surface; icePixels: PLongwordArray; @@ -159,22 +159,22 @@ end; -procedure DrawPixelIce(landX, landY, pixelX, pixelY: Longint); inline; +procedure DrawPixelIce(landX, landY, pixelX, pixelY: Longint); begin -if ((Land[landY, landX] and lfIce) <> 0) then exit; +if ((LandGet(landY, landX) and lfIce) <> 0) then exit; if (pixelX < LeftX) or (pixelX > RightX) or (pixelY < TopY) then exit; if isLandscapeEdge(getPixelWeight(landX, landY)) then begin if (LandPixels[pixelY, pixelX] and AMask < 255) and (LandPixels[pixelY, pixelX] and AMask > 0) then LandPixels[pixelY, pixelX] := (IceEdgeColor and (not AMask)) or (LandPixels[pixelY, pixelX] and AMask) - else if (LandPixels[pixelY, pixelX] and AMask < 255) or (Land[landY, landX] > 255) then + else if (LandPixels[pixelY, pixelX] and AMask < 255) or (LandGet(landY, landX) > 255) then LandPixels[pixelY, pixelX] := IceEdgeColor end -else if Land[landY, landX] > 255 then +else if LandGet(landY, landX) > 255 then begin fillPixelFromIceSprite(pixelX, pixelY); end; -if Land[landY, landX] > 255 then Land[landY, landX] := Land[landY, landX] or lfIce and (not lfDamaged); +if LandGet(landY, landX) > 255 then LandSet(landY, landX, LandGet(landY, landX) or lfIce and (not lfDamaged)); end; @@ -202,7 +202,7 @@ for i:= fromPix to toPix do begin calculatePixelsCoordinates(i, y, px, py); - if ((Land[y, i] and lfIndestructible) = 0) and (not disableLandBack or (Land[y, i] > 255)) then + if ((LandGet(y, i) and lfIndestructible) = 0) and (not disableLandBack or (LandGet(y, i) > 255)) then LandPixels[py, px]:= ExplosionBorderColorNoA; end; icePixel: @@ -214,41 +214,41 @@ addNotHHObj: for i:= fromPix to toPix do begin - if Land[y, i] and lfNotHHObjMask shr lfNotHHObjShift < lfNotHHObjSize then - Land[y, i]:= (Land[y, i] and (not lfNotHHObjMask)) or ((Land[y, i] and lfNotHHObjMask shr lfNotHHObjShift + 1) shl lfNotHHObjShift); + if LandGet(y, i) and lfNotHHObjMask shr lfNotHHObjShift < lfNotHHObjSize then + LandSet(y, i, (LandGet(y, i) and (not lfNotHHObjMask)) or ((LandGet(y, i) and lfNotHHObjMask shr lfNotHHObjShift + 1) shl lfNotHHObjShift)); end; removeNotHHObj: for i:= fromPix to toPix do begin - if Land[y, i] and lfNotHHObjMask <> 0 then - Land[y, i]:= (Land[y, i] and (not lfNotHHObjMask)) or ((Land[y, i] and lfNotHHObjMask shr lfNotHHObjShift - 1) shl lfNotHHObjShift); + if LandGet(y, i) and lfNotHHObjMask <> 0 then + LandSet(y, i, (LandGet(y, i) and (not lfNotHHObjMask)) or ((LandGet(y, i) and lfNotHHObjMask shr lfNotHHObjShift - 1) shl lfNotHHObjShift)); end; addHH: for i:= fromPix to toPix do begin - if Land[y, i] and lfHHMask < lfHHMask then - Land[y, i]:= Land[y, i] + 1 + if LandGet(y, i) and lfHHMask < lfHHMask then + LandSet(y, i, LandGet(y, i) + 1) end; removeHH: for i:= fromPix to toPix do begin - if Land[y, i] and lfHHMask > 0 then - Land[y, i]:= Land[y, i] - 1; + if LandGet(y, i) and lfHHMask > 0 then + LandSet(y, i, LandGet(y, i) - 1); end; setCurrentHog: for i:= fromPix to toPix do begin - Land[y, i]:= Land[y, i] or lfCurHogCrate + LandSet(y, i, LandGet(y, i) or lfCurHogCrate) end; removeCurrentHog: for i:= fromPix to toPix do begin - Land[y, i]:= Land[y, i] and lfNotCurHogCrate; + LandSet(y, i, LandGet(y, i) and lfNotCurHogCrate); end; end; end; -function FillLandCircleSegmentFT(x, y, dx, dy: LongInt; fill : fillType): Longword; inline; +function FillLandCircleSegmentFT(x, y, dx, dy: LongInt; fill : fillType): Longword; begin FillLandCircleSegmentFT := 0; if ((y + dy) and LAND_HEIGHT_MASK) = 0 then @@ -261,7 +261,7 @@ inc(FillLandCircleSegmentFT, FillLandCircleLineFT(y - dx, Max(x - dy, 0), Min(x + dy, LAND_WIDTH - 1), fill)); end; -function FillRoundInLandFT(X, Y, Radius: LongInt; fill: fillType): Longword; inline; +function FillRoundInLandFT(X, Y, Radius: LongInt; fill: fillType): Longword; var dx, dy, d: LongInt; begin dx:= 0; @@ -323,31 +323,31 @@ if ((y + dy) and LAND_HEIGHT_MASK) = 0 then for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do - if (Land[y + dy, i] and lfIndestructible) = 0 then + if (LandGet(y + dy, i) and lfIndestructible) = 0 then begin - if Land[y + dy, i] <> Value then inc(FillCircleLines); - Land[y + dy, i]:= Value; + if LandGet(y + dy, i) <> Value then inc(FillCircleLines); + LandSet(y + dy, i, Value); end; if ((y - dy) and LAND_HEIGHT_MASK) = 0 then for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do - if (Land[y - dy, i] and lfIndestructible) = 0 then + if (LandGet(y - dy, i) and lfIndestructible) = 0 then begin - if Land[y - dy, i] <> Value then inc(FillCircleLines); - Land[y - dy, i]:= Value; + if LandGet(y - dy, i) <> Value then inc(FillCircleLines); + LandSet(y - dy, i, Value); end; if ((y + dx) and LAND_HEIGHT_MASK) = 0 then for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do - if (Land[y + dx, i] and lfIndestructible) = 0 then + if (LandGet(y + dx, i) and lfIndestructible) = 0 then begin - if Land[y + dx, i] <> Value then inc(FillCircleLines); - Land[y + dx, i]:= Value; + if LandGet(y + dx, i) <> Value then inc(FillCircleLines); + LandSet(y + dx, i, Value); end; if ((y - dx) and LAND_HEIGHT_MASK) = 0 then for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do - if (Land[y - dx, i] and lfIndestructible) = 0 then + if (LandGet(y - dx, i) and lfIndestructible) = 0 then begin - if Land[y - dx, i] <> Value then inc(FillCircleLines); - Land[y - dx, i]:= Value; + if LandGet(y - dx, i) <> Value then inc(FillCircleLines); + LandSet(y - dx, i, Value); end; end; @@ -435,9 +435,9 @@ begin for j := iceT to iceB do begin - if Land[j, i] = 0 then + if LandGet(j, i) = 0 then begin - Land[j, i] := lfIce; + LandSet(j, i, lfIce); if (cReducedQuality and rqBlurryLand) = 0 then fillPixelFromIceSprite(i, j) else @@ -478,7 +478,7 @@ for ty:= Max(y - Radius, 0) to Min(y + Radius, TopY) do for tx:= Max(LeftX, ar^[i].Left - Radius) to Min(RightX, ar^[i].Right + Radius) do begin - if (Land[ty, tx] and lfIndestructible) = 0 then + if (LandGet(ty, tx) and lfIndestructible) = 0 then begin if (cReducedQuality and rqBlurryLand) = 0 then begin @@ -488,9 +488,9 @@ begin by:= ty div 2; bx:= tx div 2; end; - if ((Land[ty, tx] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and (not disableLandBack) then + if ((LandGet(ty, tx) and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and (not disableLandBack) then LandPixels[by, bx]:= LandBackPixel(tx, ty) - else if ((Land[ty, tx] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then + else if ((LandGet(ty, tx) and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then LandPixels[by, bx]:= LandPixels[by, bx] and (not AMASK) end end; @@ -504,14 +504,14 @@ begin for ty:= Max(y - Radius, 0) to Min(y + Radius, TopY) do for tx:= Max(LeftX, ar^[i].Left - Radius) to Min(RightX, ar^[i].Right + Radius) do - if ((Land[ty, tx] and lfBasic) <> 0) or ((Land[ty, tx] and lfObject) <> 0) then + if ((LandGet(ty, tx) and lfBasic) <> 0) or ((LandGet(ty, tx) and lfObject) <> 0) then begin if (cReducedQuality and rqBlurryLand) = 0 then LandPixels[ty, tx]:= ExplosionBorderColor else LandPixels[ty div 2, tx div 2]:= ExplosionBorderColor; - Land[ty, tx]:= (Land[ty, tx] or lfDamaged) and (not lfIce); + LandSet(ty, tx, (LandGet(ty, tx) or lfDamaged) and (not lfIce)); LandDirty[ty div 32, tx div 32]:= 1; end; inc(y, dY) @@ -533,10 +533,10 @@ Y:= Y + dY; tx:= hwRound(X); ty:= hwRound(Y); - if ((ty and LAND_HEIGHT_MASK) = 0) and ((tx and LAND_WIDTH_MASK) = 0) and (((Land[ty, tx] and lfBasic) <> 0) - or ((Land[ty, tx] and lfObject) <> 0)) then + if ((ty and LAND_HEIGHT_MASK) = 0) and ((tx and LAND_WIDTH_MASK) = 0) and (((LandGet(ty, tx) and lfBasic) <> 0) + or ((LandGet(ty, tx) and lfObject) <> 0)) then begin - Land[ty, tx]:= (Land[ty, tx] or lfDamaged) and (not lfIce); + LandSet(ty, tx, (LandGet(ty, tx) or lfDamaged) and (not lfIce)); if despeckle then LandDirty[ty div 32, tx div 32]:= 1; if (cReducedQuality and rqBlurryLand) = 0 then @@ -581,12 +581,12 @@ ty:= hwRound(Y); if ((ty and LAND_HEIGHT_MASK) = 0) and ((tx and LAND_WIDTH_MASK) = 0) - and (((Land[ty, tx] and lfBasic) <> 0) or ((Land[ty, tx] and lfObject) <> 0)) then + and (((LandGet(ty, tx) and lfBasic) <> 0) or ((LandGet(ty, tx) and lfObject) <> 0)) then begin - Land[ty, tx]:= Land[ty, tx] and (not lfIce); + LandSet(ty, tx, LandGet(ty, tx) and (not lfIce)); if despeckle then begin - Land[ty, tx]:= Land[ty, tx] or lfDamaged; + LandSet(ty, tx, LandGet(ty, tx) or lfDamaged); LandDirty[ty div 32, tx div 32]:= 1 end; if (cReducedQuality and rqBlurryLand) = 0 then @@ -612,7 +612,7 @@ Y:= Y + dY; tx:= hwRound(X); ty:= hwRound(Y); - if ((ty and LAND_HEIGHT_MASK) = 0) and ((tx and LAND_WIDTH_MASK) = 0) and ((Land[ty, tx] and lfIndestructible) = 0) then + if ((ty and LAND_HEIGHT_MASK) = 0) and ((tx and LAND_WIDTH_MASK) = 0) and ((LandGet(ty, tx) and lfIndestructible) = 0) then begin if (cReducedQuality and rqBlurryLand) = 0 then begin @@ -622,11 +622,11 @@ begin by:= ty div 2; bx:= tx div 2; end; - if ((Land[ty, tx] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and (not disableLandBack) then + if ((LandGet(ty, tx) and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and (not disableLandBack) then LandPixels[by, bx]:= LandBackPixel(tx, ty) - else if ((Land[ty, tx] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then + else if ((LandGet(ty, tx) and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then LandPixels[by, bx]:= LandPixels[by, bx] and (not AMASK); - Land[ty, tx]:= 0; + LandSet(ty, tx, 0); end end; DrawExplosionBorder(X, Y, dx, dy, despeckle); @@ -644,10 +644,10 @@ Y:= Y + dY; tx:= hwRound(X); ty:= hwRound(Y); - if ((ty and LAND_HEIGHT_MASK) = 0) and ((tx and LAND_WIDTH_MASK) = 0) and (((Land[ty, tx] and lfBasic) <> 0) - or ((Land[ty, tx] and lfObject) <> 0)) then + if ((ty and LAND_HEIGHT_MASK) = 0) and ((tx and LAND_WIDTH_MASK) = 0) and (((LandGet(ty, tx) and lfBasic) <> 0) + or ((LandGet(ty, tx) and lfObject) <> 0)) then begin - Land[ty, tx]:= (Land[ty, tx] or lfDamaged) and (not lfIce); + LandSet(ty, tx, (LandGet(ty, tx) or lfDamaged) and (not lfIce)); if despeckle then LandDirty[ty div 32, tx div 32]:= 1; if (cReducedQuality and rqBlurryLand) = 0 then @@ -692,7 +692,7 @@ end; end; -function TryPlaceOnLandSimple(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace, indestructible: boolean): boolean; inline; +function TryPlaceOnLandSimple(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace, indestructible: boolean): boolean; var lf: Word; begin if indestructible then @@ -702,12 +702,12 @@ TryPlaceOnLandSimple:= TryPlaceOnLand(cpX, cpY, Obj, Frame, doPlace, false, false, false, false, false, lf, $FFFFFFFF); end; -function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace: boolean; LandFlags: Word): boolean; inline; +function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace: boolean; LandFlags: Word): boolean; begin TryPlaceOnLand:= TryPlaceOnLand(cpX, cpY, Obj, Frame, doPlace, false, false, false, false, false, LandFlags, $FFFFFFFF); end; -function ForcePlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; LandFlags: Word; Tint: LongWord; Behind, flipHoriz, flipVert: boolean): boolean; inline; +function ForcePlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; LandFlags: Word; Tint: LongWord; Behind, flipHoriz, flipVert: boolean): boolean; begin ForcePlaceOnLand:= TryPlaceOnLand(cpX, cpY, Obj, Frame, true, false, true, behind, flipHoriz, flipVert, LandFlags, Tint) end; @@ -752,12 +752,12 @@ if (outOfMap and ((cpY + y) < LAND_HEIGHT) and ((cpY + y) >= 0) and ((cpX + x) < LAND_WIDTH) and ((cpX + x) >= 0) and - ((not force) and (Land[cpY + y, cpX + x] <> 0))) or + ((not force) and (LandGet(cpY + y, cpX + x) <> 0))) or (not outOfMap and (((cpY + y) <= topY) or ((cpY + y) >= LAND_HEIGHT) or ((cpX + x) <= leftX) or ((cpX + x) >= rightX) or - ((not force) and (Land[cpY + y, cpX + x] <> 0)))) then + ((not force) and (LandGet(cpY + y, cpX + x) <> 0)))) then begin if SDL_MustLock(Image) then SDL_UnlockSurface(Image); @@ -793,24 +793,24 @@ gX:= (cpX + x) div 2; gY:= (cpY + y) div 2; end; - if (not behind) or (Land[cpY + y, cpX + x] and lfLandMask = 0) then + if (not behind) or (LandGet(cpY + y, cpX + x) and lfLandMask = 0) then begin - if (LandFlags and lfBasic <> 0) or + if (LandFlags and lfBasic <> 0) or ((LandPixels[gY, gX] and AMask shr AShift > 128) and // This test assumes lfBasic and lfObject differ only graphically (LandFlags and (lfObject or lfIce) = 0)) then - Land[cpY + y, cpX + x]:= lfBasic or LandFlags + LandSet(cpY + y, cpX + x, lfBasic or LandFlags) else if (LandFlags and lfIce = 0) then - Land[cpY + y, cpX + x]:= lfObject or LandFlags - else Land[cpY + y, cpX + x]:= LandFlags + LandSet(cpY + y, cpX + x, lfObject or LandFlags) + else LandSet(cpY + y, cpX + x, LandFlags) end; if (not behind) or (LandPixels[gY, gX] = 0) then begin if tint = $FFFFFFFF then LandPixels[gY, gX]:= PLongword(@(p^[x * 4]))^ - else + else begin pixel:= PLongword(@(p^[x * 4]))^; - LandPixels[gY, gX]:= + LandPixels[gY, gX]:= ceil((pixel shr RShift and $FF) * ((tint shr 24) / 255)) shl RShift or ceil((pixel shr GShift and $FF) * ((tint shr 16 and $ff) / 255)) shl GShift or ceil((pixel shr BShift and $FF) * ((tint shr 8 and $ff) / 255)) shl BShift or @@ -848,7 +848,7 @@ for tx:= 0 to width - 1 do begin LandPixels[ty, tx]:= 0; - Land[Y + ty, X + tx]:= 0; + LandSet(Y + ty, X + tx, 0); end; end; @@ -913,15 +913,15 @@ gX:= (cpX + x) div 2; gY:= (cpY + y) div 2; end; - if (not eraseOnLFMatch or (Land[cpY + y, cpX + x] and LandFlags <> 0)) and + if (not eraseOnLFMatch or (LandGet(cpY + y, cpX + x) and LandFlags <> 0)) and ((PLongword(@(p^[x * 4]))^) and AMask <> 0) then begin if not onlyEraseLF then begin LandPixels[gY, gX]:= 0; - Land[cpY + y, cpX + x]:= 0 + LandSet(cpY + y, cpX + x, 0) end - else Land[cpY + y, cpX + x]:= Land[cpY + y, cpX + x] and (not LandFlags) + else LandSet(cpY + y, cpX + x, LandGet(cpY + y, cpX + x) and (not LandFlags)) end end; p:= PByteArray(@(p^[Image^.pitch])); @@ -990,7 +990,7 @@ for x:= 0 to Pred(w) do if ((p^[x] and AMask) <> 0) and (((cpY + y) < topY) or ((cpY + y) >= LAND_HEIGHT) or - ((cpX + x) < leftX) or ((cpX + x) > rightX) or (Land[cpY + y, cpX + x] <> 0)) then + ((cpX + x) < leftX) or ((cpX + x) > rightX) or (LandGet(cpY + y, cpX + x) <> 0)) then pt^[x]:= cWhiteColor else (pt^[x]):= cWhiteColor and (not AMask); @@ -1028,8 +1028,8 @@ yy:= Y div 2; end; - pixelsweep:= (Land[Y, X] <= lfAllObjMask) and ((LandPixels[yy, xx] and AMask) <> 0); - if (((Land[Y, X] and lfDamaged) <> 0) and ((Land[Y, X] and lfIndestructible) = 0)) or pixelsweep then + pixelsweep:= (LandGet(Y, X) <= lfAllObjMask) and ((LandPixels[yy, xx] and AMask) <> 0); + if (((LandGet(Y, X) and lfDamaged) <> 0) and ((LandGet(Y, X) and lfIndestructible) = 0)) or pixelsweep then begin c:= 0; for i:= -1 to 1 do @@ -1053,21 +1053,21 @@ else if (LandPixels[ny, nx] and AMASK) <> 0 then inc(c); end - else if Land[ny, nx] > 255 then + else if LandGet(ny, nx) > 255 then inc(c); end end; if c < 4 then // 0-3 neighbours begin - if ((Land[Y, X] and lfBasic) <> 0) and (not disableLandBack) then + if ((LandGet(Y, X) and lfBasic) <> 0) and (not disableLandBack) then LandPixels[yy, xx]:= LandBackPixel(X, Y) else LandPixels[yy, xx]:= LandPixels[yy, xx] and (not AMASK); if not pixelsweep then begin - Land[Y, X]:= 0; + LandSet(Y, X, 0); exit end end; @@ -1083,7 +1083,7 @@ begin // only AA inwards -if (Land[Y, X] and lfDamaged) = 0 then +if (LandGet(Y, X) and lfDamaged) = 0 then exit; // check location @@ -1104,7 +1104,7 @@ for nx:= X-1 to X+1 do for ny:= Y-1 to Y+1 do // only consider undamaged neighbors (also leads to skipping itself) - if (Land[ny, nx] and lfDamaged) = 0 then + if (LandGet(ny, nx) and lfDamaged) = 0 then begin pixel:= LandPixels[ny, nx]; inc(r, (pixel and RMask) shr RShift); @@ -1139,11 +1139,11 @@ procedure Smooth_oldImpl(X, Y: LongInt); begin // a bit of AA for explosions -if (Land[Y, X] = 0) and (Y > topY + 1) and +if (LandGet(Y, X) = 0) and (Y > topY + 1) and (Y < LAND_HEIGHT-2) and (X > leftX + 1) and (X < rightX - 1) then begin - if ((((Land[y, x-1] and lfDamaged) <> 0) and (((Land[y+1,x] and lfDamaged) <> 0)) or ((Land[y-1,x] and lfDamaged) <> 0)) - or (((Land[y, x+1] and lfDamaged) <> 0) and (((Land[y-1,x] and lfDamaged) <> 0) or ((Land[y+1,x] and lfDamaged) <> 0)))) then + if ((((LandGet(y, x-1) and lfDamaged) <> 0) and (((LandGet(y+1,x) and lfDamaged) <> 0)) or ((LandGet(y-1,x) and lfDamaged) <> 0)) + or (((LandGet(y, x+1) and lfDamaged) <> 0) and (((LandGet(y-1,x) and lfDamaged) <> 0) or ((LandGet(y+1,x) and lfDamaged) <> 0)))) then begin if (cReducedQuality and rqBlurryLand) = 0 then begin @@ -1156,22 +1156,22 @@ (((((LandPixels[y,x] and BMask shr BShift) div 2)+((ExplosionBorderColor and BMask) shr BShift) div 2) and $FF) shl BShift) or ($FF shl AShift) end; { - if (Land[y, x-1] = lfObject) then - Land[y,x]:= lfObject - else if (Land[y, x+1] = lfObject) then - Land[y,x]:= lfObject + if (LandGet(y, x-1) = lfObject) then + LandGet(y,x):= lfObject + else if (LandGet(y, x+1) = lfObject) then + LandGet(y,x):= lfObject else - Land[y,x]:= lfBasic; + LandGet(y,x):= lfBasic; } end - else if ((((Land[y, x-1] and lfDamaged) <> 0) and ((Land[y+1,x-1] and lfDamaged) <> 0) and ((Land[y+2,x] and lfDamaged) <> 0)) - or (((Land[y, x-1] and lfDamaged) <> 0) and ((Land[y-1,x-1] and lfDamaged) <> 0) and ((Land[y-2,x] and lfDamaged) <> 0)) - or (((Land[y, x+1] and lfDamaged) <> 0) and ((Land[y+1,x+1] and lfDamaged) <> 0) and ((Land[y+2,x] and lfDamaged) <> 0)) - or (((Land[y, x+1] and lfDamaged) <> 0) and ((Land[y-1,x+1] and lfDamaged) <> 0) and ((Land[y-2,x] and lfDamaged) <> 0)) - or (((Land[y+1, x] and lfDamaged) <> 0) and ((Land[y+1,x+1] and lfDamaged) <> 0) and ((Land[y,x+2] and lfDamaged) <> 0)) - or (((Land[y-1, x] and lfDamaged) <> 0) and ((Land[y-1,x+1] and lfDamaged) <> 0) and ((Land[y,x+2] and lfDamaged) <> 0)) - or (((Land[y+1, x] and lfDamaged) <> 0) and ((Land[y+1,x-1] and lfDamaged) <> 0) and ((Land[y,x-2] and lfDamaged) <> 0)) - or (((Land[y-1, x] and lfDamaged) <> 0) and ((Land[y-1,x-1] and lfDamaged) <> 0) and ((Land[y,x-2] and lfDamaged) <> 0))) then + else if ((((LandGet(y, x-1) and lfDamaged) <> 0) and ((LandGet(y+1,x-1) and lfDamaged) <> 0) and ((LandGet(y+2,x) and lfDamaged) <> 0)) + or (((LandGet(y, x-1) and lfDamaged) <> 0) and ((LandGet(y-1,x-1) and lfDamaged) <> 0) and ((LandGet(y-2,x) and lfDamaged) <> 0)) + or (((LandGet(y, x+1) and lfDamaged) <> 0) and ((LandGet(y+1,x+1) and lfDamaged) <> 0) and ((LandGet(y+2,x) and lfDamaged) <> 0)) + or (((LandGet(y, x+1) and lfDamaged) <> 0) and ((LandGet(y-1,x+1) and lfDamaged) <> 0) and ((LandGet(y-2,x) and lfDamaged) <> 0)) + or (((LandGet(y+1, x) and lfDamaged) <> 0) and ((LandGet(y+1,x+1) and lfDamaged) <> 0) and ((LandGet(y,x+2) and lfDamaged) <> 0)) + or (((LandGet(y-1, x) and lfDamaged) <> 0) and ((LandGet(y-1,x+1) and lfDamaged) <> 0) and ((LandGet(y,x+2) and lfDamaged) <> 0)) + or (((LandGet(y+1, x) and lfDamaged) <> 0) and ((LandGet(y+1,x-1) and lfDamaged) <> 0) and ((LandGet(y,x-2) and lfDamaged) <> 0)) + or (((LandGet(y-1, x) and lfDamaged) <> 0) and ((LandGet(y-1,x-1) and lfDamaged) <> 0) and ((LandGet(y,x-2) and lfDamaged) <> 0))) then begin if (cReducedQuality and rqBlurryLand) = 0 then begin @@ -1184,38 +1184,38 @@ (((((LandPixels[y,x] and BMask shr BShift) * 3 div 4)+((ExplosionBorderColor and BMask) shr BShift) div 4) and $FF) shl BShift) or ($FF shl AShift) end; { - if (Land[y, x-1] = lfObject) then - Land[y, x]:= lfObject - else if (Land[y, x+1] = lfObject) then - Land[y, x]:= lfObject - else if (Land[y+1, x] = lfObject) then - Land[y, x]:= lfObject - else if (Land[y-1, x] = lfObject) then - Land[y, x]:= lfObject - else Land[y,x]:= lfBasic + if (LandGet(y, x-1) = lfObject) then + LandGet(y, x):= lfObject + else if (LandGet(y, x+1) = lfObject) then + LandGet(y, x):= lfObject + else if (LandGet(y+1, x) = lfObject) then + LandGet(y, x):= lfObject + else if (LandGet(y-1, x) = lfObject) then + LandGet(y, x):= lfObject + else LandGet(y,x):= lfBasic } end end else if ((cReducedQuality and rqBlurryLand) = 0) and ((LandPixels[Y, X] and AMask) = AMask) -and (Land[Y, X] and (lfDamaged or lfBasic) = lfBasic) +and (LandGet(Y, X) and (lfDamaged or lfBasic) = lfBasic) and (Y > topY + 1) and (Y < LAND_HEIGHT-2) and (X > leftX + 1) and (X < rightX - 1) then begin - if ((((Land[y, x-1] and lfDamaged) <> 0) and (((Land[y+1,x] and lfDamaged) <> 0)) or ((Land[y-1,x] and lfDamaged) <> 0)) - or (((Land[y, x+1] and lfDamaged) <> 0) and (((Land[y-1,x] and lfDamaged) <> 0) or ((Land[y+1,x] and lfDamaged) <> 0)))) then + if ((((LandGet(y, x-1) and lfDamaged) <> 0) and (((LandGet(y+1,x) and lfDamaged) <> 0)) or ((LandGet(y-1,x) and lfDamaged) <> 0)) + or (((LandGet(y, x+1) and lfDamaged) <> 0) and (((LandGet(y-1,x) and lfDamaged) <> 0) or ((LandGet(y+1,x) and lfDamaged) <> 0)))) then begin LandPixels[y,x]:= (((((LandPixels[y,x] and RMask shr RShift) div 2)+((ExplosionBorderColor and RMask) shr RShift) div 2) and $FF) shl RShift) or (((((LandPixels[y,x] and GMask shr GShift) div 2)+((ExplosionBorderColor and GMask) shr GShift) div 2) and $FF) shl GShift) or (((((LandPixels[y,x] and BMask shr BShift) div 2)+((ExplosionBorderColor and BMask) shr BShift) div 2) and $FF) shl BShift) or ($FF shl AShift) end - else if ((((Land[y, x-1] and lfDamaged) <> 0) and ((Land[y+1,x-1] and lfDamaged) <> 0) and ((Land[y+2,x] and lfDamaged) <> 0)) - or (((Land[y, x-1] and lfDamaged) <> 0) and ((Land[y-1,x-1] and lfDamaged) <> 0) and ((Land[y-2,x] and lfDamaged) <> 0)) - or (((Land[y, x+1] and lfDamaged) <> 0) and ((Land[y+1,x+1] and lfDamaged) <> 0) and ((Land[y+2,x] and lfDamaged) <> 0)) - or (((Land[y, x+1] and lfDamaged) <> 0) and ((Land[y-1,x+1] and lfDamaged) <> 0) and ((Land[y-2,x] and lfDamaged) <> 0)) - or (((Land[y+1, x] and lfDamaged) <> 0) and ((Land[y+1,x+1] and lfDamaged) <> 0) and ((Land[y,x+2] and lfDamaged) <> 0)) - or (((Land[y-1, x] and lfDamaged) <> 0) and ((Land[y-1,x+1] and lfDamaged) <> 0) and ((Land[y,x+2] and lfDamaged) <> 0)) - or (((Land[y+1, x] and lfDamaged) <> 0) and ((Land[y+1,x-1] and lfDamaged) <> 0) and ((Land[y,x-2] and lfDamaged) <> 0)) - or (((Land[y-1, x] and lfDamaged) <> 0) and ((Land[y-1,x-1] and lfDamaged) <> 0) and ((Land[y,x-2] and lfDamaged) <> 0))) then + else if ((((LandGet(y, x-1) and lfDamaged) <> 0) and ((LandGet(y+1,x-1) and lfDamaged) <> 0) and ((LandGet(y+2,x) and lfDamaged) <> 0)) + or (((LandGet(y, x-1) and lfDamaged) <> 0) and ((LandGet(y-1,x-1) and lfDamaged) <> 0) and ((LandGet(y-2,x) and lfDamaged) <> 0)) + or (((LandGet(y, x+1) and lfDamaged) <> 0) and ((LandGet(y+1,x+1) and lfDamaged) <> 0) and ((LandGet(y+2,x) and lfDamaged) <> 0)) + or (((LandGet(y, x+1) and lfDamaged) <> 0) and ((LandGet(y-1,x+1) and lfDamaged) <> 0) and ((LandGet(y-2,x) and lfDamaged) <> 0)) + or (((LandGet(y+1, x) and lfDamaged) <> 0) and ((LandGet(y+1,x+1) and lfDamaged) <> 0) and ((LandGet(y,x+2) and lfDamaged) <> 0)) + or (((LandGet(y-1, x) and lfDamaged) <> 0) and ((LandGet(y-1,x+1) and lfDamaged) <> 0) and ((LandGet(y,x+2) and lfDamaged) <> 0)) + or (((LandGet(y+1, x) and lfDamaged) <> 0) and ((LandGet(y+1,x-1) and lfDamaged) <> 0) and ((LandGet(y,x-2) and lfDamaged) <> 0)) + or (((LandGet(y-1, x) and lfDamaged) <> 0) and ((LandGet(y-1,x-1) and lfDamaged) <> 0) and ((LandGet(y,x-2) and lfDamaged) <> 0))) then begin LandPixels[y,x]:= (((((LandPixels[y,x] and RMask shr RShift) * 3 div 4)+((ExplosionBorderColor and RMask) shr RShift) div 4) and $FF) shl RShift) or @@ -1308,12 +1308,12 @@ // Return true if outside of land or not the value tested, used right now for some X/Y movement that does not use normal hedgehog movement in GSHandlers.inc -function CheckLandValue(X, Y: LongInt; LandFlag: Word): boolean; inline; +function CheckLandValue(X, Y: LongInt; LandFlag: Word): boolean; begin - CheckLandValue:= ((X and LAND_WIDTH_MASK <> 0) or (Y and LAND_HEIGHT_MASK <> 0)) or ((Land[Y, X] and LandFlag) = 0) + CheckLandValue:= ((X and LAND_WIDTH_MASK <> 0) or (Y and LAND_HEIGHT_MASK <> 0)) or ((LandGet(Y, X) and LandFlag) = 0) end; -function LandBackPixel(x, y: LongInt): LongWord; inline; +function LandBackPixel(x, y: LongInt): LongWord; var p: PLongWordArray; begin if LandBackSurface = nil then @@ -1382,30 +1382,30 @@ end; if ((x and LAND_WIDTH_MASK) = 0) and ((y and LAND_HEIGHT_MASK) = 0) then - Land[y, x]:= Color; + LandSet(y, x, Color); end end; -function DrawDots(x, y, xx, yy: Longint; Color: Longword): Longword; inline; +function DrawDots(x, y, xx, yy: Longint; Color: Longword): Longword; begin DrawDots:= 0; - if (((x + xx) and LAND_WIDTH_MASK) = 0) and (((y + yy) and LAND_HEIGHT_MASK) = 0) and (Land[y + yy, x + xx] <> Color) then - begin inc(DrawDots); Land[y + yy, x + xx]:= Color; end; - if (((x + xx) and LAND_WIDTH_MASK) = 0) and (((y - yy) and LAND_HEIGHT_MASK) = 0) and (Land[y - yy, x + xx] <> Color) then - begin inc(DrawDots); Land[y - yy, x + xx]:= Color; end; - if (((x - xx) and LAND_WIDTH_MASK) = 0) and (((y + yy) and LAND_HEIGHT_MASK) = 0) and (Land[y + yy, x - xx] <> Color) then - begin inc(DrawDots); Land[y + yy, x - xx]:= Color; end; - if (((x - xx) and LAND_WIDTH_MASK) = 0) and (((y - yy) and LAND_HEIGHT_MASK) = 0) and (Land[y - yy, x - xx] <> Color) then - begin inc(DrawDots); Land[y - yy, x - xx]:= Color; end; - if (((x + yy) and LAND_WIDTH_MASK) = 0) and (((y + xx) and LAND_HEIGHT_MASK) = 0) and (Land[y + xx, x + yy] <> Color) then - begin inc(DrawDots); Land[y + xx, x + yy]:= Color; end; - if (((x + yy) and LAND_WIDTH_MASK) = 0) and (((y - xx) and LAND_HEIGHT_MASK) = 0) and (Land[y - xx, x + yy] <> Color) then - begin inc(DrawDots); Land[y - xx, x + yy]:= Color; end; - if (((x - yy) and LAND_WIDTH_MASK) = 0) and (((y + xx) and LAND_HEIGHT_MASK) = 0) and (Land[y + xx, x - yy] <> Color) then - begin inc(DrawDots); Land[y + xx, x - yy]:= Color; end; - if (((x - yy) and LAND_WIDTH_MASK) = 0) and (((y - xx) and LAND_HEIGHT_MASK) = 0) and (Land[y - xx, x - yy] <> Color) then - begin inc(DrawDots); Land[y - xx, x - yy]:= Color; end; + if (((x + xx) and LAND_WIDTH_MASK) = 0) and (((y + yy) and LAND_HEIGHT_MASK) = 0) and (LandGet(y + yy, x + xx) <> Color) then + begin inc(DrawDots); LandSet(y + yy, x + xx, Color); end; + if (((x + xx) and LAND_WIDTH_MASK) = 0) and (((y - yy) and LAND_HEIGHT_MASK) = 0) and (LandGet(y - yy, x + xx) <> Color) then + begin inc(DrawDots); LandSet(y - yy, x + xx, Color); end; + if (((x - xx) and LAND_WIDTH_MASK) = 0) and (((y + yy) and LAND_HEIGHT_MASK) = 0) and (LandGet(y + yy, x - xx) <> Color) then + begin inc(DrawDots); LandSet(y + yy, x - xx, Color); end; + if (((x - xx) and LAND_WIDTH_MASK) = 0) and (((y - yy) and LAND_HEIGHT_MASK) = 0) and (LandGet(y - yy, x - xx) <> Color) then + begin inc(DrawDots); LandSet(y - yy, x - xx, Color); end; + if (((x + yy) and LAND_WIDTH_MASK) = 0) and (((y + xx) and LAND_HEIGHT_MASK) = 0) and (LandGet(y + xx, x + yy) <> Color) then + begin inc(DrawDots); LandSet(y + xx, x + yy, Color); end; + if (((x + yy) and LAND_WIDTH_MASK) = 0) and (((y - xx) and LAND_HEIGHT_MASK) = 0) and (LandGet(y - xx, x + yy) <> Color) then + begin inc(DrawDots); LandSet(y - xx, x + yy, Color); end; + if (((x - yy) and LAND_WIDTH_MASK) = 0) and (((y + xx) and LAND_HEIGHT_MASK) = 0) and (LandGet(y + xx, x - yy) <> Color) then + begin inc(DrawDots); LandSet(y + xx, x - yy, Color); end; + if (((x - yy) and LAND_WIDTH_MASK) = 0) and (((y - xx) and LAND_HEIGHT_MASK) = 0) and (LandGet(y - xx, x - yy) <> Color) then + begin inc(DrawDots); LandSet(y - xx, x - yy, Color); end; end; function DrawLines(X1, Y1, X2, Y2, XX, YY: LongInt; color: Longword): Longword; @@ -1512,9 +1512,9 @@ xx:= dx - r + x; if (xx = x) and (yy = y) then s[dx + 1]:= 'X' - else if Land[yy, xx] > 255 then + else if LandGet(yy, xx) > 255 then s[dx + 1]:= 'O' - else if Land[yy, xx] > 0 then + else if LandGet(yy, xx) > 0 then s[dx + 1]:= '*' else s[dx + 1]:= '.' diff -r 73cdc306888f -r 128ace913837 hedgewars/uLandObjects.pas --- a/hedgewars/uLandObjects.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uLandObjects.pas Mon Jan 02 15:59:26 2023 +0100 @@ -25,18 +25,18 @@ procedure AddObjects(); procedure FreeLandObjects(); procedure LoadThemeConfig; -procedure BlitImageAndGenerateCollisionInfo(cpX, cpY, Width: Longword; Image: PSDL_Surface); inline; -procedure BlitImageAndGenerateCollisionInfo(cpX, cpY, Width: Longword; Image: PSDL_Surface; LandFlags: Word); inline; +procedure BlitImageAndGenerateCollisionInfo(cpX, cpY, Width: Longword; Image: PSDL_Surface); +procedure BlitImageAndGenerateCollisionInfo(cpX, cpY, Width: Longword; Image: PSDL_Surface; LandFlags: Word); procedure BlitImageAndGenerateCollisionInfo(cpX, cpY, Width: Longword; Image: PSDL_Surface; LandFlags: Word; Flip: boolean); procedure BlitOverlayAndGenerateCollisionInfo(cpX, cpY: Longword; Image: PSDL_Surface); procedure BlitImageUsingMask(cpX, cpY: Longword; Image, Mask: PSDL_Surface); procedure AddOnLandObjects(Surface: PSDL_Surface); -procedure SetLand(var LandWord: Word; Pixel: LongWord); inline; +procedure SetLand(y, x: LongInt; Pixel: LongWord); implementation uses uStore, uConsts, uConsole, uRandom, uSound , uTypes, uVariables, uDebug, uUtils - , uPhysFSLayer, uRenderUtils; + , uPhysFSLayer, uRenderUtils, uLandUtils; const MaxRects = 512; MAXOBJECTRECTS = 16; @@ -84,37 +84,37 @@ ThemeObjects: TThemeObjects; SprayObjects: TSprayObjects; -procedure SetLand(var LandWord: Word; Pixel: LongWord); inline; +procedure SetLand(y, x: LongInt; Pixel: LongWord); begin // this an if instead of masking colours to avoid confusing map creators if ((AMask and Pixel) = 0) then - LandWord:= 0 + LandSet(y, x, 0) else if (Pixel and AMask > 0) and (Pixel and RMask > 0) and (Pixel and GMask > 0) and (Pixel and BMask > 0) then // whiteish - LandWord:= lfObject + LandSet(y, x, lfObject) else if (Pixel and AMask > 0) and (Pixel and RMask = 0) and (Pixel and GMask = 0) and (Pixel and BMask = 0) then // blackish begin - LandWord:= lfBasic; + LandSet(y, x, lfBasic); disableLandBack:= false end else if (Pixel and AMask > 0) and (Pixel and RMask > 0) and (Pixel and GMask = 0) and (Pixel and BMask = 0) then // reddish - LandWord:= lfIndestructible + LandSet(y, x, lfIndestructible) else if (Pixel and AMask > 0) and (Pixel and RMask = 0) and (Pixel and GMask = 0) and (Pixel and BMask > 0) then // blueish - LandWord:= lfObject or lfIce + LandSet(y, x, lfObject or lfIce) else if (Pixel and AMask > 0) and (Pixel and RMask = 0) and (Pixel and GMask > 0) and (Pixel and BMask = 0) then // greenish - LandWord:= lfObject or lfBouncy + LandSet(y, x, lfObject or lfBouncy) end; -procedure BlitImageAndGenerateCollisionInfo(cpX, cpY, Width: Longword; Image: PSDL_Surface); inline; +procedure BlitImageAndGenerateCollisionInfo(cpX, cpY, Width: Longword; Image: PSDL_Surface); begin BlitImageAndGenerateCollisionInfo(cpX, cpY, Width, Image, 0, false); end; -procedure BlitImageAndGenerateCollisionInfo(cpX, cpY, Width: Longword; Image: PSDL_Surface; LandFlags: Word); inline; +procedure BlitImageAndGenerateCollisionInfo(cpX, cpY, Width: Longword; Image: PSDL_Surface; LandFlags: Word); begin BlitImageAndGenerateCollisionInfo(cpX, cpY, Width, Image, LandFlags, false); end; -function LerpByte(src, dst: Byte; l: LongWord): LongWord; inline; +function LerpByte(src, dst: Byte; l: LongWord): LongWord; begin LerpByte:= ((255 - l) * src + l * dst) div 255; end; @@ -173,8 +173,8 @@ end; - if ((color and AMask) <> 0) and (Land[cpY + y, cpX + x] <= lfAllObjMask) then - Land[cpY + y, cpX + x]:= lfObject or LandFlags + if ((color and AMask) <> 0) and (LandGet(cpY + y, cpX + x) <= lfAllObjMask) then + LandSet(cpY + y, cpX + x, lfObject or LandFlags) end; p:= PLongwordArray(@(p^[Image^.pitch shr 2])) end; @@ -224,8 +224,8 @@ end; pLandColor^:= color; - if Land[cpY + y, cpX + x] <= lfAllObjMask then - Land[cpY + y, cpX + x]:= lfObject + if LandGet(cpY + y, cpX + x) <= lfAllObjMask then + LandSet(cpY + y, cpX + x, lfObject) end; end; p:= PLongwordArray(@(p^[Image^.pitch shr 2])) @@ -282,8 +282,8 @@ or (LerpByte(alpha, 255, (color and AMask) shr AShift) shl AShift); end; - if (Land[cpY + y, cpX + x] <= lfAllObjMask) or (Land[cpY + y, cpX + x] and lfObject <> 0) then - SetLand(Land[cpY + y, cpX + x], mp^[x]); + if (LandGet(cpY + y, cpX + x) <= lfAllObjMask) or (LandGet(cpY + y, cpX + x) and lfObject <> 0) then + SetLand(cpY + y, cpX + x, mp^[x]); end; p:= PLongwordArray(@(p^[Image^.pitch shr 2])); @@ -341,7 +341,7 @@ begin lRes:= 0; for i:= y to Pred(y + h) do - if Land[i, x] <> 0 then + if LandGet(i, x) <> 0 then inc(lRes); CountNonZeroz:= lRes; end; @@ -425,8 +425,8 @@ begin bRes:= ((rect.y and LAND_HEIGHT_MASK) = 0) and ((by and LAND_HEIGHT_MASK) = 0) and ((tmpx and LAND_WIDTH_MASK) = 0) and ((tmpx2 and LAND_WIDTH_MASK) = 0) - and (Land[rect.y, tmpx] = Color) and (Land[by, tmpx] = Color) - and (Land[rect.y, tmpx2] = Color) and (Land[by, tmpx2] = Color); + and (LandGet(rect.y, tmpx) = Color) and (LandGet(by, tmpx) = Color) + and (LandGet(rect.y, tmpx2) = Color) and (LandGet(by, tmpx2) = Color); inc(tmpx); dec(tmpx2) end; @@ -436,8 +436,8 @@ begin bRes:= ((tmpy and LAND_HEIGHT_MASK) = 0) and ((tmpy2 and LAND_HEIGHT_MASK) = 0) and ((rect.x and LAND_WIDTH_MASK) = 0) and ((bx and LAND_WIDTH_MASK) = 0) - and (Land[tmpy, rect.x] = Color) and (Land[tmpy, bx] = Color) - and (Land[tmpy2, rect.x] = Color) and (Land[tmpy2, bx] = Color); + and (LandGet(tmpy, rect.x) = Color) and (LandGet(tmpy, bx) = Color) + and (LandGet(tmpy2, rect.x) = Color) and (LandGet(tmpy2, bx) = Color); inc(tmpy); dec(tmpy2) end; @@ -459,7 +459,7 @@ begin for tmpx := rect.x to bx do begin - if (((Land[rect.y, tmpx] and LandType) or (Land[by, tmpx] and LandType)) <> 0) then + if (((LandGet(rect.y, tmpx) and LandType) or (LandGet(by, tmpx) and LandType)) <> 0) then begin CheckLandAny := true; exit; @@ -467,7 +467,7 @@ end; for tmpy := rect.y to by do begin - if (((Land[tmpy, rect.x] and LandType) or (Land[tmpy, bx] and LandType)) <> 0) then + if (((LandGet(tmpy, rect.x) and LandType) or (LandGet(tmpy, bx) and LandType)) <> 0) then begin CheckLandAny := true; exit; diff -r 73cdc306888f -r 128ace913837 hedgewars/uLandOutline.pas --- a/hedgewars/uLandOutline.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uLandOutline.pas Mon Jan 02 15:59:26 2023 +0100 @@ -10,12 +10,11 @@ end; procedure DrawEdge(var pa: TPixAr; value: Word); -procedure FillLand(x, y: LongInt; border, value: Word); procedure BezierizeEdge(var pa: TPixAr; Delta: hwFloat); implementation -uses uLandGraphics, uDebug, uVariables, uLandTemplates; +uses uLandGraphics, uDebug, uVariables, uLandTemplates, uLandUtils; var Stack: record @@ -54,41 +53,6 @@ end end; -procedure FillLand(x, y: LongInt; border, value: Word); -var xl, xr, dir: LongInt; -begin - Stack.Count:= 0; - xl:= x - 1; - xr:= x; - Push(xl, xr, y, -1); - Push(xl, xr, y, 1); - dir:= 0; - while Stack.Count > 0 do - begin - Pop(xl, xr, y, dir); - while (xl > 0) and (Land[y, xl] <> border) and (Land[y, xl] <> value) do - dec(xl); - while (xr < LAND_WIDTH - 1) and (Land[y, xr] <> border) and (Land[y, xr] <> value) do - inc(xr); - while (xl < xr) do - begin - while (xl <= xr) and ((Land[y, xl] = border) or (Land[y, xl] = value)) do - inc(xl); - x:= xl; - while (xl <= xr) and (Land[y, xl] <> border) and (Land[y, xl] <> value) do - begin - Land[y, xl]:= value; - inc(xl) - end; - if x < xl then - begin - Push(x, Pred(xl), y, dir); - Push(x, Pred(xl), y,-dir); - end; - end; - end; -end; - procedure DrawEdge(var pa: TPixAr; value: Word); var i: LongInt; begin diff -r 73cdc306888f -r 128ace913837 hedgewars/uLandTexture.pas --- a/hedgewars/uLandTexture.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uLandTexture.pas Mon Jan 02 15:59:26 2023 +0100 @@ -30,7 +30,7 @@ procedure SetLandTexture; implementation -uses uConsts, GLunit, uTypes, uVariables, uTextures, uDebug, uRender, uUtils; +uses uConsts, GLunit, uTypes, uVariables, uTextures, uDebug, uRender, uUtils, uLandUtils; const TEXSIZE = 128; // in avoid tile borders stretch the blurry texture by 1 pixel more @@ -60,7 +60,7 @@ begin for ty:= 0 to TEXSIZE - 1 do for tx:= 0 to TEXSIZE - 1 do - tmpPixels[ty, tx]:= Land[y * TEXSIZE + ty, x * TEXSIZE + tx] or AMask; + tmpPixels[ty, tx]:= LandGet(y * TEXSIZE + ty, x * TEXSIZE + tx) or AMask; Pixels2:= @tmpPixels end; diff -r 73cdc306888f -r 128ace913837 hedgewars/uLandUtils.pas --- a/hedgewars/uLandUtils.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uLandUtils.pas Mon Jan 02 15:59:26 2023 +0100 @@ -2,11 +2,41 @@ interface procedure ResizeLand(width, height: LongWord); +procedure DisposeLand(); procedure InitWorldEdges(); +function LandGet(y, x: LongInt): Word; +procedure LandSet(y, x: LongInt; value: Word); + +procedure FillLand(x, y: LongInt; border, value: Word); + implementation uses uUtils, uConsts, uVariables, uTypes; +const LibFutureName = 'hwengine_future'; +function create_game_field(width, height: Longword): pointer; cdecl; external LibFutureName; +procedure dispose_game_field(game_field: pointer); cdecl; external LibFutureName; +function land_get(game_field: pointer; x, y: LongInt): Word; cdecl; external LibFutureName; +procedure land_set(game_field: pointer; x, y: LongInt; value: Word); cdecl; external LibFutureName; +procedure land_fill(game_field: pointer; x, y: LongInt; border, fill: Word); cdecl; external LibFutureName; + +var gameField: pointer; + +function LandGet(y, x: LongInt): Word; +begin + LandGet:= land_get(gameField, x, y) +end; + +procedure LandSet(y, x: LongInt; value: Word); +begin + land_set(gameField, x, y, value) +end; + +procedure FillLand(x, y: LongInt; border, value: Word); +begin + land_fill(gameField, x, y, border, value) +end; + procedure ResizeLand(width, height: LongWord); var potW, potH: LongInt; begin @@ -24,7 +54,7 @@ else SetLength(LandPixels, LAND_HEIGHT div 2, LAND_WIDTH div 2); - SetLength(Land, LAND_HEIGHT, LAND_WIDTH); + gameField:= create_game_field(LAND_WIDTH, LAND_HEIGHT); SetLength(LandDirty, (LAND_HEIGHT div 32), (LAND_WIDTH div 32)); // 0.5 is already approaching on unplayable if (width div 4096 >= 2) or (height div 2048 >= 2) then cMaxZoomLevel:= cMaxZoomLevel/2; @@ -33,6 +63,11 @@ initScreenSpaceVars(); end; +procedure DisposeLand(); +begin + dispose_game_field(gameField) +end; + procedure InitWorldEdges(); var cy, cx, lx, ly: LongInt; found: boolean; @@ -70,7 +105,7 @@ for cx:= 0 to lx do begin for cy:= ly downto 0 do - if Land[cy, cx] <> 0 then + if LandGet(cy, cx) <> 0 then begin leftX:= max(0, cx - cWorldEdgeDist); // break out of both loops @@ -85,7 +120,7 @@ for cx:= lx downto 0 do begin for cy:= ly downto 0 do - if Land[cy, cx] <> 0 then + if LandGet(cy, cx) <> 0 then begin rightX:= min(lx, cx + cWorldEdgeDist); // break out of both loops diff -r 73cdc306888f -r 128ace913837 hedgewars/uMisc.pas --- a/hedgewars/uMisc.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uMisc.pas Mon Jan 02 15:59:26 2023 +0100 @@ -29,10 +29,10 @@ function doSurfaceConversion(tmpsurf: PSDL_Surface): PSDL_Surface; function MakeScreenshot(filename: shortstring; k: LongInt; dump: LongWord): boolean; function GetTeamStatString(p: PTeam): shortstring; -function SDL_RectMake(x, y, width, height: LongInt): TSDL_Rect; inline; +function SDL_RectMake(x, y, width, height: LongInt): TSDL_Rect; implementation -uses uVariables, uUtils +uses uVariables, uUtils, uLandUtils {$IFDEF PNG_SCREENSHOTS}, PNGh, png {$ENDIF}; type PScreenshot = ^TScreenshot; @@ -291,15 +291,15 @@ PLongWordArray(p)^[y*LAND_WIDTH+x]:= LandPixels[LAND_HEIGHT-1-y, x] else begin - if Land[LAND_HEIGHT-1-y, x] and lfIndestructible = lfIndestructible then + if LandGet(LAND_HEIGHT-1-y, x) and lfIndestructible = lfIndestructible then PLongWordArray(p)^[y*LAND_WIDTH+x]:= (AMask or RMask) - else if Land[LAND_HEIGHT-1-y, x] and lfIce = lfIce then + else if LandGet(LAND_HEIGHT-1-y, x) and lfIce = lfIce then PLongWordArray(p)^[y*LAND_WIDTH+x]:= (AMask or BMask) - else if Land[LAND_HEIGHT-1-y, x] and lfBouncy = lfBouncy then + else if LandGet(LAND_HEIGHT-1-y, x) and lfBouncy = lfBouncy then PLongWordArray(p)^[y*LAND_WIDTH+x]:= (AMask or GMask) - else if Land[LAND_HEIGHT-1-y, x] and lfObject = lfObject then + else if LandGet(LAND_HEIGHT-1-y, x) and lfObject = lfObject then PLongWordArray(p)^[y*LAND_WIDTH+x]:= $FFFFFFFF - else if Land[LAND_HEIGHT-1-y, x] and lfBasic = lfBasic then + else if LandGet(LAND_HEIGHT-1-y, x) and lfBasic = lfBasic then PLongWordArray(p)^[y*LAND_WIDTH+x]:= AMask else PLongWordArray(p)^[y*LAND_WIDTH+x]:= 0 @@ -353,7 +353,7 @@ end; end; -function SDL_RectMake(x, y, width, height: LongInt): TSDL_Rect; inline; +function SDL_RectMake(x, y, width, height: LongInt): TSDL_Rect; begin SDL_RectMake.x:= x; SDL_RectMake.y:= y; diff -r 73cdc306888f -r 128ace913837 hedgewars/uRandom.pas --- a/hedgewars/uRandom.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uRandom.pas Mon Jan 02 15:59:26 2023 +0100 @@ -32,8 +32,8 @@ procedure SetRandomSeed(Seed: shortstring; dropAdditionalPart: boolean); // Sets the seed that should be used for generating pseudo-random values. function GetRandomf: hwFloat; // Returns a pseudo-random hwFloat. -function GetRandom(m: LongWord): LongWord; inline; // Returns a positive pseudo-random integer smaller than m. -procedure AddRandomness(r: LongWord); inline; +function GetRandom(m: LongWord): LongWord; // Returns a positive pseudo-random integer smaller than m. +procedure AddRandomness(r: LongWord); function rndSign(num: hwFloat): hwFloat; // Returns num with a random chance of having a inverted sign. @@ -42,13 +42,13 @@ var cirbuf: array[0..63] of Longword; n: byte; -procedure AddRandomness(r: LongWord); inline; +procedure AddRandomness(r: LongWord); begin n:= (n + 1) and $3F; cirbuf[n]:= cirbuf[n] xor r; end; -function GetNext: Longword; inline; +function GetNext: Longword; begin n:= (n + 1) and $3F; cirbuf[n]:= @@ -90,7 +90,7 @@ GetRandomf.QWordValue:= GetNext end; -function GetRandom(m: LongWord): LongWord; inline; +function GetRandom(m: LongWord): LongWord; begin GetNext; GetRandom:= GetNext mod m diff -r 73cdc306888f -r 128ace913837 hedgewars/uRender.pas --- a/hedgewars/uRender.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uRender.pas Mon Jan 02 15:59:26 2023 +0100 @@ -30,18 +30,18 @@ procedure DrawSprite (Sprite: TSprite; X, Y, Frame: LongInt); procedure DrawSprite (Sprite: TSprite; X, Y, FrameX, FrameY: LongInt); -procedure DrawSpriteFromRect (Sprite: TSprite; r: TSDL_Rect; X, Y, Height, Position: LongInt); inline; +procedure DrawSpriteFromRect (Sprite: TSprite; r: TSDL_Rect; X, Y, Height, Position: LongInt); procedure DrawSpriteClipped (Sprite: TSprite; X, Y, TopY, RightX, BottomY, LeftX: LongInt); procedure DrawSpriteRotated (Sprite: TSprite; X, Y, Dir: LongInt; Angle: real); procedure DrawSpriteRotatedF (Sprite: TSprite; X, Y, Frame, Dir: LongInt; Angle: real); procedure DrawSpriteRotatedFReal(Sprite: TSprite; X, Y: Real; Frame, Dir: LongInt; Angle: real); procedure DrawSpritePivotedF(Sprite: TSprite; X, Y, Frame, Dir, PivotX, PivotY: LongInt; Angle: real); -procedure DrawTexture (X, Y: LongInt; Texture: PTexture); inline; +procedure DrawTexture (X, Y: LongInt; Texture: PTexture); procedure DrawTexture (X, Y: LongInt; Texture: PTexture; Scale: GLfloat); procedure DrawTexture2 (X, Y: LongInt; Texture: PTexture; Scale, Overlap: GLfloat); -procedure DrawTextureFromRect (X, Y: LongInt; r: PSDL_Rect; SourceTexture: PTexture); inline; -procedure DrawTextureFromRect (X, Y, W, H: LongInt; r: PSDL_Rect; SourceTexture: PTexture); inline; +procedure DrawTextureFromRect (X, Y: LongInt; r: PSDL_Rect; SourceTexture: PTexture); +procedure DrawTextureFromRect (X, Y, W, H: LongInt; r: PSDL_Rect; SourceTexture: PTexture); procedure DrawTextureFromRectDir(X, Y, W, H: LongInt; r: PSDL_Rect; SourceTexture: PTexture; Dir: LongInt); procedure DrawTextureCentered (X, Top: LongInt; Source: PTexture); procedure DrawTextureF (Texture: PTexture; Scale: GLfloat; X, Y, Frame, Dir, w, h: LongInt); @@ -53,9 +53,9 @@ procedure DrawCircle (X, Y, Radius, Width: LongInt; color: LongWord); procedure DrawCircleFilled (X, Y, Radius: LongInt; r, g, b, a: Byte); -procedure DrawLine (X0, Y0, X1, Y1, Width: Single; color: LongWord); inline; +procedure DrawLine (X0, Y0, X1, Y1, Width: Single; color: LongWord); procedure DrawLine (X0, Y0, X1, Y1, Width: Single; r, g, b, a: Byte); -procedure DrawLineWrapped (X0, Y0, X1, Y1, Width: Single; goesLeft: boolean; Wraps: LongWord; color: LongWord); inline; +procedure DrawLineWrapped (X0, Y0, X1, Y1, Width: Single; goesLeft: boolean; Wraps: LongWord; color: LongWord); procedure DrawLineWrapped (X0, Y0, X1, Y1, Width: Single; goesLeft: boolean; Wraps: LongWord; r, g, b, a: Byte); procedure DrawLineOnScreen (X0, Y0, X1, Y1, Width: Single; r, g, b, a: Byte); procedure DrawRect (rect: TSDL_Rect; r, g, b, a: Byte; Fill: boolean); @@ -70,19 +70,19 @@ {$ENDIF} procedure RenderSetClearColor (r, g, b, a: real); procedure Tint (r, g, b, a: Byte); -procedure Tint (c: Longword); inline; -procedure untint(); inline; -procedure setTintAdd (enable: boolean); inline; +procedure Tint (c: Longword); +procedure untint(); +procedure setTintAdd (enable: boolean); // call this to finish the rendering of current frame procedure FinishRender(); -function isAreaOffscreen(X, Y, Width, Height: LongInt): boolean; inline; -function isCircleOffscreen(X, Y, RadiusSquared: LongInt): boolean; inline; +function isAreaOffscreen(X, Y, Width, Height: LongInt): boolean; +function isCircleOffscreen(X, Y, RadiusSquared: LongInt): boolean; // 0 => not offscreen, <0 => left/top of screen >0 => right/below of screen -function isDxAreaOffscreen(X, Width: LongInt): LongInt; inline; -function isDyAreaOffscreen(Y, Height: LongInt): LongInt; inline; +function isDxAreaOffscreen(X, Width: LongInt): LongInt; +function isDyAreaOffscreen(Y, Height: LongInt): LongInt; procedure SetScale(f: GLfloat); procedure UpdateViewLimits(); @@ -97,15 +97,15 @@ procedure EnableTexture(enable:Boolean); -procedure SetTexCoordPointer(p: Pointer;n: Integer); inline; -procedure SetVertexPointer(p: Pointer;n: Integer); inline; -procedure SetColorPointer(p: Pointer;n: Integer); inline; +procedure SetTexCoordPointer(p: Pointer;n: Integer); +procedure SetVertexPointer(p: Pointer;n: Integer); +procedure SetColorPointer(p: Pointer;n: Integer); -procedure UpdateModelviewProjection(); inline; +procedure UpdateModelviewProjection(); -procedure openglPushMatrix (); inline; -procedure openglPopMatrix (); inline; -procedure openglTranslatef (X, Y, Z: GLfloat); inline; +procedure openglPushMatrix (); +procedure openglPopMatrix (); +procedure openglTranslatef (X, Y, Z: GLfloat); implementation @@ -147,12 +147,12 @@ procedure DeleteFramebuffer(var frame, depth, tex: GLuint); forward; {$ENDIF} -function isAreaOffscreen(X, Y, Width, Height: LongInt): boolean; inline; +function isAreaOffscreen(X, Y, Width, Height: LongInt): boolean; begin isAreaOffscreen:= (isDxAreaOffscreen(X, Width) <> 0) or (isDyAreaOffscreen(Y, Height) <> 0); end; -function isCircleOffscreen(X, Y, RadiusSquared: LongInt): boolean; inline; +function isCircleOffscreen(X, Y, RadiusSquared: LongInt): boolean; var dRightX, dBottomY, dLeftX, dTopY: LongInt; begin dRightX:= (X - ViewRightX); @@ -166,14 +166,14 @@ ((dTopY > 0) and (sqr(dTopY) > RadiusSquared)) end; -function isDxAreaOffscreen(X, Width: LongInt): LongInt; inline; +function isDxAreaOffscreen(X, Width: LongInt): LongInt; begin if X > ViewRightX then exit(1); if X + Width < ViewLeftX then exit(-1); isDxAreaOffscreen:= 0; end; -function isDyAreaOffscreen(Y, Height: LongInt): LongInt; inline; +function isDyAreaOffscreen(Y, Height: LongInt): LongInt; begin if Y > ViewBottomY then exit(1); if Y + Height < ViewTopY then exit(-1); @@ -658,7 +658,7 @@ // disable/lower perspective correction (will not need it anyway) end; -procedure openglLoadIdentity(); inline; +procedure openglLoadIdentity(); begin {$IFDEF GL2} hglLoadIdentity(); @@ -667,7 +667,7 @@ {$ENDIF} end; -procedure openglTranslProjMatrix(X, Y, Z: GLfloat); inline; +procedure openglTranslProjMatrix(X, Y, Z: GLfloat); begin {$IFDEF GL2} hglMatrixMode(MATRIX_PROJECTION); @@ -680,7 +680,7 @@ {$ENDIF} end; -procedure openglPushMatrix(); inline; +procedure openglPushMatrix(); begin {$IFDEF GL2} hglPushMatrix(); @@ -689,7 +689,7 @@ {$ENDIF} end; -procedure openglPopMatrix(); inline; +procedure openglPopMatrix(); begin {$IFDEF GL2} hglPopMatrix(); @@ -698,7 +698,7 @@ {$ENDIF} end; -procedure openglTranslatef(X, Y, Z: GLfloat); inline; +procedure openglTranslatef(X, Y, Z: GLfloat); begin {$IFDEF GL2} hglTranslatef(X, Y, Z); @@ -707,7 +707,7 @@ {$ENDIF} end; -procedure openglScalef(ScaleX, ScaleY, ScaleZ: GLfloat); inline; +procedure openglScalef(ScaleX, ScaleY, ScaleZ: GLfloat); begin {$IFDEF GL2} hglScalef(ScaleX, ScaleY, ScaleZ); @@ -716,7 +716,7 @@ {$ENDIF} end; -procedure openglRotatef(RotX, RotY, RotZ: GLfloat; dir: LongInt); inline; +procedure openglRotatef(RotX, RotY, RotZ: GLfloat; dir: LongInt); { workaround for pascal bug https://bugs.freepascal.org/view.php?id=27222 } var tmpdir: LongInt; begin @@ -728,7 +728,7 @@ {$ENDIF} end; -procedure openglUseColorOnly(b :boolean); inline; +procedure openglUseColorOnly(b :boolean); begin if b then begin @@ -755,7 +755,7 @@ EnableTexture(not b); end; -procedure UpdateModelviewProjection(); inline; +procedure UpdateModelviewProjection(); {$IFDEF GL2} var mvp: TMatrix4x4f; @@ -770,7 +770,7 @@ {$ENDIF} end; -procedure SetTexCoordPointer(p: Pointer; n: Integer); inline; +procedure SetTexCoordPointer(p: Pointer; n: Integer); begin {$IFDEF GL2} glBindBuffer(GL_ARRAY_BUFFER, tBuffer); @@ -786,7 +786,7 @@ {$ENDIF} end; -procedure SetVertexPointer(p: Pointer; n: Integer); inline; +procedure SetVertexPointer(p: Pointer; n: Integer); begin {$IFDEF GL2} glBindBuffer(GL_ARRAY_BUFFER, vBuffer); @@ -802,7 +802,7 @@ {$ENDIF} end; -procedure SetColorPointer(p: Pointer; n: Integer); inline; +procedure SetColorPointer(p: Pointer; n: Integer); begin {$IFDEF GL2} glBindBuffer(GL_ARRAY_BUFFER, cBuffer); @@ -887,19 +887,19 @@ UpdateModelviewProjection; end; -procedure DrawSpriteFromRect(Sprite: TSprite; r: TSDL_Rect; X, Y, Height, Position: LongInt); inline; +procedure DrawSpriteFromRect(Sprite: TSprite; r: TSDL_Rect; X, Y, Height, Position: LongInt); begin r.y:= r.y + Height * Position; r.h:= Height; DrawTextureFromRect(X, Y, @r, SpritesData[Sprite].Texture) end; -procedure DrawTextureFromRect(X, Y: LongInt; r: PSDL_Rect; SourceTexture: PTexture); inline; +procedure DrawTextureFromRect(X, Y: LongInt; r: PSDL_Rect; SourceTexture: PTexture); begin DrawTextureFromRectDir(X, Y, r^.w, r^.h, r, SourceTexture, 1) end; -procedure DrawTextureFromRect(X, Y, W, H: LongInt; r: PSDL_Rect; SourceTexture: PTexture); inline; +procedure DrawTextureFromRect(X, Y, W, H: LongInt; r: PSDL_Rect; SourceTexture: PTexture); begin DrawTextureFromRectDir(X, Y, W, H, r, SourceTexture, 1) end; @@ -967,7 +967,7 @@ end; -procedure DrawTexture(X, Y: LongInt; Texture: PTexture); inline; +procedure DrawTexture(X, Y: LongInt; Texture: PTexture); begin DrawTexture(X, Y, Texture, 1.0); end; @@ -1375,7 +1375,7 @@ end; // Same as below, but with color as LongWord -procedure DrawLine(X0, Y0, X1, Y1, Width: Single; color: LongWord); inline; +procedure DrawLine(X0, Y0, X1, Y1, Width: Single; color: LongWord); begin DrawLine(X0, Y0, X1, Y1, Width, (color shr 24) and $FF, (color shr 16) and $FF, (color shr 8) and $FF, color and $FF) end; @@ -1400,7 +1400,7 @@ end; // Same as below, but with color as a longword -procedure DrawLineWrapped(X0, Y0, X1, Y1, Width: Single; goesLeft: boolean; Wraps: LongWord; color: LongWord); inline; +procedure DrawLineWrapped(X0, Y0, X1, Y1, Width: Single; goesLeft: boolean; Wraps: LongWord; color: LongWord); begin DrawLineWrapped(X0, Y0, X1, Y1, Width, goesLeft, Wraps, (color shr 24) and $FF, (color shr 16) and $FF, (color shr 8) and $FF, color and $FF); end; @@ -2073,7 +2073,7 @@ end; -procedure openglTint(r, g, b, a: Byte); inline; +procedure openglTint(r, g, b, a: Byte); {$IFDEF GL2} const scale:Real = 1.0/255.0; @@ -2109,20 +2109,20 @@ LastTint:= nc; end; -procedure Tint(c: Longword); inline; +procedure Tint(c: Longword); begin if c = LastTint then exit; Tint(((c shr 24) and $FF), ((c shr 16) and $FF), (c shr 8) and $FF, (c and $FF)) end; -procedure untint(); inline; +procedure untint(); begin if cWhiteColor = LastTint then exit; openglTint($FF, $FF, $FF, $FF); LastTint:= cWhiteColor; end; -procedure setTintAdd(enable: boolean); inline; +procedure setTintAdd(enable: boolean); begin {$IFDEF GL2} if enable then diff -r 73cdc306888f -r 128ace913837 hedgewars/uRenderUtils.pas --- a/hedgewars/uRenderUtils.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uRenderUtils.pas Mon Jan 02 15:59:26 2023 +0100 @@ -26,10 +26,10 @@ procedure flipSurface(Surface: PSDL_Surface; Vertical: Boolean); procedure copyRotatedSurface(src, dest: PSDL_Surface); // this is necessary since width/height are read only in SDL -procedure copyToXY(src, dest: PSDL_Surface; destX, destY: LongInt); inline; +procedure copyToXY(src, dest: PSDL_Surface; destX, destY: LongInt); procedure copyToXYFromRect(src, dest: PSDL_Surface; srcX, srcY, srcW, srcH, destX, destY: LongInt); -procedure DrawSprite2Surf(sprite: TSprite; dest: PSDL_Surface; x,y: LongInt); inline; +procedure DrawSprite2Surf(sprite: TSprite; dest: PSDL_Surface; x,y: LongInt); procedure DrawSpriteFrame2Surf(sprite: TSprite; dest: PSDL_Surface; x,y: LongInt; frame: LongInt); procedure DrawLine2Surf(dest: PSDL_Surface; x0,y0,x1,y1:LongInt; r,g,b: byte); procedure DrawRoundRect(rect: PSDL_Rect; BorderColor, FillColor: Longword; Surface: PSDL_Surface; Clear: boolean); @@ -38,7 +38,7 @@ function RenderStringTexLim(s: ansistring; Color: Longword; font: THWFont; maxLength: LongWord): PTexture; function RenderSpeechBubbleTex(s: ansistring; SpeechType: Longword; font: THWFont): PTexture; -function IsTooDarkToRead(TextColor: Longword): boolean; inline; +function IsTooDarkToRead(TextColor: Longword): boolean; implementation uses uVariables, uConsts, uTextures, SysUtils, uUtils, uDebug; @@ -78,7 +78,7 @@ WriteInRoundRect:= WriteInRoundRect(Surface, X, Y, Color, Font, s, 0); end;*) -function IsTooDarkToRead(TextColor: LongWord): boolean; inline; +function IsTooDarkToRead(TextColor: LongWord): boolean; var clr: TSDL_Color; begin clr.r:= (TextColor shr 16) and $FF; @@ -157,7 +157,7 @@ SDL_UnlockSurface(Surface); end; -procedure copyToXY(src, dest: PSDL_Surface; destX, destY: LongInt); inline; +procedure copyToXY(src, dest: PSDL_Surface; destX, destY: LongInt); begin // copy from complete src copyToXYFromRect(src, dest, 0, 0, src^.w, src^.h, destX, destY); @@ -233,7 +233,7 @@ SDL_UnlockSurface(dest); end; -procedure DrawSprite2Surf(sprite: TSprite; dest: PSDL_Surface; x,y: LongInt); inline; +procedure DrawSprite2Surf(sprite: TSprite; dest: PSDL_Surface; x,y: LongInt); begin DrawSpriteFrame2Surf(sprite, dest, x, y, 0); end; diff -r 73cdc306888f -r 128ace913837 hedgewars/uScript.pas --- a/hedgewars/uScript.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uScript.pas Mon Jan 02 15:59:26 2023 +0100 @@ -184,14 +184,14 @@ LuaError('-- SYNTAX: ' + call + ' ( ' + paramsyntax + ' )'); end; -procedure LuaParameterCountError(expected, call, paramsyntax: shortstring; wrongcount: LongInt); inline; +procedure LuaParameterCountError(expected, call, paramsyntax: shortstring; wrongcount: LongInt); begin // TODO: i18n? LuaCallError('Wrong number of parameters! (is: ' + inttostr(wrongcount) + ', should be: '+ expected + ')', call, paramsyntax); end; // compare with allowed count -function CheckLuaParamCount(L : Plua_State; count: LongInt; call, paramsyntax: shortstring): boolean; inline; +function CheckLuaParamCount(L : Plua_State; count: LongInt; call, paramsyntax: shortstring): boolean; var c: LongInt; begin c:= lua_gettop(L); @@ -205,7 +205,7 @@ end; // check if is either count1 or count2 -function CheckAndFetchParamCount(L : Plua_State; count1, count2: LongInt; call, paramsyntax: shortstring; out actual: LongInt): boolean; inline; +function CheckAndFetchParamCount(L : Plua_State; count1, count2: LongInt; call, paramsyntax: shortstring; out actual: LongInt): boolean; begin actual:= lua_gettop(L); if (actual <> count1) and (actual <> count2) then @@ -218,7 +218,7 @@ end; // check if is in range of count1 and count2 -function CheckAndFetchParamCountRange(L : Plua_State; count1, count2: LongInt; call, paramsyntax: shortstring; out actual: LongInt): boolean; inline; +function CheckAndFetchParamCountRange(L : Plua_State; count1, count2: LongInt; call, paramsyntax: shortstring; out actual: LongInt): boolean; begin actual:= lua_gettop(L); if (actual < count1) or (actual > count2) then @@ -231,7 +231,7 @@ end; // check if is same or higher as minCount -function CheckAndFetchLuaParamMinCount(L : Plua_State; minCount: LongInt; call, paramsyntax: shortstring; out actual: LongInt): boolean; inline; +function CheckAndFetchLuaParamMinCount(L : Plua_State; minCount: LongInt; call, paramsyntax: shortstring; out actual: LongInt): boolean; begin actual:= lua_gettop(L); if (actual < minCount) then @@ -243,7 +243,7 @@ CheckAndFetchLuaParamMinCount:= true; end; -function LuaToGearTypeOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline; +function LuaToGearTypeOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; begin if lua_isnoneornil(L, i) then i:= -1 else i:= Trunc(lua_tonumber(L, i)); @@ -256,7 +256,7 @@ LuaToGearTypeOrd:= i; end; -function LuaToVisualGearTypeOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline; +function LuaToVisualGearTypeOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; begin if lua_isnoneornil(L, i) then i:= -1 else i:= Trunc(lua_tonumber(L, i)); @@ -269,7 +269,7 @@ LuaToVisualGearTypeOrd:= i; end; -function LuaToAmmoTypeOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline; +function LuaToAmmoTypeOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; begin if lua_isnoneornil(L, i) then i:= -1 else i:= Trunc(lua_tonumber(L, i)); @@ -282,7 +282,7 @@ LuaToAmmoTypeOrd:= i; end; -function LuaToStatInfoTypeOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline; +function LuaToStatInfoTypeOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; begin if lua_isnoneornil(L, i) then i:= -1 else i:= Trunc(lua_tonumber(L, i)); @@ -295,7 +295,7 @@ LuaToStatInfoTypeOrd:= i; end; -function LuaToSoundOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline; +function LuaToSoundOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; begin if lua_isnoneornil(L, i) then i:= -1 else i:= Trunc(lua_tonumber(L, i)); @@ -308,7 +308,7 @@ LuaToSoundOrd:= i; end; -function LuaToHogEffectOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline; +function LuaToHogEffectOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; begin if lua_isnoneornil(L, i) then i:= -1 else i:= Trunc(lua_tonumber(L, i)); @@ -321,7 +321,7 @@ LuaToHogEffectOrd:= i; end; -function LuaToCapGroupOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline; +function LuaToCapGroupOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; begin if lua_isnoneornil(L, i) then i:= -1 else i:= Trunc(lua_tonumber(L, i)); @@ -334,7 +334,7 @@ LuaToCapGroupOrd:= i; end; -function LuaToSpriteOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline; +function LuaToSpriteOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; begin if lua_isnoneornil(L, i) then i:= -1 else i:= Trunc(lua_tonumber(L, i)); @@ -347,7 +347,7 @@ LuaToSpriteOrd:= i; end; -function LuaToMapGenOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline; +function LuaToMapGenOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; begin if lua_isnoneornil(L, i) then i:= -1 else i:= Trunc(lua_tonumber(L, i)); diff -r 73cdc306888f -r 128ace913837 hedgewars/uStore.pas --- a/hedgewars/uStore.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uStore.pas Mon Jan 02 15:59:26 2023 +0100 @@ -59,7 +59,7 @@ procedure InitOffscreenOpenGL; {$ENDIF} -procedure WarpMouse(x, y: Word); inline; +procedure WarpMouse(x, y: Word); procedure SwapBuffers; {$IFDEF USE_VIDEO_RECORDING}cdecl{$ELSE}inline{$ENDIF}; procedure SetSkyColor(r, g, b: real); @@ -1363,7 +1363,7 @@ // for sdl2 we provide a SDL_WarpMouse() which just calls this function // this has the advantage of reducing 'uses' and 'ifdef' statements // (SDLwindow is a private member of this module) -procedure WarpMouse(x, y: Word); inline; +procedure WarpMouse(x, y: Word); begin SDL_WarpMouseInWindow(SDLwindow, x, y); end; diff -r 73cdc306888f -r 128ace913837 hedgewars/uTouch.pas --- a/hedgewars/uTouch.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uTouch.pas Mon Jan 02 15:59:26 2023 +0100 @@ -613,7 +613,7 @@ fingerHasMoved := trunc(sqrt(sqr(finger.X-finger.historicalX) + sqr(finger.y-finger.historicalY))) > 30; end; -function calculateDelta(finger1, finger2: TTouch_Data): LongInt; inline; +function calculateDelta(finger1, finger2: TTouch_Data): LongInt; begin calculateDelta := Round(sqrt(sqr(finger2.x-finger1.x) + sqr(finger2.y-finger1.y))); end; diff -r 73cdc306888f -r 128ace913837 hedgewars/uTypes.pas --- a/hedgewars/uTypes.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uTypes.pas Mon Jan 02 15:59:26 2023 +0100 @@ -99,7 +99,7 @@ // Gears that interact with other Gears and/or Land // first row of gears ( nil) and (cWindSpeedf<0) then exit(Lsprite) @@ -133,7 +133,7 @@ exit(sprite); end; -function GetSpriteData(sprite, SDsprite: TSprite): PSpriteData; inline; +function GetSpriteData(sprite, SDsprite: TSprite): PSpriteData; begin exit(@SpritesData[GetSprite(sprite, SDsprite)]); end; @@ -498,7 +498,7 @@ end; end; -procedure AddFlake; inline; +procedure AddFlake; begin AddVisualGear(cLeftScreenBorder + random(cScreenSpace), LAND_HEIGHT-cCloudOffset+ random(cCloudOffset), vgtFlake); end; diff -r 73cdc306888f -r 128ace913837 hedgewars/uVisualGearsHandlers.pas --- a/hedgewars/uVisualGearsHandlers.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uVisualGearsHandlers.pas Mon Jan 02 15:59:26 2023 +0100 @@ -71,7 +71,7 @@ procedure doStepSmoothWindBar(Gear: PVisualGear; Steps: Longword); procedure doStepStraightShot(Gear: PVisualGear; Steps: Longword); -function isSorterActive: boolean; inline; +function isSorterActive: boolean; procedure initModule; implementation @@ -573,7 +573,7 @@ end; currsorter: PVisualGear = nil; -function isSorterActive: boolean; inline; +function isSorterActive: boolean; begin isSorterActive:= currsorter <> nil end; diff -r 73cdc306888f -r 128ace913837 hedgewars/uVisualGearsList.pas --- a/hedgewars/uVisualGearsList.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uVisualGearsList.pas Mon Jan 02 15:59:26 2023 +0100 @@ -22,9 +22,9 @@ interface uses uTypes; -function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear; inline; -function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; State: LongWord): PVisualGear; inline; -function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; State: LongWord; Critical: Boolean): PVisualGear; inline; +function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear; +function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; State: LongWord): PVisualGear; +function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; State: LongWord; Critical: Boolean): PVisualGear; function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; State: LongWord; Critical: Boolean; Layer: LongInt): PVisualGear; procedure DeleteVisualGear(Gear: PVisualGear); function VisualGearByUID(uid : Longword) : PVisualGear; @@ -39,7 +39,7 @@ implementation uses uCollisions, uFloat, uVariables, uConsts, uTextures, uVisualGearsHandlers, uScript; -function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear; inline; +function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear; begin // adjust some visual gear types if underwater if CheckCoordInWater(X, Y) and ((Kind = vgtBeeTrace) or (Kind = vgtSmokeTrace) or (Kind = vgtEvilTrace)) then @@ -48,12 +48,12 @@ AddVisualGear:= AddVisualGear(X, Y, Kind, 0, false, -1); end; -function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; State: LongWord): PVisualGear; inline; +function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; State: LongWord): PVisualGear; begin AddVisualGear:= AddVisualGear(X, Y, Kind, State, false, -1); end; -function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; State: LongWord; Critical: Boolean): PVisualGear; inline; +function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; State: LongWord; Critical: Boolean): PVisualGear; begin AddVisualGear:= AddVisualGear(X, Y, Kind, State, Critical, -1); end; diff -r 73cdc306888f -r 128ace913837 hedgewars/uWorld.pas --- a/hedgewars/uWorld.pas Tue Dec 13 21:21:55 2022 +0100 +++ b/hedgewars/uWorld.pas Mon Jan 02 15:59:26 2023 +0100 @@ -1165,14 +1165,14 @@ var preShiftWorldDx: LongInt; -procedure ShiftWorld(Dir: LongInt); inline; +procedure ShiftWorld(Dir: LongInt); begin preShiftWorldDx:= WorldDx; Dir := Dir * LongInt(playWidth); WorldDx:= WorldDx + Dir; end; -procedure UnshiftWorld(); inline; +procedure UnshiftWorld(); begin WorldDx:= preShiftWorldDx; end; diff -r 73cdc306888f -r 128ace913837 rust/land2d/Cargo.toml --- a/rust/land2d/Cargo.toml Tue Dec 13 21:21:55 2022 +0100 +++ b/rust/land2d/Cargo.toml Mon Jan 02 15:59:26 2023 +0100 @@ -2,7 +2,7 @@ name = "land2d" version = "0.1.0" authors = ["Andrey Korotaev "] -edition = "2018" +edition = "2021" [dependencies] vec2d = { path = "../vec2d" } diff -r 73cdc306888f -r 128ace913837 rust/lib-hwengine-future/Cargo.toml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/lib-hwengine-future/Cargo.toml Mon Jan 02 15:59:26 2023 +0100 @@ -0,0 +1,15 @@ +[package] +name = "lib-hwengine-future" +version = "0.1.0" +edition = "2021" +authors = ["Andrey Korotaev "] + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +land2d = { path = "../land2d" } +integral-geometry = { path = "../integral-geometry" } + +[lib] +name = "hwengine_future" +crate-type = ["dylib"] diff -r 73cdc306888f -r 128ace913837 rust/lib-hwengine-future/src/lib.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/lib-hwengine-future/src/lib.rs Mon Jan 02 15:59:26 2023 +0100 @@ -0,0 +1,56 @@ +use integral_geometry::{Point, Size}; +use land2d; + +#[repr(C)] +pub struct GameField { + collision: land2d::Land2D, + pixels: land2d::Land2D, +} + +#[no_mangle] +pub extern "C" fn create_game_field(width: u32, height: u32) -> *mut GameField { + let game_field = Box::new(GameField { + collision: land2d::Land2D::new(Size::new(width as usize, height as usize), 0), + pixels: land2d::Land2D::new(Size::new(width as usize, height as usize), 0), + }); + + Box::leak(game_field) +} + +#[no_mangle] +pub extern "C" fn land_get(game_field: &mut GameField, x: i32, y: i32) -> u16 { + game_field.collision.map(y, x, |p| *p) +} + +#[no_mangle] +pub extern "C" fn land_fill( + game_field: &mut GameField, + x: i32, + y: i32, + border_value: u16, + fill_value: u16, +) { + game_field + .collision + .fill(Point::new(x, y), border_value, fill_value) +} + +#[no_mangle] +pub extern "C" fn land_set(game_field: &mut GameField, x: i32, y: i32, value: u16) { + game_field.collision.map(y, x, |p| *p = value); +} + +#[no_mangle] +pub extern "C" fn land_pixel_get(game_field: &mut GameField, x: i32, y: i32) -> u32 { + game_field.pixels.map(y, x, |p| *p) +} + +#[no_mangle] +pub extern "C" fn land_pixel_set(game_field: &mut GameField, x: i32, y: i32, value: u32) { + game_field.pixels.map(y, x, |p| *p = value); +} + +#[no_mangle] +pub extern "C" fn dispose_game_field(game_field: *mut GameField) { + unsafe { drop(Box::from_raw(game_field)) }; +}