mirror of
https://github.com/4ian/GDevelop.git
synced 2025-10-15 10:19:04 +00:00

* Only the first scene and global objects resources (images, sounds, 3D models etc...) will be downloaded during launch of the game. This usually allows for a very fast loading time. * Other scenes resources will continue to load in the background. It has no impact on the game performance as this is done on other threads by the browser or the engine running the game. * Scenes are loaded in the order they are listed in the project manager. * You can also use actions and expressions to prioritize a scene (if it's known that a level will be needed soon for example) or read the current loading progress. This allows to create lightweight scenes that can act as custom loading screens. Otherwise, the launch loading screen will be shown if a scene is still loading when launched. * Read more about this on https://wiki.gdevelop.io/gdevelop5/all-features/resources-loading/.
291 lines
9.8 KiB
C++
291 lines
9.8 KiB
C++
/*
|
|
* GDevelop Core
|
|
* Copyright 2008-present Florian Rival (Florian.Rival@gmail.com). All rights
|
|
* reserved. This project is released under the MIT License.
|
|
*/
|
|
#pragma once
|
|
|
|
#include "GDCore/Extensions/Metadata/ExpressionMetadata.h"
|
|
#include "GDCore/Extensions/Metadata/InstructionMetadata.h"
|
|
#include "GDCore/String.h"
|
|
#include "ParameterOptions.h"
|
|
|
|
namespace gd {} // namespace gd
|
|
|
|
namespace gd {
|
|
|
|
/**
|
|
* \brief A "composite" metadata that can be used to easily declare
|
|
* both an expression and a related condition (and a related action)
|
|
* without writing manually the three of them.
|
|
*
|
|
* \ingroup PlatformDefinition
|
|
*/
|
|
class GD_CORE_API MultipleInstructionMetadata : public AbstractFunctionMetadata {
|
|
public:
|
|
static MultipleInstructionMetadata WithExpressionAndCondition(
|
|
gd::ExpressionMetadata &expression, gd::InstructionMetadata &condition) {
|
|
return MultipleInstructionMetadata(expression, condition);
|
|
}
|
|
static MultipleInstructionMetadata WithExpressionAndConditionAndAction(
|
|
gd::ExpressionMetadata &expression,
|
|
gd::InstructionMetadata &condition,
|
|
gd::InstructionMetadata &action) {
|
|
return MultipleInstructionMetadata(expression, condition, action);
|
|
}
|
|
static MultipleInstructionMetadata WithConditionAndAction(
|
|
gd::InstructionMetadata &condition, gd::InstructionMetadata &action) {
|
|
return MultipleInstructionMetadata(condition, action);
|
|
}
|
|
|
|
/**
|
|
* \see gd::InstructionMetadata::AddParameter
|
|
*/
|
|
MultipleInstructionMetadata &AddParameter(
|
|
const gd::String &type,
|
|
const gd::String &label,
|
|
const gd::String &supplementaryInformation = "",
|
|
bool parameterIsOptional = false) override {
|
|
if (expression)
|
|
expression->AddParameter(
|
|
type, label, supplementaryInformation, parameterIsOptional);
|
|
if (condition)
|
|
condition->AddParameter(
|
|
type, label, supplementaryInformation, parameterIsOptional);
|
|
if (action)
|
|
action->AddParameter(
|
|
type, label, supplementaryInformation, parameterIsOptional);
|
|
return *this;
|
|
}
|
|
|
|
/**
|
|
* \see gd::InstructionMetadata::AddCodeOnlyParameter
|
|
*/
|
|
MultipleInstructionMetadata &AddCodeOnlyParameter(
|
|
const gd::String &type, const gd::String &supplementaryInformation) override {
|
|
if (expression)
|
|
expression->AddCodeOnlyParameter(type, supplementaryInformation);
|
|
if (condition)
|
|
condition->AddCodeOnlyParameter(type, supplementaryInformation);
|
|
if (action) action->AddCodeOnlyParameter(type, supplementaryInformation);
|
|
return *this;
|
|
}
|
|
|
|
/**
|
|
* \see gd::InstructionMetadata::SetDefaultValue
|
|
*/
|
|
MultipleInstructionMetadata &SetDefaultValue(const gd::String &defaultValue) override {
|
|
if (expression) expression->SetDefaultValue(defaultValue);
|
|
if (condition) condition->SetDefaultValue(defaultValue);
|
|
if (action) action->SetDefaultValue(defaultValue);
|
|
return *this;
|
|
};
|
|
|
|
/**
|
|
* \see gd::InstructionMetadata::SetParameterExtraInfo
|
|
*/
|
|
MultipleInstructionMetadata &SetParameterExtraInfo(
|
|
const gd::String &defaultValue) override {
|
|
if (expression) expression->SetParameterExtraInfo(defaultValue);
|
|
if (condition) condition->SetParameterExtraInfo(defaultValue);
|
|
if (action) action->SetParameterExtraInfo(defaultValue);
|
|
return *this;
|
|
};
|
|
|
|
/**
|
|
* \see gd::InstructionMetadata::SetParameterLongDescription
|
|
*/
|
|
MultipleInstructionMetadata &SetParameterLongDescription(
|
|
const gd::String &longDescription) override {
|
|
if (expression) expression->SetParameterLongDescription(longDescription);
|
|
if (condition) condition->SetParameterLongDescription(longDescription);
|
|
if (action) action->SetParameterLongDescription(longDescription);
|
|
return *this;
|
|
};
|
|
|
|
/**
|
|
* \see gd::InstructionMetadata::SetHidden
|
|
*/
|
|
MultipleInstructionMetadata &SetHidden() override {
|
|
if (expression) expression->SetHidden();
|
|
if (condition) condition->SetHidden();
|
|
if (action) action->SetHidden();
|
|
return *this;
|
|
};
|
|
|
|
/**
|
|
* \see gd::InstructionMetadata::SetRequiresBaseObjectCapability
|
|
*/
|
|
MultipleInstructionMetadata &SetRequiresBaseObjectCapability(
|
|
const gd::String &capability) {
|
|
if (expression) expression->SetRequiresBaseObjectCapability(capability);
|
|
if (condition) condition->SetRequiresBaseObjectCapability(capability);
|
|
if (action) action->SetRequiresBaseObjectCapability(capability);
|
|
return *this;
|
|
}
|
|
|
|
/**
|
|
* \see gd::InstructionMetadata::UseStandardOperatorParameters
|
|
* \see gd::InstructionMetadata::UseStandardRelationalOperatorParameters
|
|
*/
|
|
MultipleInstructionMetadata &UseStandardParameters(
|
|
const gd::String &type, const ParameterOptions &options) {
|
|
if (condition)
|
|
condition->UseStandardRelationalOperatorParameters(type, options);
|
|
if (action) action->UseStandardOperatorParameters(type, options);
|
|
return *this;
|
|
}
|
|
|
|
MultipleInstructionMetadata &SetFunctionName(const gd::String &functionName) override {
|
|
if (expression) expression->SetFunctionName(functionName);
|
|
if (condition) condition->SetFunctionName(functionName);
|
|
if (action) action->SetFunctionName(functionName);
|
|
return *this;
|
|
}
|
|
|
|
MultipleInstructionMetadata &SetGetter(const gd::String &getter) {
|
|
if (expression) expression->SetFunctionName(getter);
|
|
if (condition) condition->SetFunctionName(getter);
|
|
if (action) action->SetGetter(getter);
|
|
return *this;
|
|
}
|
|
|
|
MultipleInstructionMetadata &SetIncludeFile(const gd::String &includeFile) override {
|
|
if (expression)
|
|
expression->SetIncludeFile(includeFile);
|
|
if (condition)
|
|
condition->SetIncludeFile(includeFile);
|
|
if (action) action->SetIncludeFile(includeFile);
|
|
return *this;
|
|
}
|
|
|
|
MultipleInstructionMetadata &AddIncludeFile(const gd::String &includeFile) override {
|
|
if (expression)
|
|
expression->GetCodeExtraInformation().AddIncludeFile(includeFile);
|
|
if (condition)
|
|
condition->AddIncludeFile(includeFile);
|
|
if (action) action->AddIncludeFile(includeFile);
|
|
return *this;
|
|
}
|
|
|
|
/**
|
|
* \brief Get the files that must be included to use the instruction.
|
|
*/
|
|
const std::vector<gd::String> &GetIncludeFiles() const override {
|
|
if (expression)
|
|
return expression->GetCodeExtraInformation().GetIncludeFiles();
|
|
if (condition)
|
|
return condition->GetIncludeFiles();
|
|
if (action) return action->GetIncludeFiles();
|
|
// It can't actually happen.
|
|
throw std::logic_error("no instruction metadata");
|
|
}
|
|
|
|
/**
|
|
* \see gd::InstructionMetadata::SetPrivate
|
|
*/
|
|
MultipleInstructionMetadata &SetPrivate() override {
|
|
if (expression) expression->SetPrivate();
|
|
if (condition) condition->SetPrivate();
|
|
if (action) action->SetPrivate();
|
|
return *this;
|
|
}
|
|
|
|
/**
|
|
* \see gd::InstructionMetadata::SetHelpPath
|
|
*/
|
|
MultipleInstructionMetadata &SetHelpPath(const gd::String &path) {
|
|
if (expression) expression->SetHelpPath(path);
|
|
if (condition) condition->SetHelpPath(path);
|
|
if (action) action->SetHelpPath(path);
|
|
return *this;
|
|
}
|
|
|
|
/**
|
|
* \see gd::InstructionMetadata::MarkAsSimple
|
|
*/
|
|
MultipleInstructionMetadata &MarkAsSimple() {
|
|
if (condition) condition->MarkAsSimple();
|
|
if (action) action->MarkAsSimple();
|
|
return *this;
|
|
}
|
|
|
|
/**
|
|
* \see gd::InstructionMetadata::MarkAsAdvanced
|
|
*/
|
|
MultipleInstructionMetadata &MarkAsAdvanced() {
|
|
if (condition) condition->MarkAsAdvanced();
|
|
if (action) action->MarkAsAdvanced();
|
|
return *this;
|
|
}
|
|
|
|
/**
|
|
* \see gd::InstructionMetadata::MarkAsComplex
|
|
*/
|
|
MultipleInstructionMetadata &MarkAsComplex() {
|
|
if (condition) condition->MarkAsComplex();
|
|
if (action) action->MarkAsComplex();
|
|
return *this;
|
|
}
|
|
|
|
/**
|
|
* Set that the instruction can be used in layouts or external events.
|
|
*/
|
|
MultipleInstructionMetadata &SetRelevantForLayoutEventsOnly() override {
|
|
if (condition) condition->SetRelevantForLayoutEventsOnly();
|
|
if (action) action->SetRelevantForLayoutEventsOnly();
|
|
return *this;
|
|
}
|
|
|
|
/**
|
|
* Set that the instruction can be used in function events.
|
|
*/
|
|
MultipleInstructionMetadata &SetRelevantForFunctionEventsOnly() override {
|
|
if (condition) condition->SetRelevantForFunctionEventsOnly();
|
|
if (action) action->SetRelevantForFunctionEventsOnly();
|
|
return *this;
|
|
}
|
|
|
|
/**
|
|
* Set that the instruction can be used in asynchronous function events.
|
|
*/
|
|
MultipleInstructionMetadata &SetRelevantForAsynchronousFunctionEventsOnly() override {
|
|
if (condition) condition->SetRelevantForAsynchronousFunctionEventsOnly();
|
|
if (action) action->SetRelevantForAsynchronousFunctionEventsOnly();
|
|
return *this;
|
|
}
|
|
|
|
/**
|
|
* Set that the instruction can be used in custom object events.
|
|
*/
|
|
MultipleInstructionMetadata &SetRelevantForCustomObjectEventsOnly() override {
|
|
if (condition) condition->SetRelevantForCustomObjectEventsOnly();
|
|
if (action) action->SetRelevantForCustomObjectEventsOnly();
|
|
return *this;
|
|
}
|
|
|
|
/**
|
|
* \brief Don't use, only here to fulfill Emscripten bindings requirements.
|
|
*/
|
|
MultipleInstructionMetadata()
|
|
: expression(nullptr), condition(nullptr), action(nullptr){};
|
|
|
|
private:
|
|
MultipleInstructionMetadata(gd::ExpressionMetadata &expression_,
|
|
gd::InstructionMetadata &condition_)
|
|
: expression(&expression_), condition(&condition_), action(nullptr){};
|
|
MultipleInstructionMetadata(gd::ExpressionMetadata &expression_,
|
|
gd::InstructionMetadata &condition_,
|
|
gd::InstructionMetadata &action_)
|
|
: expression(&expression_), condition(&condition_), action(&action_){};
|
|
MultipleInstructionMetadata(gd::InstructionMetadata &condition_,
|
|
gd::InstructionMetadata &action_)
|
|
: expression(nullptr), condition(&condition_), action(&action_){};
|
|
|
|
gd::ExpressionMetadata *expression;
|
|
gd::InstructionMetadata *condition;
|
|
gd::InstructionMetadata *action;
|
|
};
|
|
|
|
} // namespace gd
|