diff --git a/src/game/g_panel.pas b/src/game/g_panel.pas
index 2ff9af5648006d2650a0b4e5e101e781e03f3003..bcf0883385f89309450a420e89616af331eadbc7 100644 (file)
--- a/src/game/g_panel.pas
+++ b/src/game/g_panel.pas
-(* Copyright (C) DooM 2D:Forever Developers
+(* Copyright (C) Doom 2D: Forever Developers
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
Anim: Boolean;
end;
Anim: Boolean;
end;
+ PPanel = ^TPanel;
TPanel = Class (TObject)
private
const
TPanel = Class (TObject)
private
const
tag: Integer; // used in coldets and such; sorry; see g_map.GridTagXXX
proxyId: Integer; // proxy id in map grid (DO NOT USE!)
mapId: AnsiString; // taken directly from map file; dunno why it is here
tag: Integer; // used in coldets and such; sorry; see g_map.GridTagXXX
proxyId: Integer; // proxy id in map grid (DO NOT USE!)
mapId: AnsiString; // taken directly from map file; dunno why it is here
+ hasTexTrigger: Boolean; // HACK: true when there's a trigger than can change my texture
constructor Create(PanelRec: TDynRecord;
AddTextures: TAddTextureArray;
constructor Create(PanelRec: TDynRecord;
AddTextures: TAddTextureArray;
procedure SetTexture(ID: Integer; AnimLoop: Byte = 0);
function GetTextureID(): Cardinal;
function GetTextureCount(): Integer;
procedure SetTexture(ID: Integer; AnimLoop: Byte = 0);
function GetTextureID(): Cardinal;
function GetTextureCount(): Integer;
+ function CanChangeTexture(): Boolean;
procedure SaveState (st: TStream);
procedure LoadState (st: TStream);
procedure SaveState (st: TStream);
procedure LoadState (st: TStream);
TPanelArray = Array of TPanel;
TPanelArray = Array of TPanel;
+const
+ LIFTTYPE_UP = 0;
+ LIFTTYPE_DOWN = 1;
+ LIFTTYPE_LEFT = 2;
+ LIFTTYPE_RIGHT = 3;
+
var
g_dbgpan_mplat_active: Boolean = {$IF DEFINED(D2F_DEBUG)}true{$ELSE}true{$ENDIF};
g_dbgpan_mplat_step: Boolean = false; // one step, and stop
var
g_dbgpan_mplat_active: Boolean = {$IF DEFINED(D2F_DEBUG)}true{$ELSE}true{$ENDIF};
g_dbgpan_mplat_step: Boolean = false; // one step, and stop
implementation
uses
implementation
uses
+ {$INCLUDE ../nogl/noGLuses.inc}
e_texture, g_basic, g_map, g_game, g_gfx, e_graphics, g_weapons, g_triggers,
e_texture, g_basic, g_map, g_game, g_gfx, e_graphics, g_weapons, g_triggers,
- g_console, g_language, g_monsters, g_player, g_grid, e_log, GL, utils, xstreams;
+ g_console, g_language, g_monsters, g_player, g_grid, e_log, geom, utils, xstreams;
const
PANEL_SIGNATURE = $4C4E4150; // 'PANL'
const
PANEL_SIGNATURE = $4C4E4150; // 'PANL'
var Textures: TLevelTextureArray; aguid: Integer);
var
i: Integer;
var Textures: TLevelTextureArray; aguid: Integer);
var
i: Integer;
+ tnum: Integer;
begin
X := PanelRec.X;
Y := PanelRec.Y;
begin
X := PanelRec.X;
Y := PanelRec.Y;
PanelType := PanelRec.PanelType;
Enabled := True;
Door := False;
PanelType := PanelRec.PanelType;
Enabled := True;
Door := False;
- LiftType := 0;
+ LiftType := LIFTTYPE_UP;
+ hasTexTrigger := False;
case PanelType of
PANEL_OPENDOOR: begin Enabled := False; Door := True; end;
PANEL_CLOSEDOOR: Door := True;
case PanelType of
PANEL_OPENDOOR: begin Enabled := False; Door := True; end;
PANEL_CLOSEDOOR: Door := True;
- PANEL_LIFTUP: LiftType := 0; //???
- PANEL_LIFTDOWN: LiftType := 1;
- PANEL_LIFTLEFT: LiftType := 2;
- PANEL_LIFTRIGHT: LiftType := 3;
+ PANEL_LIFTUP: LiftType := LIFTTYPE_UP; //???
+ PANEL_LIFTDOWN: LiftType := LIFTTYPE_DOWN;
+ PANEL_LIFTLEFT: LiftType := LIFTTYPE_LEFT;
+ PANEL_LIFTRIGHT: LiftType := LIFTTYPE_RIGHT;
end;
// Íåâèäèìàÿ:
end;
// Íåâèäèìàÿ:
// Òåêñòóð íåñêîëüêî - íóæíî ñîõðàíÿòü òåêóùóþ:
//if Length(FTextureIDs) > 1 then SaveIt := True;
// Òåêñòóð íåñêîëüêî - íóæíî ñîõðàíÿòü òåêóùóþ:
//if Length(FTextureIDs) > 1 then SaveIt := True;
+ if (PanelRec.TextureRec = nil) then tnum := -1 else tnum := PanelRec.tagInt;
+ if (tnum < 0) then tnum := Length(Textures);
+
// Åñëè íå ñïåöòåêñòóðà, òî çàäàåì ðàçìåðû:
// Åñëè íå ñïåöòåêñòóðà, òî çàäàåì ðàçìåðû:
- if PanelRec.TextureNum > High(Textures) then
+ if ({PanelRec.TextureNum}tnum > High(Textures)) then
begin
begin
- e_WriteLog(Format('WTF?! PanelRec.TextureNum is out of limits! (%d : %d)', [PanelRec.TextureNum, High(Textures)]), TMsgType.Fatal);
+ e_WriteLog(Format('WTF?! tnum is out of limits! (%d : %d)', [tnum, High(Textures)]), TMsgType.Warning);
FTextureWidth := 2;
FTextureHeight := 2;
FAlpha := 0;
FBlending := ByteBool(0);
end
FTextureWidth := 2;
FTextureHeight := 2;
FAlpha := 0;
FBlending := ByteBool(0);
end
- else if not g_Map_IsSpecialTexture(Textures[PanelRec.TextureNum].TextureName) then
+ else if not g_Map_IsSpecialTexture(Textures[{PanelRec.TextureNum}tnum].TextureName) then
begin
begin
- FTextureWidth := Textures[PanelRec.TextureNum].Width;
- FTextureHeight := Textures[PanelRec.TextureNum].Height;
+ FTextureWidth := Textures[{PanelRec.TextureNum}tnum].Width;
+ FTextureHeight := Textures[{PanelRec.TextureNum}tnum].Height;
FAlpha := PanelRec.Alpha;
FBlending := ByteBool(PanelRec.Flags and PANEL_FLAG_BLENDING);
end;
FAlpha := PanelRec.Alpha;
FBlending := ByteBool(PanelRec.Flags and PANEL_FLAG_BLENDING);
end;
begin
if (ontop <> nil) then ontop^ := true;
// yes, move with it; but skip steps (no need to process size change here, 'cause platform top cannot be changed with it)
begin
if (ontop <> nil) then ontop^ := true;
// yes, move with it; but skip steps (no need to process size change here, 'cause platform top cannot be changed with it)
- mapGrid.traceBox(tex, tey, px, py, pw, ph, pdx, pdy, nil, (GridTagWall or GridTagDoor));
+ mapGrid.traceBox(tex, tey, px, py, pw, ph, pdx, pdy, (GridTagWall or GridTagDoor));
end
else
begin
end
else
begin
trtag := (GridTagWall or GridTagDoor);
// if we're moving down, consider steps too
if (szdy > 0) then trtag := trtag or GridTagStep;
trtag := (GridTagWall or GridTagDoor);
// if we're moving down, consider steps too
if (szdy > 0) then trtag := trtag or GridTagStep;
- mapGrid.traceBox(tex, tey, px, py, pw, ph, szdx, szdy, nil, trtag);
+ mapGrid.traceBox(tex, tey, px, py, pw, ph, szdx, szdy, trtag);
end;
end;
end;
end;
end;
end;
trtag := (GridTagWall or GridTagDoor);
// if we're moving down, consider steps too
if (pdy > 0) then trtag := trtag or GridTagStep;
trtag := (GridTagWall or GridTagDoor);
// if we're moving down, consider steps too
if (pdy > 0) then trtag := trtag or GridTagStep;
- mapGrid.traceBox(tex, tey, px, py, pw, ph, pdx, pdy, nil, trtag);
+ mapGrid.traceBox(tex, tey, px, py, pw, ph, pdx, pdy, trtag);
end;
end;
end;
end;
end;
end;
(FTextureIDs[FCurTexture].AnTex <> nil) and
(Width > 0) and (Height > 0) and (FAlpha < 255) then
begin
(FTextureIDs[FCurTexture].AnTex <> nil) and
(Width > 0) and (Height > 0) and (FAlpha < 255) then
begin
- FCurFrame := ClampInt(Frame, 0, FTextureIDs[FCurTexture].AnTex.TotalFrames);
+ FCurFrame := ClampInt(Frame, 0, FTextureIDs[FCurTexture].AnTex.TotalFrames - 1);
FCurFrameCount := Count;
FTextureIDs[FCurTexture].AnTex.CurrentFrame := FCurFrame;
FTextureIDs[FCurTexture].AnTex.CurrentCounter := FCurFrameCount;
FCurFrameCount := Count;
FTextureIDs[FCurTexture].AnTex.CurrentFrame := FCurFrame;
FTextureIDs[FCurTexture].AnTex.CurrentCounter := FCurFrameCount;
procedure TPanel.SetTexture(ID: Integer; AnimLoop: Byte = 0);
begin
procedure TPanel.SetTexture(ID: Integer; AnimLoop: Byte = 0);
begin
-// Íåò òåêñòóð:
- if Length(FTextureIDs) = 0 then
- FCurTexture := -1
- else
- // Òîëüêî îäíà òåêñòóðà:
- if Length(FTextureIDs) = 1 then
- begin
- if (ID = 0) or (ID = -1) then
- FCurTexture := ID;
- end
- else
- // Áîëüøå îäíîé òåêñòóðû:
- begin
- if (ID >= -1) and (ID <= High(FTextureIDs)) then
- FCurTexture := ID;
- end;
+ if (ID >= -1) and (ID < Length(FTextureIDs)) then
+ FCurTexture := ID;
// Ïåðåêëþ÷èëèñü íà âèäèìóþ àíèì. òåêñòóðó:
if (FCurTexture >= 0) and FTextureIDs[FCurTexture].Anim then
// Ïåðåêëþ÷èëèñü íà âèäèìóþ àíèì. òåêñòóðó:
if (FCurTexture >= 0) and FTextureIDs[FCurTexture].Anim then
Result := Result + 100;
end;
Result := Result + 100;
end;
+function TPanel.CanChangeTexture(): Boolean;
+begin
+ Result := (GetTextureCount() > 1) or hasTexTrigger;
+end;
const
PAN_SAVE_VERSION = 1;
const
PAN_SAVE_VERSION = 1;