DEADSOFTWARE

Game: Use proper syntax of sets for game options instead of raw bitwise operations
[d2df-sdl.git] / src / game / g_menu.pas
index ed6d3ef3261cb8bb9e655389d5e29dddadcae2cd..8fe06a3f8e5d8ac952ef6ae2a80bc8cb638d844a 100644 (file)
@@ -177,11 +177,11 @@ begin
   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;
@@ -331,34 +331,29 @@ 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;
     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,
+  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);
-
-  with TGUIModelView(g_GUI_GetWindow('OptionsPlayersP1Menu').GetControl('mvP1Model')) do
+  with TGUIModelView(g_GUI_GetWindow('OptionsPlayersP2Menu').GetControl('mvP2Model')) do
   begin
-    gPlayer1Settings.Model := Model.Name;
-    gPlayer1Settings.Color := Model.Color;
+    gPlayer2Settings.Model := Model.Name;
+    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.SkipFist := TGUISwitch(menu.GetControl('swWeaponAllowFist')).ItemIndex;
-  
+  gPlayer1Settings.SkipIronFist := TGUISwitch(menu.GetControl('swWeaponAllowIronFist')).ItemIndex;
   menu := TGUIMenu(g_GUI_GetWindow('OptionsPreferencesP1WeaponMenu').GetControl('mOptionsPreferencesP1WeaponMenu'));
   with menu do
   begin
@@ -371,7 +366,7 @@ begin
   menu := TGUIMenu(g_GUI_GetWindow('OptionsPlayersP2WeaponMenu').GetControl('mOptionsPlayersP2WeaponMenu'));
   gPlayer2Settings.WeaponSwitch := TGUISwitch(menu.GetControl('swWeaponAutoswitch')).ItemIndex;
   gPlayer2Settings.SwitchToEmpty := TGUISwitch(menu.GetControl('swWeaponAllowEmpty')).ItemIndex;
-  gPlayer2Settings.SkipFist := TGUISwitch(menu.GetControl('swWeaponAllowFist')).ItemIndex;
+  gPlayer2Settings.SkipIronFist := TGUISwitch(menu.GetControl('swWeaponAllowIronFist')).ItemIndex;
   menu := TGUIMenu(g_GUI_GetWindow('OptionsPreferencesP2WeaponMenu').GetControl('mOptionsPreferencesP2WeaponMenu'));
   with menu do
   begin
@@ -381,17 +376,6 @@ begin
     end;
   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);
-  with TGUIModelView(g_GUI_GetWindow('OptionsPlayersP2Menu').GetControl('mvP2Model')) do
-  begin
-    gPlayer2Settings.Model := Model.Name;
-    gPlayer2Settings.Color := Model.Color;
-  end;
-
   if gPlayer1Settings.Name = '' then gPlayer1Settings.Name := GenPlayerName(1);
   if gPlayer2Settings.Name = '' then gPlayer2Settings.Name := GenPlayerName(2);
 
@@ -409,7 +393,7 @@ begin
       gPlayer1.WeapSwitchMode := gPlayer1Settings.WeaponSwitch;
       gPlayer1.setWeaponPrefs(gPlayer1Settings.WeaponPreferences);
       gPlayer1.SwitchToEmpty := gPlayer1Settings.SwitchToEmpty;
-      gPlayer1.SkipFist := gPlayer1Settings.SkipFist;
+      gPlayer1.SkipIronFist := gPlayer1Settings.SkipIronFist;
       if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer1.UID);
     end;
 
@@ -417,7 +401,7 @@ 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
@@ -425,7 +409,8 @@ begin
       gPlayer2.WeapSwitchMode := gPlayer2Settings.WeaponSwitch;
       gPlayer2.setWeaponPrefs(gPlayer2Settings.WeaponPreferences);
       gPlayer2.SwitchToEmpty := gPlayer2Settings.SwitchToEmpty;
-      gPlayer2.SkipFist := gPlayer2Settings.SkipFist;
+      gPlayer2.SkipIronFist := gPlayer2Settings.SkipIronFist;
+      //if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer2.UID);
     end;
   end;
 
@@ -591,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;
@@ -661,7 +646,7 @@ begin
   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('swWeaponAllowFist')).ItemIndex := gPlayer1Settings.SkipFist;
