DEADSOFTWARE

Game: Use proper syntax of sets for game options instead of raw bitwise operations master
authorDmitry D. Chernov <blackdoomer@yandex.ru>
Sun, 12 Nov 2023 22:10:01 +0000 (08:10 +1000)
committerDmitry D. Chernov <blackdoomer@yandex.ru>
Sun, 12 Nov 2023 22:10:01 +0000 (08:10 +1000)
12 files changed:
src/game/g_console.pas
src/game/g_game.pas
src/game/g_items.pas
src/game/g_language.pas
src/game/g_map.pas
src/game/g_menu.pas
src/game/g_netmsg.pas
src/game/g_options.pas
src/game/g_player.pas
src/game/g_saveload.pas
src/game/g_triggers.pas
src/game/g_weapons.pas

index 20b2b539d4757270aac580bf7bf4e51709ed7530..f7998c78544fed57150e8bebd5d64513c5900d32 100644 (file)
@@ -2189,9 +2189,9 @@ end;
 procedure g_Console_WriteConfig (filename: String);
   var f: TextFile; i, j: Integer;
 
 procedure g_Console_WriteConfig (filename: String);
   var f: TextFile; i, j: Integer;
 
-  procedure WriteFlag(name: string; flag: LongWord);
+  procedure WriteFlag(name: string; flag: TGameOption);
   begin
   begin
-    WriteLn(f, name, IfThen(LongBool(gsGameFlags and flag), 1, 0));
+    WriteLn(f, name, Ord(flag in gsGameFlags));
   end;
 
   function FormatTeam(team: Byte): string;
   end;
 
   function FormatTeam(team: Byte): string;
@@ -2256,22 +2256,22 @@ begin
   WriteLn(f, 'g_spawn_invul ', gsSpawnInvul);
   WriteLn(f, 'g_warmup_time ', gsWarmupTime);
 
   WriteLn(f, 'g_spawn_invul ', gsSpawnInvul);
   WriteLn(f, 'g_warmup_time ', gsWarmupTime);
 
-  WriteFlag('g_friendlyfire ', GAME_OPTION_TEAMDAMAGE);
-  WriteFlag('g_friendly_hit_trace ', GAME_OPTION_TEAMHITTRACE);
-  WriteFlag('g_friendly_hit_projectile ', GAME_OPTION_TEAMHITPROJECTILE);
-  WriteFlag('g_powerup_randomize_respawn ', GAME_OPTION_POWERUPRANDOM);
-  WriteFlag('g_items_all_respawn_random ', GAME_OPTION_ITEMALLRANDOM);
-  WriteFlag('g_items_help_respawn_random ', GAME_OPTION_ITEMHELPRANDOM);
-  WriteFlag('g_items_ammo_respawn_random ', GAME_OPTION_ITEMAMMORANDOM);
-  WriteFlag('g_items_weapon_respawn_random ', GAME_OPTION_ITEMWEAPONRANDOM);
-  WriteFlag('g_allow_exit ', GAME_OPTION_ALLOWEXIT);
-  WriteFlag('g_allow_monsters ', GAME_OPTION_MONSTERS);
-  WriteFlag('g_allow_dropflag ', GAME_OPTION_ALLOWDROPFLAG);
-  WriteFlag('g_throw_flag ', GAME_OPTION_THROWFLAG);
-  WriteFlag('g_dm_keys ', GAME_OPTION_DMKEYS);
-  WriteFlag('g_weaponstay ', GAME_OPTION_WEAPONSTAY);
-  WriteFlag('g_bot_vsmonsters ', GAME_OPTION_BOTVSMONSTER);
-  WriteFlag('g_bot_vsplayers ', GAME_OPTION_BOTVSPLAYER);
+  WriteFlag('g_friendlyfire ', TGameOption.TEAM_DAMAGE);
+  WriteFlag('g_friendly_hit_trace ', TGameOption.TEAM_HIT_TRACE);
+  WriteFlag('g_friendly_hit_projectile ', TGameOption.TEAM_HIT_PROJECTILE);
+  WriteFlag('g_powerup_randomize_respawn ', TGameOption.POWERUP_RANDOM);
+  WriteFlag('g_items_all_respawn_random ', TGameOption.ITEM_ALL_RANDOM);
+  WriteFlag('g_items_help_respawn_random ', TGameOption.ITEM_LIFE_RANDOM);
+  WriteFlag('g_items_ammo_respawn_random ', TGameOption.ITEM_AMMO_RANDOM);
+  WriteFlag('g_items_weapon_respawn_random ', TGameOption.ITEM_WEAPON_RANDOM);
+  WriteFlag('g_allow_exit ', TGameOption.ALLOW_EXIT);
+  WriteFlag('g_allow_monsters ', TGameOption.MONSTERS);
+  WriteFlag('g_allow_dropflag ', TGameOption.ALLOW_DROP_FLAG);
+  WriteFlag('g_throw_flag ', TGameOption.THROW_FLAG);
+  WriteFlag('g_dm_keys ', TGameOption.DM_KEYS);
+  WriteFlag('g_weaponstay ', TGameOption.WEAPONS_STAY);
+  WriteFlag('g_bot_vsmonsters ', TGameOption.BOTS_VS_MONSTERS);
+  WriteFlag('g_bot_vsplayers ', TGameOption.BOTS_VS_PLAYERS);
 
   // players
   with gPlayer1Settings do
 
   // players
   with gPlayer1Settings do
index 110fbe47c7e7435e82d8b5bede3ca16572e5f73f..824595b850be4297c8199295f4f1d7b8c9f73cc0 100644 (file)
@@ -25,6 +25,28 @@ uses
   g_touch, g_weapons;
 
 type
   g_touch, g_weapons;
 
 type
+  TGameOption = (
+    //RESERVED = 0,  // FIXME: reuse for something
+    TEAM_DAMAGE = 1,
+    ALLOW_EXIT,
+    WEAPONS_STAY,
+    MONSTERS,
+    BOTS_VS_PLAYERS,
+    BOTS_VS_MONSTERS,
+    DM_KEYS,
+    TEAM_HIT_TRACE,
+    TEAM_HIT_PROJECTILE,
+    TEAM_ABSORB_DAMAGE,
+    ALLOW_DROP_FLAG,
+    THROW_FLAG,
+    POWERUP_RANDOM,
+    ITEM_ALL_RANDOM,
+    ITEM_LIFE_RANDOM,
+    ITEM_AMMO_RANDOM,
+    ITEM_WEAPON_RANDOM
+  );
+  TGameOptions = set of TGameOption;
+
   TGameSettings = record
     GameType: Byte;
     GameMode: Byte;
   TGameSettings = record
     GameType: Byte;
     GameMode: Byte;
@@ -37,7 +59,7 @@ type
     PowerupRespawnTime: Word;
     PowerupRespawnRandom: Word;
     MaxLives: Byte;
     PowerupRespawnTime: Word;
     PowerupRespawnRandom: Word;
     MaxLives: Byte;
-    Options: LongWord;
+    Options: TGameOptions;
     WAD: String;
   end;
 
     WAD: String;
   end;
 
@@ -106,8 +128,8 @@ procedure g_Game_RemovePlayer();
 procedure g_Game_Spectate();
 procedure g_Game_SpectateCenterView();
 procedure g_Game_StartSingle(Map: String; TwoPlayers: Boolean; nPlayers: Byte);
 procedure g_Game_Spectate();
 procedure g_Game_SpectateCenterView();
 procedure g_Game_StartSingle(Map: String; TwoPlayers: Boolean; nPlayers: Byte);
-procedure g_Game_StartCustom(Map: String; GameMode: Byte; TimeLimit, ScoreLimit: Word; MaxLives: Byte; Options: LongWord; nPlayers: Byte);
-procedure g_Game_StartServer(Map: String; GameMode: Byte; TimeLimit, ScoreLimit: Word; MaxLives: Byte; Options: LongWord; nPlayers: Byte; IPAddr: LongWord; Port: Word);
+procedure g_Game_StartCustom(Map: String; GameMode: Byte; TimeLimit, ScoreLimit: Word; MaxLives: Byte; Options: TGameOptions; nPlayers: Byte);
+procedure g_Game_StartServer(Map: String; GameMode: Byte; TimeLimit, ScoreLimit: Word; MaxLives: Byte; Options: TGameOptions; nPlayers: Byte; IPAddr: LongWord; Port: Word);
 procedure g_Game_StartClient(Addr: String; Port: Word; PW: String);
 procedure g_Game_Restart();
 procedure g_Game_RestartLevel();
 procedure g_Game_StartClient(Addr: String; Port: Word; PW: String);
 procedure g_Game_Restart();
 procedure g_Game_RestartLevel();
@@ -185,25 +207,6 @@ const
   EXIT_ENDLEVELSINGLE  = 4;
   EXIT_ENDLEVELCUSTOM  = 5;
 
   EXIT_ENDLEVELSINGLE  = 4;
   EXIT_ENDLEVELCUSTOM  = 5;
 
-  GAME_OPTION_RESERVED          = 1 shl 0;
-  GAME_OPTION_TEAMDAMAGE        = 1 shl 1;
-  GAME_OPTION_ALLOWEXIT         = 1 shl 2;
-  GAME_OPTION_WEAPONSTAY        = 1 shl 3;
-  GAME_OPTION_MONSTERS          = 1 shl 4;
-  GAME_OPTION_BOTVSPLAYER       = 1 shl 5;
-  GAME_OPTION_BOTVSMONSTER      = 1 shl 6;
-  GAME_OPTION_DMKEYS            = 1 shl 7;
-  GAME_OPTION_TEAMHITTRACE      = 1 shl 8;
-  GAME_OPTION_TEAMHITPROJECTILE = 1 shl 9;
-  GAME_OPTION_TEAMABSORBDAMAGE  = 1 shl 10;
-  GAME_OPTION_ALLOWDROPFLAG     = 1 shl 11;
-  GAME_OPTION_THROWFLAG         = 1 shl 12;
-  GAME_OPTION_POWERUPRANDOM     = 1 shl 13;
-  GAME_OPTION_ITEMALLRANDOM     = 1 shl 14;
-  GAME_OPTION_ITEMHELPRANDOM    = 1 shl 15;
-  GAME_OPTION_ITEMAMMORANDOM    = 1 shl 16;
-  GAME_OPTION_ITEMWEAPONRANDOM  = 1 shl 17;
-
   STATE_NONE        = 0;
   STATE_MENU        = 1;
   STATE_FOLD        = 2;
   STATE_NONE        = 0;
   STATE_MENU        = 1;
   STATE_FOLD        = 2;
