Career: Save the rest of the level as well as just the spaceship. Also put all career save files in __career__ folder.

colobot2
immibis 2023-11-18 19:45:52 +01:00
parent 884129a676
commit d22b32477e
2 changed files with 36 additions and 14 deletions

View File

@ -3376,6 +3376,15 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
if (!resetObject) if (!resetObject)
ChangeColor(); // changes the colors of texture 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 ? if (!m_sceneReadPath.empty()) // loading file ?
{ {
m_ui->GetLoadingScreen()->SetProgress(0.25f, RT_LOADING_OBJECTS_SAVED); m_ui->GetLoadingScreen()->SetProgress(0.25f, RT_LOADING_OBJECTS_SAVED);
@ -3772,8 +3781,10 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
if (m_levelCategory == LevelCategory::CareerMode) { if (m_levelCategory == LevelCategory::CareerMode) {
CObject* base = m_objMan->FindNearest(nullptr, OBJECT_BASE, 10000000.0f); CObject* base = m_objMan->FindNearest(nullptr, OBJECT_BASE, 10000000.0f);
if(base) { if(base) {
std::string saveDir = GetPlayerProfile()->GetSaveFile("__spaceship__"); // TODO: change save path? 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))
{
for (CObject* obj : m_objMan->GetAllObjects()) for (CObject* obj : m_objMan->GetAllObjects())
{ {
if (obj == base) continue; if (obj == base) continue;
@ -3790,6 +3801,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
IOReadScene(saveDir+"/data.sav", saveDir+"/cbot.run", true, base->GetPosition()); IOReadScene(saveDir+"/data.sav", saveDir+"/cbot.run", true, base->GetPosition());
} }
} }
}
// Do this here to prevent the first frame from taking a long time to render // Do this here to prevent the first frame from taking a long time to render
m_engine->UpdateGroundSpotTextures(); m_engine->UpdateGroundSpotTextures();

View File

@ -1391,9 +1391,13 @@ Error CAutoBase::TakeOff(bool printMsg)
if (m_main->GetLevelCategory() == LevelCategory::CareerMode) 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. // 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. // 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)) if (CResourceManager::DirectoryExists(saveDir))
CResourceManager::RemoveExistingDirectory(saveDir); CResourceManager::RemoveExistingDirectory(saveDir);
CResourceManager::CreateNewDirectory(saveDir); CResourceManager::CreateNewDirectory(saveDir);
@ -1423,6 +1427,12 @@ Error CAutoBase::TakeOff(bool printMsg)
FreezeCargo(false); FreezeCargo(false);
return ERR_UNKNOWN; // TODO: proper error code 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 m_main->SetMovieLock(true); // blocks everything until the end