182a9201c3
--HG-- branch : compatibility-develop
2236 lines
64 KiB
C++
2236 lines
64 KiB
C++
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
|
// Copyright (C) 2010 Winch Gate Property Limited
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Affero General Public License as
|
|
// published by the Free Software Foundation, either version 3 of the
|
|
// License, or (at your option) any later version.
|
|
//
|
|
// This program 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 Affero General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
/////////////
|
|
// INCLUDE //
|
|
/////////////
|
|
#include "stdpch.h"
|
|
// Misc.
|
|
#include "nel/misc/config_file.h"
|
|
#include "nel/misc/bit_mem_stream.h"
|
|
#include "nel/misc/i18n.h"
|
|
#include "nel/misc/cmd_args.h"
|
|
// Client.
|
|
#include "client_cfg.h"
|
|
#include "entities.h"
|
|
#include "cursor_functions.h"
|
|
#include "debug_client.h"
|
|
#include "view.h" // For the cameraDistance funtion
|
|
#include "user_entity.h"
|
|
#include "misc.h"
|
|
#include "user_agent.h"
|
|
|
|
// 3D Interface.
|
|
#include "nel/3d/u_driver.h"
|
|
#include "nel/3d/u_scene.h"
|
|
// Game Share.
|
|
#include "game_share/time_weather_season/time_and_season.h"
|
|
|
|
#ifdef NL_OS_MAC
|
|
#include "app_bundle_utils.h"
|
|
#endif // NL_OS_MAC
|
|
|
|
///////////
|
|
// MACRO //
|
|
///////////
|
|
//-----------------------------------------------
|
|
/// Macro to read a Bool from the CFG.
|
|
/// variableName : Variable Name to Read and Set.
|
|
//-----------------------------------------------
|
|
#define _READ_BOOL(variableName) \
|
|
/* Read the Variable Value From Script */ \
|
|
varPtr = ClientCfg.ConfigFile.getVarPtr(#variableName); \
|
|
/* Value found, set the Variable */ \
|
|
if(varPtr) \
|
|
ClientCfg.variableName = varPtr->asInt() ? true : false; \
|
|
/* Use the Default Value */ \
|
|
else \
|
|
cfgWarning("CFG: Default value used for '"#variableName"' !!!"); \
|
|
|
|
//-----------------------------------------------
|
|
/// Macro to read an Int from the CFG.
|
|
/// variableName : Variable Name to Read and Set.
|
|
//-----------------------------------------------
|
|
#define _READ_INT(variableName) \
|
|
/* Read the Variable Value From Script */ \
|
|
varPtr = ClientCfg.ConfigFile.getVarPtr(#variableName); \
|
|
/* Value found, set the Variable */ \
|
|
if(varPtr) \
|
|
ClientCfg.variableName = varPtr->asInt(); \
|
|
/* Use the Default Value */ \
|
|
else \
|
|
cfgWarning("CFG: Default value used for '"#variableName"' !!!"); \
|
|
|
|
//-----------------------------------------------
|
|
/// Macro to read a Float from the CFG.
|
|
/// variableName : Variable Name to Read and Set.
|
|
//-----------------------------------------------
|
|
#define _READ_FLOAT(variableName) \
|
|
/* Read the Variable Value From Script */ \
|
|
varPtr = ClientCfg.ConfigFile.getVarPtr(#variableName); \
|
|
/* Value found, set the Variable */ \
|
|
if(varPtr) \
|
|
ClientCfg.variableName = varPtr->asFloat(); \
|
|
/* Use the Default Value */ \
|
|
else \
|
|
cfgWarning("CFG: Default value used for '"#variableName"' !!!"); \
|
|
|
|
//-----------------------------------------------
|
|
/// Macro to read a Float from the CFG.
|
|
/// cfgVariableName : Variable Name to Read.
|
|
/// variableName : Variable Name to Set.
|
|
//-----------------------------------------------
|
|
#define _READ_FLOAT2(cfgVariableName,variableName) \
|
|
/* Read the Variable Value From Script */ \
|
|
varPtr = ClientCfg.ConfigFile.getVarPtr(#cfgVariableName); \
|
|
/* Value found, set the Variable */ \
|
|
if(varPtr) \
|
|
ClientCfg.variableName = varPtr->asFloat(); \
|
|
/* Use the Default Value */ \
|
|
else \
|
|
cfgWarning("CFG: Default value used for '"#cfgVariableName"' !!!"); \
|
|
|
|
//-----------------------------------------------
|
|
/// Macro to read a Double from the CFG.
|
|
/// variableName : Variable Name to Read and Set.
|
|
//-----------------------------------------------
|
|
#define _READ_DOUBLE(variableName) \
|
|
/* Read the Variable Value From Script */ \
|
|
varPtr = ClientCfg.ConfigFile.getVarPtr(#variableName); \
|
|
/* Value found, set the Variable */ \
|
|
if(varPtr) \
|
|
ClientCfg.variableName = varPtr->asDouble(); \
|
|
/* Use the Default Value */ \
|
|
else \
|
|
cfgWarning("CFG: Default value used for '"#variableName"' !!!"); \
|
|
|
|
//-----------------------------------------------
|
|
/// Macro to read a String from the CFG.
|
|
/// variableName : Variable Name to Read and Set.
|
|
//-----------------------------------------------
|
|
#define _READ_STRING(variableName) \
|
|
/* Read the Variable Value From Script */ \
|
|
varPtr = ClientCfg.ConfigFile.getVarPtr(#variableName); \
|
|
/* Value found, set the Variable */ \
|
|
if(varPtr) \
|
|
ClientCfg.variableName = varPtr->asString(); \
|
|
/* Use the Default Value */ \
|
|
else \
|
|
cfgWarning("CFG: Default value used for '"#variableName"' !!!"); \
|
|
|
|
//-----------------------------------------------
|
|
/// Macro to read a CVector from the CFG.
|
|
/// variableName : Variable Name to Read and Set.
|
|
//-----------------------------------------------
|
|
#define _READ_CVECTOR(variableName) \
|
|
/* Read the Variable Value From Script */ \
|
|
varPtr = ClientCfg.ConfigFile.getVarPtr(#variableName); \
|
|
if(varPtr) \
|
|
{ \
|
|
/* Check params */ \
|
|
if(varPtr->size()==3) \
|
|
{ \
|
|
ClientCfg.variableName.x = varPtr->asFloat(0); \
|
|
ClientCfg.variableName.y = varPtr->asFloat(1); \
|
|
ClientCfg.variableName.z = varPtr->asFloat(2); \
|
|
} \
|
|
else \
|
|
cfgWarning("CFG: Bad params for '"#variableName"' !!!"); \
|
|
} \
|
|
else \
|
|
cfgWarning("CFG: Default value used for '"#variableName"' !!!"); \
|
|
|
|
|
|
//-----------------------------------------------
|
|
/// Macro to read an Enum, as int from the CFG.
|
|
/// variableName : Variable Name to Read and Set.
|
|
//-----------------------------------------------
|
|
#define _READ_ENUM_ASINT(type, variableName) \
|
|
/* Read the Variable Value From Script */ \
|
|
varPtr = ClientCfg.ConfigFile.getVarPtr(#variableName); \
|
|
/* Value found, set the Variable */ \
|
|
if(varPtr) \
|
|
ClientCfg.variableName = (type)varPtr->asInt(); \
|
|
/* Use the Default Value */ \
|
|
else \
|
|
cfgWarning("CFG: Default value used for '"#variableName"' !!!"); \
|
|
|
|
//-----------------------------------------------
|
|
/// Macro to read a String Vector from the CFG.
|
|
/// variableName : Variable Name to Read and Set.
|
|
//-----------------------------------------------
|
|
#define _READ_STRINGVECTOR(variableName) \
|
|
/* Read the Variable Value From Script */ \
|
|
varPtr = ClientCfg.ConfigFile.getVarPtr(#variableName); \
|
|
/* Value found, set the Variable */ \
|
|
if(varPtr) \
|
|
{ \
|
|
ClientCfg.variableName.clear (); \
|
|
int iSz = varPtr->size(); \
|
|
ClientCfg.variableName.reserve(iSz); \
|
|
for (int i = 0; i < iSz; i++) \
|
|
ClientCfg.variableName.push_back(varPtr->asString(i)); \
|
|
} \
|
|
/* Use the Default Value */ \
|
|
else \
|
|
cfgWarning("CFG: Default value used for '"#variableName"' !!!"); \
|
|
|
|
//-----------------------------------------------
|
|
// Macro for the dev version
|
|
//-----------------------------------------------
|
|
|
|
#if !FINAL_VERSION
|
|
#define READ_BOOL_DEV(variableName) _READ_BOOL(variableName)
|
|
#define READ_INT_DEV(variableName) _READ_INT(variableName)
|
|
#define READ_FLOAT_DEV(variableName) _READ_FLOAT(variableName)
|
|
#define READ_FLOAT2_DEV(cfgVariableName,variableName) _READ_FLOAT2(cfgVariableName,variableName)
|
|
#define READ_DOUBLE_DEV(variableName) _READ_DOUBLE(variableName)
|
|
#define READ_STRING_DEV(variableName) _READ_STRING(variableName)
|
|
#define READ_CVECTOR_DEV(variableName) _READ_CVECTOR(variableName)
|
|
#define READ_ENUM_ASINT_DEV(type, variableName) _READ_ENUM_ASINT(type, variableName)
|
|
#define READ_STRINGVECTOR_DEV(variableName) _READ_STRINGVECTOR(variableName)
|
|
#else // !FINAL_VERSION
|
|
#define READ_BOOL_DEV(variableName)
|
|
#define READ_INT_DEV(variableName)
|
|
#define READ_FLOAT_DEV(variableName)
|
|
#define READ_FLOAT2_DEV(cfgVariableName,variableName)
|
|
#define READ_DOUBLE_DEV(variableName)
|
|
#define READ_STRING_DEV(variableName)
|
|
#define READ_CVECTOR_DEV(variableName)
|
|
#define READ_ENUM_ASINT_DEV(type, variableName)
|
|
#define READ_STRINGVECTOR_DEV(variableName)
|
|
#endif // !FINAL_VERSION
|
|
|
|
//-----------------------------------------------
|
|
// Macro for the dev & final version
|
|
//-----------------------------------------------
|
|
|
|
#define READ_BOOL_FV(variableName) _READ_BOOL(variableName)
|
|
#define READ_INT_FV(variableName) _READ_INT(variableName)
|
|
#define READ_FLOAT_FV(variableName) _READ_FLOAT(variableName)
|
|
#define READ_FLOAT2_FV(cfgVariableName,variableName) _READ_FLOAT2(cfgVariableName,variableName)
|
|
#define READ_DOUBLE_FV(variableName) _READ_DOUBLE(variableName)
|
|
#define READ_STRING_FV(variableName) _READ_STRING(variableName)
|
|
#define READ_CVECTOR_FV(variableName) _READ_CVECTOR(variableName)
|
|
#define READ_ENUM_ASINT_FV(type, variableName) _READ_ENUM_ASINT(type, variableName)
|
|
#define READ_STRINGVECTOR_FV(variableName) _READ_STRINGVECTOR(variableName)
|
|
|
|
///////////
|
|
// USING //
|
|
///////////
|
|
using namespace NLMISC;
|
|
using namespace NL3D;
|
|
|
|
|
|
////////////
|
|
// GLOBAL //
|
|
////////////
|
|
CClientConfig LastClientCfg;
|
|
CClientConfig ClientCfg;
|
|
const string ConfigFileName = "client.cfg";
|
|
|
|
|
|
////////////
|
|
// EXTERN //
|
|
////////////
|
|
#ifndef RZ_NO_CLIENT
|
|
extern NL3D::UScene *Scene;
|
|
extern NL3D::UDriver *Driver;
|
|
extern CRyzomTime RT;
|
|
extern string Cookie;
|
|
extern string FSAddr;
|
|
#endif
|
|
|
|
extern NLMISC::CCmdArgs Args;
|
|
|
|
/////////////
|
|
// METHODS //
|
|
/////////////
|
|
|
|
// diplay only one time warning "Default values...."
|
|
static bool DisplayCFGWarning= false;
|
|
static void cfgWarning(const char *s)
|
|
{
|
|
if(DisplayCFGWarning)
|
|
nlwarning(s);
|
|
}
|
|
|
|
//---------------------------------------------------
|
|
// CClientConfig :
|
|
// Constructor.
|
|
//---------------------------------------------------
|
|
CClientConfig::CClientConfig()
|
|
{
|
|
IsInvalidated = false;
|
|
|
|
TestBrowser = false;
|
|
Light = false; // Default is no client light version
|
|
SaveConfig = false;
|
|
|
|
PositionX = 0;
|
|
PositionY = 0;
|
|
Frequency = 60;
|
|
|
|
SkipIntro = false;
|
|
SelectCharacter = -1; // Default is no auto select
|
|
SelectedSlot = 0; // Default is slot 0
|
|
|
|
Windowed = false; // Default is windowed mode.
|
|
Width = 0; // Default Width for the window (0 = current screen resolution).
|
|
Height = 0; // Default Height for the window (0 = current screen resolution).
|
|
Depth = 32; // Default Bit per Pixel.
|
|
Driver3D = DrvAuto; // Select best driver depending on hardware.
|
|
Contrast = 0.f; // Default Monitor Contrast.
|
|
Luminosity = 0.f; // Default Monitor Luminosity.
|
|
Gamma = 0.f; // Default Monitor Gamma.
|
|
|
|
VREnable = false;
|
|
VRDisplayDevice = "Auto";
|
|
VRDisplayDeviceId = "";
|
|
|
|
Local = false; // Default is Net Mode.
|
|
FSHost = ""; // Default Host.
|
|
|
|
#if 1 // Yubo hack
|
|
// The order is important here, because in a layer, global texture are rendered through this order
|
|
TexturesInterface.push_back("texture_interfaces_v3");
|
|
// DXTC contain all items and bricks bitmaps, they must come after standard texture
|
|
TexturesInterface.push_back("new_texture_interfaces_dxtc");
|
|
// Added icons by Yubo's Team 2009
|
|
TexturesInterface.push_back("texture_extra");
|
|
#else
|
|
TexturesInterface.push_back("texture_interfaces_v3");
|
|
TexturesInterfaceDXTC.push_back("texture_interfaces_dxtc");
|
|
#endif
|
|
|
|
TexturesOutGameInterface.push_back("texture_interfaces_v3_outgame_ui");
|
|
|
|
TexturesLoginInterface.push_back("texture_interfaces_v3_login");
|
|
|
|
DisplayAccountButtons = true;
|
|
CreateAccountURL = "https://secure.ryzom.com/signup/from_client.php";
|
|
EditAccountURL = "https://secure.ryzom.com/payment_profile/index.php";
|
|
ForgetPwdURL = "https://secure.ryzom.com/payment_profile/lost_secure_password.php";
|
|
Position = CVector(0.f, 0.f, 0.f); // Default Position.
|
|
Heading = CVector(0.f, 1.f, 0.f); // Default Heading.
|
|
EyesHeight = 1.5f; // Default User Eyes Height.
|
|
Walk = 1.66f; // Default Velocity for the Walk.
|
|
Run = 6.0f; // Default Velocity for the Run.
|
|
Fly = 25.0f; // Default Velocity for the Fly.
|
|
DmWalk = 6.0f; // Default Velocity for the Walk in Ring/DM or Ring/Editor.
|
|
DmRun = 20.0f; // Default Velocity for the Run in Ring/DM or Ring/Editor.
|
|
|
|
FlyAccel = 1000.f; // Default Acceleration for the fly, in m.s-2
|
|
|
|
AllowDebugCommands = false; // Add debug commands at startup
|
|
|
|
ForceDeltaTime = 0; // Default ForceDeltaTime, disabled by default
|
|
|
|
HardwareCursor = true; // Default HardwareCursor
|
|
HardwareCursorScale = 0.85f;
|
|
CursorSpeed = 1.f; // Default CursorSpeed
|
|
CursorAcceleration = 0; // Default CursorAcceleration
|
|
FreeLookSpeed = 0.001f; // Default FreeLookSpeed
|
|
FreeLookAcceleration = 0; // Default FreeLookAcceleration
|
|
FreeLookSmoothingPeriod = 0.f; // when in absolute mode, free look factor is used instead of speed, the mouse gives the absolute angle
|
|
FreeLookInverted = false;
|
|
AutomaticCamera = true;
|
|
DblClickMode = true; // when in dbl click mode, a double click is needed to execute default contextual action
|
|
AutoEquipTool = true; // when true player will auto-equip last used weapon or forage tool when doing an action
|
|
|
|
BGColor = CRGBA(100,100,255); // Default Background Color.
|
|
LandscapeTileNear = 50.0f; // Default Landscape Tile Near.
|
|
LandscapeThreshold = 1000.0f; // Default Landscape Threshold.
|
|
Vision = 500.f; // Player vision.
|
|
Vision_min = 200.f; // Player vision min.
|
|
Vision_max = 800.f; // Player vision max.
|
|
SkinNbMaxPoly = 40000;
|
|
FxNbMaxPoly = 10000;
|
|
Cloud = true;
|
|
CloudQuality = 160.0f;
|
|
CloudUpdate = 1;
|
|
NbMaxSkeletonNotCLod= 20;
|
|
CharacterFarClip = 200.f;
|
|
ScreenAspectRatio = 0.f; // Default commmon Screen Aspect Ratio (no relation with the resolution) - 0.f = auto
|
|
FoV = 75.f; // Default value for the FoV.
|
|
ForceDXTC = false; // Default is no DXTC Compression.
|
|
AnisotropicFilter = 0; // Default is disabled (-1 = maximum value, 0 = disabled, 1+ = enabled)
|
|
DivideTextureSizeBy2= false; // Divide texture by 2
|
|
DisableVtxProgram = false; // Disable Hardware Vertex Program.
|
|
DisableVtxAGP = false; // Disable Hardware Vertex AGP.
|
|
DisableTextureShdr = false; // Disable Hardware Texture Shader.
|
|
MicroVeget = true; // Default is with MicroVeget.
|
|
MicroVegetDensity = 100.0f;
|
|
HDEntityTexture = false;
|
|
HDTextureInstalled = false;
|
|
Fog = true; // Fog is on by default
|
|
WaitVBL = false;
|
|
VideoMemory = 0;
|
|
|
|
FXAA = true;
|
|
|
|
Bloom = true;
|
|
SquareBloom = true;
|
|
DensityBloom = 255.f;
|
|
|
|
GlobalWindPower = 0.10f; // Default is 0.25
|
|
GlobalWindDirection = CVector(1,0,0); // Default direction is X>0
|
|
|
|
MovieShooterMemory = 0; // MovieShooter disabled
|
|
MovieShooterFramePeriod = 0.040f; // default is 25 fps
|
|
MovieShooterBlend = false;
|
|
MovieShooterFrameSkip = 0; // default not skip frame
|
|
MovieShooterPrefix = "shot_";
|
|
|
|
CameraRecorderPrefix = "cam_rec";
|
|
CameraRecorderBlend = true;
|
|
|
|
ScreenShotWidth = 0;
|
|
ScreenShotHeight = 0;
|
|
ScreenShotFullDetail = true;
|
|
ScreenShotZBuffer = false;
|
|
|
|
MaxNumberOfTimedFXInstances = 20;
|
|
SelectionFX = "sfx_selection_mouseover.ps";
|
|
MouseOverFX = "sfx_selection_mouseover.ps";
|
|
SelectionFXSize = 0.8f;
|
|
|
|
#if RZ_USE_PATCH
|
|
PatchWanted = true;
|
|
#else
|
|
PatchWanted = false;
|
|
#endif
|
|
|
|
PatchUrl.clear();
|
|
PatchletUrl.clear();
|
|
PatchVersion.clear();
|
|
|
|
WebIgMainDomain = "atys.ryzom.com";
|
|
WebIgTrustedDomains.push_back(WebIgMainDomain);
|
|
|
|
CurlMaxConnections = 2;
|
|
|
|
RingReleaseNotePath = "http://" + WebIgMainDomain + "/releasenotes_ring/index.php";
|
|
ReleaseNotePath = "http://" + WebIgMainDomain + "/releasenotes/index.php";
|
|
|
|
|
|
///////////////
|
|
// ANIMATION //
|
|
// With a bigger angle, rotation is animated.
|
|
AnimatedAngleThreshold = 25.0; //
|
|
BlendFrameNumber = 5; //
|
|
DestThreshold = 0.01; // Destination Threshold
|
|
PositionLimiterRadius = 0.1;
|
|
SignificantDist = 0.0001; // Significant Distance
|
|
///////////
|
|
// SOUND //
|
|
SoundOn = true; // Default is with sound.
|
|
DriverSound = SoundDrvAuto;
|
|
SoundForceSoftwareBuffer = true;
|
|
SoundOutGameMusic = "Main Menu Loop.ogg";
|
|
SoundSFXVolume = 1.f;
|
|
SoundGameMusicVolume = 1.f;
|
|
SoundTPFade = 500;
|
|
EnableBackgroundMusicTimeConstraint = true;
|
|
|
|
SoundPackedSheetPath= "data/sound/"; // Default path for sound packed sheets
|
|
SampleBankDir = "data/sound/samplebanks"; // Default path for samples
|
|
UserEntitySoundLevel = 0.5f; // Default volume for sound in 1st person
|
|
UseEax = true; // Default to use EAX;
|
|
UseADPCM = false; // Defualt to PCM sample, NO ADPCM
|
|
MaxTrack = 32; // DEfault to 32 track
|
|
|
|
ColorShout = CRGBA(150,0,0,255); // Default Shout color.
|
|
ColorTalk = CRGBA(255,255,255,255); // Default Talk color.
|
|
|
|
// PreDataPath.push_back("data/gamedev/language/"); // Default Path for the language data
|
|
|
|
// DataPath.push_back("data/"); // Default Path for the Data.
|
|
// DataPath.push_back("data_leveldesign/"); // Default Path for the Level Design Directory.
|
|
// DataPath.push_back("data_common/"); // Default Path for the Level Design Directory.
|
|
|
|
DataPathNoRecurse.push_back("data_leveldesign/leveldesign/Game_Elem");
|
|
|
|
UpdatePackedSheetPath.push_back("data_leveldesign");
|
|
|
|
UpdatePackedSheet = false; // Update packed sheet if needed
|
|
|
|
EndScreenTimeOut = 0.f; // Default time out for the screen at the end of the application.
|
|
Loading_BG = "loading_bg.tga"; // Default name for the loading background file.
|
|
LoadingFreeTrial_BG = "loading_free_trial_bg.tga"; // Default name for the loading background file in FreeTrial mode.
|
|
Launch_BG = "launcher_bg.tga"; // Default name for the launch background file.
|
|
TeleportKami_BG = "teleport_kami_bg.tga";
|
|
TeleportKaravan_BG = "teleport_caravan_bg.tga";
|
|
Elevator_BG = "elevator_bg.tga"; // Default name for the loading background file.
|
|
ResurectKami_BG = "resurect_kami_bg.tga";
|
|
ResurectKaravan_BG = "resurect_caravane_bg.tga";
|
|
End_BG = "end_bg.tga"; // Default name for the last background file.
|
|
IntroNevrax_BG = "launcher_nevrax.tga";
|
|
IntroNVidia_BG = "launcher_nvidia.tga";
|
|
|
|
TipsY = 0.07f;
|
|
TeleportInfoY = 0.23f;
|
|
|
|
SceneName = "";
|
|
IdFilePath = "sheet_id.bin";
|
|
PacsPrimDir.push_back("data/3d/");
|
|
|
|
Shadows = true; // Draw Shadows by default.
|
|
ShadowsClipFar = 10.f; // Shadows are disabled after this distance.
|
|
ShadowsLodDist = 3.f; // Shadows draw with just 1 part after this distance.
|
|
ShadowZDirClampLandscape = -0.5f; // On landscape, allow a minimum Phi angle of -30 degrees
|
|
ShadowZDirClampInterior = -0.86f; // On Interior, allow a minimum Phi angle of -60 degrees
|
|
ShadowZDirClampSmoothSpeed = 0.5f;
|
|
ShadowMaxDepthLandscape = 8.f;
|
|
ShadowMaxDepthInterior = 2.f;
|
|
ShadowMaxDepthSmoothSpeed = 6.f;
|
|
|
|
|
|
Names = false; // Don't draw Names by default.
|
|
|
|
Sleep = -1; // Default : client does not sleep.
|
|
ProcessPriority = 0; // Default : NORMAL
|
|
CPUMask = 0; // Default : auto detection
|
|
ShowPath = false; // Default : do not display the path.
|
|
DrawBoxes = false; // Default : Do not draw the selection.
|
|
|
|
UserSheet = "fyros.race_stats"; // Default sheet used.
|
|
Sex = GSGENDER::male; // Default : male.
|
|
|
|
PrimitiveHeightAddition = 2.f; // Default : 2.f
|
|
|
|
AttackDist = 0.5f;
|
|
RyzomDay = 0;
|
|
RyzomTime = 0.0f;
|
|
|
|
ManualWeatherSetup = false;
|
|
|
|
ChaseReactionTime = 0.4f; // Reaction time before chasing someone.
|
|
|
|
TimeToAdjustCamera = 1000.0;
|
|
ChangeDirAngle = 1.70f; // Default Angle.
|
|
|
|
GuildSymbolSize = 0.3f; // Default Guild Symbol Size.
|
|
SelectionDist = 150.f; // Default dist in meter.
|
|
SelectionOutBBoxWeight = 16.f; // Default factor
|
|
LootDist = 4.f; // Default loot/harvest distance (in meter).
|
|
SpaceSelectionDist = 50.f;
|
|
SpaceSelectionMaxCycle = 1;
|
|
|
|
ForceLanguage = false;
|
|
LanguageCode = "en"; // Default to english
|
|
DebugStringManager = false; // Default to no debug
|
|
|
|
// TUNING
|
|
WaterOffset = -1.085f;
|
|
FyrosWaterOffset = -1.0f;
|
|
MatisWaterOffset = -1.08f;
|
|
TrykerWaterOffset = -0.88f;
|
|
ZoraiWaterOffset = -1.25f;
|
|
WaterOffsetCreature = -1.6f;
|
|
TimeToRemoveCol = 1000;
|
|
MoveToTimeToStopStall = 500;
|
|
TPVMinPitch = -1.5f;
|
|
TPVMaxPitch = 1.5f;
|
|
MaxHeadTargetDist = 30.0f;
|
|
DeadFXName = "misc_dead.ps";
|
|
ImpactFXName = "impact.ps";
|
|
SkillUpFXName = "misc_levelup.ps";
|
|
MinDistFactor = 0.5;
|
|
NameScale = 1.0f; // Default Scale to display Names.
|
|
NamePos = 0.02f;
|
|
NameFontSize = 20;
|
|
MaxNameDist = 50.0f;
|
|
ConstNameSizeDist = 20.0f;
|
|
StaticNameHeight = true;
|
|
BarsHeight = 0.002f;
|
|
BarsWidth = 0.05f;
|
|
FightAreaSize = 1.5;
|
|
BubbleZBias = -3.f;
|
|
ForageInterfaceZBias= -10.f;
|
|
FyrosScale = 1.0f;
|
|
MatisScale = 1.08f;
|
|
TrykerScale = 0.88f;
|
|
ZoraiScale = 1.25f;
|
|
EnableRacialAnimation = true;
|
|
|
|
// OPTIONS
|
|
RunAtTheBeginning = true;
|
|
SelectWithRClick = false; // Default right click cannot select.
|
|
RotKeySpeedMax = 3.0f;
|
|
RotKeySpeedMin = 1.0f;
|
|
RotAccel = 0.001f;
|
|
PutBackItems = false;
|
|
ShowNameUnderCursor = true;
|
|
ShowNameSelected = true;
|
|
ShowNameBelowDistanceSqr = 20.f * 20.f;
|
|
ForceIndoorFPV = false;
|
|
FollowOnAtk = true;
|
|
AtkOnSelect = false;
|
|
TransparentUnderCursor = false;
|
|
|
|
// PREFERENCES
|
|
FPV = false;
|
|
CameraHeight = 2.5f;
|
|
CameraDistance = 3.0f;
|
|
CameraDistStep = 1.0f;
|
|
CameraDistMin = 1.0f;
|
|
CameraDistMax = 100.0f;
|
|
DmCameraDistMax = 25.0f;
|
|
CameraAccel = 0.2f;
|
|
CameraSpeedMin = 0.2f;
|
|
CameraSpeedMax = 1.0f;
|
|
CameraResetSpeed = 2.0f;
|
|
|
|
// VERBOSES
|
|
VerboseVP = false;
|
|
VerboseAnimUser = false;
|
|
VerboseAnimSelection = false;
|
|
VerboseAllTraffic = false;
|
|
|
|
// DEBUG
|
|
DisplayMissingAnimFile = false;
|
|
DefaultEntity = "ccafb1.creature";
|
|
RestrainPI = true;
|
|
DumpVSIndex = false;
|
|
HelpFontSize = 12;
|
|
HelpFontColor = CRGBA(255,255,255);
|
|
HelpLineStep = 0.025f;
|
|
DebugFontSize = 16;
|
|
DebugFontColor = CRGBA(250, 250, 250);
|
|
DebugLineStep = 0.02f;
|
|
HeadOffset = CVector(0.f, 0.f, 0.f);
|
|
Check = false;
|
|
BlendForward = true;
|
|
//
|
|
FPExceptions = false; // Disable Floating Point Exceptions.
|
|
DisplayWeapons = false; // Do not dusplay weapons in first person.
|
|
NeedComputeVS = false; // Do not need to compute Visual Slots.
|
|
//
|
|
GroundFXMaxDist = 40.f;
|
|
GroundFXMaxNB = 10;
|
|
GroundFXCacheSize = 10;
|
|
//
|
|
AutoReloadFiles = false;
|
|
BlendShapePatched = true;
|
|
ExtendedCommands = false;
|
|
|
|
WaterEnvMapUpdateTime = 1.f;
|
|
|
|
NumFrameForProfile = 0;
|
|
SimulateServerTick = false;
|
|
TimerMode= 0;
|
|
|
|
KlientChatPort= "";
|
|
|
|
PreCacheShapes = true;
|
|
ResetShapeBankOnRetCharSelect = false;
|
|
LandscapeEnabled = true;
|
|
VillagesEnabled = true;
|
|
EAMEnabled = true;
|
|
CacheUIParsing = false;
|
|
MicroLifeEnabled = true;
|
|
|
|
SkipEULA = false;
|
|
|
|
StageLCTUsage= StageUsePosOnlyLCT;
|
|
|
|
SimulatePacketLossRatio= 0;
|
|
|
|
CheckMemoryEveryNFrame= -1;
|
|
LogMemoryAllocation=false;
|
|
LogMemoryAllocationSize=8;
|
|
|
|
DamageShieldEnabled = false;
|
|
|
|
LevelDesignEnabled = false;
|
|
|
|
R2Mode = true;
|
|
R2EDEnabled = false;
|
|
R2EDExtendedDebug = false;
|
|
R2EDVerboseParseTime = false;
|
|
R2EDDontReparseUnchangedUIFiles = false;
|
|
R2EDLightPalette = false;
|
|
R2EDAutoSaveWait = 60*5;
|
|
R2EDAutoSaveSlot = 9;
|
|
R2EDMustVerifyRingAccessWhileLoadingAnimation = false;
|
|
R2EDUseVerboseRingAccess = false;
|
|
R2EDDssNetwork = 3;
|
|
|
|
DamageShieldEnabled = false;
|
|
|
|
AllowDebugLua = false;
|
|
DisplayLuaDebugInfo = false;
|
|
BeepWhenLaunched = false;
|
|
|
|
|
|
|
|
LoadingStringCount = 0;
|
|
|
|
LuaDebugInfoGotoButtonEnabled = false;
|
|
|
|
FogDistAndDepthLookupBias = 0.f;
|
|
|
|
R2EDLoadDynamicFeatures = 0;
|
|
|
|
CheckR2ScenarioMD5 = true;
|
|
|
|
DisplayTPReason = false;
|
|
|
|
//TPCancelButtonX = 988;
|
|
//TPCancelButtonY = 138;
|
|
//TPQuitButtonX = 8;
|
|
//TPQuitButtonY = 138;
|
|
TPButtonW = 32;
|
|
TPButtonH = 32;
|
|
|
|
//SAVE
|
|
ScenarioSavePath = "./my_scenarios/";
|
|
|
|
R2EDClippedEntityBlendTime = 0.18f;
|
|
|
|
BackgroundDownloader = false;
|
|
|
|
}// CClientConfig //
|
|
|
|
|
|
//---------------------------------------------------
|
|
// load :
|
|
// Load the client config file.
|
|
//---------------------------------------------------
|
|
void CClientConfig::setValuesOnFileChange()
|
|
{
|
|
// ClientCfg.ConfigFile.print (InfoLog);
|
|
|
|
// display an info only when the file change
|
|
nlinfo ("reloading the config file!");
|
|
|
|
setValues();
|
|
}
|
|
|
|
//---------------------------------------------------
|
|
// load :
|
|
// Load the client config file.
|
|
//---------------------------------------------------
|
|
void CClientConfig::setValues()
|
|
{
|
|
CConfigFile::CVar *varPtr = 0;
|
|
static bool firstTimeSetValues= true;
|
|
|
|
//////////////////////
|
|
// INTERFACE CONFIG //
|
|
// input files
|
|
READ_STRING_FV(XMLInputFile)
|
|
|
|
|
|
READ_BOOL_FV(SkipIntro);
|
|
READ_BOOL_DEV(SkipEULA);
|
|
READ_INT_DEV(SelectCharacter);
|
|
|
|
READ_INT_FV(SelectedSlot);
|
|
if( ClientCfg.SelectedSlot>4 )
|
|
{
|
|
ClientCfg.SelectedSlot = 0;
|
|
}
|
|
|
|
// interface textures login menus
|
|
READ_STRINGVECTOR_FV(TexturesLoginInterface);
|
|
READ_STRINGVECTOR_FV(TexturesLoginInterfaceDXTC);
|
|
|
|
// interface textures outgame menus
|
|
READ_STRINGVECTOR_FV(TexturesOutGameInterface);
|
|
READ_STRINGVECTOR_FV(TexturesOutGameInterfaceDXTC);
|
|
|
|
// interface textures ingame and r2
|
|
READ_STRINGVECTOR_FV(TexturesInterface);
|
|
READ_STRINGVECTOR_FV(TexturesInterfaceDXTC);
|
|
|
|
// interface files login menus
|
|
READ_STRINGVECTOR_FV(XMLLoginInterfaceFiles);
|
|
|
|
// interface files outgame menus
|
|
READ_STRINGVECTOR_FV(XMLOutGameInterfaceFiles);
|
|
|
|
// interface files
|
|
READ_STRINGVECTOR_FV(XMLInterfaceFiles);
|
|
|
|
// r2ed interfaces
|
|
READ_STRINGVECTOR_FV(XMLR2EDInterfaceFiles);
|
|
|
|
// logos
|
|
READ_STRINGVECTOR_FV(Logos);
|
|
|
|
// browser test mode
|
|
READ_BOOL_DEV(TestBrowser);
|
|
READ_STRING_DEV(TestBrowserUrl);
|
|
|
|
// ClientLight
|
|
#if !FINAL_VERSION
|
|
varPtr = ClientCfg.ConfigFile.getVarPtr ("ClientLight");
|
|
if (varPtr)
|
|
ClientCfg.Light = varPtr->asInt() ? true : false;
|
|
#endif // !FINAL_VERSION
|
|
|
|
|
|
READ_BOOL_DEV(LandscapeEnabled)
|
|
READ_BOOL_DEV(VillagesEnabled)
|
|
READ_BOOL_DEV(EAMEnabled)
|
|
READ_BOOL_DEV(CacheUIParsing)
|
|
READ_BOOL_DEV(MicroLifeEnabled)
|
|
|
|
READ_BOOL_DEV(LevelDesignEnabled)
|
|
|
|
///////////////////
|
|
// WINDOW CONFIG //
|
|
// Mode.
|
|
|
|
// SaveConfig
|
|
READ_BOOL_FV(SaveConfig)
|
|
|
|
// Window Positon
|
|
READ_INT_FV(PositionX)
|
|
READ_INT_FV(PositionY)
|
|
|
|
// Window frequency
|
|
READ_INT_FV(Frequency)
|
|
|
|
CConfigFile::CVar *pcvFullScreen = ClientCfg.ConfigFile.getVarPtr("FullScreen");
|
|
if( pcvFullScreen )
|
|
{
|
|
ClientCfg.Windowed = pcvFullScreen->asInt() ? false : true;
|
|
}
|
|
else
|
|
cfgWarning("Default value used for 'Fullscreen'");
|
|
// Width
|
|
READ_INT_FV(Width)
|
|
// Height
|
|
READ_INT_FV(Height)
|
|
// Depth : Bit Per Pixel
|
|
READ_INT_FV(Depth)
|
|
// Contrast
|
|
READ_FLOAT_FV(Contrast)
|
|
// Luminosity
|
|
READ_FLOAT_FV(Luminosity)
|
|
// Gamma
|
|
READ_FLOAT_FV(Gamma)
|
|
// 3D Driver
|
|
varPtr = ClientCfg.ConfigFile.getVarPtr ("Driver3D");
|
|
if (varPtr)
|
|
{
|
|
if (nlstricmp(varPtr->asString(), "Auto") == 0 || nlstricmp(varPtr->asString(), "0") == 0) ClientCfg.Driver3D = CClientConfig::DrvAuto;
|
|
else if (nlstricmp(varPtr->asString(), "OpenGL") == 0 || nlstricmp(varPtr->asString(), "1") == 0) ClientCfg.Driver3D = CClientConfig::OpenGL;
|
|
else if (nlstricmp(varPtr->asString(), "Direct3D") == 0 || nlstricmp(varPtr->asString(), "2") == 0) ClientCfg.Driver3D = CClientConfig::Direct3D;
|
|
else if (nlstricmp(varPtr->asString(), "OpenGLES") == 0 || nlstricmp(varPtr->asString(), "3") == 0) ClientCfg.Driver3D = CClientConfig::OpenGLES;
|
|
}
|
|
else
|
|
cfgWarning ("Default value used for 'Driver3D' !!!");
|
|
|
|
READ_BOOL_FV(VREnable)
|
|
READ_STRING_FV(VRDisplayDevice)
|
|
READ_STRING_FV(VRDisplayDeviceId)
|
|
|
|
////////////
|
|
// INPUTS //
|
|
READ_BOOL_FV(HardwareCursor)
|
|
READ_FLOAT_FV(HardwareCursorScale)
|
|
READ_FLOAT_FV(CursorSpeed)
|
|
READ_INT_FV(CursorAcceleration)
|
|
READ_FLOAT_FV(FreeLookSpeed)
|
|
READ_INT_FV(FreeLookAcceleration)
|
|
READ_FLOAT_FV(FreeLookSmoothingPeriod)
|
|
READ_BOOL_FV(FreeLookInverted)
|
|
READ_BOOL_FV(AutomaticCamera)
|
|
READ_BOOL_FV(DblClickMode)
|
|
READ_BOOL_FV(AutoEquipTool)
|
|
|
|
/////////
|
|
// NET //
|
|
#if !FINAL_VERSION
|
|
// Local : local mode or network mode
|
|
READ_BOOL_DEV(Local)
|
|
#endif // FINAL_VERSION
|
|
// FSHost
|
|
READ_STRING_FV(FSHost)
|
|
|
|
READ_BOOL_DEV(DisplayAccountButtons)
|
|
READ_STRING_DEV(CreateAccountURL)
|
|
READ_STRING_DEV(EditAccountURL)
|
|
READ_STRING_DEV(ForgetPwdURL)
|
|
READ_STRING_DEV(BetaAccountURL)
|
|
READ_STRING_DEV(FreeTrialURL)
|
|
|
|
// defined in client_default.cfg
|
|
READ_STRING_FV(ConditionsTermsURL)
|
|
READ_STRING_FV(NamingPolicyURL)
|
|
READ_STRING_FV(LoginSupportURL)
|
|
|
|
#ifndef RZ_NO_CLIENT
|
|
// if cookie is not empty, it means that the client was launch
|
|
// by the nel_launcher, so it can't be local
|
|
if(!Cookie.empty())
|
|
{
|
|
nlassert (!FSAddr.empty());
|
|
ClientCfg.Local = false;
|
|
}
|
|
else
|
|
{
|
|
nlassert (FSAddr.empty());
|
|
}
|
|
#endif
|
|
|
|
/////////////////
|
|
// USER ENTITY //
|
|
READ_CVECTOR_DEV(Position)
|
|
READ_CVECTOR_DEV(Heading)
|
|
// EyesHeight
|
|
READ_FLOAT_DEV(EyesHeight)
|
|
|
|
// Walk
|
|
READ_FLOAT_DEV(Walk)
|
|
// Run
|
|
READ_FLOAT_DEV(Run)
|
|
|
|
//When editing or Dm ing a session in ring mode the player move quicker
|
|
// DM Walk
|
|
READ_FLOAT_DEV(DmWalk)
|
|
// DM Run
|
|
READ_FLOAT_DEV(DmRun)
|
|
|
|
|
|
|
|
// Fly
|
|
READ_FLOAT_DEV(Fly)
|
|
READ_FLOAT_DEV(FlyAccel)
|
|
|
|
READ_BOOL_FV(AllowDebugCommands)
|
|
|
|
// ForceDeltaTime
|
|
READ_INT_DEV(ForceDeltaTime)
|
|
|
|
////////////
|
|
// RENDER //
|
|
// Background Color
|
|
#if !FINAL_VERSION
|
|
CConfigFile::CVar *pcvBackColor = ClientCfg.ConfigFile.getVarPtr("Background");
|
|
if( pcvBackColor && (pcvBackColor->size()==3) )
|
|
{
|
|
ClientCfg.BGColor.R = pcvBackColor->asInt(0);
|
|
ClientCfg.BGColor.G = pcvBackColor->asInt(1);
|
|
ClientCfg.BGColor.B = pcvBackColor->asInt(2);
|
|
ClientCfg.BGColor.A = 255;
|
|
}
|
|
else
|
|
cfgWarning("Default value used for 'Background'");
|
|
#endif // !FINAL_VERSION
|
|
// LandscapeTileNear
|
|
READ_FLOAT_FV(LandscapeTileNear)
|
|
// LandscapeThreshold
|
|
READ_FLOAT_FV(LandscapeThreshold)
|
|
// to be backward compatible, suppose a value<1 is for the old System!!! => invert it!
|
|
if( ClientCfg.LandscapeThreshold<1)
|
|
{
|
|
ClientCfg.LandscapeThreshold= 1.f/ ClientCfg.LandscapeThreshold;
|
|
// must re-write in the CFG database, to be ok with the in-game configurator
|
|
varPtr = ClientCfg.ConfigFile.getVarPtr("LandscapeThreshold");
|
|
if(varPtr)
|
|
varPtr->forceAsDouble(ClientCfg.LandscapeThreshold);
|
|
}
|
|
// Vision
|
|
READ_FLOAT_FV(Vision)
|
|
READ_FLOAT_FV(Vision_min)
|
|
READ_FLOAT_FV(Vision_max)
|
|
// SkinNbMaxPoly
|
|
READ_INT_FV(SkinNbMaxPoly)
|
|
// FxNbMaxPoly
|
|
READ_INT_FV(FxNbMaxPoly)
|
|
READ_BOOL_FV(Cloud)
|
|
READ_FLOAT_FV(CloudQuality)
|
|
READ_INT_FV(CloudUpdate)
|
|
// NbMaxSkeletonNotCLod
|
|
READ_INT_FV(NbMaxSkeletonNotCLod)
|
|
// CharacterFarClip
|
|
READ_FLOAT_FV(CharacterFarClip)
|
|
|
|
// Bloom
|
|
READ_BOOL_FV(Bloom)
|
|
READ_BOOL_FV(SquareBloom)
|
|
READ_FLOAT_FV(DensityBloom)
|
|
|
|
// FXAA
|
|
READ_BOOL_FV(FXAA)
|
|
|
|
// ScreenAspectRatio.
|
|
READ_FLOAT_FV(ScreenAspectRatio)
|
|
// FoV.
|
|
READ_FLOAT_FV(FoV)
|
|
// ForceDXTC
|
|
READ_BOOL_FV(ForceDXTC)
|
|
// AnisotropicFilter
|
|
READ_INT_FV(AnisotropicFilter)
|
|
// DivideTextureSizeBy2
|
|
READ_BOOL_FV(DivideTextureSizeBy2)
|
|
// DisableVtxProgram
|
|
READ_BOOL_FV(DisableVtxProgram)
|
|
// DisableVtxAGP
|
|
READ_BOOL_FV(DisableVtxAGP)
|
|
// DisableTextureShdr
|
|
READ_BOOL_FV(DisableTextureShdr)
|
|
// MicroVeget
|
|
READ_BOOL_FV(MicroVeget)
|
|
// MicroVeget Density
|
|
READ_FLOAT_FV(MicroVegetDensity)
|
|
// GlobalWindPower: Global Wind Power
|
|
READ_FLOAT_DEV(GlobalWindPower)
|
|
// Global Wind Direction
|
|
READ_CVECTOR_DEV(GlobalWindDirection)
|
|
// HDEntityTexture
|
|
READ_BOOL_FV(HDEntityTexture)
|
|
// HDTextureInstalled
|
|
READ_BOOL_FV(HDTextureInstalled)
|
|
|
|
// Fog
|
|
READ_BOOL_DEV(Fog)
|
|
|
|
// WaitVBL
|
|
READ_BOOL_FV(WaitVBL)
|
|
// VideoMemory
|
|
READ_INT_FV(VideoMemory);
|
|
|
|
READ_INT_DEV(TimerMode)
|
|
|
|
// MovieShooterMemory
|
|
CConfigFile::CVar *pcv = ClientCfg.ConfigFile.getVarPtr("MovieShooterMemory");
|
|
if( pcv )
|
|
{
|
|
ClientCfg.MovieShooterMemory = pcv->asInt();
|
|
// Transform to octet
|
|
ClientCfg.MovieShooterMemory *= 1024*1024;
|
|
}
|
|
else
|
|
cfgWarning("'MovieShooterMemory' not found => MovieShooter Disabled");
|
|
// MovieShooterPath
|
|
READ_STRING_FV(MovieShooterPath)
|
|
// MovieShooterFramePeriod
|
|
READ_FLOAT_FV(MovieShooterFramePeriod)
|
|
// MovieShooterBlend
|
|
READ_BOOL_FV(MovieShooterBlend)
|
|
// MovieShooterFrameSkip
|
|
READ_INT_FV(MovieShooterFrameSkip)
|
|
|
|
// Camera Recorder
|
|
READ_STRING_FV(CameraRecorderPath)
|
|
READ_STRING_FV(CameraRecorderPrefix)
|
|
READ_BOOL_FV(CameraRecorderBlend)
|
|
|
|
// Screenshot
|
|
READ_INT_FV(ScreenShotWidth)
|
|
READ_INT_FV(ScreenShotHeight)
|
|
READ_BOOL_FV(ScreenShotFullDetail)
|
|
READ_BOOL_FV(ScreenShotZBuffer)
|
|
|
|
/////////////////////////
|
|
// NEW PATCHING SYSTEM //
|
|
READ_BOOL_DEV(PatchWanted)
|
|
|
|
#ifdef RZ_USE_CUSTOM_PATCH_SERVER
|
|
READ_STRING_FV(PatchUrl)
|
|
READ_STRING_FV(PatchVersion)
|
|
READ_STRING_FV(RingReleaseNotePath)
|
|
READ_STRING_FV(ReleaseNotePath)
|
|
#else
|
|
READ_STRING_DEV(PatchUrl)
|
|
READ_STRING_DEV(PatchVersion)
|
|
READ_STRING_DEV(RingReleaseNotePath)
|
|
READ_STRING_DEV(ReleaseNotePath)
|
|
#endif
|
|
|
|
/////////////////////////
|
|
// NEW PATCHLET SYSTEM //
|
|
READ_STRING_FV(PatchletUrl)
|
|
|
|
///////////
|
|
// WEBIG //
|
|
READ_STRING_FV(WebIgMainDomain);
|
|
READ_STRINGVECTOR_FV(WebIgTrustedDomains);
|
|
READ_INT_FV(CurlMaxConnections);
|
|
if (ClientCfg.CurlMaxConnections < 0)
|
|
ClientCfg.CurlMaxConnections = 2;
|
|
|
|
///////////////
|
|
// ANIMATION //
|
|
// AnimatedAngleThreshold
|
|
READ_DOUBLE_DEV(AnimatedAngleThreshold)
|
|
// BlendFrameNumber
|
|
READ_INT_DEV(BlendFrameNumber)
|
|
// DestThreshold
|
|
READ_DOUBLE_DEV(DestThreshold)
|
|
// PositionLimiterRadius
|
|
READ_DOUBLE_DEV(PositionLimiterRadius)
|
|
// SignificantDist
|
|
READ_DOUBLE_DEV(SignificantDist)
|
|
// Stage LCT usage
|
|
READ_ENUM_ASINT_DEV(TStageLCTUsage, StageLCTUsage)
|
|
|
|
////////////
|
|
// TUNING //
|
|
// Water Offset
|
|
READ_FLOAT_DEV(WaterOffset)
|
|
|
|
#if !FINAL_VERSION
|
|
READ_FLOAT_DEV(FyrosWaterOffset)
|
|
READ_FLOAT_DEV(MatisWaterOffset)
|
|
READ_FLOAT_DEV(TrykerWaterOffset)
|
|
READ_FLOAT_DEV(ZoraiWaterOffset)
|
|
#endif // FINAL_VERSION
|
|
|
|
// Water Offset for creature
|
|
READ_FLOAT_DEV(WaterOffsetCreature)
|
|
// TimeToRemoveCol
|
|
READ_INT_DEV(TimeToRemoveCol)
|
|
// MoveToTimeToStopStall
|
|
READ_INT_DEV(MoveToTimeToStopStall)
|
|
// TimeToAdjustCamera
|
|
READ_DOUBLE_DEV(TimeToAdjustCamera)
|
|
// ChangeDirAngle
|
|
READ_DOUBLE_DEV(ChangeDirAngle)
|
|
// GuildSymbolSize
|
|
READ_FLOAT_DEV(GuildSymbolSize)
|
|
// SelectionDist
|
|
READ_FLOAT_DEV(SelectionDist)
|
|
// SelectionOutBBoxWeight
|
|
READ_FLOAT_DEV(SelectionOutBBoxWeight)
|
|
// LootDist
|
|
READ_FLOAT_DEV(LootDist)
|
|
// SpaceSelectionDist
|
|
READ_FLOAT_DEV(SpaceSelectionDist)
|
|
// SpaceSelectionMaxCycle
|
|
READ_INT_DEV(SpaceSelectionMaxCycle)
|
|
// Third Person View Min Pitch.
|
|
READ_FLOAT_DEV(TPVMinPitch)
|
|
// Third Person View Max Pitch.
|
|
READ_FLOAT_DEV(TPVMaxPitch)
|
|
// The character look at the target before this distance.
|
|
READ_FLOAT_DEV(MaxHeadTargetDist)
|
|
// FX played when dead
|
|
READ_STRING_DEV(DeadFXName)
|
|
// FX played for each impact
|
|
READ_STRING_DEV(ImpactFXName)
|
|
// FX Played at skill up
|
|
READ_STRING_DEV(SkillUpFXName)
|
|
// MinDistFactor
|
|
READ_DOUBLE_DEV(MinDistFactor)
|
|
// NameScale
|
|
READ_FLOAT_DEV(NameScale)
|
|
// NamePos
|
|
READ_FLOAT_DEV(NamePos)
|
|
// NameFontSize
|
|
READ_INT_DEV(NameFontSize)
|
|
// MaxNameDist
|
|
READ_FLOAT_DEV(MaxNameDist)
|
|
// ConstNameSizeDist
|
|
READ_FLOAT_DEV(ConstNameSizeDist)
|
|
// StaticNameHeight
|
|
READ_BOOL_FV(StaticNameHeight)
|
|
// BarsHeight
|
|
READ_FLOAT_DEV(BarsHeight)
|
|
// BarsWidth
|
|
READ_FLOAT_DEV(BarsWidth)
|
|
// DisplayWeapons
|
|
READ_BOOL_FV(DisplayWeapons)
|
|
// FightAreaSize
|
|
READ_DOUBLE_DEV(FightAreaSize)
|
|
// AttackDist
|
|
READ_FLOAT_DEV(AttackDist)
|
|
// BubbleZBias
|
|
READ_FLOAT_DEV(BubbleZBias);
|
|
// ForageInterfaceZBias
|
|
READ_FLOAT_DEV(ForageInterfaceZBias);
|
|
|
|
// EnableRacialAnimation
|
|
READ_BOOL_FV(EnableRacialAnimation);
|
|
|
|
#if !FINAL_VERSION
|
|
READ_FLOAT_DEV(FyrosScale);
|
|
READ_FLOAT_DEV(MatisScale);
|
|
READ_FLOAT_DEV(TrykerScale);
|
|
READ_FLOAT_DEV(ZoraiScale);
|
|
|
|
#endif // FINAL_VERSION
|
|
|
|
//////////////////
|
|
// SOUND CONFIG //
|
|
// SoundOn
|
|
READ_BOOL_FV(SoundOn)
|
|
// Sound Driver
|
|
varPtr = ClientCfg.ConfigFile.getVarPtr ("DriverSound");
|
|
if (varPtr)
|
|
{
|
|
if (nlstricmp(varPtr->asString(), "Auto") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvAuto;
|
|
else if (nlstricmp(varPtr->asString(), "FMod") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvFMod;
|
|
else if (nlstricmp(varPtr->asString(), "OpenAL") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvOpenAL;
|
|
else if (nlstricmp(varPtr->asString(), "DirectSound") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvDirectSound;
|
|
else if (nlstricmp(varPtr->asString(), "XAudio2") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvXAudio2;
|
|
}
|
|
else
|
|
cfgWarning ("Default value used for 'DriverSound' !!!");
|
|
// SoundForceSoftwareBuffer
|
|
READ_BOOL_FV(SoundForceSoftwareBuffer);
|
|
// SoundOutGameMusic
|
|
READ_STRING_DEV(SoundOutGameMusic)
|
|
// SoundSFXVolume
|
|
READ_FLOAT_FV(SoundSFXVolume);
|
|
// SoundGameMusicVolume
|
|
READ_FLOAT_FV(SoundGameMusicVolume);
|
|
// SoundTPFade
|
|
READ_INT_DEV(SoundTPFade);
|
|
// EnableBackgroundMusicTimeConstraint
|
|
READ_BOOL_DEV(EnableBackgroundMusicTimeConstraint);
|
|
// SoundPackedSheetPath
|
|
READ_STRING_DEV(SoundPackedSheetPath)
|
|
// SampleBankDir
|
|
READ_STRING_DEV(SampleBankDir)
|
|
// UserEntitySoundLevel : UserEntity sound level
|
|
READ_FLOAT_FV(UserEntitySoundLevel)
|
|
// Use EAX
|
|
READ_BOOL_FV(UseEax)
|
|
// UseADPCM
|
|
READ_BOOL_DEV(UseADPCM)
|
|
// Max track
|
|
READ_INT_FV(MaxTrack)
|
|
|
|
/////////////////
|
|
// USER COLORS //
|
|
// Shout Color
|
|
CConfigFile::CVar *pcvColorShout = ClientCfg.ConfigFile.getVarPtr("ColorShout");
|
|
if( pcvColorShout && (pcvColorShout->size() == 3) )
|
|
{
|
|
ClientCfg.ColorShout.R = pcvColorShout->asInt(0);
|
|
ClientCfg.ColorShout.G = pcvColorShout->asInt(1);
|
|
ClientCfg.ColorShout.B = pcvColorShout->asInt(2);
|
|
ClientCfg.ColorShout.A = 255;
|
|
}
|
|
else
|
|
cfgWarning("Default value used for 'ColorShout'");
|
|
|
|
// Talk Color
|
|
CConfigFile::CVar *pcvColorTalk = ClientCfg.ConfigFile.getVarPtr("ColorTalk");
|
|
if( pcvColorTalk && (pcvColorTalk->size() == 3) )
|
|
{
|
|
ClientCfg.ColorTalk.R = pcvColorTalk->asInt(0);
|
|
ClientCfg.ColorTalk.G = pcvColorTalk->asInt(1);
|
|
ClientCfg.ColorTalk.B = pcvColorTalk->asInt(2);
|
|
ClientCfg.ColorTalk.A = 255;
|
|
}
|
|
else
|
|
cfgWarning("Default value used for 'ColorTalk'");
|
|
|
|
//////////
|
|
// MISC //
|
|
// Pre Data Path.
|
|
READ_STRINGVECTOR_FV(PreDataPath);
|
|
|
|
// Data Path.
|
|
READ_STRINGVECTOR_FV(DataPath);
|
|
|
|
// List of files that trigger R2ED reload when touched
|
|
READ_STRINGVECTOR_FV(R2EDReloadFiles);
|
|
|
|
// Data Path no recurse.
|
|
READ_STRINGVECTOR_FV(DataPathNoRecurse);
|
|
|
|
// Update packed sheet Path
|
|
READ_STRINGVECTOR_FV(UpdatePackedSheetPath);
|
|
|
|
// UpdatePackedSheet
|
|
READ_BOOL_DEV(UpdatePackedSheet)
|
|
|
|
// EndScreenTimeOut
|
|
READ_FLOAT_DEV(EndScreenTimeOut)
|
|
// Backgrounds
|
|
READ_STRING_FV(Loading_BG)
|
|
READ_STRING_FV(LoadingFreeTrial_BG)
|
|
READ_STRING_FV(Launch_BG)
|
|
READ_STRING_FV(TeleportKami_BG)
|
|
READ_STRING_FV(TeleportKaravan_BG)
|
|
READ_STRING_FV(Elevator_BG)
|
|
READ_STRING_FV(ResurectKami_BG)
|
|
READ_STRING_FV(ResurectKaravan_BG)
|
|
READ_STRING_FV(End_BG)
|
|
READ_STRING_FV(IntroNevrax_BG)
|
|
READ_STRING_FV(IntroNVidia_BG)
|
|
|
|
READ_FLOAT_DEV(TipsY)
|
|
READ_FLOAT_DEV(TeleportInfoY)
|
|
// SceneName
|
|
READ_STRING_DEV(SceneName)
|
|
// IdFile Path
|
|
READ_STRING_DEV(IdFilePath)
|
|
|
|
// PacsPrimDir
|
|
READ_STRINGVECTOR_DEV(PacsPrimDir);
|
|
|
|
/////////////
|
|
// FILTERS //
|
|
createDebug ();
|
|
CConfigFile::CVar *pcvTmp = ClientCfg.ConfigFile.getVarPtr("NegFiltersDebug");
|
|
if( pcvTmp )
|
|
{
|
|
int iSz = pcvTmp->size();
|
|
for(int k = 0; k < iSz; ++k)
|
|
{
|
|
DebugLog->addNegativeFilter (pcvTmp->asString(k).c_str());
|
|
}
|
|
}
|
|
else
|
|
cfgWarning("Default value used for 'NegFiltersDebug'");
|
|
|
|
pcvTmp = ClientCfg.ConfigFile.getVarPtr("NegFiltersInfo");
|
|
if( pcvTmp )
|
|
{
|
|
int iSz = pcvTmp->size();
|
|
for(int k = 0; k < iSz; ++k)
|
|
{
|
|
InfoLog->addNegativeFilter (pcvTmp->asString(k).c_str());
|
|
}
|
|
}
|
|
else
|
|
cfgWarning("Default value used for 'NegFiltersInfo'");
|
|
|
|
pcvTmp = ClientCfg.ConfigFile.getVarPtr("NegFiltersWarning");
|
|
if( pcvTmp )
|
|
{
|
|
int iSz = pcvTmp->size();
|
|
for(int k = 0; k < iSz; ++k)
|
|
{
|
|
WarningLog->addNegativeFilter (pcvTmp->asString(k).c_str());
|
|
}
|
|
}
|
|
else
|
|
cfgWarning("Default value used for 'NegFiltersWarning'");
|
|
|
|
// Script Files
|
|
READ_STRINGVECTOR_FV(StartCommands);
|
|
|
|
/////////////
|
|
// OPTIONS //
|
|
// Colors for system infos
|
|
ClientCfg.SystemInfoParams.clear();
|
|
CConfigFile::CVar *sic = ClientCfg.ConfigFile.getVarPtr("SystemInfoColors");
|
|
if (!sic)
|
|
{
|
|
cfgWarning("Can't read SystemInfoColors, all colors defaulting to white");
|
|
}
|
|
else
|
|
{
|
|
if (sic->size() & 1)
|
|
{
|
|
cfgWarning("Expecting odd size for SystemInfoColors. Last entry ignored.");
|
|
}
|
|
uint numCol = sic->size() >> 1;
|
|
for(uint k = 0; k < numCol; ++k)
|
|
{
|
|
uint r, g, b, a;
|
|
char mode[64];
|
|
char fx[64];
|
|
fx[0]='\0';
|
|
if (sscanf(sic->asString((2 * k) + 1).c_str(), "%d %d %d %d %s %s", &r, &g, &b, &a, mode, fx) < 5)
|
|
{
|
|
if(DisplayCFGWarning)
|
|
nlwarning("Can't parse color for entry %s", sic->asString(2 * k).c_str());
|
|
}
|
|
else
|
|
{
|
|
SSysInfoParam p;
|
|
|
|
p.Color = CRGBA(r, g, b, a);
|
|
p.Mode = SSysInfoParam::Normal;
|
|
p.SysInfoFxName = string(fx);
|
|
if (stricmp(mode, "over") == 0) p.Mode = SSysInfoParam::Over;
|
|
else if (stricmp(mode, "overonly") == 0) p.Mode = SSysInfoParam::OverOnly;
|
|
else if (stricmp(mode, "center") == 0) p.Mode = SSysInfoParam::Center;
|
|
else if (stricmp(mode, "centeraround") == 0) p.Mode = SSysInfoParam::CenterAround;
|
|
else if (stricmp(mode, "around") == 0) p.Mode = SSysInfoParam::Around;
|
|
|
|
ClientCfg.SystemInfoParams[toLower(sic->asString(2 * k))] = p;
|
|
}
|
|
}
|
|
}
|
|
|
|
#ifndef RZ_NO_CLIENT
|
|
// printf commands in loading screens
|
|
ClientCfg.PrintfCommands.clear();
|
|
ClientCfg.PrintfCommandsFreeTrial.clear();
|
|
std::vector< std::string > printfCommands(2);
|
|
printfCommands[0] = "PrintfCommands";
|
|
printfCommands[1] = "PrintfCommandsFreeTrial";
|
|
for(uint p=0; p<2; p++)
|
|
{
|
|
CConfigFile::CVar *pc = ClientCfg.ConfigFile.getVarPtr(printfCommands[p].c_str());
|
|
if (pc)
|
|
{
|
|
if( pc->size()%5 == 0 && pc->size() >= 5)
|
|
{
|
|
for (uint i = 0; i < pc->size(); i+=5)
|
|
{
|
|
SPrintfCommand pcom;
|
|
pcom.X = pc->asInt(i);
|
|
pcom.Y = pc->asInt(i+1);
|
|
pcom.Color = CRGBA::stringToRGBA( pc->asString(i+2).c_str() );
|
|
pcom.FontSize = pc->asInt(i+3);
|
|
pcom.Text = pc->asString(i+4);
|
|
|
|
if(p==0) ClientCfg.PrintfCommands.push_back( pcom );
|
|
else ClientCfg.PrintfCommandsFreeTrial.push_back( pcom );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
cfgWarning(("Missing or too many parameters in " + printfCommands[p]).c_str());
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
READ_INT_FV(LoadingStringCount)
|
|
|
|
// DEBUG MEMORY
|
|
READ_INT_DEV(CheckMemoryEveryNFrame)
|
|
READ_BOOL_DEV(LogMemoryAllocation)
|
|
READ_INT_DEV(LogMemoryAllocationSize)
|
|
|
|
// SelectWithRClick
|
|
READ_BOOL_FV(SelectWithRClick)
|
|
READ_BOOL_DEV(RunAtTheBeginning)
|
|
READ_FLOAT_FV(RotKeySpeedMax)
|
|
READ_FLOAT_FV(RotKeySpeedMin)
|
|
READ_FLOAT_FV(RotAccel)
|
|
READ_BOOL_DEV(PutBackItems)
|
|
READ_BOOL_DEV(ShowNameUnderCursor)
|
|
READ_BOOL_DEV(ShowNameSelected)
|
|
READ_FLOAT_DEV(ShowNameBelowDistanceSqr)
|
|
READ_BOOL_DEV(ForceIndoorFPV)
|
|
READ_BOOL_FV(FollowOnAtk);
|
|
READ_BOOL_FV(AtkOnSelect);
|
|
READ_BOOL_DEV(TransparentUnderCursor);
|
|
|
|
|
|
/////////////////
|
|
// PREFERENCES //
|
|
// Read the view mode at load time only, cause prefer keep ingame player setup
|
|
if(firstTimeSetValues)
|
|
{
|
|
READ_BOOL_FV(FPV)
|
|
}
|
|
READ_FLOAT_FV(CameraDistStep)
|
|
READ_FLOAT_FV(CameraDistMin)
|
|
READ_FLOAT_FV(CameraDistMax)
|
|
READ_FLOAT_FV(DmCameraDistMax)
|
|
READ_FLOAT_FV(CameraAccel)
|
|
READ_FLOAT_FV(CameraSpeedMin)
|
|
READ_FLOAT_FV(CameraSpeedMax)
|
|
READ_FLOAT_FV(CameraResetSpeed)
|
|
// Read the camera height and distance at load time only, cause prefer keep ingame player setup
|
|
if(firstTimeSetValues)
|
|
{
|
|
READ_FLOAT_FV(CameraHeight)
|
|
READ_FLOAT_FV(CameraDistance)
|
|
}
|
|
|
|
|
|
/////////////
|
|
// SHADOWS //
|
|
// Shadows : Get Shadows state
|
|
READ_BOOL_FV(Shadows)
|
|
// ShadowsClipFar : Get Shadows Clip Far.
|
|
READ_FLOAT_DEV(ShadowsClipFar)
|
|
// ShadowsLodDist : Get Shadows Lod Distance.
|
|
READ_FLOAT_DEV(ShadowsLodDist)
|
|
// ZClamp
|
|
READ_FLOAT_DEV(ShadowZDirClampLandscape);
|
|
READ_FLOAT_DEV(ShadowZDirClampInterior);
|
|
READ_FLOAT_DEV(ShadowZDirClampSmoothSpeed);
|
|
// MaxDepth
|
|
READ_FLOAT_DEV(ShadowMaxDepthLandscape);
|
|
READ_FLOAT_DEV(ShadowMaxDepthInterior);
|
|
READ_FLOAT_DEV(ShadowMaxDepthSmoothSpeed);
|
|
|
|
|
|
////////////////
|
|
// GROUND FXS //
|
|
////////////////
|
|
READ_FLOAT_DEV(GroundFXMaxDist)
|
|
READ_INT_DEV(GroundFXMaxNB)
|
|
READ_INT_DEV(GroundFXCacheSize)
|
|
|
|
// Names : Get Names state
|
|
READ_BOOL_FV(Names)
|
|
// Sleep
|
|
READ_INT_FV(Sleep)
|
|
// ProcessPriority
|
|
READ_INT_FV(ProcessPriority)
|
|
// CPUMask
|
|
READ_INT_FV(CPUMask)
|
|
// ShowPath : Get the ShowPath value.
|
|
READ_BOOL_DEV(ShowPath)
|
|
// UserSheet : Get the sheet to used for the use rin Local mode.
|
|
READ_STRING_DEV(UserSheet)
|
|
#if !FINAL_VERSION
|
|
// Sex
|
|
varPtr = ClientCfg.ConfigFile.getVarPtr("Sex");
|
|
if(varPtr)
|
|
ClientCfg.Sex = (GSGENDER::EGender)varPtr->asInt();
|
|
else
|
|
cfgWarning("Default value used for 'Sex' !!!");
|
|
#endif // FINAL_VERSION
|
|
// PrimitiveHeightAddition
|
|
READ_BOOL_DEV(PrimitiveHeightAddition)
|
|
// DrawBoxes
|
|
READ_BOOL_DEV(DrawBoxes)
|
|
|
|
|
|
// ChaseReactionTime
|
|
READ_FLOAT_DEV(ChaseReactionTime)
|
|
// RyzomTime
|
|
READ_FLOAT_DEV(RyzomTime)
|
|
// RyzomDay
|
|
READ_INT_DEV(RyzomDay)
|
|
// ManualWeatherSetup
|
|
READ_BOOL_DEV(ManualWeatherSetup)
|
|
// LanguageCode
|
|
READ_BOOL_DEV(ForceLanguage)
|
|
if (!ClientCfg.ForceLanguage)
|
|
{
|
|
READ_STRING_FV(LanguageCode)
|
|
}
|
|
// DebugStringManager
|
|
READ_BOOL_DEV(DebugStringManager)
|
|
|
|
// LastLogin
|
|
READ_STRING_FV(LastLogin)
|
|
|
|
//////////////
|
|
// VERBOSES //
|
|
READ_BOOL_DEV(VerboseVP)
|
|
READ_BOOL_DEV(VerboseAnimUser)
|
|
READ_BOOL_DEV(VerboseAnimSelection)
|
|
READ_BOOL_DEV(VerboseAllTraffic)
|
|
|
|
READ_STRING_DEV(LigoPrimitiveClass);
|
|
|
|
///////////
|
|
// DEBUG //
|
|
READ_INT_DEV(SimulatePacketLossRatio)
|
|
READ_BOOL_DEV(PreCacheShapes)
|
|
READ_BOOL_FV(ResetShapeBankOnRetCharSelect)
|
|
READ_BOOL_DEV(DisplayMissingAnimFile)
|
|
READ_STRING_DEV(DefaultEntity)
|
|
READ_BOOL_DEV(RestrainPI)
|
|
READ_BOOL_DEV(DumpVSIndex)
|
|
READ_INT_DEV(HelpFontSize)
|
|
#if !FINAL_VERSION
|
|
// HelpFontColor
|
|
{
|
|
CConfigFile::CVar *cvHelpFontColor = ClientCfg.ConfigFile.getVarPtr("HelpFontColor");
|
|
if(cvHelpFontColor && cvHelpFontColor->size() == 3)
|
|
{
|
|
ClientCfg.HelpFontColor.R = cvHelpFontColor->asInt(0);
|
|
ClientCfg.HelpFontColor.G = cvHelpFontColor->asInt(1);
|
|
ClientCfg.HelpFontColor.B = cvHelpFontColor->asInt(2);
|
|
ClientCfg.HelpFontColor.A = 255;
|
|
}
|
|
else
|
|
cfgWarning("Default value used for 'HelpFontColor' !!!");
|
|
}
|
|
#endif // !FINAL_VERSION
|
|
// HelpLineStep
|
|
READ_FLOAT_DEV(HelpLineStep)
|
|
|
|
READ_INT_DEV(DebugFontSize)
|
|
#if !FINAL_VERSION
|
|
// DebugFontColor
|
|
CConfigFile::CVar *pcvDebugFontColor = ClientCfg.ConfigFile.getVarPtr("DebugFontColor");
|
|
if( pcvDebugFontColor && (pcvDebugFontColor->size() == 3) )
|
|
{
|
|
ClientCfg.DebugFontColor.R = pcvDebugFontColor->asInt(0);
|
|
ClientCfg.DebugFontColor.G = pcvDebugFontColor->asInt(1);
|
|
ClientCfg.DebugFontColor.B = pcvDebugFontColor->asInt(2);
|
|
ClientCfg.DebugFontColor.A = 255;
|
|
}
|
|
else
|
|
cfgWarning("Default value used for 'DebugFontColor'");
|
|
#endif // !FINAL_VERSION
|
|
READ_FLOAT_DEV(DebugLineStep)
|
|
|
|
// HeadOffset
|
|
READ_CVECTOR_DEV(HeadOffset)
|
|
READ_BOOL_DEV(FPExceptions)
|
|
READ_BOOL_DEV(NeedComputeVS)
|
|
READ_BOOL_DEV(Check)
|
|
READ_BOOL_DEV(UsePACSForAll)
|
|
READ_FLOAT_DEV(WaterEnvMapUpdateTime)
|
|
READ_BOOL_DEV(BlendForward)
|
|
|
|
ClientCfg.ZCPacsPrim = "gen_bt_col_ext.pacs_prim";
|
|
READ_STRING_DEV(ZCPacsPrim)
|
|
|
|
READ_BOOL_FV(AutoReloadFiles)
|
|
READ_BOOL_DEV(BlendShapePatched)
|
|
|
|
READ_INT_DEV(MaxNumberOfTimedFXInstances);
|
|
|
|
READ_STRING_DEV(SelectionFX);
|
|
READ_STRING_DEV(MouseOverFX);
|
|
READ_FLOAT_DEV(SelectionFXSize);
|
|
|
|
if(ClientCfg.ConfigFile.exists("ExtendedCommands") && ClientCfg.ConfigFile.getVar("ExtendedCommands").asString() == "Enable")
|
|
ClientCfg.ExtendedCommands = true;
|
|
|
|
|
|
READ_BOOL_DEV(R2Mode);
|
|
if (ClientCfg.Local) // R2EDEnabled is now set by the server
|
|
{
|
|
READ_BOOL_DEV(R2EDEnabled)
|
|
}
|
|
READ_INT_FV(R2EDDssNetwork)
|
|
|
|
|
|
if (ClientCfg.Local)
|
|
{
|
|
ClientCfg.R2EDDssNetwork = 1;
|
|
}
|
|
|
|
READ_BOOL_DEV(R2EDExtendedDebug)
|
|
#if FINAL_VERSION
|
|
{
|
|
CConfigFile::CVar *var = ClientCfg.ConfigFile.getVarPtr("R2EDExtendedDebug");
|
|
if (var)
|
|
{
|
|
var->setAsInt(0);
|
|
}
|
|
// else no-op -> will resolve to 'nil' into lua
|
|
}
|
|
#endif
|
|
|
|
|
|
READ_BOOL_DEV(R2EDVerboseParseTime)
|
|
READ_BOOL_DEV(R2EDDontReparseUnchangedUIFiles)
|
|
READ_BOOL_DEV(R2EDLightPalette)
|
|
READ_INT_FV(R2EDAutoSaveWait)
|
|
READ_INT_FV(R2EDAutoSaveSlot)
|
|
READ_BOOL_DEV(R2EDMustVerifyRingAccessWhileLoadingAnimation)
|
|
READ_BOOL_FV(R2EDUseVerboseRingAccess)
|
|
|
|
|
|
|
|
//////////
|
|
// TEMP //
|
|
// Array with the name of all offensive impact FXs.
|
|
READ_STRINGVECTOR_DEV(OffImpactFX);
|
|
|
|
#ifndef RZ_NO_CLIENT
|
|
|
|
//////////
|
|
// INIT //
|
|
// FPU
|
|
#ifdef NL_OS_WINDOWS
|
|
if(ClientCfg.FPExceptions)
|
|
_control87(_EM_DENORMAL/*|_EM_INVALID|_EM_ZERODIVIDE|_EM_OVERFLOW*/|_EM_UNDERFLOW|_EM_INEXACT, _MCW_EM);
|
|
else
|
|
_control87(_EM_INVALID|_EM_DENORMAL|_EM_ZERODIVIDE|_EM_OVERFLOW|_EM_UNDERFLOW|_EM_INEXACT, _MCW_EM);
|
|
|
|
// Set the process priority
|
|
static DWORD priority[6]=
|
|
{
|
|
0x40, // IDLE_PRIORITY_CLASS
|
|
0x4000, // BELOW_NORMAL_PRIORITY_CLASS
|
|
0x20, // NORMAL_PRIORITY_CLASS
|
|
0x8000, // ABOVE_NORMAL_PRIORITY_CLASS
|
|
0x80, // HIGH_PRIORITY_CLASS
|
|
0x100, // REALTIME_PRIORITY_CLASS
|
|
};
|
|
|
|
int index = ClientCfg.ProcessPriority+2;
|
|
clamp(index, 0, 6);
|
|
SetPriorityClass (GetCurrentProcess(), priority[index]);
|
|
#endif // NL_OS_WINDOWS
|
|
|
|
// Init Verbose Modes (at the beginning to be able to display them as soon as possible).
|
|
::VerboseVP = ClientCfg.VerboseVP;
|
|
::VerboseAnimUser = ClientCfg.VerboseAnimUser;
|
|
::VerboseAnimSelection = ClientCfg.VerboseAnimSelection;
|
|
#ifdef LOG_ALL_TRAFFIC
|
|
NLMISC::VerboseAllTraffic = ClientCfg.VerboseAllTraffic;
|
|
#endif
|
|
|
|
// (re-)Initialize contextual cursors.
|
|
if (!ClientCfg.R2EDEnabled)
|
|
{
|
|
initContextualCursor();
|
|
}
|
|
|
|
// Prim files
|
|
READ_STRINGVECTOR_DEV(PrimFiles);
|
|
|
|
// Reset GlobalWind Setup
|
|
if(Scene)
|
|
{
|
|
Scene->setGlobalWindPower(ClientCfg.GlobalWindPower);
|
|
Scene->setGlobalWindDirection(ClientCfg.GlobalWindDirection);
|
|
}
|
|
|
|
if (Driver)
|
|
{
|
|
// Set the monitor color properties
|
|
CMonitorColorProperties monitorColor;
|
|
for(uint i=0; i<3; i++)
|
|
{
|
|
monitorColor.Contrast[i] = ClientCfg.Contrast;
|
|
monitorColor.Luminosity[i] = ClientCfg.Luminosity;
|
|
monitorColor.Gamma[i] = ClientCfg.Gamma;
|
|
}
|
|
if(!Driver->setMonitorColorProperties(monitorColor))
|
|
cfgWarning("reloadCFG: setMonitorColorProperties fails");
|
|
}
|
|
|
|
|
|
// Show/hide all or parts of the user body.
|
|
if (UserEntity)
|
|
{
|
|
UserEntity->eyesHeight(ClientCfg.EyesHeight);
|
|
UserEntity->updateVisualDisplay();
|
|
|
|
// Run speed and camera dist max are set according to R2 char mode
|
|
UserEntity->flushR2CharMode();
|
|
}
|
|
|
|
// Initialize the camera distance (after camera dist max)
|
|
View.setCameraDistanceMaxForPlayer();
|
|
|
|
// draw in client light?
|
|
if(ClientCfg.Light)
|
|
{
|
|
ClientCfg.DrawBoxes = true;
|
|
ClientCfg.Names = true;
|
|
}
|
|
|
|
// Set Day / Time
|
|
if (ClientCfg.Local)
|
|
{
|
|
uint32 tickOffset = (uint32)(ClientCfg.RyzomDay * RYZOM_HOURS_IN_TICKS * 24 + ClientCfg.RyzomTime * RYZOM_HOURS_IN_TICKS);
|
|
RT.resetTickOffset();
|
|
RT.increaseTickOffset( tickOffset );
|
|
}
|
|
#endif
|
|
|
|
// for reset effect of variable in mainLoop(), set true
|
|
ClientCfg.IsInvalidated= true;
|
|
|
|
// Allow warning display only first time.
|
|
DisplayCFGWarning= false;
|
|
|
|
// If it is the load time, backup the ClientCfg into LastClientCfg
|
|
if(firstTimeSetValues)
|
|
LastClientCfg = ClientCfg;
|
|
|
|
// no more true.
|
|
firstTimeSetValues= false;
|
|
|
|
READ_INT_DEV(NumFrameForProfile);
|
|
READ_STRING_FV(KlientChatPort);
|
|
READ_BOOL_DEV(SimulateServerTick);
|
|
|
|
READ_BOOL_DEV(DamageShieldEnabled)
|
|
|
|
READ_BOOL_FV(AllowDebugLua)
|
|
READ_BOOL_FV(DisplayLuaDebugInfo)
|
|
|
|
READ_BOOL_DEV(LuaDebugInfoGotoButtonEnabled)
|
|
READ_STRING_DEV(LuaDebugInfoGotoButtonTemplate)
|
|
READ_STRING_DEV(LuaDebugInfoGotoButtonCaption)
|
|
READ_STRING_DEV(LuaDebugInfoGotoButtonFunction)
|
|
|
|
|
|
READ_BOOL_DEV(BeepWhenLaunched)
|
|
|
|
READ_STRING_DEV(R2ClientGw)
|
|
|
|
READ_FLOAT_FV(FogDistAndDepthLookupBias)
|
|
|
|
READ_INT_DEV(R2EDLoadDynamicFeatures)
|
|
|
|
READ_BOOL_DEV(CheckR2ScenarioMD5);
|
|
|
|
CConfigFile::CVar *pcvHardwareCursors = ClientCfg.ConfigFile.getVarPtr("HardwareCursors");
|
|
if(pcvHardwareCursors)
|
|
{
|
|
ClientCfg.HardwareCursors.clear ();
|
|
int iSz = pcvHardwareCursors->size();
|
|
for (int i = 0; i < iSz; i++)
|
|
ClientCfg.HardwareCursors.insert(toLower(pcvHardwareCursors->asString(i)));
|
|
}
|
|
else
|
|
{
|
|
cfgWarning("Default value used for 'HardwareCursors'");
|
|
// default list of harware cursors
|
|
ClientCfg.HardwareCursors.insert("curs_can_pan.tga");
|
|
ClientCfg.HardwareCursors.insert("curs_can_pan_dup.tga");
|
|
ClientCfg.HardwareCursors.insert("curs_create.tga");
|
|
ClientCfg.HardwareCursors.insert("curs_create_multi.tga");
|
|
ClientCfg.HardwareCursors.insert("curs_create_vertex_invalid.tga");
|
|
ClientCfg.HardwareCursors.insert("curs_default.tga");
|
|
ClientCfg.HardwareCursors.insert("curs_dup.tga");
|
|
ClientCfg.HardwareCursors.insert("curs_L.tga");
|
|
ClientCfg.HardwareCursors.insert("curs_M.tga");
|
|
ClientCfg.HardwareCursors.insert("curs_pan.tga");
|
|
ClientCfg.HardwareCursors.insert("curs_pan_dup.tga");
|
|
ClientCfg.HardwareCursors.insert("curs_pick.tga");
|
|
ClientCfg.HardwareCursors.insert("curs_pick_dup.tga");
|
|
ClientCfg.HardwareCursors.insert("curs_R.tga");
|
|
ClientCfg.HardwareCursors.insert("curs_resize_BL_TR.tga");
|
|
ClientCfg.HardwareCursors.insert("curs_resize_BR_TL.tga");
|
|
ClientCfg.HardwareCursors.insert("curs_resize_LR.tga");
|
|
ClientCfg.HardwareCursors.insert("curs_resize_TB.tga");
|
|
ClientCfg.HardwareCursors.insert("curs_rotate.tga");
|
|
ClientCfg.HardwareCursors.insert("curs_scale.tga");
|
|
ClientCfg.HardwareCursors.insert("curs_stop.tga");
|
|
ClientCfg.HardwareCursors.insert("text_cursor.tga");
|
|
ClientCfg.HardwareCursors.insert("r2_hand_can_pan.tga");
|
|
ClientCfg.HardwareCursors.insert("r2_hand_pan.tga");
|
|
ClientCfg.HardwareCursors.insert("r2ed_tool_can_pick.tga");
|
|
ClientCfg.HardwareCursors.insert("r2ed_tool_can_rotate.tga");
|
|
ClientCfg.HardwareCursors.insert("r2ed_tool_pick.tga");
|
|
ClientCfg.HardwareCursors.insert("r2ed_tool_rotate.tga");
|
|
ClientCfg.HardwareCursors.insert("r2ed_tool_rotating.tga");
|
|
}
|
|
|
|
// languages and types of Ring Scenarii
|
|
READ_STRINGVECTOR_FV(ScenarioLanguages);
|
|
READ_STRINGVECTOR_FV(ScenarioTypes);
|
|
|
|
// build name
|
|
READ_STRING_FV(BuildName)
|
|
|
|
READ_BOOL_DEV(DisplayTPReason)
|
|
|
|
//READ_INT_FV(TPQuitButtonX)
|
|
//READ_INT_FV(TPQuitButtonY)
|
|
//READ_INT_FV(TPCancelButtonX)
|
|
//READ_INT_FV(TPCancelButtonY)
|
|
READ_INT_FV(TPButtonW)
|
|
READ_INT_FV(TPButtonH)
|
|
|
|
READ_STRING_FV(ScenarioSavePath)
|
|
|
|
|
|
ClientCfg.R2EDClippedEntityBlendTime = 0.18f;
|
|
READ_FLOAT_FV(R2EDClippedEntityBlendTime)
|
|
|
|
// vl: BackgroundDownloader is hardcoded to false and we don't want to run it, even if the cfg wants it
|
|
//READ_BOOL_FV(BackgroundDownloader)
|
|
|
|
}// load //
|
|
|
|
|
|
//-----------------------------------------------
|
|
// serial :
|
|
// Serialize CFG.
|
|
//-----------------------------------------------
|
|
void CClientConfig::serial(class NLMISC::IStream &f) throw(NLMISC::EStream)
|
|
{
|
|
// Start the opening of a new node named ClientCFG.
|
|
f.xmlPush("ClientCFG");
|
|
|
|
f.xmlPushBegin("Light");
|
|
f.xmlPushEnd();
|
|
f.serial(Light);
|
|
f.xmlPop();
|
|
|
|
f.xmlPushBegin("Windowed");
|
|
f.xmlPushEnd();
|
|
f.serial(Windowed);
|
|
f.xmlPop();
|
|
|
|
f.xmlPushBegin("Width");
|
|
f.xmlPushEnd();
|
|
f.serial(Width);
|
|
f.xmlPop();
|
|
|
|
f.xmlPushBegin("Height");
|
|
f.xmlPushEnd();
|
|
f.serial(Height);
|
|
f.xmlPop();
|
|
|
|
f.xmlPushBegin("Depth");
|
|
f.xmlPushEnd();
|
|
f.serial(Depth);
|
|
f.xmlPop();
|
|
|
|
f.xmlPushBegin("Contrast");
|
|
f.xmlPushEnd();
|
|
f.serial(Contrast);
|
|
f.xmlPop();
|
|
|
|
f.xmlPushBegin("Luminosity");
|
|
f.xmlPushEnd();
|
|
f.serial(Luminosity);
|
|
f.xmlPop();
|
|
|
|
f.xmlPushBegin("Gamma");
|
|
f.xmlPushEnd();
|
|
f.serial(Gamma);
|
|
f.xmlPop();
|
|
|
|
|
|
f.xmlPushBegin("AttackDist");
|
|
f.xmlPushEnd();
|
|
f.serial(AttackDist);
|
|
f.xmlPop();
|
|
|
|
// SelectWithRClick
|
|
f.xmlPushBegin("SelectWithRClick");
|
|
f.xmlPushEnd();
|
|
f.serial(SelectWithRClick);
|
|
f.xmlPop();
|
|
|
|
// Close the serial for the Client CFG.
|
|
f.xmlPop();
|
|
}// serial //
|
|
|
|
|
|
//-----------------------------------------------
|
|
// init :
|
|
//-----------------------------------------------
|
|
void CClientConfig::init(const string &configFileName)
|
|
{
|
|
// if the users client config does not exist
|
|
if(!CFile::fileExists(configFileName))
|
|
{
|
|
// create the basic .cfg
|
|
FILE *fp = nlfopen(configFileName, "w");
|
|
|
|
if (fp == NULL)
|
|
nlerror("CFG::init: Can't create config file '%s'", configFileName.c_str());
|
|
else
|
|
nlwarning("CFG::init: creating '%s' with default values", configFileName.c_str ());
|
|
|
|
// get current locale
|
|
std::string lang = CI18N::getSystemLanguageCode();
|
|
|
|
const std::vector<std::string> &languages = CI18N::getLanguageCodes();
|
|
|
|
// search if current locale is defined in language codes
|
|
for(uint i = 0; i < languages.size(); ++i)
|
|
{
|
|
if (lang == languages[i])
|
|
{
|
|
// store the language code in the config file
|
|
fprintf(fp, "LanguageCode = \"%s\";\n", lang.c_str());
|
|
break;
|
|
}
|
|
}
|
|
|
|
fclose(fp);
|
|
}
|
|
|
|
// read the exising config file (don't parse it yet!)
|
|
ucstring content;
|
|
NLMISC::CI18N::readTextFile(configFileName, content);
|
|
std::string contentUtf8 = content.toUtf8();
|
|
|
|
// while there are "RootConfigFilename" values, remove them
|
|
size_t pos = 0;
|
|
while((pos = contentUtf8.find("RootConfigFilename")) != configFileName.npos)
|
|
{
|
|
size_t endOfLine = contentUtf8.find("\n", pos);
|
|
contentUtf8.erase(pos, (endOfLine - pos) + 1);
|
|
}
|
|
|
|
// get current location of the root config file (client_default.cfg)
|
|
std::string defaultConfigLocation;
|
|
if(!getDefaultConfigLocation(defaultConfigLocation))
|
|
nlerror("cannot find client_default.cfg");
|
|
|
|
// and store it in the RootConfigFilename value in the very first line
|
|
contentUtf8.insert(0, std::string("RootConfigFilename = \"") +
|
|
defaultConfigLocation + "\";\n");
|
|
|
|
// save the updated config file
|
|
NLMISC::COFile configFile(configFileName, false, true, false);
|
|
configFile.serialBuffer((uint8*)contentUtf8.c_str(), (uint)contentUtf8.size());
|
|
configFile.close();
|
|
|
|
// now we can continue loading and parsing the config file
|
|
|
|
|
|
// if the config file will be modified, it calls automatically the function setValuesOnFileChange()
|
|
ClientCfg.ConfigFile.setCallback (CClientConfig::setValuesOnFileChange);
|
|
|
|
// load the config files
|
|
ClientCfg.ConfigFile.load (configFileName);
|
|
|
|
|
|
// update the ConfigFile variable in the config file
|
|
CConfigFile::CVar *varPtr = ClientCfg.ConfigFile.getVarPtr ("ClientVersion");
|
|
if (varPtr)
|
|
{
|
|
string str = varPtr->asString ();
|
|
if (str != getVersion() && ClientCfg.SaveConfig)
|
|
{
|
|
nlinfo ("Update and save the ClientVersion variable in config file %s -> %s", str.c_str(), getVersion().c_str());
|
|
varPtr->setAsString (getVersion());
|
|
ClientCfg.ConfigFile.save ();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
nlwarning ("There's no ClientVersion variable in the config file!");
|
|
}
|
|
|
|
}// init //
|
|
|
|
|
|
//-----------------------------------------------
|
|
// init :
|
|
//-----------------------------------------------
|
|
void CClientConfig::release ()
|
|
{
|
|
#ifndef RZ_NO_CLIENT
|
|
// Do we have to save the cfg file ?
|
|
if (ClientCfg.SaveConfig)
|
|
{
|
|
// Save values
|
|
try
|
|
{
|
|
CConfigFile::CVar *varPtr = NULL;
|
|
|
|
// Driver still alive ?
|
|
if (Driver && Driver->isActive ())
|
|
{
|
|
sint32 x, y;
|
|
uint32 width, height;
|
|
|
|
Driver->getWindowPos(x, y);
|
|
Driver->getWindowSize(width, height);
|
|
|
|
// Are we in window mode ?
|
|
if (ClientCfg.Windowed /* && !isWindowMaximized() */)
|
|
{
|
|
// Save windows position
|
|
writeInt("PositionX", x);
|
|
writeInt("PositionY", y);
|
|
|
|
// Save windows size
|
|
writeInt("Width", std::max((sint)width, 800));
|
|
writeInt("Height", std::max((sint)height, 600));
|
|
}
|
|
}
|
|
|
|
// Save if in FPV or TPV.
|
|
writeBool("FPV", ClientCfg.FPV);
|
|
|
|
// Save the camera distance
|
|
writeDouble("CameraDistance", ClientCfg.CameraDistance);
|
|
}
|
|
catch (const Exception &e)
|
|
{
|
|
nlwarning ("Error while set config file variables : %s", e.what ());
|
|
}
|
|
|
|
// Save it
|
|
ClientCfg.ConfigFile.save ();
|
|
}
|
|
#endif
|
|
}
|
|
|
|
bool CClientConfig::readBool (const std::string &varName)
|
|
{
|
|
bool bVal = false;
|
|
CConfigFile::CVar *varPtr = ConfigFile.getVarPtr(varName);
|
|
if(varPtr)
|
|
bVal = varPtr->asInt() ? true : false;
|
|
else
|
|
nlwarning("CFG: Default value used for '%s' !!!",varName.c_str());
|
|
return bVal;
|
|
}
|
|
|
|
void CClientConfig::writeBool (const std::string &varName, bool bVal, bool bForce)
|
|
{
|
|
CConfigFile::CVar *varPtr = bForce ? ConfigFile.insertVar(varName, CConfigFile::CVar()):ConfigFile.getVarPtr(varName);
|
|
if(varPtr)
|
|
varPtr->forceAsInt(bVal ? 1:0);
|
|
else
|
|
nlwarning("CFG: Default value used for '%s' !!!",varName.c_str());
|
|
}
|
|
|
|
sint32 CClientConfig::readInt (const std::string &varName)
|
|
{
|
|
sint32 bVal = 0;
|
|
CConfigFile::CVar *varPtr = ConfigFile.getVarPtr(varName);
|
|
if(varPtr)
|
|
bVal = varPtr->asInt();
|
|
else
|
|
nlwarning("CFG: Default value used for '%s' !!!",varName.c_str());
|
|
return bVal;
|
|
}
|
|
|
|
void CClientConfig::writeInt (const std::string &varName, sint32 bVal, bool bForce)
|
|
{
|
|
CConfigFile::CVar *varPtr = bForce ? ConfigFile.insertVar(varName, CConfigFile::CVar()):ConfigFile.getVarPtr(varName);
|
|
if(varPtr)
|
|
varPtr->forceAsInt(bVal);
|
|
else
|
|
nlwarning("CFG: Default value used for '%s' !!!",varName.c_str());
|
|
}
|
|
|
|
double CClientConfig::readDouble (const std::string &varName)
|
|
{
|
|
double bVal = 0;
|
|
CConfigFile::CVar *varPtr = ConfigFile.getVarPtr(varName);
|
|
if(varPtr)
|
|
bVal = varPtr->asDouble();
|
|
else
|
|
nlwarning("CFG: Default value used for '%s' !!!",varName.c_str());
|
|
return bVal;
|
|
}
|
|
|
|
void CClientConfig::writeDouble (const std::string &varName, double dVal, bool bForce)
|
|
{
|
|
CConfigFile::CVar *varPtr = bForce ? ConfigFile.insertVar(varName, CConfigFile::CVar()):ConfigFile.getVarPtr(varName);
|
|
if(varPtr)
|
|
varPtr->forceAsDouble(dVal);
|
|
else
|
|
nlwarning("CFG: Default value used for '%s' !!!",varName.c_str());
|
|
}
|
|
|
|
string CClientConfig::readString (const std::string &varName)
|
|
{
|
|
string sVal;
|
|
CConfigFile::CVar *varPtr = ConfigFile.getVarPtr(varName);
|
|
if(varPtr)
|
|
sVal = varPtr->asString();
|
|
else
|
|
nlwarning("CFG: Default value used for '%s' !!!",varName.c_str());
|
|
return sVal;
|
|
}
|
|
|
|
void CClientConfig::writeString (const std::string &varName, const std::string &strVal, bool bForce)
|
|
{
|
|
CConfigFile::CVar *varPtr = bForce ? ConfigFile.insertVar(varName, CConfigFile::CVar()):ConfigFile.getVarPtr(varName);
|
|
if(varPtr)
|
|
varPtr->forceAsString(strVal);
|
|
else
|
|
nlwarning("CFG: Default value used for '%s' !!!",varName.c_str());
|
|
}
|
|
|
|
// ***************************************************************************
|
|
bool CClientConfig::readBoolNoWarning(const std::string &varName)
|
|
{
|
|
bool bVal = false;
|
|
CConfigFile::CVar *varPtr = ConfigFile.getVarPtr(varName);
|
|
if(varPtr)
|
|
bVal = varPtr->asInt() ? true : false;
|
|
return bVal;
|
|
}
|
|
|
|
sint32 CClientConfig::readIntNoWarning(const std::string &varName)
|
|
{
|
|
sint32 bVal = 0;
|
|
CConfigFile::CVar *varPtr = ConfigFile.getVarPtr(varName);
|
|
if(varPtr)
|
|
bVal = varPtr->asInt();
|
|
return bVal;
|
|
}
|
|
|
|
double CClientConfig::readDoubleNoWarning(const std::string &varName)
|
|
{
|
|
double bVal = 0;
|
|
CConfigFile::CVar *varPtr = ConfigFile.getVarPtr(varName);
|
|
if(varPtr)
|
|
bVal = varPtr->asDouble();
|
|
return bVal;
|
|
}
|
|
|
|
// ***************************************************************************
|
|
float CClientConfig::getActualLandscapeThreshold() const
|
|
{
|
|
// The threshold to set in landscape is the inverse of the CFG one
|
|
return 1.0f/LandscapeThreshold;
|
|
}
|
|
|
|
// ***************************************************************************
|
|
string CClientConfig::getHtmlLanguageCode() const
|
|
{
|
|
if(LanguageCode=="wk")
|
|
return "en";
|
|
else
|
|
return LanguageCode;
|
|
}
|
|
|
|
// ***************************************************************************
|
|
ucstring CClientConfig::buildLoadingString( const ucstring& ucstr ) const
|
|
{
|
|
if( LoadingStringCount > 0 )
|
|
{
|
|
uint index = rand()%LoadingStringCount;
|
|
string tipId = "uiLoadingString"+toString(index);
|
|
ucstring randomUCStr = CI18N::get(tipId);
|
|
return randomUCStr;
|
|
}
|
|
else
|
|
return ucstr;
|
|
}
|
|
|
|
// ***************************************************************************
|
|
bool CClientConfig::getDefaultConfigLocation(std::string& p_name) const
|
|
{
|
|
std::string defaultConfigFileName = "client_default.cfg";
|
|
std::string defaultConfigPath;
|
|
|
|
p_name.clear();
|
|
|
|
#ifdef NL_OS_MAC
|
|
// on mac, client_default.cfg should be searched in .app/Contents/Resources/
|
|
defaultConfigPath = getAppBundlePath() + "/Contents/Resources/";
|
|
#else
|
|
// unders Windows or Linux, search client_default.cfg is same directory as executable
|
|
defaultConfigPath = Args.getProgramPath();
|
|
#endif
|
|
|
|
std::string currentPath = CPath::standardizePath(CPath::getCurrentPath());
|
|
std::string etcPath = CPath::standardizePath(getRyzomEtcPrefix());
|
|
|
|
// look in the current working directory first
|
|
if (CFile::isExists(currentPath + defaultConfigFileName))
|
|
p_name = currentPath + defaultConfigFileName;
|
|
|
|
// look in startup directory
|
|
else if (CFile::isExists(Args.getStartupPath() + defaultConfigFileName))
|
|
p_name = Args.getStartupPath() + defaultConfigFileName;
|
|
|
|
// look in application directory
|
|
else if (CFile::isExists(defaultConfigPath + defaultConfigFileName))
|
|
p_name = defaultConfigPath + defaultConfigFileName;
|
|
|
|
// look in etc prefix path
|
|
else if (!etcPath.empty() && CFile::isExists(etcPath + defaultConfigFileName))
|
|
p_name = etcPath + defaultConfigFileName;
|
|
|
|
// if some client_default.cfg was found return true
|
|
return !p_name.empty();
|
|
}
|