@@ -678,7 +681,8 @@ end;
 procedure SaveGameStat(Stat: TEndCustomGameStat; Path: string);
 var
   s: TextFile;
 procedure SaveGameStat(Stat: TEndCustomGameStat; Path: string);
 var
   s: TextFile;
-  dir, fname, map, mode, etime: String;
+  dir, fname, map, mode, etime, flags, strf: String;
+  flag: TGameOption;
   I: Integer;
 begin
   try
   I: Integer;
 begin
   try
@@ -700,8 +704,17 @@ begin
         (Stat.GameTime div 1000 div 60) mod 60,
         Stat.GameTime div 1000 mod 60
       ]);
         (Stat.GameTime div 1000 div 60) mod 60,
         Stat.GameTime div 1000 mod 60
       ]);
+      flags := '';
+      strf := '';
+      for flag in gGameSettings.Options do
+      begin
+        flags += strf;
+        System.WriteStr(strf, flag);  // FIXME: rename our utils.WriteStr()
+        flags += strf;
+        strf := ', ';
+      end;
       WriteLn(s, 'stats_ver,datetime,server,map,mode,timelimit,scorelimit,dmflags,time,num_players');
       WriteLn(s, 'stats_ver,datetime,server,map,mode,timelimit,scorelimit,dmflags,time,num_players');
-      WriteLn(s, Format('%d,%s,%s,%s,%s,%u,%u,%u,%s,%d', [
+      WriteLn(s, Format('%d,%s,%s,%s,%s,%u,%u,"%s",%s,%d', [
         STATFILE_VERSION,
         StatDate,
         dquoteStr(fname),
         STATFILE_VERSION,
         StatDate,
         dquoteStr(fname),
@@ -709,7 +722,7 @@ begin
         mode,
         gGameSettings.TimeLimit,
         gGameSettings.ScoreLimit,
         mode,
         gGameSettings.TimeLimit,
         gGameSettings.ScoreLimit,
-        gGameSettings.Options,
+        flags,
         etime,
         Length(Stat.PlayerStat)
       ]));
         etime,
         Length(Stat.PlayerStat)
       ]));
@@ -4509,16 +4522,10 @@ begin
   gShowMap := False;
   gGameSettings.GameType := GT_SINGLE;
   gGameSettings.MaxLives := 0;
   gShowMap := False;
   gGameSettings.GameType := GT_SINGLE;
   gGameSettings.MaxLives := 0;
-  gGameSettings.Options := GAME_OPTION_ALLOWEXIT
-                        or GAME_OPTION_MONSTERS
-                        or GAME_OPTION_BOTVSMONSTER
-                        or GAME_OPTION_TEAMHITPROJECTILE
-                        or GAME_OPTION_TEAMHITTRACE
-                        or GAME_OPTION_POWERUPRANDOM
-                        or GAME_OPTION_ITEMALLRANDOM
-                        or GAME_OPTION_ITEMHELPRANDOM
-                        or GAME_OPTION_ITEMAMMORANDOM
-                        or GAME_OPTION_ITEMWEAPONRANDOM;
+  gGameSettings.Options := [TGameOption.ALLOW_EXIT, TGameOption.MONSTERS,
+    TGameOption.BOTS_VS_MONSTERS, TGameOption.TEAM_HIT_PROJECTILE, TGameOption.TEAM_HIT_TRACE,
+    TGameOption.POWERUP_RANDOM, TGameOption.ITEM_ALL_RANDOM, TGameOption.ITEM_LIFE_RANDOM,
+    TGameOption.ITEM_AMMO_RANDOM, TGameOption.ITEM_WEAPON_RANDOM];
   gSwitchGameMode := GM_SINGLE;
 
   gLMSRespawn := LMS_RESPAWN_NONE;
   gSwitchGameMode := GM_SINGLE;
 
   gLMSRespawn := LMS_RESPAWN_NONE;
@@ -4587,7 +4594,7 @@ end;
 procedure g_Game_StartCustom(Map: String; GameMode: Byte;
                              TimeLimit, ScoreLimit: Word;
                              MaxLives: Byte;
 procedure g_Game_StartCustom(Map: String; GameMode: Byte;
                              TimeLimit, ScoreLimit: Word;
                              MaxLives: Byte;
-                             Options: LongWord; nPlayers: Byte);
+                             Options: TGameOptions; nPlayers: Byte);
 var
   i, nPl: Integer;
 begin
 var
   i, nPl: Integer;
 begin
@@ -4699,7 +4706,7 @@ end;
 
 procedure g_Game_StartServer(Map: String; GameMode: Byte;
                              TimeLimit, ScoreLimit: Word; MaxLives: Byte;
 
 procedure g_Game_StartServer(Map: String; GameMode: Byte;
                              TimeLimit, ScoreLimit: Word; MaxLives: Byte;
-                             Options: LongWord; nPlayers: Byte;
+                             Options: TGameOptions; nPlayers: Byte;
                              IPAddr: LongWord; Port: Word);
 begin
   g_Game_Free();
                              IPAddr: LongWord; Port: Word);
 begin
   g_Game_Free();
@@ -4920,7 +4927,7 @@ begin
           gGameSettings.ScoreLimit := InMsg.ReadWord();
           gGameSettings.TimeLimit := InMsg.ReadWord();
           gGameSettings.MaxLives := InMsg.ReadByte();
           gGameSettings.ScoreLimit := InMsg.ReadWord();
           gGameSettings.TimeLimit := InMsg.ReadWord();
           gGameSettings.MaxLives := InMsg.ReadByte();
-          gGameSettings.Options := InMsg.ReadLongWord();
+          gGameSettings.Options := TGameOptions(InMsg.ReadLongWord());
           T := InMsg.ReadLongWord();
 
           //newResPath := g_Res_SearchSameWAD(MapsDir, WadName, gWADHash);
           T := InMsg.ReadLongWord();
 
           //newResPath := g_Res_SearchSameWAD(MapsDir, WadName, gWADHash);
@@ -5557,33 +5564,32 @@ var
   cmd: string;
   it: PItem;
 
   cmd: string;
   it: PItem;
 
-  procedure ParseGameFlag(Flag: LongWord; OffMsg, OnMsg: TStrings_Locale; OnMapChange: Boolean = False);
+  procedure ParseGameFlag(Flag: TGameOption; OffMsg, OnMsg: TStrings_Locale; OnMapChange: Boolean = False);
   var
     x: Boolean;
   begin
   var
     x: Boolean;
   begin
-    if Length(P) > 1 then
+    if Length(P) <= 1 then
+      x := Flag in gsGameFlags
+    else
     begin
       x := P[1] = '1';
 
     begin
       x := P[1] = '1';
 
-      if x then
-        gsGameFlags := gsGameFlags or Flag
-      else
-        gsGameFlags := gsGameFlags and (not Flag);
+      if x
+        then gsGameFlags += [Flag]
+        else gsGameFlags -= [Flag];
 
       if g_Game_IsServer then
       begin
 
       if g_Game_IsServer then
       begin
-        if x then
-          gGameSettings.Options := gGameSettings.Options or Flag
-        else
-          gGameSettings.Options := gGameSettings.Options and (not Flag);
+        if x
+          then gGameSettings.Options += [Flag]
+          else gGameSettings.Options -= [Flag];
         if g_Game_IsNet then MH_SEND_GameSettings;
       end;
     end;
 
         if g_Game_IsNet then MH_SEND_GameSettings;
       end;
     end;
 
-    if LongBool(gsGameFlags and Flag) then
-      g_Console_Add(_lc[OnMsg])
-    else
-      g_Console_Add(_lc[OffMsg]);
+    if x
+      then g_Console_Add(_lc[OnMsg])
+      else g_Console_Add(_lc[OffMsg]);
 
     if OnMapChange and g_Game_IsServer then
       g_Console_Add(_lc[I_MSG_ONMAPCHANGE]);
 
     if OnMapChange and g_Game_IsServer then
       g_Console_Add(_lc[I_MSG_ONMAPCHANGE]);
@@ -5621,44 +5627,44 @@ begin
     end;
 
     'g_friendlyfire':
     end;
 
     'g_friendlyfire':
-      ParseGameFlag(GAME_OPTION_TEAMDAMAGE, I_MSG_FRIENDLY_FIRE_OFF, I_MSG_FRIENDLY_FIRE_ON);
+      ParseGameFlag(TGameOption.TEAM_DAMAGE, I_MSG_FRIENDLY_FIRE_OFF, I_MSG_FRIENDLY_FIRE_ON);
     'g_friendly_absorb_damage':
     'g_friendly_absorb_damage':
-      ParseGameFlag(GAME_OPTION_TEAMABSORBDAMAGE, I_MSG_FRIENDLY_ABSORB_DAMAGE_OFF, I_MSG_FRIENDLY_ABSORB_DAMAGE_ON);
+      ParseGameFlag(TGameOption.TEAM_ABSORB_DAMAGE, I_MSG_FRIENDLY_ABSORB_DAMAGE_OFF, I_MSG_FRIENDLY_ABSORB_DAMAGE_ON);
     'g_friendly_hit_trace':
     'g_friendly_hit_trace':
-      ParseGameFlag(GAME_OPTION_TEAMHITTRACE, I_MSG_FRIENDLY_HIT_TRACE_OFF, I_MSG_FRIENDLY_HIT_TRACE_ON);
+      ParseGameFlag(TGameOption.TEAM_HIT_TRACE, I_MSG_FRIENDLY_HIT_TRACE_OFF, I_MSG_FRIENDLY_HIT_TRACE_ON);
     'g_friendly_hit_projectile':
     'g_friendly_hit_projectile':
-      ParseGameFlag(GAME_OPTION_TEAMHITPROJECTILE, I_MSG_FRIENDLY_PROJECT_TRACE_OFF, I_MSG_FRIENDLY_PROJECT_TRACE_ON);
+      ParseGameFlag(TGameOption.TEAM_HIT_PROJECTILE, I_MSG_FRIENDLY_PROJECT_TRACE_OFF, I_MSG_FRIENDLY_PROJECT_TRACE_ON);
     'g_items_all_respawn_random':
     'g_items_all_respawn_random':
-      ParseGameFlag(GAME_OPTION_ITEMALLRANDOM, I_MSG_ITEM_ALL_RANDOM_OFF, I_MSG_ITEM_ALL_RANDOM_ON, False);
+      ParseGameFlag(TGameOption.ITEM_ALL_RANDOM, I_MSG_ITEM_ALL_RANDOM_OFF, I_MSG_ITEM_ALL_RANDOM_ON, False);
     'g_items_help_respawn_random':
     'g_items_help_respawn_random':
