Reverted factory() to its original design; reworked syntax of other object.functions() accordingly; improved compatibility with CeeBot4 SCHOOL

1164-fix
Fiftytwo 2017-11-17 11:32:50 +01:00
parent adda82819c
commit 9a33551a03
3 changed files with 49 additions and 33 deletions

View File

@ -99,6 +99,10 @@ const char* GetObjectName(ObjectType type)
if ( type == OBJECT_MOBILEts ) return "TrackedSniffer"; if ( type == OBJECT_MOBILEts ) return "TrackedSniffer";
if ( type == OBJECT_MOBILEfs ) return "WingedSniffer"; if ( type == OBJECT_MOBILEfs ) return "WingedSniffer";
if ( type == OBJECT_MOBILEis ) return "LeggedSniffer"; if ( type == OBJECT_MOBILEis ) return "LeggedSniffer";
if ( type == OBJECT_MOBILEwb ) return "WheeledBuilder";
if ( type == OBJECT_MOBILEtb ) return "TrackedBuilder";
if ( type == OBJECT_MOBILEfb ) return "WingedBuilder";
if ( type == OBJECT_MOBILEib ) return "LeggedBuilder";
if ( type == OBJECT_MOBILErt ) return "Thumper"; if ( type == OBJECT_MOBILErt ) return "Thumper";
if ( type == OBJECT_MOBILErc ) return "PhazerShooter"; if ( type == OBJECT_MOBILErc ) return "PhazerShooter";
if ( type == OBJECT_MOBILErr ) return "Recycler"; if ( type == OBJECT_MOBILErr ) return "Recycler";
@ -519,11 +523,11 @@ const char* GetHelpText(const char *token)
if ( strcmp(token, "retobject" ) == 0 ) return "retobject ( rank );"; if ( strcmp(token, "retobject" ) == 0 ) return "retobject ( rank );";
if ( strcmp(token, "retobjectbyid") == 0 ) return "retobjectbyid ( rank );"; if ( strcmp(token, "retobjectbyid") == 0 ) return "retobjectbyid ( rank );";
if ( strcmp(token, "progfunc" ) == 0 ) return "progfunc ( funcname );"; if ( strcmp(token, "progfunc" ) == 0 ) return "progfunc ( funcname );";
if ( strcmp(token, "busy" ) == 0 ) return "object.busy ( );"; if ( strcmp(token, "busy" ) == 0 ) return "busy ( );";
if ( strcmp(token, "factory" ) == 0 ) return "object.factory ( cat, program );"; if ( strcmp(token, "factory" ) == 0 ) return "factory ( cat, program, object );";
if ( strcmp(token, "research" ) == 0 ) return "object.research ( type );"; if ( strcmp(token, "research" ) == 0 ) return "research ( type );";
if ( strcmp(token, "takeoff" ) == 0 ) return "object.takeoff ( );"; if ( strcmp(token, "takeoff" ) == 0 ) return "takeoff ( );";
if ( strcmp(token, "destroy" ) == 0 ) return "object.destroy ( );"; if ( strcmp(token, "destroy" ) == 0 ) return "destroy ( );";
if ( strcmp(token, "search" ) == 0 ) return "search ( cat, pos, min, max, sens, filter );"; if ( strcmp(token, "search" ) == 0 ) return "search ( cat, pos, min, max, sens, filter );";
if ( strcmp(token, "searchall" ) == 0 ) return "searchall ( cat, pos, min, max, sens, filter );"; if ( strcmp(token, "searchall" ) == 0 ) return "searchall ( cat, pos, min, max, sens, filter );";
if ( strcmp(token, "radar" ) == 0 ) return "radar ( cat, angle, focus, min, max, sens, filter );"; if ( strcmp(token, "radar" ) == 0 ) return "radar ( cat, angle, focus, min, max, sens, filter );";

View File