+  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
@@ -672,7 +657,7 @@ begin
   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('swWeaponAllowFist')).ItemIndex := gPlayer2Settings.SkipFist;
+  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
@@ -748,47 +733,75 @@ begin
     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);
+    gsScoreLimit := StrToIntDef(TGUIEdit(GetControl('edScoreLimit')).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;
+    gsGameFlags := [];
     if TGUISwitch(GetControl('swTeamDamage')).ItemIndex = 0 then
-      gsGameFlags := gsGameFlags or GAME_OPTION_TEAMDAMAGE;
+      gsGameFlags += [TGameOption.TEAM_DAMAGE];
+    if TGUISwitch(GetControl('swTeamAbsorbDamage')).ItemIndex = 0 then
+      gsGameFlags += [TGameOption.TEAM_ABSORB_DAMAGE];
     if TGUISwitch(GetControl('swDeathmatchKeys')).ItemIndex = 0 then
-      gsGameFlags := gsGameFlags or GAME_OPTION_DMKEYS;
+      gsGameFlags += [TGameOption.DM_KEYS];
     if TGUISwitch(GetControl('swEnableExits')).ItemIndex = 0 then
-      gsGameFlags := gsGameFlags or GAME_OPTION_ALLOWEXIT;
+      gsGameFlags += [TGameOption.ALLOW_EXIT];
     if TGUISwitch(GetControl('swWeaponStay')).ItemIndex = 0 then
-      gsGameFlags := gsGameFlags or GAME_OPTION_WEAPONSTAY;
+      gsGameFlags += [TGameOption.WEAPONS_STAY];
     if TGUISwitch(GetControl('swMonsters')).ItemIndex = 0 then
-      gsGameFlags := gsGameFlags or GAME_OPTION_MONSTERS;
+      gsGameFlags += [TGameOption.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;
+      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: gsGameFlags := gsGameFlags or GAME_OPTION_BOTVSMONSTER;
-      2: gsGameFlags := gsGameFlags or GAME_OPTION_BOTVSPLAYER or GAME_OPTION_BOTVSMONSTER;
-      else gsGameFlags := gsGameFlags or GAME_OPTION_BOTVSPLAYER;
+      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 := 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);
+      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.ItemRespawnTime := gsItemRespawnTime;
     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;
+
+    // TODO: get this crap out of here
+    gGameSettings.ItemRespawnTime := gsItemRespawnTime;
+    gGameSettings.ItemRespawnRandom := gsItemRespawnRandom;
+    gGameSettings.PowerupRespawnTime := gsPowerupRespawnTime;
+    gGameSettings.PowerupRespawnRandom := gsPowerupRespawnRandom;
+  end;
 end;
 
 procedure ProcStartCustomGame();
@@ -799,7 +812,7 @@ begin
   if GameMode = GM_NONE then Exit;
 
   g_Console_WriteGameConfig;
-  g_Game_StartCustom(gsMap, GameMode, gsTimeLimit, gsGoalLimit,
+  g_Game_StartCustom(gsMap, GameMode, gsTimeLimit, gsScoreLimit,
                      gsMaxLives, gsGameFlags, gsPlayers);
 end;
 
@@ -822,7 +835,7 @@ begin
   end;
 
   g_Console_WriteGameConfig;
-  g_Game_StartServer(gsMap, GameMode, gsTimeLimit, gsGoalLimit, gsMaxLives,
+  g_Game_StartServer(gsMap, GameMode, gsTimeLimit, gsScoreLimit, gsMaxLives,
                      gsGameFlags, gsPlayers, 0, NetPort);
 end;
 
@@ -1747,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;
@@ -1756,96 +1778,92 @@ begin
   with gGameSettings do
   begin
     with TGUISwitch(menu.GetControl('swTeamDamage')) do
-      if LongBool(Options and GAME_OPTION_TEAMDAMAGE) then
-        ItemIndex := 0
-      else
-        ItemIndex := 1;
+      if TGameOption.TEAM_DAMAGE in Options
+        then 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
+      if [TGameOption.TEAM_HIT_TRACE, TGameOption.TEAM_HIT_PROJECTILE] <= Options then
         ItemIndex := 0
-      else if LongBool(Options and GAME_OPTION_TEAMHITTRACE) then
+      else if TGameOption.TEAM_HIT_TRACE in Options then
         ItemIndex := 1
-      else if LongBool(Options and GAME_OPTION_TEAMHITPROJECTILE) then
+      else if TGameOption.TEAM_HIT_PROJECTILE in Options 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;
+      if TGameOption.DM_KEYS in Options
+        then 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
+      if [TGameOption.ALLOW_DROP_FLAG, TGameOption.THROW_FLAG] <= Options then
         ItemIndex := 0
-      else if LongBool(Options and GAME_OPTION_ALLOWDROPFLAG) then
+      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;
-        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;
-        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('swFlagDrop')).Enabled := True;
+        TGUISwitch(menu.GetControl('swDeathmatchKeys')).Enabled := True;
+        TGUILabel(menu.GetControlsText('swDeathmatchKeys')).Color := MENU_ITEMSTEXT_COLOR;
       end
-    else
+      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;
-          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;
-        TGUISwitch(menu.GetControl('swFlagDrop')).Enabled := False;
       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
+        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;
 
@@ -1863,28 +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 := Options and not (GAME_OPTION_TEAMHITTRACE or GAME_OPTION_TEAMHITPROJECTILE);
+      Options -= [TGameOption.TEAM_HIT_TRACE, TGameOption.TEAM_HIT_PROJECTILE];
       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;
+        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 := Options or GAME_OPTION_DMKEYS
-      else
-        Options := Options and (not GAME_OPTION_DMKEYS);
+      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
@@ -1901,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;
@@ -1919,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
@@ -1948,37 +1964,32 @@ 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 := 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);
+        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;
-    gsGoalLimit := GoalLimit;
+    gsScoreLimit := ScoreLimit;
     gsTimeLimit := TimeLimit;
   end;
 
@@ -2003,7 +2014,7 @@ begin
     if list <> nil then
     begin
       Items := list;
-      ItemIndex := Length(list)
+      ItemIndex := -1; (* nothing selected *)
     end
     else
     begin
@@ -2019,7 +2030,7 @@ begin
 
   TempResScale := Round(r_pixel_scale - 1);
   with TGUISwitch(menu.GetControl('swResFactor')) do
-    ItemIndex := Min(TempResScale, gRC_Width div 640 - 1);
+    ItemIndex := Max(Min(TempResScale, gRC_Width div 640 - 1), 0);
 end;
 
 procedure ProcApplyVideoOptions();
@@ -2217,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);
@@ -2313,14 +2324,14 @@ begin
       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 gsGoalLimit > 0 then