-      ParseGameFlag(GAME_OPTION_ITEMHELPRANDOM, I_MSG_ITEM_HELP_RANDOM_OFF, I_MSG_ITEM_HELP_RANDOM_ON, False);
+      ParseGameFlag(TGameOption.ITEM_LIFE_RANDOM, I_MSG_ITEM_LIFE_RANDOM_OFF, I_MSG_ITEM_LIFE_RANDOM_ON, False);
     'g_items_ammo_respawn_random':
     'g_items_ammo_respawn_random':
-      ParseGameFlag(GAME_OPTION_ITEMAMMORANDOM, I_MSG_ITEM_AMMO_RANDOM_OFF, I_MSG_ITEM_AMMO_RANDOM_ON, False);
+      ParseGameFlag(TGameOption.ITEM_AMMO_RANDOM, I_MSG_ITEM_AMMO_RANDOM_OFF, I_MSG_ITEM_AMMO_RANDOM_ON, False);
     'g_items_weapon_respawn_random':
     'g_items_weapon_respawn_random':
-      ParseGameFlag(GAME_OPTION_ITEMWEAPONRANDOM, I_MSG_ITEM_WEAPON_RANDOM_OFF, I_MSG_ITEM_WEAPON_RANDOM_ON);
+      ParseGameFlag(TGameOption.ITEM_WEAPON_RANDOM, I_MSG_ITEM_WEAPON_RANDOM_OFF, I_MSG_ITEM_WEAPON_RANDOM_ON);
     'g_powerup_randomize_respawn':
     'g_powerup_randomize_respawn':
-      ParseGameFlag(GAME_OPTION_POWERUPRANDOM, I_MSG_POWERUP_RANDOM_OFF, I_MSG_POWERUP_RANDOM_ON, False);
+      ParseGameFlag(TGameOption.POWERUP_RANDOM, I_MSG_POWERUP_RANDOM_OFF, I_MSG_POWERUP_RANDOM_ON, False);
     'g_weaponstay':
     'g_weaponstay':
-      ParseGameFlag(GAME_OPTION_WEAPONSTAY, I_MSG_WEAPONSTAY_OFF, I_MSG_WEAPONSTAY_ON);
+      ParseGameFlag(TGameOption.WEAPONS_STAY, I_MSG_WEAPONSTAY_OFF, I_MSG_WEAPONSTAY_ON);
     'g_allow_exit':
     'g_allow_exit':
-      ParseGameFlag(GAME_OPTION_ALLOWEXIT, I_MSG_ALLOWEXIT_OFF, I_MSG_ALLOWEXIT_ON, True);
+      ParseGameFlag(TGameOption.ALLOW_EXIT, I_MSG_ALLOWEXIT_OFF, I_MSG_ALLOWEXIT_ON, True);
     'g_allow_monsters':
     'g_allow_monsters':
-      ParseGameFlag(GAME_OPTION_MONSTERS, I_MSG_ALLOWMON_OFF, I_MSG_ALLOWMON_ON, True);
+      ParseGameFlag(TGameOption.MONSTERS, I_MSG_ALLOWMON_OFF, I_MSG_ALLOWMON_ON, True);
     'g_allow_dropflag':
     'g_allow_dropflag':
-      ParseGameFlag(GAME_OPTION_ALLOWDROPFLAG, I_MSG_ALLOWDROPFLAG_OFF, I_MSG_ALLOWDROPFLAG_ON);
+      ParseGameFlag(TGameOption.ALLOW_DROP_FLAG, I_MSG_ALLOWDROPFLAG_OFF, I_MSG_ALLOWDROPFLAG_ON);
     'g_throw_flag':
     'g_throw_flag':
-      ParseGameFlag(GAME_OPTION_THROWFLAG, I_MSG_THROWFLAG_OFF, I_MSG_THROWFLAG_ON);
+      ParseGameFlag(TGameOption.THROW_FLAG, I_MSG_THROWFLAG_OFF, I_MSG_THROWFLAG_ON);
     'g_bot_vsplayers':
     'g_bot_vsplayers':
-      ParseGameFlag(GAME_OPTION_BOTVSPLAYER, I_MSG_BOTSVSPLAYERS_OFF, I_MSG_BOTSVSPLAYERS_ON);
+      ParseGameFlag(TGameOption.BOTS_VS_PLAYERS, I_MSG_BOTSVSPLAYERS_OFF, I_MSG_BOTSVSPLAYERS_ON);
     'g_bot_vsmonsters':
     'g_bot_vsmonsters':
-      ParseGameFlag(GAME_OPTION_BOTVSMONSTER, I_MSG_BOTSVSMONSTERS_OFF, I_MSG_BOTSVSMONSTERS_ON);
+      ParseGameFlag(TGameOption.BOTS_VS_MONSTERS, I_MSG_BOTSVSMONSTERS_OFF, I_MSG_BOTSVSMONSTERS_ON);
     'g_dm_keys':
     'g_dm_keys':
-      ParseGameFlag(GAME_OPTION_DMKEYS, I_MSG_DMKEYS_OFF, I_MSG_DMKEYS_ON, True);
+      ParseGameFlag(TGameOption.DM_KEYS, I_MSG_DMKEYS_OFF, I_MSG_DMKEYS_ON, True);
 
     'g_gameflags': begin
       if Length(P) > 1 then
       begin
 
     'g_gameflags': begin
       if Length(P) > 1 then
       begin
-        gsGameFlags := StrToDWordDef(P[1], gsGameFlags);
+        gsGameFlags := TGameOptions(StrToDWordDef(P[1], LongWord(gsGameFlags)));
         if g_Game_IsServer then
         begin
           gGameSettings.Options := gsGameFlags;
         if g_Game_IsServer then
         begin
           gGameSettings.Options := gsGameFlags;
@@ -5666,7 +5672,7 @@ begin
         end;
       end;
 
         end;
       end;
 
-      g_Console_Add(Format('%s %u', [cmd, gsGameFlags]));
+      g_Console_Add(Format('%s %u', [cmd, LongWord(gsGameFlags)]));
     end;
 
     'g_warmup_time': begin
     end;
 
     'g_warmup_time': begin
@@ -8513,7 +8519,7 @@ var
   map: String;
   GMode, n: Byte;
   LimT, LimS: Integer;
   map: String;
   GMode, n: Byte;
   LimT, LimS: Integer;
-  Opt: LongWord;
+  Opt: TGameOptions;
   Lives: Integer;
   s: String;
   Port: Integer;
   Lives: Integer;
   s: String;
   Port: Integer;
@@ -8592,10 +8598,9 @@ begin
 
   // Options:
     s := Find_Param_Value(pars, '-opt');
 
   // Options:
     s := Find_Param_Value(pars, '-opt');
-    if (s = '') then
-      Opt := gsGameFlags
-    else
-      Opt := StrToIntDef(s, 0);
+    if (s = '')
+      then Opt := gsGameFlags
+      else Opt := TGameOptions(StrToIntDef(s, 0));
 
   // Close after map:
     s := Find_Param_Value(pars, '--close');
 
   // Close after map:
     s := Find_Param_Value(pars, '--close');
@@ -8637,10 +8642,9 @@ begin
 
   // Start:
     s := Find_Param_Value(pars, '-port');
 
   // Start:
     s := Find_Param_Value(pars, '-port');
-    if (s = '') or not TryStrToInt(s, Port) then
-      g_Game_StartCustom(map, GMode, LimT, LimS, Lives, Opt, n)
-    else
-      g_Game_StartServer(map, GMode, LimT, LimS, Lives, Opt, n, 0, Port);
+    if (s = '') or not TryStrToInt(s, Port)
+      then g_Game_StartCustom(map, GMode, LimT, LimS, Lives, Opt, n)
+      else g_Game_StartServer(map, GMode, LimT, LimS, Lives, Opt, n, 0, Port);
   end;
 
 // Execute script when game loads:
   end;
 
 // Execute script when game loads:
index 9784d39d5384ba29959e89b7daad1397b5feba6f..b3d8522465bc8b6da4c182b4ef7586e2a1130020 100644 (file)
@@ -733,88 +733,81 @@ end;
 
 procedure g_Items_Pick (ID: DWORD);
 begin
 
 procedure g_Items_Pick (ID: DWORD);
 begin