@ -428,25 +428,30 @@ bool CScriptFunctions::rDestroy(CBotVar* thisclass, CBotVar* var, CBotVar* resul
} }
// Compilation of instruction "object.factory(cat, program)" // Compilation of instruction "factory(cat, program [, object])"
CBotTypResult CScriptFunctions::cFactory(CBotVar* thisclass, CBotVar* &var) CBotTypResult CScriptFunctions::cFactory(CBotVar* &var, void* user)
{ {
if ( var == nullptr ) return CBotTypResult(CBotErrLowParam); if ( var == nullptr ) return CBotTypResult(CBotErrLowParam);
if ( var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum); if ( var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
var = var->GetNext(); var = var->GetNext();
if ( var != nullptr ) if ( var != nullptr )
{ {
if ( var->GetType() != CBotTypString ) return CBotTypResult(CBotErrBadNum); if ( var->GetType() != CBotTypPointer ) return CBotTypResult(CBotErrBadParam);
var = var->GetNext(); var = var->GetNext();
if ( var != nullptr ) return CBotTypResult(CBotErrOverParam); if ( var != nullptr )
{
if ( var->GetType() != CBotTypString ) return CBotTypResult(CBotErrBadParam);
var = var->GetNext();
if ( var != nullptr ) return CBotTypResult(CBotErrOverParam);
}
} }
return CBotTypResult(CBotTypFloat); return CBotTypResult(CBotTypFloat);
} }
// Instruction "object.factory(cat, program)" // Instruction "factory(cat, program [, object])"
bool CScriptFunctions::rFactory(CBotVar* thisclass, CBotVar* var, CBotVar* result, int& exception, void* user) bool CScriptFunctions::rFactory(CBotVar* var, CBotVar* result, int& exception, void* user)
{ {
CScript* script = static_cast<CScript*>(user); CScript* script = static_cast<CScript*>(user);
CObject* pThis = script->m_object; CObject* pThis = script->m_object;
@ -457,20 +462,23 @@ bool CScriptFunctions::rFactory(CBotVar* thisclass, CBotVar* var, CBotVar* resul
ObjectType type = static_cast<ObjectType>(var->GetValInt()); ObjectType type = static_cast<ObjectType>(var->GetValInt());
var = var->GetNext(); var = var->GetNext();
std::string program;
if ( var != nullptr ) CObject* factory = static_cast<CObject*>(var->GetUserPtr());
program = var->GetValString();
else
program = "";
CObject* factory = static_cast<CObject*>(thisclass->GetUserPtr());
if (factory == nullptr) if (factory == nullptr)
{ {
exception = ERR_UNKNOWN; exception = ERR_UNKNOWN;
result->SetValInt(ERR_UNKNOWN); result->SetValInt(ERR_UNKNOWN);
GetLogger()->Error("in object.factory() - factory is nullptr"); GetLogger()->Error("in factory() - factory is nullptr");
return false; return false;
} }
var = var->GetNext();
std::string program;
if ( var != nullptr )
program = var->GetValString();
else
program = "";
if ( pThis->GetTeam() != factory->GetTeam() && factory->GetTeam() != 0 ) if ( pThis->GetTeam() != factory->GetTeam() && factory->GetTeam() != 0 )
{ {
@ -486,7 +494,7 @@ bool CScriptFunctions::rFactory(CBotVar* thisclass, CBotVar* var, CBotVar* resul
{ {
exception = ERR_UNKNOWN; exception = ERR_UNKNOWN;
result->SetValInt(ERR_UNKNOWN); result->SetValInt(ERR_UNKNOWN);
GetLogger()->Error("in object.factory() - automat is nullptr"); GetLogger()->Error("in factory() - automat is nullptr");
return false; return false;
} }
@ -597,7 +605,7 @@ bool CScriptFunctions::rResearch(CBotVar* thisclass, CBotVar* var, CBotVar* resu
// Instruction "object.takeoff()" // Instruction "object.takeoff()"
bool CScriptFunctions::rTakeOff(CBotVar* thisclass, CBotVar* var, CBotVar* result, int& exception, void* user) bool CScriptFunctions::rTakeOff(CBotVar* var, CBotVar* result, int& exception, void* user)
{ {
CScript* script = static_cast<CScript*>(user); CScript* script = static_cast<CScript*>(user);
CObject* pThis = script->m_object; CObject* pThis = script->m_object;
@ -605,8 +613,7 @@ bool CScriptFunctions::rTakeOff(CBotVar* thisclass, CBotVar* var, CBotVar* resul
Error err; Error err;
exception = 0; exception = 0;
CObject* base = static_cast<CObject*>(var->GetUserPtr());
CObject* base = static_cast<CObject*>(thisclass->GetUserPtr());
CAuto* automat = base->GetAuto(); CAuto* automat = base->GetAuto();
if ( pThis->GetTeam() != base->GetTeam() && base->GetTeam() != 0 ) if ( pThis->GetTeam() != base->GetTeam() && base->GetTeam() != 0 )
@ -1291,10 +1298,10 @@ bool CScriptFunctions::rBuild(CBotVar* var, CBotVar* result, int& exception, voi
oType = pThis->GetType(); oType = pThis->GetType();
if ( oType != OBJECT_MOBILEfa && // allowed only for grabber bots && humans if ( oType != OBJECT_MOBILEfb && // allowed only for builder bots && humans
oType != OBJECT_MOBILEta && oType != OBJECT_MOBILEtb &&
oType != OBJECT_MOBILEwa && oType != OBJECT_MOBILEwb &&
oType != OBJECT_MOBILEia && oType != OBJECT_MOBILEib &&
oType != OBJECT_HUMAN && oType != OBJECT_HUMAN &&
oType != OBJECT_TECH ) oType != OBJECT_TECH )
{ {
@ -3298,9 +3305,9 @@ void CScriptFunctions::Init()
bc->AddItem("team", CBotTypResult(CBotTypInt), CBotVar::ProtectionLevel::ReadOnly); bc->AddItem("team", CBotTypResult(CBotTypInt), CBotVar::ProtectionLevel::ReadOnly);
bc->AddItem("velocity", CBotTypResult(CBotTypClass, "point"), CBotVar::ProtectionLevel::ReadOnly); bc->AddItem("velocity", CBotTypResult(CBotTypClass, "point"), CBotVar::ProtectionLevel::ReadOnly);
bc->AddFunction("busy", rBusy, cBusy); bc->AddFunction("busy", rBusy, cBusy);
bc->AddFunction("factory", rFactory, cFactory); //bc->AddFunction("factory", rFactory, cFactory);
bc->AddFunction("research", rResearch, cClassOneFloat); bc->AddFunction("research", rResearch, cClassOneFloat);
bc->AddFunction("takeoff", rTakeOff, cClassNull); //bc->AddFunction("takeoff", rTakeOff);
bc->AddFunction("destroy", rDestroy, cClassNull); bc->AddFunction("destroy", rDestroy, cClassNull);
CBotProgram::AddFunction("endmission",rEndMission,cEndMission); CBotProgram::AddFunction("endmission",rEndMission,cEndMission);
@ -3365,8 +3372,10 @@ void CScriptFunctions::Init()
CBotProgram::AddFunction("penup", rPenUp, cNull); CBotProgram::AddFunction("penup", rPenUp, cNull);
CBotProgram::AddFunction("pencolor", rPenColor, cOneFloat); CBotProgram::AddFunction("pencolor", rPenColor, cOneFloat);
CBotProgram::AddFunction("penwidth", rPenWidth, cOneFloat); CBotProgram::AddFunction("penwidth", rPenWidth, cOneFloat);
CBotProgram::AddFunction("factory", rFactory, cFactory);
CBotProgram::AddFunction("camerafocus", rCameraFocus, cOneObject); CBotProgram::AddFunction("camerafocus", rCameraFocus, cOneObject);
CBotProgram::AddFunction("takeoff", rTakeOff, cOneObject);
SetFileAccessHandler(MakeUnique<CBotFileAccessHandlerColobot>()); SetFileAccessHandler(MakeUnique<CBotFileAccessHandlerColobot>());
} }

View File

@ -80,6 +80,10 @@ private:
static CBot::CBotTypResult cTopo(CBot::CBotVar* &var, void* user); static CBot::CBotTypResult cTopo(CBot::CBotVar* &var, void* user);
static CBot::CBotTypResult cMessage(CBot::CBotVar* &var, void* user); static CBot::CBotTypResult cMessage(CBot::CBotVar* &var, void* user);
static CBot::CBotTypResult cPenDown(CBot::CBotVar* &var, void* user); static CBot::CBotTypResult cPenDown(CBot::CBotVar* &var, void* user);
static CBot::CBotTypResult cFactory(CBot::CBotVar* &var, void* user);
//static CBot::CBotTypResult cTakeOff(CBot::CBotVar* &var, void* user);
static CBot::CBotTypResult cOnePoint(CBot::CBotVar* &var, void* user); static CBot::CBotTypResult cOnePoint(CBot::CBotVar* &var, void* user);
static CBot::CBotTypResult cOneObject(CBot::CBotVar* &var, void* user); static CBot::CBotTypResult cOneObject(CBot::CBotVar* &var, void* user);
@ -143,17 +147,16 @@ private:
static bool rPenColor(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user); static bool rPenColor(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user);
static bool rPenWidth(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user); static bool rPenWidth(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user);
static bool rCameraFocus(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user); static bool rCameraFocus(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user);
static bool rTakeOff(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user);
static bool rFactory(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user);
static CBot::CBotTypResult cBusy(CBot::CBotVar* thisclass, CBot::CBotVar* &var); static CBot::CBotTypResult cBusy(CBot::CBotVar* thisclass, CBot::CBotVar* &var);
static CBot::CBotTypResult cFactory(CBot::CBotVar* thisclass, CBot::CBotVar* &var);
static CBot::CBotTypResult cClassNull(CBot::CBotVar* thisclass, CBot::CBotVar* &var); static CBot::CBotTypResult cClassNull(CBot::CBotVar* thisclass, CBot::CBotVar* &var);
static CBot::CBotTypResult cClassOneFloat(CBot::CBotVar* thisclass, CBot::CBotVar* &var); static CBot::CBotTypResult cClassOneFloat(CBot::CBotVar* thisclass, CBot::CBotVar* &var);
static bool rBusy(CBot::CBotVar* thisclass, CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user); static bool rBusy(CBot::CBotVar* thisclass, CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user);
static bool rFactory(CBot::CBotVar* thisclass, CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user);
static bool rResearch(CBot::CBotVar* thisclass, CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user); static bool rResearch(CBot::CBotVar* thisclass, CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user);
static bool rTakeOff(CBot::CBotVar* thisclass, CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user);
static bool rDestroy(CBot::CBotVar* thisclass, CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user); static bool rDestroy(CBot::CBotVar* thisclass, CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user);
static CBot::CBotTypResult cPointConstructor(CBot::CBotVar* pThis, CBot::CBotVar* &var); static CBot::CBotTypResult cPointConstructor(CBot::CBotVar* pThis, CBot::CBotVar* &var);