CProgrammableObject interface
parent
17ae31e639
commit
5d30de0d09
|
@ -26,6 +26,7 @@
|
||||||
|
|
||||||
#include "object/brain.h"
|
#include "object/brain.h"
|
||||||
#include "object/object_manager.h"
|
#include "object/object_manager.h"
|
||||||
|
#include "object/interface/programmable_object.h"
|
||||||
#include "object/interface/transportable_object.h"
|
#include "object/interface/transportable_object.h"
|
||||||
#include "object/level/parserline.h"
|
#include "object/level/parserline.h"
|
||||||
#include "object/level/parserparam.h"
|
#include "object/level/parserparam.h"
|
||||||
|
@ -182,9 +183,11 @@ bool CAutoEgg::EventProcess(const Event &event)
|
||||||
CObject* alien = CObjectManager::GetInstancePointer()->CreateObject(pos, angle, m_type);
|
CObject* alien = CObjectManager::GetInstancePointer()->CreateObject(pos, angle, m_type);
|
||||||
|
|
||||||
alien->SetActivity(false);
|
alien->SetActivity(false);
|
||||||
CBrain* brain = alien->GetBrain();
|
|
||||||
if(brain != nullptr)
|
if (alien->Implements(ObjectInterfaceType::Programmable))
|
||||||
{
|
{
|
||||||
|
CBrain* brain = dynamic_cast<CProgrammableObject*>(alien)->GetBrain();
|
||||||
|
|
||||||
Program* program = brain->AddProgram();
|
Program* program = brain->AddProgram();
|
||||||
brain->ReadProgram(program, m_string);
|
brain->ReadProgram(program, m_string);
|
||||||
brain->RunProgram(program);
|
brain->RunProgram(program);
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "object/robotmain.h"
|
#include "object/robotmain.h"
|
||||||
#include "object/level/parserline.h"
|
#include "object/level/parserline.h"
|
||||||
#include "object/level/parserparam.h"
|
#include "object/level/parserparam.h"
|
||||||
|
#include "object/interface/programmable_object.h"
|
||||||
#include "object/interface/transportable_object.h"
|
#include "object/interface/transportable_object.h"
|
||||||
|
|
||||||
#include "physics/physics.h"
|
#include "physics/physics.h"
|
||||||
|
@ -488,9 +489,10 @@ bool CAutoFactory::EventProcess(const Event &event)
|
||||||
|
|
||||||
if ( m_program != nullptr )
|
if ( m_program != nullptr )
|
||||||
{
|
{
|
||||||
CBrain* brain = m_vehicle->GetBrain();
|
if (m_vehicle->Implements(ObjectInterfaceType::Programmable))
|
||||||
if ( brain != nullptr )
|
|
||||||
{
|
{
|
||||||
|
CBrain* brain = dynamic_cast<CProgrammableObject*>(m_vehicle)->GetBrain();
|
||||||
|
|
||||||
Program* program = brain->AddProgram();
|
Program* program = brain->AddProgram();
|
||||||
program->script->SendScript(const_cast<const char*>(m_program));
|
program->script->SendScript(const_cast<const char*>(m_program));
|
||||||
brain->RunProgram(program);
|
brain->RunProgram(program);
|
||||||
|
@ -649,9 +651,9 @@ bool CAutoFactory::CreateVehicle()
|
||||||
physics->SetFreeze(true); // it doesn't move
|
physics->SetFreeze(true); // it doesn't move
|
||||||
}
|
}
|
||||||
|
|
||||||
CBrain* brain = vehicle->GetBrain();
|
if (vehicle->Implements(ObjectInterfaceType::Programmable))
|
||||||
if(brain != nullptr)
|
|
||||||
{
|
{
|
||||||
|
CBrain* brain = dynamic_cast<CProgrammableObject*>(vehicle)->GetBrain();
|
||||||
for ( int i=0 ; ; i++ )
|
for ( int i=0 ; ; i++ )
|
||||||
{
|
{
|
||||||
char* name = m_main->GetNewScriptName(m_type, i);
|
char* name = m_main->GetNewScriptName(m_type, i);
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the Colobot: Gold Edition source code
|
||||||
|
* Copyright (C) 2001-2014, Daniel Roux, EPSITEC SA & TerranovaTeam
|
||||||
|
* http://epsiteс.ch; http://colobot.info; http://github.com/colobot
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
* See the GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see http://gnu.org/licenses
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "object/object_interface_type.h"
|
||||||
|
|
||||||
|
class CBrain;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \class CProgrammableObject
|
||||||
|
* \brief Interface for programmable objects
|
||||||
|
*
|
||||||
|
* Programmable objects can be programmed in CBOT
|
||||||
|
*/
|
||||||
|
class CProgrammableObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit CProgrammableObject(ObjectInterfaceTypes& types)
|
||||||
|
{
|
||||||
|
types[static_cast<int>(ObjectInterfaceType::Programmable)] = true;
|
||||||
|
}
|
||||||
|
virtual ~CProgrammableObject()
|
||||||
|
{}
|
||||||
|
|
||||||
|
//! Returns CBrain
|
||||||
|
/** If only the object implements ObjectInterfaceType::Programmable,
|
||||||
|
* returned object will always be non-null*/
|
||||||
|
virtual CBrain* GetBrain() = 0;
|
||||||
|
|
||||||
|
// TODO: CBrain interface can actually be moved here
|
||||||
|
};
|
|
@ -34,6 +34,7 @@ enum class ObjectInterfaceType
|
||||||
{
|
{
|
||||||
Interactive, //!< interactive objects can process events from event loop
|
Interactive, //!< interactive objects can process events from event loop
|
||||||
Transportable, //!< objects that can be carried by robots or astronaut
|
Transportable, //!< objects that can be carried by robots or astronaut
|
||||||
|
Programmable, //!< objects that can be programmed in CBOT
|
||||||
Max //!< maximum value (for getting number of items in enum)
|
Max //!< maximum value (for getting number of items in enum)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -189,7 +189,11 @@ COldObject::COldObject(int id)
|
||||||
: CObject(id, OBJECT_NULL)
|
: CObject(id, OBJECT_NULL)
|
||||||
, CInteractiveObject(m_implementedInterfaces)
|
, CInteractiveObject(m_implementedInterfaces)
|
||||||
, CTransportableObject(m_implementedInterfaces)
|
, CTransportableObject(m_implementedInterfaces)
|
||||||
|
, CProgrammableObject(m_implementedInterfaces)
|
||||||
{
|
{
|
||||||
|
// A bit of a hack since CBrain is set externally in SetBrain()
|
||||||
|
m_implementedInterfaces[static_cast<int>(ObjectInterfaceType::Programmable)] = false;
|
||||||
|
|
||||||
m_sound = CApplication::GetInstancePointer()->GetSound();
|
m_sound = CApplication::GetInstancePointer()->GetSound();
|
||||||
m_engine = Gfx::CEngine::GetInstancePointer();
|
m_engine = Gfx::CEngine::GetInstancePointer();
|
||||||
m_lightMan = m_engine->GetLightManager();
|
m_lightMan = m_engine->GetLightManager();
|
||||||
|
@ -450,6 +454,8 @@ void COldObject::DeleteObject(bool bAll)
|
||||||
|
|
||||||
void COldObject::Simplify()
|
void COldObject::Simplify()
|
||||||
{
|
{
|
||||||
|
m_implementedInterfaces[static_cast<int>(ObjectInterfaceType::Programmable)] = false;
|
||||||
|
|
||||||
if ( m_brain != nullptr )
|
if ( m_brain != nullptr )
|
||||||
{
|
{
|
||||||
m_brain->StopProgram();
|
m_brain->StopProgram();
|
||||||
|
@ -3410,6 +3416,7 @@ CBrain* COldObject::GetBrain()
|
||||||
|
|
||||||
void COldObject::SetBrain(std::unique_ptr<CBrain> brain)
|
void COldObject::SetBrain(std::unique_ptr<CBrain> brain)
|
||||||
{
|
{
|
||||||
|
m_implementedInterfaces[static_cast<int>(ObjectInterfaceType::Programmable)] = true;
|
||||||
m_brain = std::move(brain);
|
m_brain = std::move(brain);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include "object/object.h"
|
#include "object/object.h"
|
||||||
|
|
||||||
#include "object/interface/interactive_object.h"
|
#include "object/interface/interactive_object.h"
|
||||||
|
#include "object/interface/programmable_object.h"
|
||||||
#include "object/interface/transportable_object.h"
|
#include "object/interface/transportable_object.h"
|
||||||
|
|
||||||
// The father of all parts must always be the part number zero!
|
// The father of all parts must always be the part number zero!
|
||||||
|
@ -54,7 +55,8 @@ struct ObjectPart
|
||||||
|
|
||||||
class COldObject : public CObject,
|
class COldObject : public CObject,
|
||||||
public CInteractiveObject,
|
public CInteractiveObject,
|
||||||
public CTransportableObject
|
public CTransportableObject,
|
||||||
|
public CProgrammableObject
|
||||||
{
|
{
|
||||||
friend class CObjectFactory;
|
friend class CObjectFactory;
|
||||||
friend class CObjectManager;
|
friend class CObjectManager;
|
||||||
|
|
|
@ -273,7 +273,6 @@ public:
|
||||||
virtual CScript* GetRunScript() = 0;
|
virtual CScript* GetRunScript() = 0;
|
||||||
virtual CBotVar* GetBotVar() = 0;
|
virtual CBotVar* GetBotVar() = 0;
|
||||||
virtual CPhysics* GetPhysics() = 0;
|
virtual CPhysics* GetPhysics() = 0;
|
||||||
virtual CBrain* GetBrain() = 0;
|
|
||||||
virtual CMotion* GetMotion() = 0;
|
virtual CMotion* GetMotion() = 0;
|
||||||
virtual CAuto* GetAuto() = 0;
|
virtual CAuto* GetAuto() = 0;
|
||||||
|
|
||||||
|
|
|
@ -3467,13 +3467,16 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
|
||||||
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, 100.0f);
|
||||||
m_controller->SetMagnifyDamage(100.0f);
|
m_controller->SetMagnifyDamage(100.0f);
|
||||||
m_controller->SetIgnoreBuildCheck(true);
|
m_controller->SetIgnoreBuildCheck(true);
|
||||||
CBrain* brain = m_controller->GetBrain();
|
if (m_controller->Implements(ObjectInterfaceType::Programmable))
|
||||||
if (brain != nullptr && line->GetParam("script")->IsDefined())
|
|
||||||
{
|
{
|
||||||
Program* program = brain->AddProgram();
|
CBrain* brain = dynamic_cast<CProgrammableObject*>(m_controller)->GetBrain();
|
||||||
program->filename = "../" + line->GetParam("script")->AsPath("ai");
|
if (line->GetParam("script")->IsDefined())
|
||||||
program->readOnly = true;
|
{
|
||||||
brain->SetScriptRun(program);
|
Program* program = brain->AddProgram();
|
||||||
|
program->filename = "../" + line->GetParam("script")->AsPath("ai");
|
||||||
|
program->readOnly = true;
|
||||||
|
brain->SetScriptRun(program);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -3600,9 +3603,10 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
|
||||||
|
|
||||||
int run = -1;
|
int run = -1;
|
||||||
std::map<int, Program*> loadedPrograms;
|
std::map<int, Program*> loadedPrograms;
|
||||||
CBrain* brain = obj->GetBrain();
|
if (obj->Implements(ObjectInterfaceType::Programmable))
|
||||||
if (brain != nullptr)
|
|
||||||
{
|
{
|
||||||
|
CBrain* brain = dynamic_cast<CProgrammableObject*>(obj)->GetBrain();
|
||||||
|
|
||||||
bool allFilled = true;
|
bool allFilled = true;
|
||||||
for (int i = 0; i < 10 || allFilled; i++)
|
for (int i = 0; i < 10 || allFilled; i++)
|
||||||
{
|
{
|
||||||
|
@ -3651,8 +3655,9 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (soluce && brain != nullptr && line->GetParam("soluce")->IsDefined())
|
if (soluce && obj->Implements(ObjectInterfaceType::Programmable) && line->GetParam("soluce")->IsDefined())
|
||||||
brain->SetSoluceName(const_cast<char*>(line->GetParam("soluce")->AsPath("ai").c_str()));
|
dynamic_cast<CProgrammableObject*>(obj)->GetBrain()
|
||||||
|
->SetSoluceName(const_cast<char*>(line->GetParam("soluce")->AsPath("ai").c_str()));
|
||||||
|
|
||||||
obj->SetResetPosition(obj->GetPosition(0));
|
obj->SetResetPosition(obj->GetPosition(0));
|
||||||
obj->SetResetAngle(obj->GetAngle(0));
|
obj->SetResetAngle(obj->GetAngle(0));
|
||||||
|
@ -4522,11 +4527,9 @@ void CRobotMain::CompileScript(bool soluce)
|
||||||
nbError = 0;
|
nbError = 0;
|
||||||
for (CObject* obj : m_objMan->GetAllObjects())
|
for (CObject* obj : m_objMan->GetAllObjects())
|
||||||
{
|
{
|
||||||
if (IsObjectBeingTransported(obj)) continue;
|
if (! obj->Implements(ObjectInterfaceType::Programmable)) continue;
|
||||||
|
|
||||||
CBrain* brain = obj->GetBrain();
|
|
||||||
if (brain == nullptr) continue;
|
|
||||||
|
|
||||||
|
CBrain* brain = dynamic_cast<CProgrammableObject*>(obj)->GetBrain();
|
||||||
for (Program* program : brain->GetPrograms())
|
for (Program* program : brain->GetPrograms())
|
||||||
{
|
{
|
||||||
//? if (brain->GetCompile(j)) continue;
|
//? if (brain->GetCompile(j)) continue;
|
||||||
|
@ -4550,11 +4553,9 @@ void CRobotMain::CompileScript(bool soluce)
|
||||||
{
|
{
|
||||||
for (CObject* obj : m_objMan->GetAllObjects())
|
for (CObject* obj : m_objMan->GetAllObjects())
|
||||||
{
|
{
|
||||||
if (IsObjectBeingTransported(obj)) continue;
|
if (! obj->Implements(ObjectInterfaceType::Programmable)) continue;
|
||||||
|
|
||||||
CBrain* brain = obj->GetBrain();
|
|
||||||
if (brain == 0) continue;
|
|
||||||
|
|
||||||
|
CBrain* brain = dynamic_cast<CProgrammableObject*>(obj)->GetBrain();
|
||||||
char* name = brain->GetSoluceName();
|
char* name = brain->GetSoluceName();
|
||||||
if (name[0] != 0)
|
if (name[0] != 0)
|
||||||
{
|
{
|
||||||
|
@ -4566,11 +4567,9 @@ void CRobotMain::CompileScript(bool soluce)
|
||||||
// Start all programs according to the command "run".
|
// Start all programs according to the command "run".
|
||||||
for (CObject* obj : m_objMan->GetAllObjects())
|
for (CObject* obj : m_objMan->GetAllObjects())
|
||||||
{
|
{
|
||||||
if (IsObjectBeingTransported(obj)) continue;
|
if (! obj->Implements(ObjectInterfaceType::Programmable)) continue;
|
||||||
|
|
||||||
CBrain* brain = obj->GetBrain();
|
|
||||||
if (brain == nullptr) continue;
|
|
||||||
|
|
||||||
|
CBrain* brain = dynamic_cast<CProgrammableObject*>(obj)->GetBrain();
|
||||||
Program* program = brain->GetScriptRun();
|
Program* program = brain->GetScriptRun();
|
||||||
if (program != nullptr)
|
if (program != nullptr)
|
||||||
{
|
{
|
||||||
|
@ -4582,8 +4581,9 @@ void CRobotMain::CompileScript(bool soluce)
|
||||||
//! Load all programs of the robot
|
//! Load all programs of the robot
|
||||||
void CRobotMain::LoadOneScript(CObject *obj, int &nbError)
|
void CRobotMain::LoadOneScript(CObject *obj, int &nbError)
|
||||||
{
|
{
|
||||||
CBrain* brain = obj->GetBrain();
|
if (! obj->Implements(ObjectInterfaceType::Programmable)) return;
|
||||||
if (brain == nullptr) return;
|
|
||||||
|
CBrain* brain = dynamic_cast<CProgrammableObject*>(obj)->GetBrain();
|
||||||
|
|
||||||
if (!IsSelectable(obj)) return;
|
if (!IsSelectable(obj)) return;
|
||||||
|
|
||||||
|
@ -4619,8 +4619,9 @@ void CRobotMain::LoadFileScript(CObject *obj, const char* filename, int objRank,
|
||||||
{
|
{
|
||||||
if (objRank == -1) return;
|
if (objRank == -1) return;
|
||||||
|
|
||||||
CBrain* brain = obj->GetBrain();
|
if (! obj->Implements(ObjectInterfaceType::Programmable)) return;
|
||||||
if (brain == nullptr) return;
|
|
||||||
|
CBrain* brain = dynamic_cast<CProgrammableObject*>(obj)->GetBrain();
|
||||||
|
|
||||||
ObjectType type = obj->GetType();
|
ObjectType type = obj->GetType();
|
||||||
if (type == OBJECT_HUMAN) return;
|
if (type == OBJECT_HUMAN) return;
|
||||||
|
@ -4654,8 +4655,9 @@ void CRobotMain::SaveAllScript()
|
||||||
//! If a program does not exist, the corresponding file is destroyed.
|
//! If a program does not exist, the corresponding file is destroyed.
|
||||||
void CRobotMain::SaveOneScript(CObject *obj)
|
void CRobotMain::SaveOneScript(CObject *obj)
|
||||||
{
|
{
|
||||||
CBrain* brain = obj->GetBrain();
|
if (! obj->Implements(ObjectInterfaceType::Programmable)) return;
|
||||||
if (brain == nullptr) return;
|
|
||||||
|
CBrain* brain = dynamic_cast<CProgrammableObject*>(obj)->GetBrain();
|
||||||
|
|
||||||
if (!IsSelectable(obj)) return;
|
if (!IsSelectable(obj)) return;
|
||||||
|
|
||||||
|
@ -4692,8 +4694,9 @@ void CRobotMain::SaveFileScript(CObject *obj, const char* filename, int objRank)
|
||||||
{
|
{
|
||||||
if (objRank == -1) return;
|
if (objRank == -1) return;
|
||||||
|
|
||||||
CBrain* brain = obj->GetBrain();
|
if (! obj->Implements(ObjectInterfaceType::Programmable)) return;
|
||||||
if (brain == nullptr) return;
|
|
||||||
|
CBrain* brain = dynamic_cast<CProgrammableObject*>(obj)->GetBrain();
|
||||||
|
|
||||||
ObjectType type = obj->GetType();
|
ObjectType type = obj->GetType();
|
||||||
if (type == OBJECT_HUMAN) return;
|
if (type == OBJECT_HUMAN) return;
|
||||||
|
@ -4723,8 +4726,9 @@ bool CRobotMain::SaveFileStack(CObject *obj, FILE *file, int objRank)
|
||||||
{
|
{
|
||||||
if (objRank == -1) return true;
|
if (objRank == -1) return true;
|
||||||
|
|
||||||
CBrain* brain = obj->GetBrain();
|
if (! obj->Implements(ObjectInterfaceType::Programmable)) return true;
|
||||||
if (brain == nullptr) return true;
|
|
||||||
|
CBrain* brain = dynamic_cast<CProgrammableObject*>(obj)->GetBrain();
|
||||||
|
|
||||||
ObjectType type = obj->GetType();
|
ObjectType type = obj->GetType();
|
||||||
if (type == OBJECT_HUMAN) return true;
|
if (type == OBJECT_HUMAN) return true;
|
||||||
|
@ -4737,8 +4741,9 @@ bool CRobotMain::ReadFileStack(CObject *obj, FILE *file, int objRank)
|
||||||
{
|
{
|
||||||
if (objRank == -1) return true;
|
if (objRank == -1) return true;
|
||||||
|
|
||||||
CBrain* brain = obj->GetBrain();
|
if (! obj->Implements(ObjectInterfaceType::Programmable)) return true;
|
||||||
if (brain == nullptr) return true;
|
|
||||||
|
CBrain* brain = dynamic_cast<CProgrammableObject*>(obj)->GetBrain();
|
||||||
|
|
||||||
ObjectType type = obj->GetType();
|
ObjectType type = obj->GetType();
|
||||||
if (type == OBJECT_HUMAN) return true;
|
if (type == OBJECT_HUMAN) return true;
|
||||||
|
@ -4797,11 +4802,10 @@ bool CRobotMain::IsBusy()
|
||||||
|
|
||||||
for (CObject* obj : m_objMan->GetAllObjects())
|
for (CObject* obj : m_objMan->GetAllObjects())
|
||||||
{
|
{
|
||||||
CBrain* brain = obj->GetBrain();
|
if (! obj->Implements(ObjectInterfaceType::Programmable)) continue;
|
||||||
if (brain != nullptr)
|
|
||||||
{
|
CBrain* brain = dynamic_cast<CProgrammableObject*>(obj)->GetBrain();
|
||||||
if (brain->IsBusy()) return true;
|
if (brain->IsBusy()) return true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -4854,9 +4858,10 @@ void CRobotMain::IOWriteObject(CLevelParserLine* line, CObject* obj)
|
||||||
if (obj->GetType() == OBJECT_BASE)
|
if (obj->GetType() == OBJECT_BASE)
|
||||||
line->AddParam("run", CLevelParserParamUPtr{new CLevelParserParam(3)}); // stops and open (PARAM_FIXSCENE)
|
line->AddParam("run", CLevelParserParamUPtr{new CLevelParserParam(3)}); // stops and open (PARAM_FIXSCENE)
|
||||||
|
|
||||||
CBrain* brain = obj->GetBrain();
|
if (obj->Implements(ObjectInterfaceType::Programmable))
|
||||||
if (brain != nullptr)
|
|
||||||
{
|
{
|
||||||
|
CBrain* brain = dynamic_cast<CProgrammableObject*>(obj)->GetBrain();
|
||||||
|
|
||||||
int run = brain->GetProgram();
|
int run = brain->GetProgram();
|
||||||
if (run != -1)
|
if (run != -1)
|
||||||
{
|
{
|
||||||
|
@ -5056,9 +5061,10 @@ CObject* CRobotMain::IOReadObject(CLevelParserLine *line, const char* filename,
|
||||||
automat->Start(run); // starts the film
|
automat->Start(run); // starts the film
|
||||||
}
|
}
|
||||||
|
|
||||||
CBrain* brain = obj->GetBrain();
|
if (obj->Implements(ObjectInterfaceType::Programmable))
|
||||||
if (brain != nullptr)
|
|
||||||
{
|
{
|
||||||
|
CBrain* brain = dynamic_cast<CProgrammableObject*>(obj)->GetBrain();
|
||||||
|
|
||||||
if (run != -1)
|
if (run != -1)
|
||||||
{
|
{
|
||||||
Program* program = brain->GetOrAddProgram(run-1);
|
Program* program = brain->GetOrAddProgram(run-1);
|
||||||
|
@ -5160,11 +5166,10 @@ CObject* CRobotMain::IOReadScene(const char *filename, const char *filecbot)
|
||||||
// Starts scripts
|
// Starts scripts
|
||||||
for (CObject* obj : m_objMan->GetAllObjects())
|
for (CObject* obj : m_objMan->GetAllObjects())
|
||||||
{
|
{
|
||||||
if (IsObjectBeingTransported(obj)) continue;
|
if (! obj->Implements(ObjectInterfaceType::Programmable)) continue;
|
||||||
if (obj->GetDefRank() == -1) continue;
|
if (obj->GetDefRank() == -1) continue;
|
||||||
|
|
||||||
CBrain* brain = obj->GetBrain();
|
CBrain* brain = dynamic_cast<CProgrammableObject*>(obj)->GetBrain();
|
||||||
if (brain == nullptr) continue;
|
|
||||||
|
|
||||||
Program* program = brain->GetScriptRun();
|
Program* program = brain->GetScriptRun();
|
||||||
if (program != nullptr)
|
if (program != nullptr)
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
#include "object/object.h"
|
#include "object/object.h"
|
||||||
#include "object/robotmain.h"
|
#include "object/robotmain.h"
|
||||||
|
#include "object/interface/programmable_object.h"
|
||||||
|
|
||||||
|
|
||||||
// Object's constructor.
|
// Object's constructor.
|
||||||
|
@ -41,7 +42,11 @@ CTask::CTask(CObject* object)
|
||||||
|
|
||||||
m_object = object;
|
m_object = object;
|
||||||
m_physics = m_object->GetPhysics();
|
m_physics = m_object->GetPhysics();
|
||||||
m_brain = m_object->GetBrain();
|
m_brain = nullptr;
|
||||||
|
if (object->Implements(ObjectInterfaceType::Programmable))
|
||||||
|
{
|
||||||
|
m_brain = dynamic_cast<CProgrammableObject*>(m_object)->GetBrain();
|
||||||
|
}
|
||||||
m_motion = m_object->GetMotion();
|
m_motion = m_object->GetMotion();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include "object/robotmain.h"
|
#include "object/robotmain.h"
|
||||||
#include "object/motion/motionant.h"
|
#include "object/motion/motionant.h"
|
||||||
#include "object/motion/motionspider.h"
|
#include "object/motion/motionspider.h"
|
||||||
|
#include "object/interface/programmable_object.h"
|
||||||
|
|
||||||
#include "physics/physics.h"
|
#include "physics/physics.h"
|
||||||
|
|
||||||
|
@ -339,7 +340,6 @@ bool CTaskTerraform::Abort()
|
||||||
|
|
||||||
bool CTaskTerraform::Terraform()
|
bool CTaskTerraform::Terraform()
|
||||||
{
|
{
|
||||||
CBrain* brain;
|
|
||||||
CMotion* motion;
|
CMotion* motion;
|
||||||
ObjectType type;
|
ObjectType type;
|
||||||
float dist;
|
float dist;
|
||||||
|
@ -357,7 +357,7 @@ bool CTaskTerraform::Terraform()
|
||||||
{
|
{
|
||||||
// This was used by Ceebot-Teen to destroy objects hit by the Thumper
|
// This was used by Ceebot-Teen to destroy objects hit by the Thumper
|
||||||
// The old Teen objects are removed, but this code might be reused at some point, e.g. to add destruction of resources like empty batteries
|
// The old Teen objects are removed, but this code might be reused at some point, e.g. to add destruction of resources like empty batteries
|
||||||
|
|
||||||
dist = Math::Distance(m_terraPos, pObj->GetPosition(0));
|
dist = Math::Distance(m_terraPos, pObj->GetPosition(0));
|
||||||
if ( dist > 20.0f ) continue;
|
if ( dist > 20.0f ) continue;
|
||||||
|
|
||||||
|
@ -373,15 +373,17 @@ bool CTaskTerraform::Terraform()
|
||||||
|
|
||||||
if ( type == OBJECT_ANT )
|
if ( type == OBJECT_ANT )
|
||||||
{
|
{
|
||||||
brain = pObj->GetBrain();
|
if (pObj->Implements(ObjectInterfaceType::Programmable))
|
||||||
if ( brain != 0 ) brain->StopTask();
|
dynamic_cast<CProgrammableObject*>(pObj)->GetBrain()->StopTask();
|
||||||
|
|
||||||
motion->SetAction(MAS_BACK1, 0.8f+Math::Rand()*0.3f);
|
motion->SetAction(MAS_BACK1, 0.8f+Math::Rand()*0.3f);
|
||||||
pObj->SetFixed(true); // not moving
|
pObj->SetFixed(true); // not moving
|
||||||
}
|
}
|
||||||
if ( type == OBJECT_SPIDER )
|
if ( type == OBJECT_SPIDER )
|
||||||
{
|
{
|
||||||
brain = pObj->GetBrain();
|
if (pObj->Implements(ObjectInterfaceType::Programmable))
|
||||||
if ( brain != 0 ) brain->StopTask();
|
dynamic_cast<CProgrammableObject*>(pObj)->GetBrain()->StopTask();
|
||||||
|
|
||||||
motion->SetAction(MSS_BACK1, 0.8f+Math::Rand()*0.3f);
|
motion->SetAction(MSS_BACK1, 0.8f+Math::Rand()*0.3f);
|
||||||
pObj->SetFixed(true); // not moving
|
pObj->SetFixed(true); // not moving
|
||||||
}
|
}
|
||||||
|
|
|
@ -1765,9 +1765,9 @@ bool CScriptFunctions::rProduce(CBotVar* var, CBotVar* result, int& exception, v
|
||||||
if (name[0] != 0)
|
if (name[0] != 0)
|
||||||
{
|
{
|
||||||
std::string name2 = CPathManager::InjectLevelDir(name, "ai");
|
std::string name2 = CPathManager::InjectLevelDir(name, "ai");
|
||||||
CBrain* brain = object->GetBrain();
|
if (object->Implements(ObjectInterfaceType::Programmable))
|
||||||
if (brain != nullptr)
|
|
||||||
{
|
{
|
||||||
|
CBrain* brain = dynamic_cast<CProgrammableObject*>(object)->GetBrain();
|
||||||
Program* program = brain->AddProgram();
|
Program* program = brain->AddProgram();
|
||||||
brain->ReadProgram(program, name2.c_str());
|
brain->ReadProgram(program, name2.c_str());
|
||||||
brain->RunProgram(program);
|
brain->RunProgram(program);
|
||||||
|
|
Loading…
Reference in New Issue