-  if (ID < Length(ggItems)) then
-  begin
-    ggItems[ID].Obj.oldX := ggItems[ID].Obj.X;
-    ggItems[ID].Obj.oldY := ggItems[ID].Obj.Y;
-    ggItems[ID].alive := false;
+  if ID >= Length(ggItems) then exit;
 
 
-    // Items respawn timer
-    ggItems[ID].RespawnTime := IfThen(gLMSRespawn = LMS_RESPAWN_NONE, gGameSettings.ItemRespawnTime, 15) * 36;
+  ggItems[ID].Obj.oldX := ggItems[ID].Obj.X;
+  ggItems[ID].Obj.oldY := ggItems[ID].Obj.Y;
+  ggItems[ID].alive := false;
 
 
-    // Powerup respawn timer
-    if ggItems[ID].ItemType in [ITEM_SPHERE_BLUE, ITEM_SPHERE_WHITE, ITEM_INVUL,
-                         ITEM_INVIS, ITEM_MEDKIT_BLACK, ITEM_JETPACK, ITEM_SUIT] then
-    begin
-      ggItems[ID].RespawnTime := IfThen(gLMSRespawn = LMS_RESPAWN_NONE, gGameSettings.PowerupRespawnTime, 15) * 36;
-    end;
+  // Items respawn timer
+  ggItems[ID].RespawnTime := IfThen(gLMSRespawn = LMS_RESPAWN_NONE, gGameSettings.ItemRespawnTime, 15) * 36;
 
 
-    // #### Random powerup respawn ####
-    if LongBool(gGameSettings.Options and GAME_OPTION_POWERUPRANDOM) then
-    begin
-      if ggItems[ID].ItemType in [ITEM_SPHERE_BLUE, ITEM_SPHERE_WHITE, ITEM_INVUL,
-                           ITEM_INVIS, ITEM_MEDKIT_BLACK, ITEM_JETPACK, ITEM_SUIT] then
-      begin
-        ggItems[ID].RespawnTime := Max(1, (gGameSettings.PowerupRespawnTime +
-          RandomRange(-gGameSettings.PowerupRespawnRandom, gGameSettings.PowerupRespawnRandom + 1)) * 36);
-        //e_logwritefln ('Randomized powerup %s time: %s', [ggItems[ID].ItemType, ggItems[ID].RespawnTime]);
-      end;
-    end;
+  // Powerup respawn timer
+  if ggItems[ID].ItemType in [ITEM_SPHERE_BLUE, ITEM_SPHERE_WHITE, ITEM_INVUL, ITEM_INVIS,
+    ITEM_MEDKIT_BLACK, ITEM_JETPACK, ITEM_SUIT] then
+  begin
+    ggItems[ID].RespawnTime := IfThen(gLMSRespawn = LMS_RESPAWN_NONE, gGameSettings.PowerupRespawnTime, 15) * 36;
+  end;
 
 
-    // #### Random item respawn ####
-    // Randomize respawn for all items (excluding powerups)
-    if LongBool(gGameSettings.Options and GAME_OPTION_ITEMALLRANDOM) then
-    begin
-      if ggItems[ID].ItemType in [ITEM_MEDKIT_SMALL, ITEM_MEDKIT_LARGE, ITEM_ARMOR_GREEN,
-                                  ITEM_ARMOR_BLUE, ITEM_BOTTLE, ITEM_HELMET, ITEM_OXYGEN,
-                                  ITEM_AMMO_BULLETS, ITEM_AMMO_BULLETS_BOX, ITEM_AMMO_SHELLS,
-                                  ITEM_AMMO_SHELLS_BOX, ITEM_AMMO_ROCKET, ITEM_AMMO_ROCKET_BOX,
-                                  ITEM_AMMO_CELL, ITEM_AMMO_CELL_BIG, ITEM_AMMO_FUELCAN,
-                                  ITEM_AMMO_BACKPACK, ITEM_WEAPON_SAW, ITEM_WEAPON_SHOTGUN1,
-                                  ITEM_WEAPON_SHOTGUN2, ITEM_WEAPON_CHAINGUN, ITEM_WEAPON_ROCKETLAUNCHER,
-                                  ITEM_WEAPON_PLASMA, ITEM_WEAPON_BFG, ITEM_WEAPON_SUPERCHAINGUN,
-                                  ITEM_WEAPON_FLAMETHROWER] then
-      begin
-        ggItems[ID].RespawnTime := Max(1, (gGameSettings.ItemRespawnTime + RandomRange(-gGameSettings.ItemRespawnRandom, gGameSettings.ItemRespawnRandom + 1)) * 36);
-        //e_logwritefln ('Randomized item %s time: %s', [ggItems[ID].ItemType, ggItems[ID].RespawnTime]);
-      end;
-    end;
+  // #### Random powerup respawn ####
+  if (TGameOption.POWERUP_RANDOM in gGameSettings.Options) and (ggItems[ID].ItemType in [
+    ITEM_SPHERE_BLUE, ITEM_SPHERE_WHITE, ITEM_INVUL, ITEM_INVIS, ITEM_MEDKIT_BLACK, ITEM_JETPACK,
+    ITEM_SUIT
+  ]) then
+  begin
+    ggItems[ID].RespawnTime := Max(1, (gGameSettings.PowerupRespawnTime +
+      RandomRange(-gGameSettings.PowerupRespawnRandom, gGameSettings.PowerupRespawnRandom + 1)) * 36);
+    //e_logwritefln ('Randomized powerup %s time: %s', [ggItems[ID].ItemType, ggItems[ID].RespawnTime]);
+  end;
 
 
-    // Randomize respawn for heal/armor
-    if LongBool(gGameSettings.Options and GAME_OPTION_ITEMHELPRANDOM) then
-    begin
-      if ggItems[ID].ItemType in [ITEM_MEDKIT_SMALL, ITEM_MEDKIT_LARGE, ITEM_ARMOR_GREEN,
-                                  ITEM_ARMOR_BLUE, ITEM_BOTTLE, ITEM_HELMET, ITEM_OXYGEN,
-                                  ITEM_AMMO_BACKPACK] then
-      begin
-        ggItems[ID].RespawnTime := Max(1, (gGameSettings.ItemRespawnTime + RandomRange(-gGameSettings.ItemRespawnRandom, gGameSettings.ItemRespawnRandom + 1)) * 36);
-        //e_logwritefln ('Randomized help item %s time: %s', [ggItems[ID].ItemType, ggItems[ID].RespawnTime]);
-      end;
-    end;
+  // #### Random item respawn ####
+  // Randomize respawn for all items (excluding powerups)
+  if (TGameOption.ITEM_ALL_RANDOM in gGameSettings.Options) and (ggItems[ID].ItemType in [
+    ITEM_MEDKIT_SMALL, ITEM_MEDKIT_LARGE, ITEM_ARMOR_GREEN, ITEM_ARMOR_BLUE, ITEM_BOTTLE,
+    ITEM_HELMET, ITEM_OXYGEN, ITEM_AMMO_BULLETS, ITEM_AMMO_BULLETS_BOX, ITEM_AMMO_SHELLS,
+    ITEM_AMMO_SHELLS_BOX, ITEM_AMMO_ROCKET, ITEM_AMMO_ROCKET_BOX, ITEM_AMMO_CELL,
+    ITEM_AMMO_CELL_BIG, ITEM_AMMO_FUELCAN, ITEM_AMMO_BACKPACK, ITEM_WEAPON_SAW,
+    ITEM_WEAPON_SHOTGUN1, ITEM_WEAPON_SHOTGUN2, ITEM_WEAPON_CHAINGUN, ITEM_WEAPON_ROCKETLAUNCHER,
+    ITEM_WEAPON_PLASMA, ITEM_WEAPON_BFG, ITEM_WEAPON_SUPERCHAINGUN, ITEM_WEAPON_FLAMETHROWER
+  ]) then
+  begin
+    ggItems[ID].RespawnTime := Max(1, (gGameSettings.ItemRespawnTime +
+      RandomRange(-gGameSettings.ItemRespawnRandom, gGameSettings.ItemRespawnRandom + 1)) * 36);
+    //e_logwritefln ('Randomized item %s time: %s', [ggItems[ID].ItemType, ggItems[ID].RespawnTime]);
+  end;
 
 
-    // Randomize respawn for ammo
-    if LongBool(gGameSettings.Options and GAME_OPTION_ITEMAMMORANDOM) then
-    begin
-      if ggItems[ID].ItemType in [ITEM_AMMO_BULLETS, ITEM_AMMO_BULLETS_BOX, ITEM_AMMO_SHELLS,
-                                  ITEM_AMMO_SHELLS_BOX, ITEM_AMMO_ROCKET, ITEM_AMMO_ROCKET_BOX,
-                                  ITEM_AMMO_CELL, ITEM_AMMO_CELL_BIG, ITEM_AMMO_FUELCAN] then
-      begin
-        ggItems[ID].RespawnTime := Max(1, (gGameSettings.ItemRespawnTime + RandomRange(-gGameSettings.ItemRespawnRandom, gGameSettings.ItemRespawnRandom + 1)) * 36);
-        //e_logwritefln ('Randomized ammo %s time: %s', [ggItems[ID].ItemType, ggItems[ID].RespawnTime]);
-      end;
-    end;
+  // Randomize respawn for heal/armor
+  if (TGameOption.ITEM_LIFE_RANDOM in gGameSettings.Options) and (ggItems[ID].ItemType in [
+    ITEM_MEDKIT_SMALL, ITEM_MEDKIT_LARGE, ITEM_ARMOR_GREEN, ITEM_ARMOR_BLUE, ITEM_BOTTLE,
+    ITEM_HELMET, ITEM_OXYGEN, ITEM_AMMO_BACKPACK
+  ]) then
+  begin
+    ggItems[ID].RespawnTime := Max(1, (gGameSettings.ItemRespawnTime +
+      RandomRange(-gGameSettings.ItemRespawnRandom, gGameSettings.ItemRespawnRandom + 1)) * 36);
+    //e_logwritefln ('Randomized help item %s time: %s', [ggItems[ID].ItemType, ggItems[ID].RespawnTime]);
+  end;
 
 
-    // Randomize respawn for weapons
-    if LongBool(gGameSettings.Options and GAME_OPTION_ITEMWEAPONRANDOM) then
-    begin
-      if ggItems[ID].ItemType in [ITEM_WEAPON_SAW, ITEM_WEAPON_SHOTGUN1, ITEM_WEAPON_SHOTGUN2,
-                                  ITEM_WEAPON_CHAINGUN, ITEM_WEAPON_ROCKETLAUNCHER, ITEM_WEAPON_PLASMA,
-                                  ITEM_WEAPON_BFG, ITEM_WEAPON_SUPERCHAINGUN, ITEM_WEAPON_FLAMETHROWER] then
-      begin
-        ggItems[ID].RespawnTime := Max(1, (gGameSettings.ItemRespawnTime + RandomRange(-gGameSettings.ItemRespawnRandom, gGameSettings.ItemRespawnRandom + 1)) * 36);
-        //e_logwritefln ('Randomized weapon %s time: %s', [ggItems[ID].ItemType, ggItems[ID].RespawnTime]);
-      end;
-    end;
+  // Randomize respawn for ammo
+  if (TGameOption.ITEM_AMMO_RANDOM in gGameSettings.Options) and (ggItems[ID].ItemType in [
+    ITEM_AMMO_BULLETS, ITEM_AMMO_BULLETS_BOX, ITEM_AMMO_SHELLS, ITEM_AMMO_SHELLS_BOX,
+    ITEM_AMMO_ROCKET, ITEM_AMMO_ROCKET_BOX, ITEM_AMMO_CELL, ITEM_AMMO_CELL_BIG, ITEM_AMMO_FUELCAN
+  ]) then
+  begin
+    ggItems[ID].RespawnTime := Max(1, (gGameSettings.ItemRespawnTime +
+      RandomRange(-gGameSettings.ItemRespawnRandom, gGameSettings.ItemRespawnRandom + 1)) * 36);
+    //e_logwritefln ('Randomized ammo %s time: %s', [ggItems[ID].ItemType, ggItems[ID].RespawnTime]);
+  end;
+
+  // Randomize respawn for weapons
+  if (TGameOption.ITEM_WEAPON_RANDOM in gGameSettings.Options) and (ggItems[ID].ItemType in [
+    ITEM_WEAPON_SAW, ITEM_WEAPON_SHOTGUN1, ITEM_WEAPON_SHOTGUN2, ITEM_WEAPON_CHAINGUN,
+    ITEM_WEAPON_ROCKETLAUNCHER, ITEM_WEAPON_PLASMA, ITEM_WEAPON_BFG, ITEM_WEAPON_SUPERCHAINGUN,
+    ITEM_WEAPON_FLAMETHROWER
+  ]) then
+  begin
+    ggItems[ID].RespawnTime := Max(1, (gGameSettings.ItemRespawnTime +
+      RandomRange(-gGameSettings.ItemRespawnRandom, gGameSettings.ItemRespawnRandom + 1)) * 36);
+    //e_logwritefln ('Randomized weapon %s time: %s', [ggItems[ID].ItemType, ggItems[ID].RespawnTime]);
   end;
 end;
 
   end;
 end;
 
