dxx-rebirth/similar/main/config.cpp

315 lines
13 KiB
C++
Raw Normal View History

2006-03-20 17:12:09 +00:00
/*
2014-06-01 17:55:23 +00:00
* Portions of this file are copyright Rebirth contributors and licensed as
* described in COPYING.txt.
* Portions of this file are copyright Parallax Software and licensed
* according to the Parallax license below.
* See COPYING.txt for license details.
2006-03-20 17:12:09 +00:00
THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
*/
/*
*
* contains routine(s) to read in the configuration file which contains
* game configuration stuff like detail level, sound card, etc
*
*/
#include <memory>
2006-03-20 17:12:09 +00:00
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "config.h"
2006-03-20 17:12:09 +00:00
#include "pstypes.h"
#include "game.h"
#include "songs.h"
2006-03-20 17:12:09 +00:00
#include "kconfig.h"
#include "palette.h"
#include "digi.h"
2006-03-20 17:12:09 +00:00
#include "mission.h"
2013-12-26 04:18:28 +00:00
#include "u_mem.h"
2006-03-20 17:12:09 +00:00
#include "physfsx.h"
#include "nvparse.h"
#include "ogl_init.h"
#include <memory>
2014-08-16 04:15:16 +00:00
namespace dcx {
CCfg CGameCfg;
}
2015-12-13 18:00:49 +00:00
namespace dsx {
Cfg GameCfg;
2006-03-20 17:12:09 +00:00
#define DigiVolumeStr "DigiVolume"
#define MusicVolumeStr "MusicVolume"
#define ReverseStereoStr "ReverseStereo"
#define OrigTrackOrderStr "OrigTrackOrder"
#define MusicTypeStr "MusicType"
#define CMLevelMusicPlayOrderStr "CMLevelMusicPlayOrder"
#define CMLevelMusicTrack0Str "CMLevelMusicTrack0"
#define CMLevelMusicTrack1Str "CMLevelMusicTrack1"
#define CMLevelMusicPathStr "CMLevelMusicPath"
#define CMMiscMusic0Str "CMMiscMusic0"
#define CMMiscMusic1Str "CMMiscMusic1"
#define CMMiscMusic2Str "CMMiscMusic2"
#define CMMiscMusic3Str "CMMiscMusic3"
#define CMMiscMusic4Str "CMMiscMusic4"
#define GammaLevelStr "GammaLevel"
#define LastPlayerStr "LastPlayer"
#define LastMissionStr "LastMission"
#define ResolutionXStr "ResolutionX"
#define ResolutionYStr "ResolutionY"
#define AspectXStr "AspectX"
#define AspectYStr "AspectY"
#define WindowModeStr "WindowMode"
#define TexFiltStr "TexFilt"
#define TexAnisStr "TexAnisotropy"
#if defined(DXX_BUILD_DESCENT_II)
#define MovieTexFiltStr "MovieTexFilt"
#define MovieSubtitlesStr "MovieSubtitles"
#endif
#if DXX_USE_ADLMIDI
#define ADLMIDINumChipsStr "ADLMIDI_NumberOfChips"
#define ADLMIDIBankStr "ADLMIDI_Bank"
#define ADLMIDIEnabledStr "ADLMIDI_Enabled"
#endif
#define VSyncStr "VSync"
#define MultisampleStr "Multisample"
#define FPSIndicatorStr "FPSIndicator"
#define GrabinputStr "GrabInput"
2006-03-20 17:12:09 +00:00
int ReadConfigFile()
{
// set defaults
GameCfg.DigiVolume = 8;
GameCfg.MusicVolume = 8;
GameCfg.ReverseStereo = 0;
GameCfg.OrigTrackOrder = 0;
#if DXX_USE_SDL_REDBOOK_AUDIO && defined(__APPLE__) && defined(__MACH__)
GameCfg.MusicType = MUSIC_TYPE_REDBOOK;
#else
GameCfg.MusicType = MUSIC_TYPE_BUILTIN;
#endif
2020-05-31 23:04:25 +00:00
CGameCfg.CMLevelMusicPlayOrder = LevelMusicPlayOrder::Continuous;
2016-08-06 19:55:25 +00:00
CGameCfg.CMLevelMusicTrack[0] = -1;
CGameCfg.CMLevelMusicTrack[1] = -1;
2016-08-06 19:55:25 +00:00
CGameCfg.CMLevelMusicPath = {};
2016-08-06 19:55:25 +00:00
CGameCfg.CMMiscMusic = {};
#if defined(__APPLE__) && defined(__MACH__)
2016-08-06 19:55:25 +00:00
const auto userdir = PHYSFS_getUserDir();
GameCfg.OrigTrackOrder = 1;
#if defined(DXX_BUILD_DESCENT_I)
2020-05-31 23:04:25 +00:00
CGameCfg.CMLevelMusicPlayOrder = LevelMusicPlayOrder::Level;
2016-08-06 19:55:25 +00:00
CGameCfg.CMLevelMusicPath = "descent.m3u";
2016-08-06 19:55:25 +00:00
snprintf(CGameCfg.CMMiscMusic[SONG_TITLE].data(), CGameCfg.CMMiscMusic[SONG_TITLE].size(), "%s%s", userdir, "Music/iTunes/iTunes Music/Insanity/Descent/02 Primitive Rage.mp3");
snprintf(CGameCfg.CMMiscMusic[SONG_CREDITS].data(), CGameCfg.CMMiscMusic[SONG_CREDITS].size(), "%s%s", userdir, "Music/iTunes/iTunes Music/Insanity/Descent/05 The Darkness Of Space.mp3");
#elif defined(DXX_BUILD_DESCENT_II)
2016-08-06 19:55:25 +00:00
CGameCfg.CMLevelMusicPath = "descent2.m3u";
2016-08-06 19:55:25 +00:00
snprintf(CGameCfg.CMMiscMusic[SONG_TITLE].data(), CGameCfg.CMMiscMusic[SONG_TITLE].size(), "%s%s", userdir, "Music/iTunes/iTunes Music/Redbook Soundtrack/Descent II, Macintosh CD-ROM/02 Title.mp3");
snprintf(CGameCfg.CMMiscMusic[SONG_CREDITS].data(), CGameCfg.CMMiscMusic[SONG_CREDITS].size(), "%s%s", userdir, "Music/iTunes/iTunes Music/Redbook Soundtrack/Descent II, Macintosh CD-ROM/03 Crawl.mp3");
#endif
2016-08-06 19:55:25 +00:00
snprintf(CGameCfg.CMMiscMusic[SONG_BRIEFING].data(), CGameCfg.CMMiscMusic[SONG_BRIEFING].size(), "%s%s", userdir, "Music/iTunes/iTunes Music/Insanity/Descent/03 Outerlimits.mp3");
snprintf(CGameCfg.CMMiscMusic[SONG_ENDLEVEL].data(), CGameCfg.CMMiscMusic[SONG_ENDLEVEL].size(), "%s%s", userdir, "Music/iTunes/iTunes Music/Insanity/Descent/04 Close Call.mp3");
snprintf(CGameCfg.CMMiscMusic[SONG_ENDGAME].data(), CGameCfg.CMMiscMusic[SONG_ENDGAME].size(), "%s%s", userdir, "Music/iTunes/iTunes Music/Insanity/Descent/14 Insanity.mp3");
#endif
2020-12-27 22:03:09 +00:00
CGameCfg.GammaLevel = 0;
2015-09-29 02:41:22 +00:00
GameCfg.LastPlayer = {};
2016-08-06 19:55:25 +00:00
CGameCfg.LastMission = "";
2021-01-25 00:45:07 +00:00
CGameCfg.ResolutionX = 1024;
CGameCfg.ResolutionY = 768;
GameCfg.AspectX = 3;
GameCfg.AspectY = 4;
2015-12-18 04:08:23 +00:00
CGameCfg.WindowMode = false;
CGameCfg.TexFilt = opengl_texture_filter::classic;
CGameCfg.TexAnisotropy = 0;
#if defined(DXX_BUILD_DESCENT_II)
GameCfg.MovieTexFilt = 0;
GameCfg.MovieSubtitles = 0;
#endif
2015-07-18 03:49:47 +00:00
CGameCfg.VSync = false;
2016-10-02 19:35:33 +00:00
CGameCfg.Multisample = 0;
2016-10-02 19:35:33 +00:00
CGameCfg.FPSIndicator = 0;
CGameCfg.Grabinput = true;
2006-03-20 17:12:09 +00:00
auto infile = PHYSFSX_openReadBuffered("descent.cfg").first;
if (!infile)
{
2006-03-20 17:12:09 +00:00
return 1;
}
2014-09-07 19:48:10 +00:00
// to be fully safe, assume the whole cfg consists of one big line
for (PHYSFSX_gets_line_t<0> line(PHYSFS_fileLength(infile) + 1); const char *const eol = PHYSFSX_fgets(line, infile);)
2006-03-20 17:12:09 +00:00
{
const auto lb = line.begin();
if (eol == line.end())
continue;
auto eq = std::find(lb, eol, '=');
if (eq == eol)
continue;
auto value = std::next(eq);
if (cmp(lb, eq, DigiVolumeStr))
convert_integer(GameCfg.DigiVolume, value);
else if (cmp(lb, eq, MusicVolumeStr))
convert_integer(GameCfg.MusicVolume, value);
else if (cmp(lb, eq, ReverseStereoStr))
convert_integer(GameCfg.ReverseStereo, value);
else if (cmp(lb, eq, OrigTrackOrderStr))
convert_integer(GameCfg.OrigTrackOrder, value);
else if (cmp(lb, eq, MusicTypeStr))
convert_integer(GameCfg.MusicType, value);
else if (cmp(lb, eq, CMLevelMusicPlayOrderStr))
2020-05-31 23:04:25 +00:00
{
unsigned CMLevelMusicPlayOrder;
if (convert_integer(CMLevelMusicPlayOrder, value) && CMLevelMusicPlayOrder <= static_cast<unsigned>(LevelMusicPlayOrder::Random))
CGameCfg.CMLevelMusicPlayOrder = static_cast<LevelMusicPlayOrder>(CMLevelMusicPlayOrder);
}
else if (cmp(lb, eq, CMLevelMusicTrack0Str))
2016-08-06 19:55:25 +00:00
convert_integer(CGameCfg.CMLevelMusicTrack[0], value);
else if (cmp(lb, eq, CMLevelMusicTrack1Str))
2016-08-06 19:55:25 +00:00
convert_integer(CGameCfg.CMLevelMusicTrack[1], value);
else if (cmp(lb, eq, CMLevelMusicPathStr))
2016-08-06 19:55:25 +00:00
convert_string(CGameCfg.CMLevelMusicPath, value, eol);
else if (cmp(lb, eq, CMMiscMusic0Str))
2016-08-06 19:55:25 +00:00
convert_string(CGameCfg.CMMiscMusic[SONG_TITLE], value, eol);
else if (cmp(lb, eq, CMMiscMusic1Str))
2016-08-06 19:55:25 +00:00
convert_string(CGameCfg.CMMiscMusic[SONG_BRIEFING], value, eol);
else if (cmp(lb, eq, CMMiscMusic2Str))
2016-08-06 19:55:25 +00:00
convert_string(CGameCfg.CMMiscMusic[SONG_ENDLEVEL], value, eol);
else if (cmp(lb, eq, CMMiscMusic3Str))
2016-08-06 19:55:25 +00:00
convert_string(CGameCfg.CMMiscMusic[SONG_ENDGAME], value, eol);
else if (cmp(lb, eq, CMMiscMusic4Str))
2016-08-06 19:55:25 +00:00
convert_string(CGameCfg.CMMiscMusic[SONG_CREDITS], value, eol);
else if (cmp(lb, eq, GammaLevelStr))
{
2020-12-27 22:03:09 +00:00
convert_integer(CGameCfg.GammaLevel, value);
gr_palette_set_gamma(CGameCfg.GammaLevel);
}
else if (cmp(lb, eq, LastPlayerStr))
GameCfg.LastPlayer.copy_lower(value, std::distance(value, eol));
else if (cmp(lb, eq, LastMissionStr))
2016-08-06 19:55:25 +00:00
convert_string(CGameCfg.LastMission, value, eol);
else if (cmp(lb, eq, ResolutionXStr))
2021-01-25 00:45:07 +00:00
convert_integer(CGameCfg.ResolutionX, value);
else if (cmp(lb, eq, ResolutionYStr))
2021-01-25 00:45:07 +00:00
convert_integer(CGameCfg.ResolutionY, value);
else if (cmp(lb, eq, AspectXStr))
convert_integer(GameCfg.AspectX, value);
else if (cmp(lb, eq, AspectYStr))
convert_integer(GameCfg.AspectY, value);
else if (cmp(lb, eq, WindowModeStr))
2015-12-18 04:08:23 +00:00
convert_integer(CGameCfg.WindowMode, value);
else if (cmp(lb, eq, TexFiltStr))
{
uint8_t TexFilt;
if (convert_integer(TexFilt, value))
{
switch (TexFilt)
{
case static_cast<unsigned>(opengl_texture_filter::classic):
case static_cast<unsigned>(opengl_texture_filter::upscale):
case static_cast<unsigned>(opengl_texture_filter::trilinear):
CGameCfg.TexFilt = opengl_texture_filter{TexFilt};
break;
}
}
}
else if (cmp(lb, eq, TexAnisStr))
convert_integer(CGameCfg.TexAnisotropy, value);
#if defined(DXX_BUILD_DESCENT_II)
else if (cmp(lb, eq, MovieTexFiltStr))
convert_integer(GameCfg.MovieTexFilt, value);
else if (cmp(lb, eq, MovieSubtitlesStr))
convert_integer(GameCfg.MovieSubtitles, value);
#endif
#if DXX_USE_ADLMIDI
else if (cmp(lb, eq, ADLMIDINumChipsStr))
convert_integer(CGameCfg.ADLMIDI_num_chips, value);
else if (cmp(lb, eq, ADLMIDIBankStr))
convert_integer(CGameCfg.ADLMIDI_bank, value);
else if (cmp(lb, eq, ADLMIDIEnabledStr))
convert_integer(CGameCfg.ADLMIDI_enabled, value);
#endif
else if (cmp(lb, eq, VSyncStr))
2015-07-18 03:49:47 +00:00
convert_integer(CGameCfg.VSync, value);
else if (cmp(lb, eq, MultisampleStr))
2016-10-02 19:35:33 +00:00
convert_integer(CGameCfg.Multisample, value);
else if (cmp(lb, eq, FPSIndicatorStr))
2016-10-02 19:35:33 +00:00
convert_integer(CGameCfg.FPSIndicator, value);
else if (cmp(lb, eq, GrabinputStr))
convert_integer(CGameCfg.Grabinput, value);
2006-03-20 17:12:09 +00:00
}
if ( GameCfg.DigiVolume > 8 ) GameCfg.DigiVolume = 8;
if ( GameCfg.MusicVolume > 8 ) GameCfg.MusicVolume = 8;
2006-03-20 17:12:09 +00:00
2021-01-25 00:45:07 +00:00
if (CGameCfg.ResolutionX >= 320 && CGameCfg.ResolutionY >= 200)
2015-05-14 02:23:13 +00:00
{
2021-01-25 00:45:07 +00:00
Game_screen_mode.width = CGameCfg.ResolutionX;
Game_screen_mode.height = CGameCfg.ResolutionY;
2015-05-14 02:23:13 +00:00
}
2006-03-20 17:12:09 +00:00
return 0;
}
int WriteConfigFile()
{
2020-12-27 22:03:09 +00:00
CGameCfg.GammaLevel = gr_palette_get_gamma();
auto infile = PHYSFSX_openWriteBuffered("descent.cfg").first;
if (!infile)
{
2006-03-20 17:12:09 +00:00
return 1;
}
PHYSFSX_printf(infile, "%s=%d\n", DigiVolumeStr, GameCfg.DigiVolume);
PHYSFSX_printf(infile, "%s=%d\n", MusicVolumeStr, GameCfg.MusicVolume);
PHYSFSX_printf(infile, "%s=%d\n", ReverseStereoStr, GameCfg.ReverseStereo);
PHYSFSX_printf(infile, "%s=%d\n", OrigTrackOrderStr, GameCfg.OrigTrackOrder);
PHYSFSX_printf(infile, "%s=%d\n", MusicTypeStr, GameCfg.MusicType);
2020-05-31 23:04:25 +00:00
PHYSFSX_printf(infile, "%s=%d\n", CMLevelMusicPlayOrderStr, static_cast<int>(CGameCfg.CMLevelMusicPlayOrder));
2016-08-06 19:55:25 +00:00
PHYSFSX_printf(infile, "%s=%d\n", CMLevelMusicTrack0Str, CGameCfg.CMLevelMusicTrack[0]);
PHYSFSX_printf(infile, "%s=%d\n", CMLevelMusicTrack1Str, CGameCfg.CMLevelMusicTrack[1]);
2016-08-06 19:55:25 +00:00
PHYSFSX_printf(infile, "%s=%s\n", CMLevelMusicPathStr, CGameCfg.CMLevelMusicPath.data());
2016-08-06 19:55:25 +00:00
PHYSFSX_printf(infile, "%s=%s\n", CMMiscMusic0Str, CGameCfg.CMMiscMusic[SONG_TITLE].data());
PHYSFSX_printf(infile, "%s=%s\n", CMMiscMusic1Str, CGameCfg.CMMiscMusic[SONG_BRIEFING].data());
PHYSFSX_printf(infile, "%s=%s\n", CMMiscMusic2Str, CGameCfg.CMMiscMusic[SONG_ENDLEVEL].data());
PHYSFSX_printf(infile, "%s=%s\n", CMMiscMusic3Str, CGameCfg.CMMiscMusic[SONG_ENDGAME].data());
PHYSFSX_printf(infile, "%s=%s\n", CMMiscMusic4Str, CGameCfg.CMMiscMusic[SONG_CREDITS].data());
2020-12-27 22:03:09 +00:00
PHYSFSX_printf(infile, "%s=%d\n", GammaLevelStr, CGameCfg.GammaLevel);
PHYSFSX_printf(infile, "%s=%s\n", LastPlayerStr, static_cast<const char *>(InterfaceUniqueState.PilotName));
2016-08-06 19:55:25 +00:00
PHYSFSX_printf(infile, "%s=%s\n", LastMissionStr, static_cast<const char *>(CGameCfg.LastMission));
PHYSFSX_printf(infile, "%s=%i\n", ResolutionXStr, SM_W(Game_screen_mode));
PHYSFSX_printf(infile, "%s=%i\n", ResolutionYStr, SM_H(Game_screen_mode));
PHYSFSX_printf(infile, "%s=%i\n", AspectXStr, GameCfg.AspectX);
PHYSFSX_printf(infile, "%s=%i\n", AspectYStr, GameCfg.AspectY);
2015-12-18 04:08:23 +00:00
PHYSFSX_printf(infile, "%s=%i\n", WindowModeStr, CGameCfg.WindowMode);
PHYSFSX_printf(infile, "%s=%i\n", TexFiltStr, static_cast<unsigned>(CGameCfg.TexFilt));
PHYSFSX_printf(infile, "%s=%i\n", TexAnisStr, CGameCfg.TexAnisotropy);
#if defined(DXX_BUILD_DESCENT_II)
PHYSFSX_printf(infile, "%s=%i\n", MovieTexFiltStr, GameCfg.MovieTexFilt);
PHYSFSX_printf(infile, "%s=%i\n", MovieSubtitlesStr, GameCfg.MovieSubtitles);
#endif
#if DXX_USE_ADLMIDI
PHYSFSX_printf(infile, "%s=%i\n", ADLMIDINumChipsStr, CGameCfg.ADLMIDI_num_chips);
PHYSFSX_printf(infile, "%s=%i\n", ADLMIDIBankStr, CGameCfg.ADLMIDI_bank);
PHYSFSX_printf(infile, "%s=%i\n", ADLMIDIEnabledStr, CGameCfg.ADLMIDI_enabled);
#endif
2015-07-18 03:49:47 +00:00
PHYSFSX_printf(infile, "%s=%i\n", VSyncStr, CGameCfg.VSync);
2016-10-02 19:35:33 +00:00
PHYSFSX_printf(infile, "%s=%i\n", MultisampleStr, CGameCfg.Multisample);
2016-10-02 19:35:33 +00:00
PHYSFSX_printf(infile, "%s=%i\n", FPSIndicatorStr, CGameCfg.FPSIndicator);
PHYSFSX_printf(infile, "%s=%i\n", GrabinputStr, CGameCfg.Grabinput);
2006-03-20 17:12:09 +00:00
return 0;
}
}