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 
154  void MarkAsDeprecated() { deprecated = true; }
155 
157 
162 
166  gd::InstructionMetadata& AddCondition(const gd::String& name_,
167  const gd::String& fullname_,
168  const gd::String& description_,
169  const gd::String& sentence_,
170  const gd::String& group_,
171  const gd::String& icon_,
172  const gd::String& smallicon_);
173 
177  gd::InstructionMetadata& AddAction(const gd::String& name_,
178  const gd::String& fullname_,
179  const gd::String& description_,
180  const gd::String& sentence_,
181  const gd::String& group_,
182  const gd::String& icon_,
183  const gd::String& smallicon_);
187  gd::ExpressionMetadata& AddExpression(const gd::String& name_,
188  const gd::String& fullname_,
189  const gd::String& description_,
190  const gd::String& group_,
191  const gd::String& smallicon_);
195  gd::ExpressionMetadata& AddStrExpression(const gd::String& name_,
196  const gd::String& fullname_,
197  const gd::String& description_,
198  const gd::String& group_,
199  const gd::String& smallicon_);
200 
207  gd::MultipleInstructionMetadata AddExpressionAndCondition(
208  const gd::String& type,
209  const gd::String& name,
210  const gd::String& fullname,
211  const gd::String& description,
212  const gd::String& sentenceName,
213  const gd::String& group,
214  const gd::String& icon);
215 
224  gd::MultipleInstructionMetadata AddExpressionAndConditionAndAction(
225  const gd::String& type,
226  const gd::String& name,
227  const gd::String& fullname,
228  const gd::String& description,
229  const gd::String& sentenceName,
230  const gd::String& group,
231  const gd::String& icon);
232 
233  gd::DependencyMetadata& AddDependency();
234  gd::SourceFileMetadata& AddSourceFile();
235 
244  template <class T>
245  gd::ObjectMetadata& AddObject(const gd::String& name_,
246  const gd::String& fullname_,
247  const gd::String& description_,
248  const gd::String& icon_);
249 
259  gd::ObjectMetadata& AddObject(
260  const gd::String& name_,
261  const gd::String& fullname_,
262  const gd::String& description_,
263  const gd::String& icon_,
264  std::shared_ptr<gd::ObjectConfiguration> instance);
265 
274  gd::ObjectMetadata& AddEventsBasedObject(const gd::String& name_,
275  const gd::String& fullname_,
276  const gd::String& description_,
277  const gd::String& icon_);
278 
294  gd::BehaviorMetadata& AddBehavior(
295  const gd::String& name_,
296  const gd::String& fullname_,
297  const gd::String& defaultName_,
298  const gd::String& description_,
299  const gd::String& group_,
300  const gd::String& icon_,
301  const gd::String& className_,
302  std::shared_ptr<gd::Behavior> instance,
303  std::shared_ptr<gd::BehaviorsSharedData> sharedDatasInstance);
304 
309  gd::EffectMetadata& AddEffect(const gd::String& name_);
310 
314  gd::EventMetadata& AddEvent(const gd::String& name_,
315  const gd::String& fullname_,
316  const gd::String& description_,
317  const gd::String& group_,
318  const gd::String& smallicon_,
319  std::shared_ptr<gd::BaseEvent> instance);
320 
327  gd::InstructionMetadata& AddDuplicatedAction(
328  const gd::String& newActionName, const gd::String& copiedActionName);
335  gd::InstructionMetadata& AddDuplicatedCondition(
336  const gd::String& newConditionName,
337  const gd::String& copiedConditionName,
338  gd::DuplicatedInstructionOptions options = {.unscoped = false});
345  gd::ExpressionMetadata& AddDuplicatedExpression(
346  const gd::String& newExpressionName,
347  const gd::String& copiedExpressionName);
355  gd::ExpressionMetadata& AddDuplicatedStrExpression(
356  const gd::String& newExpressionName,
357  const gd::String& copiedExpressionName);
358 
363  return extensionPropertiesMetadata[name];
364  };
365 
371  const gd::String& name) {
372  return instructionOrExpressionGroupMetadata[name];
373  }
374 
379  void StripUnimplementedInstructionsAndExpressions();
380 
381 
386  InGameEditorResourceMetadata newInGameEditorResource;
387  inGameEditorResources.push_back(newInGameEditorResource);
388  return inGameEditorResources.back();
389  }
391 
396 
400  const gd::String& GetFullName() const { return fullname; }
401 
405  const gd::String& GetName() const { return name; }
406 
410  const gd::String& GetCategory() const { return category; }
411 
415  const gd::String& GetDescription() const { return informations; }
416 
420  const gd::String& GetShortDescription() const { return shortDescription; }
421 
425  const gd::String& GetDimension() const { return dimension; }
426 
430  const gd::String& GetAuthor() const { return author; }
431 
435  const gd::String& GetLicense() const { return license; }
436 
441  const gd::String& GetHelpPath() const { return helpPath; }
442 
447  const gd::String& GetIconUrl() const { return iconUrl; }
448 
452  const std::vector<gd::String>& GetTags() const { return tags; }
453 
458  tags.clear();
459  tags = csvTags.Split(',');
460  for (size_t i = 0; i < tags.size(); i++) {
461  tags[i] = tags[i].Trim().LowerCase();
462  }
463  return *this;
464  }
465 
470  tags.push_back(tag);
471  return *this;
472  }
473 
477  bool IsDeprecated() const { return deprecated; }
478 
484  const gd::String& GetNameSpace() { return nameSpace; };
485 
490  std::vector<gd::String> GetExtensionObjectsTypes() const;
491 
496  std::vector<gd::String> GetBehaviorsTypes() const;
497 
502  CreateFunPtr GetObjectCreationFunctionPtr(const gd::String& objectType) const;
503 
508  std::vector<gd::String> GetExtensionEffectTypes() const;
509 
515  std::shared_ptr<gd::BaseEvent> CreateEvent(const gd::String& eventType) const;
521  gd::Behavior* GetBehavior(const gd::String& behaviorType) const;
522 
529  gd::BehaviorsSharedData* GetBehaviorSharedDatas(
530  const gd::String& behaviorType) const;
531 
536  ObjectMetadata& GetObjectMetadata(const gd::String& objectType);
537 
542  BehaviorMetadata& GetBehaviorMetadata(const gd::String& behaviorType);
543 
548  bool HasBehavior(const gd::String& behaviorType) const;
549 
553  EffectMetadata& GetEffectMetadata(const gd::String& effectName);
554 
558  std::map<gd::String, gd::EventMetadata>& GetAllEvents();
559 
564  std::map<gd::String, gd::InstructionMetadata>& GetAllActions();
565 
569  std::map<gd::String, gd::InstructionMetadata>& GetAllConditions();
570 
574  std::map<gd::String, gd::ExpressionMetadata>& GetAllExpressions();
575 
579  std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressions();
580 
585  std::vector<gd::DependencyMetadata>& GetAllDependencies();
586 
591  const std::vector<gd::DependencyMetadata>& GetAllDependencies() const;
592 
597  std::vector<gd::SourceFileMetadata>& GetAllSourceFiles();
598 
603  const std::vector<gd::SourceFileMetadata>& GetAllSourceFiles() const;
604 
609  std::map<gd::String, gd::InstructionMetadata>& GetAllActionsForObject(
610  gd::String objectType);
611 
615  std::map<gd::String, gd::InstructionMetadata>& GetAllConditionsForObject(
616  gd::String objectType);
617 
621  std::map<gd::String, gd::ExpressionMetadata>& GetAllExpressionsForObject(
622  gd::String objectType);
623 
627  std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressionsForObject(
628  gd::String objectType);
629 
633  std::map<gd::String, gd::InstructionMetadata>& GetAllActionsForBehavior(
634  gd::String autoType);
635 
639  std::map<gd::String, gd::InstructionMetadata>& GetAllConditionsForBehavior(
640  gd::String autoType);
641 
645  std::map<gd::String, gd::ExpressionMetadata>& GetAllExpressionsForBehavior(
646  gd::String autoType);
647 
651  std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressionsForBehavior(
652  gd::String autoType);
653 
659  std::map<gd::String, gd::PropertyDescriptor>& GetAllProperties() {
660  return extensionPropertiesMetadata;
661  }
662 
667  const std::map<gd::String, InstructionOrExpressionGroupMetadata>&
669  return instructionOrExpressionGroupMetadata;
670  }
671 
672  const std::vector<gd::InGameEditorResourceMetadata>& GetInGameEditorResources() const {
673  return inGameEditorResources;
674  }
676 
681  static gd::String GetNamespaceSeparator() { return "::"; }
682 
683  static gd::String GetEventsFunctionFullType(const gd::String& extensionName,
684  const gd::String& functionName);
685 
686  static gd::String GetBehaviorEventsFunctionFullType(
687  const gd::String& extensionName,
688  const gd::String& behaviorName,
689  const gd::String& functionName);
690 
691  static gd::String GetBehaviorFullType(const gd::String& extensionName,
692  const gd::String& behaviorName);
693 
694  static gd::String GetExtensionFromFullBehaviorType(const gd::String& type);
695 
696  static gd::String GetBehaviorNameFromFullBehaviorType(const gd::String& type);
697 
698  static gd::String GetObjectEventsFunctionFullType(
699  const gd::String& extensionName,
700  const gd::String& objectName,
701  const gd::String& functionName);
702 
703  static gd::String GetObjectFullType(const gd::String& extensionName,
704  const gd::String& objectName);
705 
706 static gd::String GetVariantFullType(const gd::String& extensionName,
707  const gd::String& objectName,
708  const gd::String& variantName);
709 
710  static gd::String GetExtensionFromFullObjectType(const gd::String& type);
711 
712  static gd::String GetObjectNameFromFullObjectType(const gd::String& type);
713 
714  private:
719  void SetNameSpace(gd::String nameSpace_);
720 
721  gd::String name;
722  gd::String
723  nameSpace;
726  gd::String fullname;
727  gd::String informations;
728  gd::String shortDescription;
729  gd::String dimension;
730  gd::String category;
731  gd::String author;
732  gd::String license;
733  bool deprecated;
735  gd::String helpPath;
737  gd::String iconUrl;
738  std::vector<gd::String> tags;
739 
740  std::map<gd::String, gd::ObjectMetadata> objectsInfos;
741  std::map<gd::String, gd::BehaviorMetadata> behaviorsInfo;
742  std::map<gd::String, gd::EffectMetadata> effectsMetadata;
743  std::map<gd::String, gd::InstructionMetadata> conditionsInfos;
744  std::map<gd::String, gd::InstructionMetadata> actionsInfos;
745  std::map<gd::String, gd::ExpressionMetadata> expressionsInfos;
746  std::map<gd::String, gd::ExpressionMetadata> strExpressionsInfos;
747  std::vector<gd::DependencyMetadata> extensionDependenciesMetadata;
748  std::vector<gd::SourceFileMetadata> extensionSourceFilesMetadata;
749  std::map<gd::String, gd::EventMetadata> eventsInfos;
750  std::map<gd::String, gd::PropertyDescriptor> extensionPropertiesMetadata;
751  std::map<gd::String, InstructionOrExpressionGroupMetadata>
752  instructionOrExpressionGroupMetadata;
753  std::vector<gd::InGameEditorResourceMetadata> inGameEditorResources;
754 
755  ObjectMetadata badObjectMetadata;
756  BehaviorMetadata badBehaviorMetadata;
757  EffectMetadata badEffectMetadata;
758  static std::map<gd::String, gd::InstructionMetadata>
759  badConditionsMetadata;
761  static std::map<gd::String, gd::InstructionMetadata>
762  badActionsMetadata;
764  static std::map<gd::String, gd::ExpressionMetadata>
765  badExpressionsMetadata;
767 };
768 
769 } // namespace gd
770 
774 #define GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION() \
775  compilationInfo.runtimeOnly = false; \
776  compilationInfo.sfmlMajorVersion = 2; \
777  compilationInfo.sfmlMinorVersion = 0; \
778  compilationInfo.gdCoreVersion = GD_VERSION_STRING; \
779  compilationInfo.sizeOfpInt = sizeof(int*); \
780  compilationInfo.gccMajorVersion = __GNUC__; \
781  compilationInfo.gccMinorVersion = __GNUC_MINOR__; \
782  compilationInfo.gccPatchLevel = __GNUC_PATCHLEVEL__; \
783  compilationInfo.informationCompleted = true;
784 
785 #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:23
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:23
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:469
gd::PropertyDescriptor & RegisterProperty(const gd::String &name)
Adds a property to the extension.
Definition: PlatformExtension.h:362
const std::map< gd::String, InstructionOrExpressionGroupMetadata > & GetAllInstructionOrExpressionGroupMetadata() const
Get the metadata (icon, etc...) for groups used for instructions or expressions.
Definition: PlatformExtension.h:668
InGameEditorResourceMetadata & AddInGameEditorResource()
Declare a new resource to be used in the in-game editor.
Definition: PlatformExtension.h:385
const std::vector< gd::String > & GetTags() const
Return keywords that help search engines find this extension.
Definition: PlatformExtension.h:452
const gd::String & GetNameSpace()
Get the namespace of the extension.
Definition: PlatformExtension.h:484
const gd::String & GetName() const
Return the name of the extension.
Definition: PlatformExtension.h:405
const gd::String & GetCategory() const
Return the category of the extension.
Definition: PlatformExtension.h:410
PlatformExtension & SetTags(const gd::String &csvTags)
Set keywords that help search engines find this extension.
Definition: PlatformExtension.h:457
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:435
void MarkAsDeprecated()
Mark this extension as deprecated: the IDE will hide it from the user.
Definition: PlatformExtension.h:154
const gd::String & GetShortDescription() const
Return a short description of the extension, used by AI/LLM agents.
Definition: PlatformExtension.h:420
const gd::String & GetDimension() const
Return the dimension of the extension ("2D", "3D", "2D/3D" or empty).
Definition: PlatformExtension.h:425
InstructionOrExpressionGroupMetadata & AddInstructionOrExpressionGroupMetadata(const gd::String &name)
Add some metadata (icon, etc...) for a group used for instructions or expressions.
Definition: PlatformExtension.h:370
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:430
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:477
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:659
const gd::String & GetHelpPath() const
Return the help path of extension, relative to the GDevelop documentation root.
Definition: PlatformExtension.h:441
const gd::String & GetIconUrl() const
Return the URL to the icon to be displayed for this extension.
Definition: PlatformExtension.h:447
const gd::String & GetFullName() const
Return the name extension user friendly name.
Definition: PlatformExtension.h:400
static gd::String GetNamespaceSeparator()
Get the string used to separate the name of the instruction/expression and the extension.
Definition: PlatformExtension.h:681
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:415
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:358
Definition: CommonTools.h:24
Definition: PlatformExtension.h:75