index 424e553cc7beb593ef8b8d4d5c53c1bfb830d91f..8e8c5dd5e8d9f82061c7f0e903172dfb581f60d0 100644 (file)
@@ -174,11 +174,11 @@ type
     I_MENU_ITEM_RESPAWN_TIME,
     I_MENU_ITEM_RESPAWN_RANDOM,
     I_MENU_ITEM_RANDOM_ALL,
     I_MENU_ITEM_RESPAWN_TIME,
     I_MENU_ITEM_RESPAWN_RANDOM,
     I_MENU_ITEM_RANDOM_ALL,
-    I_MENU_ITEM_RANDOM_HELP_ONLY,
+    I_MENU_ITEM_RANDOM_LIFE_ONLY,
     I_MENU_ITEM_RANDOM_AMMO_ONLY,
     I_MENU_ITEM_RANDOM_WEAPON_ONLY,
     I_MENU_ITEM_RANDOM_AMMO_ONLY,
     I_MENU_ITEM_RANDOM_WEAPON_ONLY,
-    I_MENU_ITEM_RANDOM_HELP_AMMO,
-    I_MENU_ITEM_RANDOM_HELP_WEAPON,
+    I_MENU_ITEM_RANDOM_LIFE_AMMO,
+    I_MENU_ITEM_RANDOM_LIFE_WEAPON,
     I_MENU_ITEM_RANDOM_WEAPON_AMMO,
     I_MENU_ITEM_RANDOM_NOTHING,
     I_MENU_DEATHMATCH_KEYS,
     I_MENU_ITEM_RANDOM_WEAPON_AMMO,
     I_MENU_ITEM_RANDOM_NOTHING,
     I_MENU_DEATHMATCH_KEYS,
@@ -647,8 +647,8 @@ type
     I_MSG_POWERUP_RANDOM_OFF,
     I_MSG_ITEM_ALL_RANDOM_ON,
     I_MSG_ITEM_ALL_RANDOM_OFF,
     I_MSG_POWERUP_RANDOM_OFF,
     I_MSG_ITEM_ALL_RANDOM_ON,
     I_MSG_ITEM_ALL_RANDOM_OFF,
-    I_MSG_ITEM_HELP_RANDOM_ON,
-    I_MSG_ITEM_HELP_RANDOM_OFF,
+    I_MSG_ITEM_LIFE_RANDOM_ON,
+    I_MSG_ITEM_LIFE_RANDOM_OFF,
     I_MSG_ITEM_AMMO_RANDOM_ON,
     I_MSG_ITEM_AMMO_RANDOM_OFF,
     I_MSG_ITEM_WEAPON_RANDOM_ON,
     I_MSG_ITEM_AMMO_RANDOM_ON,
     I_MSG_ITEM_AMMO_RANDOM_OFF,
     I_MSG_ITEM_WEAPON_RANDOM_ON,
@@ -1007,15 +1007,15 @@ const
                                        'Ðàçáðîñ îòñ÷¸òà äëÿ ïðåäìåòîâ:'),
     ('MENU ITEM RESPAWN ALL',          'For all items',
                                        'Âñå ðàçëîæåííûå'),
                                        'Ðàçáðîñ îòñ÷¸òà äëÿ ïðåäìåòîâ:'),
     ('MENU ITEM RESPAWN ALL',          'For all items',
                                        'Âñå ðàçëîæåííûå'),
-    ('MENU ITEM RESPAWN HELP ONLY',    'For life-saving items only',
+    ('MENU ITEM RESPAWN LIFE ONLY',    'For life-saving items only',
                                        'Òîëüêî ïîäêðåïëåíèÿ'),
     ('MENU ITEM RESPAWN AMMO ONLY',    'For ammo only',
                                        'Òîëüêî áîåïðèïàñû'),
     ('MENU ITEM RESPAWN WEAPON ONLY',  'For weapons only',
                                        'Òîëüêî îðóæèå'),
                                        'Òîëüêî ïîäêðåïëåíèÿ'),
     ('MENU ITEM RESPAWN AMMO ONLY',    'For ammo only',
                                        'Òîëüêî áîåïðèïàñû'),
     ('MENU ITEM RESPAWN WEAPON ONLY',  'For weapons only',
                                        'Òîëüêî îðóæèå'),
-    ('MENU ITEM RESPAWN HELP AMMO',    'For life-saving items and ammo',
+    ('MENU ITEM RESPAWN LIFE AMMO',    'For life-saving items and ammo',
                                        'Ïîäêðåïëåíèÿ è áîåïðèïàñû'),
                                        'Ïîäêðåïëåíèÿ è áîåïðèïàñû'),
-    ('MENU ITEM RESPAWN HELP WEAPON',  'For life-saving items and weapons',
+    ('MENU ITEM RESPAWN LIFE WEAPON',  'For life-saving items and weapons',
                                        'Ïîäêðåïëåíèÿ è îðóæèå'),
     ('MENU ITEM RESPAWN WEAPON AMMO',  'For weapons and ammo',
                                        'Îðóæèå è áîåïðèïàñû'),
                                        'Ïîäêðåïëåíèÿ è îðóæèå'),
     ('MENU ITEM RESPAWN WEAPON AMMO',  'For weapons and ammo',
                                        'Îðóæèå è áîåïðèïàñû'),
@@ -1913,9 +1913,9 @@ const
                                        'Ñëó÷àéíîå âîñïîëíåíèå âêëþ÷åíî äëÿ âñåõ ïðåäìåòîâ'),
     ('MSG ITEM ALL RANDOM OFF',        'Random respawn for all items disabled',
                                        'Ñëó÷àéíîå âîñïîëíåíèå äëÿ âñåõ ïðåäìåòîâ âûêëþ÷åíî'),
                                        'Ñëó÷àéíîå âîñïîëíåíèå âêëþ÷åíî äëÿ âñåõ ïðåäìåòîâ'),
     ('MSG ITEM ALL RANDOM OFF',        'Random respawn for all items disabled',
                                        'Ñëó÷àéíîå âîñïîëíåíèå äëÿ âñåõ ïðåäìåòîâ âûêëþ÷åíî'),
-    ('MSG ITEM HELP RANDOM ON',        'Random respawn enabled for life-saving items',
+    ('MSG ITEM LIFE RANDOM ON',        'Random respawn enabled for life-saving items',
                                        'Ñëó÷àéíîå âîñïîëíåíèå âêëþ÷åíî äëÿ ïîäêðåïëÿþùèõ ïðåäìåòîâ'),
                                        'Ñëó÷àéíîå âîñïîëíåíèå âêëþ÷åíî äëÿ ïîäêðåïëÿþùèõ ïðåäìåòîâ'),
-    ('MSG ITEM HELP RANDOM OFF',       'Random respawn for life-saving items disabled',
+    ('MSG ITEM LIFE RANDOM OFF',       'Random respawn for life-saving items disabled',
                                        'Ñëó÷àéíîå âîñïîëíåíèå äëÿ ïîäêðåïëÿþùèõ ïðåäìåòîâ âûêëþ÷åíî'),
     ('MSG ITEM AMMO RANDOM ON',        'Random respawn enabled for ammo',
                                        'Ñëó÷àéíîå âîñïîëíåíèå âêëþ÷åíî äëÿ áîåïðèïàñîâ'),
                                        'Ñëó÷àéíîå âîñïîëíåíèå äëÿ ïîäêðåïëÿþùèõ ïðåäìåòîâ âûêëþ÷åíî'),
     ('MSG ITEM AMMO RANDOM ON',        'Random respawn enabled for ammo',
                                        'Ñëó÷àéíîå âîñïîëíåíèå âêëþ÷åíî äëÿ áîåïðèïàñîâ'),
index f87e6b7ef8f42454a0e464d07f18adbb738a08d9..722bd9bb1cdc2a8cf6625a9399795176a29979ea 100644 (file)
@@ -1478,7 +1478,7 @@ begin
   if g_Game_IsClient then Exit;
 
   if (gGameSettings.GameType = GT_SINGLE)
   if g_Game_IsClient then Exit;
 
   if (gGameSettings.GameType = GT_SINGLE)
-  or LongBool(gGameSettings.Options and GAME_OPTION_MONSTERS) then
+    or (TGameOption.MONSTERS in gGameSettings.Options) then
   begin
     mon := g_Monsters_Create(monster.MonsterType, monster.X, monster.Y, TDirection(monster.Direction));
 
   begin
     mon := g_Monsters_Create(monster.MonsterType, monster.X, monster.Y, TDirection(monster.Direction));
 
index fac3ca78f40f161031fbcd68254909343f475a64..8fe06a3f8e5d8ac952ef6ae2a80bc8cb638d844a 100644 (file)
@@ -738,36 +738,36 @@ begin
     gsPlayers := TGUISwitch(GetControl('swPlayers')).ItemIndex;
     gsMap := Map;
 
     gsPlayers := TGUISwitch(GetControl('swPlayers')).ItemIndex;
     gsMap := Map;
 
-    gsGameFlags := 0;
+    gsGameFlags := [];
     if TGUISwitch(GetControl('swTeamDamage')).ItemIndex = 0 then
     if TGUISwitch(GetControl('swTeamDamage')).ItemIndex = 0 then
-      gsGameFlags := gsGameFlags or GAME_OPTION_TEAMDAMAGE;
+      gsGameFlags += [TGameOption.TEAM_DAMAGE];
     if TGUISwitch(GetControl('swTeamAbsorbDamage')).ItemIndex = 0 then
     if TGUISwitch(GetControl('swTeamAbsorbDamage')).ItemIndex = 0 then
-      gsGameFlags := gsGameFlags or GAME_OPTION_TEAMABSORBDAMAGE;
+      gsGameFlags += [TGameOption.TEAM_ABSORB_DAMAGE];
     if TGUISwitch(GetControl('swDeathmatchKeys')).ItemIndex = 0 then
     if TGUISwitch(GetControl('swDeathmatchKeys')).ItemIndex = 0 then
