X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_menu.pas;h=6daf00cdf864e399b541cfa8a4599b1ffac82b0d;hb=23a883f6c44413c380997e61b00a756bda95bc03;hp=6cbc68e5d96ab006b8fab7f6d7d8e8bb1b682d92;hpb=4171d8dd0b8d733da27c584616e431811bf0fdcf;p=d2df-sdl.git diff --git a/src/game/g_menu.pas b/src/game/g_menu.pas index 6cbc68e..6daf00c 100644 --- a/src/game/g_menu.pas +++ b/src/game/g_menu.pas @@ -20,8 +20,6 @@ interface procedure g_Menu_Init(); procedure g_Menu_Free(); procedure g_Menu_Reset(); -procedure LoadStdFont(cfgres, texture: string; var FontID: DWORD); -procedure LoadFont(txtres, fntres: string; var FontID: DWORD); procedure g_Menu_AskLanguage(); procedure g_Menu_Show_SaveMenu(); @@ -33,23 +31,24 @@ procedure g_Menu_Show_EndGameMenu(); procedure g_Menu_Show_QuitGameMenu(); var - gMenuFont: DWORD; - gMenuSmallFont: DWORD; PromptIP: string; PromptPort: Word; TempScale: Integer = -1; + TempResScale: Integer = -1; implementation 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, + {$IFDEF ENABLE_GFX} + g_gfx, + {$ENDIF} + g_gui, r_textures, r_graphics, g_game, g_map, + g_base, g_basic, g_console, g_sound, g_player, g_options, g_weapons, e_log, SysUtils, CONFIG, g_playermodel, DateUtils, MAPDEF, Math, g_saveload, - e_texture, g_language, - g_net, g_netmsg, g_netmaster, g_items, e_input, g_touch, - utils, wadreader, g_system; + g_language, e_res, + g_net, g_netmsg, g_netmaster, g_items, e_input, + utils, wadreader, g_system, r_render, r_game; type TYNCallback = procedure (yes:Boolean); @@ -107,7 +106,6 @@ procedure ProcApplyOptions(); var menu: TGUIMenu; i: Integer; - ovs: Boolean; begin menu := TGUIMenu(g_GUI_GetWindow('OptionsVideoMenu').GetControl('mOptionsVideoMenu')); @@ -116,13 +114,11 @@ begin else gBPP := 32; - ovs := gVSync; gVSync := TGUISwitch(menu.GetControl('swVSync')).ItemIndex = 0; - 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); + gLerpActors := TGUISwitch(menu.GetControl('swInterp')).ItemIndex = 0; menu := TGUIMenu(g_GUI_GetWindow('OptionsSoundMenu').GetControl('mOptionsSoundMenu')); @@ -139,7 +135,9 @@ begin menu := TGUIMenu(g_GUI_GetWindow('OptionsGameMenu').GetControl('mOptionsGameMenu')); - g_GFX_SetMax(TGUIScroll(menu.GetControl('scParticlesCount')).Value*1000); + {$IFDEF ENABLE_GFX} + g_GFX_SetMax(TGUIScroll(menu.GetControl('scParticlesCount')).Value*1000); + {$ENDIF} g_Shells_SetMax(TGUIScroll(menu.GetControl('scShellsMax')).Value*30); g_Gibs_SetMax(TGUIScroll(menu.GetControl('scGibsMax')).Value*25); g_Corpses_SetMax(TGUIScroll(menu.GetControl('scCorpsesMax')).Value*5); @@ -327,7 +325,7 @@ begin with TGUIModelView(g_GUI_GetWindow('OptionsPlayersP1Menu').GetControl('mvP1Model')) do begin - gPlayer1Settings.Model := Model.Name; + gPlayer1Settings.Model := Model.GetName(); gPlayer1Settings.Color := Model.Color; end; @@ -338,7 +336,7 @@ begin TEAM_RED, TEAM_BLUE); with TGUIModelView(g_GUI_GetWindow('OptionsPlayersP2Menu').GetControl('mvP2Model')) do begin - gPlayer2Settings.Model := Model.Name; + gPlayer2Settings.Model := Model.GetName(); gPlayer2Settings.Color := Model.Color; end; @@ -374,8 +372,7 @@ begin if g_Game_IsClient then MC_SEND_PlayerSettings; - g_Options_Write(GameDir+'/'+CONFIG_FILENAME); - g_Console_WriteGameConfig(); + g_Console_WriteGameConfig; end; procedure ReadOptions(); @@ -398,7 +395,10 @@ 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; + + with TGUISwitch(menu.GetControl('swInterp')) do + if gLerpActors then ItemIndex := 0 else ItemIndex := 1; menu := TGUIMenu(g_GUI_GetWindow('OptionsSoundMenu').GetControl('mOptionsSoundMenu')); @@ -531,7 +531,9 @@ begin menu := TGUIMenu(g_GUI_GetWindow('OptionsGameMenu').GetControl('mOptionsGameMenu')); - TGUIScroll(menu.GetControl('scParticlesCount')).Value := g_GFX_GetMax() div 1000; + {$IFDEF ENABLE_GFX} + TGUIScroll(menu.GetControl('scParticlesCount')).Value := g_GFX_GetMax() div 1000; + {$ENDIF} TGUIScroll(menu.GetControl('scShellsMax')).Value := g_Shells_GetMax() div 30; TGUIScroll(menu.GetControl('scGibsMax')).Value := g_Gibs_GetMax() div 25; TGUIScroll(menu.GetControl('scCorpsesMax')).Value := g_Corpses_GetMax() div 5; @@ -642,13 +644,13 @@ begin } end; -procedure ProcStartCustomGame(); +function LatchGameOptions(const MenuName: string): Byte; var - Map: String; - GameMode: Byte; - Options: LongWord; + Map: string; begin - with TGUIMenu(g_ActiveWindow.GetControl('mCustomGameMenu')) do + Result := GM_NONE; + + with TGUIMenu(g_ActiveWindow.GetControl(MenuName)) do begin Map := TGUILabel(GetControl('lbMap')).Text; if Map = '' then @@ -656,104 +658,69 @@ begin if not isWadPath(Map) then Exit; - GameMode := TGUISwitch(GetControl('swGameMode')).ItemIndex+1; - gcGameMode := TGUISwitch(GetControl('swGameMode')).GetText; - gcTimeLimit := StrToIntDef(TGUIEdit(GetControl('edTimeLimit')).Text, 0); - gcGoalLimit := StrToIntDef(TGUIEdit(GetControl('edGoalLimit')).Text, 0); - gcMaxLives := StrToIntDef(TGUIEdit(GetControl('edMaxLives')).Text, 0); - - gcTeamDamage := TGUISwitch(GetControl('swTeamDamage')).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 gcAllowExit then - Options := Options or GAME_OPTION_ALLOWEXIT; - if gcWeaponStay then - Options := Options or GAME_OPTION_WEAPONSTAY; - if gcMonsters then - Options := Options or GAME_OPTION_MONSTERS; - gcPlayers := TGUISwitch(GetControl('swPlayers')).ItemIndex; + Result := TGUISwitch(GetControl('swGameMode')).ItemIndex+1; + gsGameMode := TGUISwitch(GetControl('swGameMode')).GetText; + gsTimeLimit := StrToIntDef(TGUIEdit(GetControl('edTimeLimit')).Text, 0); + gsGoalLimit := StrToIntDef(TGUIEdit(GetControl('edGoalLimit')).Text, 0); + gsMaxLives := StrToIntDef(TGUIEdit(GetControl('edMaxLives')).Text, 0); + gsItemRespawnTime := StrToIntDef(TGUIEdit(GetControl('edItemRespawnTime')).Text, 0); + gsPlayers := TGUISwitch(GetControl('swPlayers')).ItemIndex; + gsMap := Map; + + gsGameFlags := 0; + if TGUISwitch(GetControl('swTeamDamage')).ItemIndex = 0 then + gsGameFlags := gsGameFlags or GAME_OPTION_TEAMDAMAGE; + if TGUISwitch(GetControl('swDeathmatchKeys')).ItemIndex = 0 then + gsGameFlags := gsGameFlags or GAME_OPTION_DMKEYS; + if TGUISwitch(GetControl('swEnableExits')).ItemIndex = 0 then + gsGameFlags := gsGameFlags or GAME_OPTION_ALLOWEXIT; + if TGUISwitch(GetControl('swWeaponStay')).ItemIndex = 0 then + gsGameFlags := gsGameFlags or GAME_OPTION_WEAPONSTAY; + if TGUISwitch(GetControl('swMonsters')).ItemIndex = 0 then + gsGameFlags := gsGameFlags or GAME_OPTION_MONSTERS; + + case TGUISwitch(GetControl('swTeamHit')).ItemIndex of + 1: gsGameFlags := gsGameFlags or GAME_OPTION_TEAMHITTRACE; + 2: gsGameFlags := gsGameFlags or GAME_OPTION_TEAMHITPROJECTILE; + 0: gsGameFlags := gsGameFlags or GAME_OPTION_TEAMHITTRACE or GAME_OPTION_TEAMHITPROJECTILE; + end; case TGUISwitch(GetControl('swBotsVS')).ItemIndex of - 1: begin - Options := Options or GAME_OPTION_BOTVSMONSTER; - gcBotsVS := 'Monsters'; - end; - 2: begin - Options := Options or GAME_OPTION_BOTVSPLAYER or GAME_OPTION_BOTVSMONSTER; - gcBotsVS := 'Everybody'; - end; - else begin - Options := Options or GAME_OPTION_BOTVSPLAYER; - gcBotsVS := 'Players'; - end; + 1: gsGameFlags := gsGameFlags or GAME_OPTION_BOTVSMONSTER; + 2: gsGameFlags := gsGameFlags or GAME_OPTION_BOTVSPLAYER or GAME_OPTION_BOTVSMONSTER; + else gsGameFlags := gsGameFlags or GAME_OPTION_BOTVSPLAYER; end; - gcMap := Map; + // TODO: get this crap out of here + gGameSettings.ItemRespawnTime := gsItemRespawnTime; + gGameSettings.WarmupTime := gsWarmupTime; + gGameSettings.SpawnInvul := gsSpawnInvul; end; +end; - g_Options_Write_Gameplay_Custom(GameDir+'/'+CONFIG_FILENAME); +procedure ProcStartCustomGame(); +var + GameMode: Byte; +begin + GameMode := LatchGameOptions('mCustomGameMenu'); + if GameMode = GM_NONE then Exit; - g_Game_StartCustom(Map, GameMode, gcTimeLimit, gcGoalLimit, - gcMaxLives, Options, gcPlayers); + g_Console_WriteGameConfig; + g_Game_StartCustom(gsMap, GameMode, gsTimeLimit, gsGoalLimit, + gsMaxLives, gsGameFlags, gsPlayers); end; procedure ProcStartNetGame(); var - Map: String; GameMode: Byte; - Options: LongWord; begin + GameMode := LatchGameOptions('mNetServerMenu'); + if GameMode = GM_NONE then Exit; + with TGUIMenu(g_ActiveWindow.GetControl('mNetServerMenu')) do begin - Map := TGUILabel(GetControl('lbMap')).Text; - if Map = '' then - Exit; - if not isWadPath(Map) then - Exit; - - GameMode := TGUISwitch(GetControl('swGameMode')).ItemIndex+1; - gnGameMode := TGUISwitch(GetControl('swGameMode')).GetText; - gnTimeLimit := StrToIntDef(TGUIEdit(GetControl('edTimeLimit')).Text, 0); - gnGoalLimit := StrToIntDef(TGUIEdit(GetControl('edGoalLimit')).Text, 0); - gnMaxLives := StrToIntDef(TGUIEdit(GetControl('edMaxLives')).Text, 0); NetPort := StrToIntDef(TGUIEdit(GetControl('edPort')).Text, 0); - - gnTeamDamage := TGUISwitch(GetControl('swTeamDamage')).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 gnAllowExit then - Options := Options or GAME_OPTION_ALLOWEXIT; - if gnWeaponStay then - Options := Options or GAME_OPTION_WEAPONSTAY; - if gnMonsters then - Options := Options or GAME_OPTION_MONSTERS; - gnPlayers := TGUISwitch(GetControl('swPlayers')).ItemIndex; - - case TGUISwitch(GetControl('swBotsVS')).ItemIndex of - 1: begin - Options := Options or GAME_OPTION_BOTVSMONSTER; - gnBotsVS := 'Monsters'; - end; - 2: begin - Options := Options or GAME_OPTION_BOTVSPLAYER or GAME_OPTION_BOTVSMONSTER; - gnBotsVS := 'Everybody'; - end; - else begin - Options := Options or GAME_OPTION_BOTVSPLAYER; - gnBotsVS := 'Players'; - end; - end; - - gnMap := Map; NetServerName := TGUIEdit(GetControl('edSrvName')).Text; NetMaxClients := Max(1, StrToIntDef(TGUIEdit(GetControl('edMaxPlayers')).Text, 1)); NetMaxClients := Min(NET_MAXCLIENTS, NetMaxClients); @@ -761,11 +728,9 @@ begin NetUseMaster := TGUISwitch(GetControl('swUseMaster')).ItemIndex = 0; end; - g_Options_Write_Net_Server(GameDir+'/'+CONFIG_FILENAME); - g_Options_Write_Gameplay_Net(GameDir+'/'+CONFIG_FILENAME); - - g_Game_StartServer(Map, GameMode, gnTimeLimit, gnGoalLimit, gnMaxLives, - Options, gnPlayers, 0, NetPort); + g_Console_WriteGameConfig; + g_Game_StartServer(gsMap, GameMode, gsTimeLimit, gsGoalLimit, gsMaxLives, + gsGameFlags, gsPlayers, 0, NetPort); end; procedure ProcConnectNetGame(); @@ -779,7 +744,7 @@ begin PW := TGUIEdit(GetControl('edPW')).Text; end; - g_Options_Write_Net_Client(GameDir+'/'+CONFIG_FILENAME); + g_Console_WriteGameConfig; g_Game_StartClient(NetClientIP, NetClientPort, PW); end; @@ -794,7 +759,7 @@ begin PW := TGUIEdit(GetControl('edPW')).Text; end; - g_Options_Write_Net_Client(GameDir+'/'+CONFIG_FILENAME); + g_Console_WriteGameConfig; g_Game_StartClient(NetClientIP, NetClientPort, PW); end; @@ -811,14 +776,14 @@ begin NetInitDone := True; end; - g_Net_Slist_Set(NetSlistIP, NetSlistPort); + g_Net_Slist_Set(NetMasterList); gState := STATE_SLIST; g_ActiveWindow := nil; slWaitStr := _lc[I_NET_SLIST_WAIT]; - g_Game_Draw; + r_Render_Draw; sys_Repaint; slReturnPressed := True; @@ -840,9 +805,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 @@ -990,90 +956,6 @@ begin ProcChangeColor(nil); end; -procedure LoadStdFont(cfgres, texture: string; var FontID: DWORD); -var - cwdt, chgt: Byte; - spc: ShortInt; - ID: DWORD; - wad: TWADFile; - cfgdata: Pointer; - cfglen: Integer; - config: TConfig; -begin - cfglen := 0; - - wad := TWADFile.Create; - if wad.ReadFile(GameWAD) then - wad.GetResource('FONTS/'+cfgres, cfgdata, cfglen); - wad.Free(); - - if cfglen <> 0 then - begin - g_Texture_CreateWADEx('FONT_STD', GameWAD+':FONTS\'+texture); - - config := TConfig.CreateMem(cfgdata, cfglen); - cwdt := Min(Max(config.ReadInt('FontMap', 'CharWidth', 0), 0), 255); - chgt := Min(Max(config.ReadInt('FontMap', 'CharHeight', 0), 0), 255); - spc := Min(Max(config.ReadInt('FontMap', 'Kerning', 0), -128), 127); - - if g_Texture_Get('FONT_STD', ID) then - e_TextureFontBuild(ID, FontID, cwdt, chgt, spc); - - config.Free(); - end; - - if cfglen <> 0 then FreeMem(cfgdata); -end; - -procedure LoadFont(txtres, fntres: string; var FontID: DWORD); -var - cwdt, chgt: Byte; - spc: ShortInt; - CharID: DWORD; - wad: TWADFile; - cfgdata, fntdata: Pointer; - cfglen, fntlen: Integer; - config: TConfig; - chrwidth: Integer; - a: Byte; -begin - cfglen := 0; - fntlen := 0; - - wad := TWADFile.Create; - if wad.ReadFile(GameWAD) then - begin - wad.GetResource('FONTS/'+txtres, cfgdata, cfglen); - wad.GetResource('FONTS/'+fntres, fntdata, fntlen); - end; - wad.Free(); - - if cfglen <> 0 then - begin - config := TConfig.CreateMem(cfgdata, cfglen); - cwdt := Min(Max(config.ReadInt('FontMap', 'CharWidth', 0), 0), 255); - chgt := Min(Max(config.ReadInt('FontMap', 'CharHeight', 0), 0), 255); - - spc := Min(Max(config.ReadInt('FontMap', 'Kerning', 0), -128), 127); - FontID := e_CharFont_Create(spc); - - for a := 0 to 255 do - begin - chrwidth := config.ReadInt(IntToStr(a), 'Width', 0); - if chrwidth = 0 then Continue; - - if e_CreateTextureMemEx(fntdata, fntlen, CharID, cwdt*(a mod 16), chgt*(a div 16), - cwdt, chgt) then - e_CharFont_AddChar(FontID, CharID, Chr(a), chrwidth); - end; - - config.Free(); - end; - - if cfglen <> 0 then FreeMem(cfgdata); - if fntlen <> 0 then FreeMem(fntdata); -end; - procedure MenuLoadData(); begin e_WriteLog('Loading menu data...', TMsgType.Notify); @@ -1260,14 +1142,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(); @@ -1321,13 +1216,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; @@ -1371,7 +1268,7 @@ end; procedure ProcOptionsPlayersMIMenu(); var s, a: string; - b: TModelInfo; + i: Integer; begin if g_ActiveWindow.Name = 'OptionsPlayersP1Menu' then s := 'P1' else s := 'P2'; @@ -1379,15 +1276,14 @@ begin if a = '' then Exit; - b := g_PlayerModel_GetInfo(a); - + i := g_PlayerModel_GetIndex(a); with TGUIMenu(g_GUI_GetWindow('OptionsPlayersMIMenu').GetControl('mOptionsPlayersMIMenu')) do begin - TGUILabel(GetControl('lbName')).Text := b.Name; - TGUILabel(GetControl('lbAuthor')).Text := b.Author; - TGUIMemo(GetControl('meComment')).SetText(b.Description); + TGUILabel(GetControl('lbName')).Text := PlayerModelsArray[i].Name; + TGUILabel(GetControl('lbAuthor')).Text := PlayerModelsArray[i].Author; + TGUIMemo(GetControl('meComment')).SetText(PlayerModelsArray[i].Description); - if b.HaveWeapon then + if PlayerModelsArray[i].HaveWeapon then TGUILabel(GetControl('lbWeapon')).Text := _lc[I_MENU_YES] else TGUILabel(GetControl('lbWeapon')).Text := _lc[I_MENU_NO]; @@ -1408,8 +1304,7 @@ begin with TGUIModelView(g_ActiveWindow.GetControl('mv'+s+'Model')) do begin NextAnim(); - Model.GetCurrentAnimation.Loop := True; - Model.GetCurrentAnimationMask.Loop := True; + Model.AnimState.Loop := True; end; end; @@ -1623,32 +1518,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; @@ -1666,6 +1553,20 @@ begin ItemIndex := 0 else ItemIndex := 1; + with TGUISwitch(menu.GetControl('swTeamHit')) do + if (Options and (GAME_OPTION_TEAMHITTRACE or GAME_OPTION_TEAMHITPROJECTILE)) = (GAME_OPTION_TEAMHITTRACE or GAME_OPTION_TEAMHITPROJECTILE) then + ItemIndex := 0 + else if LongBool(Options and GAME_OPTION_TEAMHITTRACE) then + ItemIndex := 1 + else if LongBool(Options and GAME_OPTION_TEAMHITPROJECTILE) then + ItemIndex := 2 + else + ItemIndex := 3; + 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); @@ -1684,6 +1585,17 @@ begin if GameType in [GT_CUSTOM, GT_SERVER] then begin TGUISwitch(menu.GetControl('swTeamDamage')).Enabled := True; + TGUISwitch(menu.GetControl('swTeamHit')).Enabled := True; + if (GameMode in [GM_DM, GM_TDM, GM_CTF]) then + begin + TGUISwitch(menu.GetControl('swDeathmatchKeys')).Enabled := True; + TGUILabel(menu.GetControlsText('swDeathmatchKeys')).Color := MENU_ITEMSTEXT_COLOR; + end + else + begin + TGUISwitch(menu.GetControl('swDeathmatchKeys')).Enabled := False; + TGUILabel(menu.GetControlsText('swDeathmatchKeys')).Color := MENU_UNACTIVEITEMS_COLOR; + end; TGUIEdit(menu.GetControl('edTimeLimit')).Enabled := True; TGUILabel(menu.GetControlsText('edTimeLimit')).Color := MENU_ITEMSTEXT_COLOR; TGUIEdit(menu.GetControl('edGoalLimit')).Enabled := True; @@ -1695,6 +1607,9 @@ begin else begin TGUISwitch(menu.GetControl('swTeamDamage')).Enabled := True; + TGUISwitch(menu.GetControl('swTeamHit')).Enabled := True; + TGUISwitch(menu.GetControl('swDeathmatchKeys')).Enabled := False; + TGUILabel(menu.GetControlsText('swDeathmatchKeys')).Color := MENU_UNACTIVEITEMS_COLOR; with TGUIEdit(menu.GetControl('edTimeLimit')) do begin Enabled := False; @@ -1738,6 +1653,24 @@ begin Options := Options and (not GAME_OPTION_TEAMDAMAGE); end; + if TGUISwitch(menu.GetControl('swTeamHit')).Enabled then + begin + Options := Options and not (GAME_OPTION_TEAMHITTRACE or GAME_OPTION_TEAMHITPROJECTILE); + case TGUISwitch(menu.GetControl('swTeamHit')).ItemIndex of + 1: Options := Options or GAME_OPTION_TEAMHITTRACE; + 2: Options := Options or GAME_OPTION_TEAMHITPROJECTILE; + 0: Options := Options or GAME_OPTION_TEAMHITTRACE or GAME_OPTION_TEAMHITPROJECTILE; + end; + 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); @@ -1816,6 +1749,12 @@ begin end; end; end; + + // don't forget to latch this shit + gsGameFlags := Options; + gsMaxLives := MaxLives; + gsGoalLimit := GoalLimit; + gsTimeLimit := TimeLimit; end; if g_Game_IsNet then MH_SEND_GameSettings; @@ -1829,13 +1768,13 @@ 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 := sys_GetDispalyModes(gBPP); + list := sys_GetDisplayModes(gBPP); if list <> nil then begin Items := list; @@ -1852,6 +1791,10 @@ begin ItemIndex := 0 else ItemIndex := 1; + + TempResScale := Round(r_pixel_scale - 1); + with TGUISwitch(menu.GetControl('swResFactor')) do + ItemIndex := Min(TempResScale, gRC_Width div 640 - 1); end; procedure ProcApplyVideoOptions(); @@ -1859,18 +1802,35 @@ 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; + TempResScale := Min(TempResScale, SWidth div 640 - 1); + end; Fullscreen := TGUISwitch(menu.GetControl('swFullScreen')).ItemIndex = 0; - if (SWidth <> gScreenWidth) or - (SHeight <> gScreenHeight) or - (Fullscreen <> gFullscreen) then + ScaleChanged := False; + if TGUISwitch(menu.GetControl('swResFactor')).ItemIndex <> TempResScale then + begin + TempResScale := Min(TGUISwitch(menu.GetControl('swResFactor')).ItemIndex, SWidth div 640 - 1); + 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; @@ -1883,22 +1843,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(); @@ -2102,7 +2058,7 @@ begin begin Name := 'lbMap'; FixedLength := 16; - Text := gnMap; + Text := gsMap; OnClick := @ProcSelectMapMenu; end; with AddSwitch(_lc[I_MENU_GAME_TYPE]) do @@ -2112,7 +2068,7 @@ begin AddItem(_lc[I_MENU_GAME_TYPE_TDM]); AddItem(_lc[I_MENU_GAME_TYPE_CTF]); AddItem(_lc[I_MENU_GAME_TYPE_COOP]); - case g_Game_TextToMode(gnGameMode) of + case g_Game_TextToMode(gsGameMode) of GM_NONE, GM_DM: ItemIndex := 0; GM_TDM: ItemIndex := 1; @@ -2120,7 +2076,7 @@ begin GM_SINGLE, GM_COOP: ItemIndex := 3; end; - OnChange := ProcSwitchMonstersNet; + OnChange := ProcSwitchMonstersCustom; end; with AddEdit(_lc[I_MENU_TIME_LIMIT]) do begin @@ -2128,8 +2084,8 @@ begin OnlyDigits := True; Width := 4; MaxLength := 5; - if gnTimeLimit > 0 then - Text := IntToStr(gnTimeLimit); + if gsTimeLimit > 0 then + Text := IntToStr(gsTimeLimit); end; with AddEdit(_lc[I_MENU_GOAL_LIMIT]) do begin @@ -2137,32 +2093,67 @@ begin OnlyDigits := True; Width := 4; MaxLength := 5; - if gnGoalLimit > 0 then - Text := IntToStr(gnGoalLimit); + if gsGoalLimit > 0 then + Text := IntToStr(gsGoalLimit); end; with AddEdit(_lc[I_MENU_MAX_LIVES]) do begin Name := 'edMaxLives'; OnlyDigits := True; Width := 4; - MaxLength := 3; - if gnMaxLives > 0 then - Text := IntToStr(gnMaxLives); + MaxLength := 5; + if gsMaxLives > 0 then + Text := IntToStr(gsMaxLives); end; - with AddSwitch(_lc[I_MENU_SERVER_PLAYERS]) do + with AddEdit(_lc[I_MENU_ITEM_RESPAWN_TIME]) do + begin + Name := 'edItemRespawnTime'; + OnlyDigits := True; + Width := 4; + MaxLength := 5; + if gsItemRespawnTime > 0 then + Text := IntToStr(gsItemRespawnTime); + end; + with AddSwitch(_lc[I_MENU_PLAYERS]) do begin Name := 'swPlayers'; AddItem(_lc[I_MENU_COUNT_NONE]); AddItem(_lc[I_MENU_PLAYERS_ONE]); AddItem(_lc[I_MENU_PLAYERS_TWO]); - ItemIndex := gnPlayers; + ItemIndex := gsPlayers; end; with AddSwitch(_lc[I_MENU_TEAM_DAMAGE]) do begin Name := 'swTeamDamage'; AddItem(_lc[I_MENU_YES]); AddItem(_lc[I_MENU_NO]); - if gnTeamDamage then + if LongBool(gsGameFlags and GAME_OPTION_TEAMDAMAGE) then + ItemIndex := 0 + else + ItemIndex := 1; + end; + with AddSwitch(_lc[I_MENU_TEAM_HIT]) do + begin + Name := 'swTeamHit'; + AddItem(_lc[I_MENU_TEAM_HIT_BOTH]); + AddItem(_lc[I_MENU_TEAM_HIT_TRACE]); + AddItem(_lc[I_MENU_TEAM_HIT_PROJECTILE]); + AddItem(_lc[I_MENU_TEAM_HIT_NOTHING]); + if (gsGameFlags and (GAME_OPTION_TEAMHITTRACE or GAME_OPTION_TEAMHITPROJECTILE)) = (GAME_OPTION_TEAMHITTRACE or GAME_OPTION_TEAMHITPROJECTILE) then + ItemIndex := 0 + else if LongBool(gsGameFlags and GAME_OPTION_TEAMHITTRACE) then + ItemIndex := 1 + else if LongBool(gsGameFlags and GAME_OPTION_TEAMHITPROJECTILE) then + ItemIndex := 2 + else + ItemIndex := 3; + end; + with AddSwitch(_lc[I_MENU_DEATHMATCH_KEYS]) do + begin + Name := 'swDeathmatchKeys'; + AddItem(_lc[I_MENU_YES]); + AddItem(_lc[I_MENU_NO]); + if LongBool(gsGameFlags and GAME_OPTION_DMKEYS) then ItemIndex := 0 else ItemIndex := 1; @@ -2172,7 +2163,7 @@ begin Name := 'swEnableExits'; AddItem(_lc[I_MENU_YES]); AddItem(_lc[I_MENU_NO]); - if gnAllowExit then + if LongBool(gsGameFlags and GAME_OPTION_ALLOWEXIT) then ItemIndex := 0 else ItemIndex := 1; @@ -2182,7 +2173,7 @@ begin Name := 'swWeaponStay'; AddItem(_lc[I_MENU_YES]); AddItem(_lc[I_MENU_NO]); - if gnWeaponStay then + if LongBool(gsGameFlags and GAME_OPTION_WEAPONSTAY) then ItemIndex := 0 else ItemIndex := 1; @@ -2192,7 +2183,7 @@ begin Name := 'swMonsters'; AddItem(_lc[I_MENU_YES]); AddItem(_lc[I_MENU_NO]); - if gnMonsters then + if LongBool(gsGameFlags and GAME_OPTION_MONSTERS) then ItemIndex := 0 else ItemIndex := 1; @@ -2204,9 +2195,9 @@ begin AddItem(_lc[I_MENU_BOTS_VS_MONSTERS]); AddItem(_lc[I_MENU_BOTS_VS_ALL]); ItemIndex := 2; - if gnBotsVS = 'Players' then + if not LongBool(gsGameFlags and GAME_OPTION_BOTVSMONSTER) then ItemIndex := 0; - if gnBotsVS = 'Monsters' then + if not LongBool(gsGameFlags and GAME_OPTION_BOTVSPLAYER) then ItemIndex := 1; end; AddSpace(); @@ -2302,7 +2293,7 @@ begin begin Name := 'lbMap'; FixedLength := 16; - Text := gcMap; + Text := gsMap; OnClick := @ProcSelectMapMenu; end; with AddSwitch(_lc[I_MENU_GAME_TYPE]) do @@ -2312,7 +2303,7 @@ begin AddItem(_lc[I_MENU_GAME_TYPE_TDM]); AddItem(_lc[I_MENU_GAME_TYPE_CTF]); AddItem(_lc[I_MENU_GAME_TYPE_COOP]); - case g_Game_TextToMode(gcGameMode) of + case g_Game_TextToMode(gsGameMode) of GM_NONE, GM_DM: ItemIndex := 0; GM_TDM: ItemIndex := 1; @@ -2328,8 +2319,8 @@ begin OnlyDigits := True; Width := 4; MaxLength := 5; - if gcTimeLimit > 0 then - Text := IntToStr(gcTimeLimit); + if gsTimeLimit > 0 then + Text := IntToStr(gsTimeLimit); end; with AddEdit(_lc[I_MENU_GOAL_LIMIT]) do begin @@ -2337,8 +2328,8 @@ begin OnlyDigits := True; Width := 4; MaxLength := 5; - if gcGoalLimit > 0 then - Text := IntToStr(gcGoalLimit); + if gsGoalLimit > 0 then + Text := IntToStr(gsGoalLimit); end; with AddEdit(_lc[I_MENU_MAX_LIVES]) do begin @@ -2346,8 +2337,17 @@ begin OnlyDigits := True; Width := 4; MaxLength := 5; - if gcMaxLives > 0 then - Text := IntToStr(gcMaxLives); + if gsMaxLives > 0 then + Text := IntToStr(gsMaxLives); + end; + with AddEdit(_lc[I_MENU_ITEM_RESPAWN_TIME]) do + begin + Name := 'edItemRespawnTime'; + OnlyDigits := True; + Width := 4; + MaxLength := 5; + if gsItemRespawnTime > 0 then + Text := IntToStr(gsItemRespawnTime); end; with AddSwitch(_lc[I_MENU_PLAYERS]) do begin @@ -2355,14 +2355,40 @@ begin AddItem(_lc[I_MENU_COUNT_NONE]); AddItem(_lc[I_MENU_PLAYERS_ONE]); AddItem(_lc[I_MENU_PLAYERS_TWO]); - ItemIndex := gcPlayers; + ItemIndex := gsPlayers; end; with AddSwitch(_lc[I_MENU_TEAM_DAMAGE]) do begin Name := 'swTeamDamage'; AddItem(_lc[I_MENU_YES]); AddItem(_lc[I_MENU_NO]); - if gcTeamDamage then + if LongBool(gsGameFlags and GAME_OPTION_TEAMDAMAGE) then + ItemIndex := 0 + else + ItemIndex := 1; + end; + with AddSwitch(_lc[I_MENU_TEAM_HIT]) do + begin + Name := 'swTeamHit'; + AddItem(_lc[I_MENU_TEAM_HIT_BOTH]); + AddItem(_lc[I_MENU_TEAM_HIT_TRACE]); + AddItem(_lc[I_MENU_TEAM_HIT_PROJECTILE]); + AddItem(_lc[I_MENU_TEAM_HIT_NOTHING]); + if (gsGameFlags and (GAME_OPTION_TEAMHITTRACE or GAME_OPTION_TEAMHITPROJECTILE)) = (GAME_OPTION_TEAMHITTRACE or GAME_OPTION_TEAMHITPROJECTILE) then + ItemIndex := 0 + else if LongBool(gsGameFlags and GAME_OPTION_TEAMHITTRACE) then + ItemIndex := 1 + else if LongBool(gsGameFlags and GAME_OPTION_TEAMHITPROJECTILE) then + ItemIndex := 2 + else + ItemIndex := 3; + end; + with AddSwitch(_lc[I_MENU_DEATHMATCH_KEYS]) do + begin + Name := 'swDeathmatchKeys'; + AddItem(_lc[I_MENU_YES]); + AddItem(_lc[I_MENU_NO]); + if LongBool(gsGameFlags and GAME_OPTION_DMKEYS) then ItemIndex := 0 else ItemIndex := 1; @@ -2372,7 +2398,7 @@ begin Name := 'swEnableExits'; AddItem(_lc[I_MENU_YES]); AddItem(_lc[I_MENU_NO]); - if gcAllowExit then + if LongBool(gsGameFlags and GAME_OPTION_ALLOWEXIT) then ItemIndex := 0 else ItemIndex := 1; @@ -2382,7 +2408,7 @@ begin Name := 'swWeaponStay'; AddItem(_lc[I_MENU_YES]); AddItem(_lc[I_MENU_NO]); - if gcWeaponStay then + if LongBool(gsGameFlags and GAME_OPTION_WEAPONSTAY) then ItemIndex := 0 else ItemIndex := 1; @@ -2392,7 +2418,7 @@ begin Name := 'swMonsters'; AddItem(_lc[I_MENU_YES]); AddItem(_lc[I_MENU_NO]); - if gcMonsters then + if LongBool(gsGameFlags and GAME_OPTION_MONSTERS) then ItemIndex := 0 else ItemIndex := 1; @@ -2404,9 +2430,9 @@ begin AddItem(_lc[I_MENU_BOTS_VS_MONSTERS]); AddItem(_lc[I_MENU_BOTS_VS_ALL]); ItemIndex := 2; - if gcBotsVS = 'Players' then + if not LongBool(gsGameFlags and GAME_OPTION_BOTVSMONSTER) then ItemIndex := 0; - if gcBotsVS = 'Monsters' then + if not LongBool(gsGameFlags and GAME_OPTION_BOTVSPLAYER) then ItemIndex := 1; end; AddSpace(); @@ -2437,7 +2463,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 @@ -2492,7 +2518,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 @@ -2593,6 +2619,12 @@ begin AddItem(_lc[I_MENU_YES]); AddItem(_lc[I_MENU_NO]); end; + with AddSwitch(_lc[I_MENU_VIDEO_INTERPOLATION]) do + begin + Name := 'swInterp'; + AddItem(_lc[I_MENU_YES]); + AddItem(_lc[I_MENU_NO]); + end; with AddSwitch(_lc[I_MENU_VIDEO_LEGACY_COMPATIBLE]) do begin Name := 'swLegacyNPOT'; @@ -2627,6 +2659,13 @@ begin AddItem(_lc[I_MENU_YES]); AddItem(_lc[I_MENU_NO]); end; + with AddSwitch(_lc[I_MENU_GAME_SCALE_FACTOR]) do + begin + Name := 'swResFactor'; + AddItem('1x'); + for i := 2 to gRC_Width div 640 do + AddItem(IntToStr(i) + 'x'); + end; AddSpace(); AddButton(@ProcApplyVideoOptions, _lc[I_MENU_RESOLUTION_APPLY]); UpdateIndex(); @@ -3227,6 +3266,22 @@ begin AddItem(_lc[I_MENU_NO]); ItemIndex := 1; end; + with AddSwitch(_lc[I_MENU_TEAM_HIT]) do + begin + Name := 'swTeamHit'; + AddItem(_lc[I_MENU_TEAM_HIT_BOTH]); + AddItem(_lc[I_MENU_TEAM_HIT_TRACE]); + AddItem(_lc[I_MENU_TEAM_HIT_PROJECTILE]); + AddItem(_lc[I_MENU_TEAM_HIT_NOTHING]); + ItemIndex := 0 + 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'; @@ -3389,16 +3444,11 @@ end; procedure g_Menu_Init(); begin MenuLoadData(); - g_GUI_Init(); CreateAllMenus(); end; procedure g_Menu_Free(); begin - g_GUI_Destroy(); - - e_WriteLog('Releasing menu data...', TMsgType.Notify); - MenuFreeData(); end;