X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_menu.pas;h=8fe06a3f8e5d8ac952ef6ae2a80bc8cb638d844a;hb=HEAD;hp=8331660c6107c21c00137101818cc3ce0aa28a37;hpb=6f5375e6179294fde838bcf61f0dafeb4e018ee7;p=d2df-sdl.git diff --git a/src/game/g_menu.pas b/src/game/g_menu.pas index 8331660..8fe06a3 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 @@ -108,7 +109,6 @@ var menu: TGUIMenu; i: Integer; ovs: Boolean; - s: AnsiString; begin menu := TGUIMenu(g_GUI_GetWindow('OptionsVideoMenu').GetControl('mOptionsVideoMenu')); @@ -124,6 +124,7 @@ begin gTextureFilter := TGUISwitch(menu.GetControl('swTextureFilter')).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')); @@ -170,16 +171,17 @@ begin g_dbg_scale := TempScale + 1; end; + menu := TGUIMenu(g_GUI_GetWindow('OptionsControlsMenu').GetControl('mOptionsControlsMenu')); with menu do begin g_Console_BindKey(g_Console_FindBind(1, 'screenshot'), ''); - g_Console_BindKey(g_Console_FindBind(1, '+p1_scores', '-p1_scores'), ''); + g_Console_BindKey(g_Console_FindBind(1, '+scores', '-scores'), ''); g_Console_BindKey(g_Console_FindBind(1, 'togglechat'), ''); g_Console_BindKey(g_Console_FindBind(1, 'toggleteamchat'), ''); g_Console_BindKey(TGUIKeyRead(GetControl(_lc[I_MENU_CONTROL_SCREENSHOT])).Key, 'screenshot'); - g_Console_BindKey(TGUIKeyRead(GetControl(_lc[I_MENU_CONTROL_STAT])).Key, '+p1_scores', '-p1_scores'); + g_Console_BindKey(TGUIKeyRead(GetControl(_lc[I_MENU_CONTROL_STAT])).Key, '+scores', '-scores'); g_Console_BindKey(TGUIKeyRead(GetControl(_lc[I_MENU_CONTROL_CHAT])).Key, 'togglechat'); g_Console_BindKey(TGUIKeyRead(GetControl(_lc[I_MENU_CONTROL_TEAMCHAT])).Key, 'toggleteamchat'); end; @@ -193,20 +195,22 @@ begin g_Console_BindKey(g_Console_FindBind(1, '+p1_lookdown', '-p1_lookdown'), ''); g_Console_BindKey(g_Console_FindBind(1, '+p1_attack', '-p1_attack'), ''); g_Console_BindKey(g_Console_FindBind(1, '+p1_jump', '-p1_jump'), ''); - g_Console_BindKey(g_Console_FindBind(1, '+p1_weapnext', '-p1_weapnext'), ''); - g_Console_BindKey(g_Console_FindBind(1, '+p1_weapprev', '-p1_weapprev'), ''); g_Console_BindKey(g_Console_FindBind(1, '+p1_activate', '-p1_activate'), ''); g_Console_BindKey(g_Console_FindBind(1, '+p1_strafe', '-p1_strafe'), ''); + g_Console_BindKey(g_Console_FindBind(1, 'p1_dropflag', ''), ''); + g_Console_BindKey(g_Console_FindBind(1, 'p1_weapnext', ''), ''); + g_Console_BindKey(g_Console_FindBind(1, 'p1_weapprev', ''), ''); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_RIGHT])).Key0, '+p1_moveright', '-p1_moveright'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_LEFT])).Key0, '+p1_moveleft', '-p1_moveleft'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_UP])).Key0, '+p1_lookup', '-p1_lookup'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_DOWN])).Key0, '+p1_lookdown', '-p1_lookdown'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_FIRE])).Key0, '+p1_attack', '-p1_attack'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_JUMP])).Key0, '+p1_jump', '-p1_jump'); - g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_NEXT_WEAPON])).Key0, '+p1_weapnext', '-p1_weapnext'); - g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_PREV_WEAPON])).Key0, '+p1_weapprev', '-p1_weapprev'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_USE])).Key0, '+p1_activate', '-p1_activate'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_STRAFE])).Key0, '+p1_strafe', '-p1_strafe'); + g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_DROPFLAG])).Key0, 'p1_dropflag', ''); + g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_NEXT_WEAPON])).Key0, 'p1_weapnext', '', True); + g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_PREV_WEAPON])).Key0, 'p1_weapprev', '', True); // second set g_Console_BindKey(g_Console_FindBind(2, '+p1_moveright', '-p1_moveright'), ''); g_Console_BindKey(g_Console_FindBind(2, '+p1_moveleft', '-p1_moveleft'), ''); @@ -214,20 +218,22 @@ begin g_Console_BindKey(g_Console_FindBind(2, '+p1_lookdown', '-p1_lookdown'), ''); g_Console_BindKey(g_Console_FindBind(2, '+p1_attack', '-p1_attack'), ''); g_Console_BindKey(g_Console_FindBind(2, '+p1_jump', '-p1_jump'), ''); - g_Console_BindKey(g_Console_FindBind(2, '+p1_weapnext', '-p1_weapnext'), ''); - g_Console_BindKey(g_Console_FindBind(2, '+p1_weapprev', '-p1_weapprev'), ''); g_Console_BindKey(g_Console_FindBind(2, '+p1_activate', '-p1_activate'), ''); g_Console_BindKey(g_Console_FindBind(2, '+p1_strafe', '-p1_strafe'), ''); + g_Console_BindKey(g_Console_FindBind(2, 'p1_dropflag', ''), ''); + g_Console_BindKey(g_Console_FindBind(2, 'p1_weapnext', ''), ''); + g_Console_BindKey(g_Console_FindBind(2, 'p1_weapprev', ''), ''); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_RIGHT])).Key1, '+p1_moveright', '-p1_moveright'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_LEFT])).Key1, '+p1_moveleft', '-p1_moveleft'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_UP])).Key1, '+p1_lookup', '-p1_lookup'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_DOWN])).Key1, '+p1_lookdown', '-p1_lookdown'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_FIRE])).Key1, '+p1_attack', '-p1_attack'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_JUMP])).Key1, '+p1_jump', '-p1_jump'); - g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_NEXT_WEAPON])).Key1, '+p1_weapnext', '-p1_weapnext'); - g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_PREV_WEAPON])).Key1, '+p1_weapprev', '-p1_weapprev'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_USE])).Key1, '+p1_activate', '-p1_activate'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_STRAFE])).Key1, '+p1_strafe', '-p1_strafe'); + g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_DROPFLAG])).Key1, 'p1_dropflag', ''); + g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_NEXT_WEAPON])).Key1, 'p1_weapnext', '', True); + g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_PREV_WEAPON])).Key1, 'p1_weapprev', '', True); end; menu := TGUIMenu(g_GUI_GetWindow('OptionsControlsP1MenuWeapons').GetControl('mOptionsControlsP1MenuWeapons')); @@ -251,20 +257,22 @@ begin g_Console_BindKey(g_Console_FindBind(1, '+p2_lookdown', '-p2_lookdown'), ''); g_Console_BindKey(g_Console_FindBind(1, '+p2_attack', '-p2_attack'), ''); g_Console_BindKey(g_Console_FindBind(1, '+p2_jump', '-p2_jump'), ''); - g_Console_BindKey(g_Console_FindBind(1, '+p2_weapnext', '-p2_weapnext'), ''); - g_Console_BindKey(g_Console_FindBind(1, '+p2_weapprev', '-p2_weapprev'), ''); g_Console_BindKey(g_Console_FindBind(1, '+p2_activate', '-p2_activate'), ''); g_Console_BindKey(g_Console_FindBind(1, '+p2_strafe', '-p2_strafe'), ''); + g_Console_BindKey(g_Console_FindBind(1, 'p2_dropflag', ''), ''); + g_Console_BindKey(g_Console_FindBind(1, 'p2_weapnext', ''), ''); + g_Console_BindKey(g_Console_FindBind(1, 'p2_weapprev', ''), ''); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_RIGHT])).Key0, '+p2_moveright', '-p2_moveright'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_LEFT])).Key0, '+p2_moveleft', '-p2_moveleft'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_UP])).Key0, '+p2_lookup', '-p2_lookup'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_DOWN])).Key0, '+p2_lookdown', '-p2_lookdown'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_FIRE])).Key0, '+p2_attack', '-p2_attack'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_JUMP])).Key0, '+p2_jump', '-p2_jump'); - g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_NEXT_WEAPON])).Key0, '+p2_weapnext', '-p2_weapnext'); - g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_PREV_WEAPON])).Key0, '+p2_weapprev', '-p2_weapprev'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_USE])).Key0, '+p2_activate', '-p2_activate'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_STRAFE])).Key0, '+p2_strafe', '-p2_strafe'); + g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_DROPFLAG])).Key0, 'p2_dropflag', ''); + g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_NEXT_WEAPON])).Key0, 'p2_weapnext', '', True); + g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_PREV_WEAPON])).Key0, 'p2_weapprev', '', True); // second set g_Console_BindKey(g_Console_FindBind(2, '+p2_moveright', '-p2_moveright'), ''); g_Console_BindKey(g_Console_FindBind(2, '+p2_moveleft', '-p2_moveleft'), ''); @@ -272,20 +280,22 @@ begin g_Console_BindKey(g_Console_FindBind(2, '+p2_lookdown', '-p2_lookdown'), ''); g_Console_BindKey(g_Console_FindBind(2, '+p2_attack', '-p2_attack'), ''); g_Console_BindKey(g_Console_FindBind(2, '+p2_jump', '-p2_jump'), ''); - g_Console_BindKey(g_Console_FindBind(2, '+p2_weapnext', '-p2_weapnext'), ''); - g_Console_BindKey(g_Console_FindBind(2, '+p2_weapprev', '-p2_weapprev'), ''); g_Console_BindKey(g_Console_FindBind(2, '+p2_activate', '-p2_activate'), ''); g_Console_BindKey(g_Console_FindBind(2, '+p2_strafe', '-p2_strafe'), ''); + g_Console_BindKey(g_Console_FindBind(2, 'p2_dropflag', ''), ''); + g_Console_BindKey(g_Console_FindBind(2, 'p2_weapnext', ''), ''); + g_Console_BindKey(g_Console_FindBind(2, 'p2_weapprev', ''), ''); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_RIGHT])).Key1, '+p2_moveright', '-p2_moveright'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_LEFT])).Key1, '+p2_moveleft', '-p2_moveleft'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_UP])).Key1, '+p2_lookup', '-p2_lookup'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_DOWN])).Key1, '+p2_lookdown', '-p2_lookdown'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_FIRE])).Key1, '+p2_attack', '-p2_attack'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_JUMP])).Key1, '+p2_jump', '-p2_jump'); - g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_NEXT_WEAPON])).Key1, '+p2_weapnext', '-p2_weapnext'); - g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_PREV_WEAPON])).Key1, '+p2_weapprev', '-p2_weapprev'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_USE])).Key1, '+p2_activate', '-p2_activate'); g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_STRAFE])).Key1, '+p2_strafe', '-p2_strafe'); + g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_DROPFLAG])).Key1, 'p2_dropflag', ''); + g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_NEXT_WEAPON])).Key1, 'p2_weapnext', '', True); + g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_PREV_WEAPON])).Key1, 'p2_weapprev', '', True); end; menu := TGUIMenu(g_GUI_GetWindow('OptionsControlsP2MenuWeapons').GetControl('mOptionsControlsP2MenuWeapons')); @@ -321,11 +331,9 @@ begin end; menu := TGUIMenu(g_GUI_GetWindow('OptionsPlayersP1Menu').GetControl('mOptionsPlayersP1Menu')); - gPlayer1Settings.Name := b_Text_Unformat(TGUIEdit(menu.GetControl('edP1Name')).Text); gPlayer1Settings.Team := IfThen(TGUISwitch(menu.GetControl('swP1Team')).ItemIndex = 0, TEAM_RED, TEAM_BLUE); - with TGUIModelView(g_GUI_GetWindow('OptionsPlayersP1Menu').GetControl('mvP1Model')) do begin gPlayer1Settings.Model := Model.Name; @@ -333,7 +341,6 @@ begin end; menu := TGUIMenu(g_GUI_GetWindow('OptionsPlayersP2Menu').GetControl('mOptionsPlayersP2Menu')); - gPlayer2Settings.Name := b_Text_Unformat(TGUIEdit(menu.GetControl('edP2Name')).Text); gPlayer2Settings.Team := IfThen(TGUISwitch(menu.GetControl('swP2Team')).ItemIndex = 0, TEAM_RED, TEAM_BLUE); @@ -343,6 +350,32 @@ begin gPlayer2Settings.Color := Model.Color; end; + menu := TGUIMenu(g_GUI_GetWindow('OptionsPlayersP1WeaponMenu').GetControl('mOptionsPlayersP1WeaponMenu')); + gPlayer1Settings.WeaponSwitch := TGUISwitch(menu.GetControl('swWeaponAutoswitch')).ItemIndex; + gPlayer1Settings.SwitchToEmpty := TGUISwitch(menu.GetControl('swWeaponAllowEmpty')).ItemIndex; + gPlayer1Settings.SkipIronFist := TGUISwitch(menu.GetControl('swWeaponAllowIronFist')).ItemIndex; + menu := TGUIMenu(g_GUI_GetWindow('OptionsPreferencesP1WeaponMenu').GetControl('mOptionsPreferencesP1WeaponMenu')); + with menu do + begin + for i := WP_FIRST to WP_LAST+1 do + begin + gPlayer1Settings.WeaponPreferences[i] := TGUISwitch(menu.GetControl(IntToStr(i))).ItemIndex; + end; + end; + + menu := TGUIMenu(g_GUI_GetWindow('OptionsPlayersP2WeaponMenu').GetControl('mOptionsPlayersP2WeaponMenu')); + gPlayer2Settings.WeaponSwitch := TGUISwitch(menu.GetControl('swWeaponAutoswitch')).ItemIndex; + gPlayer2Settings.SwitchToEmpty := TGUISwitch(menu.GetControl('swWeaponAllowEmpty')).ItemIndex; + gPlayer2Settings.SkipIronFist := TGUISwitch(menu.GetControl('swWeaponAllowIronFist')).ItemIndex; + menu := TGUIMenu(g_GUI_GetWindow('OptionsPreferencesP2WeaponMenu').GetControl('mOptionsPreferencesP2WeaponMenu')); + with menu do + begin + for i := WP_FIRST to WP_LAST+1 do + begin + gPlayer2Settings.WeaponPreferences[i] := TGUISwitch(menu.GetControl(IntToStr(i))).ItemIndex; + end; + end; + if gPlayer1Settings.Name = '' then gPlayer1Settings.Name := GenPlayerName(1); if gPlayer2Settings.Name = '' then gPlayer2Settings.Name := GenPlayerName(2); @@ -357,7 +390,10 @@ begin else if gPlayer1.Team <> gPlayer1Settings.Team then gPlayer1.SwitchTeam; - + gPlayer1.WeapSwitchMode := gPlayer1Settings.WeaponSwitch; + gPlayer1.setWeaponPrefs(gPlayer1Settings.WeaponPreferences); + gPlayer1.SwitchToEmpty := gPlayer1Settings.SwitchToEmpty; + gPlayer1.SkipIronFist := gPlayer1Settings.SkipIronFist; if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer1.UID); end; @@ -365,19 +401,25 @@ begin begin gPlayer2.SetModel(gPlayer2Settings.Model); gPlayer2.Name := gPlayer2Settings.Name; - if (gGameSettings.GameMode <> GM_TDM) and (gGameSettings.GameMode <> GM_CTF) then + if not (gGameSettings.GameMode in [GM_TDM, GM_CTF]) then gPlayer2.SetColor(gPlayer2Settings.Color) else if gPlayer2.Team <> gPlayer2Settings.Team then gPlayer2.SwitchTeam; + gPlayer2.WeapSwitchMode := gPlayer2Settings.WeaponSwitch; + gPlayer2.setWeaponPrefs(gPlayer2Settings.WeaponPreferences); + gPlayer2.SwitchToEmpty := gPlayer2Settings.SwitchToEmpty; + gPlayer2.SkipIronFist := gPlayer2Settings.SkipIronFist; + //if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer2.UID); end; end; - if g_Game_IsClient then MC_SEND_PlayerSettings; + if g_Game_IsClient then + begin + MC_SEND_PlayerSettings; + gPlayer1.setWeaponPrefs(gPlayer1Settings.WeaponPreferences); + end; - s := e_GetWriteableDir(ConfigDirs); - if s <> '' then - g_Options_Write(s + '/' + CONFIG_FILENAME); g_Console_WriteGameConfig; end; @@ -403,6 +445,9 @@ begin with TGUISwitch(menu.GetControl('swLegacyNPOT')) do 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')); TGUIScroll(menu.GetControl('scSoundLevel')).Value := Round(gSoundLevel/16); @@ -438,10 +483,11 @@ begin TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_DOWN])).Key0 := g_Console_FindBind(1, '+p1_lookdown', '-p1_lookdown'); TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_FIRE])).Key0 := g_Console_FindBind(1, '+p1_attack', '-p1_attack'); TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_JUMP])).Key0 := g_Console_FindBind(1, '+p1_jump', '-p1_jump'); - TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_NEXT_WEAPON])).Key0 := g_Console_FindBind(1, '+p1_weapnext', '-p1_weapnext'); - TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_PREV_WEAPON])).Key0 := g_Console_FindBind(1, '+p1_weapprev', '-p1_weapprev'); TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_USE])).Key0 := g_Console_FindBind(1, '+p1_activate', '-p1_activate'); TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_STRAFE])).Key0 := g_Console_FindBind(1, '+p1_strafe', '-p1_strafe'); + TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_DROPFLAG])).Key0 := g_Console_FindBind(1, 'p1_dropflag', ''); + TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_NEXT_WEAPON])).Key0 := g_Console_FindBind(1, 'p1_weapnext', ''); + TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_PREV_WEAPON])).Key0 := g_Console_FindBind(1, 'p1_weapprev', ''); // second set TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_RIGHT])).Key1 := g_Console_FindBind(2, '+p1_moveright', '-p1_moveright'); TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_LEFT])).Key1 := g_Console_FindBind(2, '+p1_moveleft', '-p1_moveleft'); @@ -449,10 +495,11 @@ begin TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_DOWN])).Key1 := g_Console_FindBind(2, '+p1_lookdown', '-p1_lookdown'); TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_FIRE])).Key1 := g_Console_FindBind(2, '+p1_attack', '-p1_attack'); TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_JUMP])).Key1 := g_Console_FindBind(2, '+p1_jump', '-p1_jump'); - TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_NEXT_WEAPON])).Key1 := g_Console_FindBind(2, '+p1_weapnext', '-p1_weapnext'); - TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_PREV_WEAPON])).Key1 := g_Console_FindBind(2, '+p1_weapprev', '-p1_weapprev'); TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_USE])).Key1 := g_Console_FindBind(2, '+p1_activate', '-p1_activate'); TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_STRAFE])).Key1 := g_Console_FindBind(2, '+p1_strafe', '-p1_strafe'); + TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_DROPFLAG])).Key1 := g_Console_FindBind(2, 'p1_dropflag', ''); + TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_NEXT_WEAPON])).Key1 := g_Console_FindBind(2, 'p1_weapnext', ''); + TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_PREV_WEAPON])).Key1 := g_Console_FindBind(2, 'p1_weapprev', ''); end; menu := TGUIMenu(g_GUI_GetWindow('OptionsControlsP1MenuWeapons').GetControl('mOptionsControlsP1MenuWeapons')); @@ -474,10 +521,11 @@ begin TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_DOWN])).Key0 := g_Console_FindBind(1, '+p2_lookdown', '-p2_lookdown'); TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_FIRE])).Key0 := g_Console_FindBind(1, '+p2_attack', '-p2_attack'); TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_JUMP])).Key0 := g_Console_FindBind(1, '+p2_jump', '-p2_jump'); - TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_NEXT_WEAPON])).Key0 := g_Console_FindBind(1, '+p2_weapnext', '-p2_weapnext'); - TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_PREV_WEAPON])).Key0 := g_Console_FindBind(1, '+p2_weapprev', '-p2_weapprev'); TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_USE])).Key0 := g_Console_FindBind(1, '+p2_activate', '-p2_activate'); TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_STRAFE])).Key0 := g_Console_FindBind(1, '+p2_strafe', '-p2_strafe'); + TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_DROPFLAG])).Key0 := g_Console_FindBind(1, 'p2_dropflag', ''); + TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_NEXT_WEAPON])).Key0 := g_Console_FindBind(1, 'p2_weapnext', ''); + TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_PREV_WEAPON])).Key0 := g_Console_FindBind(1, 'p2_weapprev', ''); // second set TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_RIGHT])).Key1 := g_Console_FindBind(2, '+p2_moveright', '-p2_moveright'); TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_LEFT])).Key1 := g_Console_FindBind(2, '+p2_moveleft', '-p2_moveleft'); @@ -485,10 +533,11 @@ begin TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_DOWN])).Key1 := g_Console_FindBind(2, '+p2_lookdown', '-p2_lookdown'); TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_FIRE])).Key1 := g_Console_FindBind(2, '+p2_attack', '-p2_attack'); TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_JUMP])).Key1 := g_Console_FindBind(2, '+p2_jump', '-p2_jump'); - TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_NEXT_WEAPON])).Key1 := g_Console_FindBind(2, '+p2_weapnext', '-p2_weapnext'); - TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_PREV_WEAPON])).Key1 := g_Console_FindBind(2, '+p2_weapprev', '-p2_weapprev'); TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_USE])).Key1 := g_Console_FindBind(2, '+p2_activate', '-p2_activate'); TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_STRAFE])).Key1 := g_Console_FindBind(2, '+p2_strafe', '-p2_strafe'); + TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_DROPFLAG])).Key1 := g_Console_FindBind(2, 'p2_dropflag', ''); + TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_NEXT_WEAPON])).Key1 := g_Console_FindBind(2, 'p2_weapnext', ''); + TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_PREV_WEAPON])).Key1 := g_Console_FindBind(2, 'p2_weapprev', ''); end; menu := TGUIMenu(g_GUI_GetWindow('OptionsControlsP2MenuWeapons').GetControl('mOptionsControlsP2MenuWeapons')); @@ -527,7 +576,7 @@ begin with menu do begin TGUIKeyRead(GetControl(_lc[I_MENU_CONTROL_SCREENSHOT])).Key := g_Console_FindBind(1, 'screenshot'); - TGUIKeyRead(GetControl(_lc[I_MENU_CONTROL_STAT])).Key := g_Console_FindBind(1, '+p1_scores', '-p1_scores'); + TGUIKeyRead(GetControl(_lc[I_MENU_CONTROL_STAT])).Key := g_Console_FindBind(1, '+scores', '-scores'); TGUIKeyRead(GetControl(_lc[I_MENU_CONTROL_CHAT])).Key := g_Console_FindBind(1, 'togglechat'); TGUIKeyRead(GetControl(_lc[I_MENU_CONTROL_TEAMCHAT])).Key := g_Console_FindBind(1, 'toggleteamchat'); end; @@ -594,6 +643,28 @@ begin TGUIScroll(menu.GetControl('scP1Green')).Value := Round(gPlayer1Settings.Color.G/16); TGUIScroll(menu.GetControl('scP1Blue')).Value := Round(gPlayer1Settings.Color.B/16); + menu := TGUIMenu(g_GUI_GetWindow('OptionsPlayersP1WeaponMenu').GetControl('mOptionsPlayersP1WeaponMenu')); + TGUISwitch(menu.GetControl('swWeaponAutoswitch')).ItemIndex := gPlayer1Settings.WeaponSwitch; + TGUISwitch(menu.GetControl('swWeaponAllowEmpty')).ItemIndex := gPlayer1Settings.SwitchToEmpty; + TGUISwitch(menu.GetControl('swWeaponAllowIronFist')).ItemIndex := gPlayer1Settings.SkipIronFist; + menu := TGUIMenu(g_GUI_GetWindow('OptionsPreferencesP1WeaponMenu').GetControl('mOptionsPreferencesP1WeaponMenu')); + for i := WP_FIRST to WP_LAST+1 do + begin + if (gPlayer1Settings.WeaponPreferences[i] > 0) and (gPlayer1Settings.WeaponPreferences[i] <= WP_LAST+1) then TGUISwitch(menu.GetControl(IntToStr(i))).ItemIndex := gPlayer1Settings.WeaponPreferences[i] + else TGUISwitch(menu.GetControl(IntToStr(i))).ItemIndex := 0; + end; + + menu := TGUIMenu(g_GUI_GetWindow('OptionsPlayersP2WeaponMenu').GetControl('mOptionsPlayersP2WeaponMenu')); + TGUISwitch(menu.GetControl('swWeaponAutoswitch')).ItemIndex := gPlayer2Settings.WeaponSwitch; + TGUISwitch(menu.GetControl('swWeaponAllowEmpty')).ItemIndex := gPlayer2Settings.SwitchToEmpty; + TGUISwitch(menu.GetControl('swWeaponAllowIronFist')).ItemIndex := gPlayer2Settings.SkipIronFist; + menu := TGUIMenu(g_GUI_GetWindow('OptionsPreferencesP2WeaponMenu').GetControl('mOptionsPreferencesP2WeaponMenu')); + for i := WP_FIRST to WP_LAST+1 do + begin + if (gPlayer2Settings.WeaponPreferences[i] > 0) and (gPlayer2Settings.WeaponPreferences[i] <= WP_LAST+1) then TGUISwitch(menu.GetControl(IntToStr(i))).ItemIndex := gPlayer2Settings.WeaponPreferences[i] + else TGUISwitch(menu.GetControl(IntToStr(i))).ItemIndex := 0; + end; + menu := TGUIMenu(g_GUI_GetWindow('OptionsPlayersP2Menu').GetControl('mOptionsPlayersP2Menu')); TGUIListBox(menu.GetControl('lsP2Model')).SelectItem(gPlayer2Settings.Model); @@ -645,14 +716,13 @@ begin } end; -procedure ProcStartCustomGame(); +function LatchGameOptions(const MenuName: string): Byte; var - Map: String; - GameMode: Byte; - Options: LongWord; - s: AnsiString; + 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 @@ -660,113 +730,103 @@ 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; - gcRespawnItems := TGUISwitch(GetControl('swRespawnItems')).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 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); + gsScoreLimit := StrToIntDef(TGUIEdit(GetControl('edScoreLimit')).Text, 0); + gsMaxLives := StrToIntDef(TGUIEdit(GetControl('edMaxLives')).Text, 0); + gsPlayers := TGUISwitch(GetControl('swPlayers')).ItemIndex; + gsMap := Map; + + gsGameFlags := []; + if TGUISwitch(GetControl('swTeamDamage')).ItemIndex = 0 then + gsGameFlags += [TGameOption.TEAM_DAMAGE]; + if TGUISwitch(GetControl('swTeamAbsorbDamage')).ItemIndex = 0 then + gsGameFlags += [TGameOption.TEAM_ABSORB_DAMAGE]; + if TGUISwitch(GetControl('swDeathmatchKeys')).ItemIndex = 0 then + gsGameFlags += [TGameOption.DM_KEYS]; + if TGUISwitch(GetControl('swEnableExits')).ItemIndex = 0 then + gsGameFlags += [TGameOption.ALLOW_EXIT]; + if TGUISwitch(GetControl('swWeaponStay')).ItemIndex = 0 then + gsGameFlags += [TGameOption.WEAPONS_STAY]; + if TGUISwitch(GetControl('swMonsters')).ItemIndex = 0 then + gsGameFlags += [TGameOption.MONSTERS]; + + case TGUISwitch(GetControl('swTeamHit')).ItemIndex of + 1: gsGameFlags += [TGameOption.TEAM_HIT_TRACE]; + 2: gsGameFlags += [TGameOption.TEAM_HIT_PROJECTILE]; + 0: gsGameFlags += [TGameOption.TEAM_HIT_TRACE, TGameOption.TEAM_HIT_PROJECTILE]; + 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 += [TGameOption.BOTS_VS_MONSTERS]; + 2: gsGameFlags += [TGameOption.BOTS_VS_PLAYERS, TGameOption.BOTS_VS_MONSTERS]; + else gsGameFlags += [TGameOption.BOTS_VS_PLAYERS]; + end; + + case TGUISwitch(GetControl('swFlagDrop')).ItemIndex of + 0: gsGameFlags += [TGameOption.ALLOW_DROP_FLAG, TGameOption.THROW_FLAG]; + 1: gsGameFlags += [TGameOption.ALLOW_DROP_FLAG]; + else gsGameFlags -= [TGameOption.ALLOW_DROP_FLAG, TGameOption.THROW_FLAG]; + end; + + // TODO: get this crap out of here + gGameSettings.WarmupTime := gsWarmupTime; + gGameSettings.SpawnInvul := gsSpawnInvul; + end; + + // HACK: We keep the variables for the items in a different menu + with TGUIMenu(g_GUI_GetWindow('ItemsRespawnMenu').GetControl('mItemsRespawnMenu')) do + begin + gsItemRespawnTime := StrToIntDef(TGUIEdit(GetControl('edItemRespawnTime')).Text, 0); + gsItemRespawnRandom := StrToIntDef(TGUIEdit(GetControl('edItemRespawnRandom')).Text, 0); + gsPowerupRespawnTime := StrToIntDef(TGUIEdit(GetControl('edPowerupRespawnTime')).Text, 0); + gsPowerupRespawnRandom := StrToIntDef(TGUIEdit(GetControl('edPowerupRespawnRandom')).Text, 0); + + if TGUISwitch(GetControl('swPowerupRandom')).ItemIndex = 0 then + gsGameFlags += [TGameOption.POWERUP_RANDOM]; + + case TGUISwitch(GetControl('swItemsRandom')).ItemIndex of + 1: gsGameFlags += [TGameOption.ITEM_LIFE_RANDOM]; + 2: gsGameFlags += [TGameOption.ITEM_AMMO_RANDOM]; + 3: gsGameFlags += [TGameOption.ITEM_WEAPON_RANDOM]; + 4: gsGameFlags += [TGameOption.ITEM_LIFE_RANDOM, TGameOption.ITEM_AMMO_RANDOM]; + 5: gsGameFlags += [TGameOption.ITEM_LIFE_RANDOM, TGameOption.ITEM_WEAPON_RANDOM]; + 6: gsGameFlags += [TGameOption.ITEM_AMMO_RANDOM, TGameOption.ITEM_WEAPON_RANDOM]; + 0: gsGameFlags += [TGameOption.ITEM_ALL_RANDOM]; end; - gcMap := Map; + // TODO: get this crap out of here + gGameSettings.ItemRespawnTime := gsItemRespawnTime; + gGameSettings.ItemRespawnRandom := gsItemRespawnRandom; + gGameSettings.PowerupRespawnTime := gsPowerupRespawnTime; + gGameSettings.PowerupRespawnRandom := gsPowerupRespawnRandom; end; +end; - s := e_GetWriteableDir(ConfigDirs); - if s <> '' then - g_Options_Write_Gameplay_Custom(s + '/' + 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, gsScoreLimit, + gsMaxLives, gsGameFlags, gsPlayers); end; procedure ProcStartNetGame(); var - Map: String; GameMode: Byte; - Options: LongWord; - s: AnsiString; 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; - gnRespawnItems := TGUISwitch(GetControl('swRespawnItems')).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 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); @@ -774,21 +834,14 @@ begin NetUseMaster := TGUISwitch(GetControl('swUseMaster')).ItemIndex = 0; end; - 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); + g_Console_WriteGameConfig; + g_Game_StartServer(gsMap, GameMode, gsTimeLimit, gsScoreLimit, gsMaxLives, + gsGameFlags, gsPlayers, 0, NetPort); end; procedure ProcConnectNetGame(); var PW: String; - s: AnsiString; begin with TGUIMenu(g_ActiveWindow.GetControl('mNetClientMenu')) do begin @@ -797,16 +850,13 @@ begin PW := TGUIEdit(GetControl('edPW')).Text; end; - s := e_GetWriteableDir(ConfigDirs); - if s <> '' then - g_Options_Write_Net_Client(s + '/' + CONFIG_FILENAME); + g_Console_WriteGameConfig; g_Game_StartClient(NetClientIP, NetClientPort, PW); end; procedure ProcEnterPassword(); var PW: string; - s: AnsiString; begin with TGUIMenu(g_ActiveWindow.GetControl('mClientPasswordMenu')) do begin @@ -815,9 +865,7 @@ begin PW := TGUIEdit(GetControl('edPW')).Text; end; - s := e_GetWriteableDir(ConfigDirs); - if s <> '' then - g_Options_Write_Net_Client(s + '/' + CONFIG_FILENAME); + g_Console_WriteGameConfig; g_Game_StartClient(NetClientIP, NetClientPort, PW); end; @@ -834,7 +882,7 @@ begin NetInitDone := True; end; - g_Net_Slist_Set(NetSlistIP, NetSlistPort, NetSlistList); + g_Net_Slist_Set(NetMasterList); gState := STATE_SLIST; g_ActiveWindow := nil; @@ -1435,6 +1483,34 @@ begin g_GUI_ShowWindow('OptionsPlayersMIMenu'); end; +procedure ProcOptionsPlayerP1WeaponMenu(); +var + a: string; +begin + a := TGUIListBox(TGUIMenu(g_ActiveWindow.GetControl('mOptionsPlayers'+'P1'+'Menu')).GetControl('ls'+'P1'+'Model')).SelectedItem; + if a = '' then Exit; + g_GUI_ShowWindow('OptionsPlayersP1WeaponMenu'); +end; + +procedure ProcOptionsPlayerP1WeaponPreferencesMenu(); +begin + g_GUI_ShowWindow('OptionsPreferencesP1WeaponMenu'); +end; + +procedure ProcOptionsPlayerP2WeaponMenu(); +var + a: string; +begin + a := TGUIListBox(TGUIMenu(g_ActiveWindow.GetControl('mOptionsPlayers'+'P2'+'Menu')).GetControl('ls'+'P2'+'Model')).SelectedItem; + if a = '' then Exit; + g_GUI_ShowWindow('OptionsPlayersP2WeaponMenu'); +end; + +procedure ProcOptionsPlayerP2WeaponPreferencesMenu(); +begin + g_GUI_ShowWindow('OptionsPreferencesP2WeaponMenu'); +end; + procedure ProcOptionsPlayersAnim(); var s: String; @@ -1684,6 +1760,15 @@ begin end; end; +procedure ProcItemsRespawnMenu(); +var + menu: TGUIMenu; +begin + menu := TGUIMenu(g_GUI_GetWindow('ItemsRespawnMenu').GetControl('mItemsRespawnMenu')); + + g_GUI_ShowWindow('ItemsRespawnMenu'); +end; + procedure ReadGameSettings(); var menu: TGUIMenu; @@ -1693,59 +1778,92 @@ begin with gGameSettings do begin with TGUISwitch(menu.GetControl('swTeamDamage')) do - if LongBool(Options and GAME_OPTION_TEAMDAMAGE) then + if TGameOption.TEAM_DAMAGE in Options + then ItemIndex := 0 + else ItemIndex := 1; + with TGUISwitch(menu.GetControl('swTeamHit')) do + if [TGameOption.TEAM_HIT_TRACE, TGameOption.TEAM_HIT_PROJECTILE] <= Options then ItemIndex := 0 + else if TGameOption.TEAM_HIT_TRACE in Options then + ItemIndex := 1 + else if TGameOption.TEAM_HIT_PROJECTILE in Options then + ItemIndex := 2 else - ItemIndex := 1; + ItemIndex := 3; + with TGUISwitch(menu.GetControl('swDeathmatchKeys')) do + if TGameOption.DM_KEYS in Options + then ItemIndex := 0 + else ItemIndex := 1; + with TGUISwitch(menu.GetControl('swFlagDrop')) do + if [TGameOption.ALLOW_DROP_FLAG, TGameOption.THROW_FLAG] <= Options then + ItemIndex := 0 + else if TGameOption.ALLOW_DROP_FLAG in Options then + ItemIndex := 1 + else + ItemIndex := 2; TGUIEdit(menu.GetControl('edTimeLimit')).Text := IntToStr(TimeLimit); - TGUIEdit(menu.GetControl('edGoalLimit')).Text := IntToStr(GoalLimit); + TGUIEdit(menu.GetControl('edScoreLimit')).Text := IntToStr(ScoreLimit); TGUIEdit(menu.GetControl('edMaxLives')).Text := IntToStr(MaxLives); with TGUISwitch(menu.GetControl('swBotsVS')) do - if LongBool(Options and GAME_OPTION_BOTVSPLAYER) and - LongBool(Options and GAME_OPTION_BOTVSMONSTER) then + if [TGameOption.BOTS_VS_PLAYERS, TGameOption.BOTS_VS_MONSTERS] <= Options then ItemIndex := 2 + else if TGameOption.BOTS_VS_MONSTERS in Options then + ItemIndex := 1 else - if LongBool(Options and GAME_OPTION_BOTVSMONSTER) then - ItemIndex := 1 - else - ItemIndex := 0; + ItemIndex := 0; 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('swTeamDamage')).Enabled := True; - TGUIEdit(menu.GetControl('edTimeLimit')).Enabled := True; - TGUILabel(menu.GetControlsText('edTimeLimit')).Color := MENU_ITEMSTEXT_COLOR; - TGUIEdit(menu.GetControl('edGoalLimit')).Enabled := True; - TGUILabel(menu.GetControlsText('edGoalLimit')).Color := MENU_ITEMSTEXT_COLOR; - TGUIEdit(menu.GetControl('edMaxLives')).Enabled := True; - TGUILabel(menu.GetControlsText('edMaxLives')).Color := MENU_ITEMSTEXT_COLOR; - TGUISwitch(menu.GetControl('swBotsVS')).Enabled := True; + 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('edScoreLimit')).Enabled := True; + TGUILabel(menu.GetControlsText('edScoreLimit')).Color := MENU_ITEMSTEXT_COLOR; + TGUIEdit(menu.GetControl('edMaxLives')).Enabled := True; + TGUILabel(menu.GetControlsText('edMaxLives')).Color := MENU_ITEMSTEXT_COLOR; + TGUISwitch(menu.GetControl('swBotsVS')).Enabled := True; + TGUISwitch(menu.GetControl('swFlagDrop')).Enabled := True; + end 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 - TGUISwitch(menu.GetControl('swTeamDamage')).Enabled := True; - with TGUIEdit(menu.GetControl('edTimeLimit')) do - begin - Enabled := False; - Text := ''; - end; - TGUILabel(menu.GetControlsText('edTimeLimit')).Color := MENU_UNACTIVEITEMS_COLOR; - with TGUIEdit(menu.GetControl('edGoalLimit')) do - begin - Enabled := False; - Text := ''; - end; - TGUILabel(menu.GetControlsText('edGoalLimit')).Color := MENU_UNACTIVEITEMS_COLOR; - with TGUIEdit(menu.GetControl('edMaxLives')) do - begin - Enabled := False; - Text := ''; - end; - TGUILabel(menu.GetControlsText('edMaxLives')).Color := MENU_UNACTIVEITEMS_COLOR; - TGUISwitch(menu.GetControl('swBotsVS')).Enabled := True; + Enabled := False; + Text := ''; + end; + TGUILabel(menu.GetControlsText('edTimeLimit')).Color := MENU_UNACTIVEITEMS_COLOR; + with TGUIEdit(menu.GetControl('edScoreLimit')) do + begin + Enabled := False; + Text := ''; end; + TGUILabel(menu.GetControlsText('edScoreLimit')).Color := MENU_UNACTIVEITEMS_COLOR; + with TGUIEdit(menu.GetControl('edMaxLives')) do + begin + Enabled := False; + Text := ''; + end; + TGUILabel(menu.GetControlsText('edMaxLives')).Color := MENU_UNACTIVEITEMS_COLOR; + TGUISwitch(menu.GetControl('swBotsVS')).Enabled := True; + TGUISwitch(menu.GetControl('swFlagDrop')).Enabled := False; + end; end; end; @@ -1763,10 +1881,26 @@ begin begin if TGUISwitch(menu.GetControl('swTeamDamage')).Enabled then begin - if TGUISwitch(menu.GetControl('swTeamDamage')).ItemIndex = 0 then - Options := Options or GAME_OPTION_TEAMDAMAGE - else - Options := Options and (not GAME_OPTION_TEAMDAMAGE); + if TGUISwitch(menu.GetControl('swTeamDamage')).ItemIndex = 0 + then Options += [TGameOption.TEAM_DAMAGE] + else Options -= [TGameOption.TEAM_DAMAGE]; + end; + + if TGUISwitch(menu.GetControl('swTeamHit')).Enabled then + begin + Options -= [TGameOption.TEAM_HIT_TRACE, TGameOption.TEAM_HIT_PROJECTILE]; + case TGUISwitch(menu.GetControl('swTeamHit')).ItemIndex of + 1: Options += [TGameOption.TEAM_HIT_TRACE]; + 2: Options += [TGameOption.TEAM_HIT_PROJECTILE]; + 0: Options += [TGameOption.TEAM_HIT_TRACE, TGameOption.TEAM_HIT_PROJECTILE]; + end; + end; + + if TGUISwitch(menu.GetControl('swDeathmatchKeys')).Enabled then + begin + if TGUISwitch(menu.GetControl('swDeathmatchKeys')).ItemIndex = 0 + then Options += [TGameOption.DM_KEYS] + else Options -= [TGameOption.DM_KEYS]; end; if TGUIEdit(menu.GetControl('edTimeLimit')).Enabled then @@ -1783,12 +1917,12 @@ begin end; end; - if TGUIEdit(menu.GetControl('edGoalLimit')).Enabled then + if TGUIEdit(menu.GetControl('edScoreLimit')).Enabled then begin - n := StrToIntDef(TGUIEdit(menu.GetControl('edGoalLimit')).Text, GoalLimit); + n := StrToIntDef(TGUIEdit(menu.GetControl('edScoreLimit')).Text, ScoreLimit); if n = 0 then - GoalLimit := 0 + ScoreLimit := 0 else begin b := 0; @@ -1801,15 +1935,15 @@ begin b := stat[a].Frags; end else // CTF - b := Max(gTeamStat[TEAM_RED].Goals, gTeamStat[TEAM_BLUE].Goals); + b := Max(gTeamStat[TEAM_RED].Score, gTeamStat[TEAM_BLUE].Score); - GoalLimit := Max(n, b); + ScoreLimit := Max(n, b); end; end; if TGUIEdit(menu.GetControl('edMaxLives')).Enabled then begin - n := StrToIntDef(TGUIEdit(menu.GetControl('edMaxLives')).Text, GoalLimit); + n := StrToIntDef(TGUIEdit(menu.GetControl('edMaxLives')).Text, MaxLives); if n < 0 then n := 0; if n > 255 then n := 255; if n = 0 then @@ -1830,23 +1964,33 @@ begin if TGUISwitch(menu.GetControl('swBotsVS')).Enabled then begin case TGUISwitch(menu.GetControl('swBotsVS')).ItemIndex of - 1: - begin - Options := Options and (not GAME_OPTION_BOTVSPLAYER); - Options := Options or GAME_OPTION_BOTVSMONSTER; - end; - 2: - begin - Options := Options or GAME_OPTION_BOTVSPLAYER; - Options := Options or GAME_OPTION_BOTVSMONSTER; - end; + 1: begin + Options -= [TGameOption.BOTS_VS_PLAYERS]; + Options += [TGameOption.BOTS_VS_MONSTERS]; + end; + + 2: Options += [TGameOption.BOTS_VS_PLAYERS, TGameOption.BOTS_VS_MONSTERS]; + else - begin - Options := Options or GAME_OPTION_BOTVSPLAYER; - Options := Options and (not GAME_OPTION_BOTVSMONSTER); - end; + Options -= [TGameOption.BOTS_VS_MONSTERS]; + Options += [TGameOption.BOTS_VS_PLAYERS]; end; end; + + if TGUISwitch(menu.GetControl('swFlagDrop')).Enabled then + begin + case TGUISwitch(menu.GetControl('swFlagDrop')).ItemIndex of + 0: Options += [TGameOption.ALLOW_DROP_FLAG, TGameOption.THROW_FLAG]; + 1: Options += [TGameOption.ALLOW_DROP_FLAG]; + else Options -= [TGameOption.ALLOW_DROP_FLAG, TGameOption.THROW_FLAG]; + end; + end; + + // don't forget to latch this shit + gsGameFlags := Options; + gsMaxLives := MaxLives; + gsScoreLimit := ScoreLimit; + gsTimeLimit := TimeLimit; end; if g_Game_IsNet then MH_SEND_GameSettings; @@ -1860,8 +2004,8 @@ 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 @@ -1870,7 +2014,7 @@ begin if list <> nil then begin Items := list; - ItemIndex := Length(list) + ItemIndex := -1; (* nothing selected *) end else begin @@ -1883,6 +2027,10 @@ begin ItemIndex := 0 else ItemIndex := 1; + + TempResScale := Round(r_pixel_scale - 1); + with TGUISwitch(menu.GetControl('swResFactor')) do + ItemIndex := Max(Min(TempResScale, gRC_Width div 640 - 1), 0); end; procedure ProcApplyVideoOptions(); @@ -1890,18 +2038,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; @@ -2016,7 +2181,8 @@ begin AddButton(@ProcOptionsPlayersAnim, _lc[I_MENU_MODEL_ANIMATION]); AddButton(@ProcOptionsPlayersWeap, _lc[I_MENU_MODEL_CHANGE_WEAPON]); AddButton(@ProcOptionsPlayersRot, _lc[I_MENU_MODEL_ROTATE]); - + if s = 'P1' then AddButton(@ProcOptionsPlayerP1WeaponMenu, _lc[I_MENU_WEAPON]) + else AddButton(@ProcOptionsPlayerP2WeaponMenu, _lc[I_MENU_WEAPON]); with TGUIModelView(Menu.AddChild(TGUIModelView.Create)) do begin Name := 'mv'+s+'Model'; @@ -2062,8 +2228,8 @@ begin Name := 'mmNewGameMenu'; AddButton(@ProcSingle1Player, _lc[I_MENU_1_PLAYER]); AddButton(@ProcSingle2Players, _lc[I_MENU_2_PLAYERS]); - AddButton(nil, _lc[I_MENU_CUSTOM_GAME], 'CustomGameMenu'); AddButton(@ProcSelectCampaignMenu, _lc[I_MENU_CAMPAIGN], 'CampaignMenu'); + AddButton(nil, _lc[I_MENU_CUSTOM_GAME], 'CustomGameMenu'); end; Menu.DefControl := 'mmNewGameMenu'; g_GUI_AddWindow(Menu); @@ -2129,7 +2295,7 @@ begin begin Name := 'lbMap'; FixedLength := 16; - Text := gnMap; + Text := gsMap; OnClick := @ProcSelectMapMenu; end; with AddSwitch(_lc[I_MENU_GAME_TYPE]) do @@ -2139,7 +2305,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; @@ -2147,7 +2313,7 @@ begin GM_SINGLE, GM_COOP: ItemIndex := 3; end; - OnChange := ProcSwitchMonstersNet; + OnChange := ProcSwitchMonstersCustom; end; with AddEdit(_lc[I_MENU_TIME_LIMIT]) do begin @@ -2155,84 +2321,111 @@ 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 + with AddEdit(_lc[I_MENU_SCORE_LIMIT]) do begin - Name := 'edGoalLimit'; + Name := 'edScoreLimit'; OnlyDigits := True; Width := 4; MaxLength := 5; - if gnGoalLimit > 0 then - Text := IntToStr(gnGoalLimit); + if gsScoreLimit > 0 then + Text := IntToStr(gsScoreLimit); 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 AddLabel(_lc[I_MENU_SELECT_ITEM_RESPAWN]) do + begin + Name := 'lbItemsRespawn'; + FixedLength := 16; + OnClick := @ProcItemsRespawnMenu; + end; + AddSpace(); + 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 TGameOption.TEAM_DAMAGE in gsGameFlags + 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 [TGameOption.TEAM_HIT_TRACE, TGameOption.TEAM_HIT_PROJECTILE] <= gsGameFlags then ItemIndex := 0 + else if TGameOption.TEAM_HIT_TRACE in gsGameFlags then + ItemIndex := 1 + else if TGameOption.TEAM_HIT_PROJECTILE in gsGameFlags then + ItemIndex := 2 else - ItemIndex := 1; + ItemIndex := 3; end; - with AddSwitch(_lc[I_MENU_RESPAWN_ITEMS]) do + with AddSwitch(_lc[I_MENU_ENABLE_TEAM_DAMAGE_ABSOBR]) do begin - Name := 'swRespawnItems'; + Name := 'swTeamAbsorbDamage'; AddItem(_lc[I_MENU_YES]); AddItem(_lc[I_MENU_NO]); - if gnRespawnItems then - ItemIndex := 0 - else - ItemIndex := 1; + if TGameOption.TEAM_ABSORB_DAMAGE in gsGameFlags + 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 TGameOption.DM_KEYS in gsGameFlags + then ItemIndex := 0 + else ItemIndex := 1; end; with AddSwitch(_lc[I_MENU_ENABLE_EXITS]) do begin Name := 'swEnableExits'; AddItem(_lc[I_MENU_YES]); AddItem(_lc[I_MENU_NO]); - if gnAllowExit then - ItemIndex := 0 - else - ItemIndex := 1; + if TGameOption.ALLOW_EXIT in gsGameFlags + then ItemIndex := 0 + else ItemIndex := 1; end; with AddSwitch(_lc[I_MENU_WEAPONS_STAY]) do begin Name := 'swWeaponStay'; AddItem(_lc[I_MENU_YES]); AddItem(_lc[I_MENU_NO]); - if gnWeaponStay then - ItemIndex := 0 - else - ItemIndex := 1; + if TGameOption.WEAPONS_STAY in gsGameFlags + then ItemIndex := 0 + else ItemIndex := 1; end; with AddSwitch(_lc[I_MENU_ENABLE_MONSTERS]) do begin Name := 'swMonsters'; AddItem(_lc[I_MENU_YES]); AddItem(_lc[I_MENU_NO]); - if gnMonsters then - ItemIndex := 0 - else - ItemIndex := 1; + if TGameOption.MONSTERS in gsGameFlags + then ItemIndex := 0 + else ItemIndex := 1; end; with AddSwitch(_lc[I_MENU_BOTS_VS]) do begin @@ -2241,11 +2434,24 @@ begin AddItem(_lc[I_MENU_BOTS_VS_MONSTERS]); AddItem(_lc[I_MENU_BOTS_VS_ALL]); ItemIndex := 2; - if gnBotsVS = 'Players' then + if not (TGameOption.BOTS_VS_MONSTERS in gsGameFlags) then ItemIndex := 0; - if gnBotsVS = 'Monsters' then + if not (TGameOption.BOTS_VS_PLAYERS in gsGameFlags) then ItemIndex := 1; end; + with AddSwitch(_lc[I_MENU_FLAG_DROP]) do + begin + Name := 'swFlagDrop'; + AddItem(_lc[I_MENU_FLAG_THROW]); + AddItem(_lc[I_MENU_YES]); + AddItem(_lc[I_MENU_NO]); + if [TGameOption.ALLOW_DROP_FLAG, TGameOption.THROW_FLAG] <= gsGameFlags then + ItemIndex := 0 + else if TGameOption.ALLOW_DROP_FLAG in gsGameFlags then + ItemIndex := 1 + else + ItemIndex := 2; + end; AddSpace(); AddButton(@ProcStartNetGame, _lc[I_MENU_START_GAME]); @@ -2265,7 +2471,7 @@ begin with AddEdit(_lc[I_NET_ADDRESS]) do begin Name := 'edIP'; - OnlyDigits :=False; + OnlyDigits := False; Width := 12; MaxLength := 64; Text := 'localhost'; @@ -2339,7 +2545,7 @@ begin begin Name := 'lbMap'; FixedLength := 16; - Text := gcMap; + Text := gsMap; OnClick := @ProcSelectMapMenu; end; with AddSwitch(_lc[I_MENU_GAME_TYPE]) do @@ -2349,7 +2555,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; @@ -2365,17 +2571,17 @@ 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 + with AddEdit(_lc[I_MENU_SCORE_LIMIT]) do begin - Name := 'edGoalLimit'; + Name := 'edScoreLimit'; OnlyDigits := True; Width := 4; MaxLength := 5; - if gcGoalLimit > 0 then - Text := IntToStr(gcGoalLimit); + if gsScoreLimit > 0 then + Text := IntToStr(gsScoreLimit); end; with AddEdit(_lc[I_MENU_MAX_LIVES]) do begin @@ -2383,66 +2589,93 @@ begin OnlyDigits := True; Width := 4; MaxLength := 5; - if gcMaxLives > 0 then - Text := IntToStr(gcMaxLives); + if gsMaxLives > 0 then + Text := IntToStr(gsMaxLives); + end; + with AddLabel(_lc[I_MENU_SELECT_ITEM_RESPAWN]) do + begin + Name := 'lbItemsRespawn'; + FixedLength := 16; + OnClick := @ProcItemsRespawnMenu; end; + AddSpace(); 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 := 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 TGameOption.TEAM_DAMAGE in gsGameFlags + 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 [TGameOption.TEAM_HIT_TRACE, TGameOption.TEAM_HIT_PROJECTILE] <= gsGameFlags then ItemIndex := 0 + else if TGameOption.TEAM_HIT_TRACE in gsGameFlags then + ItemIndex := 1 + else if TGameOption.TEAM_HIT_PROJECTILE in gsGameFlags then + ItemIndex := 2 else - ItemIndex := 1; + ItemIndex := 3; end; - with AddSwitch(_lc[I_MENU_RESPAWN_ITEMS]) do + with AddSwitch(_lc[I_MENU_ENABLE_TEAM_DAMAGE_ABSOBR]) do begin - Name := 'swRespawnItems'; + Name := 'swTeamAbsorbDamage'; AddItem(_lc[I_MENU_YES]); AddItem(_lc[I_MENU_NO]); - if gcRespawnItems then - ItemIndex := 0 - else - ItemIndex := 1; + if TGameOption.TEAM_ABSORB_DAMAGE in gsGameFlags + 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 TGameOption.DM_KEYS in gsGameFlags + then ItemIndex := 0 + else ItemIndex := 1; end; with AddSwitch(_lc[I_MENU_ENABLE_EXITS]) do begin Name := 'swEnableExits'; AddItem(_lc[I_MENU_YES]); AddItem(_lc[I_MENU_NO]); - if gcAllowExit then - ItemIndex := 0 - else - ItemIndex := 1; + if TGameOption.ALLOW_EXIT in gsGameFlags + then ItemIndex := 0 + else ItemIndex := 1; end; with AddSwitch(_lc[I_MENU_WEAPONS_STAY]) do begin Name := 'swWeaponStay'; AddItem(_lc[I_MENU_YES]); AddItem(_lc[I_MENU_NO]); - if gcWeaponStay then - ItemIndex := 0 - else - ItemIndex := 1; + if TGameOption.WEAPONS_STAY in gsGameFlags + then ItemIndex := 0 + else ItemIndex := 1; end; with AddSwitch(_lc[I_MENU_ENABLE_MONSTERS]) do begin Name := 'swMonsters'; AddItem(_lc[I_MENU_YES]); AddItem(_lc[I_MENU_NO]); - if gcMonsters then - ItemIndex := 0 - else - ItemIndex := 1; + if TGameOption.MONSTERS in gsGameFlags + then ItemIndex := 0 + else ItemIndex := 1; end; with AddSwitch(_lc[I_MENU_BOTS_VS]) do begin @@ -2451,11 +2684,24 @@ begin AddItem(_lc[I_MENU_BOTS_VS_MONSTERS]); AddItem(_lc[I_MENU_BOTS_VS_ALL]); ItemIndex := 2; - if gcBotsVS = 'Players' then + if not (TGameOption.BOTS_VS_MONSTERS in gsGameFlags) then ItemIndex := 0; - if gcBotsVS = 'Monsters' then + if not (TGameOption.BOTS_VS_PLAYERS in gsGameFlags) then ItemIndex := 1; end; + with AddSwitch(_lc[I_MENU_FLAG_DROP]) do + begin + Name := 'swFlagDrop'; + AddItem(_lc[I_MENU_FLAG_THROW]); + AddItem(_lc[I_MENU_YES]); + AddItem(_lc[I_MENU_NO]); + if [TGameOption.ALLOW_DROP_FLAG, TGameOption.THROW_FLAG] <= gsGameFlags then + ItemIndex := 0 + else if TGameOption.ALLOW_DROP_FLAG in gsGameFlags then + ItemIndex := 1 + else + ItemIndex := 2; + end; AddSpace(); AddButton(@ProcStartCustomGame, _lc[I_MENU_START_GAME]); @@ -2566,7 +2812,7 @@ begin FixedLength := 10; Enabled := False; end; - with AddMemo(_lc[I_MENU_MAP_DESCRIPTION], 12, 4) do + with AddMemo(_lc[I_MENU_MAP_DESCRIPTION], 20, 4) do begin Name := 'meMapDescription'; end; @@ -2595,6 +2841,92 @@ begin Menu.DefControl := 'mSelectMapMenu'; g_GUI_AddWindow(Menu); + Menu := TGUIWindow.Create('ItemsRespawnMenu'); + with TGUIMenu(Menu.AddChild(TGUIMenu.Create(gMenuFont, gMenuSmallFont, _lc[I_MENU_ITEM_RESPAWN]))) do + begin + Name := 'mItemsRespawnMenu'; + + // Switches separate from the time entry fields + with AddSwitch(_lc[I_MENU_ENABLE_POWERUP_RANDOM]) do + begin + Name := 'swPowerupRandom'; + AddItem(_lc[I_MENU_YES]); + AddItem(_lc[I_MENU_NO]); + if TGameOption.POWERUP_RANDOM in gsGameFlags + then ItemIndex := 0 + else ItemIndex := 1; + end; + with AddSwitch(_lc[I_MENU_ENABLE_ITEM_RANDOM]) do + begin + Name := 'swItemsRandom'; + AddItem(_lc[I_MENU_ITEM_RANDOM_ALL]); + AddItem(_lc[I_MENU_ITEM_RANDOM_LIFE_ONLY]); + AddItem(_lc[I_MENU_ITEM_RANDOM_AMMO_ONLY]); + AddItem(_lc[I_MENU_ITEM_RANDOM_WEAPON_ONLY]); + AddItem(_lc[I_MENU_ITEM_RANDOM_LIFE_AMMO]); + AddItem(_lc[I_MENU_ITEM_RANDOM_LIFE_WEAPON]); + AddItem(_lc[I_MENU_ITEM_RANDOM_WEAPON_AMMO]); + AddItem(_lc[I_MENU_ITEM_RANDOM_NOTHING]); + if TGameOption.ITEM_ALL_RANDOM in gsGameFlags then + ItemIndex := 0 + else if TGameOption.ITEM_LIFE_RANDOM in gsGameFlags then + ItemIndex := 1 + else if TGameOption.ITEM_AMMO_RANDOM in gsGameFlags then + ItemIndex := 2 + else if TGameOption.ITEM_WEAPON_RANDOM in gsGameFlags then + ItemIndex := 3 + else if [TGameOption.ITEM_LIFE_RANDOM, TGameOption.ITEM_AMMO_RANDOM] <= gsGameFlags then + ItemIndex := 4 + else if [TGameOption.ITEM_LIFE_RANDOM, TGameOption.ITEM_WEAPON_RANDOM] <= gsGameFlags then + ItemIndex := 5 + else if [TGameOption.ITEM_AMMO_RANDOM, TGameOption.ITEM_WEAPON_RANDOM] <= gsGameFlags then + ItemIndex := 6 + else + ItemIndex := 7; + end; + AddSpace();// Items Respawn block + 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 AddEdit(_lc[I_MENU_ITEM_RESPAWN_RANDOM]) do + begin + Name := 'edItemRespawnRandom'; + OnlyDigits := True; + Width := 4; + MaxLength := 5; + if gsItemRespawnTime > 0 then + Text := IntToStr(gsItemRespawnRandom); + end; + // Powerup Respawn block + with AddEdit(_lc[I_MENU_POWERUP_RESPAWN_TIME]) do + begin + Name := 'edPowerupRespawnTime'; + OnlyDigits := True; + Width := 4; + MaxLength := 5; + if gsPowerupRespawnTime > 0 then + Text := IntToStr(gsPowerupRespawnTime); + end; + with AddEdit(_lc[I_MENU_POWERUP_RESPAWN_RANDOM]) do + begin + Name := 'edPowerupRespawnRandom'; + OnlyDigits := True; + Width := 4; + MaxLength := 5; + if gsPowerupRespawnRandom > 0 then + Text := IntToStr(gsPowerupRespawnRandom); + end; + AddSpace(); + end; + Menu.DefControl := 'mItemsRespawnMenu'; + g_GUI_AddWindow(Menu); + Menu := TGUIWindow.Create('OptionsMenu'); with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, '', _lc[I_MENU_OPTIONS]))) do begin @@ -2640,6 +2972,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'; @@ -2674,6 +3012,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(); @@ -2897,6 +3242,7 @@ begin AddKeyRead2(_lc[I_MENU_CONTROL_NEXT_WEAPON]).Name := _lc[I_MENU_CONTROL_NEXT_WEAPON]; AddKeyRead2(_lc[I_MENU_CONTROL_PREV_WEAPON]).Name := _lc[I_MENU_CONTROL_PREV_WEAPON]; AddKeyRead2(_lc[I_MENU_CONTROL_STRAFE]).Name := _lc[I_MENU_CONTROL_STRAFE]; + AddKeyRead2(_lc[I_MENU_CONTROL_DROPFLAG]).Name := _lc[I_MENU_CONTROL_DROPFLAG]; end; Menu.DefControl := 'mOptionsControlsP1Menu'; g_GUI_AddWindow(Menu); @@ -2926,6 +3272,7 @@ begin AddKeyRead2(_lc[I_MENU_CONTROL_NEXT_WEAPON]).Name := _lc[I_MENU_CONTROL_NEXT_WEAPON]; AddKeyRead2(_lc[I_MENU_CONTROL_PREV_WEAPON]).Name := _lc[I_MENU_CONTROL_PREV_WEAPON]; AddKeyRead2(_lc[I_MENU_CONTROL_STRAFE]).Name := _lc[I_MENU_CONTROL_STRAFE]; + AddKeyRead2(_lc[I_MENU_CONTROL_DROPFLAG]).Name := _lc[I_MENU_CONTROL_DROPFLAG]; end; Menu.DefControl := 'mOptionsControlsP2Menu'; g_GUI_AddWindow(Menu); @@ -3031,6 +3378,123 @@ begin Menu.DefControl := 'mOptionsPlayersMIMenu'; g_GUI_AddWindow(Menu); + Menu := TGUIWindow.Create('OptionsPlayersP1WeaponMenu'); + with TGUIMenu(Menu.AddChild(TGUIMenu.Create(gMenuFont, gMenuSmallFont, _lc[I_MENU_WEAPON]))) do + begin + Name := 'mOptionsPlayersP1WeaponMenu'; + with AddSwitch(_lc[I_MENU_WEAPON_SWITCH]) do + begin + Name := 'swWeaponAutoswitch'; + AddItem(_lc[I_MENU_NO]); + AddItem(_lc[I_MENU_WEAPON_SWITCH_LINEAR]); + AddItem(_lc[I_MENU_WEAPON_SWITCH_PREFERENCE]); + end; + with AddSwitch(_lc[I_MENU_WEAPON_ALLOW_EMPTY]) do + begin + Name := 'swWeaponAllowEmpty'; + AddItem(_lc[I_MENU_YES]); + AddItem(_lc[I_MENU_NO]); + end; + with AddSwitch(_lc[I_MENU_IRONFIST_ALLOW]) do + begin + Name := 'swWeaponAllowIronFist'; + AddItem(_lc[I_MENU_IRONFIST_ALLOW_ALWAYS]); + AddItem(_lc[I_MENU_IRONFIST_ALLOW_BERSERK]); + end; + AddButton(@ProcOptionsPlayerP1WeaponPreferencesMenu, _lc[I_MENU_WEAPON_SWITCH_PRIORITY]); + ReAlign(); + end; + Menu.DefControl := 'mOptionsPlayersP1WeaponMenu'; + g_GUI_AddWindow(Menu); + + Menu := TGUIWindow.Create('OptionsPreferencesP1WeaponMenu'); + with TGUIMenu(Menu.AddChild(TGUIMenu.Create(gMenuFont, gMenuSmallFont, _lc[I_MENU_WEAPON_PRIORITY_PLAYER_1]))) do + begin + Name := 'mOptionsPreferencesP1WeaponMenu'; + for i := WP_FIRST to WP_LAST do + begin + with AddSwitch(_lc[TStrings_Locale(Cardinal(I_GAME_WEAPON0) + i)]) do + begin + Name := IntToStr(i); + for a := WP_FIRST to WP_LAST+1 do + begin + AddItem(IntToStr(a)); + end; + ItemIndex := i + end; + end; + with AddSwitch(_lc[I_GAME_WEAPON_BERSERK]) do + begin + Name := IntToStr(WP_LAST+1); + for a := WP_FIRST to WP_LAST+1 do + begin + AddItem(IntToStr(a)); + end; + ItemIndex := WP_LAST + 1; + end; + end; + Menu.DefControl := 'mOptionsPreferencesP1WeaponMenu'; + g_GUI_AddWindow(Menu); + + + Menu := TGUIWindow.Create('OptionsPlayersP2WeaponMenu'); + with TGUIMenu(Menu.AddChild(TGUIMenu.Create(gMenuFont, gMenuSmallFont, _lc[I_MENU_WEAPON]))) do + begin + Name := 'mOptionsPlayersP2WeaponMenu'; + with AddSwitch(_lc[I_MENU_WEAPON_SWITCH]) do + begin + Name := 'swWeaponAutoswitch'; + AddItem(_lc[I_MENU_NO]); + AddItem(_lc[I_MENU_WEAPON_SWITCH_LINEAR]); + AddItem(_lc[I_MENU_WEAPON_SWITCH_PREFERENCE]); + end; + with AddSwitch(_lc[I_MENU_WEAPON_ALLOW_EMPTY]) do + begin + Name := 'swWeaponAllowEmpty'; + AddItem(_lc[I_MENU_YES]); + AddItem(_lc[I_MENU_NO]); + end; + with AddSwitch(_lc[I_MENU_IRONFIST_ALLOW]) do + begin + Name := 'swWeaponAllowIronFist'; + AddItem(_lc[I_MENU_IRONFIST_ALLOW_ALWAYS]); + AddItem(_lc[I_MENU_IRONFIST_ALLOW_BERSERK]); + end; + AddButton(@ProcOptionsPlayerP2WeaponPreferencesMenu, _lc[I_MENU_WEAPON_SWITCH_PRIORITY]); + ReAlign(); + end; + Menu.DefControl := 'mOptionsPlayersP2WeaponMenu'; + g_GUI_AddWindow(Menu); + + Menu := TGUIWindow.Create('OptionsPreferencesP2WeaponMenu'); + with TGUIMenu(Menu.AddChild(TGUIMenu.Create(gMenuFont, gMenuSmallFont, _lc[I_MENU_WEAPON_PRIORITY_PLAYER_2]))) do + begin + Name := 'mOptionsPreferencesP2WeaponMenu'; + for i := WP_FIRST to WP_LAST do + begin + with AddSwitch(_lc[TStrings_Locale(Cardinal(I_GAME_WEAPON0) + i)]) do + begin + Name := IntToStr(i); + for a := WP_FIRST to WP_LAST+1 do + begin + AddItem(IntToStr(a)); + end; + ItemIndex := i + end; + end; + with AddSwitch(_lc[I_GAME_WEAPON_BERSERK]) do + begin + Name := IntToStr(WP_LAST+1); + for a := WP_FIRST to WP_LAST+1 do + begin + AddItem(IntToStr(a)); + end; + ItemIndex := WP_LAST + 1; + end; + end; + Menu.DefControl := 'mOptionsPreferencesP2WeaponMenu'; + g_GUI_AddWindow(Menu); + Menu := TGUIWindow.Create('OptionsLanguageMenu'); with TGUIMenu(Menu.AddChild(TGUIMenu.Create(gMenuFont, gMenuSmallFont, _lc[I_MENU_LANGUAGE_OPTIONS]))) do begin @@ -3274,6 +3738,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'; @@ -3281,9 +3761,9 @@ begin Width := 4; MaxLength := 5; end; - with AddEdit(_lc[I_MENU_GOAL_LIMIT]) do + with AddEdit(_lc[I_MENU_SCORE_LIMIT]) do begin - Name := 'edGoalLimit'; + Name := 'edScoreLimit'; OnlyDigits := True; Width := 4; MaxLength := 5; @@ -3303,6 +3783,14 @@ begin AddItem(_lc[I_MENU_BOTS_VS_ALL]); ItemIndex := 2; end; + with AddSwitch(_lc[I_MENU_FLAG_DROP]) do + begin + Name := 'swFlagDrop'; + AddItem(_lc[I_MENU_FLAG_THROW]); + AddItem(_lc[I_MENU_YES]); + AddItem(_lc[I_MENU_NO]); + ItemIndex := 2; + end; ReAlign(); end;