DEADSOFTWARE

Make autoswitch server-side. Add option to skip empty weapons by travi$
[d2df-sdl.git] / src / game / g_menu.pas
index 95a0da30f122c1634ea69c381f02d372d8097e8e..69cd445cb09fbb797432559356de6e25b25b7b74 100644 (file)
@@ -171,6 +171,7 @@ begin
     g_dbg_scale := TempScale + 1;
   end;
 
+
   menu := TGUIMenu(g_GUI_GetWindow('OptionsControlsMenu').GetControl('mOptionsControlsMenu'));
 
   with menu do
@@ -196,6 +197,7 @@ begin
     g_Console_BindKey(g_Console_FindBind(1, '+p1_jump', '-p1_jump'), '');
     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');
@@ -206,6 +208,7 @@ begin
     g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_JUMP])).Key0, '+p1_jump', '-p1_jump');
     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
@@ -217,6 +220,7 @@ begin
     g_Console_BindKey(g_Console_FindBind(2, '+p1_jump', '-p1_jump'), '');
     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');
@@ -227,6 +231,7 @@ begin
     g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_JUMP])).Key1, '+p1_jump', '-p1_jump');
     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;
@@ -254,6 +259,7 @@ begin
     g_Console_BindKey(g_Console_FindBind(1, '+p2_jump', '-p2_jump'), '');
     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');
@@ -264,6 +270,7 @@ begin
     g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_JUMP])).Key0, '+p2_jump', '-p2_jump');
     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
@@ -275,6 +282,7 @@ begin
     g_Console_BindKey(g_Console_FindBind(2, '+p2_jump', '-p2_jump'), '');
     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');
@@ -285,6 +293,7 @@ begin
     g_Console_BindKey(TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_JUMP])).Key1, '+p2_jump', '-p2_jump');
     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;
@@ -333,6 +342,44 @@ begin
     gPlayer1Settings.Color := Model.Color;
   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;
+    gPlayer1Settings.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;
+
+
+  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;
+  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;
+
   menu := TGUIMenu(g_GUI_GetWindow('OptionsPlayersP2Menu').GetControl('mOptionsPlayersP2Menu'));
 
   gPlayer2Settings.Name := b_Text_Unformat(TGUIEdit(menu.GetControl('edP2Name')).Text);
@@ -358,7 +405,10 @@ begin
       else
         if gPlayer1.Team <> gPlayer1Settings.Team then
           gPlayer1.SwitchTeam;
-
+      gPlayer1.WeapSwitchMode := gPlayer1Settings.WeaponSwitch;
+      if (gPlayer1.WeapSwitchMode = 2) then
+        gPlayer1.setWeaponPrefs(gPlayer1Settings.WeaponPreferences);
+      gPlayer1.SwitchToEmpty := gPlayer1Settings.SwitchToEmpty;
       if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer1.UID);
     end;
 
@@ -371,6 +421,10 @@ begin
       else
         if gPlayer2.Team <> gPlayer2Settings.Team then
           gPlayer2.SwitchTeam;
+      gPlayer2.WeapSwitchMode := gPlayer2Settings.WeaponSwitch;
+      if (gPlayer2.WeapSwitchMode = 2) then
+        gPlayer2.setWeaponPrefs(gPlayer2Settings.WeaponPreferences);
+      gPlayer2.SwitchToEmpty := gPlayer2Settings.SwitchToEmpty;
     end;
   end;
 
@@ -382,7 +436,7 @@ end;
 procedure ReadOptions();
 var
   menu: TGUIMenu;
-  i: Integer;
+  i, a: Integer;
 begin
   menu := TGUIMenu(g_GUI_GetWindow('OptionsVideoMenu').GetControl('mOptionsVideoMenu'));
 
@@ -441,6 +495,7 @@ begin
     TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_JUMP])).Key0 := g_Console_FindBind(1, '+p1_jump', '-p1_jump');
     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
@@ -452,6 +507,7 @@ begin
     TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_JUMP])).Key1 := g_Console_FindBind(2, '+p1_jump', '-p1_jump');
     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;
@@ -477,6 +533,7 @@ begin
     TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_JUMP])).Key0 := g_Console_FindBind(1, '+p2_jump', '-p2_jump');
     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
@@ -488,6 +545,7 @@ begin
     TGUIKeyRead2(GetControl(_lc[I_MENU_CONTROL_JUMP])).Key1 := g_Console_FindBind(2, '+p2_jump', '-p2_jump');
     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;
@@ -595,6 +653,27 @@ 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;
+
+  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;
+  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);
@@ -693,6 +772,12 @@ begin
       else gsGameFlags := gsGameFlags or GAME_OPTION_BOTVSPLAYER;
     end;
 
