From 57646c0c7b25b5fac476e61592e57df51f3b5851 Mon Sep 17 00:00:00 2001 From: krzys-h Date: Fri, 14 Aug 2015 18:19:58 +0200 Subject: [PATCH] Refactored object creation --- src/level/robotmain.cpp | 222 +++++++----------------------- src/object/auto/auto.cpp | 10 +- src/object/object.cpp | 19 +++ src/object/object.h | 3 + src/object/object_create_params.h | 2 - src/object/object_manager.cpp | 19 +-- src/object/object_manager.h | 12 +- src/object/old_object.cpp | 123 +++++++++++++---- src/physics/physics.cpp | 6 +- src/script/scriptfunc.cpp | 2 +- 10 files changed, 183 insertions(+), 235 deletions(-) diff --git a/src/level/robotmain.cpp b/src/level/robotmain.cpp index b38129bf..ba71a158 100644 --- a/src/level/robotmain.cpp +++ b/src/level/robotmain.cpp @@ -67,7 +67,6 @@ #include "object/object_manager.h" #include "object/auto/auto.h" -#include "object/auto/autobase.h" #include "object/motion/motion.h" #include "object/motion/motionhuman.h" @@ -1589,8 +1588,11 @@ void CRobotMain::StartDisplayVisit(EventType event) m_visitArrow = nullptr; } - Math::Vector goal = m_displayText->GetVisitGoal(event); - m_visitArrow = m_objMan->CreateObject(goal, 0.0f, OBJECT_SHOW, -1.0f, 1.0f, 10.0f); + ObjectCreateParams params; + params.pos = m_displayText->GetVisitGoal(event); + params.type = OBJECT_SHOW; + params.height = 10.0f; + m_visitArrow = m_objMan->CreateObject(params); m_visitPos = m_visitArrow->GetPosition(); m_visitPosArrow = m_visitPos; @@ -3289,7 +3291,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) if (line->GetCommand() == "LevelController" && m_sceneReadPath.empty()) { - m_controller = m_objMan->CreateObject(Math::Vector(0.0f, 0.0f, 0.0f), 0.0f, OBJECT_CONTROLLER, 100.0f); + m_controller = m_objMan->CreateObject(Math::Vector(0.0f, 0.0f, 0.0f), 0.0f, OBJECT_CONTROLLER); if (m_controller->Implements(ObjectInterfaceType::Programmable)) { CProgrammableObject* programmable = dynamic_cast(m_controller); @@ -3306,137 +3308,49 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) if (line->GetCommand() == "CreateObject" && m_sceneReadPath.empty()) { - ObjectType type = line->GetParam("type")->AsObjectType(); + ObjectCreateParams params = CObject::ReadCreateParams(line.get()); float objectProgress = static_cast(rankObj) / static_cast(numObjects); std::string details = StrUtils::ToString(rankObj+1)+" / "+StrUtils::ToString(numObjects); #if DEV_BUILD // Object categories may spoil the level a bit, so hide them in release builds - details += ": "+CLevelParserParam::FromObjectType(type); + details += ": "+CLevelParserParam::FromObjectType(params.type); #endif m_ui->GetLoadingScreen()->SetProgress(0.25f+objectProgress*0.5f, RT_LOADING_OBJECTS, details); - Math::Vector pos = line->GetParam("pos")->AsPoint()*g_unit; - float dirAngle = line->GetParam("dir")->AsFloat(0.0f)*Math::PI; - bool trainer; - CObject* obj = nullptr; try { - obj = m_objMan->CreateObject( - pos, dirAngle, - type, - line->GetParam("power")->AsFloat(1.0f), - line->GetParam("z")->AsFloat(1.0f), - line->GetParam("h")->AsFloat(0.0f), - trainer = line->GetParam("trainer")->AsBool(false), - line->GetParam("toy")->AsBool(false), - line->GetParam("option")->AsInt(0), - line->GetParam("team")->AsInt(0) - ); - } - catch (const CObjectCreateException& e) - { - GetLogger()->Error("Error loading level object: %s\n", e.what()); - throw; - } + CObject* obj = m_objMan->CreateObject(params); + obj->Read(line.get()); - if (m_fixScene && type == OBJECT_HUMAN) - { - assert(obj->Implements(ObjectInterfaceType::Movable)); - CMotion* motion = dynamic_cast(obj)->GetMotion(); - if (m_phase == PHASE_WIN ) motion->SetAction(MHS_WIN, 0.4f); - if (m_phase == PHASE_LOST) motion->SetAction(MHS_LOST, 0.5f); - } - - if (obj->Implements(ObjectInterfaceType::Old)) // TODO: temporary hack - { - COldObject* oldObj = dynamic_cast(obj); - - oldObj->SetDefRank(rankObj); // TODO: do we really need this? - - if (type == OBJECT_BASE) - m_base = oldObj; - - if (line->GetParam("select")->AsBool(false)) - sel = oldObj; - - // TODO: everything below should go to CObject::Read() function - // In fact, we could give CLevelParserLine as parameter to CreateObject() in the first place - - Gfx::CameraType cType = line->GetParam("camera")->AsCameraType(Gfx::CAM_TYPE_NULL); - if (cType != Gfx::CAM_TYPE_NULL) - oldObj->SetCameraType(cType); - - oldObj->SetCameraDist(line->GetParam("cameraDist")->AsFloat(50.0f)); - oldObj->SetCameraLock(line->GetParam("cameraLock")->AsBool(false)); - - Gfx::PyroType pType = line->GetParam("pyro")->AsPyroType(Gfx::PT_NULL); - if (pType != Gfx::PT_NULL) + if (m_fixScene && obj->GetType() == OBJECT_HUMAN) { - m_engine->GetPyroManager()->Create(pType, oldObj); + assert(obj->Implements(ObjectInterfaceType::Movable)); + CMotion* motion = dynamic_cast(obj)->GetMotion(); + if (m_phase == PHASE_WIN ) motion->SetAction(MHS_WIN, 0.4f); + if (m_phase == PHASE_LOST) motion->SetAction(MHS_LOST, 0.5f); } - if (type == OBJECT_INFO) + if (obj->Implements(ObjectInterfaceType::Controllable) && line->GetParam("select")->AsBool(false)) + sel = obj; + + if (obj->GetType() == OBJECT_BASE) + m_base = obj; + + if (obj->Implements(ObjectInterfaceType::Old)) + dynamic_cast(obj)->SetDefRank(rankObj); // TODO: do we really need this? + + if (obj->Implements(ObjectInterfaceType::Programmable)) { - CExchangePost* exchangePost = static_cast(oldObj); - exchangePost->ReadInfo(line.get()); - } - - // Sets the parameters of the command line. - if (line->GetParam("cmdline")->IsDefined()) - { - const auto& cmdline = line->GetParam("cmdline")->AsArray(); - for (unsigned int i = 0; i < cmdline.size(); i++) - { - oldObj->SetCmdLine(i, cmdline[i]->AsFloat()); - } - } - - bool selectable = line->GetParam("selectable")->AsBool(true); - oldObj->SetSelectable(selectable); - oldObj->SetProxyActivate(line->GetParam("proxyActivate")->AsBool(false)); - oldObj->SetProxyDistance(line->GetParam("proxyDistance")->AsFloat(15.0f)*g_unit); - oldObj->SetRange(line->GetParam("range")->AsFloat(30.0f)); - oldObj->SetShield(line->GetParam("shield")->AsFloat(1.0f)); - oldObj->SetMagnifyDamage(line->GetParam("magnifyDamage")->AsFloat(1.0f)); - oldObj->SetCollisions(line->GetParam("clip")->AsBool(true)); - oldObj->SetCheckToken(!line->GetParam("checkToken")->IsDefined() ? trainer || !selectable : line->GetParam("checkToken")->AsBool(true)); - // SetManual will affect bot speed - if (type == OBJECT_MOBILEdr) - { - oldObj->SetManual(!trainer); - } - - Math::Vector zoom = line->GetParam("zoom")->AsPoint(Math::Vector(0.0f, 0.0f, 0.0f)); - if (zoom.x != 0.0f || zoom.y != 0.0f || zoom.z != 0.0f) - oldObj->SetScale(zoom); - - // only used in AlienWorm lines - if (type == OBJECT_WORM) - { - CMotion* motion = oldObj->GetMotion(); - if (motion != nullptr && line->GetParam("param")->IsDefined()) - { - const auto& p = line->GetParam("param")->AsArray(); - for (unsigned int i = 0; i < 10 && i < p.size(); i++) - { - motion->SetParam(i, p[i]->AsFloat()); - } - } - } - - int run = -1; - std::map loadedPrograms; - if (oldObj->Implements(ObjectInterfaceType::Programmable)) - { - CProgrammableObject* programmable = dynamic_cast(oldObj); + CProgrammableObject* programmable = dynamic_cast(obj); + std::map loadedPrograms; bool allFilled = true; for (int i = 0; i < 10 || allFilled; i++) { - std::string op = "script" + boost::lexical_cast(i+1); // script1..script10 - std::string opReadOnly = "scriptReadOnly" + boost::lexical_cast(i+1); // scriptReadOnly1..scriptReadOnly10 - std::string opRunnable = "scriptRunnable" + boost::lexical_cast(i+1); // scriptRunnable1..scriptRunnable10 + std::string op = "script" + StrUtils::ToString(i+1); // script1..script10 + std::string opReadOnly = "scriptReadOnly" + StrUtils::ToString(i+1); // scriptReadOnly1..scriptReadOnly10 + std::string opRunnable = "scriptRunnable" + StrUtils::ToString(i+1); // scriptRunnable1..scriptRunnable10 if (line->GetParam(op)->IsDefined()) { Program* program = programmable->AddProgram(); @@ -3454,37 +3368,17 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) int i = line->GetParam("run")->AsInt(0); if (i != 0) { - run = i-1; - programmable->SetScriptRun(loadedPrograms[run]); - } - } - CAuto* automat = oldObj->GetAuto(); - if (automat != nullptr) - { - type = line->GetParam("autoType")->AsObjectType(OBJECT_NULL); - automat->SetType(type); - for (int i = 0; i < 5; i++) - { - std::string op = "autoValue" + boost::lexical_cast(i+1); // autoValue1..autoValue5 - automat->SetValue(i, line->GetParam(op)->AsFloat(0.0f)); - } - automat->SetString(const_cast(line->GetParam("autoString")->AsPath("ai", "").c_str())); - - int i = line->GetParam("run")->AsInt(-1); - if (i != -1) - { - if (i != PARAM_FIXSCENE && - !m_settings->GetMovies()) i = 0; - automat->Start(i); // starts the film + programmable->SetScriptRun(loadedPrograms[i-1]); } } - if (soluce && oldObj->Implements(ObjectInterfaceType::Programmable) && line->GetParam("soluce")->IsDefined()) - dynamic_cast(oldObj) - ->SetSoluceName(line->GetParam("soluce")->AsPath("ai")); - - if (line->GetParam("reset")->AsBool(false)) - oldObj->SetAnimateOnReset(true); + if (soluce && obj->Implements(ObjectInterfaceType::Programmable) && line->GetParam("soluce")->IsDefined()) + dynamic_cast(obj)->SetSoluceName(line->GetParam("soluce")->AsPath("ai")); + } + catch (const CObjectCreateException& e) + { + GetLogger()->Error("Error loading level object: %s\n", e.what()); + throw; } rankObj ++; @@ -3764,11 +3658,9 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) if (m_base == nullptr && // no main base? !m_fixScene) // interractive scene? { - CObject* obj; + CObject* obj = sel; if (sel == nullptr) obj = SearchHuman(); - else - obj = sel; if (obj != nullptr) { @@ -3810,6 +3702,8 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) void CRobotMain::LevelLoadingError(const std::string& error, const std::runtime_error& exception, Phase exitPhase) { + m_ui->ShowLoadingScreen(false); + GetLogger()->Error("%s\n", error.c_str()); GetLogger()->Error("%s\n", exception.what()); ChangePhase(exitPhase); @@ -4947,55 +4841,45 @@ void CRobotMain::IOWriteSceneFinished() //! Resumes the game CObject* CRobotMain::IOReadObject(CLevelParserLine *line, const char* filename, const std::string& objCounterText, float objectProgress, int objRank) { - Math::Vector pos = line->GetParam("pos")->AsPoint()*g_unit; - Math::Vector dir = line->GetParam("angle")->AsPoint()*(Math::PI/180.0f); - Math::Vector zoom = line->GetParam("zoom")->AsPoint(); - - ObjectType type = line->GetParam("type")->AsObjectType(); - int id = line->GetParam("id")->AsInt(); + ObjectCreateParams params = CObject::ReadCreateParams(line); + params.power = -1.0f; + params.id = line->GetParam("id")->AsInt(); std::string details = objCounterText; #if DEV_BUILD // Object categories may spoil the level a bit, so hide them in release builds - details += ": "+CLevelParserParam::FromObjectType(type); + details += ": "+CLevelParserParam::FromObjectType(params.type); #endif m_ui->GetLoadingScreen()->SetProgress(0.25f+objectProgress*0.5f, RT_LOADING_OBJECTS_SAVED, details); - bool trainer = line->GetParam("trainer")->AsBool(false); - bool toy = line->GetParam("toy")->AsBool(false); - int option = line->GetParam("option")->AsInt(0); - int team = line->GetParam("team")->AsInt(0); - - CObject* obj = m_objMan->CreateObject(pos, dir.y, type, 0.0f, 1.0f, 0.0f, trainer, toy, option, team, id); + CObject* obj = m_objMan->CreateObject(params); if (obj->Implements(ObjectInterfaceType::Old)) { COldObject* oldObj = dynamic_cast(obj); - oldObj->SetDefRank(objRank); - oldObj->SetPosition(pos); - oldObj->SetRotation(dir); + oldObj->SetRotation(line->GetParam("angle")->AsPoint() * Math::DEG_TO_RAD); // Who decided to call this argument differently than in main scene files? :/ + // TODO: Also, why doesn't CStaticObject implement SetRotation? - if (zoom.x != 0.0f || zoom.y != 0.0f || zoom.z != 0.0f) - oldObj->SetScale(zoom); + oldObj->SetDefRank(objRank); for (int i = 1; i < OBJECTMAXPART; i++) { if (oldObj->GetObjectRank(i) == -1) continue; - pos = line->GetParam(std::string("p")+boost::lexical_cast(i))->AsPoint(Math::Vector()); + Math::Vector pos = line->GetParam(std::string("p")+boost::lexical_cast(i))->AsPoint(Math::Vector()); if (pos.x != 0.0f || pos.y != 0.0f || pos.z != 0.0f) { oldObj->SetPartPosition(i, pos*g_unit); } - dir = line->GetParam(std::string("a")+boost::lexical_cast(i))->AsPoint(Math::Vector()); + Math::Vector dir = line->GetParam(std::string("a")+boost::lexical_cast(i))->AsPoint(Math::Vector()); if (dir.x != 0.0f || dir.y != 0.0f || dir.z != 0.0f) { oldObj->SetPartRotation(i, dir*(Math::PI/180.0f)); } - zoom = line->GetParam(std::string("z")+boost::lexical_cast(i))->AsPoint(Math::Vector()); + Math::Vector zoom = line->GetParam(std::string("z")+boost::lexical_cast(i))->AsPoint(Math::Vector()); if (zoom.x != 0.0f || zoom.y != 0.0f || zoom.z != 0.0f) { oldObj->SetPartScale(i, zoom); @@ -5003,7 +4887,7 @@ CObject* CRobotMain::IOReadObject(CLevelParserLine *line, const char* filename, } } - if (type == OBJECT_BASE) m_base = obj; + if (obj->GetType() == OBJECT_BASE) m_base = obj; obj->Read(line); diff --git a/src/object/auto/auto.cpp b/src/object/auto/auto.cpp index bda97a62..d0ba6a36 100644 --- a/src/object/auto/auto.cpp +++ b/src/object/auto/auto.cpp @@ -417,11 +417,11 @@ bool CAuto::Write(CLevelParserLine* line) bool CAuto::Read(CLevelParserLine* line) { - m_type = line->GetParam("aType")->AsObjectType(); - m_bBusy = line->GetParam("aBusy")->AsBool(); - m_time = line->GetParam("aTime")->AsFloat(); - m_progressTime = line->GetParam("aProgressTime")->AsFloat(); - m_progressTotal = line->GetParam("aProgressTotal")->AsFloat(); + m_type = line->GetParam("aType")->AsObjectType(m_type); + m_bBusy = line->GetParam("aBusy")->AsBool(m_bBusy); + m_time = line->GetParam("aTime")->AsFloat(m_time); + m_progressTime = line->GetParam("aProgressTime")->AsFloat(m_progressTime); + m_progressTotal = line->GetParam("aProgressTotal")->AsFloat(m_progressTotal); return false; } diff --git a/src/object/object.cpp b/src/object/object.cpp index d1215025..856bab39 100644 --- a/src/object/object.cpp +++ b/src/object/object.cpp @@ -24,6 +24,9 @@ #include "level/robotmain.h" +#include "level/parser/parserline.h" +#include "level/parser/parserparam.h" + #include "graphics/model/model_crash_sphere.h" #include "script/scriptfunc.h" @@ -51,6 +54,22 @@ CObject::~CObject() CScriptFunctions::DestroyObjectVar(m_botVar, true); } +ObjectCreateParams CObject::ReadCreateParams(CLevelParserLine* line) +{ + ObjectCreateParams params; + params.pos = line->GetParam("pos")->AsPoint()*g_unit; + params.angle = line->GetParam("dir")->AsFloat(0.0f)*Math::PI; + params.type = line->GetParam("type")->AsObjectType(); + params.power = line->GetParam("power")->AsFloat(1.0f); + params.height = line->GetParam("h")->AsFloat(0.0f); + params.trainer = line->GetParam("trainer")->AsBool(false); + params.toy = line->GetParam("toy")->AsBool(false); // TODO: Remove + params.option = line->GetParam("option")->AsInt(0); + params.team = line->GetParam("team")->AsInt(0); + //params.id = line->GetParam("id")->AsInt(-1); + return params; +} + void CObject::SetCrashSpheres(const std::vector& crashSpheres) { for (const auto& crashSphere : crashSpheres) diff --git a/src/object/object.h b/src/object/object.h index 8ded4949..60f8ed98 100644 --- a/src/object/object.h +++ b/src/object/object.h @@ -27,6 +27,7 @@ #include "object/crash_sphere.h" #include "object/object_interface_type.h" #include "object/old_object_interface.h" +#include "object/object_create_params.h" #include @@ -82,6 +83,8 @@ public: virtual void Write(CLevelParserLine* line) = 0; //! Reads object properties from line in level file virtual void Read(CLevelParserLine* line) = 0; + //! Reads params required for object creation + static ObjectCreateParams ReadCreateParams(CLevelParserLine* line); //! Updates all interface controls virtual void UpdateInterface() {}; diff --git a/src/object/object_create_params.h b/src/object/object_create_params.h index c00ba7a0..454ba358 100644 --- a/src/object/object_create_params.h +++ b/src/object/object_create_params.h @@ -29,7 +29,6 @@ struct ObjectCreateParams float angle; ObjectType type; float power; - float zoom; float height; bool trainer; bool toy; @@ -43,7 +42,6 @@ struct ObjectCreateParams angle = 0.0f; type = OBJECT_NULL; power = -1.0f; - zoom = 1.0f; height = 0.0f; trainer = false; toy = false; diff --git a/src/object/object_manager.cpp b/src/object/object_manager.cpp index 5e2bf962..36b7c1bf 100644 --- a/src/object/object_manager.cpp +++ b/src/object/object_manager.cpp @@ -139,30 +139,13 @@ CObject* CObjectManager::CreateObject(ObjectCreateParams params) return objectPtr; } -CObject* CObjectManager::CreateObject(Math::Vector pos, - float angle, - ObjectType type, - float power, - float zoom, - float height, - bool trainer, - bool toy, - int option, - int team, - int id) +CObject* CObjectManager::CreateObject(Math::Vector pos, float angle, ObjectType type, float power) { ObjectCreateParams params; params.pos = pos; params.angle = angle; params.type = type; params.power = power; - params.zoom = zoom; - params.height = height; - params.trainer = trainer; - params.toy = toy; - params.option = option; - params.team = team; - params.id = id; return CreateObject(params); } diff --git a/src/object/object_manager.h b/src/object/object_manager.h index b462a2ba..132556be 100644 --- a/src/object/object_manager.h +++ b/src/object/object_manager.h @@ -139,17 +139,7 @@ public: //! Creates an object //@{ CObject* CreateObject(ObjectCreateParams params); - CObject* CreateObject(Math::Vector pos, - float angle, - ObjectType type, - float power = -1.f, - float zoom = 1.f, - float height = 0.f, - bool trainer = false, - bool toy = false, - int option = 0, - int team = 0, - int id = -1); + CObject* CreateObject(Math::Vector pos, float angle, ObjectType type, float power = -1.0f); //@} //! Deletes the object diff --git a/src/object/old_object.cpp b/src/object/old_object.cpp index b61081d7..661cf1f7 100644 --- a/src/object/old_object.cpp +++ b/src/object/old_object.cpp @@ -45,11 +45,14 @@ #include "object/object_manager.h" #include "object/auto/auto.h" +#include "object/auto/autobase.h" #include "object/auto/autojostle.h" #include "object/motion/motion.h" #include "object/motion/motionvehicle.h" +#include "object/subclass/exchange_post.h" + #include "object/task/taskmanager.h" #include "physics/physics.h" @@ -979,7 +982,7 @@ void COldObject::Write(CLevelParserLine* line) if ( GetAnimateOnReset() ) { - line->AddParam("resetCap", MakeUnique(GetAnimateOnReset())); + line->AddParam("reset", MakeUnique(GetAnimateOnReset())); } if ( m_bVirusMode ) @@ -1030,43 +1033,111 @@ void COldObject::Write(CLevelParserLine* line) void COldObject::Read(CLevelParserLine* line) { - Gfx::CameraType cType = line->GetParam("camera")->AsCameraType(Gfx::CAM_TYPE_NULL); - if ( cType != Gfx::CAM_TYPE_NULL ) - { - SetCameraType(cType); - } + Math::Vector zoom = line->GetParam("zoom")->AsPoint(Math::Vector(1.0f, 1.0f, 1.0f)); + if (zoom.x != 1.0f || zoom.y != 1.0f || zoom.z != 1.0f) + SetScale(zoom); + if (line->GetParam("camera")->IsDefined()) + SetCameraType(line->GetParam("camera")->AsCameraType()); SetCameraDist(line->GetParam("cameraDist")->AsFloat(50.0f)); SetCameraLock(line->GetParam("cameraLock")->AsBool(false)); - SetEnergyLevel(line->GetParam("energy")->AsFloat(0.0f)); - SetShield(line->GetParam("shield")->AsFloat(1.0f)); - SetSelectable(line->GetParam("selectable")->AsBool(true)); - SetFixed(line->GetParam("fixed")->AsBool(false)); - SetCollisions(line->GetParam("clip")->AsBool(true)); - SetLock(line->GetParam("lock")->AsBool(false)); + + if (line->GetParam("pyro")->IsDefined()) + m_engine->GetPyroManager()->Create(line->GetParam("pyro")->AsPyroType(), this); + SetProxyActivate(line->GetParam("proxyActivate")->AsBool(false)); SetProxyDistance(line->GetParam("proxyDistance")->AsFloat(15.0f)*g_unit); - SetRange(line->GetParam("range")->AsFloat(30.0f)); - SetMagnifyDamage(line->GetParam("magnifyDamage")->AsFloat(1.0f)); + SetCollisions(line->GetParam("clip")->AsBool(true)); + SetAnimateOnReset(line->GetParam("reset")->AsBool(false)); + if (Implements(ObjectInterfaceType::Controllable)) + { + SetSelectable(line->GetParam("selectable")->AsBool(true)); + } + if (Implements(ObjectInterfaceType::JetFlying)) + { + SetRange(line->GetParam("range")->AsFloat(30.0f)); + } + if (Implements(ObjectInterfaceType::Shielded)) + { + SetShield(line->GetParam("shield")->AsFloat(1.0f)); + SetMagnifyDamage(line->GetParam("magnifyDamage")->AsFloat(1.0f)); + } + if (Implements(ObjectInterfaceType::Programmable)) + { + SetCheckToken(!line->GetParam("checkToken")->IsDefined() ? GetSelectable() : line->GetParam("checkToken")->AsBool(true)); + + if (line->GetParam("cmdline")->IsDefined()) + { + const auto& cmdline = line->GetParam("cmdline")->AsArray(); + for (unsigned int i = 0; i < cmdline.size(); i++) + { + SetCmdLine(i, cmdline[i]->AsFloat()); + } + } + } + + if (m_type == OBJECT_INFO) + { + CExchangePost* exchangePost = dynamic_cast(this); + assert(exchangePost != nullptr); + exchangePost->ReadInfo(line); + } + + // SetManual will affect bot speed + if (m_type == OBJECT_MOBILEdr) + { + // TODO: Merge these two settings? + SetManual(!GetTrainer()); + } + + // AlienWorm time up/down + // TODO: Refactor function names + if (m_type == OBJECT_WORM) + { + assert(Implements(ObjectInterfaceType::Movable)); + CMotion* motion = GetMotion(); + if (line->GetParam("param")->IsDefined()) + { + const auto& p = line->GetParam("param")->AsArray(); + for (unsigned int i = 0; i < 10 && i < p.size(); i++) + { + motion->SetParam(i, p[i]->AsFloat()); + } + } + } + + if (m_auto != nullptr) + { + // TODO: Is it used for anything else than AlienEggs? + m_auto->SetType(line->GetParam("autoType")->AsObjectType(OBJECT_NULL)); + for (int i = 0; i < 5; i++) + { + std::string op = "autoValue" + boost::lexical_cast(i+1); // autoValue1..autoValue5 + m_auto->SetValue(i, line->GetParam(op)->AsFloat(0.0f)); + } + m_auto->SetString(const_cast(line->GetParam("autoString")->AsPath("ai", "").c_str())); + + int i = line->GetParam("run")->AsInt(-1); + if (i != -1) + { + if (i != PARAM_FIXSCENE && !m_main->GetMovies()) i = 0; + m_auto->Start(i); // starts the film + } + } + + + // Everthing below is for use only by saved scenes + if (line->GetParam("energy")->IsDefined()) + SetEnergyLevel(line->GetParam("energy")->AsFloat()); + SetFixed(line->GetParam("fixed")->AsBool(false)); + SetLock(line->GetParam("lock")->AsBool(false)); SetGunGoalV(line->GetParam("aimV")->AsFloat(0.0f)); SetGunGoalH(line->GetParam("aimH")->AsFloat(0.0f)); - SetAnimateOnReset(line->GetParam("resetCap")->AsBool(false)); m_bBurn = line->GetParam("burnMode")->AsBool(false); m_bVirusMode = line->GetParam("virusMode")->AsBool(false); m_virusTime = line->GetParam("virusTime")->AsFloat(0.0f); - // Sets the parameters of the command line. - if (line->GetParam("cmdline")->IsDefined()) - { - int i = 0; - for (auto& p : line->GetParam("cmdline")->AsArray()) - { - SetCmdLine(i, p->AsFloat()); - i++; - } - } - if ( m_motion != nullptr ) { m_motion->Read(line); diff --git a/src/physics/physics.cpp b/src/physics/physics.cpp index a489afdf..b78b233f 100644 --- a/src/physics/physics.cpp +++ b/src/physics/physics.cpp @@ -176,15 +176,15 @@ bool CPhysics::Write(CLevelParserLine* line) bool CPhysics::Read(CLevelParserLine* line) { - m_motorSpeed = line->GetParam("motor")->AsPoint(); + m_motorSpeed = line->GetParam("motor")->AsPoint(Math::Vector(0.0f, 0.0f, 0.0f)); if ( m_object->Implements(ObjectInterfaceType::Flying) ) { if ( m_object->Implements(ObjectInterfaceType::JetFlying) ) { - m_object->SetReactorRange(line->GetParam("reactorRange")->AsFloat()); + m_object->SetReactorRange(line->GetParam("reactorRange")->AsFloat(1.0f)); } - SetLand(line->GetParam("land")->AsBool()); + SetLand(line->GetParam("land")->AsBool(true)); } return true; diff --git a/src/script/scriptfunc.cpp b/src/script/scriptfunc.cpp index ae9772e7..12535d6a 100644 --- a/src/script/scriptfunc.cpp +++ b/src/script/scriptfunc.cpp @@ -1557,7 +1557,7 @@ bool CScriptFunctions::rProduce(CBotVar* var, CBotVar* result, int& exception, v type == OBJECT_WORM ) { object = CObjectManager::GetInstancePointer()->CreateObject(pos, angle, type); - CObjectManager::GetInstancePointer()->CreateObject(pos, angle, OBJECT_EGG, 0.0f); + CObjectManager::GetInstancePointer()->CreateObject(pos, angle, OBJECT_EGG); if (object->Implements(ObjectInterfaceType::Programmable)) { dynamic_cast(object)->SetActivity(false);