Files
GDevelop/Core/GDCore/Project/ProjectScopedContainers.cpp
T
2026-03-27 15:07:05 +01:00

250 lines
11 KiB
C++

#include "ProjectScopedContainers.h"
#include "GDCore/IDE/EventsFunctionTools.h"
#include "GDCore/Project/EventsFunctionsExtension.h"
#include "GDCore/Project/EventsBasedBehavior.h"
#include "GDCore/Project/EventsBasedObject.h"
#include "GDCore/Project/Layout.h"
#include "GDCore/Project/ObjectsContainer.h"
#include "GDCore/Project/Project.h"
#include "GDCore/Events/Event.h"
#include "GDCore/Extensions/PlatformExtension.h"
namespace gd {
ProjectScopedContainers
ProjectScopedContainers::MakeNewProjectScopedContainersForProjectAndLayout(
const gd::Project &project, const gd::Layout &layout) {
ProjectScopedContainers projectScopedContainers(
ObjectsContainersList::MakeNewObjectsContainersListForProjectAndLayout(
project, layout),
VariablesContainersList::
MakeNewVariablesContainersListForProjectAndLayout(project, layout),
&project.GetVariables(), &layout.GetVariables(),
PropertiesContainersList::MakeNewEmptyPropertiesContainersList(),
ResourcesContainersList::MakeNewResourcesContainersListForProject(
project));
projectScopedContainers.scopeSceneName = layout.GetName();
return projectScopedContainers;
}
ProjectScopedContainers
ProjectScopedContainers::MakeNewProjectScopedContainersForProject(
const gd::Project &project) {
ProjectScopedContainers projectScopedContainers(
ObjectsContainersList::MakeNewObjectsContainersListForProject(project),
VariablesContainersList::MakeNewVariablesContainersListForProject(
project),
&project.GetVariables(), nullptr,
PropertiesContainersList::MakeNewEmptyPropertiesContainersList(),
ResourcesContainersList::MakeNewResourcesContainersListForProject(
project));
return projectScopedContainers;
}
ProjectScopedContainers
ProjectScopedContainers::MakeNewProjectScopedContainersForEventsFunctionsExtension(
const gd::Project &project, const gd::EventsFunctionsExtension &eventsFunctionsExtension) {
ProjectScopedContainers projectScopedContainers(
ObjectsContainersList::MakeNewEmptyObjectsContainersList(),
VariablesContainersList::
MakeNewVariablesContainersListForEventsFunctionsExtension(eventsFunctionsExtension),
&eventsFunctionsExtension.GetGlobalVariables(),
&eventsFunctionsExtension.GetSceneVariables(),
PropertiesContainersList::MakeNewEmptyPropertiesContainersList(),
ResourcesContainersList::MakeNewResourcesContainersListForProject(
project));
return projectScopedContainers;
};
ProjectScopedContainers
ProjectScopedContainers::MakeNewProjectScopedContainersForFreeEventsFunction(
const gd::Project &project,
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
const gd::EventsFunction &eventsFunction,
gd::ObjectsContainer &parameterObjectsContainer,
gd::VariablesContainer &parameterVariablesContainer,
gd::ResourcesContainer &parameterResourcesContainer) {
gd::EventsFunctionTools::FreeEventsFunctionToObjectsContainer(
project, eventsFunctionsExtension.GetEventsFunctions(), eventsFunction,
parameterObjectsContainer);
ProjectScopedContainers projectScopedContainers(
ObjectsContainersList::MakeNewObjectsContainersListForContainer(
parameterObjectsContainer),
VariablesContainersList::
MakeNewVariablesContainersListForFreeEventsFunction(
eventsFunctionsExtension, eventsFunction,
parameterVariablesContainer),
&eventsFunctionsExtension.GetGlobalVariables(),
&eventsFunctionsExtension.GetSceneVariables(),
PropertiesContainersList::MakeNewEmptyPropertiesContainersList(),
ResourcesContainersList::
MakeNewResourcesContainersListForFreeEventsFunction(
project, eventsFunctionsExtension, eventsFunction,
parameterResourcesContainer));
projectScopedContainers.AddParameters(eventsFunction.GetParametersForEvents(
eventsFunctionsExtension.GetEventsFunctions()));
projectScopedContainers.scopeExtensionName = eventsFunctionsExtension.GetName();
projectScopedContainers.scopeFunctionName = eventsFunction.GetName();
return projectScopedContainers;
};
ProjectScopedContainers
ProjectScopedContainers::MakeNewProjectScopedContainersForBehaviorEventsFunction(
const gd::Project &project, const gd::EventsFunctionsExtension &eventsFunctionsExtension,
const gd::EventsBasedBehavior& eventsBasedBehavior,
const gd::EventsFunction &eventsFunction,
gd::ObjectsContainer &parameterObjectsContainer,
gd::VariablesContainer &parameterVariablesContainer,
gd::VariablesContainer &propertyVariablesContainer,
gd::ResourcesContainer &parameterResourcesContainer,
gd::ResourcesContainer &propertyResourcesContainer) {
gd::EventsFunctionTools::BehaviorEventsFunctionToObjectsContainer(
project,
eventsBasedBehavior,
eventsFunction,
parameterObjectsContainer);
ProjectScopedContainers projectScopedContainers(
ObjectsContainersList::MakeNewObjectsContainersListForContainer(
parameterObjectsContainer),
VariablesContainersList::
MakeNewVariablesContainersListForBehaviorEventsFunction(
eventsFunctionsExtension, eventsBasedBehavior, eventsFunction,
parameterVariablesContainer, propertyVariablesContainer),
&eventsFunctionsExtension.GetGlobalVariables(),
&eventsFunctionsExtension.GetSceneVariables(),
PropertiesContainersList::MakeNewEmptyPropertiesContainersList(),
ResourcesContainersList::
MakeNewResourcesContainersListForBehaviorEventsFunction(
project, eventsFunctionsExtension, eventsBasedBehavior,
eventsFunction, parameterResourcesContainer,
propertyResourcesContainer));
projectScopedContainers.AddPropertiesContainer(
eventsBasedBehavior.GetSharedPropertyDescriptors());
projectScopedContainers.AddPropertiesContainer(
eventsBasedBehavior.GetPropertyDescriptors());
projectScopedContainers.AddParameters(eventsFunction.GetParametersForEvents(
eventsBasedBehavior.GetEventsFunctions()));
projectScopedContainers.scopeExtensionName = eventsFunctionsExtension.GetName();
projectScopedContainers.scopeFunctionName = eventsFunction.GetName();
projectScopedContainers.scopeBehaviorName = eventsBasedBehavior.GetName();
return projectScopedContainers;
}
ProjectScopedContainers
ProjectScopedContainers::MakeNewProjectScopedContainersForObjectEventsFunction(
const gd::Project &project,
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
const gd::EventsBasedObject &eventsBasedObject,
const gd::EventsFunction &eventsFunction,
gd::ObjectsContainer &parameterObjectsContainer,
gd::VariablesContainer &parameterVariablesContainer,
gd::VariablesContainer &propertyVariablesContainer,
gd::ResourcesContainer &parameterResourcesContainer,
gd::ResourcesContainer &propertyResourcesContainer) {
gd::EventsFunctionTools::ObjectEventsFunctionToObjectsContainer(
project, eventsBasedObject, eventsFunction, parameterObjectsContainer);
ProjectScopedContainers projectScopedContainers(
ObjectsContainersList::MakeNewObjectsContainersListForContainers(
eventsBasedObject.GetObjects(),
parameterObjectsContainer),
VariablesContainersList::
MakeNewVariablesContainersListForObjectEventsFunction(
eventsFunctionsExtension, eventsBasedObject, eventsFunction,
parameterVariablesContainer, propertyVariablesContainer),
&eventsFunctionsExtension.GetGlobalVariables(),
&eventsFunctionsExtension.GetSceneVariables(),
PropertiesContainersList::MakeNewEmptyPropertiesContainersList(),
ResourcesContainersList::
MakeNewResourcesContainersListForObjectEventsFunction(
project, eventsFunctionsExtension, eventsBasedObject,
eventsFunction, parameterResourcesContainer,
propertyResourcesContainer));
projectScopedContainers.AddPropertiesContainer(
eventsBasedObject.GetPropertyDescriptors());
projectScopedContainers.AddParameters(eventsFunction.GetParametersForEvents(
eventsBasedObject.GetEventsFunctions()));
projectScopedContainers.scopeExtensionName = eventsFunctionsExtension.GetName();
projectScopedContainers.scopeFunctionName = eventsFunction.GetName();
projectScopedContainers.scopeObjectName = eventsBasedObject.GetName();
return projectScopedContainers;
}
ProjectScopedContainers
ProjectScopedContainers::MakeNewProjectScopedContainersForEventsBasedObject(
const gd::Project &project,
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
const gd::EventsBasedObject &eventsBasedObject,
gd::ObjectsContainer &outputObjectsContainer) {
// TODO: We should avoid to use a single `outputObjectsContainer` and instead
// use multiple, stable objects container pointed by the `ProjectScopedContainers`
// created below.
// Search for "ProjectScopedContainers wrongly containing temporary objects containers or objects"
// in the codebase.
outputObjectsContainer.Clear();
outputObjectsContainer.GetObjectGroups().Clear();
// This object named "Object" represents the parent and is used by events.
// TODO: Use a dedicated `ObjectsContainer` with only this "Object" and check in
// the codebase that this container is not assumed as a
// "globalObjectsContainer".
// Search for "ProjectScopedContainers wrongly containing temporary objects containers or objects"
// in the codebase.
outputObjectsContainer.InsertNewObject(
project,
gd::PlatformExtension::GetObjectFullType(
eventsFunctionsExtension.GetName(), eventsBasedObject.GetName()),
"Object", outputObjectsContainer.GetObjectsCount());
ProjectScopedContainers projectScopedContainers(
ObjectsContainersList::MakeNewObjectsContainersListForContainers(
eventsBasedObject.GetObjects(), outputObjectsContainer),
VariablesContainersList::
MakeNewVariablesContainersListForEventsFunctionsExtension(
eventsFunctionsExtension),
&eventsFunctionsExtension.GetGlobalVariables(),
&eventsFunctionsExtension.GetSceneVariables(),
PropertiesContainersList::MakeNewEmptyPropertiesContainersList(),
ResourcesContainersList::MakeNewResourcesContainersListForProject(
project));
projectScopedContainers.AddPropertiesContainer(
eventsBasedObject.GetPropertyDescriptors());
return projectScopedContainers;
}
ProjectScopedContainers
ProjectScopedContainers::MakeNewProjectScopedContainersWithLocalVariables(
const ProjectScopedContainers &projectScopedContainers,
const gd::BaseEvent &event) {
ProjectScopedContainers newProjectScopedContainers = projectScopedContainers;
newProjectScopedContainers.variablesContainersList =
VariablesContainersList::MakeNewVariablesContainersListPushing(
projectScopedContainers.GetVariablesContainersList(),
event.GetVariables());
return newProjectScopedContainers;
}
} // namespace gd