X-Git-Url: https://deadsoftware.ru/gitweb?p=d2df-sdl.git;a=blobdiff_plain;f=src%2Fgame%2Fg_menu.pas;h=fe650785d11a8b34baa3b623089b0788e1b37349;hp=4d2da495216be1983b5f6e38ae4454fc3f7dc6a0;hb=e452d337f0620b50d8d978b534437b2732134d8f;hpb=82108dd50fb12ef54f0cd04891901782781fe442 diff --git a/src/game/g_menu.pas b/src/game/g_menu.pas index 4d2da49..fe65078 100644 --- a/src/game/g_menu.pas +++ b/src/game/g_menu.pas @@ -38,6 +38,7 @@ var PromptIP: string; PromptPort: Word; TempScale: Integer = -1; + TempResScale: Integer = -1; implementation @@ -45,11 +46,11 @@ uses {$INCLUDE ../nogl/noGLuses.inc} g_gui, g_textures, e_graphics, g_main, g_window, g_game, g_map, g_basic, g_console, g_sound, g_gfx, g_player, g_options, g_weapons, - e_log, SysUtils, CONFIG, g_playermodel, DateUtils, sdl2, + e_log, SysUtils, CONFIG, g_playermodel, DateUtils, MAPDEF, Math, g_saveload, - e_texture, g_language, + e_texture, g_language, e_res, g_net, g_netmsg, g_netmaster, g_items, e_input, g_touch, - utils, wadreader; + utils, wadreader, g_system; type TYNCallback = procedure (yes:Boolean); @@ -108,6 +109,7 @@ var menu: TGUIMenu; i: Integer; ovs: Boolean; + s: AnsiString; begin menu := TGUIMenu(g_GUI_GetWindow('OptionsVideoMenu').GetControl('mOptionsVideoMenu')); @@ -118,10 +120,11 @@ begin ovs := gVSync; gVSync := TGUISwitch(menu.GetControl('swVSync')).ItemIndex = 0; - if (ovs <> gVSync) then g_SetVSync(gVSync); + if (ovs <> gVSync) then + sys_EnableVSync(gVSync); gTextureFilter := TGUISwitch(menu.GetControl('swTextureFilter')).ItemIndex = 0; - glLegacyNPOT := not (TGUISwitch(menu.GetControl('swLegacyNPOT')).ItemIndex = 0); + glNPOTOverride := not (TGUISwitch(menu.GetControl('swLegacyNPOT')).ItemIndex = 0); menu := TGUIMenu(g_GUI_GetWindow('OptionsSoundMenu').GetControl('mOptionsSoundMenu')); @@ -373,8 +376,10 @@ begin if g_Game_IsClient then MC_SEND_PlayerSettings; - g_Options_Write(GameDir+'/'+CONFIG_FILENAME); - g_Console_WriteGameConfig(); + s := e_GetWriteableDir(ConfigDirs); + if s <> '' then + g_Options_Write(s + '/' + CONFIG_FILENAME); + g_Console_WriteGameConfig; end; procedure ReadOptions(); @@ -397,7 +402,7 @@ begin if gVSync then ItemIndex := 0 else ItemIndex := 1; with TGUISwitch(menu.GetControl('swLegacyNPOT')) do - if not glLegacyNPOT then ItemIndex := 0 else ItemIndex := 1; + if not glNPOTOverride then ItemIndex := 0 else ItemIndex := 1; menu := TGUIMenu(g_GUI_GetWindow('OptionsSoundMenu').GetControl('mOptionsSoundMenu')); @@ -646,6 +651,7 @@ var Map: String; GameMode: Byte; Options: LongWord; + s: AnsiString; begin with TGUIMenu(g_ActiveWindow.GetControl('mCustomGameMenu')) do begin @@ -662,12 +668,18 @@ begin gcMaxLives := StrToIntDef(TGUIEdit(GetControl('edMaxLives')).Text, 0); gcTeamDamage := TGUISwitch(GetControl('swTeamDamage')).ItemIndex = 0; + gcRespawnItems := TGUISwitch(GetControl('swRespawnItems')).ItemIndex = 0; + gcDeathmatchKeys := TGUISwitch(GetControl('swDeathmatchKeys')).ItemIndex = 0; gcAllowExit := TGUISwitch(GetControl('swEnableExits')).ItemIndex = 0; gcWeaponStay := TGUISwitch(GetControl('swWeaponStay')).ItemIndex = 0; gcMonsters := TGUISwitch(GetControl('swMonsters')).ItemIndex = 0; Options := 0; if gcTeamDamage then Options := Options or GAME_OPTION_TEAMDAMAGE; + if gcRespawnItems then + Options := Options or GAME_OPTION_RESPAWNITEMS; + if gcDeathmatchKeys then + Options := Options or GAME_OPTION_DMKEYS; if gcAllowExit then Options := Options or GAME_OPTION_ALLOWEXIT; if gcWeaponStay then @@ -694,7 +706,9 @@ begin gcMap := Map; end; - g_Options_Write_Gameplay_Custom(GameDir+'/'+CONFIG_FILENAME); + s := e_GetWriteableDir(ConfigDirs); + if s <> '' then + g_Options_Write_Gameplay_Custom(s + '/' + CONFIG_FILENAME); g_Game_StartCustom(Map, GameMode, gcTimeLimit, gcGoalLimit, gcMaxLives, Options, gcPlayers); @@ -706,6 +720,7 @@ var Map: String; GameMode: Byte; Options: LongWord; + s: AnsiString; begin with TGUIMenu(g_ActiveWindow.GetControl('mNetServerMenu')) do begin @@ -723,12 +738,18 @@ begin NetPort := StrToIntDef(TGUIEdit(GetControl('edPort')).Text, 0); gnTeamDamage := TGUISwitch(GetControl('swTeamDamage')).ItemIndex = 0; + gnRespawnItems := TGUISwitch(GetControl('swRespawnItems')).ItemIndex = 0; + gnDeathmatchKeys := TGUISwitch(GetControl('swDeathmatchKeys')).ItemIndex = 0; gnAllowExit := TGUISwitch(GetControl('swEnableExits')).ItemIndex = 0; gnWeaponStay := TGUISwitch(GetControl('swWeaponStay')).ItemIndex = 0; gnMonsters := TGUISwitch(GetControl('swMonsters')).ItemIndex = 0; Options := 0; if gnTeamDamage then Options := Options or GAME_OPTION_TEAMDAMAGE; + if gnRespawnItems then + Options := Options or GAME_OPTION_RESPAWNITEMS; + if gnDeathmatchKeys then + Options := Options or GAME_OPTION_DMKEYS; if gnAllowExit then Options := Options or GAME_OPTION_ALLOWEXIT; if gnWeaponStay then @@ -760,8 +781,12 @@ begin NetUseMaster := TGUISwitch(GetControl('swUseMaster')).ItemIndex = 0; end; - g_Options_Write_Net_Server(GameDir+'/'+CONFIG_FILENAME); - g_Options_Write_Gameplay_Net(GameDir+'/'+CONFIG_FILENAME); + s := e_GetWriteableDir(ConfigDirs); + if s <> '' then + begin + g_Options_Write_Net_Server(s + '/' + CONFIG_FILENAME); + g_Options_Write_Gameplay_Net(s + '/' + CONFIG_FILENAME) + end; g_Game_StartServer(Map, GameMode, gnTimeLimit, gnGoalLimit, gnMaxLives, Options, gnPlayers, 0, NetPort); @@ -770,6 +795,7 @@ end; procedure ProcConnectNetGame(); var PW: String; + s: AnsiString; begin with TGUIMenu(g_ActiveWindow.GetControl('mNetClientMenu')) do begin @@ -778,13 +804,16 @@ begin PW := TGUIEdit(GetControl('edPW')).Text; end; - g_Options_Write_Net_Client(GameDir+'/'+CONFIG_FILENAME); + s := e_GetWriteableDir(ConfigDirs); + if s <> '' then + g_Options_Write_Net_Client(s + '/' + CONFIG_FILENAME); g_Game_StartClient(NetClientIP, NetClientPort, PW); end; procedure ProcEnterPassword(); var PW: string; + s: AnsiString; begin with TGUIMenu(g_ActiveWindow.GetControl('mClientPasswordMenu')) do begin @@ -793,7 +822,9 @@ begin PW := TGUIEdit(GetControl('edPW')).Text; end; - g_Options_Write_Net_Client(GameDir+'/'+CONFIG_FILENAME); + s := e_GetWriteableDir(ConfigDirs); + if s <> '' then + g_Options_Write_Net_Client(s + '/' + CONFIG_FILENAME); g_Game_StartClient(NetClientIP, NetClientPort, PW); end; @@ -810,7 +841,7 @@ begin NetInitDone := True; end; - g_Net_Slist_Set(NetSlistIP, NetSlistPort); + g_Net_Slist_Set(NetSlistIP, NetSlistPort, NetSlistList); gState := STATE_SLIST; g_ActiveWindow := nil; @@ -818,7 +849,7 @@ begin slWaitStr := _lc[I_NET_SLIST_WAIT]; g_Game_Draw; - ReDrawWindow; + sys_Repaint; slReturnPressed := True; if g_Net_Slist_Fetch(slCurrent) then @@ -839,9 +870,10 @@ var begin with TGUIMenu(g_ActiveWindow.GetControl('mCampaignMenu')) do begin - WAD := ExtractRelativePath(MapsDir, TGUIFileListBox(GetControl('lsWAD')).SelectedItem()); + WAD := TGUIFileListBox(GetControl('lsWAD')).SelectedItem(); TwoPlayers := TGUISwitch(GetControl('swPlayers')).ItemIndex = 1; end; + WAD := e_FindWadRel(MegawadDirs, WAD); if TwoPlayers then n := 2 @@ -1259,14 +1291,27 @@ begin end; end; -procedure ProcSingle1Player(); +procedure ProcSinglePlayer (n: Integer); + var wad, map: AnsiString; +begin + assert(n >= 1); + wad := g_ExtractWadName(gDefaultMegawadStart); + map := g_ExtractFilePathName(gDefaultMegawadStart); + if e_FindResource(AllMapDirs, wad) then + begin + wad := ExpandFileName(wad); + g_Game_StartSingle(wad + ':\' + map, n > 1, n) + end +end; + +procedure ProcSingle1Player; begin - g_Game_StartSingle(gDefaultMegawadStart, False, 1); + ProcSinglePlayer(1) end; -procedure ProcSingle2Players(); +procedure ProcSingle2Players; begin - g_Game_StartSingle(gDefaultMegawadStart, True, 2); + ProcSinglePlayer(2) end; procedure ProcSelectMapMenu(); @@ -1320,13 +1365,15 @@ var begin with TGUIMenu(g_ActiveWindow.GetControl('mSelectMapMenu')) do begin - wad := ExtractRelativePath(MapsDir, TGUIFileListBox(GetControl('lsMapWAD')).SelectedItem()); + wad := TGUIFileListBox(GetControl('lsMapWAD')).SelectedItem(); map := TGUIListBox(GetControl('lsMapRes')).SelectedItem(); end; if (wad = '') or (map = '') then Exit; + wad := e_FindWadRel(MapDirs, WAD); + res := wad+':\'+map; TGUILabel(TGUIMenu(g_GUI_GetWindow('CustomGameMenu').GetControl('mCustomGameMenu')).GetControl('lbMap')).Text := res; @@ -1622,32 +1669,24 @@ begin if yes then gExit := EXIT_SIMPLE else g_GUI_HideWindow; end; -procedure ProcSetRussianLanguage(); +procedure ProcSetRussianLanguage; begin if gLanguage <> LANGUAGE_RUSSIAN then begin gLanguage := LANGUAGE_RUSSIAN; gLanguageChange := True; gAskLanguage := False; - - g_Options_Write_Language(GameDir+'/'+CONFIG_FILENAME); - - // Ñîõðàíÿåì èçìåíåíèÿ âñåõ íàñòðîåê: ProcApplyOptions(); end; end; -procedure ProcSetEnglishLanguage(); +procedure ProcSetEnglishLanguage; begin if gLanguage <> LANGUAGE_ENGLISH then begin gLanguage := LANGUAGE_ENGLISH; gLanguageChange := True; gAskLanguage := False; - - g_Options_Write_Language(GameDir+'/'+CONFIG_FILENAME); - - // Ñîõðàíÿåì èçìåíåíèÿ âñåõ íàñòðîåê: ProcApplyOptions(); end; end; @@ -1665,6 +1704,11 @@ begin ItemIndex := 0 else ItemIndex := 1; + with TGUISwitch(menu.GetControl('swDeathmatchKeys')) do + if LongBool(Options and GAME_OPTION_DMKEYS) then + ItemIndex := 0 + else + ItemIndex := 1; TGUIEdit(menu.GetControl('edTimeLimit')).Text := IntToStr(TimeLimit); TGUIEdit(menu.GetControl('edGoalLimit')).Text := IntToStr(GoalLimit); @@ -1683,6 +1727,7 @@ begin if GameType in [GT_CUSTOM, GT_SERVER] then begin TGUISwitch(menu.GetControl('swTeamDamage')).Enabled := True; + TGUISwitch(menu.GetControl('swDeathmatchKeys')).Enabled := (GameMode in [GM_DM, GM_TDM, GM_CTF]); TGUIEdit(menu.GetControl('edTimeLimit')).Enabled := True; TGUILabel(menu.GetControlsText('edTimeLimit')).Color := MENU_ITEMSTEXT_COLOR; TGUIEdit(menu.GetControl('edGoalLimit')).Enabled := True; @@ -1694,6 +1739,7 @@ begin else begin TGUISwitch(menu.GetControl('swTeamDamage')).Enabled := True; + TGUISwitch(menu.GetControl('swDeathmatchKeys')).Enabled := False; with TGUIEdit(menu.GetControl('edTimeLimit')) do begin Enabled := False; @@ -1737,6 +1783,14 @@ begin Options := Options and (not GAME_OPTION_TEAMDAMAGE); end; + if TGUISwitch(menu.GetControl('swDeathmatchKeys')).Enabled then + begin + if TGUISwitch(menu.GetControl('swDeathmatchKeys')).ItemIndex = 0 then + Options := Options or GAME_OPTION_DMKEYS + else + Options := Options and (not GAME_OPTION_DMKEYS); + end; + if TGUIEdit(menu.GetControl('edTimeLimit')).Enabled then begin n := StrToIntDef(TGUIEdit(menu.GetControl('edTimeLimit')).Text, TimeLimit); @@ -1824,26 +1878,26 @@ procedure ProcVideoOptionsRes(); var menu: TGUIMenu; list: SSArray; - SR: DWORD; begin menu := TGUIMenu(g_GUI_GetWindow('OptionsVideoResMenu').GetControl('mOptionsVideoResMenu')); TGUILabel(menu.GetControl('lbCurrentRes')).Text := - IntToStr(gScreenWidth) + - ' x ' + IntToStr(gScreenHeight) + + IntToStr(gWinSizeX) + + ' x ' + IntToStr(gWinSizeY) + ', ' + IntToStr(gBPP) + ' bpp'; with TGUIListBox(menu.GetControl('lsResolution')) do begin - list := GetDisplayModes(gBPP, SR); - + list := sys_GetDisplayModes(gBPP); if list <> nil then - begin - Items := list; - ItemIndex := SR; - end + begin + Items := list; + ItemIndex := Length(list) + end else - Clear(); + begin + Clear + end end; with TGUISwitch(menu.GetControl('swFullScreen')) do @@ -1851,6 +1905,9 @@ begin ItemIndex := 0 else ItemIndex := 1; + + TempResScale := Round(r_pixel_scale - 1); + TGUIScroll(menu.GetControl('scResFactor')).Value := TempResScale; end; procedure ProcApplyVideoOptions(); @@ -1858,18 +1915,34 @@ var menu: TGUIMenu; Fullscreen: Boolean; SWidth, SHeight: Integer; + ScaleChanged: Boolean; str: String; begin menu := TGUIMenu(g_GUI_GetWindow('OptionsVideoResMenu').GetControl('mOptionsVideoResMenu')); str := TGUIListBox(menu.GetControl('lsResolution')).SelectedItem; - SScanf(str, '%dx%d', [@SWidth, @SHeight]); + if str <> '' then + SScanf(str, '%dx%d', [@SWidth, @SHeight]) + else + begin + SWidth := gWinSizeX; + SHeight := gWinSizeY; + end; Fullscreen := TGUISwitch(menu.GetControl('swFullScreen')).ItemIndex = 0; - if (SWidth <> gScreenWidth) or - (SHeight <> gScreenHeight) or - (Fullscreen <> gFullscreen) then + ScaleChanged := False; + if TGUIScroll(menu.GetControl('scResFactor')).Value <> TempResScale then + begin + TempResScale := TGUIScroll(menu.GetControl('scResFactor')).Value; + r_pixel_scale := TempResScale + 1; + ScaleChanged := True; + end; + + if (SWidth <> gWinSizeX) or + (SHeight <> gWinSizeY) or + (Fullscreen <> gFullscreen) or + ScaleChanged then begin gResolutionChange := True; gRC_Width := SWidth; @@ -1882,22 +1955,18 @@ begin ProcApplyOptions(); end; -procedure ProcSetFirstRussianLanguage(); +procedure ProcSetFirstRussianLanguage; begin gLanguage := LANGUAGE_RUSSIAN; gLanguageChange := True; gAskLanguage := False; - - g_Options_Write_Language(GameDir+'/'+CONFIG_FILENAME); end; -procedure ProcSetFirstEnglishLanguage(); +procedure ProcSetFirstEnglishLanguage; begin gLanguage := LANGUAGE_ENGLISH; gLanguageChange := True; gAskLanguage := False; - - g_Options_Write_Language(GameDir+'/'+CONFIG_FILENAME); end; procedure ProcRecallAddress(); @@ -2166,6 +2235,26 @@ begin else ItemIndex := 1; end; + with AddSwitch(_lc[I_MENU_RESPAWN_ITEMS]) do + begin + Name := 'swRespawnItems'; + AddItem(_lc[I_MENU_YES]); + AddItem(_lc[I_MENU_NO]); + if gnRespawnItems then + ItemIndex := 0 + else + ItemIndex := 1; + end; + with AddSwitch(_lc[I_MENU_DEATHMATCH_KEYS]) do + begin + Name := 'swDeathmatchKeys'; + AddItem(_lc[I_MENU_YES]); + AddItem(_lc[I_MENU_NO]); + if gnDeathmatchKeys then + ItemIndex := 0 + else + ItemIndex := 1; + end; with AddSwitch(_lc[I_MENU_ENABLE_EXITS]) do begin Name := 'swEnableExits'; @@ -2366,6 +2455,26 @@ begin else ItemIndex := 1; end; + with AddSwitch(_lc[I_MENU_RESPAWN_ITEMS]) do + begin + Name := 'swRespawnItems'; + AddItem(_lc[I_MENU_YES]); + AddItem(_lc[I_MENU_NO]); + if gcRespawnItems then + ItemIndex := 0 + else + ItemIndex := 1; + end; + with AddSwitch(_lc[I_MENU_DEATHMATCH_KEYS]) do + begin + Name := 'swDeathmatchKeys'; + AddItem(_lc[I_MENU_YES]); + AddItem(_lc[I_MENU_NO]); + if gcDeathmatchKeys then + ItemIndex := 0 + else + ItemIndex := 1; + end; with AddSwitch(_lc[I_MENU_ENABLE_EXITS]) do begin Name := 'swEnableExits'; @@ -2436,7 +2545,7 @@ begin Sort := True; Dirs := True; FileMask := '*.wad|*.pk3|*.zip|*.dfz'; - SetBase(MapsDir+'megawads/'); + SetBase(MegawadDirs); end; with AddLabel(_lc[I_MENU_MAP_NAME]) do @@ -2491,7 +2600,7 @@ begin Sort := True; Dirs := True; FileMask := '*.wad|*.pk3|*.zip|*.dfz'; - SetBase(MapsDir); + SetBase(MapDirs); end; with AddList(_lc[I_MENU_MAP_RESOURCE], 12, 4) do begin @@ -2626,6 +2735,11 @@ begin AddItem(_lc[I_MENU_YES]); AddItem(_lc[I_MENU_NO]); end; + with AddScroll(_lc[I_MENU_GAME_SCALE_FACTOR]) do + begin + Name := 'scResFactor'; + Max := 10; + end; AddSpace(); AddButton(@ProcApplyVideoOptions, _lc[I_MENU_RESOLUTION_APPLY]); UpdateIndex(); @@ -2898,12 +3012,11 @@ begin begin Name := 'mOptionsControlsJoystickMenu'; for i := 0 to e_MaxJoys - 1 do - if e_JoystickAvailable[i] then - with AddScroll(Format(_lc[I_MENU_CONTROL_DEADZONE], [i + 1])) do - begin - Name := 'scDeadzone' + IntToStr(i); - Max := 20 - end + with AddScroll(Format(_lc[I_MENU_CONTROL_DEADZONE], [i + 1])) do + begin + Name := 'scDeadzone' + IntToStr(i); + Max := 20 + end end; Menu.DefControl := 'mOptionsControlsJoystickMenu'; g_GUI_AddWindow(Menu); @@ -3227,6 +3340,13 @@ begin AddItem(_lc[I_MENU_NO]); ItemIndex := 1; end; + with AddSwitch(_lc[I_MENU_DEATHMATCH_KEYS]) do + begin + Name := 'swDeathmatchKeys'; + AddItem(_lc[I_MENU_YES]); + AddItem(_lc[I_MENU_NO]); + ItemIndex := 1; + end; with AddEdit(_lc[I_MENU_TIME_LIMIT]) do begin Name := 'edTimeLimit';