summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkrzys-h <krzys_h@interia.pl>2014-07-11 16:40:07 +0200
committerkrzys-h <krzys_h@interia.pl>2014-07-11 16:40:07 +0200
commit02ba358a892b9977250ea345c42f8226f89ba250 (patch)
treec1e73272d29cbf5e2bf53c2c59bb9920ff16aadf
parent96d49d84aafecd78c902681f20de6207badf7e85 (diff)
downloadcolobot-02ba358a892b9977250ea345c42f8226f89ba250.tar.gz
colobot-02ba358a892b9977250ea345c42f8226f89ba250.tar.bz2
colobot-02ba358a892b9977250ea345c42f8226f89ba250.zip
Help file loading
-rw-r--r--src/object/robotmain.cpp54
-rw-r--r--src/object/robotmain.h5
-rw-r--r--src/ui/edit.cpp26
-rw-r--r--src/ui/maindialog.cpp23
-rw-r--r--src/ui/maindialog.h2
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 <string.h>
+#include <boost/algorithm/string.hpp>
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();