-      gsGameFlags := gsGameFlags or GAME_OPTION_DMKEYS;
+      gsGameFlags += [TGameOption.DM_KEYS];
     if TGUISwitch(GetControl('swEnableExits')).ItemIndex = 0 then
     if TGUISwitch(GetControl('swEnableExits')).ItemIndex = 0 then
-      gsGameFlags := gsGameFlags or GAME_OPTION_ALLOWEXIT;
+      gsGameFlags += [TGameOption.ALLOW_EXIT];
     if TGUISwitch(GetControl('swWeaponStay')).ItemIndex = 0 then
     if TGUISwitch(GetControl('swWeaponStay')).ItemIndex = 0 then
-      gsGameFlags := gsGameFlags or GAME_OPTION_WEAPONSTAY;
+      gsGameFlags += [TGameOption.WEAPONS_STAY];
     if TGUISwitch(GetControl('swMonsters')).ItemIndex = 0 then
     if TGUISwitch(GetControl('swMonsters')).ItemIndex = 0 then
-      gsGameFlags := gsGameFlags or GAME_OPTION_MONSTERS;
+      gsGameFlags += [TGameOption.MONSTERS];
 
     case TGUISwitch(GetControl('swTeamHit')).ItemIndex of
 
     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
     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
     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
     end;
 
     // TODO: get this crap out of here
@@ -784,16 +784,16 @@ begin
     gsPowerupRespawnRandom := StrToIntDef(TGUIEdit(GetControl('edPowerupRespawnRandom')).Text, 0);
 
     if TGUISwitch(GetControl('swPowerupRandom')).ItemIndex = 0 then
     gsPowerupRespawnRandom := StrToIntDef(TGUIEdit(GetControl('edPowerupRespawnRandom')).Text, 0);
 
     if TGUISwitch(GetControl('swPowerupRandom')).ItemIndex = 0 then
-      gsGameFlags := gsGameFlags or GAME_OPTION_POWERUPRANDOM;
+      gsGameFlags += [TGameOption.POWERUP_RANDOM];
 
     case TGUISwitch(GetControl('swItemsRandom')).ItemIndex of
 
     case TGUISwitch(GetControl('swItemsRandom')).ItemIndex of
-      1: gsGameFlags := gsGameFlags or GAME_OPTION_ITEMHELPRANDOM;
-      2: gsGameFlags := gsGameFlags or GAME_OPTION_ITEMAMMORANDOM;
-      3: gsGameFlags := gsGameFlags or GAME_OPTION_ITEMWEAPONRANDOM;
-      4: gsGameFlags := gsGameFlags or GAME_OPTION_ITEMHELPRANDOM or GAME_OPTION_ITEMAMMORANDOM;
-      5: gsGameFlags := gsGameFlags or GAME_OPTION_ITEMHELPRANDOM or GAME_OPTION_ITEMWEAPONRANDOM;
-      6: gsGameFlags := gsGameFlags or GAME_OPTION_ITEMAMMORANDOM or GAME_OPTION_ITEMWEAPONRANDOM;
-      0: gsGameFlags := gsGameFlags or GAME_OPTION_ITEMALLRANDOM;
+      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
     end;
 
     // TODO: get this crap out of here
@@ -1778,28 +1778,26 @@ begin
   with gGameSettings do
   begin
     with TGUISwitch(menu.GetControl('swTeamDamage')) do
   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
     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
         ItemIndex := 0
-      else if LongBool(Options and GAME_OPTION_TEAMHITTRACE) then
+      else if TGameOption.TEAM_HIT_TRACE in Options then
         ItemIndex := 1
         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
         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
     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
         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;
         ItemIndex := 1
       else
         ItemIndex := 2;
@@ -1809,65 +1807,63 @@ begin
     TGUIEdit(menu.GetControl('edMaxLives')).Text := IntToStr(MaxLives);
 
     with TGUISwitch(menu.GetControl('swBotsVS')) do
     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
         ItemIndex := 2
+      else if TGameOption.BOTS_VS_MONSTERS in Options then
+        ItemIndex := 1
       else
       else
-        if LongBool(Options and GAME_OPTION_BOTVSMONSTER) then
-          ItemIndex := 1
-        else
-          ItemIndex := 0;
+        ItemIndex := 0;
 
     if GameType in [GT_CUSTOM, GT_SERVER] then
 
     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
       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('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;
+        TGUISwitch(menu.GetControl('swDeathmatchKeys')).Enabled := True;
+        TGUILabel(menu.GetControlsText('swDeathmatchKeys')).Color := MENU_ITEMSTEXT_COLOR;
       end
       end
-    else
+      else
       begin
       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;
         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;
+      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;
 
   end;
 end;
 
@@ -1885,28 +1881,26 @@ begin
   begin
     if TGUISwitch(menu.GetControl('swTeamDamage')).Enabled then
     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
     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
       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
       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
     end;
 
     if TGUIEdit(menu.GetControl('edTimeLimit')).Enabled then
@@ -1970,30 +1964,25 @@ begin
     if TGUISwitch(menu.GetControl('swBotsVS')).Enabled then
     begin
       case TGUISwitch(menu.GetControl('swBotsVS')).ItemIndex of
     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
         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
       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;
 
       end;
     end;
 
@@ -2373,10 +2362,9 @@ begin
       Name := 'swTeamDamage';
       AddItem(_lc[I_MENU_YES]);
       AddItem(_lc[I_MENU_NO]);
       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
     end;
     with AddSwitch(_lc[I_MENU_TEAM_HIT]) do
     begin
@@ -2385,11 +2373,11 @@ begin
       AddItem(_lc[I_MENU_TEAM_HIT_TRACE]);
       AddItem(_lc[I_MENU_TEAM_HIT_PROJECTILE]);
       AddItem(_lc[I_MENU_TEAM_HIT_NOTHING]);
       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
         ItemIndex := 0
-      else if LongBool(gsGameFlags and GAME_OPTION_TEAMHITTRACE) then
+      else if TGameOption.TEAM_HIT_TRACE in gsGameFlags then
         ItemIndex := 1
         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;
         ItemIndex := 2
       else
         ItemIndex := 3;
@@ -2399,50 +2387,45 @@ begin
       Name := 'swTeamAbsorbDamage';
       AddItem(_lc[I_MENU_YES]);
       AddItem(_lc[I_MENU_NO]);
       Name := 'swTeamAbsorbDamage';
       AddItem(_lc[I_MENU_YES]);
       AddItem(_lc[I_MENU_NO]);
-      if LongBool(gsGameFlags and GAME_OPTION_TEAMABSORBDAMAGE) 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]);
     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]);
     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]);
     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]);
     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
     end;
     with AddSwitch(_lc[I_MENU_BOTS_VS]) do
     begin
@@ -2451,9 +2434,9 @@ begin
       AddItem(_lc[I_MENU_BOTS_VS_MONSTERS]);
       AddItem(_lc[I_MENU_BOTS_VS_ALL]);
       ItemIndex := 2;
       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;
         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
         ItemIndex := 1;
     end;
     with AddSwitch(_lc[I_MENU_FLAG_DROP]) do
@@ -2462,9 +2445,9 @@ begin
       AddItem(_lc[I_MENU_FLAG_THROW]);
       AddItem(_lc[I_MENU_YES]);
       AddItem(_lc[I_MENU_NO]);
       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
         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;
         ItemIndex := 1
       else
         ItemIndex := 2;
@@ -2488,7 +2471,7 @@ begin
     with AddEdit(_lc[I_NET_ADDRESS]) do
     begin
       Name := 'edIP';
     with AddEdit(_lc[I_NET_ADDRESS]) do
     begin
       Name := 'edIP';
-      OnlyDigits :=False;
+      OnlyDigits := False;
       Width := 12;
       MaxLength := 64;
       Text := 'localhost';
       Width := 12;
       MaxLength := 64;
       Text := 'localhost';
@@ -2629,10 +2612,9 @@ begin
       Name := 'swTeamDamage';
       AddItem(_lc[I_MENU_YES]);
       AddItem(_lc[I_MENU_NO]);
       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
     end;
     with AddSwitch(_lc[I_MENU_TEAM_HIT]) do
     begin
@@ -2641,11 +2623,11 @@ begin
       AddItem(_lc[I_MENU_TEAM_HIT_TRACE]);
       AddItem(_lc[I_MENU_TEAM_HIT_PROJECTILE]);
       AddItem(_lc[I_MENU_TEAM_HIT_NOTHING]);
       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
         ItemIndex := 0
-      else if LongBool(gsGameFlags and GAME_OPTION_TEAMHITTRACE) then
+      else if TGameOption.TEAM_HIT_TRACE in gsGameFlags then
         ItemIndex := 1
         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;
         ItemIndex := 2
       else
         ItemIndex := 3;
@@ -2655,50 +2637,45 @@ begin
       Name := 'swTeamAbsorbDamage';
       AddItem(_lc[I_MENU_YES]);
       AddItem(_lc[I_MENU_NO]);
       Name := 'swTeamAbsorbDamage';
       AddItem(_lc[I_MENU_YES]);
       AddItem(_lc[I_MENU_NO]);
-      if LongBool(gsGameFlags and GAME_OPTION_TEAMABSORBDAMAGE) 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]);
     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]);
     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]);
     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]);
     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
     end;
     with AddSwitch(_lc[I_MENU_BOTS_VS]) do
     begin
@@ -2707,9 +2684,9 @@ begin
       AddItem(_lc[I_MENU_BOTS_VS_MONSTERS]);
       AddItem(_lc[I_MENU_BOTS_VS_ALL]);
       ItemIndex := 2;
       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;
         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
         ItemIndex := 1;
     end;
     with AddSwitch(_lc[I_MENU_FLAG_DROP]) do
@@ -2718,9 +2695,9 @@ begin
       AddItem(_lc[I_MENU_FLAG_THROW]);
       AddItem(_lc[I_MENU_YES]);
       AddItem(_lc[I_MENU_NO]);
       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
         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;
         ItemIndex := 1
       else
         ItemIndex := 2;
@@ -2875,35 +2852,34 @@ begin
       Name := 'swPowerupRandom';
       AddItem(_lc[I_MENU_YES]);
       AddItem(_lc[I_MENU_NO]);
       Name := 'swPowerupRandom';
       AddItem(_lc[I_MENU_YES]);
       AddItem(_lc[I_MENU_NO]);
