299 lines
12 KiB
C++
299 lines
12 KiB
C++
/*
|
|
This file is part of Warzone 2100.
|
|
Copyright (C) 1999-2004 Eidos Interactive
|
|
Copyright (C) 2005-2013 Warzone 2100 Project
|
|
|
|
Warzone 2100 is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
Warzone 2100 is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with Warzone 2100; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
/**
|
|
* @file configuration.cpp
|
|
* Saves your favourite options.
|
|
*
|
|
*/
|
|
|
|
#include <QtCore/QSettings>
|
|
#include "lib/framework/wzapp.h"
|
|
#include "lib/framework/wzconfig.h"
|
|
#include "lib/framework/input.h"
|
|
#include "lib/netplay/netplay.h"
|
|
#include "lib/sound/mixer.h"
|
|
#include "lib/ivis_opengl/screen.h"
|
|
#include "lib/framework/opengl.h"
|
|
|
|
#include "advvis.h"
|
|
#include "ai.h"
|
|
#include "component.h"
|
|
#include "configuration.h"
|
|
#include "difficulty.h"
|
|
#include "display3d.h"
|
|
#include "hci.h"
|
|
#include "multiint.h"
|
|
#include "multiplay.h"
|
|
#include "radar.h"
|
|
#include "seqdisp.h"
|
|
#include "texture.h"
|
|
#include "warzoneconfig.h"
|
|
|
|
// ////////////////////////////////////////////////////////////////////////////
|
|
|
|
#define DEFAULTSCROLL 1000
|
|
#define MASTERSERVERPORT 9990
|
|
#define GAMESERVERPORT 2100
|
|
|
|
static const char *fileName = "config";
|
|
|
|
// ////////////////////////////////////////////////////////////////////////////
|
|
bool loadConfig()
|
|
{
|
|
QSettings ini(PHYSFS_getWriteDir() + QString("/") + fileName, QSettings::IniFormat);
|
|
if (ini.status() != QSettings::NoError)
|
|
{
|
|
debug(LOG_ERROR, "Could not open configuration file \"%s\"", fileName);
|
|
return false;
|
|
}
|
|
debug(LOG_WZ, "Reading configuration from %s", ini.fileName().toUtf8().constData());
|
|
if (ini.contains("voicevol")) sound_SetUIVolume(ini.value("voicevol").toDouble() / 100.0);
|
|
if (ini.contains("fxvol")) sound_SetEffectsVolume(ini.value("fxvol").toDouble() / 100.0);
|
|
if (ini.contains("cdvol")) sound_SetMusicVolume(ini.value("cdvol").toDouble() / 100.0);
|
|
if (ini.contains("music_enabled")) war_SetMusicEnabled(ini.value("music_enabled").toBool());
|
|
if (ini.contains("language")) setLanguage(ini.value("language").toString().toUtf8().constData());
|
|
if (ini.contains("nomousewarp")) setMouseWarp(ini.value("nomousewarp").toBool());
|
|
if (ini.contains("notexturecompression")) wz_texture_compression = GL_RGBA;
|
|
showFPS = ini.value("showFPS", false).toBool();
|
|
scroll_speed_accel = ini.value("scroll", DEFAULTSCROLL).toInt();
|
|
setShakeStatus(ini.value("shake", false).toBool());
|
|
setDrawShadows(ini.value("shadows", true).toBool());
|
|
war_setSoundEnabled(ini.value("sound", true).toBool());
|
|
setInvertMouseStatus(ini.value("mouseflip", true).toBool());
|
|
setRightClickOrders(ini.value("RightClickOrders", false).toBool());
|
|
setMiddleClickRotate(ini.value("MiddleClickRotate", false).toBool());
|
|
rotateRadar = ini.value("rotateRadar", true).toBool();
|
|
war_SetPauseOnFocusLoss(ini.value("PauseOnFocusLoss", false).toBool());
|
|
NETsetMasterserverName(ini.value("masterserver_name", "lobby.wz2100.net").toString().toUtf8().constData());
|
|
iV_font(ini.value("fontname", "DejaVu Sans").toString().toUtf8().constData(),
|
|
ini.value("fontface", "Book").toString().toUtf8().constData(),
|
|
ini.value("fontfacebold", "Bold").toString().toUtf8().constData());
|
|
NETsetMasterserverPort(ini.value("masterserver_port", MASTERSERVERPORT).toInt());
|
|
NETsetGameserverPort(ini.value("gameserver_port", GAMESERVERPORT).toInt());
|
|
war_SetFMVmode((FMV_MODE)ini.value("FMVmode", FMV_FULLSCREEN).toInt());
|
|
war_setScanlineMode((SCANLINE_MODE)ini.value("scanlines", SCANLINES_OFF).toInt());
|
|
seq_SetSubtitles(ini.value("subtitles", true).toBool());
|
|
setDifficultyLevel((DIFFICULTY_LEVEL)ini.value("difficulty", DL_NORMAL).toInt());
|
|
war_SetSPcolor(ini.value("colour", 0).toInt()); // default is green (0)
|
|
war_setMPcolour(ini.value("colourMP", -1).toInt()); // default is random (-1)
|
|
sstrcpy(game.name, ini.value("gameName", _("My Game")).toString().toUtf8().constData());
|
|
sstrcpy(sPlayer, ini.value("playerName", _("Player")).toString().toUtf8().constData());
|
|
|
|
// Set a default map to prevent hosting games without a map.
|
|
sstrcpy(game.map, "Sk-Rush");
|
|
game.hash.setZero();
|
|
game.maxPlayers = 4;
|
|
|
|
game.power = ini.value("powerLevel", LEV_MED).toInt();
|
|
game.base = ini.value("base", CAMP_BASE).toInt();
|
|
game.alliance = ini.value("alliance", NO_ALLIANCES).toInt();
|
|
game.scavengers = ini.value("scavengers", false).toBool();
|
|
memset(&ingame.phrases, 0, sizeof(ingame.phrases));
|
|
for (int i = 1; i < 5; i++)
|
|
{
|
|
QString key("phrase" + QString::number(i));
|
|
if (ini.contains(key)) sstrcpy(ingame.phrases[i], ini.value(key).toString().toUtf8().constData());
|
|
}
|
|
bEnemyAllyRadarColor = ini.value("radarObjectMode").toBool();
|
|
radarDrawMode = (RADAR_DRAW_MODE)ini.value("radarTerrainMode", RADAR_MODE_DEFAULT).toInt();
|
|
radarDrawMode = (RADAR_DRAW_MODE)MIN(NUM_RADAR_MODES - 1, radarDrawMode); // restrict to allowed values
|
|
if (ini.contains("textureSize")) setTextureSize(ini.value("textureSize").toInt());
|
|
NetPlay.isUPNP = ini.value("UPnP", true).toBool();
|
|
if (ini.contains("FSAA")) war_setFSAA(ini.value("FSAA").toInt());
|
|
// Leave this to false, some system will fail and they can't see the system popup dialog!
|
|
war_setFullscreen(ini.value("fullscreen", false).toBool());
|
|
war_SetTrapCursor(ini.value("trapCursor", false).toBool());
|
|
// this should be enabled on all systems by default
|
|
war_SetVsync(ini.value("vsync", true).toBool());
|
|
// 640x480 is minimum that we will support
|
|
int width = ini.value("width", 640).toInt();
|
|
int height = ini.value("height", 480).toInt();
|
|
if (width < 640 || height < 480) // sanity check
|
|
{
|
|
width = 640;
|
|
height = 480;
|
|
}
|
|
pie_SetVideoBufferWidth(width);
|
|
pie_SetVideoBufferHeight(height);
|
|
war_SetWidth(width);
|
|
war_SetHeight(height);
|
|
|
|
if (ini.contains("bpp")) pie_SetVideoBufferDepth(ini.value("bpp").toInt());
|
|
return true;
|
|
}
|
|
|
|
// ////////////////////////////////////////////////////////////////////////////
|
|
bool saveConfig()
|
|
{
|
|
QSettings ini(PHYSFS_getWriteDir() + QString("/") + fileName, QSettings::IniFormat);
|
|
if (ini.status() != QSettings::NoError)
|
|
{
|
|
debug(LOG_ERROR, "Could not open configuration file \"%s\"", fileName);
|
|
return false;
|
|
}
|
|
debug(LOG_WZ, "Writing prefs to registry \"%s\"", ini.fileName().toUtf8().constData());
|
|
|
|
// //////////////////////////
|
|
// voicevol, fxvol and cdvol
|
|
ini.setValue("voicevol", (int)(sound_GetUIVolume() * 100.0));
|
|
ini.setValue("fxvol", (int)(sound_GetEffectsVolume() * 100.0));
|
|
ini.setValue("cdvol", (int)(sound_GetMusicVolume() * 100.0));
|
|
ini.setValue("music_enabled", war_GetMusicEnabled());
|
|
ini.setValue("width", war_GetWidth());
|
|
ini.setValue("height", war_GetHeight());
|
|
ini.setValue("bpp", pie_GetVideoBufferDepth());
|
|
ini.setValue("fullscreen", war_getFullscreen());
|
|
ini.setValue("language", getLanguage());
|
|
// dont save out the cheat mode.
|
|
if (getDifficultyLevel() != DL_KILLER && getDifficultyLevel() != DL_TOUGH)
|
|
{
|
|
ini.setValue("difficulty", getDifficultyLevel()); // level
|
|
}
|
|
ini.setValue("showFPS", (SDWORD)showFPS);
|
|
ini.setValue("scroll",(SDWORD)scroll_speed_accel); // scroll
|
|
ini.setValue("shake",(SDWORD)(getShakeStatus())); // screenshake
|
|
ini.setValue("mouseflip",(SDWORD)(getInvertMouseStatus())); // flipmouse
|
|
ini.setValue("nomousewarp", (SDWORD)getMouseWarp()); // mouse warp
|
|
ini.setValue("RightClickOrders",(SDWORD)(getRightClickOrders()));
|
|
ini.setValue("MiddleClickRotate",(SDWORD)(getMiddleClickRotate()));
|
|
ini.setValue("showFPS", (SDWORD)showFPS);
|
|
ini.setValue("shadows",(SDWORD)(getDrawShadows())); // shadows
|
|
ini.setValue("sound", (SDWORD)war_getSoundEnabled());
|
|
ini.setValue("FMVmode",(SDWORD)(war_GetFMVmode())); // sequences
|
|
ini.setValue("scanlines", (SDWORD)war_getScanlineMode());
|
|
ini.setValue("subtitles",(SDWORD)(seq_GetSubtitles())); // subtitles
|
|
ini.setValue("radarObjectMode",(SDWORD)bEnemyAllyRadarColor); // enemy/allies radar view
|
|
ini.setValue("radarTerrainMode",(SDWORD)radarDrawMode);
|
|
ini.setValue("trapCursor", war_GetTrapCursor());
|
|
ini.setValue("vsync", war_GetVsync());
|
|
ini.setValue("textureSize", getTextureSize());
|
|
ini.setValue("FSAA", war_getFSAA());
|
|
ini.setValue("UPnP", (SDWORD)NetPlay.isUPNP);
|
|
ini.setValue("rotateRadar", rotateRadar);
|
|
ini.setValue("PauseOnFocusLoss", war_GetPauseOnFocusLoss());
|
|
ini.setValue("masterserver_name", NETgetMasterserverName());
|
|
ini.setValue("masterserver_port", NETgetMasterserverPort());
|
|
ini.setValue("gameserver_port", NETgetGameserverPort());
|
|
if (!bMultiPlayer)
|
|
{
|
|
ini.setValue("colour", getPlayerColour(0)); // favourite colour.
|
|
}
|
|
else
|
|
{
|
|
if (NetPlay.isHost && ingame.localJoiningInProgress)
|
|
{
|
|
if (bMultiPlayer && NetPlay.bComms)
|
|
{
|
|
ini.setValue("gameName", game.name); // last hosted game
|
|
}
|
|
ini.setValue("mapName", game.map); // map name
|
|
ini.setValue("mapHash", game.hash.toString().c_str()); // map hash
|
|
ini.setValue("maxPlayers", game.maxPlayers); // maxPlayers
|
|
ini.setValue("powerLevel", game.power); // power
|
|
ini.setValue("base", game.base); // size of base
|
|
ini.setValue("alliance", game.alliance); // allow alliances
|
|
ini.setValue("scavengers", game.scavengers);
|
|
}
|
|
ini.setValue("playerName", (char*)sPlayer); // player name
|
|
}
|
|
ini.setValue("colourMP", war_getMPcolour());
|
|
ini.sync();
|
|
return true;
|
|
}
|
|
|
|
// Saves and loads the relevant part of the config files for MP games
|
|
// Ensures that others' games don't change our own configuration settings
|
|
bool reloadMPConfig(void)
|
|
{
|
|
QSettings ini(PHYSFS_getWriteDir() + QString("/") + fileName, QSettings::IniFormat);
|
|
if (ini.status() != QSettings::NoError)
|
|
{
|
|
debug(LOG_ERROR, "Could not open configuration file \"%s\"", fileName);
|
|
return false;
|
|
}
|
|
debug(LOG_WZ, "Reloading prefs prefs to registry");
|
|
|
|
// If we're in-game, we already have our own configuration set, so no need to reload it.
|
|
if (NetPlay.isHost && !ingame.localJoiningInProgress)
|
|
{
|
|
if (bMultiPlayer && !NetPlay.bComms)
|
|
{
|
|
// one-player skirmish mode sets game name to "One Player Skirmish", so
|
|
// reset the name
|
|
if (ini.contains("gameName"))
|
|
{
|
|
sstrcpy(game.name, ini.value("gameName").toString().toUtf8().constData());
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
// If we're host and not in-game, we can safely save our settings and return.
|
|
if (NetPlay.isHost && ingame.localJoiningInProgress)
|
|
{
|
|
if (bMultiPlayer && NetPlay.bComms)
|
|
{
|
|
ini.setValue("gameName", game.name); // last hosted game
|
|
}
|
|
else
|
|
{
|
|
// One-player skirmish mode sets game name to "One Player Skirmish", so
|
|
// reset the name
|
|
if (ini.contains("gameName"))
|
|
{
|
|
sstrcpy(game.name, ini.value("gameName").toString().toUtf8().constData());
|
|
}
|
|
}
|
|
|
|
// Set a default map to prevent hosting games without a map.
|
|
sstrcpy(game.map, "Sk-Rush");
|
|
game.hash.setZero();
|
|
game.maxPlayers = 4;
|
|
|
|
ini.setValue("powerLevel", game.power); // power
|
|
ini.setValue("base", game.base); // size of base
|
|
ini.setValue("alliance", game.alliance); // allow alliances
|
|
return true;
|
|
}
|
|
|
|
// We're not host, so let's get rid of the host's game settings and restore our own.
|
|
|
|
// game name
|
|
if (ini.contains("gameName"))
|
|
{
|
|
sstrcpy(game.name, ini.value("gameName").toString().toUtf8().constData());
|
|
}
|
|
|
|
// Set a default map to prevent hosting games without a map.
|
|
sstrcpy(game.map, "Sk-Rush");
|
|
game.hash.setZero();
|
|
game.maxPlayers = 4;
|
|
|
|
game.power = ini.value("powerLevel", LEV_MED).toInt();
|
|
game.base = ini.value("base", CAMP_BASE).toInt();
|
|
game.alliance = ini.value("alliance", NO_ALLIANCES).toInt();
|
|
|
|
return true;
|
|
}
|
|
|
|
void closeConfig()
|
|
{
|
|
}
|