diff --git a/src/game/g_gfx.pas b/src/game/g_gfx.pas
index d6244b7561687a9bcea64545a8adde9873ef0ccc..c84ba47eda80a1e2c6097a134a78d5ba0929a212 100644 (file)
--- a/src/game/g_gfx.pas
+++ b/src/game/g_gfx.pas
interface
uses
- g_textures;
+ e_log, g_textures;
const
BLOOD_NORMAL = 0;
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
State: Byte;
ParticleType: Byte;
offsetX, offsetY: ShortInt;
+ // for bubbles
+ liquidTopY: Integer; // don't float higher than this
end;
TOnceAnim = record
CurrentParticle: Integer;
-function isBlockedAt (x, y: Integer; w: Integer=1; h: Integer=1): Boolean; inline;
+function isBlockedAt (x, y: Integer): Boolean; inline;
begin
- result := g_Map_CollidePanel(x, y, w, h, (PANEL_WALL or PANEL_CLOSEDOOR or PANEL_STEP));
+ 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; w: Integer=1; h: Integer=1): Boolean; inline;
+function isWallAt (x, y: Integer): Boolean; inline;
begin
- result := g_Map_CollidePanel(x, y, w, h, (PANEL_WALL or PANEL_STEP));
+ 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; w: Integer=1; h: Integer=1): Boolean; inline;
+function isLiftUpAt (x, y: Integer): Boolean; inline;
begin
- result := g_Map_CollidePanel(x, y, w, h, PANEL_LIFTUP);
+ 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; w: Integer=1; h: Integer=1): Boolean; inline;
+function isLiftDownAt (x, y: Integer): Boolean; inline;
begin
- result := g_Map_CollidePanel(x, y, w, h, PANEL_LIFTDOWN);
+ 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; w: Integer=1; h: Integer=1): Boolean; inline;
+function isLiftLeftAt (x, y: Integer): Boolean; inline;
begin
- result := g_Map_CollidePanel(x, y, w, h, PANEL_LIFTLEFT);
+ 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; w: Integer=1; h: Integer=1): Boolean; inline;
+function isLiftRightAt (x, y: Integer): Boolean; inline;
begin
- result := g_Map_CollidePanel(x, y, w, h, PANEL_LIFTRIGHT);
+ 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; w: Integer=1; h: Integer=1): Boolean; inline;
+function isLiquidAt (x, y: Integer): Boolean; inline;
begin
- result := g_Map_CollidePanel(x, y, w, h, (PANEL_WATER or PANEL_ACID1 or PANEL_ACID2));
+ 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; w: Integer=1; h: Integer=1): Boolean; inline;
+function isAnythingAt (x, y: Integer): Boolean; inline;
begin
- result := g_Map_CollidePanel(x, y, w, h, (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));
+ 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
end;
-procedure CorrectOffsets(id: Integer);
+{
+procedure CorrectOffsets(id: Integer); inline;
var
part: PParticle;
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);
LiveTime := 30+Random(60);
ParticleType := PARTICLE_SPARK;
- CorrectOffsets(CurrentParticle);
+ {CorrectOffsets(CurrentParticle);}
end;
if CurrentParticle+2 > MaxParticles then
LiveTime := 120+Random(40);
ParticleType := PARTICLE_BLOOD;
- CorrectOffsets(CurrentParticle);
+ {CorrectOffsets(CurrentParticle);}
end;
if CurrentParticle >= MaxParticles-1 then
LiveTime := 30+Random(60);
ParticleType := PARTICLE_SPARK;
- CorrectOffsets(CurrentParticle);
+ {CorrectOffsets(CurrentParticle);}
end;
if CurrentParticle+2 > MaxParticles then
LiveTime := 60+Random(60);
ParticleType := PARTICLE_WATER;
- CorrectOffsets(CurrentParticle);
+ {CorrectOffsets(CurrentParticle);}
end;
if CurrentParticle+2 > MaxParticles then
LiveTime := 60+Random(60);
ParticleType := PARTICLE_WATER;
- CorrectOffsets(CurrentParticle);
+ {CorrectOffsets(CurrentParticle);}
end;
if CurrentParticle+2 > MaxParticles then
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
(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;
LiveTime := 65535;
ParticleType := PARTICLE_BUBBLES;
- CorrectOffsets(CurrentParticle);
+ {CorrectOffsets(CurrentParticle);}
end;
if CurrentParticle+2 > MaxParticles then
s: ShortInt;
//c: Byte;
begin
+ if not gpart_dbg_enabled then exit;
if Particles <> nil then
begin
w := gMapInfo.Width;
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:
end;
end; // case
- CorrectOffsets(a);
- end;
+ {CorrectOffsets(a);}
+ end; // with
+ end; // if
+ end; // for
end; // Particles <> nil
if OnceAnims <> nil then