-      if LongBool(gsGameFlags and GAME_OPTION_POWERUPRANDOM) then
-        ItemIndex := 0
-      else
-        ItemIndex := 1;
+      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]);
     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_HELP_ONLY]);
+      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_AMMO_ONLY]);
       AddItem(_lc[I_MENU_ITEM_RANDOM_WEAPON_ONLY]);
-      AddItem(_lc[I_MENU_ITEM_RANDOM_HELP_AMMO]);
-      AddItem(_lc[I_MENU_ITEM_RANDOM_HELP_WEAPON]);
+      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]);
       AddItem(_lc[I_MENU_ITEM_RANDOM_WEAPON_AMMO]);
       AddItem(_lc[I_MENU_ITEM_RANDOM_NOTHING]);
-      if LongBool(gsGameFlags and GAME_OPTION_ITEMALLRANDOM) then
+      if TGameOption.ITEM_ALL_RANDOM in gsGameFlags then
         ItemIndex := 0
         ItemIndex := 0
-      else if LongBool(gsGameFlags and GAME_OPTION_ITEMHELPRANDOM) then
+      else if TGameOption.ITEM_LIFE_RANDOM in gsGameFlags then
         ItemIndex := 1
         ItemIndex := 1
-      else if LongBool(gsGameFlags and GAME_OPTION_ITEMAMMORANDOM) then
+      else if TGameOption.ITEM_AMMO_RANDOM in gsGameFlags then
         ItemIndex := 2
         ItemIndex := 2
-      else if LongBool(gsGameFlags and GAME_OPTION_ITEMWEAPONRANDOM) then
+      else if TGameOption.ITEM_WEAPON_RANDOM in gsGameFlags then
         ItemIndex := 3
         ItemIndex := 3
-      else if (gsGameFlags and (GAME_OPTION_ITEMHELPRANDOM or GAME_OPTION_ITEMAMMORANDOM)) = (GAME_OPTION_ITEMHELPRANDOM or GAME_OPTION_ITEMAMMORANDOM) then
+      else if [TGameOption.ITEM_LIFE_RANDOM, TGameOption.ITEM_AMMO_RANDOM] <= gsGameFlags then
         ItemIndex := 4
         ItemIndex := 4
-      else if (gsGameFlags and (GAME_OPTION_ITEMHELPRANDOM or GAME_OPTION_ITEMWEAPONRANDOM)) = (GAME_OPTION_ITEMHELPRANDOM or GAME_OPTION_ITEMWEAPONRANDOM) then
+      else if [TGameOption.ITEM_LIFE_RANDOM, TGameOption.ITEM_WEAPON_RANDOM] <= gsGameFlags then
         ItemIndex := 5
         ItemIndex := 5
-      else if (gsGameFlags and (GAME_OPTION_ITEMAMMORANDOM or GAME_OPTION_ITEMWEAPONRANDOM)) = (GAME_OPTION_ITEMAMMORANDOM or GAME_OPTION_ITEMWEAPONRANDOM) then
+      else if [TGameOption.ITEM_AMMO_RANDOM, TGameOption.ITEM_WEAPON_RANDOM] <= gsGameFlags then
         ItemIndex := 6
       else
         ItemIndex := 7;
         ItemIndex := 6
       else
         ItemIndex := 7;
index 15da1c62189407cd450f4673a0432427273d0826..a55a8a849d153a29ff46afd7b62f1b95f362d69f 100644 (file)
@@ -989,7 +989,7 @@ begin
   NetOut.Write(gGameSettings.ScoreLimit);
   NetOut.Write(gGameSettings.TimeLimit);
   NetOut.Write(gGameSettings.MaxLives);
   NetOut.Write(gGameSettings.ScoreLimit);
   NetOut.Write(gGameSettings.TimeLimit);
   NetOut.Write(gGameSettings.MaxLives);
-  NetOut.Write(gGameSettings.Options);
+  NetOut.Write(LongWord(gGameSettings.Options));
   NetOut.Write(gTime);
 
   g_Net_Host_Send(ID, True);
   NetOut.Write(gTime);
 
   g_Net_Host_Send(ID, True);
@@ -1219,7 +1219,7 @@ begin
   NetOut.Write(gGameSettings.ScoreLimit);
   NetOut.Write(gGameSettings.TimeLimit);
   NetOut.Write(gGameSettings.MaxLives);
   NetOut.Write(gGameSettings.ScoreLimit);
   NetOut.Write(gGameSettings.TimeLimit);
   NetOut.Write(gGameSettings.MaxLives);
-  NetOut.Write(gGameSettings.Options);
+  NetOut.Write(LongWord(gGameSettings.Options));
 
   g_Net_Host_Send(ID, True);
 end;
 
   g_Net_Host_Send(ID, True);
 end;
@@ -2372,7 +2372,7 @@ begin
   gGameSettings.ScoreLimit := M.ReadWord();
   gGameSettings.TimeLimit := M.ReadWord();
   gGameSettings.MaxLives := M.ReadByte();
   gGameSettings.ScoreLimit := M.ReadWord();
   gGameSettings.TimeLimit := M.ReadWord();
   gGameSettings.MaxLives := M.ReadByte();
-  gGameSettings.Options := M.ReadLongWord();
+  gGameSettings.Options := TGameOptions(M.ReadLongWord());
 end;
 
 // PLAYER
 end;
 
 // PLAYER
index 22ebe3e26e0da9f644d2bf142a33159a34350ec1..79da12ec4439c1e57f490e504481e15ce2bf730a 100644 (file)
@@ -18,7 +18,7 @@ unit g_options;
 interface
 
 uses
 interface
 
 uses
-  g_language, g_weapons, utils;
+  g_language, g_game, g_weapons, utils;
 
 function GenPlayerName (n: Integer): String;
 
 
 function GenPlayerName (n: Integer): String;
 
@@ -71,7 +71,7 @@ var
   gsScoreLimit: Word;
   gsMaxLives: Byte;
   gsPlayers: Byte;
   gsScoreLimit: Word;
   gsMaxLives: Byte;
   gsPlayers: Byte;
-  gsGameFlags: LongWord;
+  gsGameFlags: TGameOptions;
   gsSpawnInvul: Integer = 0;
   gsItemRespawnTime: Word = 60;
   gsItemRespawnRandom: Word = 0;
   gsSpawnInvul: Integer = 0;
   gsItemRespawnTime: Word = 60;
   gsItemRespawnRandom: Word = 0;
@@ -87,7 +87,7 @@ uses
     SDL2,
   {$ENDIF}
   e_log, e_input, g_console, g_window, g_sound, g_gfx, g_player, Math,
     SDL2,
   {$ENDIF}
   e_log, e_input, g_console, g_window, g_sound, g_gfx, g_player, Math,
-  g_map, g_net, g_netmaster, SysUtils, CONFIG, g_game, g_main, e_texture,
+  g_map, g_net, g_netmaster, SysUtils, CONFIG, g_main, e_texture,
   g_items, wadreader, e_graphics, g_touch, envvars, g_system;
 
   var
   g_items, wadreader, e_graphics, g_touch, envvars, g_system;
 
   var
@@ -273,10 +273,9 @@ begin
   gsItemRespawnRandom := 0;
   gsPowerupRespawnTime := 60;
   gsPowerupRespawnRandom := 0;
   gsItemRespawnRandom := 0;
   gsPowerupRespawnTime := 60;
   gsPowerupRespawnRandom := 0;
-  gsGameFlags := GAME_OPTION_ALLOWEXIT or GAME_OPTION_DMKEYS or
-    GAME_OPTION_BOTVSPLAYER or GAME_OPTION_BOTVSMONSTER or
-    GAME_OPTION_TEAMHITTRACE or GAME_OPTION_TEAMHITPROJECTILE or
-    GAME_OPTION_ALLOWDROPFLAG;
+  gsGameFlags := [TGameOption.ALLOW_EXIT, TGameOption.DM_KEYS, TGameOption.BOTS_VS_PLAYERS,
+    TGameOption.BOTS_VS_MONSTERS, TGameOption.TEAM_HIT_TRACE, TGameOption.TEAM_HIT_PROJECTILE,
+    TGameOption.ALLOW_DROP_FLAG];
   gsPlayers := 1;
 
   if not gGameOn then
   gsPlayers := 1;
 
   if not gGameOn then
index 6b0c4f5bd75028389a8c06772ccdd32f5acb1d5c..a97b4ff5a50f911853570883bf99b190b9851573 100644 (file)
@@ -2323,7 +2323,7 @@ begin
     Exit;
 
 // Åñëè åñòü óðîí ñâîèì, èëè ðàíèë ñàì ñåáÿ, èëè òåáÿ ðàíèë ïðîòèâíèê:
     Exit;
 
 // Åñëè åñòü óðîí ñâîèì, èëè ðàíèë ñàì ñåáÿ, èëè òåáÿ ðàíèë ïðîòèâíèê:
-  if LongBool(gGameSettings.Options and GAME_OPTION_TEAMDAMAGE) or
+  if (TGameOption.TEAM_DAMAGE in gGameSettings.Options) or
      (SpawnerUID = FUID) or
      (not SameTeam(FUID, SpawnerUID)) then
   begin
      (SpawnerUID = FUID) or
      (not SameTeam(FUID, SpawnerUID)) then
   begin
@@ -3647,7 +3647,7 @@ begin
 
 // Âûáðîñ êëþ÷åé:
     if (not (gGameSettings.GameMode in [GM_DM, GM_TDM, GM_CTF])) or
 
 // Âûáðîñ êëþ÷åé:
     if (not (gGameSettings.GameMode in [GM_DM, GM_TDM, GM_CTF])) or
-       (not LongBool(gGameSettings.Options and GAME_OPTION_DMKEYS)) then
+       (not (TGameOption.DM_KEYS in gGameSettings.Options)) then
     begin
       if R_KEY_RED in FInventory then
         PushItem(ITEM_KEY_RED);
     begin
       if R_KEY_RED in FInventory then
         PushItem(ITEM_KEY_RED);
@@ -4055,7 +4055,7 @@ begin
   if g_Game_IsClient then Exit;
 
   // a = true - ìåñòî ñïàâíà ïðåäìåòà:
   if g_Game_IsClient then Exit;
 
   // a = true - ìåñòî ñïàâíà ïðåäìåòà:
