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
*
*/
2014-07-05 16:58:47 +00:00
# include <memory>
2006-03-20 17:12:09 +00:00
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <ctype.h>
2010-09-17 10:44:21 +00:00
2008-04-06 20:23:28 +00:00
# include "config.h"
2006-03-20 17:12:09 +00:00
# include "pstypes.h"
# include "game.h"
2010-06-14 08:13:16 +00:00
# include "songs.h"
2006-03-20 17:12:09 +00:00
# include "kconfig.h"
# include "palette.h"
# include "args.h"
# include "player.h"
2015-07-25 23:10:45 +00:00
# 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"
2014-12-22 04:35:47 +00:00
# include "nvparse.h"
2006-03-20 17:12:09 +00:00
2014-08-16 04:15:16 +00:00
# include "compiler-make_unique.h"
2016-01-29 04:05:47 +00:00
namespace dcx {
CCfg CGameCfg ;
}
2015-12-13 18:00:48 +00:00
2015-12-13 18:00:49 +00:00
namespace dsx {
2015-12-13 18:00:48 +00:00
Cfg GameCfg ;
2006-03-20 17:12:09 +00:00
2014-12-20 04:36:11 +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"
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2014-12-20 04:36:11 +00:00
# define MovieTexFiltStr "MovieTexFilt"
# define MovieSubtitlesStr "MovieSubtitles"
2013-03-03 01:03:33 +00:00
# endif
2014-12-20 04:36:11 +00:00
# define VSyncStr "VSync"
# define MultisampleStr "Multisample"
# define FPSIndicatorStr "FPSIndicator"
# define GrabinputStr "GrabInput"
2006-03-20 17:12:09 +00:00
int ReadConfigFile ( )
{
2008-04-06 20:23:28 +00:00
// set defaults
GameCfg . DigiVolume = 8 ;
2008-05-24 08:59:35 +00:00
GameCfg . MusicVolume = 8 ;
2008-04-06 20:23:28 +00:00
GameCfg . ReverseStereo = 0 ;
2010-06-14 08:13:16 +00:00
GameCfg . OrigTrackOrder = 0 ;
2010-11-21 12:02:58 +00:00
# if defined(__APPLE__) && defined(__MACH__)
GameCfg . MusicType = MUSIC_TYPE_REDBOOK ;
# else
GameCfg . MusicType = MUSIC_TYPE_BUILTIN ;
# endif
2010-06-14 08:13:16 +00:00
GameCfg . CMLevelMusicPlayOrder = MUSIC_CM_PLAYORDER_CONT ;
GameCfg . CMLevelMusicTrack [ 0 ] = - 1 ;
GameCfg . CMLevelMusicTrack [ 1 ] = - 1 ;
2014-12-22 04:35:47 +00:00
GameCfg . CMLevelMusicPath = { } ;
2014-12-22 04:35:48 +00:00
GameCfg . CMMiscMusic = { } ;
2010-09-17 10:14:37 +00:00
# if defined(__APPLE__) && defined(__MACH__)
GameCfg . OrigTrackOrder = 1 ;
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_I)
GameCfg . CMLevelMusicPlayOrder = MUSIC_CM_PLAYORDER_LEVEL ;
2014-12-22 04:35:47 +00:00
GameCfg . CMLevelMusicPath = " descent.m3u " ;
2014-12-22 04:35:48 +00:00
snprintf ( GameCfg . CMMiscMusic [ SONG_TITLE ] . data ( ) , GameCfg . CMMiscMusic [ SONG_TITLE ] . size ( ) , " %s%s " , PHYSFS_getUserDir ( ) , " Music/iTunes/iTunes Music/Insanity/Descent/02 Primitive Rage.mp3 " ) ;
snprintf ( GameCfg . CMMiscMusic [ SONG_CREDITS ] . data ( ) , GameCfg . CMMiscMusic [ SONG_CREDITS ] . size ( ) , " %s%s " , PHYSFS_getUserDir ( ) , " Music/iTunes/iTunes Music/Insanity/Descent/05 The Darkness Of Space.mp3 " ) ;
2013-03-03 01:03:33 +00:00
# elif defined(DXX_BUILD_DESCENT_II)
2014-12-22 04:35:47 +00:00
GameCfg . CMLevelMusicPath = " descent2.m3u " ;
2014-12-22 04:35:48 +00:00
snprintf ( GameCfg . CMMiscMusic [ SONG_TITLE ] . data ( ) , GameCfg . CMMiscMusic [ SONG_TITLE ] . size ( ) , " %s%s " , PHYSFS_getUserDir ( ) , " Music/iTunes/iTunes Music/Redbook Soundtrack/Descent II, Macintosh CD-ROM/02 Title.mp3 " ) ;
snprintf ( GameCfg . CMMiscMusic [ SONG_CREDITS ] . data ( ) , GameCfg . CMMiscMusic [ SONG_CREDITS ] . size ( ) , " %s%s " , PHYSFS_getUserDir ( ) , " Music/iTunes/iTunes Music/Redbook Soundtrack/Descent II, Macintosh CD-ROM/03 Crawl.mp3 " ) ;
2013-03-03 01:03:33 +00:00
# endif
2014-12-22 04:35:48 +00:00
snprintf ( GameCfg . CMMiscMusic [ SONG_BRIEFING ] . data ( ) , GameCfg . CMMiscMusic [ SONG_BRIEFING ] . size ( ) , " %s%s " , PHYSFS_getUserDir ( ) , " Music/iTunes/iTunes Music/Insanity/Descent/03 Outerlimits.mp3 " ) ;
snprintf ( GameCfg . CMMiscMusic [ SONG_ENDLEVEL ] . data ( ) , GameCfg . CMMiscMusic [ SONG_ENDLEVEL ] . size ( ) , " %s%s " , PHYSFS_getUserDir ( ) , " Music/iTunes/iTunes Music/Insanity/Descent/04 Close Call.mp3 " ) ;
snprintf ( GameCfg . CMMiscMusic [ SONG_ENDGAME ] . data ( ) , GameCfg . CMMiscMusic [ SONG_ENDGAME ] . size ( ) , " %s%s " , PHYSFS_getUserDir ( ) , " Music/iTunes/iTunes Music/Insanity/Descent/14 Insanity.mp3 " ) ;
2010-09-17 10:14:37 +00:00
# endif
2008-04-06 20:23:28 +00:00
GameCfg . GammaLevel = 0 ;
2015-09-29 02:41:22 +00:00
GameCfg . LastPlayer = { } ;
2015-03-22 18:49:20 +00:00
GameCfg . LastMission = " " ;
2008-04-06 20:23:28 +00:00
GameCfg . ResolutionX = 640 ;
GameCfg . ResolutionY = 480 ;
GameCfg . AspectX = 3 ;
GameCfg . AspectY = 4 ;
2015-12-18 04:08:23 +00:00
CGameCfg . WindowMode = false ;
2015-12-18 04:08:23 +00:00
CGameCfg . TexFilt = 0 ;
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2010-09-02 13:55:28 +00:00
GameCfg . MovieTexFilt = 0 ;
GameCfg . MovieSubtitles = 0 ;
2013-03-03 01:03:33 +00:00
# endif
2015-07-18 03:49:47 +00:00
CGameCfg . VSync = false ;
2008-04-22 08:29:29 +00:00
GameCfg . Multisample = 0 ;
2011-02-14 21:27:07 +00:00
GameCfg . FPSIndicator = 0 ;
2015-07-18 21:01:56 +00:00
CGameCfg . Grabinput = true ;
2010-06-14 08:13:16 +00:00
2006-03-20 17:12:09 +00:00
2015-01-17 18:31:42 +00:00
auto infile = PHYSFSX_openReadBuffered ( " descent.cfg " ) ;
2015-01-17 18:31:42 +00:00
if ( ! infile )
{
2006-03-20 17:12:09 +00:00
return 1 ;
}
2007-07-26 23:57:29 +00:00
2014-09-07 19:48:10 +00:00
// to be fully safe, assume the whole cfg consists of one big line
2015-10-09 02:46:11 +00:00
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
{
2014-12-22 04:35:47 +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 ) )
convert_integer ( GameCfg . CMLevelMusicPlayOrder , value ) ;
else if ( cmp ( lb , eq , CMLevelMusicTrack0Str ) )
convert_integer ( GameCfg . CMLevelMusicTrack [ 0 ] , value ) ;
else if ( cmp ( lb , eq , CMLevelMusicTrack1Str ) )
convert_integer ( GameCfg . CMLevelMusicTrack [ 1 ] , value ) ;
else if ( cmp ( lb , eq , CMLevelMusicPathStr ) )
convert_string ( GameCfg . CMLevelMusicPath , value , eol ) ;
else if ( cmp ( lb , eq , CMMiscMusic0Str ) )
convert_string ( GameCfg . CMMiscMusic [ SONG_TITLE ] , value , eol ) ;
else if ( cmp ( lb , eq , CMMiscMusic1Str ) )
convert_string ( GameCfg . CMMiscMusic [ SONG_BRIEFING ] , value , eol ) ;
else if ( cmp ( lb , eq , CMMiscMusic2Str ) )
convert_string ( GameCfg . CMMiscMusic [ SONG_ENDLEVEL ] , value , eol ) ;
else if ( cmp ( lb , eq , CMMiscMusic3Str ) )
convert_string ( GameCfg . CMMiscMusic [ SONG_ENDGAME ] , value , eol ) ;
else if ( cmp ( lb , eq , CMMiscMusic4Str ) )
convert_string ( GameCfg . CMMiscMusic [ SONG_CREDITS ] , value , eol ) ;
else if ( cmp ( lb , eq , GammaLevelStr ) )
{
convert_integer ( GameCfg . GammaLevel , value ) ;
gr_palette_set_gamma ( GameCfg . GammaLevel ) ;
}
else if ( cmp ( lb , eq , LastPlayerStr ) )
GameCfg . LastPlayer . copy_lower ( value , std : : distance ( value , eol ) ) ;
else if ( cmp ( lb , eq , LastMissionStr ) )
convert_string ( GameCfg . LastMission , value , eol ) ;
else if ( cmp ( lb , eq , ResolutionXStr ) )
convert_integer ( GameCfg . ResolutionX , value ) ;
else if ( cmp ( lb , eq , ResolutionYStr ) )
convert_integer ( GameCfg . 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 ) ;
2014-12-22 04:35:47 +00:00
else if ( cmp ( lb , eq , TexFiltStr ) )
2015-12-18 04:08:23 +00:00
convert_integer ( CGameCfg . TexFilt , value ) ;
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2014-12-22 04:35:47 +00:00
else if ( cmp ( lb , eq , MovieTexFiltStr ) )
convert_integer ( GameCfg . MovieTexFilt , value ) ;
else if ( cmp ( lb , eq , MovieSubtitlesStr ) )
convert_integer ( GameCfg . MovieSubtitles , value ) ;
2013-03-03 01:03:33 +00:00
# endif
2014-12-22 04:35:47 +00:00
else if ( cmp ( lb , eq , VSyncStr ) )
2015-07-18 03:49:47 +00:00
convert_integer ( CGameCfg . VSync , value ) ;
2014-12-22 04:35:47 +00:00
else if ( cmp ( lb , eq , MultisampleStr ) )
convert_integer ( GameCfg . Multisample , value ) ;
else if ( cmp ( lb , eq , FPSIndicatorStr ) )
convert_integer ( GameCfg . FPSIndicator , value ) ;
else if ( cmp ( lb , eq , GrabinputStr ) )
2015-07-18 21:01:56 +00:00
convert_integer ( CGameCfg . Grabinput , value ) ;
2006-03-20 17:12:09 +00:00
}
2008-04-06 20:23:28 +00:00
if ( GameCfg . DigiVolume > 8 ) GameCfg . DigiVolume = 8 ;
2008-05-24 08:59:35 +00:00
if ( GameCfg . MusicVolume > 8 ) GameCfg . MusicVolume = 8 ;
2006-03-20 17:12:09 +00:00
2008-04-06 20:23:28 +00:00
if ( GameCfg . ResolutionX > = 320 & & GameCfg . ResolutionY > = 200 )
2015-05-14 02:23:13 +00:00
{
Game_screen_mode . width = GameCfg . ResolutionX ;
Game_screen_mode . height = GameCfg . ResolutionY ;
}
2006-03-20 17:12:09 +00:00
return 0 ;
}
int WriteConfigFile ( )
{
2008-04-06 20:23:28 +00:00
GameCfg . GammaLevel = gr_palette_get_gamma ( ) ;
2010-06-14 08:13:16 +00:00
2015-01-17 18:31:42 +00:00
auto infile = PHYSFSX_openWriteBuffered ( " descent.cfg " ) ;
2015-01-17 18:31:42 +00:00
if ( ! infile )
{
2006-03-20 17:12:09 +00:00
return 1 ;
}
2008-04-06 20:23:28 +00:00
PHYSFSX_printf ( infile , " %s=%d \n " , DigiVolumeStr , GameCfg . DigiVolume ) ;
2008-05-24 08:59:35 +00:00
PHYSFSX_printf ( infile , " %s=%d \n " , MusicVolumeStr , GameCfg . MusicVolume ) ;
2008-04-06 20:23:28 +00:00
PHYSFSX_printf ( infile , " %s=%d \n " , ReverseStereoStr , GameCfg . ReverseStereo ) ;
2009-05-06 12:19:28 +00:00
PHYSFSX_printf ( infile , " %s=%d \n " , OrigTrackOrderStr , GameCfg . OrigTrackOrder ) ;
2010-06-14 08:13:16 +00:00
PHYSFSX_printf ( infile , " %s=%d \n " , MusicTypeStr , GameCfg . MusicType ) ;
PHYSFSX_printf ( infile , " %s=%d \n " , CMLevelMusicPlayOrderStr , GameCfg . CMLevelMusicPlayOrder ) ;
PHYSFSX_printf ( infile , " %s=%d \n " , CMLevelMusicTrack0Str , GameCfg . CMLevelMusicTrack [ 0 ] ) ;
PHYSFSX_printf ( infile , " %s=%d \n " , CMLevelMusicTrack1Str , GameCfg . CMLevelMusicTrack [ 1 ] ) ;
2014-12-22 04:35:47 +00:00
PHYSFSX_printf ( infile , " %s=%s \n " , CMLevelMusicPathStr , GameCfg . CMLevelMusicPath . data ( ) ) ;
2014-12-22 04:35:48 +00:00
PHYSFSX_printf ( infile , " %s=%s \n " , CMMiscMusic0Str , GameCfg . CMMiscMusic [ SONG_TITLE ] . data ( ) ) ;
PHYSFSX_printf ( infile , " %s=%s \n " , CMMiscMusic1Str , GameCfg . CMMiscMusic [ SONG_BRIEFING ] . data ( ) ) ;
PHYSFSX_printf ( infile , " %s=%s \n " , CMMiscMusic2Str , GameCfg . CMMiscMusic [ SONG_ENDLEVEL ] . data ( ) ) ;
PHYSFSX_printf ( infile , " %s=%s \n " , CMMiscMusic3Str , GameCfg . CMMiscMusic [ SONG_ENDGAME ] . data ( ) ) ;
PHYSFSX_printf ( infile , " %s=%s \n " , CMMiscMusic4Str , GameCfg . CMMiscMusic [ SONG_CREDITS ] . data ( ) ) ;
2008-04-06 20:23:28 +00:00
PHYSFSX_printf ( infile , " %s=%d \n " , GammaLevelStr , GameCfg . GammaLevel ) ;
2015-07-25 23:10:46 +00:00
PHYSFSX_printf ( infile , " %s=%s \n " , LastPlayerStr , static_cast < const char * > ( get_local_player ( ) . callsign ) ) ;
2015-03-22 18:49:20 +00:00
PHYSFSX_printf ( infile , " %s=%s \n " , LastMissionStr , static_cast < const char * > ( GameCfg . LastMission ) ) ;
2008-04-06 20:23:28 +00:00
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 ) ;
2015-12-18 04:08:23 +00:00
PHYSFSX_printf ( infile , " %s=%i \n " , TexFiltStr , CGameCfg . TexFilt ) ;
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2010-09-02 13:55:28 +00:00
PHYSFSX_printf ( infile , " %s=%i \n " , MovieTexFiltStr , GameCfg . MovieTexFilt ) ;
PHYSFSX_printf ( infile , " %s=%i \n " , MovieSubtitlesStr , GameCfg . MovieSubtitles ) ;
2013-03-03 01:03:33 +00:00
# endif
2015-07-18 03:49:47 +00:00
PHYSFSX_printf ( infile , " %s=%i \n " , VSyncStr , CGameCfg . VSync ) ;
2008-04-22 08:29:29 +00:00
PHYSFSX_printf ( infile , " %s=%i \n " , MultisampleStr , GameCfg . Multisample ) ;
2011-02-14 21:27:07 +00:00
PHYSFSX_printf ( infile , " %s=%i \n " , FPSIndicatorStr , GameCfg . FPSIndicator ) ;
2015-07-18 21:01:56 +00:00
PHYSFSX_printf ( infile , " %s=%i \n " , GrabinputStr , CGameCfg . Grabinput ) ;
2006-03-20 17:12:09 +00:00
return 0 ;
}
2015-12-13 18:00:48 +00:00
}