X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_gui.pas;h=4bf8f7ceebdb91b961738448a90ae1a195f78053;hb=e979719019322a78e7fded8fd96130c18cf31972;hp=0c7f12659e2584350039ce93d1ec01da7f8556c5;hpb=414f2873efa0cce84499f64774db7000e6268971;p=d2df-sdl.git diff --git a/src/game/g_gui.pas b/src/game/g_gui.pas index 0c7f126..4bf8f7c 100644 --- a/src/game/g_gui.pas +++ b/src/game/g_gui.pas @@ -19,7 +19,7 @@ interface uses {$IFDEF USE_MEMPOOL}mempool,{$ENDIF} - e_graphics, e_input, e_log, g_playermodel, g_basic, g_touch, MAPDEF, utils; + g_base, r_graphics, e_input, e_log, g_playermodel, g_basic, g_touch, MAPDEF, utils; const MAINMENU_HEADER_COLOR: TRGB = (R:255; G:255; B:255); @@ -75,6 +75,8 @@ const WM_CHAR = 102; WM_USER = 110; + MESSAGE_DIKEY = WM_USER + 1; + type TMessage = record Msg: DWORD; @@ -550,9 +552,8 @@ procedure g_GUI_LoadMenuPos(); implementation uses - {$INCLUDE ../nogl/noGLuses.inc} - g_textures, g_sound, SysUtils, e_res, - g_game, Math, StrUtils, g_player, g_options, + g_sound, SysUtils, e_res, r_textures, + g_game, Math, StrUtils, g_player, g_options, r_playermodel, g_map, g_weapons, xdynrec, wadreader; @@ -560,6 +561,59 @@ var Box: Array [0..8] of DWORD; Saved_Windows: SSArray; +function GetLines (Text: string; FontID: DWORD; MaxWidth: Word): SSArray; + var i, j, len, lines: Integer; + + function GetLine (j, i: Integer): String; + begin + result := Copy(text, j, i - j + 1); + end; + + function GetWidth (j, i: Integer): Integer; + var w, h: Word; + begin + e_CharFont_GetSize(FontID, GetLine(j, i), w, h); + result := w + end; + +begin + result := nil; lines := 0; + j := 1; i := 1; len := Length(Text); + // e_LogWritefln('GetLines @%s len=%s [%s]', [MaxWidth, len, Text]); + while j <= len do + begin + (* --- Get longest possible sequence --- *) + while (i + 1 <= len) and (GetWidth(j, i + 1) <= MaxWidth) do Inc(i); + (* --- Do not include part of word --- *) + if (i < len) and (text[i] <> ' ') then + while (i >= j) and (text[i] <> ' ') do Dec(i); + (* --- Do not include spaces --- *) + while (i >= j) and (text[i] = ' ') do Dec(i); + (* --- Add line --- *) + SetLength(result, lines + 1); + result[lines] := GetLine(j, i); + // e_LogWritefln(' -> (%s:%s::%s) [%s]', [j, i, GetWidth(j, i), result[lines]]); + Inc(lines); + (* --- Skip spaces --- *) + while (i <= len) and (text[i] = ' ') do Inc(i); + j := i + 2; + end; +end; + +procedure Sort (var a: SSArray); + var i, j: Integer; s: string; +begin + if a = nil then Exit; + + for i := High(a) downto Low(a) do + for j := Low(a) to High(a) - 1 do + if LowerCase(a[j]) > LowerCase(a[j + 1]) then + begin + s := a[j]; + a[j] := a[j + 1]; + a[j + 1] := s; + end; +end; procedure g_GUI_Init(); begin @@ -819,7 +873,7 @@ begin if FBackTexture <> '' then // Here goes code duplication from g_game.pas:DrawMenuBackground() if g_Texture_Get(FBackTexture, ID) then begin - e_Clear(GL_COLOR_BUFFER_BIT, 0, 0, 0); + e_Clear(0, 0, 0); e_GetTextureSize(ID, @tw, @th); if tw = th then tw := round(tw * 1.333 * (gScreenHeight / th)) @@ -828,7 +882,7 @@ begin e_DrawSize(ID, (gScreenWidth - tw) div 2, 0, 0, False, False, tw, gScreenHeight); end else - e_Clear(GL_COLOR_BUFFER_BIT, 0.5, 0.5, 0.5); + e_Clear(0.5, 0.5, 0.5); // small hack here if FName = 'AuthorsMenu' then @@ -2226,21 +2280,25 @@ begin else FIndex := 0; + g_Sound_PlayEx(SCROLL_ADDSOUND); + if @FOnChangeEvent <> nil then FOnChangeEvent(Self); end; - IK_LEFT, IK_KPLEFT, VK_LEFT, - JOY0_LEFT, JOY1_LEFT, JOY2_LEFT, JOY3_LEFT: - begin - if FIndex > 0 then - Dec(FIndex) - else - FIndex := High(FItems); + IK_LEFT, IK_KPLEFT, VK_LEFT, + JOY0_LEFT, JOY1_LEFT, JOY2_LEFT, JOY3_LEFT: + begin + if FIndex > 0 then + Dec(FIndex) + else + FIndex := High(FItems); - if @FOnChangeEvent <> nil then - FOnChangeEvent(Self); - end; + g_Sound_PlayEx(SCROLL_SUBSOUND); + + if @FOnChangeEvent <> nil then + FOnChangeEvent(Self); + end; end; end; end; @@ -2690,7 +2748,8 @@ begin DrawBox(FX, FY, 4, 4); - if FModel <> nil then FModel.Draw(FX+4, FY+4); + if FModel <> nil then + r_PlayerModel_Draw(FModel, FX+4, FY+4); end; procedure TGUIModelView.NextAnim(); @@ -2980,7 +3039,7 @@ begin SetLength(FItems, Length(FItems)+1); FItems[High(FItems)] := Item; - if FSort then g_Basic.Sort(FItems); + if FSort then g_gui.Sort(FItems); end; function TGUIListBox.ItemExists (item: String): Boolean; @@ -3135,7 +3194,7 @@ begin FStartLine := 0; FIndex := -1; - if FSort then g_Basic.Sort(FItems); + if FSort then g_gui.Sort(FItems); end; procedure TGUIListBox.SelectItem(Item: String);