-  a := LongBool(gGameSettings.Options and GAME_OPTION_WEAPONSTAY) and arespawn;
+  a := (TGameOption.WEAPONS_STAY in gGameSettings.Options) and arespawn;
   remove := not a;
   case ItemType of
     ITEM_MEDKIT_SMALL:
   remove := not a;
   case ItemType of
     ITEM_MEDKIT_SMALL:
@@ -4714,7 +4714,7 @@ begin
     FMaxAmmo[A_FUEL] := AmmoLimits[0, A_FUEL];
 
     if (gGameSettings.GameMode in [GM_DM, GM_TDM, GM_CTF]) and
     FMaxAmmo[A_FUEL] := AmmoLimits[0, A_FUEL];
 
     if (gGameSettings.GameMode in [GM_DM, GM_TDM, GM_CTF]) and
-       LongBool(gGameSettings.Options and GAME_OPTION_DMKEYS) then
+       (TGameOption.DM_KEYS in gGameSettings.Options) then
       FInventory := [R_KEY_RED, R_KEY_GREEN, R_KEY_BLUE]
     else
       FInventory := [];
       FInventory := [R_KEY_RED, R_KEY_GREEN, R_KEY_BLUE]
     else
       FInventory := [];
@@ -5936,10 +5936,9 @@ end;
 
 function TPlayer.TryDropFlag(): Boolean;
 begin
 
 function TPlayer.TryDropFlag(): Boolean;
 begin
-  if LongBool(gGameSettings.Options and GAME_OPTION_ALLOWDROPFLAG) then
-    Result := DropFlag(False, LongBool(gGameSettings.Options and GAME_OPTION_THROWFLAG))
-  else
-    Result := False;
+  if (TGameOption.ALLOW_DROP_FLAG in gGameSettings.Options)
+    then Result := DropFlag(False, TGameOption.THROW_FLAG in gGameSettings.Options)
+    else Result := False;
 end;
 
 function TPlayer.DropFlag(Silent: Boolean = True; DoThrow: Boolean = False): Boolean;
 end;
 
 function TPlayer.DropFlag(Silent: Boolean = True; DoThrow: Boolean = False): Boolean;
@@ -6915,8 +6914,8 @@ var
   end;
 
 begin
   end;
 
 begin
-  vsPlayer := LongBool(gGameSettings.Options and GAME_OPTION_BOTVSPLAYER);
-  vsMonster := LongBool(gGameSettings.Options and GAME_OPTION_BOTVSMONSTER);
+  vsPlayer := TGameOption.BOTS_VS_PLAYERS in gGameSettings.Options;
+  vsMonster := TGameOption.BOTS_VS_MONSTERS in gGameSettings.Options;
 
 // Åñëè òåêóùåå îðóæèå íå òî, ÷òî íóæíî, òî ìåíÿåì:
   if FCurrWeap <> FSelectedWeapon then
 
 // Åñëè òåêóùåå îðóæèå íå òî, ÷òî íóæíî, òî ìåíÿåì:
   if FCurrWeap <> FSelectedWeapon then
@@ -7945,7 +7944,7 @@ begin
     begin
       ok := False;
       if (g_GetUIDType(FLastSpawnerUID) = UID_PLAYER) and
     begin
       ok := False;
       if (g_GetUIDType(FLastSpawnerUID) = UID_PLAYER) and
-          LongBool(gGameSettings.Options and GAME_OPTION_BOTVSPLAYER) then
+         (TGameOption.BOTS_VS_PLAYERS in gGameSettings.Options) then
         begin // Èãðîê
           pla := g_Player_Get(FLastSpawnerUID);
           ok := not TargetOnScreen(pla.FObj.X + PLAYER_RECT.X,
         begin // Èãðîê
           pla := g_Player_Get(FLastSpawnerUID);
           ok := not TargetOnScreen(pla.FObj.X + PLAYER_RECT.X,
@@ -7953,7 +7952,7 @@ begin
         end
       else
         if (g_GetUIDType(FLastSpawnerUID) = UID_MONSTER) and
         end
       else
         if (g_GetUIDType(FLastSpawnerUID) = UID_MONSTER) and
-           LongBool(gGameSettings.Options and GAME_OPTION_BOTVSMONSTER) then
+           (TGameOption.BOTS_VS_MONSTERS in gGameSettings.Options) then
         begin // Ìîíñòð
           mon := g_Monsters_ByUID(FLastSpawnerUID);
           ok := not TargetOnScreen(mon.Obj.X + mon.Obj.Rect.X,
         begin // Ìîíñòð
           mon := g_Monsters_ByUID(FLastSpawnerUID);
           ok := not TargetOnScreen(mon.Obj.X + mon.Obj.Rect.X,
index f311bb8f5a89ad8429c34646818c1d32d4ec1b87..2d91494b1e50b13806bb4c193b319b0ed7e7c2af 100644 (file)
@@ -384,7 +384,7 @@ begin
         gGameSettings.TimeLimit := Game_TimeLimit;
         gGameSettings.ScoreLimit := Game_ScoreLimit;
         gGameSettings.MaxLives := Game_MaxLives;
         gGameSettings.TimeLimit := Game_TimeLimit;
         gGameSettings.ScoreLimit := Game_ScoreLimit;
         gGameSettings.MaxLives := Game_MaxLives;
-        gGameSettings.Options := Game_Options;
+        gGameSettings.Options := TGameOptions(Game_Options);
         gSwitchGameMode := Game_Mode;
         g_Game_ExecuteEvent('ongamestart');
 
         gSwitchGameMode := Game_Mode;
         g_Game_ExecuteEvent('ongamestart');
 
index 8c11a474ff3928ea8466b19897f375993a360b49..3a1bec2ccbf37a95c84c49de76b6da6bc45c10c0 100644 (file)
@@ -2349,14 +2349,14 @@ begin
 
   // Íå ñîçäàâàòü âûõîä, åñëè èãðà áåç âûõîäà
   if (aTrigger.TriggerType = TRIGGER_EXIT) and
 
   // Íå ñîçäàâàòü âûõîä, åñëè èãðà áåç âûõîäà
   if (aTrigger.TriggerType = TRIGGER_EXIT) and
-     (not LongBool(gGameSettings.Options and GAME_OPTION_ALLOWEXIT)) then
+     (not (TGameOption.ALLOW_EXIT in gGameSettings.Options)) then
   begin
     aTrigger.TriggerType := TRIGGER_NONE;
   end;
 
   // Åñëè ìîíñòðû çàïðåùåíû, îòìåíÿåì òðèããåð
   if (aTrigger.TriggerType = TRIGGER_SPAWNMONSTER) and
   begin
     aTrigger.TriggerType := TRIGGER_NONE;
   end;
 
   // Åñëè ìîíñòðû çàïðåùåíû, îòìåíÿåì òðèããåð
   if (aTrigger.TriggerType = TRIGGER_SPAWNMONSTER) and
-     (not LongBool(gGameSettings.Options and GAME_OPTION_MONSTERS)) and
+     (not (TGameOption.MONSTERS in gGameSettings.Options)) and
      (gGameSettings.GameType <> GT_SINGLE) then
   begin
     aTrigger.TriggerType := TRIGGER_NONE;
      (gGameSettings.GameType <> GT_SINGLE) then
   begin
     aTrigger.TriggerType := TRIGGER_NONE;
index 23898af54c2cd8dc5ceb1bec423edcbec626d448..9b0952edbb1652aa1a28ca09fb948d5a23527471 100644 (file)
@@ -896,7 +896,7 @@ begin
       // È â êîíöå èãðîêîâ, íî òîëüêî åñëè ïîëîæåíî
       // (èëè ñíàðÿä îò ìîíñòðà, èëè friendlyfire, èëè friendly_hit_projectile)
       if (g_GetUIDType(SpawnerUID) <> UID_PLAYER) or
       // È â êîíöå èãðîêîâ, íî òîëüêî åñëè ïîëîæåíî
       // (èëè ñíàðÿä îò ìîíñòðà, èëè friendlyfire, èëè friendly_hit_projectile)
       if (g_GetUIDType(SpawnerUID) <> UID_PLAYER) or
-         LongBool(gGameSettings.Options and (GAME_OPTION_TEAMDAMAGE or GAME_OPTION_TEAMHITPROJECTILE)) then
+         ([TGameOption.TEAM_DAMAGE, TGameOption.TEAM_HIT_PROJECTILE] <= gGameSettings.Options) then
       begin
         if PlayerHit() then
         begin
       begin
         if PlayerHit() then
         begin
@@ -942,7 +942,7 @@ begin
 
       // È â êîíöå ñâîèõ èãðîêîâ, íî òîëüêî åñëè ïîëîæåíî
       // (èëè friendlyfire, èëè friendly_hit_projectile)
 
       // È â êîíöå ñâîèõ èãðîêîâ, íî òîëüêî åñëè ïîëîæåíî
       // (èëè friendlyfire, èëè friendly_hit_projectile)
-      if LongBool(gGameSettings.Options and (GAME_OPTION_TEAMDAMAGE or GAME_OPTION_TEAMHITPROJECTILE)) then
+      if [TGameOption.TEAM_DAMAGE, TGameOption.TEAM_HIT_PROJECTILE] <= gGameSettings.Options then
       begin
         if PlayerHit(1) then
         begin
       begin
         if PlayerHit(1) then
         begin
@@ -1414,10 +1414,10 @@ var
     if (gPlayers[idx] = nil) or not gPlayers[idx].alive then exit;
     if (spawnerPlr <> nil) then
     begin
     if (gPlayers[idx] = nil) or not gPlayers[idx].alive then exit;
     if (spawnerPlr <> nil) then
     begin
-      if ((gGameSettings.Options and (GAME_OPTION_TEAMHITTRACE or GAME_OPTION_TEAMDAMAGE)) = 0) and
+      if (not ([TGameOption.TEAM_HIT_TRACE, TGameOption.TEAM_DAMAGE] <= gGameSettings.Options)) and
          (spawnerPlr.Team <> TEAM_NONE) and (spawnerPlr.Team = gPlayers[idx].Team) then
       begin
          (spawnerPlr.Team <> TEAM_NONE) and (spawnerPlr.Team = gPlayers[idx].Team) then
       begin
-        if (spawnerPlr <> gPlayers[idx]) and ((gGameSettings.Options and GAME_OPTION_TEAMABSORBDAMAGE) = 0) then
+        if (spawnerPlr <> gPlayers[idx]) and not (TGameOption.TEAM_ABSORB_DAMAGE in gGameSettings.Options) then
           dmg := Max(1, dmg div 2);
         exit;
       end;
           dmg := Max(1, dmg div 2);
         exit;
       end;