From 02ba358a892b9977250ea345c42f8226f89ba250 Mon Sep 17 00:00:00 2001 From: krzys-h Date: Fri, 11 Jul 2014 16:40:07 +0200 Subject: Help file loading --- src/object/robotmain.cpp | 54 +++++++++++++++++++++++++++++++++++++++--------- src/object/robotmain.h | 5 +++++ src/ui/edit.cpp | 26 +++++++++++++---------- src/ui/maindialog.cpp | 23 ++++++++++++++------- src/ui/maindialog.h | 2 +- 5 files changed, 80 insertions(+), 30 deletions(-) diff --git a/src/object/robotmain.cpp b/src/object/robotmain.cpp index 8108129..9860943 100644 --- a/src/object/robotmain.cpp +++ b/src/object/robotmain.cpp @@ -3843,11 +3843,6 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) const char* stack = m_dialog->GetStackRead().c_str(); m_dialog->SetUserDir(base, rank); - /* - * TODO: original code relying on UserDir() was removed. - * A new way of providing custom data file paths will need to be devised. - */ - m_fixScene = fixScene; g_id = 0; @@ -4020,7 +4015,9 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) if (Cmd(line, "Instructions") && !resetObject) { OpString(line, "name", name); - strcpy(m_infoFilename[SATCOM_HUSTON], name); + std::string path = name; + InjectLevelDir(path, "help/%lng%"); + strcpy(m_infoFilename[SATCOM_HUSTON], path.c_str()); m_immediatSatCom = OpInt(line, "immediat", 0); if (m_version >= 2) m_beginSatCom = m_lockedSatCom = OpInt(line, "lock", 0); @@ -4031,27 +4028,35 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) if (Cmd(line, "Satellite") && !resetObject) { OpString(line, "name", name); - strcpy(m_infoFilename[SATCOM_SAT], name); + std::string path = name; + InjectLevelDir(path, "help/%lng%"); + strcpy(m_infoFilename[SATCOM_SAT], path.c_str()); continue; } if (Cmd(line, "Loading") && !resetObject) { OpString(line, "name", name); - strcpy(m_infoFilename[SATCOM_LOADING], name); + std::string path = name; + InjectLevelDir(path, "help/%lng%"); + strcpy(m_infoFilename[SATCOM_LOADING], path.c_str()); continue; } if (Cmd(line, "HelpFile") && !resetObject) { OpString(line, "name", name); - strcpy(m_infoFilename[SATCOM_PROG], name); + std::string path = name; + InjectLevelDir(path, "help/%lng%"); + strcpy(m_infoFilename[SATCOM_PROG], path.c_str()); continue; } if (Cmd(line, "SoluceFile") && !resetObject) { OpString(line, "name", name); - strcpy(m_infoFilename[SATCOM_SOLUCE], name); + std::string path = name; + InjectLevelDir(path, "help/%lng%"); + strcpy(m_infoFilename[SATCOM_SOLUCE], path.c_str()); continue; } @@ -7001,6 +7006,21 @@ float CRobotMain::GetPersoAngle() return m_dialog->GetPersoAngle(); } +char* CRobotMain::GetSceneName() +{ + return m_dialog->GetSceneName(); +} + +int CRobotMain::GetSceneRank() +{ + return m_dialog->GetSceneRank(); +} + +void CRobotMain::BuildSceneName(std::string &filename, char *base, int rank, bool sceneFile) +{ + m_dialog->BuildSceneName(filename, base, rank, sceneFile); +} + //! Changes on the pause mode void CRobotMain::ChangePause(PauseType pause) @@ -7236,3 +7256,17 @@ void CRobotMain::DisplayError(Error err, Math::Vector goal, float height, float { m_displayText->DisplayError(err, goal, height, dist, time); } + +void CRobotMain::InjectLevelDir(std::string& path, const std::string defaultDir) +{ + std::string oldPath = path; + std::string lvlDir; + CRobotMain::GetInstancePointer()->BuildSceneName(lvlDir, CRobotMain::GetInstancePointer()->GetSceneName(), CRobotMain::GetInstancePointer()->GetSceneRank(), false); + boost::replace_all(path, "%lvl%", lvlDir); + if(path == oldPath) + { + path = defaultDir + "/" + path; + } + std::string langStr(1, CApplication::GetInstancePointer()->GetLanguageChar()); + boost::replace_all(path, "%lng%", langStr); +} diff --git a/src/object/robotmain.h b/src/object/robotmain.h index 19e9e7d..f9bf131 100644 --- a/src/object/robotmain.h +++ b/src/object/robotmain.h @@ -337,6 +337,9 @@ public: int GetGamerGlasses(); bool GetGamerOnlyHead(); float GetPersoAngle(); + char* GetSceneName(); + int GetSceneRank(); + void BuildSceneName(std::string &filename, char *base, int rank, bool sceneFile = true); void StartMusic(); void StartPauseMusic(PauseType pause); @@ -386,6 +389,8 @@ public: void DisplayError(Error err, CObject* pObj, float time=10.0f); void DisplayError(Error err, Math::Vector goal, float height=15.0f, float dist=60.0f, float time=10.0f); + + static void InjectLevelDir(std::string& path, const std::string defaultDir = ""); protected: bool EventFrame(const Event &event); diff --git a/src/ui/edit.cpp b/src/ui/edit.cpp index f9b7837..a0387bf 100644 --- a/src/ui/edit.cpp +++ b/src/ui/edit.cpp @@ -22,10 +22,13 @@ #include "clipboard/clipboard.h" +#include "object/robotmain.h" + #include "common/resources/inputstream.h" #include "common/resources/outputstream.h" #include +#include namespace Ui { @@ -784,14 +787,9 @@ void CEdit::HyperJump(std::string name, std::string marker) sMarker = marker; - if ( name[0] == '%' ) - { - filename = GetProfile().GetUserBasedPath(name, "") + ".txt"; - } - else - { - filename = name + std::string(".txt"); - } + filename = name + std::string(".txt"); + CRobotMain::InjectLevelDir(filename, "help/%lng%"); + boost::replace_all(filename, "\\", "/"); //TODO: Fix this in files if ( ReadText(filename) ) { @@ -1146,6 +1144,9 @@ void CEdit::DrawImage(Math::Point pos, std::string name, float width, std::string filename; filename = name + ".png"; + CRobotMain::InjectLevelDir(filename, "icons"); + boost::replace_all(filename, "\\", "/"); //TODO: Fix this in files + filename = "../" + filename; m_engine->SetTexture(filename); m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); @@ -1434,7 +1435,9 @@ void CEdit::LoadImage(std::string name) { std::string filename; filename = name + ".png"; - m_engine->LoadTexture(filename); + CRobotMain::InjectLevelDir(filename, "icons"); + boost::replace_all(filename, "\\", "/"); //TODO: Fix this in files + m_engine->LoadTexture("../"+filename); } // Read from a text file. @@ -1449,13 +1452,14 @@ bool CEdit::ReadText(std::string filename, int addSize) InputSlot slot; bool bInSoluce, bBOL; - if ( filename[0] == 0 ) return false; + if ( filename == "" ) return false; CInputStream stream; - stream.open(filename); + stream.open(filename); if (!stream.is_open()) { + CLogger::GetInstancePointer()->Error("Failed to load text file %s\n", filename.c_str()); return false; } diff --git a/src/ui/maindialog.cpp b/src/ui/maindialog.cpp index fd6cd2e..068732d 100644 --- a/src/ui/maindialog.cpp +++ b/src/ui/maindialog.cpp @@ -3290,7 +3290,7 @@ void CMainDialog::SetUserDir(char *base, int rank) // Builds the file name of a mission. -void CMainDialog::BuildSceneName(std::string &filename, char *base, int rank) +void CMainDialog::BuildSceneName(std::string &filename, char *base, int rank, bool sceneFile) { //TODO: Support for more than 9 chapters int chapter = rank/100; @@ -3311,20 +3311,27 @@ void CMainDialog::BuildSceneName(std::string &filename, char *base, int rank) else if( strcmp(base, "win") == 0 || strcmp(base, "lost") == 0 ) { outstream << "levels/other/"; - outstream << base << std::setfill('0') << std::setw(3) << chapter << "/"; - outstream << "scene.txt"; - std::cout << outstream.str() << std::endl; + outstream << base << std::setfill('0') << std::setw(3) << rank << ".txt"; filename = outstream.str(); } else { outstream << "levels/" << base << "/"; outstream << "chapter" << std::setfill('0') << std::setw(3) << chapter << "/"; - if(new_rank == 000) { - outstream << "chaptertitle.txt"; - } else { + if(new_rank == 000) + { + if(sceneFile) + { + outstream << "chaptertitle.txt"; + } + } + else + { outstream << "level" << std::setfill('0') << std::setw(3) << new_rank << "/"; - outstream << "scene.txt"; + if(sceneFile) + { + outstream << "scene.txt"; + } } filename = outstream.str(); } diff --git a/src/ui/maindialog.h b/src/ui/maindialog.h index 7732f9f..cb26426 100644 --- a/src/ui/maindialog.h +++ b/src/ui/maindialog.h @@ -99,7 +99,7 @@ public: bool GetHimselfDamage(); void SetUserDir(char *base, int rank); - void BuildSceneName(std::string &filename, char *base, int rank); + void BuildSceneName(std::string &filename, char *base, int rank, bool sceneFile = true); void BuildResumeName(char *filename, char *base, int rank); std::string & GetFilesDir(); -- cgit v1.2.3-1-g7c22