DEADSOFTWARE

saving all panels to savegame, 'cause why not
[d2df-sdl.git] / src / game / g_panel.pas
index 3b2830e634d471e3eb0796b37b5d504cf50ea1e8..6bf2c235ff679db5646ebfb8726c94b867893f95 100644 (file)
@@ -31,6 +31,9 @@ type
 
   TPanel = Class (TObject)
   private
+    const
+  private
+    mGUID: Integer; // will be assigned in "g_map.pas"
     FTextureWidth:    Word;
     FTextureHeight:   Word;
     FAlpha:           Byte;
@@ -65,14 +68,17 @@ type
     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();
@@ -87,10 +93,24 @@ type
     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!
@@ -120,7 +140,7 @@ type
 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
@@ -131,7 +151,7 @@ const
 constructor TPanel.Create(PanelRec: TDynRecord;
                           AddTextures: TAddTextureArray;
                           CurTex: Integer;
-                          var Textures: TLevelTextureArray);
+                          var Textures: TLevelTextureArray; aguid: Integer);
 var
   i: Integer;
 begin
@@ -146,6 +166,9 @@ begin
   LastAnimLoop := 0;
   Moved := False;
 
+  mapId := PanelRec.id;
+  mGUID := aguid;
+
   mMovingSpeed := PanelRec.moveSpeed;
   mMovingStart := PanelRec.moveStart;
   mMovingEnd := PanelRec.moveEnd;
@@ -295,6 +318,16 @@ function TPanel.getx1 (): Integer; inline; begin result := X+Width-1; end;
 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;
@@ -303,7 +336,7 @@ var
 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 // Àíèìèðîâàííàÿ òåêñòóðà
@@ -406,6 +439,12 @@ 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;
@@ -501,18 +540,25 @@ begin
     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;
@@ -653,8 +699,8 @@ var
   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'
@@ -695,9 +741,10 @@ procedure TPanel.LoadState(var Mem: TBinMemoryReader);
 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);
@@ -712,8 +759,11 @@ begin
 // Íîìåð òåêóùåé òåêñòóðû:
   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);
 // Åñëè äà - çàãðóæàåì àíèìàöèþ:
@@ -733,6 +783,9 @@ begin
   Mem.ReadInt(mMovingEnd.X);
   Mem.ReadInt(mMovingEnd.Y);
   Mem.ReadBoolean(mMovingActive);
+
+  positionChanged();
+  //mapGrid.proxyEnabled[proxyId] := FEnabled; // done in g_map.pas
 end;
 
 end.