diff --git a/src/game/g_gui.pas b/src/game/g_gui.pas
index f1d86ae37244c61a559e996d4b124a7efb93ba0b..d7735ab374d568a4e51cf47c543f1a2c458d7522 100644 (file)
--- a/src/game/g_gui.pas
+++ b/src/game/g_gui.pas
* 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;
+ e_graphics, e_input, e_log, g_playermodel, g_basic, MAPDEF, wadreader;
const
MAINMENU_HEADER_COLOR: TRGB = (R:255; G:255; B:255);
FWindow : TGUIWindow;
FName: string;
FUserData: Pointer;
+ FRightAlign: Boolean; //HACK! this works only for "normal" menus, only for menu text labels, and generally sux. sorry.
+ FMaxWidth: Integer; //HACK! used for right-aligning labels
public
constructor Create;
procedure OnMessage(var Msg: TMessage); virtual;
procedure Update; virtual;
procedure Draw; virtual;
+ function GetWidth(): Integer; virtual;
+ function GetHeight(): Integer; virtual;
function WantActivationKey (key: LongInt): Boolean; virtual;
property X: Integer read FX write FX;
property Y: Integer read FY write FY;
property Enabled: Boolean read FEnabled write FEnabled;
property Name: string read FName write FName;
property UserData: Pointer read FUserData write FUserData;
+ property RightAlign: Boolean read FRightAlign write FRightAlign; // for menu
end;
TGUIWindow = class
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;
procedure Draw(); override;
- function GetWidth(): Integer;
- function GetHeight(): Integer;
+ function GetWidth(): Integer; override;
+ function GetHeight(): Integer; override;
procedure Click(Silent: Boolean = False);
property Caption: string read FText write FText;
property Color: TRGB read FColor write FColor;
constructor Create(Text: string; FontID: DWORD);
procedure OnMessage(var Msg: TMessage); override;
procedure Draw; override;
- function GetWidth: Integer;
- function GetHeight: Integer;
+ function GetWidth: Integer; override;
+ function GetHeight: Integer; override;
property OnClick: TOnClickEvent read FOnClickEvent write FOnClickEvent;
property FixedLength: Word read FFixedLen write FFixedLen;
property Text: string read FText write FText;
procedure OnMessage(var Msg: TMessage); override;
procedure Update; override;
procedure Draw; override;
- function GetWidth(): Word;
+ function GetWidth(): Integer; override;
property OnChange: TOnChangeEvent read FOnChangeEvent write FOnChangeEvent;
property Max: Word read FMax write FMax;
property Value: Integer read FValue write FSetValue;
procedure AddItem(Item: string);
procedure Update; override;
procedure Draw; override;
- function GetWidth(): Word;
+ function GetWidth(): Integer; override;
function GetText: string;
property ItemIndex: Integer read FIndex write FIndex;
property Color: TRGB read FColor write FColor;
procedure OnMessage(var Msg: TMessage); override;
procedure Update; override;
procedure Draw; override;
- function GetWidth(): Word;
+ function GetWidth(): Integer; override;
property OnChange: TOnChangeEvent read FOnChangeEvent write FOnChangeEvent;
property OnEnter: TOnEnterEvent read FOnEnterEvent write FOnEnterEvent;
property Width: Word read FWidth write FWidth;
constructor Create(FontID: DWORD);
procedure OnMessage(var Msg: TMessage); override;
procedure Draw; override;
- function GetWidth(): Word;
+ function GetWidth(): Integer; override;
function WantActivationKey (key: LongInt): Boolean; override;
property Key: Word read FKey write FKey;
property Color: TRGB read FColor write FColor;
constructor Create(FontID: DWORD);
procedure OnMessage(var Msg: TMessage); override;
procedure Draw; override;
- function GetWidth(): Word;
+ function GetWidth(): Integer; override;
function WantActivationKey (key: LongInt): Boolean; override;
property Key0: Word read FKey0 write FKey0;
property Key1: Word read FKey1 write FKey1;
TGUIMapPreview = class(TGUIControl)
private
FMapData: array of TPreviewPanel;
- FMapSize: TPoint;
+ FMapSize: TDFPoint;
FScale: Single;
public
constructor Create();
procedure AddItem(Item: String);
procedure SelectItem(Item: String);
procedure Clear();
- function GetWidth(): Word;
- function GetHeight(): Word;
+ function GetWidth(): Integer; override;
+ function GetHeight(): Integer; override;
function SelectedItem(): String;
property OnChange: TOnChangeEvent read FOnChangeEvent write FOnChangeEvent;
procedure OnMessage(var Msg: TMessage); override;
procedure Draw; override;
procedure Clear;
- function GetWidth(): Word;
- function GetHeight(): Word;
+ function GetWidth(): Integer; override;
+ function GetHeight(): Integer; override;
procedure SetText(Text: string);
property DrawBack: Boolean read FDrawBack write FDrawBack;
property DrawScrollBar: Boolean read FDrawScroll write FDrawScroll;
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();
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;
FY := 0;
FEnabled := True;
+ FRightAlign := false;
+ FMaxWidth := -1;
end;
procedure TGUIControl.OnMessage(var Msg: TMessage);
result := false;
end;
+function TGUIControl.GetWidth(): Integer;
+begin
+ result := 0;
+end;
+
+function TGUIControl.GetHeight(): Integer;
+begin
+ result := 0;
+end;
+
{ TGUITextButton }
procedure TGUITextButton.Click(Silent: Boolean = False);
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);
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;
end;
procedure TGUILabel.Draw;
+var
+ w, h: Word;
begin
- FFont.Draw(FX, FY, FText, FColor.R, FColor.G, FColor.B);
+ if RightAlign then
+ begin
+ FFont.GetTextSize(FText, w, h);
+ FFont.Draw(FX+FMaxWidth-w, FY, FText, FColor.R, FColor.G, FColor.B);
+ end
+ else
+ begin
+ FFont.Draw(FX, FY, FText, FColor.R, FColor.G, FColor.B);
+ end;
end;
function TGUILabel.GetHeight: Integer;
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
+ 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;
procedure TGUIMenu.ReAlign();
var
a, tx, cx, w, h: Integer;
+ cww: array of Integer; // cached widths
+ maxcww: Integer;
begin
if FItems = nil then Exit;
- if not FAlign then tx := FLeft else
+ SetLength(cww, length(FItems));
+ maxcww := 0;
+ for a := 0 to High(FItems) do
+ begin
+ if FItems[a].Text <> nil then
+ begin
+ cww[a] := FItems[a].Text.GetWidth;
+ if maxcww < cww[a] then maxcww := cww[a];
+ end;
+ end;
+
+ if not FAlign then
+ begin
+ tx := FLeft;
+ end
+ else
begin
tx := gScreenWidth;
for a := 0 to High(FItems) do
if FItems[a].Control <> nil then
begin
w := w+MENU_HSPACE;
-
- if FItems[a].ControlType = TGUILabel then
- w := w+(FItems[a].Control as TGUILabel).GetWidth
- else if FItems[a].ControlType = TGUITextButton then
- w := w+(FItems[a].Control as TGUITextButton).GetWidth
- else if FItems[a].ControlType = TGUIScroll then
- w := w+(FItems[a].Control as TGUIScroll).GetWidth
- else if FItems[a].ControlType = TGUISwitch then
- w := w+(FItems[a].Control as TGUISwitch).GetWidth
- else if FItems[a].ControlType = TGUIEdit then
- w := w+(FItems[a].Control as TGUIEdit).GetWidth
- else if FItems[a].ControlType = TGUIKeyRead then
- w := w+(FItems[a].Control as TGUIKeyRead).GetWidth
- else if FItems[a].ControlType = TGUIKeyRead2 then
- w := w+(FItems[a].Control as TGUIKeyRead2).GetWidth
- else if (FItems[a].ControlType = TGUIListBox) then
- w := w+(FItems[a].Control as TGUIListBox).GetWidth
- else if (FItems[a].ControlType = TGUIFileListBox) then
- w := w+(FItems[a].Control as TGUIFileListBox).GetWidth
- else if FItems[a].ControlType = TGUIMemo then
- w := w+(FItems[a].Control as TGUIMemo).GetWidth;
+ if FItems[a].ControlType = TGUILabel then w := w+(FItems[a].Control as TGUILabel).GetWidth
+ else if FItems[a].ControlType = TGUITextButton then w := w+(FItems[a].Control as TGUITextButton).GetWidth
+ else if FItems[a].ControlType = TGUIScroll then w := w+(FItems[a].Control as TGUIScroll).GetWidth
+ else if FItems[a].ControlType = TGUISwitch then w := w+(FItems[a].Control as TGUISwitch).GetWidth
+ else if FItems[a].ControlType = TGUIEdit then w := w+(FItems[a].Control as TGUIEdit).GetWidth
+ else if FItems[a].ControlType = TGUIKeyRead then w := w+(FItems[a].Control as TGUIKeyRead).GetWidth
+ else if FItems[a].ControlType = TGUIKeyRead2 then w := w+(FItems[a].Control as TGUIKeyRead2).GetWidth
+ else if FItems[a].ControlType = TGUIListBox then w := w+(FItems[a].Control as TGUIListBox).GetWidth
+ else if FItems[a].ControlType = TGUIFileListBox then w := w+(FItems[a].Control as TGUIFileListBox).GetWidth
+ else if FItems[a].ControlType = TGUIMemo then w := w+(FItems[a].Control as TGUIMemo).GetWidth;
end;
-
tx := Min(tx, (gScreenWidth div 2)-(w div 2));
end;
end;
end;
for a := 0 to High(FItems) do
+ begin
with FItems[a] do
begin
if Text <> nil then
+ begin
with Text do
begin
FX := tx;
FY := h;
end;
+ //HACK!
+ if Text.RightAlign and (length(cww) > a) then
+ begin
+ //Text.FX := Text.FX+maxcww;
+ Text.FMaxWidth := maxcww;
+ end;
+ end;
- if Control <> nil then
- with Control do
- if Text <> nil then
- begin
- FX := cx;
- FY := h;
- end
- else
- begin
- FX := tx;
- FY := h;
- end;
+ if Control <> nil then
+ begin
+ with Control do
+ begin
+ if Text <> nil then
+ begin
+ FX := cx;
+ FY := h;
+ end
+ else
+ begin
+ FX := tx;
+ FY := h;
+ end;
+ end;
+ end;
- if (ControlType = TGUIListBox) or (ControlType = TGUIFileListBox) then
- Inc(h, (Control as TGUIListBox).GetHeight+MENU_VSPACE)
- else if ControlType = TGUIMemo then
- Inc(h, (Control as TGUIMemo).GetHeight+MENU_VSPACE)
- else
- Inc(h, e_CharFont_GetMaxHeight(FFontID)+MENU_VSPACE);
+ if (ControlType = TGUIListBox) or (ControlType = TGUIFileListBox) then Inc(h, (Control as TGUIListBox).GetHeight+MENU_VSPACE)
+ else if ControlType = TGUIMemo then Inc(h, (Control as TGUIMemo).GetHeight+MENU_VSPACE)
+ else Inc(h, e_CharFont_GetMaxHeight(FFontID)+MENU_VSPACE);
end;
+ end;
// another ugly hack
if FYesNo and (length(FItems) > 1) then
Text := TGUILabel.Create(fText, FFontID);
with Text do
begin
- FColor := MENU_ITEMSTEXT_COLOR;
+ FColor := MENU_ITEMSCTRL_COLOR; //MENU_ITEMSTEXT_COLOR;
+ RightAlign := true;
end;
ControlType := TGUIKeyRead2;
if a > FMax then FValue := FMax else FValue := a;
end;
-function TGUIScroll.GetWidth: Word;
+function TGUIScroll.GetWidth: Integer;
begin
Result := 16+(FMax+1)*8;
end;
else Result := '';
end;
-function TGUISwitch.GetWidth: Word;
+function TGUISwitch.GetWidth: Integer;
var
a: Integer;
w, h: Word;
end;
end;
-function TGUIEdit.GetWidth: Word;
+function TGUIEdit.GetWidth: Integer;
begin
Result := 16+FWidth*16;
end;
FColor.R, FColor.G, FColor.B);
end;
-function TGUIKeyRead.GetWidth: Word;
+function TGUIKeyRead.GetWidth: Integer;
var
a: Byte;
w, h: Word;
FMaxKeyNameWdt := Max(FMaxKeyNameWdt, w);
end;
+ FMaxKeyNameWdt := FMaxKeyNameWdt-(FMaxKeyNameWdt div 3);
+
FFont.GetTextSize(KEYREAD_QUERY, w, h);
if w > FMaxKeyNameWdt then FMaxKeyNameWdt := w;
r := 255;
g := 0;
b := 0;
- if FKeyIdx = idx then g := 127;
+ if FKeyIdx = idx then begin r := 255; g := 255; b := 255; end;
if FIsQuery and (FKeyIdx = idx) then
FFont.Draw(x, y, KEYREAD_QUERY, r, g, b)
else
drawText(1);
end;
-function TGUIKeyRead2.GetWidth: Word;
+function TGUIKeyRead2.GetWidth: Integer;
begin
Result := FMaxKeyNameWdt*2+8+8+16;
end;
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);
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
- FreeMem(Data);
- MapReader.Free();
- FMapSize.X := 0;
- FMapSize.Y := 0;
- FScale := 0.0;
- FMapData := nil;
- Exit;
+ try
+ map := g_Map_ParseMap(Data, Len);
+ except
+ map.Free();
+ raise;
end;
FreeMem(Data);
- panels := MapReader.GetPanels();
- header := MapReader.GetMapHeader();
+ panlist := map.field['panel'];
+ //header := GetMapHeader(map);
- FMapSize.X := header.Width div 16;
- FMapSize.Y := header.Height div 16;
+ FMapSize.X := map.Width div 16;
+ FMapSize.Y := map.Height div 16;
- rX := Ceil(header.Width / (MAPPREVIEW_WIDTH*256.0));
- rY := Ceil(header.Height / (MAPPREVIEW_HEIGHT*256.0));
+ 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
+ if (panlist <> nil) then
+ begin
+ for pan in panlist do
+ begin
+ if (pan.PanelType and (PANEL_WALL or PANEL_CLOSEDOOR or
PANEL_STEP or PANEL_WATER or
- PANEL_ACID1 or PANEL_ACID2)) then
+ PANEL_ACID1 or PANEL_ACID2)) <> 0 then
begin
SetLength(FMapData, Length(FMapData)+1);
with FMapData[High(FMapData)] do
begin
- X1 := panels[a].X div 16;
- Y1 := panels[a].Y div 16;
+ 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);
Y2 := Y2 + 1;
end;
- PanelType := panels[a].PanelType;
+ PanelType := pan.PanelType;
+ end;
end;
- end;
-
- panels := nil;
+ end;
+ end;
- MapReader.Free();
+ map.Free();
end;
procedure TGUIMapPreview.ClearMap();
end;
end;
-function TGUIListBox.GetHeight: Word;
+function TGUIListBox.GetHeight: Integer;
begin
Result := 8+FHeight*16;
end;
-function TGUIListBox.GetWidth: Word;
+function TGUIListBox.GetWidth: Integer;
begin
Result := 8+(FWidth+1)*16;
end;
FFont.Draw(FX+4, FY+4+(a-FStartLine)*16, FLines[a], FColor.R, FColor.G, FColor.B);
end;
-function TGUIMemo.GetHeight: Word;
+function TGUIMemo.GetHeight: Integer;
begin
Result := 8+FHeight*16;
end;
-function TGUIMemo.GetWidth: Word;
+function TGUIMemo.GetWidth: Integer;
begin
Result := 8+(FWidth+1)*16;
end;