GDevelop Core
Core library for developing platforms and tools compatible with GDevelop.
PlatformExtension.h
1 /*
2  * GDevelop Core
3  * Copyright 2008-2016 Florian Rival ([email protected]). All rights
4  * reserved. Copyright 2016 Victor Levasseur ([email protected]) This
5  * project is released under the MIT License.
6  */
7 
8 #pragma once
9 #include <map>
10 #include <memory>
11 #include <vector>
12 
13 #include "GDCore/CommonTools.h"
14 #include "GDCore/Extensions/Metadata/BehaviorMetadata.h"
15 #include "GDCore/Extensions/Metadata/DependencyMetadata.h"
16 #include "GDCore/Extensions/Metadata/EffectMetadata.h"
17 #include "GDCore/Extensions/Metadata/EventMetadata.h"
18 #include "GDCore/Extensions/Metadata/InstructionOrExpressionGroupMetadata.h"
19 #include "GDCore/Extensions/Metadata/ObjectMetadata.h"
20 #include "GDCore/Extensions/Metadata/SourceFileMetadata.h"
21 #include "GDCore/Project/PropertyDescriptor.h"
22 #include "GDCore/String.h"
23 #include "GDCore/Tools/VersionPriv.h"
24 
25 namespace gd {
26 class Instruction;
27 class InstructionMetadata;
28 class MultipleInstructionMetadata;
29 class ExpressionMetadata;
30 class ObjectMetadata;
31 class BehaviorMetadata;
32 class EffectMetadata;
33 class DependencyMetadata;
34 class BaseEvent;
35 class EventMetadata;
36 class EventCodeGenerator;
37 class ArbitraryResourceWorker;
38 class BehaviorsSharedData;
39 class Behavior;
40 class Object;
41 class ObjectConfiguration;
42 } // namespace gd
43 
44 typedef std::function<std::unique_ptr<gd::ObjectConfiguration>()> CreateFunPtr;
45 
46 namespace gd {
47 
52 class GD_CORE_API CompilationInfo {
53  public:
54  CompilationInfo() {};
55  virtual ~CompilationInfo() {};
56 
57  bool informationCompleted = false;
58 
59  bool runtimeOnly = false;
61 
62 #if defined(__GNUC__)
63  int gccMajorVersion = 0;
64  int gccMinorVersion = 0;
65  int gccPatchLevel = 0;
66 #endif
67 
68  int sfmlMajorVersion = 0;
69  int sfmlMinorVersion = 0;
70 
71  gd::String gdCoreVersion;
72  int sizeOfpInt = 0;
73 };
74 
75 struct GD_CORE_API DuplicatedInstructionOptions {
76  bool unscoped;
77 };
78 
84 class GD_CORE_API PlatformExtension {
85  public:
86  CompilationInfo compilationInfo;
87 
89  virtual ~PlatformExtension();
90 
95 
99  PlatformExtension& SetExtensionInformation(const gd::String& name_,
100  const gd::String& fullname_,
101  const gd::String& description_,
102  const gd::String& author_,
103  const gd::String& license_);
104 
109  iconUrl = iconUrl_;
110  return *this;
111  }
112 
116  PlatformExtension& SetShortDescription(const gd::String& shortDescription_) {
117  shortDescription = shortDescription_;
118  return *this;
119  }
120 
125  dimension = dimension_;
126  return *this;
127  }
128 
133  category = category_;
134  return *this;
135  }
136 
146  helpPath = helpPath_;
147  return *this;
148  }
149 
155  deprecated = true;
156  deprecationGDVersion = version;
157  return *this;
158  }
159 
161 
166 
170  gd::InstructionMetadata& AddCondition(const gd::String& name_,
171  const gd::String& fullname_,
172  const gd::String& description_,
173  const gd::String& sentence_,
174  const gd::String& group_,
175  const gd::String& icon_,
176  const gd::String& smallicon_);
177 
181  gd::InstructionMetadata& AddAction(const gd::String& name_,
182  const gd::String& fullname_,
183  const gd::String& description_,
184  const gd::String& sentence_,
185  const gd::String& group_,
186  const gd::String& icon_,
187  const gd::String& smallicon_);
191  gd::ExpressionMetadata& AddExpression(const gd::String& name_,
192  const gd::String& fullname_,
193  const gd::String& description_,
194  const gd::String& group_,
195  const gd::String& smallicon_);
199  gd::ExpressionMetadata& AddStrExpression(const gd::String& name_,
200  const gd::String& fullname_,
201  const gd::String& description_,
202  const gd::String& group_,
203  const gd::String& smallicon_);
204 
211  gd::MultipleInstructionMetadata AddExpressionAndCondition(
212  const gd::String& type,
213  const gd::String& name,
214  const gd::String& fullname,
215  const gd::String& description,
216  const gd::String& sentenceName,
217  const gd::String& group,
218  const gd::String& icon);
219 
228  gd::MultipleInstructionMetadata AddExpressionAndConditionAndAction(
229  const gd::String& type,
230  const gd::String& name,
231  const gd::String& fullname,
232  const gd::String& description,
233  const gd::String& sentenceName,
234  const gd::String& group,
235  const gd::String& icon);
236 
237  gd::DependencyMetadata& AddDependency();
238  gd::SourceFileMetadata& AddSourceFile();
239 
248  template <class T>
249  gd::ObjectMetadata& AddObject(const gd::String& name_,
250  const gd::String& fullname_,
251  const gd::String& description_,
252  const gd::String& icon_);
253 
263  gd::ObjectMetadata& AddObject(
264  const gd::String& name_,
265  const gd::String& fullname_,
266  const gd::String& description_,
267  const gd::String& icon_,
268  std::shared_ptr<gd::ObjectConfiguration> instance);
269 
278  gd::ObjectMetadata& AddEventsBasedObject(const gd::String& name_,
279  const gd::String& fullname_,
280  const gd::String& description_,
281  const gd::String& icon_);
282 
298  gd::BehaviorMetadata& AddBehavior(
299  const gd::String& name_,
300  const gd::String& fullname_,
301  const gd::String& defaultName_,
302  const gd::String& description_,
303  const gd::String& group_,
304  const gd::String& icon_,
305  const gd::String& className_,
306  std::shared_ptr<gd::Behavior> instance,
307  std::shared_ptr<gd::BehaviorsSharedData> sharedDatasInstance);
308 
313  gd::EffectMetadata& AddEffect(const gd::String& name_);
314 
318  gd::EventMetadata& AddEvent(const gd::String& name_,
319  const gd::String& fullname_,
320  const gd::String& description_,
321  const gd::String& group_,
322  const gd::String& smallicon_,
323  std::shared_ptr<gd::BaseEvent> instance);
324 
331  gd::InstructionMetadata& AddDuplicatedAction(
332  const gd::String& newActionName, const gd::String& copiedActionName);
339  gd::InstructionMetadata& AddDuplicatedCondition(
340  const gd::String& newConditionName,
341  const gd::String& copiedConditionName,
342  gd::DuplicatedInstructionOptions options = {.unscoped = false});
349  gd::ExpressionMetadata& AddDuplicatedExpression(
350  const gd::String& newExpressionName,
351  const gd::String& copiedExpressionName);
359  gd::ExpressionMetadata& AddDuplicatedStrExpression(
360  const gd::String& newExpressionName,
361  const gd::String& copiedExpressionName);
362 
367  return extensionPropertiesMetadata[name];
368  };
369 
375  const gd::String& name) {
376  return instructionOrExpressionGroupMetadata[name];
377  }
378 
383  void StripUnimplementedInstructionsAndExpressions();
384 
385 
390  InGameEditorResourceMetadata newInGameEditorResource;
391  inGameEditorResources.push_back(newInGameEditorResource);
392  return inGameEditorResources.back();
393  }
395 
400 
404  const gd::String& GetFullName() const { return fullname; }
405 
409  const gd::String& GetName() const { return name; }
410 
414  const gd::String& GetCategory() const { return category; }
415 
419  const gd::String& GetDescription() const { return informations; }
420 
424  const gd::String& GetShortDescription() const { return shortDescription; }
425 
429  const gd::String& GetDimension() const { return dimension; }
430 
434  const gd::String& GetAuthor() const { return author; }
435 
439  const gd::String& GetLicense() const { return license; }
440 
445  const gd::String& GetHelpPath() const { return helpPath; }
446 
451  const gd::String& GetIconUrl() const { return iconUrl; }
452 
456  const std::vector<gd::String>& GetTags() const { return tags; }
457 
462  tags.clear();
463  tags = csvTags.Split(',');
464  for (size_t i = 0; i < tags.size(); i++) {
465  tags[i] = tags[i].Trim().LowerCase();
466  }
467  return *this;
468  }
469 
474  tags.push_back(tag);
475  return *this;
476  }
477 
481  bool IsDeprecated() const { return deprecated; }
482 
487  return deprecationGDVersion;
488  };
489 
495  const gd::String& GetNameSpace() { return nameSpace; };
496 
501  std::vector<gd::String> GetExtensionObjectsTypes() const;
502 
507  std::vector<gd::String> GetBehaviorsTypes() const;
508 
513  CreateFunPtr GetObjectCreationFunctionPtr(const gd::String& objectType) const;
514 
519  std::vector<gd::String> GetExtensionEffectTypes() const;
520 
526  std::shared_ptr<gd::BaseEvent> CreateEvent(const gd::String& eventType) const;
532  gd::Behavior* GetBehavior(const gd::String& behaviorType) const;
533 
540  gd::BehaviorsSharedData* GetBehaviorSharedDatas(
541  const gd::String& behaviorType) const;
542 
547  ObjectMetadata& GetObjectMetadata(const gd::String& objectType);
548 
553  BehaviorMetadata& GetBehaviorMetadata(const gd::String& behaviorType);
554 
559  bool HasBehavior(const gd::String& behaviorType) const;
560 
564  EffectMetadata& GetEffectMetadata(const gd::String& effectName);
565 
569  std::map<gd::String, gd::EventMetadata>& GetAllEvents();
570 
575  std::map<gd::String, gd::InstructionMetadata>& GetAllActions();
576 
580  std::map<gd::String, gd::InstructionMetadata>& GetAllConditions();
581 
585  std::map<gd::String, gd::ExpressionMetadata>& GetAllExpressions();
586 
590  std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressions();
591 
596  std::vector<gd::DependencyMetadata>& GetAllDependencies();
597 
602  const std::vector<gd::DependencyMetadata>& GetAllDependencies() const;
603 
608  std::vector<gd::SourceFileMetadata>& GetAllSourceFiles();
609 
614  const std::vector<gd::SourceFileMetadata>& GetAllSourceFiles() const;
615 
620  std::map<gd::String, gd::InstructionMetadata>& GetAllActionsForObject(
621  gd::String objectType);
622 
626  std::map<gd::String, gd::InstructionMetadata>& GetAllConditionsForObject(
627  gd::String objectType);
628 
632  std::map<gd::String, gd::ExpressionMetadata>& GetAllExpressionsForObject(
633  gd::String objectType);
634 
638  std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressionsForObject(
639  gd::String objectType);
640 
644  std::map<gd::String, gd::InstructionMetadata>& GetAllActionsForBehavior(
645  gd::String autoType);
646 
650  std::map<gd::String, gd::InstructionMetadata>& GetAllConditionsForBehavior(
651  gd::String autoType);
652 
656  std::map<gd::String, gd::ExpressionMetadata>& GetAllExpressionsForBehavior(
657  gd::String autoType);
658 
662  std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressionsForBehavior(
663  gd::String autoType);
664 
670  std::map<gd::String, gd::PropertyDescriptor>& GetAllProperties() {
671  return extensionPropertiesMetadata;
672  }
673 
678  const std::map<gd::String, InstructionOrExpressionGroupMetadata>&
680  return instructionOrExpressionGroupMetadata;
681  }
682 
683  const std::vector<gd::InGameEditorResourceMetadata>& GetInGameEditorResources() const {
684  return inGameEditorResources;
685  }
687 
692  static gd::String GetNamespaceSeparator() { return "::"; }
693 
694  static gd::String GetEventsFunctionFullType(const gd::String& extensionName,
695  const gd::String& functionName);
696 
697  static gd::String GetBehaviorEventsFunctionFullType(
698  const gd::String& extensionName,
699  const gd::String& behaviorName,
700  const gd::String& functionName);
701 
702  static gd::String GetBehaviorFullType(const gd::String& extensionName,
703  const gd::String& behaviorName);
704 
705  static gd::String GetExtensionFromFullBehaviorType(const gd::String& type);
706 
707  static gd::String GetBehaviorNameFromFullBehaviorType(const gd::String& type);
708 
709  static gd::String GetObjectEventsFunctionFullType(
710  const gd::String& extensionName,
711  const gd::String& objectName,
712  const gd::String& functionName);
713 
714  static gd::String GetObjectFullType(const gd::String& extensionName,
715  const gd::String& objectName);
716 
717 static gd::String GetVariantFullType(const gd::String& extensionName,
718  const gd::String& objectName,
719  const gd::String& variantName);
720 
721  static gd::String GetExtensionFromFullObjectType(const gd::String& type);
722 
723  static gd::String GetObjectNameFromFullObjectType(const gd::String& type);
724 
732  static gd::String GetInstructionNameFromFullType(const gd::String& type);
733 
734  private:
739  void SetNameSpace(gd::String nameSpace_);
740 
741  gd::String name;
742  gd::String
743  nameSpace;
746  gd::String fullname;
747  gd::String informations;
748  gd::String shortDescription;
749  gd::String dimension;
750  gd::String category;
751  gd::String author;
752  gd::String license;
753  bool deprecated = false;
755  gd::String deprecationGDVersion;
756  gd::String helpPath;
758  gd::String iconUrl;
759  std::vector<gd::String> tags;
760 
761  std::map<gd::String, gd::ObjectMetadata> objectsInfos;
762  std::map<gd::String, gd::BehaviorMetadata> behaviorsInfo;
763  std::map<gd::String, gd::EffectMetadata> effectsMetadata;
764  std::map<gd::String, gd::InstructionMetadata> conditionsInfos;
765  std::map<gd::String, gd::InstructionMetadata> actionsInfos;
766  std::map<gd::String, gd::ExpressionMetadata> expressionsInfos;
767  std::map<gd::String, gd::ExpressionMetadata> strExpressionsInfos;
768  std::vector<gd::DependencyMetadata> extensionDependenciesMetadata;
769  std::vector<gd::SourceFileMetadata> extensionSourceFilesMetadata;
770  std::map<gd::String, gd::EventMetadata> eventsInfos;
771  std::map<gd::String, gd::PropertyDescriptor> extensionPropertiesMetadata;
772  std::map<gd::String, InstructionOrExpressionGroupMetadata>
773  instructionOrExpressionGroupMetadata;
774  std::vector<gd::InGameEditorResourceMetadata> inGameEditorResources;
775 
776  ObjectMetadata badObjectMetadata;
777  BehaviorMetadata badBehaviorMetadata;
778  EffectMetadata badEffectMetadata;
779  static std::map<gd::String, gd::InstructionMetadata>
780  badConditionsMetadata;
782  static std::map<gd::String, gd::InstructionMetadata>
783  badActionsMetadata;
785  static std::map<gd::String, gd::ExpressionMetadata>
786  badExpressionsMetadata;
788 };
789 
790 } // namespace gd
791 
795 #define GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION() \
796  compilationInfo.runtimeOnly = false; \
797  compilationInfo.sfmlMajorVersion = 2; \
798  compilationInfo.sfmlMinorVersion = 0; \
799  compilationInfo.gdCoreVersion = GD_VERSION_STRING; \
800  compilationInfo.sizeOfpInt = sizeof(int*); \
801  compilationInfo.gccMajorVersion = __GNUC__; \
802  compilationInfo.gccMinorVersion = __GNUC_MINOR__; \
803  compilationInfo.gccPatchLevel = __GNUC_PATCHLEVEL__; \
804  compilationInfo.informationCompleted = true;
805 
806 #include "GDCore/Extensions/PlatformExtension.inl"
Base class used to represents a behavior that can be applied to an object. It stores the content (i....
Definition: Behavior.h:24
Contains user-friendly information about a behavior type.
Definition: BehaviorMetadata.h:32
Base class for defining data shared by behaviors having the same type and name.
Definition: BehaviorsSharedData.h:24
Class used by gd::PlatformExtension to ensure that an extension is compiled against the right version...
Definition: PlatformExtension.h:52
Contains information about a dependency (library, npm/cordova package, or other according to the expo...
Definition: DependencyMetadata.h:20
Contains user-friendly information about an effect.
Definition: EffectMetadata.h:23
Describe an event provided by an extension of a platform.
Definition: EventMetadata.h:29
Describe user-friendly information about an expression, its parameters and the function name as well ...
Definition: ExpressionMetadata.h:47
Describe a resource to be used in the in-game editor.
Definition: InGameEditorResourceMetadata.h:14
Describe user-friendly information about an instruction (action or condition), its parameters and the...
Definition: InstructionMetadata.h:39
Contains information about how to display a group of instructions to the user.
Definition: InstructionOrExpressionGroupMetadata.h:14
A "composite" metadata that can be used to easily declare both an expression and a related condition ...
Definition: MultipleInstructionMetadata.h:24
Contains user-friendly information about an object type, and a function to create a new gd::Object of...
Definition: ObjectMetadata.h:38
Base class for implementing platform's extensions.
Definition: PlatformExtension.h:84
PlatformExtension & AddTag(const gd::String &tag)
Add a keyword that help search engines find this extension.
Definition: PlatformExtension.h:473
gd::PropertyDescriptor & RegisterProperty(const gd::String &name)
Adds a property to the extension.
Definition: PlatformExtension.h:366
const gd::String & GetDeprecationGDVersion()
Definition: PlatformExtension.h:486
const std::map< gd::String, InstructionOrExpressionGroupMetadata > & GetAllInstructionOrExpressionGroupMetadata() const
Get the metadata (icon, etc...) for groups used for instructions or expressions.
Definition: PlatformExtension.h:679
InGameEditorResourceMetadata & AddInGameEditorResource()
Declare a new resource to be used in the in-game editor.
Definition: PlatformExtension.h:389
const std::vector< gd::String > & GetTags() const
Return keywords that help search engines find this extension.
Definition: PlatformExtension.h:456
const gd::String & GetNameSpace()
Get the namespace of the extension.
Definition: PlatformExtension.h:495
const gd::String & GetName() const
Return the name of the extension.
Definition: PlatformExtension.h:409
const gd::String & GetCategory() const
Return the category of the extension.
Definition: PlatformExtension.h:414
PlatformExtension & SetTags(const gd::String &csvTags)
Set keywords that help search engines find this extension.
Definition: PlatformExtension.h:461
PlatformExtension & SetCategory(const gd::String &category_)
Set the category of the extension.
Definition: PlatformExtension.h:132
const gd::String & GetLicense() const
Return the name of extension license.
Definition: PlatformExtension.h:439
const gd::String & GetShortDescription() const
Return a short description of the extension, used by AI/LLM agents.
Definition: PlatformExtension.h:424
const gd::String & GetDimension() const
Return the dimension of the extension ("2D", "3D", "2D/3D" or empty).
Definition: PlatformExtension.h:429
InstructionOrExpressionGroupMetadata & AddInstructionOrExpressionGroupMetadata(const gd::String &name)
Add some metadata (icon, etc...) for a group used for instructions or expressions.
Definition: PlatformExtension.h:374
PlatformExtension & SetIconUrl(const gd::String &iconUrl_)
Set the URL of the extension icon.
Definition: PlatformExtension.h:108
PlatformExtension & SetDimension(const gd::String &dimension_)
Set the dimension of the extension ("2D", "3D", "2D/3D" or empty).
Definition: PlatformExtension.h:124
const gd::String & GetAuthor() const
Return the name of the extension developer.
Definition: PlatformExtension.h:434
PlatformExtension & SetShortDescription(const gd::String &shortDescription_)
Set a short description for the extension, used by AI/LLM agents.
Definition: PlatformExtension.h:116
bool IsDeprecated() const
Check if the extension is flagged as being deprecated.
Definition: PlatformExtension.h:481
std::map< gd::String, gd::PropertyDescriptor > & GetAllProperties()
Get all the properties of the extension. Properties are shown in the game properties in the editor,...
Definition: PlatformExtension.h:670
const gd::String & GetHelpPath() const
Return the help path of extension, relative to the GDevelop documentation root.
Definition: PlatformExtension.h:445
const gd::String & GetIconUrl() const
Return the URL to the icon to be displayed for this extension.
Definition: PlatformExtension.h:451
const gd::String & GetFullName() const
Return the name extension user friendly name.
Definition: PlatformExtension.h:404
PlatformExtension & MarkAsDeprecatedSince(const gd::String &version)
Mark this extension as deprecated: the IDE will hide it from users in new projects.
Definition: PlatformExtension.h:154
static gd::String GetNamespaceSeparator()
Get the string used to separate the name of the instruction/expression and the extension.
Definition: PlatformExtension.h:692
PlatformExtension & SetExtensionHelpPath(const gd::String &helpPath_)
Set the path to the help, relative to the GDevelop documentation root. For example,...
Definition: PlatformExtension.h:145
const gd::String & GetDescription() const
Return a description of the extension.
Definition: PlatformExtension.h:419
Used to describe a property shown in a property grid.
Definition: PropertyDescriptor.h:38
Contains information about a source file that must be included when an extension is used.
Definition: SourceFileMetadata.h:15
String represents an UTF8 encoded string.
Definition: String.h:33
std::vector< String > Split(value_type delimiter) const
Split the string with a delimiter.
Definition: String.cpp:361
Definition: CommonTools.h:24
Definition: PlatformExtension.h:75