-        Text := IntToStr(gsGoalLimit);
+      if gsScoreLimit > 0 then
+        Text := IntToStr(gsScoreLimit);
     end;
     with AddEdit(_lc[I_MENU_MAX_LIVES]) do
     begin
@@ -2331,15 +2342,13 @@ begin
       if gsMaxLives > 0 then
         Text := IntToStr(gsMaxLives);
     end;
-    with AddEdit(_lc[I_MENU_ITEM_RESPAWN_TIME]) do
+    with AddLabel(_lc[I_MENU_SELECT_ITEM_RESPAWN]) do
     begin
-      Name := 'edItemRespawnTime';
-      OnlyDigits := True;
-      Width := 4;
-      MaxLength := 5;
-      if gsItemRespawnTime > 0 then
-        Text := IntToStr(gsItemRespawnTime);
+      Name := 'lbItemsRespawn';
+      FixedLength := 16;
+      OnClick := @ProcItemsRespawnMenu;
     end;
+    AddSpace();
     with AddSwitch(_lc[I_MENU_PLAYERS]) do
     begin
       Name := 'swPlayers';
@@ -2353,10 +2362,9 @@ begin
       Name := 'swTeamDamage';
       AddItem(_lc[I_MENU_YES]);
       AddItem(_lc[I_MENU_NO]);
-      if LongBool(gsGameFlags and GAME_OPTION_TEAMDAMAGE) then
-        ItemIndex := 0
-      else
-        ItemIndex := 1;
+      if TGameOption.TEAM_DAMAGE in gsGameFlags
+        then ItemIndex := 0
+        else ItemIndex := 1;
     end;
     with AddSwitch(_lc[I_MENU_TEAM_HIT]) do
     begin
@@ -2365,54 +2373,59 @@ begin
       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
