DEADSOFTWARE

simple allocation counter for classes
[d2df-sdl.git] / src / game / g_gui.pas
index 1516d4452328ad0489451ced4163d0a7bf7463cc..2ead3bbbb06a9e0bf0bd7c8cbae0b5eb2d626919 100644 (file)
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *)
-{$MODE DELPHI}
+{$INCLUDE ../shared/a_modes.inc}
 unit g_gui;
 
 interface
 
 uses
-  e_graphics, e_input, e_log, g_playermodel, g_basic, MAPSTRUCT, wadreader;
+  mempool,
+  e_graphics, e_input, e_log, g_playermodel, g_basic, MAPDEF, wadreader;
 
 const
   MAINMENU_HEADER_COLOR: TRGB = (R:255; G:255; B:255);
@@ -84,7 +85,7 @@ type
 
   TFontType = (FONT_TEXTURE, FONT_CHAR);
 
-  TFont = class(TObject)
+  TFont = class(TPoolObject)
   private
     ID: DWORD;
     FScale: Single;
@@ -108,7 +109,7 @@ type
   TOnChangeEvent = procedure(Sender: TGUIControl);
   TOnEnterEvent = procedure(Sender: TGUIControl);
 
-  TGUIControl = class
+  TGUIControl = class(TPoolObject)
   private
     FX, FY: Integer;
     FEnabled: Boolean;
@@ -133,7 +134,7 @@ type
     property RightAlign: Boolean read FRightAlign write FRightAlign; // for menu
   end;
 
-  TGUIWindow = class
+  TGUIWindow = class(TPoolObject)
   private
     FActiveControl: TGUIControl;
     FDefControl: string;
@@ -177,7 +178,7 @@ type
   public
     Proc: procedure;
     ProcEx: procedure (sender: TGUITextButton);
-    constructor Create(Proc: Pointer; FontID: DWORD; Text: string);
+    constructor Create(aProc: Pointer; FontID: DWORD; Text: string);
     destructor Destroy(); override;
     procedure OnMessage(var Msg: TMessage); override;
     procedure Update(); override;
@@ -348,7 +349,7 @@ type
   TGUIMapPreview = class(TGUIControl)
   private
     FMapData: array of TPreviewPanel;
-    FMapSize: TPoint;
+    FMapSize: TDFPoint;
     FScale: Single;
   public
     constructor Create();
@@ -416,7 +417,7 @@ type
     property Font: TFont read FFont write FFont;
   end;
 
-  TGUIFileListBox = class (TGUIListBox)
+  TGUIFileListBox = class(TGUIListBox)
   private
     FBasePath: String;
     FPath: String;
@@ -474,8 +475,8 @@ type
     destructor Destroy; override;
     procedure OnMessage(var Msg: TMessage); override;
     function AddButton(fProc: Pointer; Caption: string; ShowWindow: string = ''): TGUITextButton;
-    function GetButton(Name: string): TGUITextButton;
-    procedure EnableButton(Name: string; e: Boolean);
+    function GetButton(aName: string): TGUITextButton;
+    procedure EnableButton(aName: string; e: Boolean);
     procedure AddSpace();
     procedure Update; override;
     procedure Draw; override;
@@ -519,8 +520,8 @@ type
     function AddFileList(fText: string; Width, Height: Word): TGUIFileListBox;
     function AddMemo(fText: string; Width, Height: Word): TGUIMemo;
     procedure ReAlign();
-    function GetControl(Name: string): TGUIControl;
-    function GetControlsText(Name: string): TGUILabel;
+    function GetControl(aName: string): TGUIControl;
+    function GetControlsText(aName: string): TGUILabel;
     procedure Draw; override;
     procedure Update; override;
     procedure UpdateIndex();
@@ -546,8 +547,8 @@ implementation
 
 uses
   GL, GLExt, g_textures, g_sound, SysUtils,
-  g_game, Math, StrUtils, g_player, g_options, MAPREADER,
-  g_map, MAPDEF, g_weapons;
+  g_game, Math, StrUtils, g_player, g_options,
+  g_map, g_weapons, xdynrec;
 
 var
   Box: Array [0..8] of DWORD;
@@ -907,11 +908,11 @@ begin
   if FShowWindow <> '' then g_GUI_ShowWindow(FShowWindow);
 end;
 
-constructor TGUITextButton.Create(Proc: Pointer; FontID: DWORD; Text: string);
+constructor TGUITextButton.Create(aProc: Pointer; FontID: DWORD; Text: string);
 begin
   inherited Create();
 
-  Self.Proc := Proc;
+  Self.Proc := aProc;
   ProcEx := nil;
 
   FFont := TFont.Create(FontID, FONT_CHAR);
@@ -1113,14 +1114,14 @@ begin
   end;
 end;
 
