diff --git a/src/game/g_panel.pas b/src/game/g_panel.pas
index 3b2830e634d471e3eb0796b37b5d504cf50ea1e8..6bf2c235ff679db5646ebfb8726c94b867893f95 100644 (file)
--- a/src/game/g_panel.pas
+++ b/src/game/g_panel.pas
TPanel = Class (TObject)
private
+ const
+ private
+ mGUID: Integer; // will be assigned in "g_map.pas"
FTextureWidth: Word;
FTextureHeight: Word;
FAlpha: Byte;
FMoved: Boolean;
FLiftType: Byte;
FLastAnimLoop: Byte;
+ // sorry, there fields are public to allow setting 'em in g_map; this should be fixed later
+ // for now, PLEASE, don't modify 'em, or all hell will break loose
arrIdx: Integer; // index in one of internal arrays; sorry
- tag: Integer; // used in coldets and such; sorry
+ 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
constructor Create(PanelRec: TDynRecord;
AddTextures: TAddTextureArray;
CurTex: Integer;
- var Textures: TLevelTextureArray);
+ var Textures: TLevelTextureArray; aguid: Integer);
destructor Destroy(); override;
procedure Draw();
procedure SaveState(var Mem: TBinMemoryWriter);
procedure LoadState(var Mem: TBinMemoryReader);
+ procedure positionChanged (); inline;
+
+ function isGBack (): Boolean; inline; // gRenderBackgrounds
+ function isGStep (): Boolean; inline; // gSteps
+ function isGWall (): Boolean; inline; // gWalls
+ function isGAcid1 (): Boolean; inline; // gAcid1
+ function isGAcid2 (): Boolean; inline; // gAcid2
+ function isGWater (): Boolean; inline; // gWater
+ function isGFore (): Boolean; inline; // gRenderForegrounds
+ function isGLift (): Boolean; inline; // gLifts
+ function isGBlockMon (): Boolean; inline; // gBlockMon
+
+
public
property visvalid: Boolean read getvisvalid; // panel is "visvalid" when it's width and height are positive
published
+ property guid: Integer read mGUID; // will be assigned in "g_map.pas"
property x0: Integer read FX;
property y0: Integer read FY;
property x1: Integer read getx1; // inclusive!
implementation
uses
- SysUtils, g_basic, g_map, g_game, e_graphics,
+ SysUtils, g_basic, g_map, g_game, g_gfx, e_graphics,
g_console, g_language, g_monsters, g_player, e_log, GL;
const
constructor TPanel.Create(PanelRec: TDynRecord;
AddTextures: TAddTextureArray;
CurTex: Integer;
- var Textures: TLevelTextureArray);
+ var Textures: TLevelTextureArray; aguid: Integer);
var
i: Integer;
begin
LastAnimLoop := 0;
Moved := False;
+ mapId := PanelRec.id;
+ mGUID := aguid;
+
mMovingSpeed := PanelRec.moveSpeed;
mMovingStart := PanelRec.moveStart;
mMovingEnd := PanelRec.moveEnd;
function TPanel.gety1 (): Integer; inline; begin result := Y+Height-1; end;
function TPanel.getvisvalid (): Boolean; inline; begin result := (Width > 0) and (Height > 0); end;
+function TPanel.isGBack (): Boolean; inline; begin result := ((tag and GridTagBack) <> 0); end;
+function TPanel.isGStep (): Boolean; inline; begin result := ((tag and GridTagStep) <> 0); end;
+function TPanel.isGWall (): Boolean; inline; begin result := ((tag and (GridTagWall or GridTagDoor)) <> 0); end;
+function TPanel.isGAcid1 (): Boolean; inline; begin result := ((tag and GridTagAcid1) <> 0); end;
+function TPanel.isGAcid2 (): Boolean; inline; begin result := ((tag and GridTagAcid2) <> 0); end;
+function TPanel.isGWater (): Boolean; inline; begin result := ((tag and GridTagWater) <> 0); end;
+function TPanel.isGFore (): Boolean; inline; begin result := ((tag and GridTagFore) <> 0); end;
+function TPanel.isGLift (): Boolean; inline; begin result := ((tag and GridTagLift) <> 0); end;
+function TPanel.isGBlockMon (): Boolean; inline; begin result := ((tag and GridTagBlockMon) <> 0); end;
+
procedure TPanel.Draw();
var
xx, yy: Integer;
begin
if {Enabled and} (FCurTexture >= 0) and
(Width > 0) and (Height > 0) and (FAlpha < 255) and
- (g_dbg_scale_05 or g_Collide(X, Y, Width, Height, sX, sY, sWidth, sHeight)) then
+ ((g_dbg_scale <> 1.0) or g_Collide(X, Y, Width, Height, sX, sY, sWidth, sHeight)) then
begin
if FTextureIDs[FCurTexture].Anim then
begin // Àíèìèðîâàííàÿ òåêñòóðà
end;
+procedure TPanel.positionChanged (); inline;
+begin
+ if (proxyId >= 0) then mapGrid.moveBody(proxyId, X, Y);
+end;
+
+
var
monMoveList: array of TMonster = nil;
monMoveListUsed: Integer = 0;
monMoveListUsed := 0;
nx := X+mMovingSpeed.X;
ny := Y+mMovingSpeed.Y;
+ // move monsters on lifts
g_Mons_ForEachAt(X, Y-1, Width, 1, monMove);
+ // push monsters
g_Mons_ForEachAt(nx, ny, Width, Height, monPush);
+ // move and push players
for f := 0 to High(gPlayers) do plrMove(gPlayers[f]);
+ // reverse moving direction, if necessary
if (mMovingSpeed.X < 0) and (nx <= mMovingStart.X) then mMovingSpeed.X := -mMovingSpeed.X
else if (mMovingSpeed.X > 0) and (nx >= mMovingEnd.X) then mMovingSpeed.X := -mMovingSpeed.X;
if (mMovingSpeed.Y < 0) and (ny <= mMovingStart.Y) then mMovingSpeed.Y := -mMovingSpeed.Y
else if (mMovingSpeed.Y > 0) and (ny >= mMovingEnd.Y) then mMovingSpeed.Y := -mMovingSpeed.Y;
- //!!!g_Mark(X, Y, Width, Height, MARK_FREE);
+ // awake particles
+ g_Mark(X, Y, Width, Height, MARK_WALL, false);
X := nx;
Y := ny;
- //!!!g_Mark(X, Y, Width, Height, MARK_WALL);
- if (proxyId >= 0) then mapGrid.moveBody(proxyId, nx, ny);
+ g_Mark(nx, ny, Width, Height, MARK_WALL);
+ // fix grid
+ positionChanged();
+ // notify moved monsters about their movement
for f := 0 to monMoveListUsed-1 do monMoveList[f].positionChanged();
end;
end;
sig: DWORD;
anim: Boolean;
begin
- if (not SaveIt) or (Mem = nil) then
- Exit;
+ if (Mem = nil) then exit;
+ //if not SaveIt then exit;
// Ñèãíàòóðà ïàíåëè:
sig := PANEL_SIGNATURE; // 'PANL'
var
sig: DWORD;
anim: Boolean;
+ //ox, oy: Integer;
begin
- if (not SaveIt) or (Mem = nil) then
- Exit;
+ if (Mem = nil) then exit;
+ //if not SaveIt then exit;
// Ñèãíàòóðà ïàíåëè:
Mem.ReadDWORD(sig);
// Íîìåð òåêóùåé òåêñòóðû:
Mem.ReadInt(FCurTexture);
// Êîîðäû
+ //ox := FX;
+ //oy := FY;
Mem.ReadInt(FX);
Mem.ReadInt(FY);
+ //e_LogWritefln('panel %s(%s): old=(%s,%s); new=(%s,%s); delta=(%s,%s)', [arrIdx, proxyId, ox, oy, FX, FY, FX-ox, FY-oy]);
// Àíèìèðîâàííàÿ ëè òåêóùàÿ òåêñòóðà:
Mem.ReadBoolean(anim);
// Åñëè äà - çàãðóæàåì àíèìàöèþ:
Mem.ReadInt(mMovingEnd.X);
Mem.ReadInt(mMovingEnd.Y);
Mem.ReadBoolean(mMovingActive);
+
+ positionChanged();
+ //mapGrid.proxyEnabled[proxyId] := FEnabled; // done in g_map.pas
end;
end.