+      if [TGameOption.TEAM_HIT_TRACE, TGameOption.TEAM_HIT_PROJECTILE] <= gsGameFlags then
         ItemIndex := 0
-      else if LongBool(gsGameFlags and GAME_OPTION_TEAMHITTRACE) then
+      else if TGameOption.TEAM_HIT_TRACE in gsGameFlags then
         ItemIndex := 1
-      else if LongBool(gsGameFlags and GAME_OPTION_TEAMHITPROJECTILE) then
+      else if TGameOption.TEAM_HIT_PROJECTILE in gsGameFlags then
         ItemIndex := 2
       else
         ItemIndex := 3;
     end;
+    with AddSwitch(_lc[I_MENU_ENABLE_TEAM_DAMAGE_ABSOBR]) do
+    begin
+      Name := 'swTeamAbsorbDamage';
+      AddItem(_lc[I_MENU_YES]);
+      AddItem(_lc[I_MENU_NO]);
+      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 LongBool(gsGameFlags and GAME_OPTION_DMKEYS) then
-        ItemIndex := 0
-      else
-        ItemIndex := 1;
+      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 LongBool(gsGameFlags and GAME_OPTION_ALLOWEXIT) 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 LongBool(gsGameFlags and GAME_OPTION_WEAPONSTAY) 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 LongBool(gsGameFlags and GAME_OPTION_MONSTERS) 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
@@ -2421,9 +2434,9 @@ begin
       AddItem(_lc[I_MENU_BOTS_VS_MONSTERS]);
       AddItem(_lc[I_MENU_BOTS_VS_ALL]);
       ItemIndex := 2;
-      if not LongBool(gsGameFlags and GAME_OPTION_BOTVSMONSTER) then
+      if not (TGameOption.BOTS_VS_MONSTERS in gsGameFlags) then
         ItemIndex := 0;
-      if not LongBool(gsGameFlags and GAME_OPTION_BOTVSPLAYER) then
+      if not (TGameOption.BOTS_VS_PLAYERS in gsGameFlags) then
         ItemIndex := 1;
     end;
     with AddSwitch(_lc[I_MENU_FLAG_DROP]) do
@@ -2432,9 +2445,9 @@ begin
       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
+      if [TGameOption.ALLOW_DROP_FLAG, TGameOption.THROW_FLAG] <= gsGameFlags then
         ItemIndex := 0
-      else if LongBool(gsGameFlags and GAME_OPTION_ALLOWDROPFLAG) then
+      else if TGameOption.ALLOW_DROP_FLAG in gsGameFlags then
         ItemIndex := 1
       else
         ItemIndex := 2;
@@ -2458,7 +2471,7 @@ begin
     with AddEdit(_lc[I_NET_ADDRESS]) do
     begin
       Name := 'edIP';
-      OnlyDigits :=False;
+      OnlyDigits := False;
       Width := 12;
       MaxLength := 64;
       Text := 'localhost';
@@ -2561,14 +2574,14 @@ begin
       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 gsGoalLimit > 0 then
-        Text := IntToStr(gsGoalLimit);
+      if gsScoreLimit > 0 then
+        Text := IntToStr(gsScoreLimit);
     end;
     with AddEdit(_lc[I_MENU_MAX_LIVES]) do
     begin
@@ -2579,15 +2592,13 @@ begin
       if gsMaxLives > 0 then
         Text := IntToStr(gsMaxLives);
     end;
-    with AddEdit(_lc[I_MENU_ITEM_RESPAWN_TIME]) do
+    with AddLabel(_lc[I_MENU_SELECT_ITEM_RESPAWN]) do
     begin
-      Name := 'edItemRespawnTime';
-      OnlyDigits := True;
-      Width := 4;
-      MaxLength := 5;
-      if gsItemRespawnTime > 0 then
-        Text := IntToStr(gsItemRespawnTime);
+      Name := 'lbItemsRespawn';
+      FixedLength := 16;
+      OnClick := @ProcItemsRespawnMenu;
     end;
+    AddSpace();
     with AddSwitch(_lc[I_MENU_PLAYERS]) do
     begin
       Name := 'swPlayers';
@@ -2601,10 +2612,9 @@ begin
       Name := 'swTeamDamage';
       AddItem(_lc[I_MENU_YES]);
       AddItem(_lc[I_MENU_NO]);
