diff --git a/src/game/g_gui.pas b/src/game/g_gui.pas
index eb068102514c2f030fad1f629875513445b1de64..78554a776ec932cc6f6a7f7647541a0848b80f11 100644 (file)
--- a/src/game/g_gui.pas
+++ b/src/game/g_gui.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
interface
uses
- e_graphics, e_input, e_log, g_playermodel, g_basic, MAPSTRUCT, wadreader;
+ {$IFDEF USE_MEMPOOL}mempool,{$ENDIF}
+ e_graphics, e_input, e_log, g_playermodel, g_basic, MAPDEF, utils;
const
MAINMENU_HEADER_COLOR: TRGB = (R:255; G:255; B:255);
lParam: LongInt;
end;
- TFontType = (FONT_TEXTURE, FONT_CHAR);
+ TFontType = (Texture, Character);
- TFont = class(TObject)
+ TFont = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
private
ID: DWORD;
FScale: Single;
TOnChangeEvent = procedure(Sender: TGUIControl);
TOnEnterEvent = procedure(Sender: TGUIControl);
- TGUIControl = class
+ TGUIControl = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
private
FX, FY: Integer;
FEnabled: Boolean;
property RightAlign: Boolean read FRightAlign write FRightAlign; // for menu
end;
- TGUIWindow = class
+ TGUIWindow = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
private
FActiveControl: TGUIControl;
FDefControl: string;
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;
FMiddleID: DWORD;
FOnChangeEvent: TOnChangeEvent;
FOnEnterEvent: TOnEnterEvent;
+ FInvalid: Boolean;
procedure SetText(Text: string);
public
constructor Create(FontID: DWORD);
property Text: string read FText write SetText;
property Color: TRGB read FColor write FColor;
property Font: TFont read FFont write FFont;
+ property Invalid: Boolean read FInvalid write FInvalid;
end;
TGUIKeyRead = class(TGUIControl)
TGUIMapPreview = class(TGUIControl)
private
FMapData: array of TPreviewPanel;
- FMapSize: TPoint;
+ FMapSize: TDFPoint;
FScale: Single;
public
constructor Create();
TGUIListBox = class(TGUIControl)
private
- FItems: SArray;
+ FItems: SSArray;
FActiveColor: TRGB;
FUnActiveColor: TRGB;
FFont: TFont;
FDrawScroll: Boolean;
FOnChangeEvent: TOnChangeEvent;
- procedure FSetItems(Items: SArray);
+ procedure FSetItems(Items: SSArray);
procedure FSetIndex(aIndex: Integer);
public
property OnChange: TOnChangeEvent read FOnChangeEvent write FOnChangeEvent;
property Sort: Boolean read FSort write FSort;
property ItemIndex: Integer read FIndex write FSetIndex;
- property Items: SArray read FItems write FSetItems;
+ property Items: SSArray read FItems write FSetItems;
property DrawBack: Boolean read FDrawBack write FDrawBack;
property DrawScrollBar: Boolean read FDrawScroll write FDrawScroll;
property ActiveColor: TRGB read FActiveColor write FActiveColor;
property Font: TFont read FFont write FFont;
end;
- TGUIFileListBox = class (TGUIListBox)
+ TGUIFileListBox = class(TGUIListBox)
private
FBasePath: String;
FPath: String;
TGUIMemo = class(TGUIControl)
private
- FLines: SArray;
+ FLines: SSArray;
FFont: TFont;
FStartLine: Integer;
FWidth: Word;
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;
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();
procedure g_GUI_SaveMenuPos();
procedure g_GUI_LoadMenuPos();
+
implementation
uses
- GL, GLExt, g_textures, g_sound, SysUtils,
- g_game, Math, StrUtils, g_player, g_options, MAPREADER,
- g_map, MAPDEF, g_weapons;
+{$IFDEF USE_NANOGL}
+ nanoGL,
+{$ELSE}
+ GL, GLExt,
+{$ENDIF}
+ g_textures, g_sound, SysUtils,
+ g_game, Math, StrUtils, g_player, g_options,
+ g_map, g_weapons, xdynrec, wadreader;
+
var
Box: Array [0..8] of DWORD;
- Saved_Windows: SArray;
+ Saved_Windows: SSArray;
+
procedure g_GUI_Init();
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);
+ FFont := TFont.Create(FontID, TFontType.Character);
FText := Text;
end;
procedure TFont.Draw(X, Y: Integer; Text: string; R, G, B: Byte);
begin
- if FFontType = FONT_CHAR then e_CharFont_PrintEx(ID, X, Y, Text, _RGB(R, G, B), FScale)
+ if FFontType = TFontType.Character then e_CharFont_PrintEx(ID, X, Y, Text, _RGB(R, G, B), FScale)
else e_TextureFontPrintEx(X, Y, Text, ID, R, G, B, FScale);
end;
var
cw, ch: Byte;
begin
- if FFontType = FONT_CHAR then e_CharFont_GetSize(ID, Text, w, h)
+ if FFontType = TFontType.Character then e_CharFont_GetSize(ID, Text, w, h)
else
begin
e_TextureFontGetSize(ID, cw, ch);
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;
end;
end;
-function TGUIMainMenu.GetButton(Name: string): TGUITextButton;
+function TGUIMainMenu.GetButton(aName: string): TGUITextButton;
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
Result := FButtons[a];
Break;
begin
inherited Create();
- FFont := TFont.Create(FontID, FONT_CHAR);
+ FFont := TFont.Create(FontID, TFontType.Character);
FText := Text;
FFixedLen := 0;
procedure TGUIMenu.AddText(fText: string; MaxWidth: Word);
var
a, i: Integer;
- l: SArray;
+ l: SSArray;
begin
l := GetLines(fText, FFontID, MaxWidth);
procedure TGUIMenu.Draw;
var
- a, x, y: Integer;
+ a, locx, locy: Integer;
begin
inherited;
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
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
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;
FIndex := -1;
- FFont := TFont.Create(FontID, FONT_CHAR);
+ FFont := TFont.Create(FontID, TFontType.Character);
end;
procedure TGUISwitch.Draw;
begin
inherited Create();
- FFont := TFont.Create(FontID, FONT_CHAR);
+ FFont := TFont.Create(FontID, TFontType.Character);
FMaxLength := 0;
FWidth := 0;
+ FInvalid := false;
g_Texture_Get(EDIT_LEFT, FLeftID);
g_Texture_Get(EDIT_RIGHT, FRightID);
procedure TGUIEdit.Draw;
var
c, w, h: Word;
+ r, g, b: Byte;
begin
inherited;
for c := 0 to FWidth-1 do
e_Draw(FMiddleID, FX+8+c*16, FY, 0, True, False);
- FFont.Draw(FX+8, FY, FText, FColor.R, FColor.G, FColor.B);
+ r := FColor.R;
+ g := FColor.G;
+ b := FColor.B;
+ if FInvalid and (FWindow.FActiveControl <> self) then begin r := 128; g := 128; b := 128; end;
+ FFont.Draw(FX+8, FY, FText, r, g, b);
- if FWindow.FActiveControl = Self then
+ if (FWindow.FActiveControl = self) then
begin
FFont.GetTextSize(Copy(FText, 1, FCaretPos), w, h);
h := e_CharFont_GetMaxHeight(FFont.ID);
FKey := 0;
FIsQuery := false;
- FFont := TFont.Create(FontID, FONT_CHAR);
+ FFont := TFont.Create(FontID, TFontType.Character);
end;
procedure TGUIKeyRead.Draw;
FIsQuery := False;
FFontID := FontID;
- FFont := TFont.Create(FontID, FONT_CHAR);
+ FFont := TFont.Create(FontID, TFontType.Character);
FMaxKeyNameWdt := 0;
for a := 0 to 255 do
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();
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);
+
+ FMapData := nil;
- 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
+ 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();
begin
inherited Create();
- FFont := TFont.Create(FontID, FONT_CHAR);
+ FFont := TFont.Create(FontID, TFontType.Character);
FWidth := Width;
FHeight := Height;
Result := FItems[FIndex];
end;
-procedure TGUIListBox.FSetItems(Items: SArray);
+procedure TGUIListBox.FSetItems(Items: SSArray);
begin
if FItems <> nil then
FItems := nil;
begin
inherited Create();
- FFont := TFont.Create(FontID, FONT_CHAR);
+ FFont := TFont.Create(FontID, TFontType.Character);
FWidth := Width;
FHeight := Height;