diff --git a/colobot-base/level/robotmain.cpp b/colobot-base/level/robotmain.cpp index d8396a9c..92270cb6 100644 --- a/colobot-base/level/robotmain.cpp +++ b/colobot-base/level/robotmain.cpp @@ -3376,6 +3376,15 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) if (!resetObject) ChangeColor(); // changes the colors of texture + if (m_levelCategory == LevelCategory::CareerMode) + { + std::string careerSaveDir = GetPlayerProfile()->GetSaveFile("__career__/" + std::to_string(m_levelChap) + "_" + std::to_string(m_levelRank)); + if (CResourceManager::Exists(careerSaveDir+"/data.sav")) + { + m_sceneReadPath = careerSaveDir; + } + } + if (!m_sceneReadPath.empty()) // loading file ? { m_ui->GetLoadingScreen()->SetProgress(0.25f, RT_LOADING_OBJECTS_SAVED); @@ -3772,22 +3781,25 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) if (m_levelCategory == LevelCategory::CareerMode) { CObject* base = m_objMan->FindNearest(nullptr, OBJECT_BASE, 10000000.0f); if(base) { - std::string saveDir = GetPlayerProfile()->GetSaveFile("__spaceship__"); // TODO: change save path? - - for (CObject* obj : m_objMan->GetAllObjects()) + std::string saveDir = GetPlayerProfile()->GetSaveFile("__career__/__spaceship__"); + // TODO: If it doesn't exist, use some global default instead of using whatever is in this level file + if(CResourceManager::Exists(saveDir)) { - if (obj == base) continue; - if (IsObjectBeingTransported(obj)) continue; - - glm::vec3 oPos = obj->GetPosition(); - float dist = Math::DistanceProjected(base->GetPosition(), oPos); - if ( dist < 32.0f ) + for (CObject* obj : m_objMan->GetAllObjects()) { - m_objMan->DeleteObject(obj); - } - } + if (obj == base) continue; + if (IsObjectBeingTransported(obj)) continue; - IOReadScene(saveDir+"/data.sav", saveDir+"/cbot.run", true, base->GetPosition()); + glm::vec3 oPos = obj->GetPosition(); + float dist = Math::DistanceProjected(base->GetPosition(), oPos); + if ( dist < 32.0f ) + { + m_objMan->DeleteObject(obj); + } + } + + IOReadScene(saveDir+"/data.sav", saveDir+"/cbot.run", true, base->GetPosition()); + } } } diff --git a/colobot-base/object/auto/autobase.cpp b/colobot-base/object/auto/autobase.cpp index 5475f43d..c2e0305f 100644 --- a/colobot-base/object/auto/autobase.cpp +++ b/colobot-base/object/auto/autobase.cpp @@ -1391,9 +1391,13 @@ Error CAutoBase::TakeOff(bool printMsg) if (m_main->GetLevelCategory() == LevelCategory::CareerMode) { + std::string careerSaveParentDir = m_main->GetPlayerProfile()->GetSaveFile("__career__"); + if (!CResourceManager::DirectoryExists(careerSaveParentDir)) + CResourceManager::CreateNewDirectory(careerSaveParentDir); + // Note: we don't write a cbot.run file - running programs won't remain running when transferred to other worlds. // We still need a directory per save file, because programs are saved there. - std::string saveDir = m_main->GetPlayerProfile()->GetSaveFile("__spaceship__"); // TODO: change save path? + std::string saveDir = careerSaveParentDir + "/__spaceship__"; if (CResourceManager::DirectoryExists(saveDir)) CResourceManager::RemoveExistingDirectory(saveDir); CResourceManager::CreateNewDirectory(saveDir); @@ -1423,6 +1427,12 @@ Error CAutoBase::TakeOff(bool printMsg) FreezeCargo(false); return ERR_UNKNOWN; // TODO: proper error code } + + // It's OK to save the cargo in the level save dir, because it's deleted when loading. + std::string levelSaveDir = careerSaveParentDir + "/" + std::to_string(m_main->GetLevelChap()) + "_" + std::to_string(m_main->GetLevelRank()); + if (CResourceManager::DirectoryExists(levelSaveDir)) + CResourceManager::RemoveExistingDirectory(levelSaveDir); + m_main->GetPlayerProfile()->SaveScene(levelSaveDir, "Career mode save"); } m_main->SetMovieLock(true); // blocks everything until the end