X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_gfx.pas;h=c84ba47eda80a1e2c6097a134a78d5ba0929a212;hb=b4c47ccb9cb4d0773bd7da3f9614b6395c65db5a;hp=44a9db46fc7adcc63d9c3b734a55f55bbab9d275;hpb=c414b87769c21e17010b8de0dfe36da681edcdbb;p=d2df-sdl.git diff --git a/src/game/g_gfx.pas b/src/game/g_gfx.pas index 44a9db4..c84ba47 100644 --- a/src/game/g_gfx.pas +++ b/src/game/g_gfx.pas @@ -53,12 +53,17 @@ function g_GFX_GetMax(): Integer; procedure g_GFX_OnceAnim(X, Y: Integer; Anim: TAnimation; AnimType: Byte = 0); -//procedure g_Mark(x, y, Width, Height: Integer; t: Byte; st: Boolean); +procedure g_Mark(x, y, Width, Height: Integer; t: Byte; st: Boolean); procedure g_GFX_Update(); procedure g_GFX_Draw(); +var + gpart_dbg_enabled: Boolean = true; + gpart_dbg_phys_enabled: Boolean = true; + + implementation uses @@ -78,6 +83,8 @@ type State: Byte; ParticleType: Byte; offsetX, offsetY: ShortInt; + // for bubbles + liquidTopY: Integer; // don't float higher than this end; TOnceAnim = record @@ -104,52 +111,59 @@ var 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; -{$IF DEFINED(HAS_COLLIDE_BITMAP)} procedure g_Mark(x, y, Width, Height: Integer; t: Byte; st: Boolean); +{$IF not DEFINED(HAS_COLLIDE_BITMAP)} +begin +end; +{$ELSE} var yy, y2, xx, x2: Integer; begin @@ -304,7 +318,8 @@ begin end; -procedure CorrectOffsets(id: Integer); +{ +procedure CorrectOffsets(id: Integer); inline; var part: PParticle; begin @@ -316,6 +331,7 @@ begin // check for left wall if isBlockedAt(part.X-1, part.Y) then part.offsetX := 1; end; +} procedure g_GFX_SparkVel (fX, fY: Integer; Count: Word; VX, VY: Integer; DevX, DevY: Byte); @@ -363,7 +379,7 @@ begin LiveTime := 30+Random(60); ParticleType := PARTICLE_SPARK; - CorrectOffsets(CurrentParticle); + {CorrectOffsets(CurrentParticle);} end; if CurrentParticle+2 > MaxParticles then @@ -460,7 +476,7 @@ begin LiveTime := 120+Random(40); ParticleType := PARTICLE_BLOOD; - CorrectOffsets(CurrentParticle); + {CorrectOffsets(CurrentParticle);} end; if CurrentParticle >= MaxParticles-1 then @@ -522,7 +538,7 @@ begin LiveTime := 30+Random(60); ParticleType := PARTICLE_SPARK; - CorrectOffsets(CurrentParticle); + {CorrectOffsets(CurrentParticle);} end; if CurrentParticle+2 > MaxParticles then @@ -604,7 +620,7 @@ begin LiveTime := 60+Random(60); ParticleType := PARTICLE_WATER; - CorrectOffsets(CurrentParticle); + {CorrectOffsets(CurrentParticle);} end; if CurrentParticle+2 > MaxParticles then @@ -689,7 +705,7 @@ begin LiveTime := 60+Random(60); ParticleType := PARTICLE_WATER; - CorrectOffsets(CurrentParticle); + {CorrectOffsets(CurrentParticle);} end; if CurrentParticle+2 > MaxParticles then @@ -699,12 +715,13 @@ begin end; end; + procedure g_GFX_Bubbles(fX, fY: Integer; Count: Word; DevX, DevY: Byte); var a: Integer; DevX1, DevX2, DevY1, DevY2: Byte; - l: Integer; + l, liquidx: Integer; begin l := Length(Particles); if l = 0 then @@ -728,8 +745,15 @@ begin (Y >= gMapInfo.Height) or (Y <= 0) then Continue; + (* + // 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; @@ -746,7 +770,7 @@ begin LiveTime := 65535; ParticleType := PARTICLE_BUBBLES; - CorrectOffsets(CurrentParticle); + {CorrectOffsets(CurrentParticle);} end; if CurrentParticle+2 > MaxParticles then @@ -825,6 +849,7 @@ var s: ShortInt; //c: Byte; begin + if not gpart_dbg_enabled then exit; if Particles <> nil then begin w := gMapInfo.Width; @@ -1293,7 +1318,7 @@ begin end; end; // case - CorrectOffsets(a); + {CorrectOffsets(a);} end; // with end; // if end; // for