bool CApplication::Create() { GetLogger()->Info("Creating CApplication\n"); boost::filesystem::path dataPath(m_dataPath); if (! (boost::filesystem::exists(dataPath) && boost::filesystem::is_directory(dataPath)) ) { GetLogger()->Error("Data directory '%s' doesn't exist or is not a directory\n", m_dataPath.c_str()); m_errorMessage = std::string("Could not read from data directory:\n") + std::string("'") + m_dataPath + std::string("'\n") + std::string("Please check your installation, or supply a valid data directory by -datadir option."); m_exitCode = 1; return false; } SetLanguage(m_language); //Create the sound instance. if (!GetProfile().InitCurrentDirectory()) { GetLogger()->Warn("Config not found. Default values will be used!\n"); m_sound = new CSoundInterface(); } else { std::string path; if (GetProfile().GetLocalProfileString("Resources", "Data", path)) m_dataPath = path; #ifdef OPENAL_SOUND m_sound = static_cast<CSoundInterface *>(new ALSound()); #else GetLogger()->Info("No sound support.\n"); m_sound = new CSoundInterface(); #endif m_sound->Create(true); if (GetProfile().GetLocalProfileString("Resources", "Sound", path)) { m_sound->CacheAll(path); } else { m_sound->CacheAll(GetDataSubdirPath(DIR_SOUND)); } if (GetProfile().GetLocalProfileString("Resources", "Music", path)) { m_sound->AddMusicFiles(path); } else { m_sound->AddMusicFiles(GetDataSubdirPath(DIR_MUSIC)); } } std::string standardInfoMessage = "\nPlease see the console output or log file\n" "to get more information on the source of error"; /* SDL initialization sequence */ Uint32 initFlags = SDL_INIT_VIDEO | SDL_INIT_TIMER; if (SDL_Init(initFlags) < 0) { m_errorMessage = std::string("SDL initialization error:\n") + std::string(SDL_GetError()); GetLogger()->Error(m_errorMessage.c_str()); m_exitCode = 2; return false; } // This is non-fatal and besides seems to fix some memory leaks if (SDL_InitSubSystem(SDL_INIT_JOYSTICK) < 0) { GetLogger()->Warn("Joystick subsystem init failed\nJoystick(s) will not be available\n"); } if ((IMG_Init(IMG_INIT_PNG) & IMG_INIT_PNG) == 0) { m_errorMessage = std::string("SDL_Image initialization error:\n") + std::string(IMG_GetError()); GetLogger()->Error(m_errorMessage.c_str()); m_exitCode = 3; return false; } // load settings from profile int iValue; if ( GetProfile().GetLocalProfileInt("Setup", "Resolution", iValue) ) { std::vector<Math::IntPoint> modes; GetVideoResolutionList(modes, true, true); if (static_cast<unsigned int>(iValue) < modes.size()) m_deviceConfig.size = modes.at(iValue); } if ( GetProfile().GetLocalProfileInt("Setup", "Fullscreen", iValue) ) { m_deviceConfig.fullScreen = (iValue == 1); } if (! CreateVideoSurface()) return false; // dialog is in function if (m_private->surface == nullptr) { m_errorMessage = std::string("SDL error while setting video mode:\n") + std::string(SDL_GetError()); GetLogger()->Error(m_errorMessage.c_str()); m_exitCode = 4; return false; } SDL_WM_SetCaption(m_windowTitle.c_str(), m_windowTitle.c_str()); // Enable translating key codes of key press events to unicode chars SDL_EnableUNICODE(1); // Don't generate joystick events SDL_JoystickEventState(SDL_IGNORE); // The video is ready, we can create and initalize the graphics device m_device = new Gfx::CGLDevice(m_deviceConfig); if (! m_device->Create() ) { m_errorMessage = std::string("Error in CDevice::Create()\n") + standardInfoMessage; m_exitCode = 5; return false; } // Create the 3D engine m_engine = new Gfx::CEngine(this); m_engine->SetDevice(m_device); if (! m_engine->Create() ) { m_errorMessage = std::string("Error in CEngine::Init()\n") + standardInfoMessage; m_exitCode = 6; return false; } // Create model manager m_modelManager = new Gfx::CModelManager(m_engine); // Create the robot application. m_robotMain = new CRobotMain(this); m_robotMain->ChangePhase(PHASE_WELCOME1); GetLogger()->Info("CApplication created successfully\n"); return true; }