X-Git-Url: http://deadsoftware.ru/gitweb?p=d2df-sdl.git;a=blobdiff_plain;f=src%2Fgame%2Fg_options.pas;h=091935cb80b2b0eab96233a1680de41741e381a2;hp=23ddc36a259a6a5d04531e64b3ff5243253b8e5a;hb=be2ad7bf5e09b4ee91a0c5ee741503ace8c7887c;hpb=e1f0d9264e64404de20df057c98c8cc1ac39f856 diff --git a/src/game/g_options.pas b/src/game/g_options.pas index 23ddc36..091935c 100644 --- a/src/game/g_options.pas +++ b/src/game/g_options.pas @@ -24,13 +24,7 @@ function GenPlayerName (n: Integer): String; procedure g_Options_SetDefault; procedure g_Options_SetDefaultVideo; -procedure g_Options_Read(FileName: String); -procedure g_Options_Write(FileName: String); -procedure g_Options_Write_Gameplay_Custom(FileName: String); -procedure g_Options_Write_Gameplay_Net(FileName: String); -procedure g_Options_Write_Net_Server(FileName: String); -procedure g_Options_Write_Net_Client(FileName: String); -procedure g_Options_Commands (p: SSArray); +procedure g_Options_ApplyGameSettings; const DF_Default_Megawad_Start = 'megawads/DOOM2D.WAD:\MAP01'; @@ -62,38 +56,24 @@ var gAskLanguage: Boolean; gSaveStats: Boolean = False; gScreenshotStats: Boolean = False; - gcMap: String; - gcGameMode: String; - gcTimeLimit: Word; - gcGoalLimit: Word; - gcMaxLives: Byte; - gcPlayers: Byte; - gcTeamDamage: Boolean; - gcAllowExit: Boolean; - gcWeaponStay: Boolean; - gcMonsters: Boolean; - gcBotsVS: String; - gcDeathmatchKeys: Boolean = True; - gcSpawnInvul: Integer = 0; - gnMap: String; - gnGameMode: String; - gnTimeLimit: Word; - gnGoalLimit: Word; - gnMaxLives: Byte; - gnPlayers: Byte; - gnTeamDamage: Boolean; - gnAllowExit: Boolean; - gnWeaponStay: Boolean; - gnMonsters: Boolean; - gnBotsVS: String; - gnDeathmatchKeys: Boolean = True; - gnSpawnInvul: Integer = 0; gsSDLSampleRate: Integer; gsSDLBufferSize: Integer; gDefaultMegawadStart: AnsiString; gBerserkAutoswitch: Boolean; glNPOTOverride: Boolean = false; + (* Latched game settings *) + gsMap: String; + gsGameMode: String; + gsTimeLimit: Word; + gsGoalLimit: Word; + gsMaxLives: Byte; + gsPlayers: Byte; + gsGameFlags: LongWord; + gsSpawnInvul: Integer = 0; + gsItemRespawnTime: Word = 60; + gsWarmupTime: Word = 30; + implementation uses @@ -258,7 +238,6 @@ begin g_Gibs_SetMax(150); g_Corpses_SetMax(20); gGibsCount := 32; - ITEM_RESPAWNTIME := 60 * 36; gBloodCount := 4; gAdvBlood := True; gAdvCorpses := True; @@ -279,40 +258,21 @@ begin gAskLanguage := True; gLanguage := LANGUAGE_ENGLISH; - (* section GameplayCustom *) - gcMap := ''; - gcGameMode := _lc[I_MENU_GAME_TYPE_DM]; - gcTimeLimit := 0; - gcGoalLimit := 0; - gcMaxLives := 0; - gcPlayers := 1; - gcTeamDamage := False; - gcAllowExit := True; - gcWeaponStay := False; - gcMonsters := False; - gcBotsVS := 'Everybody'; - gcDeathmatchKeys := True; - gcSpawnInvul := 0; - - (* section GameplayNetwork *) - gnMap := ''; - gnGameMode := _lc[I_MENU_GAME_TYPE_DM]; - gnTimeLimit := 0; - gnGoalLimit := 0; - gnMaxLives := 0; - gnPlayers := 1; - gnTeamDamage := False; - gnAllowExit := True; - gnWeaponStay := False; - gnMonsters := False; - gnBotsVS := 'Everybody'; - gnDeathmatchKeys := True; - gnSpawnInvul := 0; + gsMap := ''; + gsGameMode := _lc[I_MENU_GAME_TYPE_DM]; + gsTimeLimit := 0; + gsGoalLimit := 0; + gsMaxLives := 0; + gsPlayers := 1; + gsSpawnInvul := 0; + gsItemRespawnTime := 60; + gsGameFlags := GAME_OPTION_ALLOWEXIT or GAME_OPTION_DMKEYS or + GAME_OPTION_BOTVSPLAYER or GAME_OPTION_BOTVSMONSTER; + gsPlayers := 1; (* section MasterServer *) - NetSlistIP := 'mpms.doom2d.org'; - NetSlistPort := 25665; - g_Net_Slist_Set(NetSlistIP, NetSlistPort, NetSlistList); + NetMasterList := 'mpms.doom2d.org:25665,deadsoftware.ru:25665'; + g_Net_Slist_Set(NetMasterList); (* section Server *) NetServerName := 'Unnamed Server'; @@ -335,458 +295,22 @@ begin NetClientPort := NetPort; end; -procedure g_Options_Read(FileName: String); -var - config: TConfig; - section: String; - - procedure ReadInteger (VAR v: Integer; param: String; minv: Integer = Low(Integer); maxv: Integer = High(Integer)); - begin - v := Max(Min(config.ReadInt(section, param, v), maxv), minv) - end; - - procedure ReadInteger (VAR v: LongWord; param: String; minv: LongWord = Low(LongWord); maxv: LongWord = High(LongWord)); overload; - begin - v := Max(Min(config.ReadInt(section, param, v), maxv), minv) - end; - - procedure ReadInteger (VAR v: Word; param: String; minv: Word = Low(Word); maxv: Word = High(Word)); overload; - begin - v := Max(Min(config.ReadInt(section, param, v), maxv), minv) - end; - - procedure ReadInteger (VAR v: Byte; param: String; minv: Byte = Low(Byte); maxv: Byte = High(Byte)); overload; - begin - v := Max(Min(config.ReadInt(section, param, v), maxv), minv) - end; - - procedure ReadBoolean (VAR v: Boolean; param: String); - begin - v := config.ReadBool(section, param, v) - end; - - procedure ReadString (VAR v: String; param: String); - begin - v := config.ReadStr(section, param, v) - end; - +procedure g_Options_ApplyGameSettings; begin - gAskLanguage := True; - e_WriteLog('Reading config', TMsgType.Notify); - g_Options_SetDefault; - - if FileExists(FileName) = False then - begin - e_WriteLog('Config file '+FileName+' not found', TMsgType.Warning); - g_Options_SetDefaultVideo; - Exit - end; - - config := TConfig.CreateFile(FileName); - - section := 'Player1'; - with gPlayer1Settings do - begin - ReadString(Name, 'name'); - ReadString(Model, 'model'); - ReadInteger(Color.R, 'red', 0, 255); - ReadInteger(Color.G, 'green', 0, 255); - ReadInteger(Color.B, 'blue', 0, 255); - ReadInteger(Team, 'team'); - if (Team < TEAM_RED) or (Team > TEAM_BLUE) then - Team := TEAM_RED; - end; - - section := 'Player2'; - with gPlayer2Settings do - begin - ReadString(Name, 'name'); - ReadString(Model, 'model'); - ReadInteger(Color.R, 'red', 0, 255); - ReadInteger(Color.G, 'green', 0, 255); - ReadInteger(Color.B, 'blue', 0, 255); - ReadInteger(Team, 'team'); - if (Team < TEAM_RED) or (Team > TEAM_BLUE) then - Team := TEAM_RED; - end; - - section := 'GameplayCustom'; - ReadString(gcMap, 'Map'); - ReadString(gcGameMode, 'GameMode'); - ReadInteger(gcTimeLimit, 'TimeLimit', 0, 65535); - ReadInteger(gcGoalLimit, 'GoalLimit', 0, 65535); - ReadInteger(gcMaxLives, 'MaxLives', 0, 255); - ReadInteger(gcPlayers, 'Players', 0, 2); - ReadBoolean(gcTeamDamage, 'TeamDamage'); - ReadBoolean(gcAllowExit, 'AllowExit'); - ReadBoolean(gcWeaponStay, 'WeaponStay'); - ReadBoolean(gcMonsters, 'Monsters'); - ReadString(gcBotsVS, 'BotsVS'); - ReadBoolean(gcDeathmatchKeys, 'DeathmatchKeys'); - ReadInteger(gcSpawnInvul, 'SpawnInvul'); - with gGameSettings do begin - GameMode := g_Game_TextToMode(gcGameMode); + GameMode := g_Game_TextToMode(gsGameMode); if GameMode = GM_NONE then GameMode := GM_DM; if GameMode = GM_SINGLE then GameMode := GM_COOP; - TimeLimit := gcTimeLimit; - GoalLimit := gcGoalLimit; - MaxLives := gcMaxLives; - - Options := 0; - if gcTeamDamage then - Options := Options or GAME_OPTION_TEAMDAMAGE; - if gcAllowExit then - Options := Options or GAME_OPTION_ALLOWEXIT; - if gcWeaponStay then - Options := Options or GAME_OPTION_WEAPONSTAY; - if gcMonsters then - Options := Options or GAME_OPTION_MONSTERS; - if gcBotsVS = 'Everybody' then - Options := Options or GAME_OPTION_BOTVSPLAYER or GAME_OPTION_BOTVSMONSTER; - if gcBotsVS = 'Players' then - Options := Options or GAME_OPTION_BOTVSPLAYER; - if gcBotsVS = 'Monsters' then - Options := Options or GAME_OPTION_BOTVSMONSTER; - if gcDeathmatchKeys then - Options := Options or GAME_OPTION_DMKEYS; - end; - - section := 'GameplayNetwork'; - ReadString(gnMap, 'Map'); - ReadString(gnGameMode, 'GameMode'); - ReadInteger(gnTimeLimit, 'TimeLimit', 0, 65535); - ReadInteger(gnGoalLimit, 'GoalLimit', 0, 65535); - ReadInteger(gnMaxLives, 'MaxLives', 0, 255); - ReadInteger(gnPlayers, 'Players', 0, 2); - ReadBoolean(gnTeamDamage, 'TeamDamage'); - ReadBoolean(gnAllowExit, 'AllowExit'); - ReadBoolean(gnWeaponStay, 'WeaponStay'); - ReadBoolean(gnMonsters, 'Monsters'); - ReadString(gnBotsVS, 'BotsVS'); - ReadBoolean(gnDeathmatchKeys, 'DeathmatchKeys'); - ReadInteger(gnSpawnInvul, 'SpawnInvul'); - - section := 'MasterServer'; - ReadString(NetSlistIP, 'IP'); - ReadInteger(NetSlistPort, 'Port', 0, 65535); - ReadString(NetSlistList, 'List'); - g_Net_Slist_Set(NetSlistIP, NetSlistPort, NetSlistList); - - section := 'Server'; - ReadString(NetServerName, 'Name'); - ReadString(NetPassword, 'Password'); - ReadInteger(NetPort, 'Port', 0, 65535); - ReadInteger(NetMaxClients, 'MaxClients', 0, NET_MAXCLIENTS); - ReadBoolean(NetAllowRCON, 'RCON'); - ReadString(NetRCONPassword, 'RCONPassword'); - ReadBoolean(NetUseMaster, 'SyncWithMaster'); - ReadInteger(NetUpdateRate, 'UpdateInterval', 0); - ReadInteger(NetRelupdRate, 'ReliableUpdateInterval', 0); - ReadInteger(NetMasterRate, 'MasterSyncInterval', 1); - ReadBoolean(NetForwardPorts, 'ForwardPorts'); - - section := 'Client'; - ReadInteger(NetInterpLevel, 'InterpolationSteps', 0); - ReadBoolean(NetForcePlayerUpdate, 'ForcePlayerUpdate'); - ReadBoolean(NetPredictSelf, 'PredictSelf'); - ReadString(NetClientIP, 'LastIP'); - ReadInteger(NetClientPort, 'LastPort', 0, 65535); - - config.Free(); - - //if gTextureFilter then TEXTUREFILTER := GL_LINEAR else TEXTUREFILTER := GL_NEAREST; -end; - -procedure g_Options_Write(FileName: String); - var config: TConfig; -begin - e_WriteLog('Writing config', TMsgType.Notify); - - config := TConfig.CreateFile(FileName); - - with config, gPlayer1Settings do - begin - WriteStr('Player1', 'Name', Name); - WriteStr('Player1', 'model', Model); - WriteInt('Player1', 'red', Color.R); - WriteInt('Player1', 'green', Color.G); - WriteInt('Player1', 'blue', Color.B); - WriteInt('Player1', 'team', Team); - end; - - with config, gPlayer2Settings do - begin - WriteStr('Player2', 'Name', Name); - WriteStr('Player2', 'model', Model); - WriteInt('Player2', 'red', Color.R); - WriteInt('Player2', 'green', Color.G); - WriteInt('Player2', 'blue', Color.B); - WriteInt('Player2', 'team', Team); - end; - - config.WriteStr ('GameplayCustom', 'Map', gcMap); - config.WriteStr ('GameplayCustom', 'GameMode', gcGameMode); - config.WriteInt ('GameplayCustom', 'TimeLimit', gcTimeLimit); - config.WriteInt ('GameplayCustom', 'GoalLimit', gcGoalLimit); - config.WriteInt ('GameplayCustom', 'MaxLives', gcMaxLives); - config.WriteInt ('GameplayCustom', 'Players', gcPlayers); - config.WriteBool('GameplayCustom', 'TeamDamage', gcTeamDamage); - config.WriteBool('GameplayCustom', 'AllowExit', gcAllowExit); - config.WriteBool('GameplayCustom', 'WeaponStay', gcWeaponStay); - config.WriteBool('GameplayCustom', 'Monsters', gcMonsters); - config.WriteStr ('GameplayCustom', 'BotsVS', gcBotsVS); - config.WriteBool('GameplayCustom', 'DeathmatchKeys', gcDeathmatchKeys); - config.WriteInt ('GameplayCustom', 'SpawnInvul', gcSpawnInvul); - - config.WriteStr ('GameplayNetwork', 'Map', gnMap); - config.WriteStr ('GameplayNetwork', 'GameMode', gnGameMode); - config.WriteInt ('GameplayNetwork', 'TimeLimit', gnTimeLimit); - config.WriteInt ('GameplayNetwork', 'GoalLimit', gnGoalLimit); - config.WriteInt ('GameplayNetwork', 'MaxLives', gnMaxLives); - config.WriteInt ('GameplayNetwork', 'Players', gnPlayers); - config.WriteBool('GameplayNetwork', 'TeamDamage', gnTeamDamage); - config.WriteBool('GameplayNetwork', 'AllowExit', gnAllowExit); - config.WriteBool('GameplayNetwork', 'WeaponStay', gnWeaponStay); - config.WriteBool('GameplayNetwork', 'Monsters', gnMonsters); - config.WriteStr ('GameplayNetwork', 'BotsVS', gnBotsVS); - config.WriteBool('GameplayNetwork', 'DeathmatchKeys', gnDeathmatchKeys); - config.WriteInt ('GameplayNetwork', 'SpawnInvul', gnSpawnInvul); - - config.WriteStr('MasterServer', 'IP', NetSlistIP); - config.WriteInt('MasterServer', 'Port', NetSlistPort); - config.WriteStr('MasterServer', 'List', NetSlistList); - - config.WriteStr ('Server', 'Name', NetServerName); - config.WriteStr ('Server', 'Password', NetPassword); - config.WriteInt ('Server', 'Port', NetPort); - config.WriteInt ('Server', 'MaxClients', NetMaxClients); - config.WriteBool('Server', 'RCON', NetAllowRCON); - config.WriteStr ('Server', 'RCONPassword', NetRCONPassword); - config.WriteBool('Server', 'SyncWithMaster', NetUseMaster); - config.WriteBool('Server', 'ForwardPorts', NetForwardPorts); - config.WriteInt ('Server', 'UpdateInterval', NetUpdateRate); - config.WriteInt ('Server', 'ReliableUpdateInterval', NetRelupdRate); - config.WriteInt ('Server', 'MasterSyncInterval', NetMasterRate); - - config.WriteInt ('Client', 'InterpolationSteps', NetInterpLevel); - config.WriteBool ('Client', 'ForcePlayerUpdate', NetForcePlayerUpdate); - config.WriteBool ('Client', 'PredictSelf', NetPredictSelf); - config.WriteStr ('Client', 'LastIP', NetClientIP); - config.WriteInt ('Client', 'LastPort', NetClientPort); - - config.SaveFile(FileName); - config.Free(); -end; - -procedure g_Options_Write_Gameplay_Custom(FileName: String); -var - config: TConfig; -begin - e_WriteLog('Writing custom gameplay config', TMsgType.Notify); - - config := TConfig.CreateFile(FileName); - - config.WriteStr ('GameplayCustom', 'Map', gcMap); - config.WriteStr ('GameplayCustom', 'GameMode', gcGameMode); - config.WriteInt ('GameplayCustom', 'TimeLimit', gcTimeLimit); - config.WriteInt ('GameplayCustom', 'GoalLimit', gcGoalLimit); - config.WriteInt ('GameplayCustom', 'MaxLives', gcMaxLives); - config.WriteInt ('GameplayCustom', 'Players', gcPlayers); - config.WriteBool('GameplayCustom', 'TeamDamage', gcTeamDamage); - config.WriteBool('GameplayCustom', 'AllowExit', gcAllowExit); - config.WriteBool('GameplayCustom', 'WeaponStay', gcWeaponStay); - config.WriteBool('GameplayCustom', 'Monsters', gcMonsters); - config.WriteStr ('GameplayCustom', 'BotsVS', gcBotsVS); - config.WriteBool('GameplayCustom', 'DeathmatchKeys', gcDeathmatchKeys); - config.WriteInt ('GameplayCustom', 'SpawnInvul', gcSpawnInvul); - - config.SaveFile(FileName); - config.Free(); -end; - -procedure g_Options_Write_Gameplay_Net(FileName: String); -var - config: TConfig; -begin - e_WriteLog('Writing network gameplay config', TMsgType.Notify); - - config := TConfig.CreateFile(FileName); - - config.WriteStr ('GameplayNetwork', 'Map', gnMap); - config.WriteStr ('GameplayNetwork', 'GameMode', gnGameMode); - config.WriteInt ('GameplayNetwork', 'TimeLimit', gnTimeLimit); - config.WriteInt ('GameplayNetwork', 'GoalLimit', gnGoalLimit); - config.WriteInt ('GameplayNetwork', 'MaxLives', gnMaxLives); - config.WriteInt ('GameplayNetwork', 'Players', gnPlayers); - config.WriteBool('GameplayNetwork', 'TeamDamage', gnTeamDamage); - config.WriteBool('GameplayNetwork', 'AllowExit', gnAllowExit); - config.WriteBool('GameplayNetwork', 'WeaponStay', gnWeaponStay); - config.WriteBool('GameplayNetwork', 'Monsters', gnMonsters); - config.WriteStr ('GameplayNetwork', 'BotsVS', gnBotsVS); - config.WriteBool('GameplayNetwork', 'DeathmatchKeys', gnDeathmatchKeys); - config.WriteInt ('GameplayNetwork', 'SpawnInvul', gnSpawnInvul); - - config.SaveFile(FileName); - config.Free(); -end; - -procedure g_Options_Write_Net_Server(FileName: String); -var - config: TConfig; -begin - e_WriteLog('Writing server config', TMsgType.Notify); - - config := TConfig.CreateFile(FileName); - - config.WriteStr ('Server', 'Name', NetServerName); - config.WriteStr ('Server', 'Password', NetPassword); - config.WriteInt ('Server', 'Port', NetPort); - config.WriteInt ('Server', 'MaxClients', NetMaxClients); - config.WriteBool('Server', 'SyncWithMaster', NetUseMaster); - config.WriteBool('Server', 'ForwardPorts', NetForwardPorts); - - config.SaveFile(FileName); - config.Free(); -end; - -procedure g_Options_Write_Net_Client(FileName: String); -var - config: TConfig; -begin - e_WriteLog('Writing client config', TMsgType.Notify); - - config := TConfig.CreateFile(FileName); - - config.WriteStr('Client', 'LastIP', NetClientIP); - config.WriteInt('Client', 'LastPort', NetClientPort); - - config.SaveFile(FileName); - config.Free(); -end; - -procedure g_Options_Commands (p: SSArray); - var cmd: AnsiString; i: Integer; -begin - cmd := LowerCase(p[0]); - case cmd of - 'r_reset': - begin - sys_EnableVSync(gVSync); - gRC_Width := Max(1, gRC_Width); - gRC_Height := Max(1, gRC_Height); - gBPP := Max(1, gBPP); - if sys_SetDisplayMode(gRC_Width, gRC_Height, gBPP, gRC_FullScreen, gRC_Maximized) = True then - e_LogWriteln('resolution changed') - else - e_LogWriteln('resolution not changed') - end; - 'g_language': - begin - if Length(p) = 2 then - begin - gAskLanguage := true; - gLanguage := LANGUAGE_ENGLISH; - case LowerCase(p[1]) of - 'english': - begin - gAskLanguage := false; - gLanguage := LANGUAGE_ENGLISH; - end; - 'russian': - begin - gAskLanguage := false; - gLanguage := LANGUAGE_RUSSIAN; - end; - 'ask': - begin - gAskLanguage := true; - gLanguage := LANGUAGE_ENGLISH; - end; - end; - g_Language_Set(gLanguage) - end - else - begin - e_LogWritefln('usage: %s ', [cmd]) - end - end; - 'g_max_particles': - begin - if Length(p) = 2 then - begin - i := Max(0, StrToInt(p[1])); - g_GFX_SetMax(i) - end - else if Length(p) = 1 then - begin - e_LogWritefln('%s', [g_GFX_GetMax()]) - end - else - begin - e_LogWritefln('usage: %s ', [cmd]) - end - end; - 'g_max_shells': - begin - if Length(p) = 2 then - begin - i := Max(0, StrToInt(p[1])); - g_Shells_SetMax(i) - end - else if Length(p) = 1 then - begin - e_LogWritefln('%s', [g_Shells_GetMax()]) - end - else - begin - e_LogWritefln('usage: %s ', [cmd]) - end - end; - 'g_max_gibs': - begin - if Length(p) = 2 then - begin - i := Max(0, StrToInt(p[1])); - g_Gibs_SetMax(i) - end - else if Length(p) = 1 then - begin - e_LogWritefln('%s', [g_Gibs_GetMax()]) - end - else - begin - e_LogWritefln('usage: %s ', [cmd]) - end - end; - 'g_max_corpses': - begin - if Length(p) = 2 then - begin - i := Max(0, StrToInt(p[1])); - g_Corpses_SetMax(i) - end - else if Length(p) = 1 then - begin - e_LogWritefln('%s', [g_Corpses_GetMax()]) - end - else - begin - e_LogWritefln('usage: %s ', [cmd]) - end - end; - 'g_item_respawn_time': - begin - if Length(p) = 2 then - ITEM_RESPAWNTIME := Max(0, StrToInt(p[1])) * 36 - else if Length(p) = 1 then - e_LogWritefln('%s', [ITEM_RESPAWNTIME div 36]) - else - e_LogWritefln('usage: %s ', [cmd]) - end; + TimeLimit := gsTimeLimit; + GoalLimit := gsGoalLimit; + MaxLives := gsMaxLives; + SpawnInvul := gsSpawnInvul; + ItemRespawnTime := gsItemRespawnTime; + WarmupTime := gsWarmupTime; + Options := gsGameFlags; end; end; @@ -835,4 +359,5 @@ initialization conRegVar('g_default_megawad', @gDefaultMegawadStart, '', ''); conRegVar('g_save_stats', @gSaveStats, '', ''); conRegVar('g_screenshot_stats', @gScreenshotStats, '', ''); + conRegVar('g_lastmap', @gsMap, '', ''); end.