-      if LongBool(gsGameFlags and GAME_OPTION_TEAMDAMAGE) then
-        ItemIndex := 0
-      else
-        ItemIndex := 1;
+      if TGameOption.TEAM_DAMAGE in gsGameFlags
+        then ItemIndex := 0
+        else ItemIndex := 1;
     end;
     with AddSwitch(_lc[I_MENU_TEAM_HIT]) do
     begin
@@ -2613,54 +2623,59 @@ begin
       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
+      if [TGameOption.TEAM_HIT_TRACE, TGameOption.TEAM_HIT_PROJECTILE] <= gsGameFlags then
         ItemIndex := 0
-      else if LongBool(gsGameFlags and GAME_OPTION_TEAMHITTRACE) then
+      else if TGameOption.TEAM_HIT_TRACE in gsGameFlags then
         ItemIndex := 1
-      else if LongBool(gsGameFlags and GAME_OPTION_TEAMHITPROJECTILE) then
+      else if TGameOption.TEAM_HIT_PROJECTILE in gsGameFlags then
         ItemIndex := 2
       else
         ItemIndex := 3;
     end;
+    with AddSwitch(_lc[I_MENU_ENABLE_TEAM_DAMAGE_ABSOBR]) do
+    begin
+      Name := 'swTeamAbsorbDamage';
+      AddItem(_lc[I_MENU_YES]);
+      AddItem(_lc[I_MENU_NO]);
+      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 LongBool(gsGameFlags and GAME_OPTION_DMKEYS) then
-        ItemIndex := 0
-      else
-        ItemIndex := 1;
+      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 LongBool(gsGameFlags and GAME_OPTION_ALLOWEXIT) 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 LongBool(gsGameFlags and GAME_OPTION_WEAPONSTAY) 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 LongBool(gsGameFlags and GAME_OPTION_MONSTERS) 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
@@ -2669,9 +2684,9 @@ begin
       AddItem(_lc[I_MENU_BOTS_VS_MONSTERS]);
       AddItem(_lc[I_MENU_BOTS_VS_ALL]);
       ItemIndex := 2;
-      if not LongBool(gsGameFlags and GAME_OPTION_BOTVSMONSTER) then
+      if not (TGameOption.BOTS_VS_MONSTERS in gsGameFlags) then
         ItemIndex := 0;
-      if not LongBool(gsGameFlags and GAME_OPTION_BOTVSPLAYER) then
+      if not (TGameOption.BOTS_VS_PLAYERS in gsGameFlags) then
         ItemIndex := 1;
     end;
     with AddSwitch(_lc[I_MENU_FLAG_DROP]) do
@@ -2680,9 +2695,9 @@ begin
       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
+      if [TGameOption.ALLOW_DROP_FLAG, TGameOption.THROW_FLAG] <= gsGameFlags then
         ItemIndex := 0
-      else if LongBool(gsGameFlags and GAME_OPTION_ALLOWDROPFLAG) then
+      else if TGameOption.ALLOW_DROP_FLAG in gsGameFlags then
         ItemIndex := 1
       else
         ItemIndex := 2;
@@ -2797,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;
@@ -2826,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
@@ -3294,11 +3395,11 @@ begin
       AddItem(_lc[I_MENU_YES]);
       AddItem(_lc[I_MENU_NO]);
     end;
-    with AddSwitch(_lc[I_MENU_KASTET_ALLOW]) do
+    with AddSwitch(_lc[I_MENU_IRONFIST_ALLOW]) do
     begin
-      Name := 'swWeaponAllowFist';
-      AddItem(_lc[I_MENU_KASTET_ALLOW_ALWAYS]);
-      AddItem(_lc[I_MENU_KASTET_ALLOW_BERSERK]);
+      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();
@@ -3353,11 +3454,11 @@ begin
       AddItem(_lc[I_MENU_YES]);
       AddItem(_lc[I_MENU_NO]);
     end;
-    with AddSwitch(_lc[I_MENU_KASTET_ALLOW]) do
+    with AddSwitch(_lc[I_MENU_IRONFIST_ALLOW]) do
     begin
-      Name := 'swWeaponAllowFist';
-      AddItem(_lc[I_MENU_KASTET_ALLOW_ALWAYS]);
-      AddItem(_lc[I_MENU_KASTET_ALLOW_BERSERK]);
+      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();
@@ -3660,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;