void CScreenIO::IOReadName() { CWindow* pw; CEdit* pe; std::string resume; char line[100]; char name[100]; time_t now; pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5)); if ( pw == nullptr ) return; pe = static_cast<CEdit*>(pw->SearchControl(EVENT_INTERFACE_IONAME)); if ( pe == nullptr ) return; resume = GetLevelCategoryDir(m_main->GetLevelCategory()) + " " + StrUtils::ToString<int>(m_main->GetLevelChap()); CLevelParser levelParser(m_main->GetLevelCategory(), m_main->GetLevelChap(), 0); try { levelParser.Load(); resume = levelParser.Get("Title")->GetParam("resume")->AsString(); } catch (CLevelParserException& e) { GetLogger()->Warn("%s\n", e.what()); } time(&now); TimeToAsciiClean(now, line); sprintf(name, "%s - %s %d", line, resume.c_str(), m_main->GetLevelRank()); pe->SetText(name); pe->SetCursor(strlen(name), 0); m_interface->SetFocus(pe); }
void CSignalHandlers::ReportError(const std::string& errorMessage) { static bool triedSaving = false; if (SDL_WasInit(SDL_INIT_VIDEO)) { // Close the SDL window on crash, because otherwise the error doesn't show on in fullscreen mode and the game appears to freeze SDL_Quit(); } std::stringstream msg; msg << "Unhandled exception occured!" << std::endl; msg << "==============================" << std::endl; msg << errorMessage << std::endl; msg << "==============================" << std::endl; msg << std::endl; msg << "This is usually caused by a bug. Please report this on http://github.com/colobot/colobot/issues" << std::endl; msg << "including information on what you were doing before this happened and all the information below." << std::endl; msg << "==============================" << std::endl; #if BUILD_NUMBER == 0 #ifdef OFFICIAL_BUILD msg << "You are running official " << COLOBOT_VERSION_DISPLAY << " build." << std::endl; #else // COLOBOT_VERSION_DISPLAY doesn't update if you don't run CMake after "git pull" msg << "You seem to be running a custom compilation of version " << COLOBOT_VERSION_DISPLAY << ", but please verify that." << std::endl; #endif #else msg << "You are running version " << COLOBOT_VERSION_DISPLAY << " from CI build #" << BUILD_NUMBER << std::endl; #endif msg << std::endl; bool canSave = false; CRobotMain* robotMain = nullptr; if (!CRobotMain::IsCreated()) { msg << "CRobotMain instance does not seem to exist" << std::endl; } else { robotMain = CRobotMain::GetInstancePointer(); msg << "The game was in phase " << PhaseToString(robotMain->GetPhase()) << " (ID=" << robotMain->GetPhase() << ")" << std::endl; msg << "Last started level was: category=" << GetLevelCategoryDir(robotMain->GetLevelCategory()) << " chap=" << robotMain->GetLevelChap() << " rank=" << robotMain->GetLevelRank() << std::endl; canSave = (robotMain->GetPhase() == PHASE_SIMUL || IsInSimulationConfigPhase(robotMain->GetPhase())) && !robotMain->IsLoading(); } msg << "==============================" << std::endl; msg << std::endl; msg << "Sorry for inconvenience!"; std::cerr << std::endl << msg.str() << std::endl; m_systemUtils->SystemDialog(SDT_ERROR, "Unhandled exception occured!", msg.str()); if (canSave && !triedSaving) { msg.str(""); msg << "You can try saving the game at the moment of a crash. Keep in mind, the game engine is in" << std::endl; msg << "an unstable state so the saved game may be corrupted or even cause another crash." << std::endl; msg << std::endl; msg << "Do you want to try saving now?"; SystemDialogResult result = m_systemUtils->SystemDialog(SDT_YES_NO, "Try to save?", msg.str()); if (result == SDR_YES) { triedSaving = true; CResourceManager::CreateDirectory("crashsave"); robotMain->IOWriteScene("crashsave/data.sav", "crashsave/cbot.run", "crashsave/screen.png", "Backup at the moment of a crash", true); m_systemUtils->SystemDialog(SDT_INFO, "Try to save?", "Saving finished.\nPlease restart the game now"); } } exit(1); }
std::string CLevelParser::BuildCategoryPath(LevelCategory category) { return BuildCategoryPath(GetLevelCategoryDir(category)); }
CLevelParser::CLevelParser(LevelCategory category, int chapter, int rank) : CLevelParser(GetLevelCategoryDir(category), chapter, rank) { SetLevelPaths(category, chapter, rank); }
std::string CLevelParser::BuildScenePath(LevelCategory category, int chapter, int rank, bool sceneFile) { return BuildScenePath(GetLevelCategoryDir(category), chapter, rank, sceneFile); }