+    case TGUISwitch(GetControl('swFlagDrop')).ItemIndex of
+      0: gsGameFlags := gsGameFlags or GAME_OPTION_ALLOWDROPFLAG or GAME_OPTION_THROWFLAG;
+      1: gsGameFlags := gsGameFlags or GAME_OPTION_ALLOWDROPFLAG;
+      else gsGameFlags := gsGameFlags and not (GAME_OPTION_ALLOWDROPFLAG or GAME_OPTION_THROWFLAG);
+    end;
+
     // TODO: get this crap out of here
     gGameSettings.ItemRespawnTime := gsItemRespawnTime;
     gGameSettings.WarmupTime := gsWarmupTime;
@@ -1379,6 +1464,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;
@@ -1655,6 +1768,13 @@ begin
         ItemIndex := 0
       else
         ItemIndex := 1;
+    with TGUISwitch(menu.GetControl('swFlagDrop')) do
+      if LongBool(Options and GAME_OPTION_ALLOWDROPFLAG) and LongBool(Options and GAME_OPTION_THROWFLAG) then
+        ItemIndex := 0
+      else if LongBool(Options and GAME_OPTION_ALLOWDROPFLAG) then
+        ItemIndex := 1
+      else
+        ItemIndex := 2;
 
     TGUIEdit(menu.GetControl('edTimeLimit')).Text := IntToStr(TimeLimit);
     TGUIEdit(menu.GetControl('edGoalLimit')).Text := IntToStr(GoalLimit);
@@ -1691,6 +1811,7 @@ begin
         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
@@ -1717,6 +1838,7 @@ begin
         end;
         TGUILabel(menu.GetControlsText('edMaxLives')).Color := MENU_UNACTIVEITEMS_COLOR;
         TGUISwitch(menu.GetControl('swBotsVS')).Enabled := True;
+        TGUISwitch(menu.GetControl('swFlagDrop')).Enabled := False;
       end;
   end;
 end;
@@ -1838,6 +1960,15 @@ begin
       end;
     end;
 
+    if TGUISwitch(menu.GetControl('swFlagDrop')).Enabled then
+    begin
+      case TGUISwitch(menu.GetControl('swFlagDrop')).ItemIndex of
+        0: Options := Options or GAME_OPTION_ALLOWDROPFLAG or GAME_OPTION_THROWFLAG;
+        1: Options := Options or GAME_OPTION_ALLOWDROPFLAG;
+        else Options := Options and not (GAME_OPTION_ALLOWDROPFLAG or GAME_OPTION_THROWFLAG);
+      end;
+    end;
+
     // don't forget to latch this shit
     gsGameFlags := Options;
     gsMaxLives := MaxLives;
@@ -2033,7 +2164,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';
@@ -2049,7 +2181,7 @@ procedure CreateAllMenus();
 var
   Menu: TGUIWindow;
   //SR: TSearchRec;
-  a, cx, _y, i: Integer;
+  a, cx, _y, i, x: Integer;
   //list: SSArray;
 begin
   Menu := TGUIWindow.Create('MainMenu');
@@ -2288,6 +2420,19 @@ begin
       if not LongBool(gsGameFlags and GAME_OPTION_BOTVSPLAYER) 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 (gsGameFlags and (GAME_OPTION_ALLOWDROPFLAG or GAME_OPTION_THROWFLAG)) = (GAME_OPTION_ALLOWDROPFLAG or GAME_OPTION_THROWFLAG) then
+        ItemIndex := 0
+      else if LongBool(gsGameFlags and GAME_OPTION_ALLOWDROPFLAG) then
+        ItemIndex := 1
+      else
+        ItemIndex := 2;
+    end;
     AddSpace();
     AddButton(@ProcStartNetGame, _lc[I_MENU_START_GAME]);
 
@@ -2523,6 +2668,19 @@ begin
       if not LongBool(gsGameFlags and GAME_OPTION_BOTVSPLAYER) 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 (gsGameFlags and (GAME_OPTION_ALLOWDROPFLAG or GAME_OPTION_THROWFLAG)) = (GAME_OPTION_ALLOWDROPFLAG or GAME_OPTION_THROWFLAG) then
+        ItemIndex := 0
+      else if LongBool(gsGameFlags and GAME_OPTION_ALLOWDROPFLAG) then
+        ItemIndex := 1
+      else
+        ItemIndex := 2;
+    end;
     AddSpace();
     AddButton(@ProcStartCustomGame, _lc[I_MENU_START_GAME]);
 
@@ -2977,6 +3135,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);
@@ -3006,6 +3165,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);
@@ -3111,6 +3271,111 @@ 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;
+    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;
+    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
@@ -3399,6 +3664,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;