-procedure TGUIMainMenu.EnableButton(Name: string; e: Boolean);
+procedure TGUIMainMenu.EnableButton(aName: string; e: Boolean);
 var
   a: Integer;
 begin
   if FButtons = nil then Exit;
 
   for a := 0 to High(FButtons) do
-    if (FButtons[a] <> nil) and (FButtons[a].Name = Name) then
+    if (FButtons[a] <> nil) and (FButtons[a].Name = aName) then
     begin
       if e then FButtons[a].FColor := MAINMENU_ITEMS_COLOR
       else FButtons[a].FColor := MAINMENU_UNACTIVEITEMS_COLOR;
@@ -1129,7 +1130,7 @@ begin
     end;
 end;
 
-function TGUIMainMenu.GetButton(Name: string): TGUITextButton;
+function TGUIMainMenu.GetButton(aName: string): TGUITextButton;
 var
   a: Integer;
 begin
@@ -1138,7 +1139,7 @@ begin
   if FButtons = nil then Exit;
 
   for a := 0 to High(FButtons) do
-    if (FButtons[a] <> nil) and (FButtons[a].Name = Name) then
+    if (FButtons[a] <> nil) and (FButtons[a].Name = aName) then
     begin
       Result := FButtons[a];
       Break;
@@ -1401,7 +1402,7 @@ end;
 
 procedure TGUIMenu.Draw;
 var
-  a, x, y: Integer;
+  a, locx, locy: Integer;
 begin
   inherited;
 
@@ -1416,32 +1417,32 @@ begin
 
   if (FIndex <> -1) and (FCounter > MENU_MARKERDELAY div 2) then
   begin
-    x := 0;
-    y := 0;
+    locx := 0;
+    locy := 0;
 
     if FItems[FIndex].Text <> nil then
     begin
-      x := FItems[FIndex].Text.FX;
-      y := FItems[FIndex].Text.FY;
+      locx := FItems[FIndex].Text.FX;
+      locy := FItems[FIndex].Text.FY;
       //HACK!
       if FItems[FIndex].Text.RightAlign then
       begin
-        x := x+FItems[FIndex].Text.FMaxWidth-FItems[FIndex].Text.GetWidth;
+        locx := locx+FItems[FIndex].Text.FMaxWidth-FItems[FIndex].Text.GetWidth;
       end;
     end
     else if FItems[FIndex].Control <> nil then
     begin
-      x := FItems[FIndex].Control.FX;
-      y := FItems[FIndex].Control.FY;
+      locx := FItems[FIndex].Control.FX;
+      locy := FItems[FIndex].Control.FY;
     end;
 
-    x := x-e_CharFont_GetMaxWidth(FFontID);
+    locx := locx-e_CharFont_GetMaxWidth(FFontID);
 
