Removed the need for progfunc() in object.factory()
Changes to object.factory(): * The second argument will be automatically interpreted as public function name, file name or program code * The program starts earlier (when the robot is ready, not when the doors open) * Refactored to std::stringmaster
parent
2e606f4dcb
commit
d5d8c0b29f
|
@ -43,6 +43,9 @@
|
||||||
#include "ui/window.h"
|
#include "ui/window.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include <regex>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Object's constructor.
|
// Object's constructor.
|
||||||
|
|
||||||
|
@ -104,7 +107,7 @@ void CAutoFactory::Init()
|
||||||
|
|
||||||
m_cargoPos = m_object->GetPosition();
|
m_cargoPos = m_object->GetPosition();
|
||||||
|
|
||||||
m_program = nullptr;
|
m_program = "";
|
||||||
|
|
||||||
CAuto::Init();
|
CAuto::Init();
|
||||||
}
|
}
|
||||||
|
@ -154,10 +157,9 @@ Error CAutoFactory::StartAction(int param)
|
||||||
|
|
||||||
// Sets program for created robot
|
// Sets program for created robot
|
||||||
|
|
||||||
void CAutoFactory::SetProgram(const char* program)
|
void CAutoFactory::SetProgram(const std::string& program)
|
||||||
{
|
{
|
||||||
m_program = new char[strlen(program)+1];
|
m_program = program;
|
||||||
strcpy(m_program, program);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ObjectType ObjectTypeFromFactoryButton(EventType eventType)
|
ObjectType ObjectTypeFromFactoryButton(EventType eventType)
|
||||||
|
@ -393,7 +395,7 @@ bool CAutoFactory::EventProcess(const Event &event)
|
||||||
CObjectManager::GetInstancePointer()->DeleteObject(cargo);
|
CObjectManager::GetInstancePointer()->DeleteObject(cargo);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_vehicle = vehicle = SearchVehicle();
|
vehicle = SearchVehicle();
|
||||||
if ( vehicle != 0 )
|
if ( vehicle != 0 )
|
||||||
{
|
{
|
||||||
physics = vehicle->GetPhysics();
|
physics = vehicle->GetPhysics();
|
||||||
|
@ -406,6 +408,31 @@ bool CAutoFactory::EventProcess(const Event &event)
|
||||||
//? vehicle->GetPhysics()->GetBrain()->StartTaskAdvance(16.0f);
|
//? vehicle->GetPhysics()->GetBrain()->StartTaskAdvance(16.0f);
|
||||||
vehicle->SetRotationY(m_object->GetRotationY()+Math::PI);
|
vehicle->SetRotationY(m_object->GetRotationY()+Math::PI);
|
||||||
vehicle->SetScale(1.0f);
|
vehicle->SetScale(1.0f);
|
||||||
|
|
||||||
|
if ( !m_program.empty() )
|
||||||
|
{
|
||||||
|
if (vehicle->Implements(ObjectInterfaceType::Programmable))
|
||||||
|
{
|
||||||
|
CBrain* brain = dynamic_cast<CProgrammableObject*>(vehicle)->GetBrain();
|
||||||
|
Program* program = brain->AddProgram();
|
||||||
|
|
||||||
|
if (std::regex_search(m_program, std::regex("^[A-Za-z0-9_]+$"))) // Public function name?
|
||||||
|
{
|
||||||
|
std::string code = "extern void object::Start_"+m_program+"()\n{\n\t\n\t//Automatically generated by object.factory()\n\t"+m_program+"();\n\t\n}\n";
|
||||||
|
program->script->SendScript(code.c_str());
|
||||||
|
}
|
||||||
|
else if (std::regex_search(m_program, std::regex(".txt$"))) // File name (with .txt extension)?
|
||||||
|
{
|
||||||
|
program->script->ReadScript(m_program.c_str());
|
||||||
|
}
|
||||||
|
else // Program code?
|
||||||
|
{
|
||||||
|
program->script->SendScript(m_program.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
brain->RunProgram(program);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_main->CreateShortcuts();
|
m_main->CreateShortcuts();
|
||||||
|
@ -492,18 +519,6 @@ bool CAutoFactory::EventProcess(const Event &event)
|
||||||
m_object->SetPartScaleZ(10+i, 0.30f);
|
m_object->SetPartScaleZ(10+i, 0.30f);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( m_program != nullptr )
|
|
||||||
{
|
|
||||||
if (m_vehicle->Implements(ObjectInterfaceType::Programmable))
|
|
||||||
{
|
|
||||||
CBrain* brain = dynamic_cast<CProgrammableObject*>(m_vehicle)->GetBrain();
|
|
||||||
|
|
||||||
Program* program = brain->AddProgram();
|
|
||||||
program->script->SendScript(const_cast<const char*>(m_program));
|
|
||||||
brain->RunProgram(program);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SetBusy(false);
|
SetBusy(false);
|
||||||
UpdateInterface();
|
UpdateInterface();
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,7 @@ public:
|
||||||
bool EventProcess(const Event &event);
|
bool EventProcess(const Event &event);
|
||||||
|
|
||||||
Error StartAction(int param);
|
Error StartAction(int param);
|
||||||
void SetProgram(const char* program);
|
void SetProgram(const std::string& program);
|
||||||
|
|
||||||
bool CreateInterface(bool bSelect);
|
bool CreateInterface(bool bSelect);
|
||||||
|
|
||||||
|
@ -77,7 +77,5 @@ protected:
|
||||||
Math::Vector m_cargoPos;
|
Math::Vector m_cargoPos;
|
||||||
int m_channelSound;
|
int m_channelSound;
|
||||||
|
|
||||||
CObject* m_vehicle;
|
std::string m_program;
|
||||||
char* m_program;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -268,7 +268,6 @@ std::string GetHelpFilename(const char *token)
|
||||||
if ( strcmp(token, "getresearchdone" ) == 0 ) helpfile = "cbot/getresdo";
|
if ( strcmp(token, "getresearchdone" ) == 0 ) helpfile = "cbot/getresdo";
|
||||||
if ( strcmp(token, "retobject" ) == 0 ) helpfile = "cbot/retobj";
|
if ( strcmp(token, "retobject" ) == 0 ) helpfile = "cbot/retobj";
|
||||||
if ( strcmp(token, "errmode" ) == 0 ) helpfile = "cbot/errmode";
|
if ( strcmp(token, "errmode" ) == 0 ) helpfile = "cbot/errmode";
|
||||||
if ( strcmp(token, "progfunc" ) == 0 ) helpfile = "cbot/factory";
|
|
||||||
if ( strcmp(token, "busy" ) == 0 ) helpfile = "cbot/busy";
|
if ( strcmp(token, "busy" ) == 0 ) helpfile = "cbot/busy";
|
||||||
if ( strcmp(token, "takeoff" ) == 0 ) helpfile = "cbot/takeoff";
|
if ( strcmp(token, "takeoff" ) == 0 ) helpfile = "cbot/takeoff";
|
||||||
if ( strcmp(token, "research" ) == 0 ) helpfile = "cbot/research";
|
if ( strcmp(token, "research" ) == 0 ) helpfile = "cbot/research";
|
||||||
|
@ -406,7 +405,6 @@ bool IsFunction(const char *token)
|
||||||
if ( strcmp(token, "getresearchdone" ) == 0 ) return true;
|
if ( strcmp(token, "getresearchdone" ) == 0 ) return true;
|
||||||
if ( strcmp(token, "retobjectbyid") == 0 ) return true;
|
if ( strcmp(token, "retobjectbyid") == 0 ) return true;
|
||||||
if ( strcmp(token, "retobject" ) == 0 ) return true;
|
if ( strcmp(token, "retobject" ) == 0 ) return true;
|
||||||
if ( strcmp(token, "progfunc" ) == 0 ) return true;
|
|
||||||
if ( strcmp(token, "busy" ) == 0 ) return true;
|
if ( strcmp(token, "busy" ) == 0 ) return true;
|
||||||
if ( strcmp(token, "factory" ) == 0 ) return true;
|
if ( strcmp(token, "factory" ) == 0 ) return true;
|
||||||
if ( strcmp(token, "research" ) == 0 ) return true;
|
if ( strcmp(token, "research" ) == 0 ) return true;
|
||||||
|
@ -568,4 +566,3 @@ const char* GetHelpText(const char *token)
|
||||||
if ( strcmp(token, "camerafocus") == 0 ) return "camerafocus ( object );";
|
if ( strcmp(token, "camerafocus") == 0 ) return "camerafocus ( object );";
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -577,30 +577,6 @@ bool CScriptFunctions::rGetObject(CBotVar* var, CBotVar* result, int& exception,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Instruction "progfunc(funcname)".
|
|
||||||
|
|
||||||
bool CScriptFunctions::rProgFunc(CBotVar* var, CBotVar* result, int& exception, void* user)
|
|
||||||
{
|
|
||||||
CBotString cbs;
|
|
||||||
const char* funcname;
|
|
||||||
std::string program;
|
|
||||||
|
|
||||||
cbs = var->GetValString();
|
|
||||||
funcname = cbs;
|
|
||||||
|
|
||||||
//TODO: Translation :)
|
|
||||||
program = "extern void object::Auto()\n{\n\t\n\t//Automatically generated by progfunc(\"";
|
|
||||||
program += funcname;
|
|
||||||
program += "\");\n\t";
|
|
||||||
program += funcname;
|
|
||||||
program += "();\n\t\n}\n";
|
|
||||||
|
|
||||||
result->SetValString(program.c_str());
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compilation of instruction "object.busy()"
|
// Compilation of instruction "object.busy()"
|
||||||
CBotTypResult CScriptFunctions::cBusy(CBotVar* thisclass, CBotVar* &var)
|
CBotTypResult CScriptFunctions::cBusy(CBotVar* thisclass, CBotVar* &var)
|
||||||
{
|
{
|
||||||
|
@ -3676,7 +3652,6 @@ void CScriptFunctions::Init()
|
||||||
CBotProgram::AddFunction("setresearchenable", rSetResearchEnable, CScriptFunctions::cOneFloat);
|
CBotProgram::AddFunction("setresearchenable", rSetResearchEnable, CScriptFunctions::cOneFloat);
|
||||||
CBotProgram::AddFunction("setresearchdone", rSetResearchDone, CScriptFunctions::cOneFloat);
|
CBotProgram::AddFunction("setresearchdone", rSetResearchDone, CScriptFunctions::cOneFloat);
|
||||||
|
|
||||||
CBotProgram::AddFunction("progfunc", rProgFunc, CScriptFunctions::cStringString);
|
|
||||||
CBotProgram::AddFunction("retobject", rGetObject, CScriptFunctions::cGetObject);
|
CBotProgram::AddFunction("retobject", rGetObject, CScriptFunctions::cGetObject);
|
||||||
CBotProgram::AddFunction("retobjectbyid", rGetObjectById, CScriptFunctions::cGetObject);
|
CBotProgram::AddFunction("retobjectbyid", rGetObjectById, CScriptFunctions::cGetObject);
|
||||||
CBotProgram::AddFunction("delete", rDelete, CScriptFunctions::cDelete);
|
CBotProgram::AddFunction("delete", rDelete, CScriptFunctions::cDelete);
|
||||||
|
@ -3850,7 +3825,7 @@ void CScriptFunctions::uObject(CBotVar* botThis, void* user)
|
||||||
|
|
||||||
// Updates the velocity of the object.
|
// Updates the velocity of the object.
|
||||||
pVar = pVar->GetNext(); // "velocity"
|
pVar = pVar->GetNext(); // "velocity"
|
||||||
if (IsObjectBeingTransported(object))
|
if (IsObjectBeingTransported(object) || physics == nullptr)
|
||||||
{
|
{
|
||||||
pSub = pVar->GetItemList(); // "x"
|
pSub = pVar->GetItemList(); // "x"
|
||||||
pSub->SetInit(CBotVar::InitType::IS_NAN);
|
pSub->SetInit(CBotVar::InitType::IS_NAN);
|
||||||
|
|
|
@ -103,7 +103,6 @@ private:
|
||||||
static bool rSetResearchDone(CBotVar* var, CBotVar* result, int& exception, void* user);
|
static bool rSetResearchDone(CBotVar* var, CBotVar* result, int& exception, void* user);
|
||||||
static bool rGetObjectById(CBotVar* var, CBotVar* result, int& exception, void* user);
|
static bool rGetObjectById(CBotVar* var, CBotVar* result, int& exception, void* user);
|
||||||
static bool rGetObject(CBotVar* var, CBotVar* result, int& exception, void* user);
|
static bool rGetObject(CBotVar* var, CBotVar* result, int& exception, void* user);
|
||||||
static bool rProgFunc(CBotVar* var, CBotVar* result, int& exception, void* user);
|
|
||||||
static bool rDelete(CBotVar* var, CBotVar* result, int& exception, void* user);
|
static bool rDelete(CBotVar* var, CBotVar* result, int& exception, void* user);
|
||||||
static bool rSearch(CBotVar* var, CBotVar* result, int& exception, void* user);
|
static bool rSearch(CBotVar* var, CBotVar* result, int& exception, void* user);
|
||||||
static bool rRadar(CBotVar* var, CBotVar* result, int& exception, void* user);
|
static bool rRadar(CBotVar* var, CBotVar* result, int& exception, void* user);
|
||||||
|
|
Loading…
Reference in New Issue