diff options
-rw-r--r-- | src/client.cpp | 503 | ||||
-rw-r--r-- | src/client.h | 18 |
2 files changed, 289 insertions, 232 deletions
diff --git a/src/client.cpp b/src/client.cpp index f170946c8..461ce03c8 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -309,92 +309,8 @@ void Client::gameInit() "Exiting.", mLocalDataDir.c_str())); } -#ifdef ANDROID -#ifdef USE_SDL2 - extractAssets(); - - const std::string zipName = std::string(getenv( - "APPDIR")).append("/data.zip"); - const std::string dirName = std::string(getenv( - "APPDIR")).append("/data"); - Files::extractZip(zipName, "data", dirName); - Files::extractLocale(); -#endif -#endif - -#if defined __native_client__ - - const std::string dirName = _nacl_dir.append("/data"); - Files::extractZip("/http/data.zip", "data", dirName); -#endif - -#ifdef ENABLE_NLS - std::string lang = config.getStringValue("lang"); -#ifdef WIN32 - if (lang.empty()) - lang = std::string(_nl_locale_name_default()); - - putenv(const_cast<char*>(("LANG=" + lang).c_str())); - putenv(const_cast<char*>(("LANGUAGE=" + lang).c_str())); - // mingw doesn't like LOCALEDIR to be defined for some reason - if (lang != "C") - bindTextDomain("manaplus", "translations/"); -#else - if (!lang.empty()) - { - setEnv("LANG", lang.c_str()); - setEnv("LANGUAGE", lang.c_str()); - } -#ifdef ANDROID -#ifdef USE_SDL2 - bindTextDomain("manaplus", (std::string(getenv("APPDIR")).append( - "/locale")).c_str()); -#else - bindTextDomain("manaplus", (std::string(PhysFs::getBaseDir()) - .append("/locale")).c_str()); -#endif -#else -#ifdef ENABLE_PORTABLE - bindTextDomain("manaplus", (std::string(PhysFs::getBaseDir()) - .append("../locale/")).c_str()); -#else -#ifdef __APPLE__ - bindTextDomain("manaplus", (std::string(PhysFs::getBaseDir()) - .append("ManaPlus.app/Contents/Resources/locale/")).c_str()); -#else - bindTextDomain("manaplus", LOCALEDIR); -#endif -#endif -#endif -#endif - char *locale = setlocale(LC_MESSAGES, lang.c_str()); - if (locale) - { - logger->log("locale: %s", locale); - } - else - { - locale = setlocale(LC_MESSAGES, (lang + ".utf8").c_str()); - if (locale) - logger->log("locale: %s", locale); - else - logger->log("locale empty"); - } - bind_textdomain_codeset("manaplus", "UTF-8"); - textdomain("manaplus"); -#endif - -#if defined(WIN32) || defined(__APPLE__) - if (config.getBoolValue("centerwindow")) - setEnv("SDL_VIDEO_CENTERED", "1"); - else - setEnv("SDL_VIDEO_CENTERED", "0"); -#endif - - if (config.getBoolValue("allowscreensaver")) - setEnv("SDL_VIDEO_ALLOW_SCREENSAVER", "1"); - else - setEnv("SDL_VIDEO_ALLOW_SCREENSAVER", "0"); + extractDataDir(); + initLang(); chatLogger = new ChatLogger; if (mOptions.chatLogDir.empty()) @@ -432,77 +348,7 @@ void Client::gameInit() SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE); SDL_EventState(SDL_USEREVENT, SDL_IGNORE); - if (mOptions.test.empty()) - { - mCaption = strprintf("%s %s", - branding.getStringValue("appName").c_str(), - SMALL_VERSION); - } - else - { - mCaption = strprintf( - "Please wait - VIDEO MODE TEST - %s %s - Please wait", - branding.getStringValue("appName").c_str(), - SMALL_VERSION); - } - - resman->addToSearchPath(PKG_DATADIR "data/perserver/default", false); - resman->addToSearchPath("data/perserver/default", false); - -#if defined __APPLE__ - CFBundleRef mainBundle = CFBundleGetMainBundle(); - CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle); - char path[PATH_MAX]; - if (!CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (uint8_t*)path, - PATH_MAX)) - { - fprintf(stderr, "Can't find Resources directory\n"); - } - CFRelease(resourcesURL); - // possible crash - strncat(path, "/data", PATH_MAX - 1); - resman->addToSearchPath(path, false); -// possible this need for support run client from dmg images. -// mPackageDir = path; -#endif - resman->addToSearchPath(PKG_DATADIR "data", false); - setPackageDir(PKG_DATADIR "data"); - resman->addToSearchPath("data", false); - -#ifdef ANDROID -#ifdef USE_SDL2 - if (getenv("APPDIR")) - { - const std::string appDir = getenv("APPDIR"); - resman->addToSearchPath(appDir + "/data", false); - resman->addToSearchPath(appDir + "/data/perserver/default", false); - } -#endif -#endif - -#if defined __native_client__ - resman->addToSearchPath(_nacl_dir.append("/data"), false); -#endif - - // Add branding/data to PhysFS search path - if (!mOptions.brandingPath.empty()) - { - std::string path = mOptions.brandingPath; - - // Strip blah.mana from the path -#ifdef WIN32 - const int loc1 = path.find_last_of('/'); - const int loc2 = path.find_last_of('\\'); - const int loc = static_cast<int>(std::max(loc1, loc2)); -#else - const int loc = static_cast<int>(path.find_last_of('/')); -#endif - if (loc > 0) - { - resman->addToSearchPath(path.substr( - 0, loc + 1).append("data"), false); - } - } + mountDataDir(); if (mOptions.dataPath.empty() && !branding.getStringValue("dataPath").empty()) @@ -527,42 +373,8 @@ void Client::gameInit() resman->addToSearchPath(mLocalDataDir, false); TranslationManager::loadCurrentLang(); -#if defined(USE_OPENGL) && !defined(ANDROID) && !defined(__APPLE__) - if (!mOptions.safeMode && mOptions.test.empty() - && !config.getBoolValue("videodetected")) - { - graphicsManager.detectVideoSettings(); - } -#endif - - openGLMode = intToRenderType(config.getIntValue("opengl")); -#ifdef USE_OPENGL - OpenGLImageHelper::setBlur(config.getBoolValue("blur")); - SurfaceImageHelper::SDLSetEnableAlphaCache( - config.getBoolValue("alphaCache") && !openGLMode); - ImageHelper::setEnableAlpha(config.getFloatValue("guialpha") != 1.0F - || openGLMode); -#else - SurfaceImageHelper::SDLSetEnableAlphaCache( - config.getBoolValue("alphaCache")); - ImageHelper::setEnableAlpha(config.getFloatValue("guialpha") != 1.0F); -#endif - logVars(); - Cpu::detect(); - graphicsManager.initGraphics(mOptions.noOpenGL); - graphicsManager.detectPixelSize(); - runCounters = config.getBoolValue("packetcounters"); - applyVSync(); - graphicsManager.setVideoMode(); - checkConfigVersion(); - getConfigDefaults2(config.getDefaultValues()); - applyGrabMode(); - applyGamma(); - - SDL::SetWindowTitle(mainGraphics->getWindow(), mCaption.c_str()); - setIcon(); - - mainGraphics->_beginDraw(); + initGraphics(); + initTitle(); Theme::selectSkin(); touchManager.init(); @@ -576,22 +388,7 @@ void Client::gameInit() gui = new Gui(); gui->postInit(mainGraphics); - // Initialize sound engine - try - { - if (config.getBoolValue("sound")) - soundManager.init(); - - soundManager.setSfxVolume(config.getIntValue("sfxVolume")); - soundManager.setMusicVolume(config.getIntValue("musicVolume")); - } - catch (const char *const err) - { - mState = STATE_ERROR; - errorMessage = err; - logger->log("Warning: %s", err); - } - + initSoundManager(); eventsManager.init(); // Initialize keyboard @@ -600,18 +397,8 @@ void Client::gameInit() // Initialise player relations player_relations.init(); - Joystick::init(); - - userPalette = new UserPalette; - setupWindow = new Setup; - setupWindow->postInit(); - helpWindow = new HelpWindow; - didYouKnowWindow = new DidYouKnowWindow; - didYouKnowWindow->postInit(); - - soundManager.playMusic(branding.getValue( - "loginMusic", "Magick - Real.ogg")); + createWindows(); // Initialize default server mCurrentServer.hostname = mOptions.serverName; @@ -653,15 +440,8 @@ void Client::gameInit() SDL_initFramerate(&mFpsManager); setFramerate(fpsLimit); - config.addListener("fpslimit", this); - config.addListener("guialpha", this); - config.addListener("gamma", this); - config.addListener("enableGamma", this); - config.addListener("particleEmitterSkip", this); - config.addListener("vsync", this); - config.addListener("repeateDelay", this); - config.addListener("repeateInterval", this); - config.addListener("logInput", this); + initConfigListeners(); + setGuiAlpha(config.getFloatValue("guialpha")); optionChanged("fpslimit"); @@ -685,10 +465,271 @@ Client::~Client() CHECKLISTENERS } -void Client::bindTextDomain(const char *const name, const char *const path) +void Client::initConfigListeners() +{ + config.addListener("fpslimit", this); + config.addListener("guialpha", this); + config.addListener("gamma", this); + config.addListener("enableGamma", this); + config.addListener("particleEmitterSkip", this); + config.addListener("vsync", this); + config.addListener("repeateDelay", this); + config.addListener("repeateInterval", this); + config.addListener("logInput", this); +} + +void Client::initSoundManager() +{ + // Initialize sound engine + try + { + if (config.getBoolValue("sound")) + soundManager.init(); + + soundManager.setSfxVolume(config.getIntValue("sfxVolume")); + soundManager.setMusicVolume(config.getIntValue("musicVolume")); + } + catch (const char *const err) + { + mState = STATE_ERROR; + errorMessage = err; + logger->log("Warning: %s", err); + } + soundManager.playMusic(branding.getValue( + "loginMusic", "Magick - Real.ogg")); +} + +void Client::createWindows() +{ + userPalette = new UserPalette; + setupWindow = new Setup; + setupWindow->postInit(); + helpWindow = new HelpWindow; + didYouKnowWindow = new DidYouKnowWindow; + didYouKnowWindow->postInit(); +} + +void Client::initGraphics() +{ +#if defined(USE_OPENGL) +#if !defined(ANDROID) && !defined(__APPLE__) && !defined(__native_client__) + if (!mOptions.safeMode && mOptions.test.empty() + && !config.getBoolValue("videodetected")) + { + graphicsManager.detectVideoSettings(); + } +#endif +#endif + +#if defined(WIN32) || defined(__APPLE__) + if (config.getBoolValue("centerwindow")) + setEnv("SDL_VIDEO_CENTERED", "1"); + else + setEnv("SDL_VIDEO_CENTERED", "0"); +#endif + + if (config.getBoolValue("allowscreensaver")) + setEnv("SDL_VIDEO_ALLOW_SCREENSAVER", "1"); + else + setEnv("SDL_VIDEO_ALLOW_SCREENSAVER", "0"); + + openGLMode = intToRenderType(config.getIntValue("opengl")); +#ifdef USE_OPENGL + OpenGLImageHelper::setBlur(config.getBoolValue("blur")); + SurfaceImageHelper::SDLSetEnableAlphaCache( + config.getBoolValue("alphaCache") && !openGLMode); + ImageHelper::setEnableAlpha(config.getFloatValue("guialpha") != 1.0F + || openGLMode); +#else + SurfaceImageHelper::SDLSetEnableAlphaCache( + config.getBoolValue("alphaCache")); + ImageHelper::setEnableAlpha(config.getFloatValue("guialpha") != 1.0F); +#endif + logVars(); + Cpu::detect(); + graphicsManager.initGraphics(mOptions.noOpenGL); + graphicsManager.detectPixelSize(); + runCounters = config.getBoolValue("packetcounters"); + applyVSync(); + graphicsManager.setVideoMode(); + checkConfigVersion(); + getConfigDefaults2(config.getDefaultValues()); + applyGrabMode(); + applyGamma(); + + mainGraphics->_beginDraw(); +} + +void Client::initTitle() +{ + if (mOptions.test.empty()) + { + mCaption = strprintf("%s %s", + branding.getStringValue("appName").c_str(), + SMALL_VERSION); + } + else + { + mCaption = strprintf( + "Please wait - VIDEO MODE TEST - %s %s - Please wait", + branding.getStringValue("appName").c_str(), + SMALL_VERSION); + } + + SDL::SetWindowTitle(mainGraphics->getWindow(), mCaption.c_str()); + setIcon(); +} + +void Client::extractDataDir() +{ +#ifdef ANDROID +#ifdef USE_SDL2 + extractAssets(); + + const std::string zipName = std::string(getenv( + "APPDIR")).append("/data.zip"); + const std::string dirName = std::string(getenv( + "APPDIR")).append("/data"); + Files::extractZip(zipName, "data", dirName); + Files::extractLocale(); +#endif +#endif + +#if defined __native_client__ + const std::string dirName = _nacl_dir.append("/data"); + Files::extractZip("/http/data.zip", "data", dirName); +#endif +} + +void Client::mountDataDir() +{ + const ResourceManager *const resman = ResourceManager::getInstance(); + resman->addToSearchPath(PKG_DATADIR "data/perserver/default", false); + resman->addToSearchPath("data/perserver/default", false); + +#if defined __APPLE__ + CFBundleRef mainBundle = CFBundleGetMainBundle(); + CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle); + char path[PATH_MAX]; + if (!CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (uint8_t*)path, + PATH_MAX)) + { + fprintf(stderr, "Can't find Resources directory\n"); + } + CFRelease(resourcesURL); + // possible crash + strncat(path, "/data", PATH_MAX - 1); + resman->addToSearchPath(path, false); +// possible this need for support run client from dmg images. +// mPackageDir = path; +#endif + resman->addToSearchPath(PKG_DATADIR "data", false); + setPackageDir(PKG_DATADIR "data"); + resman->addToSearchPath("data", false); + +#ifdef ANDROID +#ifdef USE_SDL2 + if (getenv("APPDIR")) + { + const std::string appDir = getenv("APPDIR"); + resman->addToSearchPath(appDir + "/data", false); + resman->addToSearchPath(appDir + "/data/perserver/default", false); + } +#endif +#endif + +#if defined __native_client__ + resman->addToSearchPath(_nacl_dir.append("/data"), false); +#endif + + // Add branding/data to PhysFS search path + if (!mOptions.brandingPath.empty()) + { + std::string path = mOptions.brandingPath; + + // Strip blah.manaplus from the path +#ifdef WIN32 + const int loc1 = path.find_last_of('/'); + const int loc2 = path.find_last_of('\\'); + const int loc = static_cast<int>(std::max(loc1, loc2)); +#else + const int loc = static_cast<int>(path.find_last_of('/')); +#endif + if (loc > 0) + { + resman->addToSearchPath(path.substr( + 0, loc + 1).append("data"), false); + } + } +} + +void Client::initLang() +{ +#ifdef ENABLE_NLS + std::string lang = config.getStringValue("lang"); +#ifdef WIN32 + if (lang.empty()) + lang = std::string(_nl_locale_name_default()); + + putenv(const_cast<char*>(("LANG=" + lang).c_str())); + putenv(const_cast<char*>(("LANGUAGE=" + lang).c_str())); + // mingw doesn't like LOCALEDIR to be defined for some reason + if (lang != "C") + bindTextDomain("translations/"); +#else // WIN32 + + if (!lang.empty()) + { + setEnv("LANG", lang.c_str()); + setEnv("LANGUAGE", lang.c_str()); + } +#ifdef ANDROID +#ifdef USE_SDL2 + bindTextDomain((std::string(getenv("APPDIR")).append("/locale")).c_str()); +#else // USE_SDL2 + + bindTextDomain((std::string(PhysFs::getBaseDir()).append( + "/locale")).c_str()); +#endif // USE_SDL2 +#else // ANDROID +#ifdef ENABLE_PORTABLE + bindTextDomain((std::string(PhysFs::getBaseDir()).append( + "../locale/")).c_str()); +#else // ENABLE_PORTABLE +#ifdef __APPLE__ + bindTextDomain((std::string(PhysFs::getBaseDir()) + .append("ManaPlus.app/Contents/Resources/locale/")).c_str()); +#else // __APPLE__ + + bindTextDomain(LOCALEDIR); +#endif // __APPLE__ +#endif // ENABLE_PORTABLE +#endif // ANDROID +#endif // WIN32 + + char *locale = setlocale(LC_MESSAGES, lang.c_str()); + if (locale) + { + logger->log("locale: %s", locale); + } + else + { + locale = setlocale(LC_MESSAGES, (lang + ".utf8").c_str()); + if (locale) + logger->log("locale: %s", locale); + else + logger->log("locale empty"); + } + bind_textdomain_codeset("manaplus", "UTF-8"); + textdomain("manaplus"); +#endif // ENABLE_NLS + +} + +void Client::bindTextDomain(const char *const path) { #ifdef ENABLE_NLS - const char *const dir = bindtextdomain(name, path); + const char *const dir = bindtextdomain("manaplus", path); if (dir) logger->log("bindtextdomain: %s", dir); else diff --git a/src/client.h b/src/client.h index 1607a73ab..dcf761847 100644 --- a/src/client.h +++ b/src/client.h @@ -326,6 +326,22 @@ public: const bool modal); private: + void createWindows(); + + void initLang(); + + void initSoundManager(); + + void initConfigListeners(); + + void initGraphics(); + + void initTitle(); + + void extractDataDir(); + + void mountDataDir(); + void initRootDir(); void initHomeDir(); @@ -362,7 +378,7 @@ private: static Client *mInstance; - static void bindTextDomain(const char *const name, const char *const path); + static void bindTextDomain(const char *const path); static void setEnv(const char *const name, const char *const value); |