X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;ds=inline;f=src%2Fgame%2Fg_gfx.pas;h=c84ba47eda80a1e2c6097a134a78d5ba0929a212;hb=b4c47ccb9cb4d0773bd7da3f9614b6395c65db5a;hp=37036278d08175ca4dbf3a93c88e724ac32995f7;hpb=e80d55312d7d3bacaa3d642a83cda0c8a1026a97;p=d2df-sdl.git diff --git a/src/game/g_gfx.pas b/src/game/g_gfx.pas index 3703627..c84ba47 100644 --- a/src/game/g_gfx.pas +++ b/src/game/g_gfx.pas @@ -14,13 +14,12 @@ * along with this program. If not, see . *) {$INCLUDE ../shared/a_modes.inc} -{.$DEFINE HAS_COLLIDE_BITMAP} unit g_gfx; interface uses - g_textures; + e_log, g_textures; const BLOOD_NORMAL = 0; @@ -60,10 +59,9 @@ procedure g_GFX_Update(); procedure g_GFX_Draw(); -{$IF DEFINED(HAS_COLLIDE_BITMAP)} var - gCollideMap: Array of Array of Byte; -{$ENDIF} + gpart_dbg_enabled: Boolean = true; + gpart_dbg_phys_enabled: Boolean = true; implementation @@ -74,6 +72,7 @@ uses g_game, g_language, g_net; type + PParticle = ^TParticle; TParticle = record X, Y: Integer; VelX, VelY: Single; @@ -84,6 +83,8 @@ type State: Byte; ParticleType: Byte; offsetX, offsetY: ShortInt; + // for bubbles + liquidTopY: Integer; // don't float higher than this end; TOnceAnim = record @@ -102,18 +103,70 @@ const STATE_STICK = 2; var - Particles: Array of TParticle; - OnceAnims: Array of TOnceAnim; + Particles: array of TParticle; + OnceAnims: array of TOnceAnim; MaxParticles: Integer; CurrentParticle: Integer; + +function isBlockedAt (x, y: Integer): Boolean; inline; +begin + if not gpart_dbg_phys_enabled then begin result := false; exit; end; + result := g_Map_HasAnyPanelAtPoint(x, y, (PANEL_WALL or PANEL_CLOSEDOOR or PANEL_STEP)); +end; + +// ??? +function isWallAt (x, y: Integer): Boolean; inline; +begin + if not gpart_dbg_phys_enabled then begin result := false; exit; end; + result := g_Map_HasAnyPanelAtPoint(x, y, (PANEL_WALL or PANEL_STEP)); +end; + +function isLiftUpAt (x, y: Integer): Boolean; inline; +begin + if not gpart_dbg_phys_enabled then begin result := false; exit; end; + result := g_Map_HasAnyPanelAtPoint(x, y, PANEL_LIFTUP); +end; + +function isLiftDownAt (x, y: Integer): Boolean; inline; +begin + if not gpart_dbg_phys_enabled then begin result := false; exit; end; + result := g_Map_HasAnyPanelAtPoint(x, y, PANEL_LIFTDOWN); +end; + +function isLiftLeftAt (x, y: Integer): Boolean; inline; +begin + if not gpart_dbg_phys_enabled then begin result := false; exit; end; + result := g_Map_HasAnyPanelAtPoint(x, y, PANEL_LIFTLEFT); +end; + +function isLiftRightAt (x, y: Integer): Boolean; inline; +begin + if not gpart_dbg_phys_enabled then begin result := false; exit; end; + result := g_Map_HasAnyPanelAtPoint(x, y, PANEL_LIFTRIGHT); +end; + +function isLiquidAt (x, y: Integer): Boolean; inline; +begin + if not gpart_dbg_phys_enabled then begin result := false; exit; end; + result := g_Map_HasAnyPanelAtPoint(x, y, (PANEL_WATER or PANEL_ACID1 or PANEL_ACID2)); +end; + +function isAnythingAt (x, y: Integer): Boolean; inline; +begin + if not gpart_dbg_phys_enabled then begin result := false; exit; end; + result := g_Map_HasAnyPanelAtPoint(x, y, (PANEL_WALL or PANEL_CLOSEDOOR or PANEL_OPENDOOR or PANEL_WATER or PANEL_ACID1 or PANEL_ACID2 or PANEL_STEP or PANEL_LIFTUP or PANEL_LIFTDOWN or PANEL_LIFTLEFT or PANEL_LIFTRIGHT)); +end; + + procedure g_Mark(x, y, Width, Height: Integer; t: Byte; st: Boolean); -{$IF DEFINED(HAS_COLLIDE_BITMAP)} +{$IF not DEFINED(HAS_COLLIDE_BITMAP)} +begin +end; +{$ELSE} var yy, y2, xx, x2: Integer; -{$ENDIF} begin -{$IF DEFINED(HAS_COLLIDE_BITMAP)} if x < 0 then begin Width := Width + x; @@ -158,16 +211,15 @@ begin for xx := x to x2 do gCollideMap[yy][xx] := gCollideMap[yy][xx] and t; end; -{$ENDIF} end; +{$ENDIF} + -procedure CreateCollideMap(); {$IF DEFINED(HAS_COLLIDE_BITMAP)} +procedure CreateCollideMap(); var a: Integer; -{$ENDIF} begin -{$IF DEFINED(HAS_COLLIDE_BITMAP)} g_Game_SetLoadingText(_lc[I_LOAD_COLLIDE_MAP]+' 1/6', 0, False); SetLength(gCollideMap, gMapInfo.Height+1); for a := 0 to High(gCollideMap) do @@ -237,20 +289,23 @@ begin g_Mark(X, Y, Width, Height, MARK_WALL, True); end; end; -{$ENDIF} end; +{$ENDIF} + procedure g_GFX_Init(); begin - CreateCollideMap(); + //CreateCollideMap(); end; + procedure g_GFX_Free(); var a: Integer; begin Particles := nil; SetLength(Particles, MaxParticles); + for a := 0 to High(Particles) do Particles[a].State := STATE_FREE; CurrentParticle := 0; if OnceAnims <> nil then @@ -260,51 +315,35 @@ begin OnceAnims := nil; end; - - {$IF DEFINED(HAS_COLLIDE_BITMAP)} - gCollideMap := nil; - {$ENDIF} end; -{$IF DEFINED(HAS_COLLIDE_BITMAP)} -procedure CorrectOffsets(id: Integer); +{ +procedure CorrectOffsets(id: Integer); inline; +var + part: PParticle; begin - with Particles[id] do - begin - if (X >= 0) and (Y > 0) and - (Y < Length(gCollideMap)) and (X < Length(gCollideMap[0])) and - (ByteBool(gCollideMap[Y-1, X] and MARK_BLOCKED)) then - offsetY := 1 // Ñòåíà ñâåðõó - else - offsetY := 0; - - if (X > 0) and (Y >= 0) and - (Y < Length(gCollideMap)) and (X < Length(gCollideMap[0])) and - (ByteBool(gCollideMap[Y, X-1] and MARK_BLOCKED)) then - offsetX := 1 // Ñòåíà ñëåâà - else - offsetX := 0; - end; + part := @Particles[id]; + part.offsetX := 0; + part.offsetY := 0; + // check for upper wall + if isBlockedAt(part.X, part.Y-1) then part.offsetY := 1; + // check for left wall + if isBlockedAt(part.X-1, part.Y) then part.offsetX := 1; end; -{$ENDIF} +} -procedure g_GFX_SparkVel(fX, fY: Integer; Count: Word; VX, VY: Integer; DevX, DevY: Byte); -{$IF DEFINED(HAS_COLLIDE_BITMAP)} +procedure g_GFX_SparkVel (fX, fY: Integer; Count: Word; VX, VY: Integer; DevX, DevY: Byte); var a: Integer; DevX1, DevX2, DevY1, DevY2: Byte; l: Integer; -{$ENDIF} begin -{$IF DEFINED(HAS_COLLIDE_BITMAP)} l := Length(Particles); - if l = 0 then - Exit; - if Count > l then - Count := l; + if l = 0 then exit; + if Count > l then Count := l; DevX1 := DevX div 2; DevX2 := DevX + 1; @@ -340,7 +379,7 @@ begin LiveTime := 30+Random(60); ParticleType := PARTICLE_SPARK; - CorrectOffsets(CurrentParticle); + {CorrectOffsets(CurrentParticle);} end; if CurrentParticle+2 > MaxParticles then @@ -348,12 +387,11 @@ begin else CurrentParticle := CurrentParticle+1; end; -{$ENDIF} end; + procedure g_GFX_Blood(fX, fY: Integer; Count: Word; vx, vy: Integer; DevX, DevY: Word; CR, CG, CB: Byte; Kind: Byte = BLOOD_NORMAL); -{$IF DEFINED(HAS_COLLIDE_BITMAP)} var a: Integer; DevX1, DevX2, @@ -361,9 +399,7 @@ var l: Integer; CRnd: Byte; CC: SmallInt; -{$ENDIF} begin -{$IF DEFINED(HAS_COLLIDE_BITMAP)} if Kind = BLOOD_SPARKS then begin g_GFX_SparkVel(fX, fY, 2 + Random(2), -VX div 2, -VY div 2, DevX, DevY); @@ -387,10 +423,13 @@ begin X := fX - DevX1 + Random(DevX2); Y := fY - DevY1 + Random(DevY2); + { if (X < 0) or (X > gMapInfo.Width-1) or (Y < 0) or (Y > gMapInfo.Height-1) or ByteBool(gCollideMap[Y, X] and MARK_WALL) then Continue; + } + if isWallAt(X, Y) then continue; VelX := vx + (Random-Random)*3; VelY := vy + (Random-Random)*3; @@ -437,7 +476,7 @@ begin LiveTime := 120+Random(40); ParticleType := PARTICLE_BLOOD; - CorrectOffsets(CurrentParticle); + {CorrectOffsets(CurrentParticle);} end; if CurrentParticle >= MaxParticles-1 then @@ -445,11 +484,10 @@ begin else CurrentParticle := CurrentParticle+1; end; -{$ENDIF} end; + procedure g_GFX_Spark(fX, fY: Integer; Count: Word; Angle: SmallInt; DevX, DevY: Byte); -{$IF DEFINED(HAS_COLLIDE_BITMAP)} var a: Integer; b: Single; @@ -457,9 +495,7 @@ var DevY1, DevY2: Byte; BaseVelX, BaseVelY: Single; l: Integer; -{$ENDIF} begin -{$IF DEFINED(HAS_COLLIDE_BITMAP)} l := Length(Particles); if l = 0 then Exit; @@ -502,7 +538,7 @@ begin LiveTime := 30+Random(60); ParticleType := PARTICLE_SPARK; - CorrectOffsets(CurrentParticle); + {CorrectOffsets(CurrentParticle);} end; if CurrentParticle+2 > MaxParticles then @@ -510,19 +546,15 @@ begin else CurrentParticle := CurrentParticle+1; end; -{$ENDIF} end; procedure g_GFX_Water(fX, fY: Integer; Count: Word; fVelX, fVelY: Single; DevX, DevY, Color: Byte); -{$IF DEFINED(HAS_COLLIDE_BITMAP)} var a: Integer; DevX1, DevX2, DevY1, DevY2: Byte; l: Integer; -{$ENDIF} begin -{$IF DEFINED(HAS_COLLIDE_BITMAP)} l := Length(Particles); if l = 0 then Exit; @@ -588,7 +620,7 @@ begin LiveTime := 60+Random(60); ParticleType := PARTICLE_WATER; - CorrectOffsets(CurrentParticle); + {CorrectOffsets(CurrentParticle);} end; if CurrentParticle+2 > MaxParticles then @@ -596,17 +628,13 @@ begin else CurrentParticle := CurrentParticle+1; end; -{$ENDIF} end; procedure g_GFX_SimpleWater(fX, fY: Integer; Count: Word; fVelX, fVelY: Single; DefColor, CR, CG, CB: Byte); -{$IF DEFINED(HAS_COLLIDE_BITMAP)} var a: Integer; l: Integer; -{$ENDIF} begin -{$IF DEFINED(HAS_COLLIDE_BITMAP)} l := Length(Particles); if l = 0 then Exit; @@ -677,7 +705,7 @@ begin LiveTime := 60+Random(60); ParticleType := PARTICLE_WATER; - CorrectOffsets(CurrentParticle); + {CorrectOffsets(CurrentParticle);} end; if CurrentParticle+2 > MaxParticles then @@ -685,19 +713,16 @@ begin else CurrentParticle := CurrentParticle+1; end; -{$ENDIF} end; + procedure g_GFX_Bubbles(fX, fY: Integer; Count: Word; DevX, DevY: Byte); -{$IF DEFINED(HAS_COLLIDE_BITMAP)} var a: Integer; DevX1, DevX2, DevY1, DevY2: Byte; - l: Integer; -{$ENDIF} + l, liquidx: Integer; begin -{$IF DEFINED(HAS_COLLIDE_BITMAP)} l := Length(Particles); if l = 0 then Exit; @@ -720,8 +745,15 @@ begin (Y >= gMapInfo.Height) or (Y <= 0) then Continue; - if not ByteBool(gCollideMap[Y, X] and MARK_LIQUID) then + (* + // don't spawn bubbles outside of the liquid + if not isLiquidAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIQUID)} then Continue; + *) + + // trace liquid, so we'll know where it ends; do it in 8px steps for speed + // tracer will return `false` if we started outside of the liquid + if not g_Map_TraceLiquid(X, Y, 0, -8, liquidx, liquidTopY) then continue; VelX := 0; VelY := -1-Random; @@ -738,7 +770,7 @@ begin LiveTime := 65535; ParticleType := PARTICLE_BUBBLES; - CorrectOffsets(CurrentParticle); + {CorrectOffsets(CurrentParticle);} end; if CurrentParticle+2 > MaxParticles then @@ -746,17 +778,19 @@ begin else CurrentParticle := CurrentParticle+1; end; -{$ENDIF} end; procedure g_GFX_SetMax(Count: Integer); +var + a: Integer; begin - if Count > 50000 then - Count := 50000; + if Count > 50000 then Count := 50000; + if (Count < 1) then Count := 1; SetLength(Particles, Count); + for a := 0 to High(Particles) do Particles[a].State := STATE_FREE; MaxParticles := Count; - if CurrentParticle >= Count then + //if CurrentParticle >= Count then CurrentParticle := 0; end; @@ -809,15 +843,13 @@ end; procedure g_GFX_Update(); var a: Integer; -{$IF DEFINED(HAS_COLLIDE_BITMAP)} w, h: Integer; dX, dY: SmallInt; b, len: Integer; s: ShortInt; - c: Byte; -{$ENDIF} + //c: Byte; begin -{$IF DEFINED(HAS_COLLIDE_BITMAP)} + if not gpart_dbg_enabled then exit; if Particles <> nil then begin w := gMapInfo.Width; @@ -826,15 +858,15 @@ begin len := High(Particles); for a := 0 to len do - if Particles[a].State <> 0 then + begin + if Particles[a].State <> STATE_FREE then + begin with Particles[a] do begin - if Time = LiveTime then - State := STATE_FREE; - if (X+1 >= w) or (Y+1 >= h) or (X <= 0) or (Y <= 0) then - State := STATE_FREE; - if State = STATE_FREE then - Continue; + if Time = LiveTime then State := STATE_FREE; + if (X+1 >= w) or (Y+1 >= h) or (X <= 0) or (Y <= 0) then State := STATE_FREE; + if State = STATE_FREE then Continue; + //e_WriteLog(Format('particle #%d: %d', [State, ParticleType]), MSG_NOTIFY); case ParticleType of PARTICLE_BLOOD: @@ -842,10 +874,18 @@ begin if gAdvBlood then begin if (State = STATE_STICK) then + { if (not ByteBool(gCollideMap[Y-1, X] and MARK_BLOCKED)) and (not ByteBool(gCollideMap[Y+1, X] and MARK_BLOCKED)) and (not ByteBool(gCollideMap[Y, X-1] and MARK_BLOCKED)) and - (not ByteBool(gCollideMap[Y, X+1] and MARK_BLOCKED)) then + (not ByteBool(gCollideMap[Y, X+1] and MARK_BLOCKED)) + then + } + if (not isBlockedAt(X, Y-1)) and + (not isBlockedAt(X, Y+1)) and + (not isBlockedAt(X-1, Y)) and + (not isBlockedAt(X+1, Y)) + then begin // Îòëèïëà - êàïàåò VelY := 0.5; AccelY := 0.15; @@ -859,9 +899,9 @@ begin Continue; end; - if not ByteBool(gCollideMap[Y, X] and MARK_BLOCKED) then + if not isBlockedAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_BLOCKED)} then begin - if ByteBool(gCollideMap[Y, X] and MARK_LIFTUP) then + if isLiftUpAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIFTUP)} then begin // Ëèôò ââåðõ if VelY > -4-Random(3) then VelY := VelY - 0.8; @@ -870,13 +910,13 @@ begin VelX := VelX + (Random-Random)*0.2; AccelY := 0.15; end; - if ByteBool(gCollideMap[Y, X] and MARK_LIFTLEFT) then + if isLiftLeftAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIFTLEFT)} then begin // Ïîòîê âëåâî if VelX > -8-Random(3) then VelX := VelX - 0.8; AccelY := 0.15; end; - if ByteBool(gCollideMap[Y, X] and MARK_LIFTRIGHT) then + if isLiftRightAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIFTRIGHT)} then begin // Ïîòîê âïðàâî if VelX < 8+Random(3) then VelX := VelX + 0.8; @@ -889,9 +929,9 @@ begin if (Abs(VelX) < 0.1) and (Abs(VelY) < 0.1) then if (State <> STATE_STICK) and - (not ByteBool(gCollideMap[Y-1, X] and MARK_BLOCKED)) and - (not ByteBool(gCollideMap[Y, X] and MARK_BLOCKED)) and - (not ByteBool(gCollideMap[Y+1, X] and MARK_BLOCKED)) then + (not isBlockedAt(X, Y-1) {ByteBool(gCollideMap[Y-1, X] and MARK_BLOCKED)}) and + (not isBlockedAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_BLOCKED)}) and + (not isBlockedAt(X, Y+1) {ByteBool(gCollideMap[Y+1, X] and MARK_BLOCKED)}) then begin // Âèñèò â âîçäóõå - êàïàåò VelY := 0.8; AccelY := 0.5; @@ -915,9 +955,9 @@ begin Break; end; - c := gCollideMap[Y, X+s]; + //c := gCollideMap[Y, X+s]; - if ByteBool(c and MARK_BLOCKED) then + if isBlockedAt(X+s, Y) {ByteBool(c and MARK_BLOCKED)} then begin // Ñòåíà/äâåðü VelX := 0; VelY := 0; @@ -948,9 +988,9 @@ begin Break; end; - c := gCollideMap[Y+s, X]; + //c := gCollideMap[Y+s, X]; - if ByteBool(c and MARK_BLOCKED) then + if isBlockedAt(X, Y+s) {ByteBool(c and MARK_BLOCKED)} then begin // Ñòåíà/äâåðü VelX := 0; VelY := 0; @@ -974,7 +1014,7 @@ begin if (X+dX >= w) or (Y+dY >= h) or (X+dX <= 0) or (Y+dY <= 0) or - ByteBool(gCollideMap[Y+dY, X+dX] and MARK_BLOCKED) then + isBlockedAt(X+dX, Y+dY) {ByteBool(gCollideMap[Y+dY, X+dX] and MARK_BLOCKED)} then begin // Ñòåíà/äâåðü/ãðàíèöà State := STATE_FREE; VelX := 0; @@ -991,7 +1031,7 @@ begin VelY := VelY + AccelY; // Êðîâü ðàñòâîðÿåòñÿ â æèäêîñòè: - if ByteBool(gCollideMap[Y, X] and MARK_LIQUID) then + if isLiquidAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIQUID)} then begin Inc(Time); @@ -1005,9 +1045,9 @@ begin dY := Round(VelY); if (Abs(VelX) < 0.1) and (Abs(VelY) < 0.1) and - (not ByteBool(gCollideMap[Y-1, X] and MARK_BLOCKED)) and - (not ByteBool(gCollideMap[Y, X] and MARK_BLOCKED)) and - (not ByteBool(gCollideMap[Y+1, X] and MARK_BLOCKED)) then + (not isBlockedAt(X, Y-1) {ByteBool(gCollideMap[Y-1, X] and MARK_BLOCKED)}) and + (not isBlockedAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_BLOCKED)}) and + (not isBlockedAt(X, Y+1) {ByteBool(gCollideMap[Y+1, X] and MARK_BLOCKED)}) then begin // Âèñèò â âîçäóõå VelY := 0.8; AccelY := 0.5; @@ -1030,16 +1070,16 @@ begin Break; end; - c := gCollideMap[Y, X+s]; + //c := gCollideMap[Y, X+s]; - if ByteBool(c and MARK_BLOCKED) then + if isBlockedAt(X+s, Y) {ByteBool(c and MARK_BLOCKED)} then begin // Ñòåíà/äâåðü - ïàäàåò âåðòèêàëüíî VelX := 0; AccelX := 0; Break; end else // Ïóñòî: - if c = MARK_FREE then + if not isAnythingAt(X+s, Y) {c = MARK_FREE} then X := X + s else // Îñòàëüíîå: begin @@ -1066,9 +1106,9 @@ begin Break; end; - c := gCollideMap[Y+s, X]; + //c := gCollideMap[Y+s, X]; - if ByteBool(c and MARK_BLOCKED) then + if isBlockedAt(X, Y+s) {ByteBool(c and MARK_BLOCKED)} then begin // Ñòåíà/äâåðü - ïàäàåò âåðòèêàëüíî if s < 0 then begin @@ -1086,7 +1126,7 @@ begin Break; end else // Ïóñòî: - if c = MARK_FREE then + if not isAnythingAt(X, Y+s) {c = MARK_FREE} then Y := Y + s else // Îñàëüíîå: begin @@ -1114,15 +1154,15 @@ begin begin // Ñòåêàåò/îòëèïàåò VelY := 0.5; AccelY := 0.15; - if (not ByteBool(gCollideMap[Y, X-1] and MARK_BLOCKED)) and - (not ByteBool(gCollideMap[Y, X+1] and MARK_BLOCKED)) then + if (not isBlockedAt(X-1, Y) {ByteBool(gCollideMap[Y, X-1] and MARK_BLOCKED)}) and + (not isBlockedAt(X+1, Y) {ByteBool(gCollideMap[Y, X+1] and MARK_BLOCKED)}) then State := STATE_NORMAL; Continue; end; - if not ByteBool(gCollideMap[Y, X] and MARK_BLOCKED) then + if not isBlockedAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_BLOCKED)} then begin - if ByteBool(gCollideMap[Y, X] and MARK_LIFTUP) then + if isLiftUpAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIFTUP)} then begin // Ëèôò ââåðõ if VelY > -4-Random(3) then VelY := VelY - 0.8; @@ -1131,13 +1171,13 @@ begin VelX := VelX + (Random-Random)*0.2; AccelY := 0.15; end; - if ByteBool(gCollideMap[Y, X] and MARK_LIFTLEFT) then + if isLiftLeftAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIFTLEFT)} then begin // Ïîòîê âëåâî if VelX > -8-Random(3) then VelX := VelX - 0.8; AccelY := 0.15; end; - if ByteBool(gCollideMap[Y, X] and MARK_LIFTRIGHT) then + if isLiftRightAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIFTRIGHT)} then begin // Ïîòîê âïðàâî if VelX < 8+Random(3) then VelX := VelX + 0.8; @@ -1150,9 +1190,9 @@ begin if (Abs(VelX) < 0.1) and (Abs(VelY) < 0.1) then if (State <> STATE_STICK) and - (not ByteBool(gCollideMap[Y-1, X] and MARK_BLOCKED)) and - (not ByteBool(gCollideMap[Y, X] and MARK_BLOCKED)) and - (not ByteBool(gCollideMap[Y+1, X] and MARK_BLOCKED)) then + (not isBlockedAt(X, Y-1) {ByteBool(gCollideMap[Y-1, X] and MARK_BLOCKED)}) and + (not isBlockedAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_BLOCKED)}) and + (not isBlockedAt(X, Y+1) {ByteBool(gCollideMap[Y+1, X] and MARK_BLOCKED)}) then begin // Âèñèò â âîçäóõå - êàïàåò VelY := 0.8; AccelY := 0.5; @@ -1174,15 +1214,15 @@ begin Break; end; - c := gCollideMap[Y, X+s]; + //c := gCollideMap[Y, X+s]; - if ByteBool(c and MARK_LIQUID) and (dY > 0) then + if isLiquidAt(X+s, Y) {ByteBool(c and MARK_LIQUID)} and (dY > 0) then begin // Ñáîêó æèäêîñòü, à ÷àñòèöà óæå ïàäàåò State := STATE_FREE; Break; end; - if ByteBool(c and MARK_BLOCKED) then + if isBlockedAt(X+s, Y) {ByteBool(c and MARK_BLOCKED)} then begin // Ñòåíà/äâåðü VelX := 0; VelY := 0; @@ -1211,15 +1251,15 @@ begin Break; end; - c := gCollideMap[Y+s, X]; + //c := gCollideMap[Y+s, X]; - if ByteBool(c and MARK_LIQUID) and (dY > 0) then + if isLiquidAt(X, Y+s) {ByteBool(c and MARK_LIQUID)} and (dY > 0) then begin // Ñíèçó æèäêîñòü, à ÷àñòèöà óæå ïàäàåò State := STATE_FREE; Break; end; - if ByteBool(c and MARK_BLOCKED) then + if isBlockedAt(X, Y+s) {ByteBool(c and MARK_BLOCKED)} then begin // Ñòåíà/äâåðü VelX := 0; VelY := 0; @@ -1261,7 +1301,7 @@ begin Break; end; - if not ByteBool(gCollideMap[Y+s, X] and MARK_LIQUID) then + if not isLiquidAt(X, Y+s) {ByteBool(gCollideMap[Y+s, X] and MARK_LIQUID)} then begin // Óæå íå æèäêîñòü State := STATE_FREE; Break; @@ -1278,10 +1318,11 @@ begin end; end; // case - CorrectOffsets(a); - end; + {CorrectOffsets(a);} + end; // with + end; // if + end; // for end; // Particles <> nil -{$ENDIF} if OnceAnims <> nil then begin