mirror of
https://github.com/Heretek-AI/GDevelop.git
synced 2026-08-27 03:01:28 -04:00
474 lines
20 KiB
C++
474 lines
20 KiB
C++
/*
|
|
* GDevelop Core
|
|
* Copyright 2008-2015 Florian Rival (Florian.Rival@gmail.com). All rights reserved.
|
|
* This project is released under the MIT License.
|
|
*/
|
|
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
|
|
#include "GDCore/Extensions/Platform.h"
|
|
#include "GDCore/Extensions/PlatformExtension.h"
|
|
#include "GDCore/Extensions/Metadata/InstructionMetadata.h"
|
|
#include "GDCore/Extensions/Metadata/BehaviorMetadata.h"
|
|
#include "GDCore/Extensions/Metadata/ObjectMetadata.h"
|
|
#include <algorithm>
|
|
#include "GDCore/String.h"
|
|
|
|
using namespace std;
|
|
|
|
namespace gd
|
|
{
|
|
|
|
gd::BehaviorMetadata MetadataProvider::badBehaviorInfo;
|
|
gd::ObjectMetadata MetadataProvider::badObjectInfo;
|
|
gd::InstructionMetadata MetadataProvider::badInstructionMetadata;
|
|
gd::ExpressionMetadata MetadataProvider::badExpressionMetadata;
|
|
gd::ExpressionMetadata MetadataProvider::badStrExpressionMetadata;
|
|
|
|
|
|
/**
|
|
* Get the metadata about a behavior in a platform
|
|
*/
|
|
const BehaviorMetadata & MetadataProvider::GetBehaviorMetadata(const gd::Platform & platform, gd::String behaviorType)
|
|
{
|
|
for (std::size_t i = 0;i<platform.GetAllPlatformExtensions().size();++i)
|
|
{
|
|
std::vector<gd::String> autosTypes = platform.GetAllPlatformExtensions()[i]->GetBehaviorsTypes();
|
|
for(std::size_t j = 0;j<autosTypes.size();++j)
|
|
{
|
|
if ( autosTypes[j] == behaviorType )
|
|
return platform.GetAllPlatformExtensions()[i]->GetBehaviorMetadata(behaviorType);
|
|
}
|
|
}
|
|
|
|
return badBehaviorInfo;
|
|
}
|
|
|
|
/**
|
|
* Get the metadata about an object in a platform
|
|
*/
|
|
const ObjectMetadata & MetadataProvider::GetObjectMetadata(const gd::Platform & platform, gd::String objectType)
|
|
{
|
|
for (std::size_t i = 0;i<platform.GetAllPlatformExtensions().size();++i)
|
|
{
|
|
std::vector<gd::String> objectsTypes = platform.GetAllPlatformExtensions()[i]->GetExtensionObjectsTypes();
|
|
for(std::size_t j = 0;j<objectsTypes.size();++j)
|
|
{
|
|
if ( objectsTypes[j] == objectType )
|
|
return platform.GetAllPlatformExtensions()[i]->GetObjectMetadata(objectType);
|
|
}
|
|
}
|
|
|
|
return badObjectInfo;
|
|
}
|
|
|
|
const gd::InstructionMetadata & MetadataProvider::GetActionMetadata(const gd::Platform & platform, gd::String actionType)
|
|
{
|
|
std::vector < std::shared_ptr<PlatformExtension> > extensions = platform.GetAllPlatformExtensions();
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::InstructionMetadata> & allActions = extensions[i]->GetAllActions();
|
|
if ( allActions.find(actionType) != allActions.end() )
|
|
return allActions.find(actionType)->second;
|
|
|
|
const vector < gd::String > & objects = extensions[i]->GetExtensionObjectsTypes();
|
|
for (std::size_t j = 0;j<objects.size();++j)
|
|
{
|
|
const std::map<gd::String, gd::InstructionMetadata> & allObjectsActions = extensions[i]->GetAllActionsForObject(objects[j]);
|
|
if ( allObjectsActions.find(actionType) != allObjectsActions.end() )
|
|
return allObjectsActions.find(actionType)->second;
|
|
}
|
|
|
|
const vector < gd::String > & autos = extensions[i]->GetBehaviorsTypes();
|
|
for (std::size_t j = 0;j<autos.size();++j)
|
|
{
|
|
const std::map<gd::String, gd::InstructionMetadata> & allAutosActions = extensions[i]->GetAllActionsForBehavior(autos[j]);
|
|
if ( allAutosActions.find(actionType) != allAutosActions.end() )
|
|
return allAutosActions.find(actionType)->second;
|
|
}
|
|
}
|
|
|
|
return badInstructionMetadata;
|
|
}
|
|
|
|
const gd::InstructionMetadata & MetadataProvider::GetConditionMetadata(const gd::Platform & platform, gd::String conditionType)
|
|
{
|
|
std::vector < std::shared_ptr<PlatformExtension> > extensions = platform.GetAllPlatformExtensions();
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::InstructionMetadata> & allConditions = extensions[i]->GetAllConditions();
|
|
if ( allConditions.find(conditionType) != allConditions.end() )
|
|
return allConditions.find(conditionType)->second;
|
|
|
|
const vector < gd::String > & objects = extensions[i]->GetExtensionObjectsTypes();
|
|
for (std::size_t j = 0;j<objects.size();++j)
|
|
{
|
|
const std::map<gd::String, gd::InstructionMetadata> & allObjetsConditions = extensions[i]->GetAllConditionsForObject(objects[j]);
|
|
if ( allObjetsConditions.find(conditionType) != allObjetsConditions.end() )
|
|
return allObjetsConditions.find(conditionType)->second;
|
|
}
|
|
|
|
const vector < gd::String > & autos = extensions[i]->GetBehaviorsTypes();
|
|
for (std::size_t j = 0;j<autos.size();++j)
|
|
{
|
|
const std::map<gd::String, gd::InstructionMetadata> & allAutosConditions = extensions[i]->GetAllConditionsForBehavior(autos[j]);
|
|
if ( allAutosConditions.find(conditionType) != allAutosConditions.end() )
|
|
return allAutosConditions.find(conditionType)->second;
|
|
}
|
|
}
|
|
|
|
return badInstructionMetadata;
|
|
}
|
|
|
|
const gd::ExpressionMetadata & MetadataProvider::GetObjectExpressionMetadata(const gd::Platform & platform, gd::String objectType, gd::String exprType)
|
|
{
|
|
std::vector < std::shared_ptr<PlatformExtension> > extensions = platform.GetAllPlatformExtensions();
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const vector < gd::String > & objects = extensions[i]->GetExtensionObjectsTypes();
|
|
if ( find(objects.begin(), objects.end(), objectType) != objects.end())
|
|
{
|
|
const std::map<gd::String, gd::ExpressionMetadata> & allObjectExpressions = extensions[i]->GetAllExpressionsForObject(objectType);
|
|
if ( allObjectExpressions.find(exprType) != allObjectExpressions.end() )
|
|
return allObjectExpressions.find(exprType)->second;
|
|
}
|
|
}
|
|
|
|
//Then check base
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::ExpressionMetadata> & allObjectExpressions = extensions[i]->GetAllExpressionsForObject("");
|
|
if ( allObjectExpressions.find(exprType) != allObjectExpressions.end() )
|
|
return allObjectExpressions.find(exprType)->second;
|
|
}
|
|
|
|
return badExpressionMetadata;
|
|
}
|
|
|
|
const gd::ExpressionMetadata & MetadataProvider::GetBehaviorExpressionMetadata(const gd::Platform & platform, gd::String autoType, gd::String exprType)
|
|
{
|
|
std::vector < std::shared_ptr<PlatformExtension> > extensions = platform.GetAllPlatformExtensions();
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const vector < gd::String > & autos = extensions[i]->GetBehaviorsTypes();
|
|
if ( find(autos.begin(), autos.end(), autoType) != autos.end())
|
|
{
|
|
const std::map<gd::String, gd::ExpressionMetadata> & allAutoExpressions = extensions[i]->GetAllExpressionsForBehavior(autoType);
|
|
if ( allAutoExpressions.find(exprType) != allAutoExpressions.end() )
|
|
return allAutoExpressions.find(exprType)->second;
|
|
}
|
|
}
|
|
|
|
//Then check base
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::ExpressionMetadata> & allAutoExpressions = extensions[i]->GetAllExpressionsForBehavior("");
|
|
if ( allAutoExpressions.find(exprType) != allAutoExpressions.end() )
|
|
return allAutoExpressions.find(exprType)->second;
|
|
}
|
|
|
|
return badExpressionMetadata;
|
|
}
|
|
|
|
const gd::ExpressionMetadata & MetadataProvider::GetExpressionMetadata(const gd::Platform & platform, gd::String exprType)
|
|
{
|
|
std::vector < std::shared_ptr<PlatformExtension> > extensions = platform.GetAllPlatformExtensions();
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::ExpressionMetadata> & allExpr = extensions[i]->GetAllExpressions();
|
|
if ( allExpr.find(exprType) != allExpr.end() )
|
|
return allExpr.find(exprType)->second;
|
|
}
|
|
|
|
return badExpressionMetadata;
|
|
}
|
|
|
|
const gd::ExpressionMetadata & MetadataProvider::GetObjectStrExpressionMetadata(const gd::Platform & platform, gd::String objectType, gd::String exprType)
|
|
{
|
|
std::vector < std::shared_ptr<PlatformExtension> > extensions = platform.GetAllPlatformExtensions();
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const vector < gd::String > & objects = extensions[i]->GetExtensionObjectsTypes();
|
|
if ( find(objects.begin(), objects.end(), objectType) != objects.end())
|
|
{
|
|
const std::map<gd::String, gd::ExpressionMetadata> & allObjectStrExpressions = extensions[i]->GetAllStrExpressionsForObject(objectType);
|
|
if ( allObjectStrExpressions.find(exprType) != allObjectStrExpressions.end() )
|
|
return allObjectStrExpressions.find(exprType)->second;
|
|
}
|
|
}
|
|
|
|
//Then check in functions of "Base object".
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::ExpressionMetadata> & allObjectStrExpressions = extensions[i]->GetAllStrExpressionsForObject("");
|
|
if ( allObjectStrExpressions.find(exprType) != allObjectStrExpressions.end() )
|
|
return allObjectStrExpressions.find(exprType)->second;
|
|
}
|
|
|
|
return badStrExpressionMetadata;
|
|
}
|
|
|
|
const gd::ExpressionMetadata & MetadataProvider::GetBehaviorStrExpressionMetadata(const gd::Platform & platform, gd::String autoType, gd::String exprType)
|
|
{
|
|
std::vector < std::shared_ptr<PlatformExtension> > extensions = platform.GetAllPlatformExtensions();
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const vector < gd::String > & autos = extensions[i]->GetBehaviorsTypes();
|
|
if ( find(autos.begin(), autos.end(), autoType) != autos.end())
|
|
{
|
|
const std::map<gd::String, gd::ExpressionMetadata> & allBehaviorStrExpressions = extensions[i]->GetAllStrExpressionsForBehavior(autoType);
|
|
if ( allBehaviorStrExpressions.find(exprType) != allBehaviorStrExpressions.end() )
|
|
return allBehaviorStrExpressions.find(exprType)->second;
|
|
}
|
|
}
|
|
|
|
//Then check in functions of "Base object".
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::ExpressionMetadata> & allBehaviorStrExpressions = extensions[i]->GetAllStrExpressionsForBehavior("");
|
|
if ( allBehaviorStrExpressions.find(exprType) != allBehaviorStrExpressions.end() )
|
|
return allBehaviorStrExpressions.find(exprType)->second;
|
|
}
|
|
|
|
return badStrExpressionMetadata;
|
|
}
|
|
|
|
const gd::ExpressionMetadata & MetadataProvider::GetStrExpressionMetadata(const gd::Platform & platform, gd::String exprType)
|
|
{
|
|
std::vector < std::shared_ptr<PlatformExtension> > extensions = platform.GetAllPlatformExtensions();
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::ExpressionMetadata> & allExpr = extensions[i]->GetAllStrExpressions();
|
|
if ( allExpr.find(exprType) != allExpr.end() )
|
|
return allExpr.find(exprType)->second;
|
|
}
|
|
|
|
return badStrExpressionMetadata;
|
|
}
|
|
|
|
bool MetadataProvider::HasAction(const gd::Platform & platform, gd::String name)
|
|
{
|
|
std::vector < std::shared_ptr<PlatformExtension> > extensions = platform.GetAllPlatformExtensions();
|
|
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::InstructionMetadata > & actions = extensions[i]->GetAllActions();
|
|
if ( actions.find(name) != actions.end() )
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool MetadataProvider::HasObjectAction(const gd::Platform & platform, gd::String objectType, gd::String name)
|
|
{
|
|
std::vector < std::shared_ptr<PlatformExtension> > extensions = platform.GetAllPlatformExtensions();
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::InstructionMetadata > & actions = extensions[i]->GetAllActionsForObject(objectType);
|
|
if ( actions.find(name) != actions.end() )
|
|
return true;
|
|
}
|
|
|
|
//Then check in functions of "Base object".
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::InstructionMetadata > & actions = extensions[i]->GetAllActionsForObject("");
|
|
if ( actions.find(name) != actions.end() )
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool MetadataProvider::HasBehaviorAction(const gd::Platform & platform, gd::String behaviorType, gd::String name)
|
|
{
|
|
std::vector < std::shared_ptr<PlatformExtension> > extensions = platform.GetAllPlatformExtensions();
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::InstructionMetadata > & actions = extensions[i]->GetAllActionsForBehavior(behaviorType);
|
|
if ( actions.find(name) != actions.end() )
|
|
return true;
|
|
}
|
|
|
|
//Then check in functions of "Base object".
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::InstructionMetadata > & actions = extensions[i]->GetAllActionsForBehavior("");
|
|
if ( actions.find(name) != actions.end() )
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
bool MetadataProvider::HasCondition(const gd::Platform & platform, gd::String name)
|
|
{
|
|
std::vector < std::shared_ptr<PlatformExtension> > extensions = platform.GetAllPlatformExtensions();
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::InstructionMetadata > & conditions = extensions[i]->GetAllConditions();
|
|
if ( conditions.find(name) != conditions.end() )
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool MetadataProvider::HasObjectCondition(const gd::Platform & platform, gd::String objectType, gd::String name)
|
|
{
|
|
std::vector < std::shared_ptr<PlatformExtension> > extensions = platform.GetAllPlatformExtensions();
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::InstructionMetadata > & conditions = extensions[i]->GetAllConditionsForObject(objectType);
|
|
if ( conditions.find(name) != conditions.end() )
|
|
return true;
|
|
}
|
|
|
|
//Then check in functions of "Base object".
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::InstructionMetadata > & conditions = extensions[i]->GetAllConditionsForObject("");
|
|
if ( conditions.find(name) != conditions.end() )
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool MetadataProvider::HasBehaviorCondition(const gd::Platform & platform, gd::String behaviorType, gd::String name)
|
|
{
|
|
std::vector < std::shared_ptr<PlatformExtension> > extensions = platform.GetAllPlatformExtensions();
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::InstructionMetadata > & conditions = extensions[i]->GetAllConditionsForBehavior(behaviorType);
|
|
if ( conditions.find(name) != conditions.end() )
|
|
return true;
|
|
}
|
|
|
|
//Then check in functions of "Base object".
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::InstructionMetadata > & conditions = extensions[i]->GetAllConditionsForBehavior("");
|
|
if ( conditions.find(name) != conditions.end() )
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool MetadataProvider::HasExpression(const gd::Platform & platform, gd::String name)
|
|
{
|
|
std::vector < std::shared_ptr<PlatformExtension> > extensions = platform.GetAllPlatformExtensions();
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::ExpressionMetadata > & expressions = extensions[i]->GetAllExpressions();
|
|
if ( expressions.find(name) != expressions.end() )
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool MetadataProvider::HasObjectExpression(const gd::Platform & platform, gd::String objectType, gd::String name)
|
|
{
|
|
std::vector < std::shared_ptr<PlatformExtension> > extensions = platform.GetAllPlatformExtensions();
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::ExpressionMetadata > & expressions = extensions[i]->GetAllExpressionsForObject(objectType);
|
|
if ( expressions.find(name) != expressions.end() )
|
|
return true;
|
|
}
|
|
|
|
//Then check in functions of "Base object".
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::ExpressionMetadata > & expressions = extensions[i]->GetAllExpressionsForObject("");
|
|
if ( expressions.find(name) != expressions.end() )
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool MetadataProvider::HasBehaviorExpression(const gd::Platform & platform, gd::String behaviorType, gd::String name)
|
|
{
|
|
std::vector < std::shared_ptr<PlatformExtension> > extensions = platform.GetAllPlatformExtensions();
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::ExpressionMetadata > & expressions = extensions[i]->GetAllExpressionsForBehavior(behaviorType);
|
|
if ( expressions.find(name) != expressions.end() )
|
|
return true;
|
|
}
|
|
|
|
//Then check in functions of "Base object".
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::ExpressionMetadata > & expressions = extensions[i]->GetAllExpressionsForBehavior("");
|
|
if ( expressions.find(name) != expressions.end() )
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
bool MetadataProvider::HasStrExpression(const gd::Platform & platform, gd::String name)
|
|
{
|
|
std::vector < std::shared_ptr<PlatformExtension> > extensions = platform.GetAllPlatformExtensions();
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::ExpressionMetadata > & expressions = extensions[i]->GetAllStrExpressions();
|
|
if ( expressions.find(name) != expressions.end() )
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool MetadataProvider::HasObjectStrExpression(const gd::Platform & platform, gd::String objectType, gd::String name)
|
|
{
|
|
std::vector < std::shared_ptr<PlatformExtension> > extensions = platform.GetAllPlatformExtensions();
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::ExpressionMetadata > & expressions = extensions[i]->GetAllStrExpressionsForObject(objectType);
|
|
if ( expressions.find(name) != expressions.end() )
|
|
return true;
|
|
}
|
|
|
|
//Then check in functions of "Base object".
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::ExpressionMetadata > & expressions = extensions[i]->GetAllStrExpressionsForObject("");
|
|
if ( expressions.find(name) != expressions.end() )
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool MetadataProvider::HasBehaviorStrExpression(const gd::Platform & platform, gd::String behaviorType, gd::String name)
|
|
{
|
|
std::vector < std::shared_ptr<PlatformExtension> > extensions = platform.GetAllPlatformExtensions();
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::ExpressionMetadata > & expressions = extensions[i]->GetAllStrExpressionsForBehavior(behaviorType);
|
|
if ( expressions.find(name) != expressions.end() )
|
|
return true;
|
|
}
|
|
|
|
//Then check in functions of "Base object".
|
|
for (std::size_t i =0;i<extensions.size();++i)
|
|
{
|
|
const std::map<gd::String, gd::ExpressionMetadata > & expressions = extensions[i]->GetAllStrExpressionsForBehavior("");
|
|
if ( expressions.find(name) != expressions.end() )
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
MetadataProvider::~MetadataProvider() {}
|
|
MetadataProvider::MetadataProvider() {}
|
|
|
|
}
|