X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_gfx.pas;h=44a9db46fc7adcc63d9c3b734a55f55bbab9d275;hb=2b79b90a46d647d1d5bf4205862be5ffa296add1;hp=fe494a8cd539128405cc5b12c4ef78a1ac65f496;hpb=5ee3fd108bcad8621ca1d8672ffc6393aece3917;p=d2df-sdl.git diff --git a/src/game/g_gfx.pas b/src/game/g_gfx.pas index fe494a8..44a9db4 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; @@ -54,18 +53,12 @@ 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(); -{$IF DEFINED(HAS_COLLIDE_BITMAP)} -var - gCollideMap: Array of Array of Byte; -{$ENDIF} - - implementation uses @@ -103,65 +96,63 @@ 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; 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)); + 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)); + 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); + 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); + 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); + 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); + 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)); + 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)); + 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)} +procedure g_Mark(x, y, Width, Height: Integer; t: Byte; st: Boolean); var yy, y2, xx, x2: Integer; -{$ENDIF} begin -{$IF DEFINED(HAS_COLLIDE_BITMAP)} if x < 0 then begin Width := Width + x; @@ -206,16 +197,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 @@ -285,20 +275,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 @@ -308,37 +301,13 @@ begin OnceAnims := nil; end; - - {$IF DEFINED(HAS_COLLIDE_BITMAP)} - gCollideMap := nil; - {$ENDIF} end; procedure CorrectOffsets(id: Integer); -{$IF not DEFINED(HAS_COLLIDE_BITMAP)} var part: PParticle; -{$ENDIF} begin -{$IF DEFINED(HAS_COLLIDE_BITMAP)} - 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; -{$ELSE} part := @Particles[id]; part.offsetX := 0; part.offsetY := 0; @@ -346,7 +315,6 @@ begin 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; -{$ENDIF} end; @@ -789,13 +757,16 @@ begin 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; @@ -862,15 +833,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: @@ -1323,7 +1294,9 @@ begin end; // case CorrectOffsets(a); - end; + end; // with + end; // if + end; // for end; // Particles <> nil if OnceAnims <> nil then