Finished support for up to 999 chapters and levels

master
krzys-h 2015-07-18 19:43:22 +02:00
parent ea9361fbb4
commit 86f473ac16
7 changed files with 152 additions and 146 deletions

View File

@ -65,8 +65,7 @@ void CController::StartApp()
void CController::StartGame(LevelCategory cat, int chap, int lvl) void CController::StartGame(LevelCategory cat, int chap, int lvl)
{ {
m_dialog->SetLevelCategory(cat); m_dialog->SetLevel(cat, chap, lvl);
m_dialog->SetLevelRank(chap*100+lvl);
m_main->ChangePhase(PHASE_LOADING); m_main->ChangePhase(PHASE_LOADING);
} }

View File

@ -172,9 +172,9 @@ void CPathManager::LoadModsFromDir(const std::string &dir)
std::string CPathManager::InjectLevelDir(std::string path, const std::string& defaultDir) std::string CPathManager::InjectLevelDir(std::string path, const std::string& defaultDir)
{ {
std::string newPath = path; std::string newPath = path;
std::string lvlDir = CLevelParser::BuildScenePath(CRobotMain::GetInstancePointer()->GetLevelCategory(), CRobotMain::GetInstancePointer()->GetLevelRank()/100, CRobotMain::GetInstancePointer()->GetLevelRank()%100, false); std::string lvlDir = CLevelParser::BuildScenePath(CRobotMain::GetInstancePointer()->GetLevelCategory(), CRobotMain::GetInstancePointer()->GetLevelChap(), CRobotMain::GetInstancePointer()->GetLevelRank(), false);
boost::replace_all(newPath, "%lvl%", lvlDir); boost::replace_all(newPath, "%lvl%", lvlDir);
std::string chapDir = CLevelParser::BuildScenePath(CRobotMain::GetInstancePointer()->GetLevelCategory(), CRobotMain::GetInstancePointer()->GetLevelRank()/100, 0, false); std::string chapDir = CLevelParser::BuildScenePath(CRobotMain::GetInstancePointer()->GetLevelCategory(), CRobotMain::GetInstancePointer()->GetLevelChap(), 0, false);
boost::replace_all(newPath, "%chap%", chapDir); boost::replace_all(newPath, "%chap%", chapDir);
std::string catDir = CLevelParser::BuildCategoryPath(CRobotMain::GetInstancePointer()->GetLevelCategory()); std::string catDir = CLevelParser::BuildCategoryPath(CRobotMain::GetInstancePointer()->GetLevelCategory());
boost::replace_all(newPath, "%cat%", catDir); boost::replace_all(newPath, "%cat%", catDir);

View File

@ -87,7 +87,7 @@ std::string CLevelParser::BuildScenePath(std::string category, int chapter, int
if (category == "custom") if (category == "custom")
{ {
outstream << CRobotMain::GetInstancePointer()->GetCustomLevelName(chapter); outstream << CRobotMain::GetInstancePointer()->GetCustomLevelName(chapter);
if (rank == 000) if (rank == 0)
{ {
if (sceneFile) if (sceneFile)
{ {
@ -105,11 +105,14 @@ std::string CLevelParser::BuildScenePath(std::string category, int chapter, int
} }
else if (category == "perso") else if (category == "perso")
{ {
assert(chapter == 0);
assert(rank == 0);
outstream << "perso.txt"; outstream << "perso.txt";
} }
else if (category == "win" || category == "lost") else if (category == "win" || category == "lost")
{ {
outstream << category << std::setfill('0') << std::setw(3) << chapter*100 + rank << ".txt"; assert(chapter == 0);
outstream << category << std::setfill('0') << std::setw(3) << rank << ".txt";
} }
else else
{ {

View File

@ -442,17 +442,19 @@ void CRobotMain::ChangePhase(Phase phase)
if (m_gameTime > 10.0f) // did you play at least 10 seconds? if (m_gameTime > 10.0f) // did you play at least 10 seconds?
{ {
int chap = m_dialog->GetLevelChap();
int rank = m_dialog->GetLevelRank(); int rank = m_dialog->GetLevelRank();
int numTry = m_dialog->GetGamerInfoTry(rank); int numTry = m_dialog->GetGamerInfoTry(chap, rank);
m_dialog->SetGamerInfoTry(rank, numTry+1); m_dialog->SetGamerInfoTry(chap, rank, numTry+1);
m_dialog->WriteGamerInfo(); m_dialog->WriteGamerInfo();
} }
} }
if (phase == PHASE_WIN) // wins a simulation? if (phase == PHASE_WIN) // wins a simulation?
{ {
int chap = m_dialog->GetLevelChap();
int rank = m_dialog->GetLevelRank(); int rank = m_dialog->GetLevelRank();
m_dialog->SetGamerInfoPassed(rank, true); m_dialog->SetGamerInfoPassed(chap, rank, true);
m_dialog->NextMission(); // passes to the next mission m_dialog->NextMission(); // passes to the next mission
m_dialog->WriteGamerInfo(); m_dialog->WriteGamerInfo();
} }
@ -591,8 +593,7 @@ void CRobotMain::ChangePhase(Phase phase)
else else
{ {
m_winTerminate = (m_endingWinRank == 904); m_winTerminate = (m_endingWinRank == 904);
m_dialog->SetLevelCategory(LevelCategory::Win); m_dialog->SetLevel(LevelCategory::Win, 0, m_endingWinRank);
m_dialog->SetLevelRank(m_endingWinRank);
try try
{ {
CreateScene(false, true, false); // sets scene CreateScene(false, true, false); // sets scene
@ -638,8 +639,7 @@ void CRobotMain::ChangePhase(Phase phase)
else else
{ {
m_winTerminate = false; m_winTerminate = false;
m_dialog->SetLevelCategory(LevelCategory::Lost); m_dialog->SetLevel(LevelCategory::Lost, 0, m_endingLostRank);
m_dialog->SetLevelRank(m_endingLostRank);
try try
{ {
CreateScene(false, true, false); // sets scene CreateScene(false, true, false); // sets scene
@ -2831,8 +2831,7 @@ void CRobotMain::ScenePerso()
ChangeColor(); ChangeColor();
m_dialog->SetLevelCategory(LevelCategory::Perso); m_dialog->SetLevel(LevelCategory::Perso, 0, 0);
m_dialog->SetLevelRank(0);
try try
{ {
CreateScene(false, true, false); // sets scene CreateScene(false, true, false); // sets scene
@ -2860,6 +2859,7 @@ void CRobotMain::ScenePerso()
void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
{ {
LevelCategory category = m_dialog->GetLevelCategory(); LevelCategory category = m_dialog->GetLevelCategory();
int chap = m_dialog->GetLevelChap();
int rank = m_dialog->GetLevelRank(); int rank = m_dialog->GetLevelRank();
const char* read = m_dialog->GetSceneRead().c_str(); const char* read = m_dialog->GetSceneRead().c_str();
const char* stack = m_dialog->GetStackRead().c_str(); const char* stack = m_dialog->GetStackRead().c_str();
@ -2938,8 +2938,8 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
m_engine->SetSecondTexture(""); m_engine->SetSecondTexture("");
m_engine->SetForegroundName(""); m_engine->SetForegroundName("");
m_dialog->BuildResumeName(m_title, GetLevelCategoryDir(category), rank); m_dialog->BuildResumeName(m_title, GetLevelCategoryDir(category), chap, rank);
m_dialog->BuildResumeName(m_resume, GetLevelCategoryDir(category), rank); m_dialog->BuildResumeName(m_resume, GetLevelCategoryDir(category), chap, rank);
std::string scriptNameStr; std::string scriptNameStr;
GetResource(RES_TEXT, RT_SCRIPT_NEW, scriptNameStr); GetResource(RES_TEXT, RT_SCRIPT_NEW, scriptNameStr);
strcpy(m_scriptName, scriptNameStr.c_str()); strcpy(m_scriptName, scriptNameStr.c_str());
@ -2961,7 +2961,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
try try
{ {
CLevelParser levelParser(category, rank/100, rank%100); CLevelParser levelParser(category, chap, rank);
levelParser.Load(); levelParser.Load();
int rankObj = 0; int rankObj = 0;
@ -4604,6 +4604,7 @@ void CRobotMain::LoadOneScript(CObject *obj, int &nbError)
if (objRank == -1) return; if (objRank == -1) return;
char categoryChar = GetLevelCategoryDir(m_dialog->GetLevelCategory())[0]; char categoryChar = GetLevelCategoryDir(m_dialog->GetLevelCategory())[0];
int chap = m_dialog->GetLevelChap();
int rank = m_dialog->GetLevelRank(); int rank = m_dialog->GetLevelRank();
for (unsigned int i = 0; i <= 999; i++) for (unsigned int i = 0; i <= 999; i++)
@ -4611,8 +4612,8 @@ void CRobotMain::LoadOneScript(CObject *obj, int &nbError)
//? if (brain->GetCompile(i)) continue; //? if (brain->GetCompile(i)) continue;
char filename[MAX_FNAME]; char filename[MAX_FNAME];
sprintf(filename, "%s/%s/%c%.3d%.3d%.3d.txt", sprintf(filename, "%s/%s/%c%.3d%.3d%.3d%.3d.txt",
GetSavegameDir(), m_gamerName.c_str(), categoryChar, rank, objRank, i); GetSavegameDir(), m_gamerName.c_str(), categoryChar, chap, rank, objRank, i);
if (CResourceManager::Exists(filename)) if (CResourceManager::Exists(filename))
{ {
@ -4678,6 +4679,7 @@ void CRobotMain::SaveOneScript(CObject *obj)
if (objRank == -1) return; if (objRank == -1) return;
char categoryChar = GetLevelCategoryDir(m_dialog->GetLevelCategory())[0]; char categoryChar = GetLevelCategoryDir(m_dialog->GetLevelCategory())[0];
int chap = m_dialog->GetLevelChap();
int rank = m_dialog->GetLevelRank(); int rank = m_dialog->GetLevelRank();
auto& programs = brain->GetPrograms(); auto& programs = brain->GetPrograms();
@ -4685,8 +4687,8 @@ void CRobotMain::SaveOneScript(CObject *obj)
for (unsigned int i = 0; i <= 999; i++) for (unsigned int i = 0; i <= 999; i++)
{ {
char filename[MAX_FNAME]; char filename[MAX_FNAME];
sprintf(filename, "%s/%s/%c%.3d%.3d%.3d.txt", sprintf(filename, "%s/%s/%c%.3d%.3d%.3d%.3d.txt",
GetSavegameDir(), m_gamerName.c_str(), categoryChar, rank, objRank, i); GetSavegameDir(), m_gamerName.c_str(), categoryChar, chap, rank, objRank, i);
if (i < programs.size()) if (i < programs.size())
{ {
brain->WriteProgram(programs[i].get(), filename); brain->WriteProgram(programs[i].get(), filename);
@ -4915,14 +4917,13 @@ bool CRobotMain::IOWriteScene(const char *filename, const char *filecbot, char *
line->AddParam("date", MakeUnique<CLevelParserParam>(GetCurrentTimestamp())); line->AddParam("date", MakeUnique<CLevelParserParam>(GetCurrentTimestamp()));
levelParser.AddLine(std::move(line)); levelParser.AddLine(std::move(line));
char* name = m_dialog->GetSceneName();
line = MakeUnique<CLevelParserLine>("Mission"); line = MakeUnique<CLevelParserLine>("Mission");
line->AddParam("base", MakeUnique<CLevelParserParam>(std::string(name))); line->AddParam("base", MakeUnique<CLevelParserParam>(GetLevelCategoryDir(m_dialog->GetLevelCategory())));
line->AddParam("rank", MakeUnique<CLevelParserParam>(m_dialog->GetSceneRank())); if (m_dialog->GetLevelCategory() == LevelCategory::CustomLevels)
if (std::string(name) == "custom") line->AddParam("dir", MakeUnique<CLevelParserParam>(m_dialog->GetCustomLevelDir()));
{ else
line->AddParam("dir", MakeUnique<CLevelParserParam>(std::string(m_dialog->GetSceneDir()))); line->AddParam("chap", MakeUnique<CLevelParserParam>(m_dialog->GetLevelChap()));
} line->AddParam("rank", MakeUnique<CLevelParserParam>(m_dialog->GetLevelRank()));
levelParser.AddLine(std::move(line)); levelParser.AddLine(std::move(line));
line = MakeUnique<CLevelParserLine>("Map"); line = MakeUnique<CLevelParserLine>("Map");
@ -5747,6 +5748,11 @@ LevelCategory CRobotMain::GetLevelCategory()
return m_dialog->GetLevelCategory(); return m_dialog->GetLevelCategory();
} }
int CRobotMain::GetLevelChap()
{
return m_dialog->GetLevelChap();
}
int CRobotMain::GetLevelRank() int CRobotMain::GetLevelRank()
{ {
return m_dialog->GetLevelRank(); return m_dialog->GetLevelRank();

View File

@ -264,7 +264,9 @@ public:
int GetGamerGlasses(); int GetGamerGlasses();
bool GetGamerOnlyHead(); bool GetGamerOnlyHead();
float GetPersoAngle(); float GetPersoAngle();
LevelCategory GetLevelCategory(); LevelCategory GetLevelCategory();
int GetLevelChap();
int GetLevelRank(); int GetLevelRank();
void StartMusic(); void StartMusic();

View File

@ -130,7 +130,8 @@ CMainDialog::CMainDialog()
m_phaseTerm = PHASE_TRAINER; m_phaseTerm = PHASE_TRAINER;
m_sceneRead[0] = 0; m_sceneRead[0] = 0;
m_stackRead[0] = 0; m_stackRead[0] = 0;
m_sceneRank = 0; m_levelChap = 0;
m_levelRank = 0;
m_bSceneSoluce = false; m_bSceneSoluce = false;
m_bSimulSetup = false; m_bSimulSetup = false;
@ -854,7 +855,7 @@ void CMainDialog::ChangePhase(Phase phase)
} }
m_bSceneSoluce = false; m_bSceneSoluce = false;
UpdateSceneResume((m_chap[m_category]+1)*100+(m_sel[m_category]+1)); UpdateSceneResume(m_chap[m_category]+1, m_sel[m_category]+1);
if ( m_phase == PHASE_MISSION || if ( m_phase == PHASE_MISSION ||
m_phase == PHASE_FREE || m_phase == PHASE_FREE ||
@ -2245,14 +2246,14 @@ bool CMainDialog::EventProcess(const Event &event)
if ( pl == 0 ) break; if ( pl == 0 ) break;
m_chap[m_category] = pl->GetSelect(); m_chap[m_category] = pl->GetSelect();
UpdateSceneList(m_chap[m_category], m_sel[m_category]); UpdateSceneList(m_chap[m_category], m_sel[m_category]);
UpdateSceneResume((m_chap[m_category]+1)*100+(m_sel[m_category]+1)); UpdateSceneResume(m_chap[m_category]+1, m_sel[m_category]+1);
break; break;
case EVENT_INTERFACE_LIST: case EVENT_INTERFACE_LIST:
pl = static_cast<CList*>(pw->SearchControl(EVENT_INTERFACE_LIST)); pl = static_cast<CList*>(pw->SearchControl(EVENT_INTERFACE_LIST));
if ( pl == 0 ) break; if ( pl == 0 ) break;
m_sel[m_category] = pl->GetSelect(); m_sel[m_category] = pl->GetSelect();
UpdateSceneResume((m_chap[m_category]+1)*100+(m_sel[m_category]+1)); UpdateSceneResume(m_chap[m_category]+1, m_sel[m_category]+1);
break; break;
case EVENT_INTERFACE_SOLUCE: case EVENT_INTERFACE_SOLUCE:
@ -2263,7 +2264,8 @@ bool CMainDialog::EventProcess(const Event &event)
break; break;
case EVENT_INTERFACE_PLAY: case EVENT_INTERFACE_PLAY:
m_sceneRank = (m_chap[m_category]+1)*100+(m_sel[m_category]+1); m_levelChap = m_chap[m_category]+1;
m_levelRank = m_sel[m_category]+1;
m_phaseTerm = m_phase; m_phaseTerm = m_phase;
m_main->ChangePhase(PHASE_LOADING); m_main->ChangePhase(PHASE_LOADING);
break; break;
@ -3353,9 +3355,9 @@ void CMainDialog::NiceParticle(Math::Point mouse, bool bPress)
// Built the default descriptive name of a mission. // Built the default descriptive name of a mission.
void CMainDialog::BuildResumeName(char *filename, std::string base, int rank) void CMainDialog::BuildResumeName(char *filename, std::string base, int chap, int rank)
{ {
sprintf(filename, "Scene %s %d", base.c_str(), rank); sprintf(filename, "%s %d.%d", base.c_str(), chap, rank);
} }
// Returns the name of the file or save the files. // Returns the name of the file or save the files.
@ -4213,7 +4215,7 @@ bool CMainDialog::IOReadScene()
{ {
CWindow* pw; CWindow* pw;
CList* pl; CList* pl;
int sel, i; int sel;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5)); pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5));
if ( pw == nullptr ) return false; if ( pw == nullptr ) return false;
@ -4234,29 +4236,42 @@ bool CMainDialog::IOReadScene()
CLevelParserLine* line = levelParser.Get("Mission"); CLevelParserLine* line = levelParser.Get("Mission");
m_category = GetLevelCategoryFromDir(line->GetParam("base")->AsString()); m_category = GetLevelCategoryFromDir(line->GetParam("base")->AsString());
m_sceneRank = line->GetParam("rank")->AsInt();
m_levelRank = line->GetParam("rank")->AsInt();
if (m_category == LevelCategory::CustomLevels) if (m_category == LevelCategory::CustomLevels)
{ {
m_sceneRank = m_sceneRank%100; m_levelChap = 0;
std::string dir = line->GetParam("dir")->AsString(); std::string dir = line->GetParam("dir")->AsString();
for ( i=0 ; i<m_userTotal ; i++ ) for (unsigned int i = 0; i < m_customLevelList.size(); i++)
{ {
if ( m_userList[i] == dir ) if (m_customLevelList[i] == dir)
{ {
m_sceneRank += (i+1)*100; m_levelChap = i+1;
break; break;
} }
} }
if ( m_sceneRank/100 == 0 ) if (m_levelChap == 0)
{ {
return false; return false;
} }
} }
else
{
if(line->GetParam("chap")->IsDefined())
{
m_levelChap = line->GetParam("chap")->AsInt();
}
else
{
// Backwards combatibility
int rank = line->GetParam("rank")->AsInt();
m_levelChap = rank/100;
m_levelRank = rank%100;
}
}
m_chap[m_category] = (m_sceneRank / 100)-1; m_chap[m_category] = m_levelChap-1;
m_sel[m_category] = (m_sceneRank % 100)-1; m_sel[m_category] = m_levelRank-1;
m_sceneRead = fileName; m_sceneRead = fileName;
m_stackRead = fileCbot; m_stackRead = fileCbot;
@ -4268,18 +4283,16 @@ bool CMainDialog::IOReadScene()
int CMainDialog::GetChapPassed() int CMainDialog::GetChapPassed()
{ {
int j; if ( m_main->GetShowAll() ) return MAXSCENE;
if ( m_main->GetShowAll() ) return 9; for ( int j = 1; j <= MAXSCENE; j++ )
for ( j=0 ; j<9 ; j++ )
{ {
if ( !GetGamerInfoPassed((j+1)*100) ) if ( !GetGamerInfoPassed(j, 0) )
{ {
return j; return j;
} }
} }
return 9; return MAXSCENE;
} }
// Updates the lists according to the cheat code. // Updates the lists according to the cheat code.
@ -4306,7 +4319,6 @@ void CMainDialog::UpdateSceneChap(int &chap)
std::string fileName; std::string fileName;
char line[500]; char line[500];
int j;
bool bPassed; bool bPassed;
memset(line, 0, 500); memset(line, 0, 500);
@ -4318,15 +4330,14 @@ void CMainDialog::UpdateSceneChap(int &chap)
pl->Flush(); pl->Flush();
unsigned int j;
if ( m_phase == PHASE_USER ) if ( m_phase == PHASE_USER )
{ {
j = 0;
auto userLevelDirs = CResourceManager::ListDirectories("levels/custom/"); auto userLevelDirs = CResourceManager::ListDirectories("levels/custom/");
std::sort(userLevelDirs.begin(), userLevelDirs.end()); std::sort(userLevelDirs.begin(), userLevelDirs.end());
m_userList = userLevelDirs; m_customLevelList = userLevelDirs;
m_userTotal = m_userList.size();
for ( j=0 ; j<m_userTotal ; j++ ) for ( j=0 ; j<m_customLevelList.size() ; j++ )
{ {
try try
{ {
@ -4344,7 +4355,7 @@ void CMainDialog::UpdateSceneChap(int &chap)
} }
else else
{ {
for ( j=0 ; j<9 ; j++ ) for ( j=0 ; j<MAXSCENE ; j++ )
{ {
CLevelParser levelParser(m_category, j+1, 0); CLevelParser levelParser(m_category, j+1, 0);
if (!levelParser.Exists()) if (!levelParser.Exists())
@ -4359,7 +4370,7 @@ void CMainDialog::UpdateSceneChap(int &chap)
sprintf(line, "%s", (std::string("[ERROR]: ")+e.what()).c_str()); sprintf(line, "%s", (std::string("[ERROR]: ")+e.what()).c_str());
} }
bPassed = GetGamerInfoPassed((j+1)*100); bPassed = GetGamerInfoPassed(j+1, 0);
pl->SetItemName(j, line); pl->SetItemName(j, line);
pl->SetCheck(j, bPassed); pl->SetCheck(j, bPassed);
pl->SetEnable(j, true); pl->SetEnable(j, true);
@ -4407,7 +4418,7 @@ void CMainDialog::UpdateSceneList(int chap, int &sel)
if (chap < 0) return; if (chap < 0) return;
bool readAll = true; bool readAll = true;
for ( j=0 ; j<99 ; j++ ) for ( j=0 ; j<MAXSCENE ; j++ )
{ {
CLevelParser levelParser(m_category, chap+1, j+1); CLevelParser levelParser(m_category, chap+1, j+1);
if (!levelParser.Exists()) if (!levelParser.Exists())
@ -4430,7 +4441,7 @@ void CMainDialog::UpdateSceneList(int chap, int &sel)
sprintf(line, "%s", (std::string("[ERROR]: ")+e.what()).c_str()); sprintf(line, "%s", (std::string("[ERROR]: ")+e.what()).c_str());
} }
bPassed = GetGamerInfoPassed((chap+1)*100+(j+1)); bPassed = GetGamerInfoPassed(chap+1, j+1);
pl->SetItemName(j, line); pl->SetItemName(j, line);
pl->SetCheck(j, bPassed); pl->SetCheck(j, bPassed);
pl->SetEnable(j, true); pl->SetEnable(j, true);
@ -4496,7 +4507,7 @@ void CMainDialog::ShowSoluceUpdate()
// Updates a summary of exercise or mission. // Updates a summary of exercise or mission.
void CMainDialog::UpdateSceneResume(int rank) void CMainDialog::UpdateSceneResume(int chap, int rank)
{ {
CWindow* pw; CWindow* pw;
CEdit* pe; CEdit* pe;
@ -4517,8 +4528,8 @@ void CMainDialog::UpdateSceneResume(int rank)
} }
else else
{ {
numTry = GetGamerInfoTry(rank); numTry = GetGamerInfoTry(chap, rank);
bPassed = GetGamerInfoPassed(rank); bPassed = GetGamerInfoPassed(chap, rank);
bVisible = ( numTry > 2 || bPassed || m_main->GetShowSoluce() ); bVisible = ( numTry > 2 || bPassed || m_main->GetShowSoluce() );
if ( !GetSoluce4() ) bVisible = false; if ( !GetSoluce4() ) bVisible = false;
pc->SetState(STATE_VISIBLE, bVisible); pc->SetState(STATE_VISIBLE, bVisible);
@ -4529,11 +4540,11 @@ void CMainDialog::UpdateSceneResume(int rank)
} }
} }
if (rank<100) return; if(chap == 0) return;
try try
{ {
CLevelParser levelParser(m_category, rank/100, rank%100); CLevelParser levelParser(m_category, chap, rank);
levelParser.Load(); levelParser.Load();
pe->SetText(levelParser.Get("Resume")->GetParam("text")->AsString().c_str()); pe->SetText(levelParser.Get("Resume")->GetParam("text")->AsString().c_str());
} }
@ -5898,44 +5909,35 @@ std::string & CMainDialog::GetStackRead()
return m_stackRead; return m_stackRead;
} }
// Specifies the name of the chosen to play scene.
void CMainDialog::SetLevelCategory(LevelCategory category) void CMainDialog::SetLevel(LevelCategory cat, int chap, int rank)
{ {
m_category = category; m_category = cat;
m_levelChap = chap;
m_levelRank = rank;
} }
// Returns the name of the chosen to play scene.
LevelCategory CMainDialog::GetLevelCategory() LevelCategory CMainDialog::GetLevelCategory()
{ {
return m_category; return m_category;
} }
// Specifies the rank of the chosen to play scene. int CMainDialog::GetLevelChap()
void CMainDialog::SetLevelRank(int rank)
{ {
m_sceneRank = rank; return m_levelChap;
} }
// Returns the rank of the chosen to play scene.
int CMainDialog::GetLevelRank() int CMainDialog::GetLevelRank()
{ {
return m_sceneRank; return m_levelRank;
} }
// Returns folder name of the scene that user selected to play. // Returns folder name of the scene that user selected to play.
const char* CMainDialog::GetCustomLevelDir() std::string CMainDialog::GetCustomLevelDir()
{ {
int i; if (m_levelChap-1 < 0 || m_levelChap-1 >= m_customLevelList.size()) return "";
return m_customLevelList[m_levelChap-1];
i = (m_sceneRank/100)-1;
if ( i < 0 || i >= m_userTotal ) return 0;
return m_userList[i].c_str();
} }
// Whether to show the solution. // Whether to show the solution.
@ -6115,13 +6117,8 @@ Gfx::Color CMainDialog::GetGamerColorBand()
bool CMainDialog::ReadGamerInfo() bool CMainDialog::ReadGamerInfo()
{ {
std::string line; std::string line;
int chap, i, numTry, passed;
for ( i=0 ; i<MAXSCENE ; i++ ) m_sceneInfo.clear();
{
m_sceneInfo[i].numTry = 0;
m_sceneInfo[i].bPassed = false;
}
if (!CResourceManager::Exists(GetSavegameDir()+"/"+m_main->GetGamerName()+"/"+GetLevelCategoryDir(m_category)+".gam")) if (!CResourceManager::Exists(GetSavegameDir()+"/"+m_main->GetGamerName()+"/"+GetLevelCategoryDir(m_category)+".gam"))
return false; return false;
@ -6135,9 +6132,10 @@ bool CMainDialog::ReadGamerInfo()
} }
std::getline(file, line); std::getline(file, line);
sscanf(line.c_str(), "CurrentChapter=%d CurrentSel=%d\n", &chap, &i); int chap, rank;
sscanf(line.c_str(), "CurrentChapter=%d CurrentSel=%d\n", &chap, &rank);
m_chap[m_category] = chap-1; m_chap[m_category] = chap-1;
m_sel[m_category] = i-1; m_sel[m_category] = rank-1;
while (!file.eof()) while (!file.eof())
{ {
@ -6148,15 +6146,15 @@ bool CMainDialog::ReadGamerInfo()
break; break;
} }
int numTry, passed;
sscanf(line.c_str(), "Chapter %d: Scene %d: numTry=%d passed=%d\n", sscanf(line.c_str(), "Chapter %d: Scene %d: numTry=%d passed=%d\n",
&chap, &i, &numTry, &passed); &chap, &rank, &numTry, &passed);
i += chap*100; if ( chap < 0 || chap > MAXSCENE ) continue;
if ( i >= 0 && i < MAXSCENE ) if ( rank < 0 || rank > MAXSCENE ) continue;
{
m_sceneInfo[i].numTry = numTry; m_sceneInfo[chap][rank].numTry = numTry;
m_sceneInfo[i].bPassed = passed; m_sceneInfo[chap][rank].bPassed = passed;
}
} }
file.close(); file.close();
@ -6167,8 +6165,6 @@ bool CMainDialog::ReadGamerInfo()
bool CMainDialog::WriteGamerInfo() bool CMainDialog::WriteGamerInfo()
{ {
int i;
COutputStream file; COutputStream file;
file.open(GetSavegameDir()+"/"+m_main->GetGamerName()+"/"+GetLevelCategoryDir(m_category)+".gam"); file.open(GetSavegameDir()+"/"+m_main->GetGamerName()+"/"+GetLevelCategoryDir(m_category)+".gam");
if (!file.is_open()) if (!file.is_open())
@ -6179,55 +6175,59 @@ bool CMainDialog::WriteGamerInfo()
file << "CurrentChapter=" << m_chap[m_category]+1 << " CurrentSel=" << m_sel[m_category]+1 << "\n"; file << "CurrentChapter=" << m_chap[m_category]+1 << " CurrentSel=" << m_sel[m_category]+1 << "\n";
for ( i=0 ; i<MAXSCENE ; i++ ) for ( int i=0 ; i<MAXSCENE ; i++ )
{ {
if ( m_sceneInfo[i].numTry == 0 && !m_sceneInfo[i].bPassed ) continue; if (m_sceneInfo.find(i) == m_sceneInfo.end()) continue;
for ( int j=0 ; j<MAXSCENE ; j++ )
{
if (m_sceneInfo[i].find(j) == m_sceneInfo[i].end()) continue;
if ( m_sceneInfo[i][j].numTry == 0 && !m_sceneInfo[i][j].bPassed ) continue;
file << "Chapter " << i/100 << ": Scene " << i%100 << ": numTry=" << m_sceneInfo[i].numTry << " passed=" << (m_sceneInfo[i].bPassed ? "1" : "0") << "\n"; file << "Chapter " << i << ": Scene " << j << ": numTry=" << m_sceneInfo[i][j].numTry << " passed=" << (m_sceneInfo[i][j].bPassed ? "1" : "0") << "\n";
}
} }
file.close(); file.close();
return true; return true;
} }
void CMainDialog::SetGamerInfoTry(int rank, int numTry) void CMainDialog::SetGamerInfoTry(int chap, int rank, int numTry)
{ {
if ( rank < 0 || rank >= MAXSCENE ) return; if ( chap < 0 || chap > MAXSCENE ) return;
if ( numTry > 100 ) numTry = 100; if ( rank < 0 || rank > MAXSCENE ) return;
m_sceneInfo[rank].numTry = numTry; m_sceneInfo[chap][rank].numTry = numTry;
} }
int CMainDialog::GetGamerInfoTry(int rank) int CMainDialog::GetGamerInfoTry(int chap, int rank)
{ {
if ( rank < 0 || rank >= MAXSCENE ) return 0; if ( chap < 0 || chap > MAXSCENE ) return 0;
return m_sceneInfo[rank].numTry; if ( rank < 0 || rank > MAXSCENE ) return 0;
return m_sceneInfo[chap][rank].numTry;
} }
void CMainDialog::SetGamerInfoPassed(int rank, bool bPassed) void CMainDialog::SetGamerInfoPassed(int chap, int rank, bool bPassed)
{ {
int chap, i; if ( chap < 0 || chap > MAXSCENE ) return;
bool bAll; if ( rank < 0 || rank > MAXSCENE ) return;
m_sceneInfo[chap][rank].bPassed = bPassed;
if ( rank < 0 || rank >= MAXSCENE ) return;
m_sceneInfo[rank].bPassed = bPassed;
if ( bPassed ) if ( bPassed )
{ {
bAll = true; bool bAll = true;
chap = rank/100; for ( int i=0 ; i<m_maxList ; i++ )
for ( i=0 ; i<m_maxList ; i++ )
{ {
bAll &= m_sceneInfo[chap*100+i+1].bPassed; bAll &= m_sceneInfo[chap][i+1].bPassed;
} }
m_sceneInfo[chap*100].numTry ++; m_sceneInfo[chap][0].numTry ++;
m_sceneInfo[chap*100].bPassed = bAll; m_sceneInfo[chap][0].bPassed = bAll;
} }
} }
bool CMainDialog::GetGamerInfoPassed(int rank) bool CMainDialog::GetGamerInfoPassed(int chap, int rank)
{ {
if ( rank < 0 || rank >= MAXSCENE ) return false; if ( chap < 0 || chap > MAXSCENE ) return false;
return m_sceneInfo[rank].bPassed; if ( rank < 0 || rank > MAXSCENE ) return false;
return m_sceneInfo[chap][rank].bPassed;
} }
@ -6248,7 +6248,7 @@ bool CMainDialog::NextMission()
std::string& CMainDialog::GetCustomLevelName(int id) std::string& CMainDialog::GetCustomLevelName(int id)
{ {
return m_userList[id-1]; return m_customLevelList[id-1];
} }

View File

@ -16,9 +16,6 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see http://gnu.org/licenses * along with this program. If not, see http://gnu.org/licenses
*/ */
// maindialog.h
#pragma once #pragma once
@ -49,7 +46,7 @@ class CControl;
const int USERLISTMAX = 100; const int USERLISTMAX = 100;
const int MAXSCENE = 1000; const int MAXSCENE = 999;
struct SceneInfo struct SceneInfo
@ -85,12 +82,12 @@ public:
void SetStackRead(const char* name); void SetStackRead(const char* name);
std::string & GetStackRead(); std::string & GetStackRead();
void SetLevelCategory(LevelCategory category); void SetLevel(LevelCategory cat, int chap, int rank);
LevelCategory GetLevelCategory(); LevelCategory GetLevelCategory();
void SetLevelRank(int rank); int GetLevelChap();
int GetLevelRank(); int GetLevelRank();
std::string GetCustomLevelDir();
const char* GetCustomLevelDir();
bool GetSceneSoluce(); bool GetSceneSoluce();
std::string & GetSavegameDir(); std::string & GetSavegameDir();
std::string & GetPublicDir(); std::string & GetPublicDir();
@ -102,7 +99,7 @@ public:
bool GetNiceReset(); bool GetNiceReset();
bool GetHimselfDamage(); bool GetHimselfDamage();
void BuildResumeName(char *filename, std::string base, int rank); void BuildResumeName(char *filename, std::string base, int chap, int rank);
std::string & GetFilesDir(); std::string & GetFilesDir();
void StartAbort(); void StartAbort();
@ -122,10 +119,10 @@ public:
bool ReadGamerInfo(); bool ReadGamerInfo();
bool WriteGamerInfo(); bool WriteGamerInfo();
void SetGamerInfoTry(int rank, int numTry); void SetGamerInfoTry(int chap, int rank, int numTry);
int GetGamerInfoTry(int rank); int GetGamerInfoTry(int chap, int rank);
void SetGamerInfoPassed(int rank, bool bPassed); void SetGamerInfoPassed(int chap, int rank, bool bPassed);
bool GetGamerInfoPassed(int rank); bool GetGamerInfoPassed(int chap, int rank);
bool NextMission(); bool NextMission();
void WriteGamerPerso(char *gamer); void WriteGamerPerso(char *gamer);
@ -174,7 +171,7 @@ protected:
int GetChapPassed(); int GetChapPassed();
void UpdateSceneChap(int &chap); void UpdateSceneChap(int &chap);
void UpdateSceneList(int chap, int &sel); void UpdateSceneList(int chap, int &sel);
void UpdateSceneResume(int rank); void UpdateSceneResume(int chap, int rank);
void UpdateDisplayMode(); void UpdateDisplayMode();
void ChangeDisplay(); void ChangeDisplay();
void UpdateApply(); void UpdateApply();
@ -216,7 +213,8 @@ protected:
int m_accessChap; int m_accessChap;
std::string m_sceneRead; // name of the scene to read std::string m_sceneRead; // name of the scene to read
std::string m_stackRead; // name of the scene to read std::string m_stackRead; // name of the scene to read
int m_sceneRank; // rank of the scene to play int m_levelChap; // chapter of the level to play
int m_levelRank; // rank of the level to play
bool m_bSceneSoluce; // shows the solution bool m_bSceneSoluce; // shows the solution
bool m_bSimulSetup; // adjustment during the game bool m_bSimulSetup; // adjustment during the game
bool m_accessEnable; bool m_accessEnable;
@ -224,9 +222,7 @@ protected:
bool m_accessUser; bool m_accessUser;
bool m_bDeleteGamer; bool m_bDeleteGamer;
int m_userTotal; std::vector<std::string> m_customLevelList;
std::vector<std::string> m_userList;
int m_shotDelay; // number of frames before copy int m_shotDelay; // number of frames before copy
std::string m_shotName; // generate a file name std::string m_shotName; // generate a file name
@ -267,7 +263,7 @@ protected:
float m_partiTime[10]; float m_partiTime[10];
Math::Point m_partiPos[10]; Math::Point m_partiPos[10];
SceneInfo m_sceneInfo[MAXSCENE]; std::map<int, std::map<int, SceneInfo>> m_sceneInfo;
std::vector<std::string> m_saveList; std::vector<std::string> m_saveList;
}; };