From 671115476225b49da15c3c600639af5079d4f261 Mon Sep 17 00:00:00 2001 From: krzys-h Date: Sat, 29 Aug 2015 16:52:07 +0200 Subject: [PATCH] Fixed produce() and NewScript not marking programs as loaded from level files (closes #613); refactored NewScript to std::vector and std::string --- src/level/robotmain.cpp | 35 +++++++++++---------------------- src/level/robotmain.h | 13 +++++------- src/object/auto/autofactory.cpp | 8 +++++--- src/script/scriptfunc.cpp | 1 + 4 files changed, 23 insertions(+), 34 deletions(-) diff --git a/src/level/robotmain.cpp b/src/level/robotmain.cpp index 2b2623da..64b3cc0d 100644 --- a/src/level/robotmain.cpp +++ b/src/level/robotmain.cpp @@ -4372,45 +4372,34 @@ bool CRobotMain::ReadFileStack(CObject *obj, FILE *file, int objRank) //! Empty the list -bool CRobotMain::FlushNewScriptName() +void CRobotMain::FlushNewScriptName() { - for (int i = 0; i < MAXNEWSCRIPTNAME; i++) - m_newScriptName[i].used = false; - - return true; + m_newScriptName.clear(); } //! Adds a script name -bool CRobotMain::AddNewScriptName(ObjectType type, char *name) +void CRobotMain::AddNewScriptName(ObjectType type, const std::string& name) { - for (int i = 0; i < MAXNEWSCRIPTNAME; i++) - { - if (!m_newScriptName[i].used) - { - m_newScriptName[i].used = true; - m_newScriptName[i].type = type; - strcpy(m_newScriptName[i].name, name); - return true; - } - } - return false; + NewScriptName newscript; + newscript.type = type; + newscript.name = name; + m_newScriptName.push_back(newscript); } //! Seeks a script name for a given type -char* CRobotMain::GetNewScriptName(ObjectType type, int rank) +std::string CRobotMain::GetNewScriptName(ObjectType type, int rank) { - for (int i = 0; i < MAXNEWSCRIPTNAME; i++) + for (unsigned int i = 0; i < m_newScriptName.size(); i++) { - if (m_newScriptName[i].used && - (m_newScriptName[i].type == type || - m_newScriptName[i].type == OBJECT_NULL)) + if (m_newScriptName[i].type == type || + m_newScriptName[i].type == OBJECT_NULL ) { if (rank == 0) return m_newScriptName[i].name; else rank --; } } - return nullptr; + return ""; } diff --git a/src/level/robotmain.h b/src/level/robotmain.h index 5b400e69..02de6ea8 100644 --- a/src/level/robotmain.h +++ b/src/level/robotmain.h @@ -112,13 +112,10 @@ class CDisplayText; class CDisplayInfo; } -const int MAXNEWSCRIPTNAME = 20; - struct NewScriptName { - bool used = false; ObjectType type = OBJECT_NULL; - char name[40] = {}; + std::string name = ""; }; @@ -280,9 +277,9 @@ public: bool SaveFileStack(CObject *pObj, FILE *file, int objRank); bool ReadFileStack(CObject *pObj, FILE *file, int objRank); - bool FlushNewScriptName(); - bool AddNewScriptName(ObjectType type, char *name); - char* GetNewScriptName(ObjectType type, int rank); + void FlushNewScriptName(); + void AddNewScriptName(ObjectType type, const std::string& name); + std::string GetNewScriptName(ObjectType type, int rank); void SelectPlayer(std::string playerName); CPlayerProfile* GetPlayerProfile(); @@ -534,7 +531,7 @@ protected: std::map m_teamNames; - NewScriptName m_newScriptName[MAXNEWSCRIPTNAME]; + std::vector m_newScriptName; float m_cameraPan = 0.0f; float m_cameraZoom = 0.0f; diff --git a/src/object/auto/autofactory.cpp b/src/object/auto/autofactory.cpp index 71e1a8ce..952805ea 100644 --- a/src/object/auto/autofactory.cpp +++ b/src/object/auto/autofactory.cpp @@ -26,6 +26,7 @@ #include "level/robotmain.h" +#include "level/parser/parser.h" #include "level/parser/parserline.h" #include "level/parser/parserparam.h" @@ -665,11 +666,12 @@ bool CAutoFactory::CreateVehicle() CProgramStorageObject* programStorage = dynamic_cast(vehicle); for ( int i=0 ; ; i++ ) { - char* name = m_main->GetNewScriptName(m_type, i); - if ( name == nullptr ) break; + std::string name = m_main->GetNewScriptName(m_type, i); + if (name.empty()) break; Program* prog = programStorage->GetOrAddProgram(i); - programStorage->ReadProgram(prog, name); + programStorage->ReadProgram(prog, InjectLevelPathsForCurrentLevel(name)); prog->readOnly = true; + prog->filename = name; } } diff --git a/src/script/scriptfunc.cpp b/src/script/scriptfunc.cpp index b74facc3..4a0214a9 100644 --- a/src/script/scriptfunc.cpp +++ b/src/script/scriptfunc.cpp @@ -1607,6 +1607,7 @@ bool CScriptFunctions::rProduce(CBotVar* var, CBotVar* result, int& exception, v CProgramStorageObject* programStorage = dynamic_cast(object); Program* program = programStorage->AddProgram(); programStorage->ReadProgram(program, name2.c_str()); + program->filename = name; dynamic_cast(object)->RunProgram(program); } }