-    e_CharFont_PrintEx(FFontID, x, y, #16, _RGB(255, 0, 0));
+    e_CharFont_PrintEx(FFontID, locx, locy, #16, _RGB(255, 0, 0));
   end;
 end;
 
-function TGUIMenu.GetControl(Name: String): TGUIControl;
+function TGUIMenu.GetControl(aName: String): TGUIControl;
 var
   a: Integer;
 begin
@@ -1450,16 +1451,16 @@ begin
   if FItems <> nil then
     for a := 0 to High(FItems) do
       if FItems[a].Control <> nil then
-        if LowerCase(FItems[a].Control.Name) = LowerCase(Name) then
+        if LowerCase(FItems[a].Control.Name) = LowerCase(aName) then
         begin
           Result := FItems[a].Control;
           Break;
         end;
 
-  Assert(Result <> nil, 'GUI control "'+Name+'" not found!');
+  Assert(Result <> nil, 'GUI control "'+aName+'" not found!');
 end;
 
-function TGUIMenu.GetControlsText(Name: String): TGUILabel;
+function TGUIMenu.GetControlsText(aName: String): TGUILabel;
 var
   a: Integer;
 begin
@@ -1468,13 +1469,13 @@ begin
   if FItems <> nil then
     for a := 0 to High(FItems) do
       if FItems[a].Control <> nil then
-        if LowerCase(FItems[a].Control.Name) = LowerCase(Name) then
+        if LowerCase(FItems[a].Control.Name) = LowerCase(aName) then
         begin
           Result := FItems[a].Text;
           Break;
         end;
 
-  Assert(Result <> nil, 'GUI control''s text "'+Name+'" not found!');
+  Assert(Result <> nil, 'GUI control''s text "'+aName+'" not found!');
 end;
 
 function TGUIMenu.NewItem: Integer;
@@ -2640,7 +2641,7 @@ begin
   if FModel = nil then
     Exit;
 
-  if FModel.Weapon < WEAPON_SUPERPULEMET then
+  if FModel.Weapon < WP_LAST then
     FModel.SetWeapon(FModel.Weapon+1)
   else
     FModel.SetWeapon(WEAPON_KASTET);
@@ -2775,15 +2776,20 @@ end;
 procedure TGUIMapPreview.SetMap(Res: string);
 var
   WAD: TWADFile;
-  MapReader: TMapReader_1;
-  panels: TPanelsRec1Array;
-  header: TMapHeaderRec_1;
-  a: Integer;
+  panlist: TDynField;
+  pan: TDynRecord;
+  //header: TMapHeaderRec_1;
   FileName: string;
   Data: Pointer;
   Len: Integer;
   rX, rY: Single;
+  map: TDynRecord = nil;
 begin
+  FMapSize.X := 0;
+  FMapSize.Y := 0;
+  FScale := 0.0;
+  FMapData := nil;
+
   FileName := g_ExtractWadName(Res);
 
   WAD := TWADFile.Create();
@@ -2802,68 +2808,71 @@ begin
 
   WAD.Free();
 
-  MapReader := TMapReader_1.Create();
-
-  if not MapReader.LoadMap(Data) then
-  begin
+  try
+    map := g_Map_ParseMap(Data, Len);
+  except
     FreeMem(Data);
-    MapReader.Free();
-    FMapSize.X := 0;
-    FMapSize.Y := 0;
-    FScale := 0.0;
-    FMapData := nil;
-    Exit;
+    map.Free();
+    //raise;
+    exit;
   end;
 
   FreeMem(Data);
 
-  panels := MapReader.GetPanels();
-  header := MapReader.GetMapHeader();
+  if (map = nil) then exit;
 
-  FMapSize.X := header.Width div 16;
-  FMapSize.Y := header.Height div 16;
+  try
+    panlist := map.field['panel'];
+    //header := GetMapHeader(map);
 
-  rX := Ceil(header.Width / (MAPPREVIEW_WIDTH*256.0));
-  rY := Ceil(header.Height / (MAPPREVIEW_HEIGHT*256.0));
-  FScale := max(rX, rY);
+    FMapSize.X := map.Width div 16;
+    FMapSize.Y := map.Height div 16;
 
-  FMapData := nil;
+    rX := Ceil(map.Width / (MAPPREVIEW_WIDTH*256.0));
+    rY := Ceil(map.Height / (MAPPREVIEW_HEIGHT*256.0));
+    FScale := max(rX, rY);
 
-  if panels <> nil then
-    for a := 0 to High(panels) do
-      if WordBool(panels[a].PanelType and (PANEL_WALL or PANEL_CLOSEDOOR or
-                                           PANEL_STEP or PANEL_WATER or
-                                           PANEL_ACID1 or PANEL_ACID2)) then
+    FMapData := nil;
+
+    if (panlist <> nil) then
+    begin
+      for pan in panlist do
       begin
-        SetLength(FMapData, Length(FMapData)+1);
-        with FMapData[High(FMapData)] do
+        if (pan.PanelType and (PANEL_WALL or PANEL_CLOSEDOOR or
+                                             PANEL_STEP or PANEL_WATER or
+                                             PANEL_ACID1 or PANEL_ACID2)) <> 0 then
         begin
-          X1 := panels[a].X div 16;
-          Y1 := panels[a].Y div 16;
+          SetLength(FMapData, Length(FMapData)+1);
+          with FMapData[High(FMapData)] do
+          begin
+            X1 := pan.X div 16;
+            Y1 := pan.Y div 16;
 
-          X2 := (panels[a].X + panels[a].Width) div 16;
-          Y2 := (panels[a].Y + panels[a].Height) div 16;
+            X2 := (pan.X + pan.Width) div 16;
+            Y2 := (pan.Y + pan.Height) div 16;
 
-          X1 := Trunc(X1/FScale + 0.5);
-          Y1 := Trunc(Y1/FScale + 0.5);
-          X2 := Trunc(X2/FScale + 0.5);
-          Y2 := Trunc(Y2/FScale + 0.5);
+            X1 := Trunc(X1/FScale + 0.5);
+            Y1 := Trunc(Y1/FScale + 0.5);
+            X2 := Trunc(X2/FScale + 0.5);
+            Y2 := Trunc(Y2/FScale + 0.5);
 
-          if (X1 <> X2) or (Y1 <> Y2) then
-          begin
-            if X1 = X2 then
-              X2 := X2 + 1;
-            if Y1 = Y2 then
-              Y2 := Y2 + 1;
-          end;
+            if (X1 <> X2) or (Y1 <> Y2) then
+            begin
+              if X1 = X2 then
+                X2 := X2 + 1;
+              if Y1 = Y2 then
+                Y2 := Y2 + 1;
+            end;
 
-          PanelType := panels[a].PanelType;
+            PanelType := pan.PanelType;
+          end;
+        end;
       end;
-   end;
-
-  panels := nil;
-
-  MapReader.Free();
+    end;
+  finally
+    //writeln('freeing map');
+    map.Free();
+  end;
 end;
 
 procedure TGUIMapPreview.ClearMap();