X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_gui.pas;h=78554a776ec932cc6f6a7f7647541a0848b80f11;hb=92b319e1feed5079e42c779aa49b12ffa8672f54;hp=45b2364f8adba30e40aa89565fc3648bfd26e24a;hpb=6d6df4e3427cd01e03e172984c9d0d391ff38032;p=d2df-sdl.git diff --git a/src/game/g_gui.pas b/src/game/g_gui.pas index 45b2364..78554a7 100644 --- a/src/game/g_gui.pas +++ b/src/game/g_gui.pas @@ -1,4 +1,4 @@ -(* 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 @@ -19,7 +19,8 @@ unit g_gui; interface uses - e_graphics, e_input, e_log, g_playermodel, g_basic, MAPDEF, 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); @@ -82,9 +83,9 @@ type 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; @@ -108,7 +109,7 @@ type TOnChangeEvent = procedure(Sender: TGUIControl); TOnEnterEvent = procedure(Sender: TGUIControl); - TGUIControl = class + TGUIControl = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF} 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{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF} private FActiveControl: TGUIControl; FDefControl: string; @@ -267,6 +268,7 @@ type FMiddleID: DWORD; FOnChangeEvent: TOnChangeEvent; FOnEnterEvent: TOnEnterEvent; + FInvalid: Boolean; procedure SetText(Text: string); public constructor Create(FontID: DWORD); @@ -282,6 +284,7 @@ type 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) @@ -378,7 +381,7 @@ type TGUIListBox = class(TGUIControl) private - FItems: SArray; + FItems: SSArray; FActiveColor: TRGB; FUnActiveColor: TRGB; FFont: TFont; @@ -391,7 +394,7 @@ type FDrawScroll: Boolean; FOnChangeEvent: TOnChangeEvent; - procedure FSetItems(Items: SArray); + procedure FSetItems(Items: SSArray); procedure FSetIndex(aIndex: Integer); public @@ -408,7 +411,7 @@ type 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; @@ -416,7 +419,7 @@ type property Font: TFont read FFont write FFont; end; - TGUIFileListBox = class (TGUIListBox) + TGUIFileListBox = class(TGUIListBox) private FBasePath: String; FPath: String; @@ -438,7 +441,7 @@ type TGUIMemo = class(TGUIControl) private - FLines: SArray; + FLines: SSArray; FFont: TFont; FStartLine: Integer; FWidth: Word; @@ -542,16 +545,24 @@ function g_GUI_Destroy(): Boolean; procedure g_GUI_SaveMenuPos(); procedure g_GUI_LoadMenuPos(); + implementation uses - GL, GLExt, g_textures, g_sound, SysUtils, +{$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; + g_map, g_weapons, xdynrec, wadreader; + var Box: Array [0..8] of DWORD; - Saved_Windows: SArray; + Saved_Windows: SSArray; + procedure g_GUI_Init(); begin @@ -914,7 +925,7 @@ begin Self.Proc := aProc; ProcEx := nil; - FFont := TFont.Create(FontID, FONT_CHAR); + FFont := TFont.Create(FontID, TFontType.Character); FText := Text; end; @@ -983,7 +994,7 @@ 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; @@ -991,7 +1002,7 @@ procedure TFont.GetTextSize(Text: string; var w, h: Word); 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); @@ -1214,7 +1225,7 @@ constructor TGUILabel.Create(Text: string; FontID: DWORD); begin inherited Create(); - FFont := TFont.Create(FontID, FONT_CHAR); + FFont := TFont.Create(FontID, TFontType.Character); FText := Text; FFixedLen := 0; @@ -1318,7 +1329,7 @@ end; procedure TGUIMenu.AddText(fText: string; MaxWidth: Word); var a, i: Integer; - l: SArray; + l: SSArray; begin l := GetLines(fText, FFontID, MaxWidth); @@ -2134,7 +2145,7 @@ begin FIndex := -1; - FFont := TFont.Create(FontID, FONT_CHAR); + FFont := TFont.Create(FontID, TFontType.Character); end; procedure TGUISwitch.Draw; @@ -2214,10 +2225,11 @@ constructor TGUIEdit.Create(FontID: DWORD); 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); @@ -2227,6 +2239,7 @@ end; procedure TGUIEdit.Draw; var c, w, h: Word; + r, g, b: Byte; begin inherited; @@ -2236,9 +2249,13 @@ begin 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); @@ -2330,7 +2347,7 @@ begin FKey := 0; FIsQuery := false; - FFont := TFont.Create(FontID, FONT_CHAR); + FFont := TFont.Create(FontID, TFontType.Character); end; procedure TGUIKeyRead.Draw; @@ -2453,7 +2470,7 @@ begin FIsQuery := False; FFontID := FontID; - FFont := TFont.Create(FontID, FONT_CHAR); + FFont := TFont.Create(FontID, TFontType.Character); FMaxKeyNameWdt := 0; for a := 0 to 255 do @@ -2775,10 +2792,9 @@ 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; @@ -2811,74 +2827,68 @@ begin try map := g_Map_ParseMap(Data, Len); except - map.Free(); - raise; - end; - - { - 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; + map.Free(); + //raise; + exit; end; - } FreeMem(Data); - panels := GetPanels(map); - header := GetMapHeader(map); + 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(); - map.Free(); + end; + finally + //writeln('freeing map'); + map.Free(); + end; end; procedure TGUIMapPreview.ClearMap(); @@ -2933,7 +2943,7 @@ constructor TGUIListBox.Create(FontID: DWORD; Width, Height: Word); begin inherited Create(); - FFont := TFont.Create(FontID, FONT_CHAR); + FFont := TFont.Create(FontID, TFontType.Character); FWidth := Width; FHeight := Height; @@ -3055,7 +3065,7 @@ begin Result := FItems[FIndex]; end; -procedure TGUIListBox.FSetItems(Items: SArray); +procedure TGUIListBox.FSetItems(Items: SSArray); begin if FItems <> nil then FItems := nil; @@ -3320,7 +3330,7 @@ constructor TGUIMemo.Create(FontID: DWORD; Width, Height: Word); begin inherited Create(); - FFont := TFont.Create(FontID, FONT_CHAR); + FFont := TFont.Create(FontID, TFontType.Character); FWidth := Width; FHeight := Height;