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 
117  category = category_;
118  return *this;
119  }
120 
130  helpPath = helpPath_;
131  return *this;
132  }
133 
138  void MarkAsDeprecated() { deprecated = true; }
139 
141 
146 
150  gd::InstructionMetadata& AddCondition(const gd::String& name_,
151  const gd::String& fullname_,
152  const gd::String& description_,
153  const gd::String& sentence_,
154  const gd::String& group_,
155  const gd::String& icon_,
156  const gd::String& smallicon_);
157 
161  gd::InstructionMetadata& AddAction(const gd::String& name_,
162  const gd::String& fullname_,
163  const gd::String& description_,
164  const gd::String& sentence_,
165  const gd::String& group_,
166  const gd::String& icon_,
167  const gd::String& smallicon_);
171  gd::ExpressionMetadata& AddExpression(const gd::String& name_,
172  const gd::String& fullname_,
173  const gd::String& description_,
174  const gd::String& group_,
175  const gd::String& smallicon_);
179  gd::ExpressionMetadata& AddStrExpression(const gd::String& name_,
180  const gd::String& fullname_,
181  const gd::String& description_,
182  const gd::String& group_,
183  const gd::String& smallicon_);
184 
191  gd::MultipleInstructionMetadata AddExpressionAndCondition(
192  const gd::String& type,
193  const gd::String& name,
194  const gd::String& fullname,
195  const gd::String& description,
196  const gd::String& sentenceName,
197  const gd::String& group,
198  const gd::String& icon);
199 
208  gd::MultipleInstructionMetadata AddExpressionAndConditionAndAction(
209  const gd::String& type,
210  const gd::String& name,
211  const gd::String& fullname,
212  const gd::String& description,
213  const gd::String& sentenceName,
214  const gd::String& group,
215  const gd::String& icon);
216 
217  gd::DependencyMetadata& AddDependency();
218  gd::SourceFileMetadata& AddSourceFile();
219 
228  template <class T>
229  gd::ObjectMetadata& AddObject(const gd::String& name_,
230  const gd::String& fullname_,
231  const gd::String& description_,
232  const gd::String& icon_);
233 
243  gd::ObjectMetadata& AddObject(
244  const gd::String& name_,
245  const gd::String& fullname_,
246  const gd::String& description_,
247  const gd::String& icon_,
248  std::shared_ptr<gd::ObjectConfiguration> instance);
249 
258  gd::ObjectMetadata& AddEventsBasedObject(const gd::String& name_,
259  const gd::String& fullname_,
260  const gd::String& description_,
261  const gd::String& icon_);
262 
278  gd::BehaviorMetadata& AddBehavior(
279  const gd::String& name_,
280  const gd::String& fullname_,
281  const gd::String& defaultName_,
282  const gd::String& description_,
283  const gd::String& group_,
284  const gd::String& icon_,
285  const gd::String& className_,
286  std::shared_ptr<gd::Behavior> instance,
287  std::shared_ptr<gd::BehaviorsSharedData> sharedDatasInstance);
288 
293  gd::EffectMetadata& AddEffect(const gd::String& name_);
294 
298  gd::EventMetadata& AddEvent(const gd::String& name_,
299  const gd::String& fullname_,
300  const gd::String& description_,
301  const gd::String& group_,
302  const gd::String& smallicon_,
303  std::shared_ptr<gd::BaseEvent> instance);
304 
311  gd::InstructionMetadata& AddDuplicatedAction(
312  const gd::String& newActionName, const gd::String& copiedActionName);
319  gd::InstructionMetadata& AddDuplicatedCondition(
320  const gd::String& newConditionName,
321  const gd::String& copiedConditionName,
322  gd::DuplicatedInstructionOptions options = {.unscoped = false});
329  gd::ExpressionMetadata& AddDuplicatedExpression(
330  const gd::String& newExpressionName,
331  const gd::String& copiedExpressionName);
339  gd::ExpressionMetadata& AddDuplicatedStrExpression(
340  const gd::String& newExpressionName,
341  const gd::String& copiedExpressionName);
342 
347  return extensionPropertiesMetadata[name];
348  };
349 
355  const gd::String& name) {
356  return instructionOrExpressionGroupMetadata[name];
357  }
358 
363  void StripUnimplementedInstructionsAndExpressions();
364 
365 
370  InGameEditorResourceMetadata newInGameEditorResource;
371  inGameEditorResources.push_back(newInGameEditorResource);
372  return inGameEditorResources.back();
373  }
375 
380 
384  const gd::String& GetFullName() const { return fullname; }
385 
389  const gd::String& GetName() const { return name; }
390 
394  const gd::String& GetCategory() const { return category; }
395 
399  const gd::String& GetDescription() const { return informations; }
400 
404  const gd::String& GetAuthor() const { return author; }
405 
409  const gd::String& GetLicense() const { return license; }
410 
415  const gd::String& GetHelpPath() const { return helpPath; }
416 
421  const gd::String& GetIconUrl() const { return iconUrl; }
422 
426  const std::vector<gd::String>& GetTags() const { return tags; }
427 
432  tags.clear();
433  tags = csvTags.Split(',');
434  for (size_t i = 0; i < tags.size(); i++) {
435  tags[i] = tags[i].Trim().LowerCase();
436  }
437  return *this;
438  }
439 
444  tags.push_back(tag);
445  return *this;
446  }
447 
451  bool IsDeprecated() const { return deprecated; }
452 
458  const gd::String& GetNameSpace() { return nameSpace; };
459 
464  std::vector<gd::String> GetExtensionObjectsTypes() const;
465 
470  std::vector<gd::String> GetBehaviorsTypes() const;
471 
476  CreateFunPtr GetObjectCreationFunctionPtr(const gd::String& objectType) const;
477 
482  std::vector<gd::String> GetExtensionEffectTypes() const;
483 
489  std::shared_ptr<gd::BaseEvent> CreateEvent(const gd::String& eventType) const;
495  gd::Behavior* GetBehavior(const gd::String& behaviorType) const;
496 
503  gd::BehaviorsSharedData* GetBehaviorSharedDatas(
504  const gd::String& behaviorType) const;
505 
510  ObjectMetadata& GetObjectMetadata(const gd::String& objectType);
511 
516  BehaviorMetadata& GetBehaviorMetadata(const gd::String& behaviorType);
517 
522  bool HasBehavior(const gd::String& behaviorType) const;
523 
527  EffectMetadata& GetEffectMetadata(const gd::String& effectName);
528 
532  std::map<gd::String, gd::EventMetadata>& GetAllEvents();
533 
538  std::map<gd::String, gd::InstructionMetadata>& GetAllActions();
539 
543  std::map<gd::String, gd::InstructionMetadata>& GetAllConditions();
544 
548  std::map<gd::String, gd::ExpressionMetadata>& GetAllExpressions();
549 
553  std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressions();
554 
559  std::vector<gd::DependencyMetadata>& GetAllDependencies();
560 
565  const std::vector<gd::DependencyMetadata>& GetAllDependencies() const;
566 
571  std::vector<gd::SourceFileMetadata>& GetAllSourceFiles();
572 
577  const std::vector<gd::SourceFileMetadata>& GetAllSourceFiles() const;
578 
583  std::map<gd::String, gd::InstructionMetadata>& GetAllActionsForObject(
584  gd::String objectType);
585 
589  std::map<gd::String, gd::InstructionMetadata>& GetAllConditionsForObject(
590  gd::String objectType);
591 
595  std::map<gd::String, gd::ExpressionMetadata>& GetAllExpressionsForObject(
596  gd::String objectType);
597 
601  std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressionsForObject(
602  gd::String objectType);
603 
607  std::map<gd::String, gd::InstructionMetadata>& GetAllActionsForBehavior(
608  gd::String autoType);
609 
613  std::map<gd::String, gd::InstructionMetadata>& GetAllConditionsForBehavior(
614  gd::String autoType);
615 
619  std::map<gd::String, gd::ExpressionMetadata>& GetAllExpressionsForBehavior(
620  gd::String autoType);
621 
625  std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressionsForBehavior(
626  gd::String autoType);
627 
633  std::map<gd::String, gd::PropertyDescriptor>& GetAllProperties() {
634  return extensionPropertiesMetadata;
635  }
636 
641  const std::map<gd::String, InstructionOrExpressionGroupMetadata>&
643  return instructionOrExpressionGroupMetadata;
644  }
645 
646  const std::vector<gd::InGameEditorResourceMetadata>& GetInGameEditorResources() const {
647  return inGameEditorResources;
648  }
650 
655  static gd::String GetNamespaceSeparator() { return "::"; }
656 
657  static gd::String GetEventsFunctionFullType(const gd::String& extensionName,
658  const gd::String& functionName);
659 
660  static gd::String GetBehaviorEventsFunctionFullType(
661  const gd::String& extensionName,
662  const gd::String& behaviorName,
663  const gd::String& functionName);
664 
665  static gd::String GetBehaviorFullType(const gd::String& extensionName,
666  const gd::String& behaviorName);
667 
668  static gd::String GetExtensionFromFullBehaviorType(const gd::String& type);
669 
670  static gd::String GetBehaviorNameFromFullBehaviorType(const gd::String& type);
671 
672  static gd::String GetObjectEventsFunctionFullType(
673  const gd::String& extensionName,
674  const gd::String& objectName,
675  const gd::String& functionName);
676 
677  static gd::String GetObjectFullType(const gd::String& extensionName,
678  const gd::String& objectName);
679 
680 static gd::String GetVariantFullType(const gd::String& extensionName,
681  const gd::String& objectName,
682  const gd::String& variantName);
683 
684  static gd::String GetExtensionFromFullObjectType(const gd::String& type);
685 
686  static gd::String GetObjectNameFromFullObjectType(const gd::String& type);
687 
688  private:
693  void SetNameSpace(gd::String nameSpace_);
694 
695  gd::String name;
696  gd::String
697  nameSpace;
700  gd::String fullname;
701  gd::String informations;
702  gd::String category;
703  gd::String author;
704  gd::String license;
705  bool deprecated;
707  gd::String helpPath;
709  gd::String iconUrl;
710  std::vector<gd::String> tags;
711 
712  std::map<gd::String, gd::ObjectMetadata> objectsInfos;
713  std::map<gd::String, gd::BehaviorMetadata> behaviorsInfo;
714  std::map<gd::String, gd::EffectMetadata> effectsMetadata;
715  std::map<gd::String, gd::InstructionMetadata> conditionsInfos;
716  std::map<gd::String, gd::InstructionMetadata> actionsInfos;
717  std::map<gd::String, gd::ExpressionMetadata> expressionsInfos;
718  std::map<gd::String, gd::ExpressionMetadata> strExpressionsInfos;
719  std::vector<gd::DependencyMetadata> extensionDependenciesMetadata;
720  std::vector<gd::SourceFileMetadata> extensionSourceFilesMetadata;
721  std::map<gd::String, gd::EventMetadata> eventsInfos;
722  std::map<gd::String, gd::PropertyDescriptor> extensionPropertiesMetadata;
723  std::map<gd::String, InstructionOrExpressionGroupMetadata>
724  instructionOrExpressionGroupMetadata;
725  std::vector<gd::InGameEditorResourceMetadata> inGameEditorResources;
726 
727  ObjectMetadata badObjectMetadata;
728  BehaviorMetadata badBehaviorMetadata;
729  EffectMetadata badEffectMetadata;
730  static std::map<gd::String, gd::InstructionMetadata>
731  badConditionsMetadata;
733  static std::map<gd::String, gd::InstructionMetadata>
734  badActionsMetadata;
736  static std::map<gd::String, gd::ExpressionMetadata>
737  badExpressionsMetadata;
739 };
740 
741 } // namespace gd
742 
746 #define GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION() \
747  compilationInfo.runtimeOnly = false; \
748  compilationInfo.sfmlMajorVersion = 2; \
749  compilationInfo.sfmlMinorVersion = 0; \
750  compilationInfo.gdCoreVersion = GD_VERSION_STRING; \
751  compilationInfo.sizeOfpInt = sizeof(int*); \
752  compilationInfo.gccMajorVersion = __GNUC__; \
753  compilationInfo.gccMinorVersion = __GNUC_MINOR__; \
754  compilationInfo.gccPatchLevel = __GNUC_PATCHLEVEL__; \
755  compilationInfo.informationCompleted = true;
756 
757 #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:443
gd::PropertyDescriptor & RegisterProperty(const gd::String &name)
Adds a property to the extension.
Definition: PlatformExtension.h:346
const std::map< gd::String, InstructionOrExpressionGroupMetadata > & GetAllInstructionOrExpressionGroupMetadata() const
Get the metadata (icon, etc...) for groups used for instructions or expressions.
Definition: PlatformExtension.h:642
InGameEditorResourceMetadata & AddInGameEditorResource()
Declare a new resource to be used in the in-game editor.
Definition: PlatformExtension.h:369
const std::vector< gd::String > & GetTags() const
Return keywords that help search engines find this extension.
Definition: PlatformExtension.h:426
const gd::String & GetNameSpace()
Get the namespace of the extension.
Definition: PlatformExtension.h:458
const gd::String & GetName() const
Return the name of the extension.
Definition: PlatformExtension.h:389
const gd::String & GetCategory() const
Return the category of the extension.
Definition: PlatformExtension.h:394
PlatformExtension & SetTags(const gd::String &csvTags)
Set keywords that help search engines find this extension.
Definition: PlatformExtension.h:431
PlatformExtension & SetCategory(const gd::String &category_)
Set the category of the extension.
Definition: PlatformExtension.h:116
const gd::String & GetLicense() const
Return the name of extension license.
Definition: PlatformExtension.h:409
void MarkAsDeprecated()
Mark this extension as deprecated: the IDE will hide it from the user.
Definition: PlatformExtension.h:138
InstructionOrExpressionGroupMetadata & AddInstructionOrExpressionGroupMetadata(const gd::String &name)
Add some metadata (icon, etc...) for a group used for instructions or expressions.
Definition: PlatformExtension.h:354
PlatformExtension & SetIconUrl(const gd::String &iconUrl_)
Set the URL of the extension icon.
Definition: PlatformExtension.h:108
const gd::String & GetAuthor() const
Return the name of the extension developer.
Definition: PlatformExtension.h:404
bool IsDeprecated() const
Check if the extension is flagged as being deprecated.
Definition: PlatformExtension.h:451
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:633
const gd::String & GetHelpPath() const
Return the help path of extension, relative to the GDevelop documentation root.
Definition: PlatformExtension.h:415
const gd::String & GetIconUrl() const
Return the URL to the icon to be displayed for this extension.
Definition: PlatformExtension.h:421
const gd::String & GetFullName() const
Return the name extension user friendly name.
Definition: PlatformExtension.h:384
static gd::String GetNamespaceSeparator()
Get the string used to separate the name of the instruction/expression and the extension.
Definition: PlatformExtension.h:655
PlatformExtension & SetExtensionHelpPath(const gd::String &helpPath_)
Set the path to the help, relative to the GDevelop documentation root. For example,...
Definition: PlatformExtension.h:129
const gd::String & GetDescription() const
Return a description of the extension.
Definition: PlatformExtension.h:399
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