Compare commits

...

120 Commits

Author SHA1 Message Date
Davy Hélard
e36d6018cb Typo 2022-04-15 21:19:36 +02:00
Davy Hélard
c0665dbba0 Hide advanced parameters and properties from beginners. 2022-04-15 20:54:09 +02:00
github-actions[bot]
860e9d36e4 Update translations [skip ci] (#3808)
Co-authored-by: fannieyan <fannieyan@users.noreply.github.com>
2022-04-14 11:40:38 +02:00
Fannie Yan
c8b461cc5f Merge game management buttons in games dashboard (#3826)
* Merge game management button into one in Games dashboard
2022-04-14 10:51:48 +02:00
AlexandreS
36cdc5720a Bump newIDE version 2022-04-14 10:47:33 +02:00
AlexandreS
a7cd53b921 Add built-in leaderboard feature (actions, conditions, administration) (#3759) 2022-04-14 10:25:48 +02:00
D8H
01a25400ff New touch event functions that allow to get them several times (#3820)
* It allows extensions to handle touch events without conflicting with the scene event sheets.
* Existing touch functions continue to work and can be used alongside new ones without any issue.
2022-04-13 12:00:33 +02:00
D8H
2b484c0cf1 The url slug of a game can be verified and changed right before publication (#3811) 2022-04-12 20:39:34 +02:00
Fannie Yan
13204e4b53 Add a button "Access public profile" in one's profile details (#3819)
Add a button in profile details that opens the user's public profile on Liluo.io
2022-04-11 14:41:08 +02:00
D8H
c6d6466d54 Fix the input checkboxes "Playable with [...]" randomly checked when publishing a game for the first time (#3818) 2022-04-08 11:45:20 +01:00
Clément Pasteau
6cf737ac70 Remove unused imports (#3809)
Do not show in changelog
2022-04-06 15:00:04 +02:00
Arthur Pacaud
5b8cdbbace Update the button label in the dialog of an extension to show if the extension will be updated or (re)installed (#3777) 2022-04-06 13:47:36 +01:00
Clément Pasteau
a7df37a0dc Bump version to 131 (#3807) 2022-04-06 14:47:20 +02:00
D8H
7721f56dde Allow to specify a slug to be used in liluo.io games URL
* From the Game Details Dashboard, you can now select a username and a game name to create a custom unique URL for your game on Liluo.io, which can look like this: liluo.io/your-username/your-game-name
2022-04-06 14:35:50 +02:00
github-actions[bot]
08ada4f595 Update translations [skip ci] (#3764) 2022-04-06 13:21:28 +01:00
D8H
caa46a2fb0 Allow to define a default value for a "string with options" property (#3803) 2022-04-06 09:49:50 +02:00
D8H
660cdd753c [TopDownMovement] Add a condition to check which key was used or simulated and actions to change the current velocity (#3800) 2022-04-05 19:32:31 +02:00
D8H
3b9a1354ee [TopDownMovement] Fix the velocity value that wasn't exactly 0 when moving horizontally or vertically (#3799) 2022-04-04 23:47:17 +02:00
D8H
02fce4132a Add a condition to check if the mouse is inside the window. (#3787) 2022-04-01 12:01:53 +02:00
D8H
41241d75e1 Fix the camera rounding to work when following objects with even dimensions and pixel perfect mode is enabled (#3789) 2022-04-01 12:00:47 +02:00
Clément Pasteau
fc3e73f360 Rework the Game publishing on Liluo
* Display a summary of the Game that will be published when pushing a new build
* Add a helper message to change the game thumbnail
* Add option to save project by default when publishing to Liluo.io
* Allow defining if your game should be discoverable on Liluo.io or not
2022-04-01 10:50:05 +02:00
Florian Rival
230493039c Display an icon for the Home tab (instead of the label "Home") (#3792) 2022-04-01 09:40:22 +01:00
Florian Rival
50326e4d21 Add missing Text Input to the web-app (#3785)
Don't show in changelog
2022-03-29 13:17:44 +02:00
Florian Rival
cec7960a7d Add slug to ExampleShortHeader and Example type
Don't show in changelog
2022-03-28 16:22:49 +02:00
Florian Rival
cec901d4c2 Fix npm not installing git:// dependencies (#3780)
Don't show in changelog
2022-03-28 14:55:01 +02:00
Florian Rival
29f0567140 Add Linux zip and deb target to the packaged desktop app (#3776)
Only show in developer changelog
2022-03-27 12:55:50 +02:00
Clément Pasteau
94af33c815 Switch game metrics from live ones to cached ones for performance
Do not show in changelog
2022-03-25 14:19:14 +01:00
Florian Rival
3ad7585f92 Add a linter rule to avoid importing prop-types
Don't show in changelog
2022-03-24 11:48:07 +01:00
AlexandreS
acb69c447d Improve events sheet search with new shortcuts and put back the "Edit variable" row in variable editor 2022-03-23 15:40:57 +01:00
Elairyx
fa928b35cb Add autocompletion for the "Simulate control" action of the Top Down movement behavior (#3767) 2022-03-21 23:15:02 +01:00
Florian Rival
67810b79ce Refactor some redundant code in Text Input tests (#3768)
Don't show in changelog
2022-03-21 23:08:54 +01:00
Clément Pasteau
0a77e0264d Bump version to 5.0.130 2022-03-21 11:53:52 +01:00
Clément Pasteau
4cc8d15f4b Fix invalid game thumbnail URL 2022-03-21 11:42:36 +01:00
Clément Pasteau
a2f0b3384e Bump newIDE version to 5.0.129 2022-03-17 14:57:32 +01:00
github-actions[bot]
432ffebf80 Update translations [skip ci] (#3695)
Co-authored-by: Bouh <Bouh@users.noreply.github.com>
2022-03-17 14:40:24 +01:00
Aurélien Vivet
165470d9c1 Add D as shortcut to toggle disabled event, also added in right click context menu in the event sheet (#3751) 2022-03-17 11:35:38 +01:00
D8H
53eab0ed62 Fix the "Is moving" condition of platformer characters by removing the 1 pixel per frame detection limit (#3730)
This can be important for games with low resolution.
2022-03-16 19:09:14 +01:00
Florian Rival
649a36ac30 Fix text input wrongly staying visible even if hidden or layer visibility turned off (#3755) 2022-03-16 18:56:11 +01:00
Aurélien Vivet
a3afd983ba Add OG meta tags to the web-app (#3756)
Don't show in changelog
2022-03-16 11:01:24 +01:00
D8H
f8c0417210 Allow game owners to share their ownership with other users (#3744) 2022-03-16 10:15:06 +01:00
D8H
8f5fe159d7 Fix rendering so that sprites no longer bounce by one pixel when the camera is moving and pixel perfect is activated (#3754) 2022-03-15 22:26:57 +01:00
D8H
3daebaeb05 Add an action to ensure the camera is inside specified boundaries (#3703) 2022-03-13 12:55:09 +00:00
Florian Rival
1ba1e8a2b7 Update name of project manager "Icons and thumbnail" item
Don't show in changelog
2022-03-11 23:11:18 +00:00
Fannie Yan
36679eb76b Add size actions and conditions for sprite and tiled sprite objects (#3748)
* Add condition on height and width for sprite objects
* Add action to set the size of sprite object
* Add action to set the size of tiled sprite object
2022-03-11 16:53:26 +01:00
Aurélien Vivet
c8132ba864 Fix typo (#3747)
Don't show in changelog
2022-03-11 12:49:52 +00:00
Fannie Yan
141a3d2b61 Allow users to reorder editor tabs (#3745)
Allow users to reorder editor tabs by dragging them (not available on touchscreens)
2022-03-11 10:55:42 +01:00
Florian Rival
dbe0343c67 Fix extensions scene lifecycle events launched more than once after a hot reloading (#3742) 2022-03-10 12:42:09 +00:00
Aurélien Vivet
0983ac59a8 Allow extensions to use the Audio category (#3741) 2022-03-10 12:38:10 +00:00
MyNameIsRinax
9710360180 Fix typo in firebase action
Do not show in changelog
2022-03-10 09:31:57 +01:00
D8H
43af1f34df Make Liluo.io thumbnail configurable in the icons dialog (#3732) 2022-03-09 15:16:07 +01:00
Fannie Yan
fd193e89fc Add possibility to use custom collision masks for draggable behavior (#3738)
* Added a toggle in draggable behavior parameters so that users can chose to use custom collision mask or not
2022-03-09 13:39:57 +01:00
Clément Pasteau
19dcaacafb Improve wording for builds dialog when game is not registered (#3737)
do not show in changelog
2022-03-08 11:18:38 +01:00
Fannie Yan
90721c4059 Add possibility to replace text in text events (Comments and Groups) (#3735)
* Add possibility to replace text in text events (Comments and Group names) with search and replace
2022-03-08 09:35:32 +01:00
Florian Rival
6c118eaa53 Make clearer that the publishing is an export (#3733)
Don't show in changelog
2022-03-07 15:27:58 +00:00
D8H
2b00c90356 Fix some missing translations in the Pathfinding behavior (#3728) 2022-03-07 08:57:25 +00:00
Florian Rival
efe37cc3bf Fix warning
Don't show in changelog
2022-03-04 15:52:14 +00:00
Fannie Yan
bcedbdc0c3 Fix resource list not updated when adding some with tab opened (#3723)
Refresh resource list in Resource tab when it becomes active
2022-03-04 15:50:08 +01:00
Clément Pasteau
f63a16161f Add Liluo Link on homepage (#3720) 2022-03-04 13:35:09 +01:00
Florian Rival
c215a8c6bf Fix spacing in the EmptyPlaceholder (#3722)
Don't show in changelog
2022-03-04 10:57:55 +00:00
Clément Pasteau
225884dfe4 Allow defining up to 4 genres for a game 2022-03-04 09:35:44 +01:00
Fannie Yan
5d42956669 Fix duplicated extension after rename (#3718)
Fix duplicated extension after rename
2022-03-03 17:23:27 +01:00
Clément Pasteau
977bbdde89 Fix a crash on Windows when the Documents folder is missing 2022-03-03 12:24:02 +01:00
D8H
73357c830d Add a "get started" button at the center of empty lists for variables, behaviors, effects and events (#3708) 2022-03-02 18:04:22 +01:00
AlexandreS
c619f94277 Make context menus in scene editor and in object list consistent 2022-03-02 12:08:10 +01:00
Clément Pasteau
c5dabf9b6e Optimise onboarding flow to show to all web users 2022-03-02 10:24:36 +01:00
Arthur Pacaud
cc4303e21e Fine tune search in instruction selector and stores to better handle short words in main field 2022-03-01 13:54:54 +01:00
Florian Rival
566aadafd9 Fix initial language setup when only a language match exists (#3713)
Don't show in changelog
2022-03-01 12:50:09 +00:00
Elairyx
9cd96461d7 Fix various typos (#3711) 2022-03-01 11:34:28 +00:00
AlexandreS
0395b73f4a Clarify separation between object and instance in instance properties panel 2022-03-01 12:10:05 +01:00
Clément Pasteau
bcc40d4728 Show warning when accessing builds for a game you don't own 2022-02-28 16:39:40 +01:00
Clément Pasteau
60088ebafd Bump newIDE version (#3694) 2022-02-25 16:44:52 +00:00
github-actions[bot]
35b654841c Update translations [skip ci] (#3586) 2022-02-25 17:41:25 +01:00
D8H
e7b8741c29 Let game creators define an orientation on mobile for Liluo.io 2022-02-25 17:34:46 +01:00
Florian Rival
9e10f4191b Add chosen language and browser language in the analytics to understand the user language repartition
Don't show in changelog
2022-02-25 10:17:24 +00:00
Aurélien Vivet
c573695853 Fix typo (#3692) 2022-02-24 22:09:56 +00:00
Florian Rival
7496093e63 Fix text input not properly removed when a scene stops or is paused (#3689)
Don't show in changelog
2022-02-24 16:13:08 +00:00
D8H
5f1787f1b5 Let game creators define if their game can be played with a keybord, a gamepad or a mobile (#3682) 2022-02-23 14:55:26 +01:00
Florian Rival
b988d55c8c Add data in analytics to know if a tutorial is running or not
Don't show in changelog
2022-02-22 15:14:38 +00:00
Florian Rival
942dc0a539 Add analytics events to know behaviors usage (#3683)
Don't show in changelog
2022-02-22 13:46:13 +00:00
Florian Rival
d8a241502e Update urls of cache purge for the web-app
Don't show in changelog
2022-02-22 11:38:37 +00:00
D8H
8bf8c3efff Add autocompletion for external layout fields (#3673) 2022-02-22 11:44:24 +01:00
D8H
527b2566b7 Fix the platformer extension to avoid characters to be pushed downward when colliding a jumpthru while landing on another platform at the exact same time (#3677) 2022-02-22 11:40:17 +01:00
AlexandreS
9b436f7f31 Add link to discussions in the Development Roadmap section of the readme
Do not show in changelog
2022-02-22 10:03:56 +01:00
Davy Hélard
0818d56d45 Send the application language to user service. 2022-02-21 10:54:11 +01:00
Clément Pasteau
567b9e24dd Fix displaying the "game update" link when the user is not the owner of the game (#3678) 2022-02-21 09:39:10 +00:00
AlexandreS
69d63649c3 Clarify actions in object removal dialog regarding references 2022-02-21 10:32:47 +01:00
D8H
5ef23c0c70 Fix usage of the legacy trajectory for platformer objects for old project files. (#3676) 2022-02-20 19:21:18 +00:00
Florian Rival
533c6d7fce Update the CNAME used for the web-app
Also update a comment

Don't show in changelog
2022-02-19 17:48:09 +00:00
AlexandreS
0438000543 Do not select sprite when using mouse middle click to pan in the scene editor (#3662)
* Also select the instance under the cursor when doing a right click in the scene editor
2022-02-18 18:28:51 +00:00
AlexandreS
bae8520405 Improve copy pasting objects on the scene
- When pasting objects, the pasted objects are selected
- Fix the possibility to undo/redo an object paste
2022-02-18 16:06:24 +01:00
Florian Rival
78559f439a Protect against crashes in case of a null author in a public game
Don't show in changelog
2022-02-17 22:04:32 +00:00
Florian Rival
ba2389a8eb Move the deprecated property of the platformer object behavior into a specific group (#3661) 2022-02-17 18:33:58 +00:00
AlexandreS
14f4da8fc3 Select parameter content when editing it form the event sheet 2022-02-17 12:08:08 +01:00
AlexandreS
342f06b024 Improve user experience with translation
* Disable auto translating in search results to prevent crashes due to conflicts between search results highlight and dom handling by translators
* Add language selector in Preferences dialog
* Automatically set gdevelop language on first use based on browser language
2022-02-17 09:19:42 +01:00
Clément Pasteau
4d7514c2bf Improve wording and design across the publishing flow to Liluo
+ display game consolidated analytics on the analytics page
2022-02-16 17:48:09 +01:00
AlexandreS
582e71e9d3 UI minor improvements and fixes
- Change help link for light object
- Set new object default name depending on its type
- Make object input sticky at the bottom in ObjectGroupEditor
- Force loss of focus on sliders when mouse is up
- Add possibility to close editor tabs with mouse middle click
- Use user preferred theme to set IDE loading screen background color
2022-02-16 17:38:54 +01:00
Florian Rival
f0822e38e1 Show a warning message and a warning underline in the events sheet when a variable name looks wrong (quotes, spaces, wrongly looking expression) (#3652) 2022-02-16 14:34:47 +01:00
Florian Rival
03a9d9f9c8 Add HTML id to various buttons and elements to allow for an in-app tutorial
Do not show in changelog
2022-02-16 10:34:59 +01:00
Nilay Majorwar
942a3117f9 Fix shortcuts removed by user still displayed, even if not working (#3618) 2022-02-14 14:40:09 +01:00
D8H
ca19076b01 Use the extension name as file name when saving it (#3622) 2022-02-13 23:11:42 +01:00
Florian Rival
267842d8e2 Fix various UI alignment issues
* Action/condition icon aligment
* Aligment of true/false or yes/no switches
* Fix scrollbars shown when the action/condition parameters editor is too tight
2022-02-13 18:55:45 +01:00
Florian Rival
71e3b65134 Add a new "Text input" object (#3508)
* This object displays a field where the player can type a text.
* The cursor can be moved and the text can be selected and entered like any other input field according to the platform. For example, you can use all the usual keyboard shortcuts or emoji pickers on desktop. On mobile, all the usual gestures are supported, emoji pickers, text selection, clipboard...
* You can choose between different input field types: text, text area, email, password, phone number... This allows the keyboards to be adapted on mobile devices. The password field will also hide what is entered by the user.
  * Because the object is way more convenient to use (and actually works on mobile devices) than the Text Entry object, it is recommended you use it almost always instead of the Text Entry object.
* This object has 2 limitations, because it's using the native capabilities of the platform to display a "native" input field: the Z order can't be changed (the object is *always* displayed on top of the game) and no effects can be displayed. Because it's handled by the operating system, it may also slightly differ on each platform.
  * It's recommended you avoid displaying the object outside of a menu or a static UI, as it may not always display exactly at a position synchronised with the rest of the rendering of the game, especially if used in a fast paced or moving scene.
2022-02-13 15:18:31 +01:00
Florian Rival
00393f50c8 Fix again broken instructions
Don't show in changelog
2022-02-11 20:16:51 +01:00
Clément Pasteau
a107ff4e17 Allow entering a project description for your project/game 2022-02-11 10:53:31 +01:00
Aurélien Vivet
0da59cc4e0 Typo fix (#3614) 2022-02-11 08:22:55 +00:00
AlexandreS
46a12e6758 When browsing search results in event sheet, start from currently selected event 2022-02-11 09:22:13 +01:00
Florian Rival
41c9753268 Fix compatibility with instructions broken in #3583 (#3611)
Don't show in changelog
2022-02-10 17:16:27 +01:00
Florian Rival
ab619bdd2a Rework slightly the true/false and yes/no fields to make clearer they are switches 2022-02-10 16:44:57 +01:00
D8H
7258da9927 [Tween] Fix the icon of the expression. (#3606)
Don't show in changelog
2022-02-09 18:23:01 +01:00
D8H
83a390089d Add an expression to use Tween easing functions (#3605)
* This is useful to do easing with other formulas rather than the classic "lerp".
2022-02-09 10:05:42 +01:00
Aurélien Vivet
f4c730f5fd Fix help buttons for some objects (#3601) 2022-02-07 19:49:42 +01:00
AlexandreS
67776108f9 Improve search and highlight results when searching for a condition/action/object/group 2022-02-04 18:31:07 +01:00
Florian Rival
9997e9246a Fix resources sometimes duplicated when scanning resources in the project folder on Windows (#3598)
Fix #3590
2022-02-04 18:04:48 +01:00
Florian Rival
2c4fa1d1c2 Switch the game engine documentation to TypeDoc (#3593)
* This adds link between types, a more readable rendering, a better search and, more generally, makes the [game engine documentation](https://docs.gdevelop-app.com/GDJS%20Runtime%20Documentation/index.html) much easier to browse.
2022-02-03 13:58:44 +01:00
Florian Rival
5d2e0786ee Sort actions/conditions in categories add icons to their groups (#3583)
* This should make it easier to identify and find actions/conditions. Categories give more clarity and icons help to identify what's available without reading everything.
2022-02-03 11:45:53 +01:00
AlexandreSi
8be39f1a3e Increase contrast of the buttons to add events 2022-02-02 11:26:30 +00:00
Clément Pasteau
7d8120d9ff Improve the web export to warn when the game is too big to be uploaded 2022-02-02 11:30:35 +01:00
D8H
1b417a4f27 [Light] Remove the dependency from LightRuntimeObjectPixiRenderer to BehaviorRBushAABB (#3580)
Only show in developer changelog
2022-02-02 09:02:00 +01:00
D8H
aabe249ffb [PathFinding] Remove the dependency from PathfindingRuntimeBehavior to BehaviorRBushAABB (#3579)
Only show in developer changelog
2022-02-02 08:59:58 +01:00
AlexandreS
fff09fdbd0 Fix search highlights that made disappear non exact matches (#3587)
Do not show in changelog
2022-02-01 13:15:41 +01:00
522 changed files with 21383 additions and 6627 deletions

View File

@@ -135,7 +135,7 @@ jobs:
# Build GDevelop IDE (seems like we need to allow Node.js to use more space than usual)
- run:
name: Build GDevelop IDE
command: export NODE_OPTIONS="--max-old-space-size=7168" && cd newIDE/electron-app && npm run build -- --linux AppImage --publish=never
command: export NODE_OPTIONS="--max-old-space-size=7168" && cd newIDE/electron-app && npm run build -- --linux AppImage zip deb --publish=never
- run:
name: Clean dist folder to keep only installers/binaries.

View File

@@ -109,7 +109,8 @@
"xutility": "cpp",
"xlocbuf": "cpp",
"xlocmes": "cpp",
"xmemory0": "cpp"
"xmemory0": "cpp",
"memory_resource": "cpp"
},
"files.exclude": {
"Binaries/*build*": true,

View File

@@ -21,6 +21,12 @@ vector<gd::String> CommentEvent::GetAllSearchableStrings() const {
return allSearchableStrings;
}
bool CommentEvent::ReplaceAllSearchableStrings(
std::vector<gd::String> newSearchableString) {
SetComment(newSearchableString[0]);
return newSearchableString[0] == com1;
}
void CommentEvent::SerializeTo(SerializerElement &element) const {
element.AddChild("color")
.SetAttribute("r", r)

View File

@@ -47,6 +47,8 @@ class GD_CORE_API CommentEvent : public gd::BaseEvent {
void SetComment(const gd::String& comment) { com1 = comment; }
virtual std::vector<gd::String> GetAllSearchableStrings() const;
virtual bool ReplaceAllSearchableStrings(
std::vector<gd::String> newSearchableString);
virtual void SerializeTo(SerializerElement& element) const;
virtual void UnserializeFrom(gd::Project& project,

View File

@@ -27,6 +27,12 @@ vector<gd::String> GroupEvent::GetAllSearchableStrings() const {
return allSearchableStrings;
}
bool GroupEvent::ReplaceAllSearchableStrings(
std::vector<gd::String> newSearchableString) {
SetName(newSearchableString[0]);
return newSearchableString[0] == name;
}
void GroupEvent::SerializeTo(SerializerElement& element) const {
element.SetAttribute("name", name);
element.SetAttribute("source", source);
@@ -69,5 +75,4 @@ void GroupEvent::SetBackgroundColor(unsigned int colorR_,
colorB = colorB_;
}
} // namespace gd

View File

@@ -107,6 +107,8 @@ class GD_CORE_API GroupEvent : public gd::BaseEvent {
virtual gd::EventsList& GetSubEvents() { return events; };
virtual std::vector<gd::String> GetAllSearchableStrings() const;
virtual bool ReplaceAllSearchableStrings(
std::vector<gd::String> newSearchableString);
virtual void SerializeTo(SerializerElement& element) const;
virtual void UnserializeFrom(gd::Project& project,

View File

@@ -315,31 +315,38 @@ gd::String EventsCodeGenerator::GenerateConditionCode(
if (instrInfos.IsObjectInstruction()) {
gd::String objectName = condition.GetParameter(0).GetPlainString();
gd::String objectType = gd::GetTypeOfObject(
GetGlobalObjectsAndGroups(), GetObjectsAndGroups(), objectName);
if (!objectName.empty() && !instrInfos.parameters.empty()) {
std::vector<gd::String> realObjects =
ExpandObjectsName(objectName, context);
for (std::size_t i = 0; i < realObjects.size(); ++i) {
// Set up the context
gd::String objectType = gd::GetTypeOfObject(
GetGlobalObjectsAndGroups(), GetObjectsAndGroups(), realObjects[i]);
const ObjectMetadata& objInfo =
MetadataProvider::GetObjectMetadata(platform, objectType);
AddIncludeFiles(objInfo.includeFiles);
context.SetCurrentObject(realObjects[i]);
context.ObjectsListNeeded(realObjects[i]);
// Prepare arguments and generate the condition whole code
vector<gd::String> arguments = GenerateParametersCodes(
condition.GetParameters(), instrInfos.parameters, context);
conditionCode += GenerateObjectCondition(realObjects[i],
objInfo,
arguments,
instrInfos,
returnBoolean,
condition.IsInverted(),
context);
if (objInfo.IsUnsupportedBaseObjectCapability(
instrInfos.GetRequiredBaseObjectCapability())) {
conditionCode +=
"/* Object with unsupported capability - skipped. */\n";
} else {
AddIncludeFiles(objInfo.includeFiles);
context.SetCurrentObject(realObjects[i]);
context.ObjectsListNeeded(realObjects[i]);
context.SetNoCurrentObject();
// Prepare arguments and generate the condition whole code
vector<gd::String> arguments = GenerateParametersCodes(
condition.GetParameters(), instrInfos.parameters, context);
conditionCode += GenerateObjectCondition(realObjects[i],
objInfo,
arguments,
instrInfos,
returnBoolean,
condition.IsInverted(),
context);
context.SetNoCurrentObject();
}
}
}
} else if (instrInfos.IsBehaviorInstruction()) {
@@ -489,27 +496,33 @@ gd::String EventsCodeGenerator::GenerateActionCode(
// Call free function first if available
if (instrInfos.IsObjectInstruction()) {
gd::String objectName = action.GetParameter(0).GetPlainString();
gd::String objectType = gd::GetTypeOfObject(
GetGlobalObjectsAndGroups(), GetObjectsAndGroups(), objectName);
if (!instrInfos.parameters.empty()) {
std::vector<gd::String> realObjects =
ExpandObjectsName(objectName, context);
for (std::size_t i = 0; i < realObjects.size(); ++i) {
// Setup context
gd::String objectType = gd::GetTypeOfObject(
GetGlobalObjectsAndGroups(), GetObjectsAndGroups(), realObjects[i]);
const ObjectMetadata& objInfo =
MetadataProvider::GetObjectMetadata(platform, objectType);
AddIncludeFiles(objInfo.includeFiles);
context.SetCurrentObject(realObjects[i]);
context.ObjectsListNeeded(realObjects[i]);
// Prepare arguments and generate the whole action code
vector<gd::String> arguments = GenerateParametersCodes(
action.GetParameters(), instrInfos.parameters, context);
actionCode += GenerateObjectAction(
realObjects[i], objInfo, arguments, instrInfos, context);
if (objInfo.IsUnsupportedBaseObjectCapability(
instrInfos.GetRequiredBaseObjectCapability())) {
actionCode += "/* Object with unsupported capability - skipped. */\n";
} else {
AddIncludeFiles(objInfo.includeFiles);
context.SetCurrentObject(realObjects[i]);
context.ObjectsListNeeded(realObjects[i]);
context.SetNoCurrentObject();
// Prepare arguments and generate the whole action code
vector<gd::String> arguments = GenerateParametersCodes(
action.GetParameters(), instrInfos.parameters, context);
actionCode += GenerateObjectAction(
realObjects[i], objInfo, arguments, instrInfos, context);
context.SetNoCurrentObject();
}
}
}
} else if (instrInfos.IsBehaviorInstruction()) {
@@ -621,14 +634,15 @@ gd::String EventsCodeGenerator::GenerateParameterCodes(
argOutput = GenerateGetBehaviorNameCode(parameter);
} else if (metadata.type == "key") {
argOutput = "\"" + ConvertToString(parameter) + "\"";
} else if (metadata.type == "password" || // Deprecated
metadata.type ==
"musicfile" || // Should be renamed "largeAudioResource"
metadata.type ==
"soundfile" || // Should be renamed "audioResource"
metadata.type == "police" || // Should be renamed "fontResource"
} else if (metadata.type == "audioResource" ||
metadata.type == "bitmapFontResource" ||
metadata.type == "imageResource") {
metadata.type == "fontResource" ||
metadata.type == "imageResource" ||
metadata.type == "jsonResource" ||
metadata.type == "videoResource" ||
// Deprecated, old parameter names:
metadata.type == "password" || metadata.type == "musicfile" ||
metadata.type == "soundfile" || metadata.type == "police") {
argOutput = "\"" + ConvertToString(parameter) + "\"";
} else if (metadata.type == "mouse") {
argOutput = "\"" + ConvertToString(parameter) + "\"";

View File

@@ -219,14 +219,20 @@ gd::String ExpressionCodeGenerator::GenerateObjectFunctionCode(
const ObjectMetadata& objInfo = MetadataProvider::GetObjectMetadata(
codeGenerator.GetPlatform(), objectType);
codeGenerator.AddIncludeFiles(objInfo.includeFiles);
functionOutput = codeGenerator.GenerateObjectFunctionCall(
realObjects[i],
objInfo,
expressionMetadata.codeExtraInformation,
parametersCode,
functionOutput,
context);
if (objInfo.IsUnsupportedBaseObjectCapability(
expressionMetadata.GetRequiredBaseObjectCapability())) {
// Do nothing, skipping objects not supporting the capability required by
// this expression.
} else {
codeGenerator.AddIncludeFiles(objInfo.includeFiles);
functionOutput = codeGenerator.GenerateObjectFunctionCall(
realObjects[i],
objInfo,
expressionMetadata.codeExtraInformation,
parametersCode,
functionOutput,
context);
}
}
return functionOutput;

View File

@@ -126,6 +126,11 @@ class GD_CORE_API BaseEvent {
return noSearchableStrings;
};
virtual bool ReplaceAllSearchableStrings(
std::vector<gd::String> newSearchableString) {
return false;
};
/**
* \brief Return a list of all expressions of the event, each with their associated metadata.
* \note Used to preprocess or search in the expressions of the event.

View File

@@ -13,6 +13,7 @@
#include "ExpressionParser2Node.h"
#include "GDCore/Extensions/Metadata/ExpressionMetadata.h"
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
#include "GDCore/Extensions/Metadata/ObjectMetadata.h"
#include "GDCore/Project/Layout.h" // For GetTypeOfObject and GetTypeOfBehavior
#include "GDCore/String.h"
#include "GDCore/Tools/Localization.h"
@@ -484,10 +485,25 @@ class GD_CORE_API ExpressionParser2 {
metadata,
objectFunctionOrBehaviorName);
function->diagnostic = std::move(parametersNode.diagnostic);
if (!function->diagnostic) // TODO: reverse the order of diagnostic?
function->diagnostic = ValidateFunction(
type, *function, objectNameLocation.GetStartPosition());
// If the function needs a capability on the object that may not be covered
// by all objects, check it now.
if (!metadata.GetRequiredBaseObjectCapability().empty()) {
const gd::ObjectMetadata &objectMetadata =
MetadataProvider::GetObjectMetadata(platform, objectType);
if (objectMetadata.IsUnsupportedBaseObjectCapability(
metadata.GetRequiredBaseObjectCapability())) {
function->diagnostic = RaiseTypeError(
_("This expression exists, but it can't be used on this object."),
objectNameLocation.GetStartPosition());
}
}
function->location = ExpressionParserLocation(
objectNameLocation.GetStartPosition(), GetCurrentPosition());
function->objectNameLocation = objectNameLocation;

View File

@@ -11,25 +11,16 @@ namespace gd {
void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
gd::PlatformExtension& extension) {
extension.SetExtensionInformation(
"BuiltinAdvanced",
_("Advanced control features"),
_("Advanced control features to be used in events."),
"Florian Rival",
"Open source (MIT License)");
extension
.AddCondition("Toujours",
_("Always"),
_("This condition always returns true (or always false, if "
"the condition is inverted)."),
_("Always"),
_("Other"),
"res/conditions/toujours24.png",
"res/conditions/toujours.png")
.SetHelpPath("/all-features/advanced-conditions")
.AddCodeOnlyParameter("conditionInverted", "")
.MarkAsAdvanced();
.SetExtensionInformation(
"BuiltinAdvanced",
_("Event functions"),
_("Advanced control features for functions made with events."),
"Florian Rival",
"Open source (MIT License)")
.SetCategory("Advanced");
extension.AddInstructionOrExpressionGroupMetadata(_("Event functions"))
.SetIcon("res/function32.png");
extension
.AddAction(
@@ -38,9 +29,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
_("Set the return value of the events function to the specified "
"number (to be used with \"Expression\" functions)."),
_("Set return value to number _PARAM0_"),
_("Functions"),
"res/function24.png",
"res/function16.png")
"",
"res/function32.png",
"res/function32.png")
.SetHelpPath("/events/functions/return")
.AddParameter("expression", "The number to be returned")
.MarkAsAdvanced();
@@ -52,9 +43,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
_("Set the return value of the events function to the specified text "
"(to be used with \"String Expression\" functions)."),
_("Set return value to text _PARAM0_"),
_("Functions"),
"res/function24.png",
"res/function16.png")
"",
"res/function32.png",
"res/function32.png")
.SetHelpPath("/events/functions/return")
.AddParameter("string", "The text to be returned")
.MarkAsAdvanced();
@@ -65,9 +56,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
_("Set the return value of the Condition events function to "
"either true (condition will pass) or false."),
_("Set return value of the condition to _PARAM0_"),
_("Functions"),
"res/function24.png",
"res/function16.png")
"",
"res/function32.png",
"res/function32.png")
.SetHelpPath("/events/functions/return")
.AddParameter("trueorfalse", "Should the condition be true or false?")
.MarkAsAdvanced();
@@ -80,9 +71,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
"a string, an empty string is considered as \"false\". "
"If it's a number, 0 is considered as \"false\"."),
_("Parameter _PARAM0_ is true"),
_("Functions"),
"res/function24.png",
"res/function16.png")
"",
"res/function32.png",
"res/function32.png")
.AddParameter("functionParameterName", "Parameter name")
.MarkAsAdvanced();
@@ -91,7 +82,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
"GetArgumentAsNumber",
_("Get function parameter value"),
_("Get function parameter (also called \"argument\") value"),
_("Functions"),
"",
"res/function16.png")
.AddParameter("functionParameterName", "Parameter name");
@@ -100,7 +91,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
"GetArgumentAsString",
_("Get function parameter text"),
_("Get function parameter (also called \"argument\") text "),
_("Functions"),
"",
"res/function16.png")
.AddParameter("functionParameterName", "Parameter name");
}

View File

@@ -15,8 +15,6 @@ namespace gd {
* so that it provides standards events, objects or instructions of an
* extension.
*
* TOOD: Usage example.
*
* \ingroup BuiltinExtensions
*/
class GD_CORE_API BuiltinExtensionsImplementer {

View File

@@ -14,12 +14,15 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
extension
.SetExtensionInformation(
"BuiltinAudio",
_("Audio"),
_("Sounds and musics"),
_("GDevelop provides several conditions and actions to play audio "
"files. They can be either long musics or short sound effects."),
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/all-features/audio");
.SetExtensionHelpPath("/all-features/audio")
.SetCategory("Audio");
extension.AddInstructionOrExpressionGroupMetadata(_("Sounds and musics"))
.SetIcon("res/actions/music24.png");
extension
.AddAction("PlaySoundCanal",
@@ -28,7 +31,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
"you'll be able to manipulate it."),
_("Play the sound _PARAM1_ on the channel _PARAM2_, vol.: "
"_PARAM4_, loop: _PARAM3_"),
_("Audio/Sounds on channels"),
_("Sounds on channels"),
"res/actions/son24.png",
"res/actions/son.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -49,7 +52,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("Stop the sound of a channel"),
_("Stop the sound on the specified channel."),
_("Stop the sound of channel _PARAM1_"),
_("Audio/Sounds on channels"),
_("Sounds on channels"),
"res/actions/son24.png",
"res/actions/son.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -61,7 +64,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("Pause the sound of a channel"),
_("Pause the sound played on the specified channel."),
_("Pause the sound of channel _PARAM1_"),
_("Audio/Sounds on channels"),
_("Sounds on channels"),
"res/actions/son24.png",
"res/actions/son.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -73,7 +76,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("Play the sound of a channel"),
_("Play the sound of the channel."),
_("Play the sound of channel _PARAM1_"),
_("Audio/Sounds on channels"),
_("Sounds on channels"),
"res/actions/son24.png",
"res/actions/son.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -87,7 +90,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
"able to interact with it later."),
_("Play the music _PARAM1_ on channel _PARAM2_, vol.: "
"_PARAM4_, loop: _PARAM3_"),
_("Audio/Music on channels"),
_("Music on channels"),
"res/actions/music24.png",
"res/actions/music.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -108,7 +111,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("Stop the music on a channel"),
_("Stop the music on the specified channel"),
_("Stop the music of channel _PARAM1_"),
_("Audio/Music on channels"),
_("Music on channels"),
"res/actions/music24.png",
"res/actions/music.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -120,7 +123,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("Pause the music of a channel"),
_("Pause the music on the specified channel."),
_("Pause the music of channel _PARAM1_"),
_("Audio/Music on channels"),
_("Music on channels"),
"res/actions/music24.png",
"res/actions/music.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -132,7 +135,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("Play the music of a channel"),
_("Play the music of the channel."),
_("Play the music of channel _PARAM1_"),
_("Audio/Music on channels"),
_("Music on channels"),
"res/actions/music24.png",
"res/actions/music.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -145,7 +148,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("This action modifies the volume of the sound on the "
"specified channel. The volume is between 0 and 100."),
_("the volume of the sound on channel _PARAM1_"),
_("Audio/Sounds on channels"),
_("Sounds on channels"),
"res/actions/sonVolume24.png",
"res/actions/sonVolume.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -159,7 +162,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("This action modifies the volume of the music on the "
"specified channel. The volume is between 0 and 100."),
_("the volume of the music on channel _PARAM1_"),
_("Audio/Music on channels"),
_("Music on channels"),
"res/actions/musicVolume24.png",
"res/actions/musicVolume.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -173,7 +176,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("This action modifies the global volume of the game. The "
"volume is between 0 and 100."),
_("the global sound level"),
_("Audio"),
"",
"res/actions/volume24.png",
"res/actions/volume.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -186,7 +189,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("This action modifies the pitch (speed) of the sound on a "
"channel.\n1 is the default pitch."),
_("the pitch of the sound on channel _PARAM1_"),
_("Audio/Sounds on channels"),
_("Sounds on channels"),
"res/actions/son24.png",
"res/actions/son.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -200,7 +203,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("This action modifies the pitch of the music on the "
"specified channel. 1 is the default pitch"),
_("the pitch of the music on channel _PARAM1_"),
_("Audio/Music on channels"),
_("Music on channels"),
"res/actions/music24.png",
"res/actions/music.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -214,7 +217,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("This action modifies the playing offset of the sound on a "
"channel"),
_("the playing offset of the sound on channel _PARAM1_"),
_("Audio/Sounds on channels"),
_("Sounds on channels"),
"res/actions/son24.png",
"res/actions/son.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -228,7 +231,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("This action modifies the playing offset of the music on "
"the specified channel"),
_("the playing offset of the music on channel _PARAM1_"),
_("Audio/Music on channels"),
_("Music on channels"),
"res/actions/music24.png",
"res/actions/music.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -241,7 +244,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("Play a sound"),
_("Play a sound."),
_("Play the sound _PARAM1_, vol.: _PARAM3_, loop: _PARAM2_"),
_("Audio"),
"",
"res/actions/son24.png",
"res/actions/son.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -261,7 +264,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("Play a music file"),
_("Play a music file."),
_("Play the music _PARAM1_, vol.: _PARAM3_, loop: _PARAM2_"),
_("Audio"),
"",
"res/actions/music24.png",
"res/actions/music.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -281,7 +284,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("Preload a music file"),
_("Preload a music file in memory."),
_("Preload the music file _PARAM1_"),
_("Audio/Loading"),
_("Loading"),
"res/actions/music24.png",
"res/actions/music.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -293,7 +296,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("Preload a sound file"),
_("Preload a sound file in memory."),
_("Preload the sound file _PARAM1_"),
_("Audio/Loading"),
_("Loading"),
"res/actions/son24.png",
"res/actions/son.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -301,46 +304,43 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
.MarkAsComplex();
extension
.AddAction("UnloadMusic",
_("Unload a music file"),
_(
"Unload a music file from memory. "
"Unloading a music file will cause any music playing it to stop."
),
_("Unload the music file _PARAM1_"),
_("Audio/Loading"),
"res/actions/music24.png",
"res/actions/music.png")
.AddAction(
"UnloadMusic",
_("Unload a music file"),
_("Unload a music file from memory. "
"Unloading a music file will cause any music playing it to stop."),
_("Unload the music file _PARAM1_"),
_("Loading"),
"res/actions/music24.png",
"res/actions/music.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("musicfile", _("Audio file (or audio resource name)"))
.MarkAsComplex();
extension
.AddAction("UnloadSound",
_("Unload a sound file"),
_(
"Unload a sound file from memory. "
"Unloading a sound file will cause any sounds playing it to stop."
),
_("Unload the sound file _PARAM1_"),
_("Audio/Loading"),
"res/actions/son24.png",
"res/actions/son.png")
.AddAction(
"UnloadSound",
_("Unload a sound file"),
_("Unload a sound file from memory. "
"Unloading a sound file will cause any sounds playing it to stop."),
_("Unload the sound file _PARAM1_"),
_("Loading"),
"res/actions/son24.png",
"res/actions/son.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("soundfile", _("Sound file (or sound resource name)"))
.MarkAsComplex();
extension
.AddAction("UnloadAllAudio",
_("Unload all audio"),
_(
"Unload all the audio in memory. "
"This will cause every sound and music of the game to stop."
),
_("Unload all audio files"),
_("Audio/Loading"),
"res/actions/music24.png",
"res/actions/music.png")
.AddAction(
"UnloadAllAudio",
_("Unload all audio"),
_("Unload all the audio in memory. "
"This will cause every sound and music of the game to stop."),
_("Unload all audio files"),
_("Loading"),
"res/actions/music24.png",
"res/actions/music.png")
.AddCodeOnlyParameter("currentScene", "")
.MarkAsComplex();
@@ -349,7 +349,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("A music file is being played"),
_("Test if the music on a channel is being played"),
_("Music on channel _PARAM1_ is being played"),
_("Audio/Music on channels"),
_("Music on channels"),
"res/conditions/musicplaying24.png",
"res/conditions/musicplaying.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -361,7 +361,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("A music file is paused"),
_("Test if the music on the specified channel is paused."),
_("Music on channel _PARAM1_ is paused"),
_("Audio/Music on channels"),
_("Music on channels"),
"res/conditions/musicpaused24.png",
"res/conditions/musicpaused.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -373,7 +373,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("A music file is stopped"),
_("Test if the music on the specified channel is stopped."),
_("Music on channel _PARAM1_ is stopped"),
_("Audio/Music on channels"),
_("Music on channels"),
"res/conditions/musicstopped24.png",
"res/conditions/musicstopped.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -385,7 +385,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("A sound is being played"),
_("Test if the sound on a channel is being played."),
_("Sound on channel _PARAM1_ is being played"),
_("Audio/Sounds on channels"),
_("Sounds on channels"),
"res/conditions/sonplaying24.png",
"res/conditions/sonplaying.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -397,7 +397,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("A sound is paused"),
_("Test if the sound on the specified channel is paused."),
_("Sound on channel _PARAM1_ is paused"),
_("Audio/Sounds on channels"),
_("Sounds on channels"),
"res/conditions/sonpaused24.png",
"res/conditions/sonpaused.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -409,7 +409,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("A sound is stopped"),
_("Test if the sound on the specified channel is stopped."),
_("Sound on channel _PARAM1_ is stopped"),
_("Audio/Sounds on channels"),
_("Sounds on channels"),
"res/conditions/sonstopped24.png",
"res/conditions/sonstopped.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -423,7 +423,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("Test the volume of the sound on the specified channel. The volume "
"is between 0 and 100."),
_("the volume of the sound on channel _PARAM1_"),
_("Audio/Sounds on channels"),
_("Sounds on channels"),
"res/conditions/sonVolume24.png",
"res/conditions/sonVolume.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -438,7 +438,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("Test the volume of the music on a specified channel. The volume "
"is between 0 and 100."),
_("the volume of the music on channel _PARAM1_"),
_("Audio/Music on channels"),
_("Music on channels"),
"res/conditions/musicVolume24.png",
"res/conditions/musicVolume.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -452,7 +452,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("Global volume"),
_("Test the global sound level. The volume is between 0 and 100."),
_("the global game volume"),
_("Audio"),
"",
"res/conditions/volume24.png",
"res/conditions/volume.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -465,7 +465,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("Test the pitch of the sound on the specified channel. 1 is the "
"default pitch."),
_("the pitch of the sound on channel _PARAM1_"),
_("Audio/Sounds on channels"),
_("Sounds on channels"),
"res/conditions/sonVolume24.png",
"res/conditions/sonVolume.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -480,7 +480,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("Test the pitch (speed) of the music on a specified channel. 1 is "
"the default pitch."),
_("the pitch of the music on channel _PARAM1_"),
_("Audio/Music on channels"),
_("Music on channels"),
"res/conditions/musicVolume24.png",
"res/conditions/musicVolume.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -494,7 +494,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("Playing offset of the sound on a channel"),
_("Test the playing offset of the sound on the specified channel."),
_("the playing offset of the sound on channel _PARAM1_"),
_("Audio/Sounds on channels"),
_("Sounds on channels"),
"res/conditions/sonVolume24.png",
"res/conditions/sonVolume.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -508,7 +508,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("Playing offset of the music on a channel"),
_("Test the playing offset of the music on the specified channel."),
_("the playing offset of the music on channel _PARAM1_"),
_("Audio/Music on channels"),
_("Music on channels"),
"res/conditions/musicVolume24.png",
"res/conditions/musicVolume.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -577,7 +577,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
_("Sound level"),
"res/conditions/volume.png")
.AddCodeOnlyParameter("currentScene", "");
}
} // namespace gd

View File

@@ -16,11 +16,17 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
extension
.SetExtensionInformation(
"BuiltinObject",
_("Features for all objects"),
_("Objects"),
_("Common features that can be used for all objects in GDevelop."),
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/objects/base_object/events");
extension.AddInstructionOrExpressionGroupMetadata(_("Collision"))
.SetIcon("res/conditions/collision24.png");
extension.AddInstructionOrExpressionGroupMetadata(_("Objects"))
.SetIcon("res/actions/create24.png");
extension.AddInstructionOrExpressionGroupMetadata(_("Movement using forces"))
.SetIcon("res/actions/force24.png");
gd::ObjectMetadata& obj = extension.AddObject<gd::Object>(
"", _("Base object"), _("Base object"), "res/objeticon24.png");
@@ -833,6 +839,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"edges, but are not overlapping (default: no)"),
"",
true)
.MarkParameterAsAdvanced()
.SetDefaultValue("no")
.MarkAsSimple();
@@ -1172,7 +1179,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("object", _("Object"))
.AddParameter("objectEffectName", _("Effect name"))
.AddParameter("yesorno", _("Enable?"))
.MarkAsSimple();
.MarkAsSimple()
.SetRequiresBaseObjectCapability("effect");
obj.AddAction("SetEffectDoubleParameter",
_("Effect parameter (number)"),
@@ -1187,7 +1195,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("objectEffectName", _("Effect name"))
.AddParameter("objectEffectParameterName", _("Parameter name"))
.AddParameter("expression", _("New value"))
.MarkAsSimple();
.MarkAsSimple()
.SetRequiresBaseObjectCapability("effect");
obj.AddAction("SetEffectStringParameter",
_("Effect parameter (string)"),
@@ -1203,7 +1212,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("objectEffectName", _("Effect name"))
.AddParameter("objectEffectParameterName", _("Parameter name"))
.AddParameter("string", _("New value"))
.MarkAsSimple();
.MarkAsSimple()
.SetRequiresBaseObjectCapability("effect");
obj.AddAction("SetEffectBooleanParameter",
_("Effect parameter (enable or disable)"),
@@ -1218,7 +1228,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("objectEffectName", _("Effect name"))
.AddParameter("objectEffectParameterName", _("Parameter name"))
.AddParameter("yesorno", _("Enable?"))
.MarkAsSimple();
.MarkAsSimple()
.SetRequiresBaseObjectCapability("effect");
obj.AddCondition("IsEffectEnabled",
_("Effect is enabled"),
@@ -1229,7 +1240,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/actions/effect.png")
.AddParameter("object", _("Object"))
.AddParameter("objectEffectName", _("Effect name"))
.MarkAsSimple();
.MarkAsSimple()
.SetRequiresBaseObjectCapability("effect");
extension
.AddAction("Create",
@@ -1237,9 +1249,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Create an object at specified position"),
_("Create object _PARAM1_ at position _PARAM2_;_PARAM3_ "
"(layer: _PARAM4_)"),
_("Objects"),
"",
"res/actions/create24.png",
"res/actions/create.png")
"res/actions/create24.png")
.AddCodeOnlyParameter("objectsContext", "")
.AddParameter("objectListWithoutPicking", _("Object to create"))
.AddParameter("expression", _("X position"))
@@ -1255,9 +1267,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"create the object with the specified name."),
_("Among objects _PARAM1_, create object named _PARAM2_ at "
"position _PARAM3_;_PARAM4_ (layer: _PARAM5_)"),
_("Objects"),
"",
"res/actions/create24.png",
"res/actions/create.png")
"res/actions/create24.png")
.AddCodeOnlyParameter("objectsContext", "")
.AddParameter("objectListWithoutPicking", _("Group of potential objects"))
.SetParameterLongDescription(
@@ -1458,7 +1470,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Cast a ray from _PARAM1_;_PARAM2_, angle: _PARAM3_ and max "
"distance: _PARAM4_px, against _PARAM0_, and save the "
"result in _PARAM5_, _PARAM6_"),
_("Collision"),
"",
"res/conditions/raycast24.png",
"res/conditions/raycast.png")
.AddParameter("objectList", _("Objects to test against the ray"))
@@ -1489,7 +1501,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Cast a ray from from _PARAM1_;_PARAM2_ to _PARAM3_;_PARAM4_ "
"against _PARAM0_, and save the "
"result in _PARAM5_, _PARAM6_"),
_("Collision"),
"",
"res/conditions/raycast24.png",
"res/conditions/raycast.png")
.AddParameter("objectList", _("Objects to test against the ray"))
@@ -1513,21 +1525,21 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Number of objects"),
_("Count the number of the specified objects being "
"currently picked in the event"),
_("Objects"),
"",
"res/conditions/nbObjet.png")
.AddParameter("objectList", _("Object"));
obj.AddStrExpression("ObjectName",
_("Object name"),
_("Return the name of the object"),
_("Objects"),
"",
"res/conditions/text.png")
.AddParameter("object", _("Object"));
obj.AddStrExpression("Layer",
_("Object layer"),
_("Return the name of the layer the object is on"),
_("Objects"),
"",
"res/actions/layer.png")
.AddParameter("object", _("Object"));
}

View File

@@ -15,7 +15,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
extension
.SetExtensionInformation(
"BuiltinCamera",
_("Cameras and layers features"),
_("Layers and cameras"),
"Each scene can be composed of multiple layers. These conditions "
"and actions allow to manipulate them during the game. In "
"particular, you can move the camera of a layer to center it on an "
@@ -23,6 +23,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/interface/scene-editor/layers-and-cameras");
extension.AddInstructionOrExpressionGroupMetadata(_("Layers and cameras"))
.SetIcon("res/conditions/camera24.png");
extension
.AddExpressionAndConditionAndAction(
@@ -31,13 +33,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Camera center X position"),
_("the X position of the center of a camera"),
_("the X position of camera _PARAM4_ (layer: _PARAM3_)"),
_("Layers and cameras"),
"",
"res/conditions/camera24.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardParameters("number")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
.MarkParameterAsAdvanced()
.SetDefaultValue("0")
.MarkAsAdvanced();
@@ -53,13 +56,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Camera center Y position"),
_("the Y position of the center of a camera"),
_("the Y position of camera _PARAM4_ (layer: _PARAM3_)"),
_("Layers and cameras"),
"",
"res/conditions/camera24.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardParameters("number")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
.MarkParameterAsAdvanced()
.SetDefaultValue("0")
.MarkAsAdvanced();
@@ -75,7 +79,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Width of a camera"),
_("the width of a camera of a layer"),
_("the width of camera _PARAM2_ of layer _PARAM1_"),
_("Layers and cameras"),
"",
"res/conditions/camera24.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"))
@@ -91,7 +95,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Height of a camera"),
_("the height of a camera of a layer"),
_("the height of camera _PARAM2_ of layer _PARAM1_"),
_("Layers and cameras"),
"",
"res/conditions/camera24.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"))
@@ -107,13 +111,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Angle of a camera of a layer"),
_("the angle of rotation of a camera"),
_("the angle of camera (layer: _PARAM3_, camera: _PARAM4_)"),
_("Layers and cameras"),
"",
"res/conditions/camera24.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardParameters("number")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
.MarkParameterAsAdvanced()
.SetDefaultValue("0")
.MarkAsAdvanced();
@@ -127,7 +132,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Add a camera to a layer"),
_("This action adds a camera to a layer"),
_("Add a camera to layer _PARAM1_"),
_("Layers and cameras"),
"",
"res/actions/camera24.png",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -162,7 +167,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Delete a camera of a layer"),
_("Remove the specified camera from a layer"),
_("Delete camera _PARAM2_ from layer _PARAM1_"),
_("Layers and cameras"),
"",
"res/actions/camera24.png",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -178,7 +183,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"layer. The zoom will be reset."),
_("Change the size of camera _PARAM2_ of _PARAM1_ to "
"_PARAM3_*_PARAM4_"),
_("Layers and cameras"),
"",
"res/actions/camera24.png",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -196,7 +201,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"specified layer."),
_("Set the render zone of camera _PARAM2_ from layer _PARAM1_ "
"to _PARAM3_;_PARAM4_ _PARAM5_;_PARAM6_"),
_("Layers and cameras"),
"",
"res/actions/camera24.png",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -223,7 +228,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Change camera zoom."),
_("Change camera zoom to _PARAM1_ (layer: _PARAM2_, camera: "
"_PARAM3_)"),
_("Layers and cameras"),
"",
"res/actions/camera24.png",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -232,8 +237,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
.MarkParameterAsAdvanced()
.SetDefaultValue("0");
// TODO Deprecated: hide this action in a future release.
extension
.AddAction(
"FixCamera",
@@ -242,7 +249,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"specified limits."),
_("Center the camera on _PARAM1_ (limit : from _PARAM2_;_PARAM3_ to "
"_PARAM4_;_PARAM5_) (layer: _PARAM7_, camera: _PARAM8_)"),
_("Layers and cameras"),
"",
"res/actions/camera24.png",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -259,10 +266,38 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Anticipate the movement of the object (yes by default)"),
"",
true)
.MarkParameterAsAdvanced()
.SetDefaultValue("yes")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
.MarkParameterAsAdvanced()
.SetDefaultValue("0")
.MarkAsAdvanced();
extension
.AddAction(
"ClampCamera",
_("Enforce camera boundaries"),
_("Enforce camera boundaries by moving the camera back inside specified boundaries."),
_("Enforce camera boundaries (left: _PARAM1_, top: _PARAM2_ "
"right: _PARAM3_, bottom: _PARAM4_, layer: _PARAM5_)"),
"",
"res/actions/camera24.png",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression",
_("Left bound X Position"))
.AddParameter("expression",
_("Top bound Y Position"))
.AddParameter("expression",
_("Right bound X Position"))
.AddParameter("expression",
_("Bottom bound Y Position"))
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
.MarkParameterAsAdvanced()
.SetDefaultValue("0")
.MarkAsAdvanced();
@@ -271,8 +306,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"CentreCamera",
_("Center the camera on an object"),
_("Center the camera on the specified object."),
_("Center camera on _PARAM1_ (layer: _PARAM3_, camera: _PARAM4_)"),
_("Layers and cameras"),
_("Center camera on _PARAM1_ (layer: _PARAM3_)"),
"",
"res/actions/camera24.png",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -281,10 +316,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Anticipate the movement of the object (yes by default)"),
"",
true)
.MarkParameterAsAdvanced()
.SetDefaultValue("yes")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
.MarkParameterAsAdvanced()
.SetDefaultValue("0")
.MarkAsSimple();
@@ -293,7 +330,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Show a layer"),
_("Show a layer."),
_("Show layer _PARAM1_"),
_("Layers and cameras"),
"",
"res/actions/layer24.png",
"res/actions/layer.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -306,7 +343,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Hide a layer"),
_("Hide a layer."),
_("Hide layer _PARAM1_"),
_("Layers and cameras"),
"",
"res/actions/layer24.png",
"res/actions/layer.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -319,7 +356,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Visibility of a layer"),
_("Test if a layer is set as visible."),
_("Layer _PARAM1_ is visible"),
_("Layers and cameras"),
"",
"res/conditions/layer24.png",
"res/conditions/layer.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -335,7 +372,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("You can find the parameter names (and change the effect "
"names) in the effects window."),
_("Set _PARAM3_ to _PARAM4_ for effect _PARAM2_ of layer _PARAM1_"),
_("Layers and cameras/Effects"),
_("Effects"),
"res/conditions/camera24.png",
"res/conditions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -354,7 +391,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("You can find the parameter names (and change the effect "
"names) in the effects window."),
_("Set _PARAM3_ to _PARAM4_ for effect _PARAM2_ of layer _PARAM1_"),
_("Layers and cameras/Effects"),
_("Effects"),
"res/conditions/camera24.png",
"res/conditions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -373,7 +410,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("You can find the parameter names (and change the effect "
"names) in the effects window."),
_("Enable _PARAM3_ for effect _PARAM2_ of layer _PARAM1_: _PARAM4_"),
_("Layers and cameras/Effects"),
_("Effects"),
"res/conditions/camera24.png",
"res/conditions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -389,7 +426,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Layer effect is enabled"),
_("The effect on a layer is enabled"),
_("Effect _PARAM2_ on layer _PARAM1_ is enabled"),
_("Layers and cameras/Effects"),
_("Effects"),
"res/conditions/camera24.png",
"res/conditions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -403,7 +440,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Enable layer effect"),
_("Enable an effect on a layer"),
_("Enable effect _PARAM2_ on layer _PARAM1_: _PARAM3_"),
_("Layers and cameras/Effects"),
_("Effects"),
"res/conditions/camera24.png",
"res/conditions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -419,7 +456,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Layer time scale"),
_("Compare the time scale applied to the objects of the layer."),
_("the time scale of layer _PARAM1_"),
_("Layers and cameras"),
"",
"res/conditions/time24.png",
"res/conditions/time.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -434,7 +471,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Change layer time scale"),
_("Change the time scale applied to the objects of the layer."),
_("Set the time scale of layer _PARAM1_ to _PARAM2_"),
_("Layers and cameras"),
"",
"res/actions/time24.png",
"res/actions/time.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -449,7 +486,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Compare the default Z order set to objects when they "
"are created on a layer."),
_("the default Z order of objects created on _PARAM1_"),
_("Layers and cameras"),
"",
"res/conditions/layer24.png",
"res/conditions/layer.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -465,7 +502,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"created on a layer."),
_("Set the default Z order of objects created on _PARAM1_ to "
"_PARAM2_"),
_("Layers and cameras"),
"",
"res/actions/layer24.png",
"res/actions/layer.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -480,7 +517,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Set the ambient light color of the lighting layer in format "
"\"R;G;B\" string."),
_("Set the ambient color of the lighting layer _PARAM1_ to _PARAM2_"),
_("Layers and cameras/Lighting"),
_("Lighting"),
"res/actions/color24.png",
"res/actions/color.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -494,7 +531,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"CameraViewportLeft",
_("X position of the top left side point of a render zone"),
_("X position of the top left side point of a render zone"),
_("Layers and cameras"),
"",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer"))
@@ -506,7 +543,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"CameraViewportTop",
_("Y position of the top left side point of a render zone"),
_("Y position of the top left side point of a render zone"),
_("Layers and cameras"),
"",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer"))
@@ -518,7 +555,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"CameraViewportRight",
_("X position of the bottom right side point of a render zone"),
_("X position of the bottom right side point of a render zone"),
_("Layers and cameras"),
"",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer"))
@@ -530,7 +567,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"CameraViewportBottom",
_("Y position of the bottom right side point of a render zone"),
_("Y position of the bottom right side point of a render zone"),
_("Layers and cameras"),
"",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer"))
@@ -541,7 +578,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
.AddExpression("CameraZoom",
_("Zoom of a camera of a layer"),
_("Zoom of a camera of a layer"),
_("Layers and cameras"),
"",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer"), "", true)
@@ -553,7 +590,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
.AddExpression("LayerTimeScale",
_("Layer time scale"),
_("Returns the time scale of the specified layer."),
_("Layers and cameras"),
"",
"res/actions/time.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer"));
@@ -562,7 +599,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
.AddExpression("LayerDefaultZOrder",
_("Default Z Order for a layer"),
_("Default Z Order for a layer"),
_("Layers and cameras"),
"",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer"));

View File

@@ -15,18 +15,19 @@ BuiltinExtensionsImplementer::ImplementsCommonConversionsExtension(
extension
.SetExtensionInformation(
"BuiltinCommonConversions",
_("Standard Conversions"),
_("Conversion"),
"Expressions to convert number, texts and quantities.",
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/all-features/common-conversions");
extension.AddInstructionOrExpressionGroupMetadata(_("Conversion"))
.SetIcon("res/conditions/toujours24.png");
extension
.AddExpression("ToNumber",
_("Text > Number"),
_("Convert the text to a number"),
_("Conversion"),
"",
"res/conditions/toujours24.png")
.AddParameter("string", _("Text to convert to a number"));
@@ -34,7 +35,7 @@ BuiltinExtensionsImplementer::ImplementsCommonConversionsExtension(
.AddStrExpression("ToString",
_("Number > Text"),
_("Convert the result of the expression to text"),
_("Conversion"),
"",
"res/conditions/toujours24.png")
.AddParameter("expression", _("Expression to be converted to text"));
@@ -43,7 +44,7 @@ BuiltinExtensionsImplementer::ImplementsCommonConversionsExtension(
_("Number > Text ( without scientific notation )"),
_("Convert the result of the expression to text, "
"without using the scientific notation"),
_("Conversion"),
"",
"res/conditions/toujours24.png")
.AddParameter("expression", _("Expression to be converted to text"));
@@ -52,7 +53,7 @@ BuiltinExtensionsImplementer::ImplementsCommonConversionsExtension(
"ToRad",
_("Degrees > Radians"),
_("Converts the angle, expressed in degrees, into radians"),
_("Conversion"),
"",
"res/conditions/toujours24.png")
.AddParameter("expression", _("Angle, in degrees"));
@@ -61,9 +62,76 @@ BuiltinExtensionsImplementer::ImplementsCommonConversionsExtension(
"ToDeg",
_("Radians > Degrees"),
_("Converts the angle, expressed in radians, into degrees"),
_("Conversion"),
"",
"res/conditions/toujours24.png")
.AddParameter("expression", _("Angle, in radians"));
extension
.AddStrExpression("ToJSON",
_("Convert scene variable to JSON"),
_("Convert a scene variable to JSON"),
_("JSON"),
"res/conditions/toujours24.png")
.AddParameter("scenevar", _("Scene variable to be stringified"));
extension
.AddStrExpression("GlobalVarToJSON",
_("Convert global variable to JSON"),
_("Convert a global variable to JSON"),
_("JSON"),
"res/conditions/toujours24.png")
.AddParameter("globalvar", _("The global variable to be stringified"));
extension
.AddStrExpression("ObjectVarToJSON",
_("Convert object variable to JSON"),
_("Convert an object variable to JSON"),
_("JSON"),
"res/conditions/toujours24.png")
.AddParameter("objectPtr", _("The object with the variable"))
.AddParameter("objectvar", _("The object variable to be stringified"));
extension
.AddAction(
"JSONToVariableStructure",
_("Convert JSON to a scene variable"),
_("Parse a JSON object and store it into a scene variable"),
_("Parse JSON string _PARAM0_ and store it into variable _PARAM1_"),
"",
"res/actions/net24.png",
"res/actions/net.png")
.AddParameter("string", _("JSON string"))
.AddParameter("scenevar", _("Variable where store the JSON object"))
.MarkAsAdvanced();
extension
.AddAction("JSONToGlobalVariableStructure",
_("Convert JSON to global variable"),
_("Parse a JSON object and store it into a global variable"),
_("Parse JSON string _PARAM0_ and store it into global "
"variable _PARAM1_"),
"",
"res/actions/net24.png",
"res/actions/net.png")
.AddParameter("string", _("JSON string"))
.AddParameter("globalvar",
_("Global variable where store the JSON object"))
.MarkAsAdvanced();
extension
.AddAction("JSONToObjectVariableStructure",
_("Convert JSON to object variable"),
_("Parse a JSON object and store it into an object variable"),
_("Parse JSON string _PARAM0_ and store it into variable "
"_PARAM2_ of _PARAM1_"),
"",
"res/actions/net24.png",
"res/actions/net.png")
.AddParameter("string", _("JSON string"))
.AddParameter("objectPtr", _("Object"))
.AddParameter("objectvar",
_("Object variable where store the JSON object"))
.MarkAsAdvanced();
}
} // namespace gd

View File

@@ -4,7 +4,6 @@
* reserved. This project is released under the MIT License.
*/
#include "AllBuiltinExtensions.h"
#include "GDCore/Tools/Localization.h"
#include "GDCore/Events/Builtin/CommentEvent.h"
#include "GDCore/Events/Builtin/ForEachChildVariableEvent.h"
#include "GDCore/Events/Builtin/ForEachEvent.h"
@@ -14,6 +13,7 @@
#include "GDCore/Events/Builtin/StandardEvent.h"
#include "GDCore/Events/Builtin/WhileEvent.h"
#include "GDCore/Events/Event.h"
#include "GDCore/Tools/Localization.h"
using namespace std;
namespace gd {
@@ -24,19 +24,43 @@ BuiltinExtensionsImplementer::ImplementsCommonInstructionsExtension(
extension
.SetExtensionInformation(
"BuiltinCommonInstructions",
_("Builtin events"),
_("Events and control flow"),
"GDevelop comes with a set of events and conditions that allow to "
"express the game logic and rules.",
"Florian Rival",
"Open source (MIT License)")
.SetCategory("Advanced")
.SetExtensionHelpPath("/all-features/advanced-conditions");
extension
.AddInstructionOrExpressionGroupMetadata(_("Events and control flow"))
.SetIcon("res/conditions/toujours24.png");
extension
.AddCondition("Always",
_("Always"),
_("This condition always returns true (or always false, if "
"the condition is inverted)."),
_("Always"),
"",
"res/conditions/toujours24.png",
"res/conditions/toujours.png")
.SetHelpPath("/all-features/advanced-conditions")
.AddCodeOnlyParameter("conditionInverted", "")
.MarkAsAdvanced();
// Compatibility with GD <= 5.0.127
extension
.AddDuplicatedCondition(
"Toujours", "BuiltinCommonInstructions::Always", {.unscoped = true})
.SetHidden();
// end of compatibility code
extension
.AddCondition("Or",
_("Or"),
_("Check if one of the sub conditions is true"),
_("If one of these conditions is true:"),
_("Advanced"),
"",
"res/conditions/or24.png",
"res/conditions/or.png")
.SetCanHaveSubInstructions()
@@ -47,7 +71,7 @@ BuiltinExtensionsImplementer::ImplementsCommonInstructionsExtension(
_("And"),
_("Check if all sub conditions are true"),
_("If all of these conditions are true:"),
_("Advanced"),
"",
"res/conditions/and24.png",
"res/conditions/and.png")
.SetCanHaveSubInstructions()
@@ -59,7 +83,7 @@ BuiltinExtensionsImplementer::ImplementsCommonInstructionsExtension(
_("Not"),
_("Return the contrary of the result of the sub conditions"),
_("Invert the logical result of these conditions:"),
_("Advanced"),
"",
"res/conditions/not24.png",
"res/conditions/not.png")
.SetCanHaveSubInstructions()
@@ -70,10 +94,52 @@ BuiltinExtensionsImplementer::ImplementsCommonInstructionsExtension(
_("Trigger once while true"),
_("Run actions only once, for each time the conditions have been met."),
_("Trigger once"),
_("Advanced"),
"",
"res/conditions/once24.png",
"res/conditions/once.png");
extension
.AddCondition("CompareNumbers",
_("Compare two numbers"),
_("Compare the two numbers."),
_("_PARAM0_ _PARAM1_ _PARAM2_"),
"",
"res/conditions/egal24.png",
"res/conditions/egal.png")
.SetHelpPath("/all-features/advanced-conditions")
.AddParameter("expression", _("First expression"))
.AddParameter("relationalOperator", _("Sign of the test"), "number")
.AddParameter("expression", _("Second expression"))
.MarkAsAdvanced();
// Compatibility with GD <= 5.0.127
extension
.AddDuplicatedCondition(
"Egal", "BuiltinCommonInstructions::CompareNumbers", {.unscoped = true})
.SetHidden();
// end of compatibility code
extension
.AddCondition("CompareStrings",
_("Compare two strings"),
_("Compare the two strings."),
_("_PARAM0_ _PARAM1_ _PARAM2_"),
"",
"res/conditions/egal24.png",
"res/conditions/egal.png")
.SetHelpPath("/all-features/advanced-conditions")
.AddParameter("string", _("First string expression"))
.AddParameter("relationalOperator", _("Sign of the test"), "string")
.AddParameter("string", _("Second string expression"))
.MarkAsAdvanced();
// Compatibility with GD <= 5.0.127
extension
.AddDuplicatedCondition(
"StrEqual", "BuiltinCommonInstructions::CompareStrings", {.unscoped = true})
.SetHidden();
// end of compatibility code
extension.AddEvent(
"Standard",
_("Standard event"),

View File

@@ -19,18 +19,21 @@ BuiltinExtensionsImplementer::ImplementsExternalLayoutsExtension(
"external layouts.",
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/interface/scene-editor/external-layouts");
.SetExtensionHelpPath("/interface/scene-editor/external-layouts")
.SetCategory("Advanced");
extension.AddInstructionOrExpressionGroupMetadata(_("External layouts"))
.SetIcon("res/ribbon_default/externallayout32.png");
extension
.AddAction("CreateObjectsFromExternalLayout",
_("Create objects from an external layout"),
_("Create objects from an external layout."),
_("Create objects from the external layout named _PARAM1_"),
_("External layouts"),
"res/conditions/fichier24.png",
"res/conditions/fichier.png")
"",
"res/ribbon_default/externallayout32.png",
"res/ribbon_default/externallayout32.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Name of the external layout"))
.AddParameter("externalLayoutName", _("Name of the external layout"))
.AddParameter("expression", _("X position of the origin"), "", true)
.SetDefaultValue("0")
.AddParameter("expression", _("Y position of the origin"), "", true)

View File

@@ -20,7 +20,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
"stored on the device and erased when the game is uninstalled.",
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/all-features/storage");
.SetExtensionHelpPath("/all-features/storage")
.SetCategory("Device");
extension.AddInstructionOrExpressionGroupMetadata(_("Storage"))
.SetIcon("res/conditions/fichier24.png");
extension
.AddCondition(
@@ -29,7 +32,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
_("Check if an element (example : PlayerState/CurrentLevel) exists "
"in the stored data.\nSpaces are forbidden in element names."),
_("_PARAM1_ exists in storage _PARAM0_"),
_("Storage"),
"",
"res/conditions/fichier24.png",
"res/conditions/fichier.png")
.AddParameter("string", _("Storage name"))
@@ -45,7 +48,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
"action, but it will be slower.\nIf you use this action, do not "
"forget to unload the storage from memory."),
_("Load storage _PARAM0_ in memory"),
_("Storage"),
"",
"res/actions/fichier24.png",
"res/actions/fichier.png")
.AddParameter("string", _("Storage name"))
@@ -57,7 +60,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
_("This action closes the structured data previously loaded "
"in memory, saving all changes made."),
_("Close structured data _PARAM0_"),
_("Storage"),
"",
"res/actions/fichier24.png",
"res/actions/fichier.png")
.AddParameter("string", _("Storage name"))
@@ -72,7 +75,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
"element using / (example : Root/Level/Current)\nSpaces are "
"forbidden in element names."),
_("Write _PARAM2_ in _PARAM1_ of storage _PARAM0_"),
_("Storage"),
"",
"res/actions/fichier24.png",
"res/actions/fichier.png")
.AddParameter("string", _("Storage name"))
@@ -88,7 +91,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
"the structure leading to the element using / (example : "
"Root/Level/Current)\nSpaces are forbidden in element names."),
_("Write _PARAM2_ in _PARAM1_ of storage _PARAM0_"),
_("Storage"),
"",
"res/actions/fichier24.png",
"res/actions/fichier.png")
.AddParameter("string", _("Storage name"))
@@ -105,7 +108,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
"(example : Root/Level/Current)\nSpaces are forbidden in element "
"names."),
_("Read _PARAM1_ from storage _PARAM0_ and store value in _PARAM3_"),
_("Storage"),
"",
"res/actions/fichier24.png",
"res/actions/fichier.png")
.AddParameter("string", _("Storage name"))
@@ -124,7 +127,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
"names."),
_("Read _PARAM1_ from storage _PARAM0_ and store as text in "
"_PARAM3_"),
_("Storage"),
"",
"res/actions/fichier24.png",
"res/actions/fichier.png")
.AddParameter("string", _("Storage name"))
@@ -140,7 +143,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
"element using / (example : Root/Level/Current)\nSpaces are "
"forbidden in element names."),
_("Delete _PARAM1_ from storage _PARAM0_"),
_("Storage"),
"",
"res/actions/delete24.png",
"res/actions/delete.png")
.AddParameter("string", _("Storage name"))
@@ -153,7 +156,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
_("Clear a storage"),
_("Clear the specified storage, removing all data saved in it."),
_("Delete storage _PARAM0_"),
_("Storage"),
"",
"res/actions/delete24.png",
"res/actions/delete.png")
.AddParameter("string", _("Storage name"));
@@ -163,32 +166,18 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
_("A storage exists"),
_("Test if the specified storage exists."),
_("Storage _PARAM0_ exists"),
_("Storage"),
"",
"res/conditions/fichier24.png",
"res/conditions/fichier.png")
.AddParameter("string", _("Storage name"))
.MarkAsAdvanced();
extension
.AddAction("LaunchFile",
_("Open a URL or a file"),
_("This action launches the specified file or URL, in a "
"browser (or in a new tab if the game is using the Web "
"platform and is launched inside a browser)."),
_("Open URL (or file) _PARAM0_"),
_("Files"),
"res/actions/launchFile24.png",
"res/actions/launchFile.png")
.AddParameter("string", _("URL (or filename)"))
.AddCodeOnlyParameter("currentScene", "")
.MarkAsAdvanced();
extension
.AddAction("ExecuteCmd",
_("Execute a command"),
_("This action executes the specified command."),
_("Execute _PARAM0_"),
_("Files"),
_("Network"),
"res/actions/launchFile24.png",
"res/actions/launchFile.png")
.AddParameter("string", _("Command"))

View File

@@ -14,21 +14,24 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsKeyboardExtension(
extension
.SetExtensionInformation(
"BuiltinKeyboard",
_("Keyboard features"),
_("Keyboard"),
_("Allows your game to respond to keyboard input. Note that this "
"does not work with on-screen keyboard on touch devices: use "
"instead conditions related to touch when making a game for "
"mobile/touchscreen devices."),
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/all-features/keyboard");
.SetExtensionHelpPath("/all-features/keyboard")
.SetCategory("Input");
extension.AddInstructionOrExpressionGroupMetadata(_("Keyboard"))
.SetIcon("res/conditions/keyboard24.png");
extension
.AddCondition("KeyPressed",
_("Key pressed"),
_("Check if a key is pressed"),
_("_PARAM1_ key is pressed"),
_("Keyboard"),
"",
"res/conditions/keyboard24.png",
"res/conditions/keyboard.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -39,7 +42,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsKeyboardExtension(
_("Key released"),
_("Check if a key was just released"),
_("_PARAM1_ key is released"),
_("Keyboard"),
"",
"res/conditions/keyboard24.png",
"res/conditions/keyboard.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -51,7 +54,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsKeyboardExtension(
_("Check if a key, retrieved from the result of the "
"expression, is pressed"),
_("_PARAM1_ key is pressed"),
_("Keyboard"),
"",
"res/conditions/keyboard24.png",
"res/conditions/keyboard.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -64,7 +67,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsKeyboardExtension(
_("Check if a key, retrieved from the result of the "
"expression, was just released"),
_("_PARAM1_ key is released"),
_("Keyboard"),
"",
"res/conditions/keyboard24.png",
"res/conditions/keyboard.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -76,7 +79,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsKeyboardExtension(
_("Any key pressed"),
_("Check if any key is pressed"),
_("Any key is pressed"),
_("Keyboard"),
"",
"res/conditions/keyboard24.png",
"res/conditions/keyboard.png")
.AddCodeOnlyParameter("currentScene", "");
@@ -86,7 +89,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsKeyboardExtension(
_("Any key released"),
_("Check if any key is released"),
_("Any key is released"),
_("Keyboard"),
"",
"res/conditions/keyboard24.png",
"res/conditions/keyboard.png")
.AddCodeOnlyParameter("currentScene", "");
@@ -96,7 +99,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsKeyboardExtension(
"LastPressedKey",
_("Last pressed key"),
_("Get the name of the latest key pressed on the keyboard"),
_("Keyboard"),
"",
"res/conditions/keyboard.png")
.AddCodeOnlyParameter("currentScene", "");
}

View File

@@ -18,13 +18,63 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
"A set of mathematical functions that can be used in expressions.",
"Florian Rival",
"Open source (MIT License)");
extension.AddInstructionOrExpressionGroupMetadata(_("Mathematical tools"))
.SetIcon("res/mathfunction.png");
extension
.AddExpression("Random",
_("Random integer"),
_("Random integer"),
"",
"res/dice-6.svg")
.SetHelpPath("/all-features/expressions")
.AddParameter("expression", _("Maximum value"));
extension
.AddExpression("RandomInRange",
_("Random integer in range"),
_("Random integer in range"),
"",
"res/dice-6.svg")
.SetHelpPath("/all-features/expressions")
.AddParameter("expression", _("Minimum value"))
.AddParameter("expression", _("Maximum value"));
extension
.AddExpression("RandomFloat",
_("Random float"),
_("Random float"),
"",
"res/dice-6.svg")
.SetHelpPath("/all-features/expressions")
.AddParameter("expression", _("Maximum value"));
extension
.AddExpression("RandomFloatInRange",
_("Random float in range"),
_("Random float in range"),
"",
"res/dice-6.svg")
.SetHelpPath("/all-features/expressions")
.AddParameter("expression", _("Minimum value"))
.AddParameter("expression", _("Maximum value"));
extension
.AddExpression("RandomWithStep",
_("Random value in steps"),
_("Random value in steps"),
"",
"res/dice-6.svg")
.SetHelpPath("/all-features/expressions")
.AddParameter("expression", _("Minimum value"))
.AddParameter("expression", _("Maximum value"))
.AddParameter("expression", _("Step"));
extension
.AddExpression("normalize",
_("Normalize a value between `min` and `max` to a value between 0 and 1."),
_("Remap a value between 0 and 1."),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Value"))
.AddParameter("expression", _("Min"))
@@ -34,7 +84,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("clamp",
_("Clamp (restrict a value to a given range)"),
_("Restrict a value to a given range"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Value"))
.AddParameter("expression", _("Min"))
@@ -44,7 +94,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("AngleDifference",
_("Difference between two angles"),
_("Difference between two angles"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("First angle"))
.AddParameter("expression", _("Second angle"));
@@ -53,7 +103,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("AngleBetweenPositions",
_("Angle between two positions"),
_("Compute the angle between two positions."),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("First point X position"))
.AddParameter("expression", _("First point Y position"))
@@ -64,7 +114,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("DistanceBetweenPositions",
_("Distance between two positions"),
_("Compute the distance between two positions."),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("First point X position"))
.AddParameter("expression", _("First point Y position"))
@@ -75,7 +125,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("mod",
_("Modulo"),
_("x mod y"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("x (as in x mod y)"))
.AddParameter("expression", _("y (as in x mod y)"));
@@ -84,7 +134,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("min",
_("Minimum of two numbers"),
_("Minimum of two numbers"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("First expression"))
.AddParameter("expression", _("Second expression"));
@@ -93,7 +143,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("max",
_("Maximum of two numbers"),
_("Maximum of two numbers"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("First expression"))
.AddParameter("expression", _("Second expression"));
@@ -102,7 +152,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("abs",
_("Absolute value"),
_("Absolute value"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -110,7 +160,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("acos",
_("Arccosine"),
_("Arccosine"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -118,7 +168,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("acosh",
_("Hyperbolic arccosine"),
_("Hyperbolic arccosine"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -126,7 +176,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("asin",
_("Arcsine"),
_("Arcsine"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -134,7 +184,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("asinh",
_("Arcsine"),
_("Arcsine"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -142,7 +192,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("atan",
_("Arctangent"),
_("Arctangent"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -150,7 +200,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("atan2",
_("2 argument arctangent"),
_("2 argument arctangent (atan2)"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Y"))
.AddParameter("expression", _("X"));
@@ -159,7 +209,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("atanh",
_("Hyperbolic arctangent"),
_("Hyperbolic arctangent"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -167,7 +217,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("cbrt",
_("Cube root"),
_("Cube root"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -175,7 +225,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("ceil",
_("Ceil (round up)"),
_("Round number up to an integer"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -183,7 +233,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("floor",
_("Floor (round down)"),
_("Round number down to an integer"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -191,7 +241,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("cos",
_("Cosine"),
_("Cosine of a number"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -199,7 +249,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("cosh",
_("Hyperbolic cosine"),
_("Hyperbolic cosine"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -207,7 +257,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("cot",
_("Cotangent"),
_("Cotangent of a number"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -215,7 +265,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("csc",
_("Cosecant"),
_("Cosecant of a number"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -223,7 +273,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("int",
_("Round"),
_("Round a number"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.SetHidden()
.AddParameter("expression", _("Expression"));
@@ -232,7 +282,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("rint",
_("Round"),
_("Round a number"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.SetHidden()
.AddParameter("expression", _("Expression"));
@@ -241,7 +291,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("round",
_("Round"),
_("Round a number"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -249,7 +299,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("exp",
_("Exponential"),
_("Exponential of a number"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -257,7 +307,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("log",
_("Logarithm"),
_("Logarithm"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -265,7 +315,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("ln",
_("Logarithm"),
_("Logarithm"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.SetHidden()
.AddParameter("expression", _("Expression"));
@@ -274,7 +324,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("log2",
_("Base-2 logarithm"),
_("Base 2 Logarithm"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -282,7 +332,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("log10",
_("Base-10 logarithm"),
_("Base-10 logarithm"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -290,7 +340,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("nthroot",
_("Nth root"),
_("Nth root of a number"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Number"))
.AddParameter("expression", _("N"));
@@ -299,7 +349,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("pow",
_("Power"),
_("Raise a number to power n"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Number"))
.AddParameter("expression", _("The exponent (n in x^n)"));
@@ -308,7 +358,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("sec",
_("Secant"),
_("Secant"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -316,7 +366,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("sign",
_("Sign of a number"),
_("Return the sign of a number (1,-1 or 0)"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -324,7 +374,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("sin",
_("Sine"),
_("Sine of a number"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -332,7 +382,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("sinh",
_("Hyperbolic sine"),
_("Hyperbolic sine"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -340,7 +390,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("sqrt",
_("Square root"),
_("Square root of a number"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -348,7 +398,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("tan",
_("Tangent"),
_("Tangent of a number"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -356,7 +406,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("tanh",
_("Hyperbolic tangent"),
_("Hyperbolic tangent"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -364,7 +414,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("trunc",
_("Truncation"),
_("Truncate a number"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Expression"));
@@ -372,7 +422,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddExpression("lerp",
_("Lerp (Linear interpolation)"),
_("Linearly interpolate a to b by x"),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("a (in a+(b-a)*x)"))
.AddParameter("expression", _("b (in a+(b-a)*x)"))
@@ -385,7 +435,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
"relative to the origin (0;0). This is also known as "
"getting the cartesian coordinates of a 2D vector, using "
"its polar coordinates."),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Angle, in degrees"))
.AddParameter("expression", _("Distance"));
@@ -397,7 +447,7 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
"relative to the origin (0;0). This is also known as "
"getting the cartesian coordinates of a 2D vector, using "
"its polar coordinates."),
_("Mathematical tools"),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Angle, in degrees"))
.AddParameter("expression", _("Distance"));

View File

@@ -23,7 +23,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
"separately in different events.",
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/all-features/mouse-touch");
.SetExtensionHelpPath("/all-features/mouse-touch")
.SetCategory("Input");
extension.AddInstructionOrExpressionGroupMetadata(_("Mouse and touch"))
.SetIcon("res/actions/mouse24.png");
extension
.AddCondition(
@@ -32,7 +35,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
_("Check if the mouse wheel is scrolling up. Use MouseWheelDelta "
"expression if you want to know the amount that was scrolled."),
_("The mouse wheel is scrolling up"),
_("Mouse and touch"),
"",
"res/actions/mouse24.png",
"res/actions/mouse.png")
@@ -46,7 +49,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
_("Check if the mouse wheel is scrolling down. Use MouseWheelDelta "
"expression if you want to know the amount that was scrolled."),
_("The mouse wheel is scrolling down"),
_("Mouse and touch"),
"",
"res/actions/mouse24.png",
"res/actions/mouse.png")
@@ -64,7 +67,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
"touchscreens. If you want to have multitouch and differentiate "
"mouse movement and touches, just deactivate it with this action."),
_("Move mouse cursor when touching screen: _PARAM1_"),
_("Mouse and touch"),
"",
"res/conditions/touch24.png",
"res/conditions/touch.png")
@@ -79,7 +82,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
_("Center cursor horizontally"),
_("Put the cursor in the middle of the screen horizontally."),
_("Center cursor horizontally"),
_("Mouse and touch"),
"",
"res/actions/mouse24.png",
"res/actions/mouse.png")
@@ -91,7 +94,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
_("Center cursor vertically"),
_("Put the cursor in the middle of the screen vertically."),
_("Center cursor vertically"),
_("Mouse and touch"),
"",
"res/actions/mouse24.png",
"res/actions/mouse.png")
@@ -103,7 +106,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
_("Hide the cursor"),
_("Hide the cursor."),
_("Hide the cursor"),
_("Mouse and touch"),
"",
"res/actions/mouse24.png",
"res/actions/mouse.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -114,7 +117,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
_("Show the cursor"),
_("Show the cursor."),
_("Show the cursor"),
_("Mouse and touch"),
"",
"res/actions/mouse24.png",
"res/actions/mouse.png")
@@ -126,7 +129,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
_("Position the cursor of the mouse"),
_("Position the cursor at the given coordinates."),
_("Position cursor at _PARAM1_;_PARAM2_"),
_("Mouse and touch"),
"",
"res/actions/mouse24.png",
"res/actions/mouse.png")
@@ -140,7 +143,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
_("Center the cursor"),
_("Center the cursor on the screen."),
_("Center the cursor"),
_("Mouse and touch"),
"",
"res/actions/mouse24.png",
"res/actions/mouse.png")
@@ -154,7 +157,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
_("Cursor X position"),
_("the X position of the cursor or of a touch"),
_("the cursor (or touch) X position"),
_("Mouse and touch"),
"",
"res/conditions/mouse24.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardParameters("number")
@@ -174,7 +177,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
_("Cursor Y position"),
_("the Y position of the cursor or of a touch"),
_("the cursor (or touch) Y position"),
_("Mouse and touch"),
"",
"res/conditions/mouse24.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardParameters("number")
@@ -187,13 +190,24 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
extension.AddDuplicatedCondition("SourisY", "MouseY").SetHidden();
extension.AddDuplicatedExpression("SourisY", "MouseY").SetHidden();
extension
.AddCondition("IsMouseInsideCanvas",
_("Mouse cursor is inside the window"),
_("Check if the mouse cursor is inside the window."),
_("The mouse cursor is inside the window"),
"",
"res/conditions/mouse24.png",
"res/conditions/mouse.png")
.AddCodeOnlyParameter("currentScene", "")
.MarkAsAdvanced();
extension
.AddCondition("MouseButtonPressed",
_("Mouse button pressed or touch held"),
_("Check if the specified mouse button is pressed or "
"if a touch is in contact with the screen."),
_("Touch or _PARAM1_ mouse button is down"),
_("Mouse and touch"),
"",
"res/conditions/mouse24.png",
"res/conditions/mouse.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -209,7 +223,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
_("Mouse button released"),
_("Check if the specified mouse button was released."),
_("_PARAM1_ mouse button was released"),
_("Mouse and touch"),
"",
"res/conditions/mouse24.png",
"res/conditions/mouse.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -223,7 +237,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
_("Check if a mouse button, retrieved from the result of the "
"expression, is pressed."),
_("_PARAM1_ mouse button is pressed"),
_("Mouse and touch"),
"",
"res/conditions/mouse24.png",
"res/conditions/mouse.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -241,7 +255,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
_("Check if a mouse button, retrieved from the result of the "
"expression, was just released."),
_("_PARAM1_ mouse button is released"),
_("Mouse and touch"),
"",
"res/conditions/mouse24.png",
"res/conditions/mouse.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -258,7 +272,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
_("Touch X position"),
_("the X position of a specific touch"),
_("the touch #_PARAM1_ X position"),
_("Mouse and touch/Multitouch"),
_("Multitouch"),
"res/conditions/touch24.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Touch identifier"))
@@ -274,7 +288,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
_("Touch Y position"),
_("the Y position of a specific touch"),
_("the touch #_PARAM1_ Y position"),
_("Mouse and touch/Multitouch"),
_("Multitouch"),
"res/conditions/touch24.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Touch identifier"))
@@ -294,10 +308,11 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
"next time you use it, it will be for a new touch, or it will "
"return false if no more touches have just started."),
_("A new touch has started"),
_("Mouse and touch/Multitouch"),
_("Multitouch"),
"res/conditions/touch24.png",
"res/conditions/touch.png")
.AddCodeOnlyParameter("currentScene", "");
.AddCodeOnlyParameter("currentScene", "")
.SetHidden();
extension
.AddCondition(
@@ -309,11 +324,57 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
"time you use it, it will be for a new touch, or it will return "
"false if no more touches have just ended."),
_("A touch has ended"),
_("Mouse and touch/Multitouch"),
_("Multitouch"),
"res/conditions/touch24.png",
"res/conditions/touch.png")
.AddCodeOnlyParameter("currentScene", "")
.SetHidden();
extension
.AddCondition(
"HasAnyTouchStarted",
_("A new touch has started"),
_("Check if a touch has just started on this frame. The touch identifiers can be "
"accessed using StartedTouchId() and StartedTouchCount()."),
_("A new touch has started"),
_("Multitouch"),
"res/conditions/touch24.png",
"res/conditions/touch.png")
.AddCodeOnlyParameter("currentScene", "");
extension
.AddExpression(
"StartedTouchCount",
_("Started touch count"),
_("The number of touches that have just started on this frame. The touch identifiers can be "
"accessed using StartedTouchId()."),
_("Multitouch"),
"res/conditions/touch.png")
.AddCodeOnlyParameter("currentScene", "");
extension
.AddExpression(
"StartedTouchId",
_("Started touch identifier"),
_("The identifier of the touch that has just started on this frame. The touch number of touches can be "
"accessed using StartedTouchCount()."),
_("Multitouch"),
"res/conditions/touch.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Touch index"));
extension
.AddCondition(
"HasTouchEnded",
_("A touch has ended"),
_("Check if a touch has ended."),
_("The touch with identifier _PARAM1_ has ended"),
_("Multitouch"),
"res/conditions/touch24.png",
"res/conditions/touch.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Touch identifier"));
extension
.AddExpression("MouseWheelDelta",
_("Mouse wheel: Displacement"),
@@ -326,17 +387,19 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
.AddExpression("LastTouchId",
_("Identifier of the last touch"),
_("Identifier of the last touch"),
_("Mouse and touch/Multitouch"),
_("Multitouch"),
"res/conditions/touch.png")
.AddCodeOnlyParameter("currentScene", "");
.AddCodeOnlyParameter("currentScene", "")
.SetHidden();
extension
.AddExpression("LastEndedTouchId",
_("Identifier of the last ended touch"),
_("Identifier of the last ended touch"),
_("Mouse and touch/Multitouch"),
_("Multitouch"),
"res/conditions/touch.png")
.AddCodeOnlyParameter("currentScene", "");
.AddCodeOnlyParameter("currentScene", "")
.SetHidden();
}
} // namespace gd

View File

@@ -14,12 +14,15 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsNetworkExtension(
extension
.SetExtensionInformation(
"BuiltinNetwork",
_("Basic internet features"),
_("Network"),
_("Features to send web requests, communicate with external \"APIs\" "
"and other network related tasks."),
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/all-features/network");
.SetExtensionHelpPath("/all-features/network")
.SetCategory("Network");
extension.AddInstructionOrExpressionGroupMetadata(_("Network"))
.SetIcon("res/actions/net24.png");
extension
.AddAction(
@@ -30,7 +33,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsNetworkExtension(
"as specified below, except if the server is configured to answer "
"to all requests (cross-domain requests).",
"Send _PARAM3_ request to _PARAM0__PARAM1_ with body: _PARAM2_",
_("Network"),
"",
"res/actions/net24.png",
"res/actions/net.png")
.AddParameter("string", "Host, with protocol")
@@ -65,7 +68,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsNetworkExtension(
"to all requests (cross-domain requests)."),
_("Send a _PARAM2_ request to _PARAM0_ with body: _PARAM1_, and "
"store the result in _PARAM4_ (or in _PARAM5_ in case of error)"),
_("Network"),
"",
"res/actions/net24.png",
"res/actions/net.png")
.AddParameter("string", _("URL (API or web-page address)"))
@@ -92,21 +95,37 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsNetworkExtension(
"explore the results with a *structure variable*."))
.AddParameter(
"scenevar", _("Variable where to store the error message"), "", true)
.SetParameterLongDescription(
_("Optional, only used if an error occurs. This will contain the "
"[\"status code\"](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes) "
"if the server returns a status >= 400. If the request was not sent "
"at all (e.g. no internet or CORS issues), the variable will be set to "
"\"REQUEST_NOT_SENT\"."))
.SetParameterLongDescription(_(
"Optional, only used if an error occurs. This will contain the "
"[\"status "
"code\"](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes) "
"if the server returns a status >= 400. If the request was not sent "
"at all (e.g. no internet or CORS issues), the variable will be set "
"to "
"\"REQUEST_NOT_SENT\"."))
.MarkAsComplex();
extension
.AddAction("LaunchFile",
_("Open a URL (web page) or a file"),
_("This action launches the specified file or URL, in a "
"browser (or in a new tab if the game is using the Web "
"platform and is launched inside a browser)."),
_("Open URL _PARAM0_ in a browser (or new tab)"),
"",
"res/actions/net24.png",
"res/actions/net.png")
.AddParameter("string", _("URL (or filename)"))
.AddCodeOnlyParameter("currentScene", "")
.MarkAsAdvanced();
extension
.AddAction(
"DownloadFile",
_("Download a file"),
_("Download a file from a web site"),
_("Download file _PARAM1_ from _PARAM0_ under the name of _PARAM2_"),
_("Network"),
"",
"res/actions/net24.png",
"res/actions/net.png")
.AddParameter("string", _("Host (for example : http://www.website.com)"))
@@ -124,78 +143,11 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsNetworkExtension(
"terms of service of your game and if they player gave their "
"consent, depending on how your game/company handles this."),
_("Enable analytics metrics: _PARAM1_"),
_("Network"),
"",
"res/actions/net24.png",
"res/actions/net.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("yesorno", _("Enable the metrics?"));
extension
.AddAction(
"JSONToVariableStructure",
_("Convert JSON to a scene variable"),
_("Parse a JSON object and store it into a scene variable"),
_("Parse JSON string _PARAM0_ and store it into variable _PARAM1_"),
_("Network"),
"res/actions/net24.png",
"res/actions/net.png")
.AddParameter("string", _("JSON string"))
.AddParameter("scenevar", _("Variable where store the JSON object"))
.MarkAsAdvanced();
extension
.AddAction("JSONToGlobalVariableStructure",
_("Convert JSON to global variable"),
_("Parse a JSON object and store it into a global variable"),
_("Parse JSON string _PARAM0_ and store it into global "
"variable _PARAM1_"),
_("Network"),
"res/actions/net24.png",
"res/actions/net.png")
.AddParameter("string", _("JSON string"))
.AddParameter("globalvar",
_("Global variable where store the JSON object"))
.MarkAsAdvanced();
extension
.AddAction("JSONToObjectVariableStructure",
_("Convert JSON to object variable"),
_("Parse a JSON object and store it into an object variable"),
_("Parse JSON string _PARAM0_ and store it into variable "
"_PARAM2_ of _PARAM1_"),
_("Network"),
"res/actions/net24.png",
"res/actions/net.png")
.AddParameter("string", _("JSON string"))
.AddParameter("objectPtr", _("Object"))
.AddParameter("objectvar",
_("Object variable where store the JSON object"))
.MarkAsAdvanced();
extension
.AddStrExpression("ToJSON",
_("Convert scene variable to JSON"),
_("Convert a scene variable to JSON"),
_("Conversion"),
"res/conditions/toujours24.png")
.AddParameter("scenevar", _("Scene variable to be stringified"));
extension
.AddStrExpression("GlobalVarToJSON",
_("Convert global variable to JSON"),
_("Convert a global variable to JSON"),
_("Conversion"),
"res/conditions/toujours24.png")
.AddParameter("globalvar", _("The global variable to be stringified"));
extension
.AddStrExpression("ObjectVarToJSON",
_("Convert object variable to JSON"),
_("Convert an object variable to JSON"),
_("Conversion"),
"res/conditions/toujours24.png")
.AddParameter("objectPtr", _("The object with the variable"))
.AddParameter("objectvar", _("The object variable to be stringified"));
}
} // namespace gd

View File

@@ -14,67 +14,19 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSceneExtension(
extension
.SetExtensionInformation(
"BuiltinScene",
_("Scene management features"),
_("Scene"),
_("Actions and conditions to manipulate the scenes during the game."),
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("" /*TODO: Add a documentation page for this */);
extension
.AddExpression("Random",
_("Random integer"),
_("Random integer"),
_("Random"),
"res/actions/position.png")
.SetHelpPath("/all-features/expressions")
.AddParameter("expression", _("Maximum value"));
extension
.AddExpression("RandomInRange",
_("Random integer in range"),
_("Random integer in range"),
_("Random"),
"res/actions/position.png")
.SetHelpPath("/all-features/expressions")
.AddParameter("expression", _("Minimum value"))
.AddParameter("expression", _("Maximum value"));
extension
.AddExpression("RandomFloat",
_("Random float"),
_("Random float"),
_("Random"),
"res/actions/position.png")
.SetHelpPath("/all-features/expressions")
.AddParameter("expression", _("Maximum value"));
extension
.AddExpression("RandomFloatInRange",
_("Random float in range"),
_("Random float in range"),
_("Random"),
"res/actions/position.png")
.SetHelpPath("/all-features/expressions")
.AddParameter("expression", _("Minimum value"))
.AddParameter("expression", _("Maximum value"));
extension
.AddExpression("RandomWithStep",
_("Random value in steps"),
_("Random value in steps"),
_("Random"),
"res/actions/position.png")
.SetHelpPath("/all-features/expressions")
.AddParameter("expression", _("Minimum value"))
.AddParameter("expression", _("Maximum value"))
.AddParameter("expression", _("Step"));
extension.AddInstructionOrExpressionGroupMetadata(_("Scene"))
.SetIcon("res/conditions/depart24.png");
extension
.AddStrExpression("CurrentSceneName",
_("Current scene name"),
_("Name of the current scene"),
_("Scene"),
"",
"res/actions/texte.png")
.AddCodeOnlyParameter("currentScene", "");
@@ -83,7 +35,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSceneExtension(
_("At the beginning of the scene"),
_("Is true only when scene just begins."),
_("At the beginning of the scene"),
_("Scene"),
"",
"res/conditions/depart24.png",
"res/conditions/depart.png")
.SetHelpPath("/interface/scene-editor/events")
@@ -95,7 +47,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSceneExtension(
_("Scene just resumed"),
_("The scene has just resumed after being paused."),
_("Scene just resumed"),
_("Scene"),
"",
"res/conditions/depart24.png",
"res/conditions/depart.png")
.SetHelpPath("/interface/scene-editor/events")
@@ -107,7 +59,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSceneExtension(
_("Change the scene"),
_("Stop this scene and start the specified one instead."),
_("Change to scene _PARAM1_"),
_("Scene"),
"",
"res/actions/replaceScene24.png",
"res/actions/replaceScene.png")
.SetHelpPath("/interface/scene-editor/events")
@@ -124,7 +76,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSceneExtension(
"can use the \"Stop and go back to previous scene\" action "
"to go back to this scene."),
_("Pause the scene and start _PARAM1_"),
_("Scene"),
"",
"res/actions/pushScene24.png",
"res/actions/pushScene.png")
.SetHelpPath("/interface/scene-editor/events")
@@ -139,7 +91,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSceneExtension(
_("Stop this scene and go back to the previous paused one.\nTo pause "
"a scene, use the \"Pause and start a new scene\" action."),
_("Stop the scene and go back to the previous paused one"),
_("Scene"),
"",
"res/actions/popScene24.png",
"res/actions/popScene.png")
.SetHelpPath("/interface/scene-editor/events")
@@ -151,7 +103,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSceneExtension(
_("Quit the game"),
_("Quit the game"),
_("Quit the game"),
_("Scene"),
"",
"res/actions/quit24.png",
"res/actions/quit.png")
.SetHelpPath("/interface/scene-editor/events")
@@ -163,7 +115,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSceneExtension(
_("Change background color"),
_("Change the background color of the scene."),
_("Set background color to _PARAM1_"),
_("Scene"),
"",
"res/actions/background24.png",
"res/actions/background.png")
.SetHelpPath("/interface/scene-editor/events")
@@ -177,41 +129,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSceneExtension(
_("mouse buttons must be taken "
"into account even\nif the window is not active."),
_("Disable input when focus is lost: _PARAM1_"),
_("Scene"),
"",
"res/actions/window24.png",
"res/actions/window.png")
.SetHelpPath("/interface/scene-editor/events")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("yesorno", _("Deactivate input when focus is lost"))
.MarkAsAdvanced();
extension
.AddCondition("Egal",
_("Compare two numbers"),
_("Compare the two numbers."),
_("_PARAM0_ _PARAM1_ _PARAM2_"),
_("Other"),
"res/conditions/egal24.png",
"res/conditions/egal.png")
.SetHelpPath("/all-features/advanced-conditions")
.AddParameter("expression", _("First expression"))
.AddParameter("relationalOperator", _("Sign of the test"), "number")
.AddParameter("expression", _("Second expression"))
.MarkAsAdvanced();
extension
.AddCondition("StrEqual",
_("Compare two strings"),
_("Compare the two strings."),
_("_PARAM0_ _PARAM1_ _PARAM2_"),
_("Other"),
"res/conditions/egal24.png",
"res/conditions/egal.png")
.SetHelpPath("/all-features/advanced-conditions")
.AddParameter("string", _("First string expression"))
.AddParameter("relationalOperator", _("Sign of the test"), "string")
.AddParameter("string", _("Second string expression"))
.MarkAsAdvanced();
}
} // namespace gd

View File

@@ -199,6 +199,18 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
.UseStandardOperatorParameters("number")
.MarkAsAdvanced();
obj.AddCondition("Width",
_("Width"),
_("Compare the width of a Sprite object."),
_("the width"),
_("Size"),
"res/conditions/scaleWidth24.png",
"res/conditions/scaleWidth.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters("number")
.MarkAsAdvanced();
obj.AddAction("ChangeHeight",
_("Height"),
_("Change the height of a Sprite object."),
@@ -211,6 +223,31 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
.UseStandardOperatorParameters("number")
.MarkAsAdvanced();
obj.AddCondition("Height",
_("Height"),
_("Compare the height of a Sprite object."),
_("the height"),
_("Size"),
"res/conditions/scaleHeight24.png",
"res/conditions/scaleHeight.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters("number")
.MarkAsAdvanced();
obj.AddAction("SetSize",
_("Size"),
_("Change the size of an object."),
_("Change the size of _PARAM0_: set to _PARAM1_x_PARAM2_"),
_("Size"),
"res/actions/scale24.png",
"res/actions/scale.png")
.AddParameter("object", _("Object"))
.AddParameter("expression", _("Width"))
.AddParameter("expression", _("Height"))
.MarkAsAdvanced();
obj.AddCondition(
"Animation",
_("Current animation"),

View File

@@ -20,18 +20,20 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("" /*TODO: Add a documentation page for this */);
extension.AddInstructionOrExpressionGroupMetadata(_("Text manipulation"))
.SetIcon("res/actions/text24.png");
extension.AddStrExpression("NewLine",
_("Insert a new line"),
_("Insert a new line"),
_("Manipulation of text"),
"",
"res/conditions/toujours24.png");
extension
.AddStrExpression("FromCodePoint",
_("Get character from code point"),
_("Get character from code point"),
_("Manipulation of text"),
"",
"res/conditions/toujours24.png")
.AddParameter("expression", _("Code point"));
@@ -40,7 +42,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
.AddStrExpression("ToUpperCase",
_("Uppercase a text"),
_("Uppercase a text"),
_("Manipulation of text"),
"",
"res/conditions/toujours24.png")
.AddParameter("string", _("Text"));
@@ -49,7 +51,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
.AddStrExpression("ToLowerCase",
_("Lowercase a text"),
_("Lowercase a text"),
_("Manipulation of text"),
"",
"res/conditions/toujours24.png")
.AddParameter("string", _("Text"));
@@ -58,7 +60,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
.AddStrExpression("SubStr",
_("Get a portion of a text"),
_("Get a portion of a text"),
_("Manipulation of text"),
"",
"res/conditions/toujours24.png")
.AddParameter("string", _("Text"))
@@ -71,7 +73,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
.AddStrExpression("StrAt",
_("Get a character from a text"),
_("Get a character from a text"),
_("Manipulation of text"),
"",
"res/conditions/toujours24.png")
.AddParameter("string", _("Text"))
@@ -83,7 +85,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
.AddStrExpression("StrRepeat",
_("Repeat a text"),
_("Repeat a text"),
_("Manipulation of text"),
"",
"res/conditions/toujours24.png")
.AddParameter("string", _("Text to repeat"))
@@ -93,7 +95,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
.AddExpression("StrLength",
_("Length of a text"),
_("Length of a text"),
_("Manipulation of text"),
"",
"res/conditions/toujours24.png")
.AddParameter("string", _("Text"));
@@ -103,7 +105,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
_("Search in a text"),
_("Search in a text (return the position of the result or "
"-1 if not found)"),
_("Manipulation of text"),
"",
"res/conditions/toujours24.png")
.AddParameter("string", _("Text"))
@@ -114,7 +116,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
"Search in a text from the end",
"Search in a text from the end (return the position of "
"the result or -1 if not found)",
_("Manipulation of text"),
"",
"res/conditions/toujours24.png")
.AddParameter("string", _("Text"))
@@ -128,7 +130,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
_("Search the last occurence in a string (return the position of "
"the result, from the beginning of the string, or -1 if not "
"found)"),
_("Manipulation of text"),
"",
"res/conditions/toujours24.png")
.AddParameter("string", _("Text"))
@@ -139,7 +141,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
_("Search in a text, starting from a position"),
_("Search in a text, starting from a position (return the "
"position of the result or -1 if not found)"),
_("Manipulation of text"),
"",
"res/conditions/toujours24.png")
.AddParameter("string", _("Text"))
@@ -154,7 +156,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
"Search in a text from the end, starting from a position",
"Search in a text from the end, starting from a position (return "
"the position of the result or -1 if not found)",
_("Manipulation of text"),
"",
"res/conditions/toujours24.png")
.AddParameter("string", _("Text"))
@@ -172,7 +174,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
"(return "
" the position of the result, from the beginning of the string, or "
"-1 if not found)"),
_("Manipulation of text"),
"",
"res/conditions/toujours24.png")
.AddParameter("string", _("Text"))

View File

@@ -14,13 +14,17 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
extension
.SetExtensionInformation(
"BuiltinTime",
_("Time"),
_("Timers and time"),
"Actions and conditions to run timers, get the current time or "
"modify the time scale (speed at which the game is running - useful "
"for slow motion effects).",
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/all-features/timers");
extension.AddInstructionOrExpressionGroupMetadata(
_("Timers and time")
)
.SetIcon("res/conditions/timer24.png");
// Deprecated and replaced by CompareTimer
extension
@@ -28,7 +32,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
_("Value of a scene timer"),
_("Test the elapsed time of a scene timer."),
_("The timer _PARAM2_ is greater than _PARAM1_ seconds"),
_("Timers and time"),
"",
"res/conditions/timer24.png",
"res/conditions/timer.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -39,9 +44,11 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
extension
.AddCondition("CompareTimer",
_("Value of a scene timer"),
_("Compare the elapsed time of a scene timer. This condition doesn't start the timer."),
_("Compare the elapsed time of a scene timer. This "
"condition doesn't start the timer."),
_("The timer _PARAM1_ _PARAM2_ _PARAM3_ seconds"),
_("Timers and time"),
"",
"res/conditions/timer24.png",
"res/conditions/timer.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -55,7 +62,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
_("Time scale"),
_("Compare the time scale of the scene."),
_("the time scale of the scene"),
_("Timers and time"),
"",
"res/conditions/time24.png",
"res/conditions/time.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -67,7 +75,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
_("Scene timer paused"),
_("Test if the specified scene timer is paused."),
_("The timer _PARAM1_ is paused"),
_("Timers and time"),
"",
"res/conditions/timerPaused24.png",
"res/conditions/timerPaused.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -81,7 +90,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
_("Reset the specified scene timer, if the timer doesn't exist "
"it's created and started."),
_("Start (or reset) the timer _PARAM1_"),
_("Timers and time"),
"",
"res/actions/timer24.png",
"res/actions/timer.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -92,7 +102,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
_("Pause a scene timer"),
_("Pause a scene timer."),
_("Pause timer _PARAM1_"),
_("Timers and time"),
"",
"res/actions/pauseTimer24.png",
"res/actions/pauseTimer.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -104,7 +115,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
_("Unpause a scene timer"),
_("Unpause a scene timer."),
_("Unpause timer _PARAM1_"),
_("Timers and time"),
"",
"res/actions/unPauseTimer24.png",
"res/actions/unPauseTimer.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -116,7 +128,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
_("Delete a scene timer"),
_("Delete a scene timer from memory."),
_("Delete timer _PARAM1_ from memory"),
_("Timers and time"),
"",
"res/actions/timer24.png",
"res/actions/timer.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -128,7 +141,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
_("Change time scale"),
_("Change the time scale of the scene."),
_("Set the time scale of the scene to _PARAM1_"),
_("Timers and time"),
"",
"res/actions/time24.png",
"res/actions/time.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -139,7 +153,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
.AddExpression("TimeDelta",
_("Time elapsed since the last frame"),
_("Time elapsed since the last frame rendered on screen"),
_("Time"),
"",
"res/actions/time.png")
.AddCodeOnlyParameter("currentScene", "");
@@ -147,7 +161,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
.AddExpression("TempsFrame",
_("Time elapsed since the last frame"),
_("Time elapsed since the last frame rendered on screen"),
_("Time"),
"",
"res/actions/time.png")
.SetHidden()
.AddCodeOnlyParameter("currentScene", "");
@@ -156,7 +170,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
.AddExpression("ElapsedTime",
_("Time elapsed since the last frame"),
_("Time elapsed since the last frame rendered on screen"),
_("Time"),
"",
"res/actions/time.png")
.SetHidden()
.AddCodeOnlyParameter("currentScene", "");
@@ -165,7 +179,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
.AddExpression("TimerElapsedTime",
_("Scene timer value"),
_("Value of a scene timer"),
_("Time"),
"",
"res/actions/time.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Timer's name"));
@@ -174,7 +188,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
.AddExpression("TimeFromStart",
_("Time elapsed since the beginning of the scene"),
_("Time elapsed since the beginning of the scene"),
_("Time"),
"",
"res/actions/time.png")
.AddCodeOnlyParameter("currentScene", "");
@@ -182,7 +196,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
.AddExpression("TempsDebut",
_("Time elapsed since the beginning of the scene"),
_("Time elapsed since the beginning of the scene"),
_("Time"),
"",
"res/actions/time.png")
.SetHidden()
.AddCodeOnlyParameter("currentScene", "");
@@ -191,7 +205,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
.AddExpression("TimeScale",
_("Time scale"),
_("Returns the time scale of the scene."),
_("Time"),
"",
"res/actions/time.png")
.AddCodeOnlyParameter("currentScene", "");
@@ -199,7 +213,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
.AddExpression("Time",
_("Current time"),
_("Current time"),
_("Time"),
"",
"res/actions/time.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter(
@@ -210,7 +224,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
"timestamp\""),
"[\"hour\", \"min\", \"sec\", \"mon\", \"year\", \"wday\", \"mday\", "
"\"yday\", \"timestamp\"]");
}
} // namespace gd

View File

@@ -14,7 +14,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.SetExtensionInformation(
"BuiltinVariables",
_("Variable features"),
_("Variables"),
"Actions, conditions and expressions to handle variables, from "
"simple variables like the player score, the number of remaining "
"lives to complex variables containing arbitrary data like an "
@@ -22,13 +22,15 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/all-features/variables");
extension.AddInstructionOrExpressionGroupMetadata(_("Variables"))
.SetIcon("res/conditions/var24.png");
extension
.AddCondition("VarScene",
_("Value of a scene variable"),
_("Compare the value of a scene variable."),
_("the scene variable _PARAM0_"),
_("Variables/Scene variables"),
_("Scene variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("scenevar", _("Variable"))
@@ -39,7 +41,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Text of a scene variable"),
_("Compare the text of a scene variable."),
_("the text of scene variable _PARAM0_"),
_("Variables/Scene variables"),
_("Scene variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("scenevar", _("Variable"))
@@ -51,7 +53,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Boolean value of a scene variable"),
_("Compare the boolean value of a scene variable."),
_("The boolean value of scene variable _PARAM0_ is _PARAM1_"),
_("Variables/Scene variables"),
_("Scene variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("scenevar", _("Variable"))
@@ -64,7 +66,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Child existence"),
_("Check if the specified child of the scene variable exists."),
_("Child _PARAM1_ of scene variable _PARAM0_ exists"),
_("Variables/Scene variables/Collections/Structures"),
_("Scene variables/Collections/Structures"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("scenevar", _("Variable"))
@@ -77,7 +79,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Check if the specified child of the global "
"variable exists."),
_("Child _PARAM1_ of global variable _PARAM0_ exists"),
_("Variables/Global variables/Collections/Structures"),
_("Global variables/Collections/Structures"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("globalvar", _("Variable"))
@@ -89,7 +91,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
"Test if a scene variable is defined",
"Test if the scene variable exists.",
"Scene variable _PARAM0_ is defined",
_("Variables/Scene variables"),
_("Scene variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -101,7 +103,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Value of a global variable"),
_("Compare the value of a global variable."),
_("the global variable _PARAM0_"),
_("Variables/Global variables"),
_("Global variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("globalvar", _("Variable"))
@@ -113,7 +115,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Text of a global variable"),
_("Compare the text of a global variable."),
_("the text of the global variable _PARAM0_"),
_("Variables/Global variables"),
_("Global variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("globalvar", _("Variable"))
@@ -126,7 +128,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Boolean value of a global variable"),
_("Compare the boolean value of a global variable."),
_("The boolean value of global variable _PARAM0_ is _PARAM1_"),
_("Variables/Global variables"),
_("Global variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("globalvar", _("Variable"))
@@ -138,7 +140,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
"Test if a global variable is defined",
"Test if a global variable exists",
"Global variable _PARAM0_ is defined",
_("Variables/Global variables"),
_("Global variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -151,7 +153,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Value of a scene variable"),
_("Change the value of a scene variable."),
_("the scene variable _PARAM0_"),
_("Variables/Scene variables"),
_("Scene variables"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Variable"))
@@ -162,7 +164,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("String of a scene variable"),
_("Modify the text of a scene variable."),
_("the text of scene variable _PARAM0_"),
_("Variables/Scene variables"),
_("Scene variables"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Variable"))
@@ -174,7 +176,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Boolean value of a scene variable"),
_("Modify the boolean value of a scene variable."),
_("Set the boolean value of scene variable _PARAM0_ to _PARAM1_"),
_("Variables/Scene variables"),
_("Scene variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("scenevar", _("Variable"))
@@ -187,7 +189,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("If it was true, it will become false, and if it was "
"false it will become true."),
_("Toggle the boolean value of scene variable _PARAM0_"),
_("Variables/Scene variables"),
_("Scene variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("scenevar", _("Variable"));
@@ -197,7 +199,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Value of a global variable"),
_("Change the value of a global variable"),
_("the global variable _PARAM0_"),
_("Variables/Global variables"),
_("Global variables"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Variable"))
@@ -209,7 +211,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("String of a global variable"),
_("Modify the text of a global variable."),
_("the text of global variable _PARAM0_"),
_("Variables/Global variables"),
_("Global variables"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Variable"))
@@ -222,7 +224,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Boolean value of a global variable"),
_("Modify the boolean value of a global variable."),
_("Set the boolean value of global variable _PARAM0_ to _PARAM1_"),
_("Variables/Global variables"),
_("Global variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("globalvar", _("Variable"))
@@ -235,7 +237,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("If it was true, it will become false, and if it was "
"false it will become true."),
_("Toggle the boolean value of global variable _PARAM0_"),
_("Variables/Global variables"),
_("Global variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("globalvar", _("Variable"));
@@ -245,7 +247,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Remove a child"),
_("Remove a child from a scene variable."),
_("Remove child _PARAM1_ from scene variable _PARAM0_"),
_("Variables/Scene variables/Collections/Structures"),
_("Scene variables/Collections/Structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Variable"))
@@ -257,7 +259,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Remove a child"),
_("Remove a child from a global variable."),
_("Remove child _PARAM1_ from global variable _PARAM0_"),
_("Variables/Global variables/Collections/Structures"),
_("Global variables/Collections/Structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Variable"))
@@ -269,7 +271,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Clear scene variable"),
_("Remove all the children from the scene variable."),
_("Clear children from scene variable _PARAM0_"),
_("Variables/Scene variables/Collections"),
_("Scene variables/Collections"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Variable"))
@@ -280,7 +282,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Clear global variable"),
_("Remove all the children from the global variable."),
_("Clear children from global variable _PARAM0_"),
_("Variables/Global variables/Collections"),
_("Global variables/Collections"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Variable"))
@@ -291,7 +293,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Append variable to a scene array"),
_("Appends a variable at the end of a scene array variable."),
_("Append variable _PARAM1_ to array variable _PARAM0_"),
_("Variables/Scene variables/Collections/Arrays"),
_("Scene variables/Collections/Arrays"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Array variable"))
@@ -304,7 +306,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Append a string to a scene array"),
_("Appends a string at the end of a scene array variable."),
_("Append string _PARAM1_ to array variable _PARAM0_"),
_("Variables/Scene variables/Collections/Arrays"),
_("Scene variables/Collections/Arrays"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Array variable"))
@@ -316,7 +318,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Append a number to a scene array"),
_("Appends a number at the end of a scene array variable."),
_("Append number _PARAM1_ to array variable _PARAM0_"),
_("Variables/Scene variables/Collections/Arrays"),
_("Scene variables/Collections/Arrays"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Array variable"))
@@ -328,7 +330,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Append a boolean to a scene array"),
_("Appends a boolean at the end of a scene array variable."),
_("Append boolean _PARAM1_ to array variable _PARAM0_"),
_("Variables/Scene variables/Collections/Arrays"),
_("Scene variables/Collections/Arrays"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Array variable"))
@@ -341,7 +343,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Remove variable from a scene array (by index)"),
_("Removes a variable at the specified index of a scene array variable."),
_("Remove variable at index _PARAM1_ from scene array variable _PARAM0_"),
_("Variables/Scene variables/Collections/Arrays"),
_("Scene variables/Collections/Arrays"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Variable"))
@@ -353,7 +355,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Append variable to a global array"),
_("Appends a variable at the end of a global array variable."),
_("Append variable _PARAM1_ to array variable _PARAM0_"),
_("Variables/Global variables/Collections/Arrays"),
_("Global variables/Collections/Arrays"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Array variable"))
@@ -367,7 +369,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Remove variable from a global array (by index)"),
_("Removes a variable at the specified index of a global array variable."),
_("Remove variable at index _PARAM1_ from global array variable _PARAM0_"),
_("Variables/Global variables/Collections/Arrays"),
_("Global variables/Collections/Arrays"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Variable"))
@@ -379,7 +381,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Append a string to a global array"),
_("Appends a string at the end of a global array variable."),
_("Append string _PARAM1_ to array variable _PARAM0_"),
_("Variables/Global variables/Collections/Arrays"),
_("Global variables/Collections/Arrays"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Array variable"))
@@ -391,7 +393,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Append a number to a global array"),
_("Appends a number at the end of a global array variable."),
_("Append number _PARAM1_ to array variable _PARAM0_"),
_("Variables/Global variables/Collections/Arrays"),
_("Global variables/Collections/Arrays"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Array variable"))
@@ -403,7 +405,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
_("Append a boolean to a global array"),
_("Appends a boolean at the end of a global array variable."),
_("Append boolean _PARAM1_ to array variable _PARAM0_"),
_("Variables/Global variables/Collections/Arrays"),
_("Global variables/Collections/Arrays"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Array variable"))
@@ -414,7 +416,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
.AddExpression("GlobalVariableChildCount",
_("Number of children of a global variable"),
_("Number of children of a global variable"),
_("Variables/Global variables"),
_("Global variables"),
"res/actions/var.png")
.AddParameter("globalvar", _("Variable"));
@@ -422,7 +424,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
.AddExpression("VariableChildCount",
_("Number of children of a scene variable"),
_("Number of children of a scene variable"),
_("Variables/Scene variables"),
_("Scene variables"),
"res/actions/var.png")
.AddParameter("scenevar", _("Variable"));
@@ -430,7 +432,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
.AddExpression("Variable",
_("Value of a scene variable"),
_("Value of a scene variable"),
_("Variables/Scene variables"),
_("Scene variables"),
"res/actions/var.png")
.AddParameter("scenevar", _("Variable"));
@@ -438,7 +440,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
.AddStrExpression("VariableString",
_("Text of a scene variable"),
_("Text of a scene variable"),
_("Variables/Scene variables"),
_("Scene variables"),
"res/actions/var.png")
.AddParameter("scenevar", _("Variable"));
@@ -446,7 +448,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
.AddExpression("GlobalVariable",
_("Value of a global variable"),
_("Value of a global variable"),
_("Variables/Global variables"),
_("Global variables"),
"res/actions/var.png")
.AddParameter("globalvar", _("Name of the global variable"));
@@ -454,7 +456,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
.AddStrExpression("GlobalVariableString",
_("Text of a global variable"),
_("Text of a global variable"),
_("Variables/Global variables"),
_("Global variables"),
"res/actions/var.png")
.AddParameter("globalvar", _("Variable"));
}

View File

@@ -14,13 +14,17 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
extension
.SetExtensionInformation(
"BuiltinWindow",
_("Window features"),
_("Game window and resolution"),
"Provides actions and conditions to manipulate the game window. "
"Depending on the platform on which the game is running, not all of "
"these features can be applied.",
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/all-features/window");
extension
.AddInstructionOrExpressionGroupMetadata(
_("Game window and resolution"))
.SetIcon("res/actions/window24.png");
extension
.AddAction(
@@ -28,7 +32,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
_("De/activate fullscreen"),
_("This action activates or deactivates fullscreen."),
_("Activate fullscreen: _PARAM1_ (keep aspect ratio: _PARAM2_)"),
_("Game's window and resolution"),
"",
"res/actions/fullscreen24.png",
"res/actions/fullscreen.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -44,7 +48,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
_("Fullscreen activated?"),
_("Check if the game is currently in fullscreen."),
_("The game is in fullscreen"),
_("Game's window and resolution"),
"",
"res/actions/fullscreen24.png",
"res/actions/fullscreen.png")
.AddCodeOnlyParameter("currentScene", "");
@@ -56,7 +60,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
"game frame and the window borders."),
_("Set margins of game window to "
"_PARAM1_;_PARAM2_;_PARAM3_;_PARAM4_"),
_("Game's window and resolution"),
"",
"res/actions/window24.png",
"res/actions/window.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -72,7 +76,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
"the game area size. This won't change the size of the "
"window in which the game is running."),
_("Set game resolution to _PARAM1_x_PARAM2_"),
_("Game's window and resolution"),
"",
"res/actions/window24.png",
"res/actions/window.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -89,7 +93,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
"window size. Game resolution can still be updated."),
_("Set game window size to _PARAM1_x_PARAM2_ (also update game "
"resolution: _PARAM3_)"),
_("Game's window and resolution"),
"",
"res/actions/window24.png",
"res/actions/window.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -106,7 +110,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
"only works on Windows, macOS and Linux (not when the game "
"is executed in a web-browser or on iOS/Android)."),
_("Center the game window"),
_("Game's window and resolution"),
"",
"res/actions/window24.png",
"res/actions/window.png")
.AddCodeOnlyParameter("currentScene", "");
@@ -118,7 +122,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
"should be changed to fit the game window - or if the game "
"resolution should not be updated automatically."),
_("Set game resolution resize mode to _PARAM1_"),
_("Game's window and resolution"),
"",
"res/actions/window24.png",
"res/actions/window.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -139,7 +143,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
"be the case if the game resolution resize mode is "
"configured to adapt the width or the height of the game."),
_("Automatically adapt the game resolution: _PARAM1_"),
_("Game's window and resolution"),
"",
"res/actions/window24.png",
"res/actions/window.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -152,7 +156,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
_("Change the window's icon"),
_("This action changes the icon of the game's window."),
_("Use _PARAM1_ as the icon for the game's window."),
_("Game's window and resolution"),
"",
"res/actions/window24.png",
"res/actions/window.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -163,7 +167,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
_("Change the window's title"),
_("This action changes the title of the game's window."),
_("Change window title to _PARAM1_"),
_("Game's window and resolution"),
"",
"res/actions/window24.png",
"res/actions/window.png")
.AddCodeOnlyParameter("currentScene", "")
@@ -174,7 +178,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
"SceneWindowWidth",
_("Width of the scene window"),
_("Width of the scene window (or scene canvas for HTML5 games)"),
_("Screen"),
"",
"res/window.png")
.AddCodeOnlyParameter("currentScene", "");
@@ -183,7 +187,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
"SceneWindowHeight",
_("Height of the scene window"),
_("Height of the scene window (or scene canvas for HTML5 games)"),
_("Screen"),
"",
"res/window.png")
.AddCodeOnlyParameter("currentScene", "");
@@ -191,27 +195,27 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
"ScreenWidth",
_("Width of the screen/page"),
_("Width of the screen (or the page for HTML5 games in browser)"),
_("Screen"),
"",
"res/display16.png");
extension.AddExpression(
"ScreenHeight",
_("Height of the screen/page"),
_("Height of the screen (or the page for HTML5 games in browser)"),
_("Screen"),
"",
"res/display16.png");
extension.AddExpression("ColorDepth",
_("Color depth"),
_("Color depth"),
_("Screen"),
"",
"res/display16.png");
extension
.AddStrExpression("WindowTitle",
_("Window's title"),
_("Window's title"),
_("Screen"),
"",
"res/window.png")
.AddCodeOnlyParameter("currentScene", "");
}

View File

@@ -234,6 +234,40 @@ BehaviorMetadata::AddExpressionAndConditionAndAction(
const gd::String& sentenceName,
const gd::String& group,
const gd::String& icon) {
if (type != "number" && type != "string" && type != "boolean") {
gd::LogError(
"Unrecognised type passed to AddExpressionAndConditionAndAction: " +
type + ". Verify this type is valid and supported.");
}
gd::String conditionDescriptionTemplate =
type == "boolean" ? _("Check if <subject>.") : _("Compare <subject>.");
auto& condition =
AddScopedCondition(name,
fullname,
conditionDescriptionTemplate.FindAndReplace(
"<subject>", descriptionSubject),
sentenceName,
group,
icon,
icon);
gd::String actionDescriptionTemplate = type == "boolean"
? _("Set (or unset) if <subject>.")
: _("Change <subject>.");
auto& action = AddScopedAction(
"Set" + name,
fullname,
actionDescriptionTemplate.FindAndReplace("<subject>", descriptionSubject),
sentenceName,
group,
icon,
icon);
if (type == "boolean") {
return MultipleInstructionMetadata::WithConditionAndAction(condition, action);
}
gd::String expressionDescriptionTemplate = _("Return <subject>.");
auto& expression =
type == "number"
@@ -250,27 +284,6 @@ BehaviorMetadata::AddExpressionAndConditionAndAction(
group,
icon);
gd::String conditionDescriptionTemplate = _("Compare <subject>.");
auto& condition =
AddScopedCondition(name,
fullname,
conditionDescriptionTemplate.FindAndReplace(
"<subject>", descriptionSubject),
sentenceName,
group,
icon,
icon);
gd::String actionDescriptionTemplate = _("Change <subject>.");
auto& action = AddScopedAction(
"Set" + name,
fullname,
actionDescriptionTemplate.FindAndReplace("<subject>", descriptionSubject),
sentenceName,
group,
icon,
icon);
return MultipleInstructionMetadata::WithExpressionAndConditionAndAction(
expression, condition, action);
}

View File

@@ -250,6 +250,27 @@ class GD_CORE_API BehaviorMetadata {
return sharedDatasInstance.get();
}
/**
* \brief Return a reference to a map containing the names of the actions
* (as keys) and the metadata associated with (as values).
*/
std::map<gd::String, gd::InstructionMetadata>& GetAllActions() { return actionsInfos; };
/**
* \see gd::PlatformExtension::GetAllActions
*/
std::map<gd::String, gd::InstructionMetadata>& GetAllConditions() { return conditionsInfos; };
/**
* \see gd::PlatformExtension::GetAllActions
*/
std::map<gd::String, gd::ExpressionMetadata>& GetAllExpressions() { return expressionsInfos; };
/**
* \see gd::PlatformExtension::GetAllActions
*/
std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressions() { return strExpressionsInfos; };
#if defined(GD_IDE_ONLY)
std::map<gd::String, gd::InstructionMetadata> conditionsInfos;
std::map<gd::String, gd::InstructionMetadata> actionsInfos;

View File

@@ -72,4 +72,11 @@ gd::ExpressionMetadata& ExpressionMetadata::AddCodeOnlyParameter(
return *this;
}
gd::ExpressionMetadata& ExpressionMetadata::SetRequiresBaseObjectCapability(
const gd::String& capability) {
requiredBaseObjectCapability = capability;
return *this;
}
} // namespace gd

View File

@@ -222,6 +222,23 @@ class GD_CORE_API ExpressionMetadata {
return *this;
};
/**
* \brief Mark this (object) expression as requiring the specified capability,
* offered by the base object.
* This is useful for some objects that don't support this capability, so that
* the editor can hide the expression as it does not apply to them.
*/
ExpressionMetadata& SetRequiresBaseObjectCapability(
const gd::String& capability);
/**
* \brief Get the required specified capability for this (object) expression,
* or an empty string if there is nothing specific required.
*/
const gd::String& GetRequiredBaseObjectCapability() const {
return requiredBaseObjectCapability;
};
/**
* \brief Set the function that should be called when generating the source
* code from events.
@@ -273,6 +290,7 @@ class GD_CORE_API ExpressionMetadata {
gd::String smallIconFilename;
gd::String extensionNamespace;
bool isPrivate;
gd::String requiredBaseObjectCapability;
};
} // namespace gd

View File

@@ -10,6 +10,7 @@
#include "GDCore/CommonTools.h"
#include "GDCore/Serialization/SerializerElement.h"
#include "GDCore/Tools/Localization.h"
#include "GDCore/Tools/Log.h"
#include "ParameterMetadata.h"
namespace gd {
@@ -66,8 +67,9 @@ InstructionMetadata& InstructionMetadata::AddParameter(
? (supplementaryInformation.empty()
? ""
: extensionNamespace +
supplementaryInformation //... so prefix it with the extension
// namespace.
supplementaryInformation //... so prefix it with the
// extension
// namespace.
)
: supplementaryInformation; // Otherwise don't change anything
@@ -93,32 +95,55 @@ InstructionMetadata& InstructionMetadata::UseStandardOperatorParameters(
const gd::String& type) {
SetManipulatedType(type);
AddParameter("operator", _("Modification's sign"), type);
AddParameter(type == "number" ? "expression" : type, _("Value"));
size_t operatorParamIndex = parameters.size() - 2;
size_t valueParamIndex = parameters.size() - 1;
if (type == "boolean") {
AddParameter("yesorno", _("New value"));
size_t valueParamIndex = parameters.size() - 1;
if (isObjectInstruction || isBehaviorInstruction) {
gd::String templateSentence =
_("Change <subject> of _PARAM0_: <operator> <value>");
if (isObjectInstruction || isBehaviorInstruction) {
gd::String templateSentence = _("Set _PARAM0_ as <subject>: <value>");
sentence =
templateSentence.FindAndReplace("<subject>", sentence)
.FindAndReplace(
"<operator>",
"_PARAM" + gd::String::From(operatorParamIndex) + "_")
.FindAndReplace("<value>",
"_PARAM" + gd::String::From(valueParamIndex) + "_");
sentence =
templateSentence
.FindAndReplace("<subject>", sentence)
.FindAndReplace("<value>",
"_PARAM" + gd::String::From(valueParamIndex) + "_");
} else {
gd::String templateSentence = _("Change <subject>: <value>");
sentence =
templateSentence
.FindAndReplace("<subject>", sentence)
.FindAndReplace("<value>",
"_PARAM" + gd::String::From(valueParamIndex) + "_");
}
} else {
gd::String templateSentence = _("Change <subject>: <operator> <value>");
AddParameter("operator", _("Modification's sign"), type);
AddParameter(type == "number" ? "expression" : type, _("Value"));
sentence =
templateSentence.FindAndReplace("<subject>", sentence)
.FindAndReplace(
"<operator>",
"_PARAM" + gd::String::From(operatorParamIndex) + "_")
.FindAndReplace("<value>",
"_PARAM" + gd::String::From(valueParamIndex) + "_");
size_t operatorParamIndex = parameters.size() - 2;
size_t valueParamIndex = parameters.size() - 1;
if (isObjectInstruction || isBehaviorInstruction) {
gd::String templateSentence = _("Change <subject> of _PARAM0_: <operator> <value>");
sentence =
templateSentence.FindAndReplace("<subject>", sentence)
.FindAndReplace(
"<operator>",
"_PARAM" + gd::String::From(operatorParamIndex) + "_")
.FindAndReplace("<value>",
"_PARAM" + gd::String::From(valueParamIndex) + "_");
} else {
gd::String templateSentence = _("Change <subject>: <operator> <value>");
sentence =
templateSentence.FindAndReplace("<subject>", sentence)
.FindAndReplace(
"<operator>",
"_PARAM" + gd::String::From(operatorParamIndex) + "_")
.FindAndReplace("<value>",
"_PARAM" + gd::String::From(valueParamIndex) + "_");
}
}
return *this;
@@ -129,34 +154,62 @@ InstructionMetadata::UseStandardRelationalOperatorParameters(
const gd::String& type) {
SetManipulatedType(type);
AddParameter("relationalOperator", _("Sign of the test"), type);
AddParameter(type == "number" ? "expression" : type, _("Value to compare"));
size_t operatorParamIndex = parameters.size() - 2;
size_t valueParamIndex = parameters.size() - 1;
if (type == "boolean") {
if (isObjectInstruction || isBehaviorInstruction) {
gd::String templateSentence = _("_PARAM0_ is <subject>");
if (isObjectInstruction || isBehaviorInstruction) {
gd::String templateSentence = _("<subject> of _PARAM0_ <operator> <value>");
sentence =
templateSentence
.FindAndReplace("<subject>", sentence);
} else {
gd::String templateSentence = _("<subject>");
sentence =
templateSentence.FindAndReplace("<subject>", sentence)
.FindAndReplace(
"<operator>",
"_PARAM" + gd::String::From(operatorParamIndex) + "_")
.FindAndReplace("<value>",
"_PARAM" + gd::String::From(valueParamIndex) + "_");
sentence =
templateSentence.FindAndReplace("<subject>", sentence);
}
} else {
gd::String templateSentence = _("<subject> <operator> <value>");
AddParameter("relationalOperator", _("Sign of the test"), type);
AddParameter(type == "number" ? "expression" : type, _("Value to compare"));
size_t operatorParamIndex = parameters.size() - 2;
size_t valueParamIndex = parameters.size() - 1;
sentence =
templateSentence.FindAndReplace("<subject>", sentence)
.FindAndReplace(
"<operator>",
"_PARAM" + gd::String::From(operatorParamIndex) + "_")
.FindAndReplace("<value>",
"_PARAM" + gd::String::From(valueParamIndex) + "_");
if (isObjectInstruction || isBehaviorInstruction) {
gd::String templateSentence = _("<subject> of _PARAM0_ <operator> <value>");
sentence =
templateSentence.FindAndReplace("<subject>", sentence)
.FindAndReplace(
"<operator>",
"_PARAM" + gd::String::From(operatorParamIndex) + "_")
.FindAndReplace("<value>",
"_PARAM" + gd::String::From(valueParamIndex) + "_");
} else {
gd::String templateSentence = _("<subject> <operator> <value>");
sentence =
templateSentence.FindAndReplace("<subject>", sentence)
.FindAndReplace(
"<operator>",
"_PARAM" + gd::String::From(operatorParamIndex) + "_")
.FindAndReplace("<value>",
"_PARAM" + gd::String::From(valueParamIndex) + "_");
}
}
return *this;
}
InstructionMetadata& InstructionMetadata::SetRequiresBaseObjectCapability(
const gd::String& capability) {
if (!IsObjectInstruction() && !IsBehaviorInstruction()) {
gd::LogError("Tried to add capability \"" + capability +
"\" to instruction named \"" + fullname +
"\", which is not an object or behavior instruction.");
return *this;
}
requiredBaseObjectCapability = capability;
return *this;
}
} // namespace gd

View File

@@ -138,18 +138,19 @@ class GD_CORE_API InstructionMetadata {
* \param description Description for parameter
* \param supplementaryInformation Additional information that can be used for
* rendering or logic. For example:
* - If type is "object", this argument will describe which objects are allowed.
* If this argument is empty, all objects are allowed.
* - If type is "operator", this argument will be used to display only pertinent operators.
* \param parameterIsOptional true if the parameter must be optional, false
* otherwise.
* - If type is "object", this argument will describe which objects are
* allowed. If this argument is empty, all objects are allowed.
* - If type is "operator", this argument will be used to display only
* pertinent operators. \param parameterIsOptional true if the parameter must
* be optional, false otherwise.
*
* \see EventsCodeGenerator::GenerateParametersCodes
*/
InstructionMetadata &AddParameter(const gd::String &type,
const gd::String &label,
const gd::String &supplementaryInformation = "",
bool parameterIsOptional = false);
InstructionMetadata &AddParameter(
const gd::String &type,
const gd::String &label,
const gd::String &supplementaryInformation = "",
bool parameterIsOptional = false);
/**
* \brief Add a parameter not displayed in editor.
@@ -197,8 +198,19 @@ class GD_CORE_API InstructionMetadata {
* \see AddParameter
*/
InstructionMetadata &SetParameterExtraInfo(const gd::String &extraInfo) {
if (!parameters.empty()) parameters.back().SetExtraInfo(extraInfo);
return *this;
};
/**
* \brief Consider that the parameter is harder for a user to understand
* and not necessary for common usages.
*
* \see AddParameter
*/
InstructionMetadata &MarkParameterAsAdvanced() {
if (!parameters.empty())
parameters.back().SetExtraInfo(extraInfo);
parameters.back().MarkAsAdvanced();
return *this;
};
@@ -236,16 +248,29 @@ class GD_CORE_API InstructionMetadata {
/**
* \brief Check if the instruction is an object instruction.
*/
bool IsObjectInstruction() const {
return isObjectInstruction;
}
bool IsObjectInstruction() const { return isObjectInstruction; }
/**
* \brief Check if the instruction is a behavior instruction.
*/
bool IsBehaviorInstruction() const {
return isBehaviorInstruction;
}
bool IsBehaviorInstruction() const { return isBehaviorInstruction; }
/**
* \brief Mark this (object) instruction as requiring the specified
* capability, offered by the base object. This is useful for some objects
* that don't support this capability, so that the editor can hide the
* instruction as it does not apply to them.
*/
InstructionMetadata &SetRequiresBaseObjectCapability(
const gd::String &capability);
/**
* \brief Get the required specified capability for this (object) instruction,
* or an empty string if there is nothing specific required.
*/
const gd::String &GetRequiredBaseObjectCapability() const {
return requiredBaseObjectCapability;
};
/**
* \brief Consider that the instruction is easy for a user to understand.
@@ -450,6 +475,7 @@ class GD_CORE_API InstructionMetadata {
bool isPrivate;
bool isObjectInstruction;
bool isBehaviorInstruction;
gd::String requiredBaseObjectCapability;
};
} // namespace gd

View File

@@ -0,0 +1,31 @@
/*
* GDevelop Core
* Copyright 2008-2022 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#pragma once
#include "GDCore/String.h"
namespace gd {
/**
* \brief Contains information about how to display a group of instructions
* to the user.
*/
class GD_CORE_API InstructionOrExpressionGroupMetadata {
public:
InstructionOrExpressionGroupMetadata(){};
/**
* \brief Sets the icon shown to users.
*/
InstructionOrExpressionGroupMetadata& SetIcon(const gd::String& icon_) {
icon = icon_;
return *this;
};
const gd::String& GetIcon() const { return icon; };
private:
gd::String icon;
};
} // namespace gd

View File

@@ -31,6 +31,11 @@ class GD_CORE_API MultipleInstructionMetadata {
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
@@ -86,6 +91,18 @@ class GD_CORE_API MultipleInstructionMetadata {
return *this;
};
/**
* \brief Consider that the parameter is harder for a user to understand
* and not necessary for common usages.
*
* \see AddParameter
*/
MultipleInstructionMetadata &MarkParameterAsAdvanced() {
if (condition) condition->MarkParameterAsAdvanced();
if (action) action->MarkParameterAsAdvanced();
return *this;
};
/**
* \see gd::InstructionMetadata::SetHidden
*/
@@ -96,6 +113,17 @@ class GD_CORE_API MultipleInstructionMetadata {
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
@@ -179,6 +207,9 @@ class GD_CORE_API MultipleInstructionMetadata {
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;

View File

@@ -261,23 +261,14 @@ ObjectMetadata::AddExpressionAndConditionAndAction(
const gd::String& sentenceName,
const gd::String& group,
const gd::String& icon) {
gd::String expressionDescriptionTemplate = _("Return <subject>.");
auto& expression =
type == "number"
? AddExpression(name,
fullname,
expressionDescriptionTemplate.FindAndReplace(
"<subject>", descriptionSubject),
group,
icon)
: AddStrExpression(name,
fullname,
expressionDescriptionTemplate.FindAndReplace(
"<subject>", descriptionSubject),
group,
icon);
if (type != "number" && type != "string" && type != "boolean") {
gd::LogError(
"Unrecognised type passed to AddExpressionAndConditionAndAction: " +
type + ". Verify this type is valid and supported.");
}
gd::String conditionDescriptionTemplate = _("Compare <subject>.");
gd::String conditionDescriptionTemplate =
type == "boolean" ? _("Check if <subject>.") : _("Compare <subject>.");
auto& condition =
AddScopedCondition(name,
fullname,
@@ -288,7 +279,9 @@ ObjectMetadata::AddExpressionAndConditionAndAction(
icon,
icon);
gd::String actionDescriptionTemplate = _("Change <subject>.");
gd::String actionDescriptionTemplate = type == "boolean"
? _("Set (or unset) if <subject>.")
: _("Change <subject>.");
auto& action = AddScopedAction(
"Set" + name,
fullname,
@@ -298,6 +291,27 @@ ObjectMetadata::AddExpressionAndConditionAndAction(
icon,
icon);
if (type == "boolean") {
return MultipleInstructionMetadata::WithConditionAndAction(condition, action);
}
gd::String expressionDescriptionTemplate = _("Return <subject>.");
auto& expression =
type == "number"
? AddExpression(name,
fullname,
expressionDescriptionTemplate.FindAndReplace(
"<subject>", descriptionSubject),
group,
icon)
: AddStrExpression(name,
fullname,
expressionDescriptionTemplate.FindAndReplace(
"<subject>", descriptionSubject),
group,
icon);
return MultipleInstructionMetadata::WithExpressionAndConditionAndAction(
expression, condition, action);
}

View File

@@ -7,6 +7,7 @@
#define OBJECTMETADATA_H
#include <functional>
#include <map>
#include <set>
#include <memory>
#include "GDCore/Extensions/Metadata/ExpressionMetadata.h"
@@ -209,6 +210,33 @@ class GD_CORE_API ObjectMetadata {
return *this;
}
/**
* \brief The "capabilities" that are offered by the base object that are
* *not* supported by this object, and should be hidden in the editor
* inferface.
*/
const std::set<gd::String>& GetUnsupportedBaseObjectCapabilities() const {
return unsupportedBaseObjectCapabilities;
}
/**
* \brief Add a "capability" that is offered by the base object that is *not*
* supported by this object, and should be hidden in the editor inferface.
*/
ObjectMetadata& AddUnsupportedBaseObjectCapability(
const gd::String& capability) {
unsupportedBaseObjectCapabilities.insert(capability);
return *this;
}
/**
* \brief Check if a "capability" that is offered by the base object is *not*
* supported by this object, and should be hidden in the editor inferface.
*/
bool IsUnsupportedBaseObjectCapability(const gd::String& capability) const {
return unsupportedBaseObjectCapabilities.find(capability) != unsupportedBaseObjectCapabilities.end();
}
const gd::String& GetName() const { return name; }
const gd::String& GetFullName() const { return fullname; }
const gd::String& GetCategoryFullName() const { return categoryFullName; }
@@ -235,6 +263,27 @@ class GD_CORE_API ObjectMetadata {
*/
ObjectMetadata& AddIncludeFile(const gd::String& includeFile);
/**
* \brief Return a reference to a map containing the names of the actions
* (as keys) and the metadata associated with (as values).
*/
std::map<gd::String, gd::InstructionMetadata>& GetAllActions() { return actionsInfos; };
/**
* \see gd::PlatformExtension::GetAllActions
*/
std::map<gd::String, gd::InstructionMetadata>& GetAllConditions() { return conditionsInfos; };
/**
* \see gd::PlatformExtension::GetAllActions
*/
std::map<gd::String, gd::ExpressionMetadata>& GetAllExpressions() { return expressionsInfos; };
/**
* \see gd::PlatformExtension::GetAllActions
*/
std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressions() { return strExpressionsInfos; };
std::map<gd::String, gd::InstructionMetadata> conditionsInfos;
std::map<gd::String, gd::InstructionMetadata> actionsInfos;
std::map<gd::String, gd::ExpressionMetadata> expressionsInfos;
@@ -253,6 +302,8 @@ class GD_CORE_API ObjectMetadata {
gd::String description;
gd::String iconFilename;
gd::String categoryFullName;
std::set<gd::String> unsupportedBaseObjectCapabilities;
std::shared_ptr<gd::Object>
blueprintObject; ///< The "blueprint" object to be copied when a new
///< object is asked. Can be null in case a creation

View File

@@ -10,7 +10,7 @@
namespace gd {
ParameterMetadata::ParameterMetadata() : optional(false), codeOnly(false) {}
ParameterMetadata::ParameterMetadata() : optional(false), codeOnly(false), usageComplexity(5) {}
void ParameterMetadata::SerializeTo(SerializerElement& element) const {
element.SetAttribute("type", type);
@@ -21,6 +21,7 @@ void ParameterMetadata::SerializeTo(SerializerElement& element) const {
element.SetAttribute("codeOnly", codeOnly);
element.SetAttribute("defaultValue", defaultValue);
element.SetAttribute("name", name);
element.SetAttribute("usageComplexity", usageComplexity);
}
void ParameterMetadata::UnserializeFrom(const SerializerElement& element) {
@@ -33,6 +34,7 @@ void ParameterMetadata::UnserializeFrom(const SerializerElement& element) {
codeOnly = element.GetBoolAttribute("codeOnly");
defaultValue = element.GetStringAttribute("defaultValue");
name = element.GetStringAttribute("name");
usageComplexity = element.GetIntAttribute("usageComplexity");
}
} // namespace gd

View File

@@ -9,6 +9,7 @@
#if defined(GD_IDE_ONLY)
#include <map>
#include <memory>
#include "GDCore/String.h"
namespace gd {
class Project;
@@ -150,6 +151,37 @@ class GD_CORE_API ParameterMetadata {
return *this;
}
/**
* \brief Consider that the parameter is easy for a user to understand.
*/
ParameterMetadata &MarkAsSimple() {
usageComplexity = 2;
return *this;
}
/**
* \brief Consider that the parameter is harder for a user to understand
* than a normal parameter.
*/
ParameterMetadata &MarkAsAdvanced() {
usageComplexity = 7;
return *this;
}
/**
* \brief Consider that the parameter is complex for a user to understand.
*/
ParameterMetadata &MarkAsComplex() {
usageComplexity = 9;
return *this;
}
/**
* \brief Return the usage complexity of this parameter for the user,
* from 0 (simple&easy to use) to 10 (complex to understand).
*/
int GetUsageComplexity() const { return usageComplexity; }
/**
* \brief Return true if the type of the parameter is "object", "objectPtr" or
* "objectList".
@@ -195,7 +227,9 @@ class GD_CORE_API ParameterMetadata {
parameterType == "objectEffectParameterName" ||
parameterType == "objectPointName" ||
parameterType == "objectAnimationName" ||
parameterType == "functionParameterName";
parameterType == "functionParameterName" ||
parameterType == "externalLayoutName" ||
parameterType == "leaderboardId";
} else if (type == "variable") {
return parameterType == "objectvar" || parameterType == "globalvar" ||
parameterType == "scenevar";
@@ -232,6 +266,8 @@ class GD_CORE_API ParameterMetadata {
///< optional parameter is empty.
gd::String name; ///< The name of the parameter to be used in code
///< generation. Optional.
int usageComplexity; ///< Evaluate the parameter from 0 (simple&easy to
///< use) to 10 (complex to understand)
};
} // namespace gd

View File

@@ -4,6 +4,7 @@
* reserved. This project is released under the MIT License.
*/
#include "Platform.h"
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/Project/Object.h"
#include "GDCore/String.h"
@@ -14,16 +15,21 @@ using namespace std;
namespace gd {
Platform::Platform(): enableExtensionLoadingLogs(false) {}
InstructionOrExpressionGroupMetadata
Platform::badInstructionOrExpressionGroupMetadata;
Platform::Platform() : enableExtensionLoadingLogs(false) {}
Platform::~Platform() {}
bool Platform::AddExtension(std::shared_ptr<gd::PlatformExtension> extension) {
if (!extension) return false;
if (enableExtensionLoadingLogs) std::cout << "Loading " << extension->GetName() << "...";
if (enableExtensionLoadingLogs)
std::cout << "Loading " << extension->GetName() << "...";
if (IsExtensionLoaded(extension->GetName())) {
if (enableExtensionLoadingLogs) std::cout << " (replacing existing extension)";
if (enableExtensionLoadingLogs)
std::cout << " (replacing existing extension)";
RemoveExtension(extension->GetName());
}
if (enableExtensionLoadingLogs) std::cout << std::endl;
@@ -38,6 +44,11 @@ bool Platform::AddExtension(std::shared_ptr<gd::PlatformExtension> extension) {
extension->GetObjectCreationFunctionPtr(objectsTypes[i]);
}
for (const auto& it :
extension->GetAllInstructionOrExpressionGroupMetadata()) {
instructionOrExpressionGroupMetadata[it.first] = it.second;
}
return true;
}

View File

@@ -9,8 +9,9 @@
#include <map>
#include <memory>
#include <vector>
#include "GDCore/String.h"
#include "GDCore/Extensions/Metadata/InstructionOrExpressionGroupMetadata.h"
#include "GDCore/String.h"
namespace gd {
class InstructionsMetadataHolder;
class Project;
@@ -52,7 +53,6 @@ class GD_CORE_API Platform {
*/
virtual gd::String GetFullName() const { return "Unnamed platform"; }
#if defined(GD_IDE_ONLY)
/**
* \brief Must return a text describing the platform in a few words.
*/
@@ -67,7 +67,6 @@ class GD_CORE_API Platform {
* \brief Must return a filename to a 32*32 image file for the platform.
*/
virtual gd::String GetIcon() const { return ""; }
#endif
/** \name Extensions management
* Member functions used to manage the extensions
@@ -123,6 +122,19 @@ class GD_CORE_API Platform {
* anymore.
*/
virtual void RemoveExtension(const gd::String& name);
/**
* \brief Get the metadata (icon, etc...) of a group used for instructions or
* expressions.
*/
const InstructionOrExpressionGroupMetadata& GetInstructionOrExpressionGroupMetadata(
const gd::String& name) const {
auto it = instructionOrExpressionGroupMetadata.find(name);
if (it == instructionOrExpressionGroupMetadata.end())
return badInstructionOrExpressionGroupMetadata;
return it->second;
}
///@}
/** \name Factory method
@@ -137,7 +149,6 @@ class GD_CORE_API Platform {
std::unique_ptr<gd::Object> CreateObject(gd::String type,
const gd::String& name) const;
#if defined(GD_IDE_ONLY)
/**
* \brief Create an event of given type
*/
@@ -149,28 +160,18 @@ class GD_CORE_API Platform {
* \brief Activate or disable the logs on the standard output when
* loading an extension.
*/
void EnableExtensionLoadingLogs(bool enable) { enableExtensionLoadingLogs = enable; };
/**
* \brief Called when the IDE is about to shut down: Take this opportunity for
* erasing for example any temporary file.
* @deprecated This should be removed.
*/
virtual void OnIDEClosed(){};
/**
* \brief Called when the IDE is initialized and ready to be used.
* @deprecated This should be removed.
*/
virtual void OnIDEInitialized(){};
#endif
void EnableExtensionLoadingLogs(bool enable) {
enableExtensionLoadingLogs = enable;
};
private:
std::vector<std::shared_ptr<PlatformExtension>>
extensionsLoaded; ///< Extensions of the platform
std::map<gd::String, CreateFunPtr>
creationFunctionTable; ///< Creation functions for objects
std::map<gd::String, InstructionOrExpressionGroupMetadata>
instructionOrExpressionGroupMetadata;
static InstructionOrExpressionGroupMetadata badInstructionOrExpressionGroupMetadata;
bool enableExtensionLoadingLogs;
};

View File

@@ -165,6 +165,40 @@ PlatformExtension::AddExpressionAndConditionAndAction(
const gd::String& sentenceName,
const gd::String& group,
const gd::String& icon) {
if (type != "number" && type != "string" && type != "boolean") {
gd::LogError(
"Unrecognised type passed to AddExpressionAndConditionAndAction: " +
type + ". Verify this type is valid and supported.");
}
gd::String conditionDescriptionTemplate =
type == "boolean" ? _("Check if <subject>.") : _("Compare <subject>.");
auto& condition = AddCondition(name,
fullname,
conditionDescriptionTemplate.FindAndReplace(
"<subject>", descriptionSubject),
sentenceName,
group,
icon,
icon);
gd::String actionDescriptionTemplate = type == "boolean"
? _("Set (or unset) if <subject>.")
: _("Change <subject>.");
auto& action = AddAction(
"Set" + name,
fullname,
actionDescriptionTemplate.FindAndReplace("<subject>", descriptionSubject),
sentenceName,
group,
icon,
icon);
if (type == "boolean") {
return MultipleInstructionMetadata::WithConditionAndAction(condition,
action);
}
gd::String expressionDescriptionTemplate = _("Return <subject>.");
auto& expression =
type == "number"
@@ -175,32 +209,11 @@ PlatformExtension::AddExpressionAndConditionAndAction(
group,
icon)
: AddStrExpression(name,
fullname,
expressionDescriptionTemplate.FindAndReplace(
"<subject>", descriptionSubject),
group,
icon);
gd::String conditionDescriptionTemplate = _("Compare <subject>.");
auto& condition = AddCondition(name,
fullname,
conditionDescriptionTemplate.FindAndReplace(
"<subject>", descriptionSubject),
sentenceName,
group,
icon,
icon);
// TODO: update the checks
gd::String actionDescriptionTemplate = _("Change <subject>.");
auto& action = AddAction(
"Set" + name,
fullname,
actionDescriptionTemplate.FindAndReplace("<subject>", descriptionSubject),
sentenceName,
group,
icon,
icon);
fullname,
expressionDescriptionTemplate.FindAndReplace(
"<subject>", descriptionSubject),
group,
icon);
return MultipleInstructionMetadata::WithExpressionAndConditionAndAction(
expression, condition, action);
@@ -372,9 +385,13 @@ gd::InstructionMetadata& PlatformExtension::AddDuplicatedAction(
}
gd::InstructionMetadata& PlatformExtension::AddDuplicatedCondition(
const gd::String& newConditionName, const gd::String& copiedConditionName) {
gd::String newNameWithNamespace = GetNameSpace() + newConditionName;
gd::String copiedNameWithNamespace = GetNameSpace() + copiedConditionName;
const gd::String& newConditionName,
const gd::String& copiedConditionName,
gd::DuplicatedInstructionOptions options) {
gd::String newNameWithNamespace =
(options.unscoped ? "" : GetNameSpace()) + newConditionName;
gd::String copiedNameWithNamespace =
(options.unscoped ? "" : GetNameSpace()) + copiedConditionName;
auto copiedCondition = conditionsInfos.find(copiedNameWithNamespace);
if (copiedCondition == conditionsInfos.end()) {
@@ -512,7 +529,8 @@ PlatformExtension::GetAllStrExpressionsForBehavior(gd::String autoType) {
return badExpressionsMetadata;
}
gd::BaseEventSPtr PlatformExtension::CreateEvent(const gd::String& eventType) const {
gd::BaseEventSPtr PlatformExtension::CreateEvent(
const gd::String& eventType) const {
if (eventsInfos.find(eventType) != eventsInfos.end()) {
if (eventsInfos.find(eventType)->second.instance ==
std::shared_ptr<BaseEvent>()) {
@@ -754,7 +772,8 @@ void PlatformExtension::StripUnimplementedInstructionsAndExpressions() {
}
#endif
PlatformExtension::PlatformExtension() : deprecated(false) {}
PlatformExtension::PlatformExtension()
: deprecated(false), category(_("General")) {}
PlatformExtension::~PlatformExtension() {}

View File

@@ -5,8 +5,7 @@
* project is released under the MIT License.
*/
#ifndef GDCORE_PLATFORMEXTENSION_H
#define GDCORE_PLATFORMEXTENSION_H
#pragma once
#include <map>
#include <memory>
#include <vector>
@@ -16,6 +15,7 @@
#include "GDCore/Extensions/Metadata/DependencyMetadata.h"
#include "GDCore/Extensions/Metadata/EffectMetadata.h"
#include "GDCore/Extensions/Metadata/EventMetadata.h"
#include "GDCore/Extensions/Metadata/InstructionOrExpressionGroupMetadata.h"
#include "GDCore/Extensions/Metadata/ObjectMetadata.h"
#include "GDCore/Project/PropertyDescriptor.h"
#include "GDCore/String.h"
@@ -71,6 +71,10 @@ class GD_CORE_API CompilationInfo {
int sizeOfpInt;
};
struct GD_CORE_API DuplicatedInstructionOptions {
bool unscoped;
};
/**
* \brief Base class for implementing platform's extensions.
*
@@ -105,10 +109,18 @@ class GD_CORE_API PlatformExtension {
return *this;
}
/**
* \brief Set the category of the extension.
*/
PlatformExtension& SetCategory(const gd::String& category_) {
category = category_;
return *this;
}
/**
* \brief Set the path to the help, relative to the GDevelop documentation
* root. For example, "/all-features/collisions" for
* "http://wiki.compilgames.net/doku.php/gdevelop5/all-features/collisions".
* "https://wiki.gdevelop.io/gdevelop5/all-features/collisions".
*
* The instructions, objects and behaviors will have this help path set by
* default, unless you call SetHelpPath on them.
@@ -271,7 +283,6 @@ class GD_CORE_API PlatformExtension {
const gd::String& smallicon_,
std::shared_ptr<gd::BaseEvent> instance);
#if defined(GD_IDE_ONLY)
/**
* \brief Create a new action which is the duplicate of the specified one.
*
@@ -288,7 +299,8 @@ class GD_CORE_API PlatformExtension {
*/
gd::InstructionMetadata& AddDuplicatedCondition(
const gd::String& newConditionName,
const gd::String& copiedConditionName);
const gd::String& copiedConditionName,
gd::DuplicatedInstructionOptions options = {.unscoped = false});
/**
* \brief Create a new expression which is the duplicate of the specified one.
*
@@ -315,7 +327,15 @@ class GD_CORE_API PlatformExtension {
gd::PropertyDescriptor& RegisterProperty(const gd::String& name) {
return extensionPropertiesMetadata[name];
};
#endif
/**
* \brief Add some metadata (icon, etc...) for a group used for instructions
* or expressions.
*/
InstructionOrExpressionGroupMetadata& AddInstructionOrExpressionGroupMetadata(
const gd::String& name) {
return instructionOrExpressionGroupMetadata[name];
}
/**
* \brief Delete all instructions having no function name or custom code
@@ -339,6 +359,11 @@ class GD_CORE_API PlatformExtension {
*/
const gd::String& GetName() const { return name; }
/**
* \brief Return the category of the extension
*/
const gd::String& GetCategory() const { return category; }
/**
* \brief Return a description of the extension
*/
@@ -452,7 +477,6 @@ class GD_CORE_API PlatformExtension {
*/
std::map<gd::String, gd::EventMetadata>& GetAllEvents();
#if defined(GD_IDE_ONLY)
/**
* \brief Return a reference to a map containing the names of the actions
* (as keys) and the metadata associated with (as values).
@@ -537,8 +561,16 @@ class GD_CORE_API PlatformExtension {
std::map<gd::String, gd::PropertyDescriptor>& GetAllProperties() {
return extensionPropertiesMetadata;
}
/**
* \brief Get the metadata (icon, etc...) for groups used for instructions
* or expressions.
*/
const std::map<gd::String, InstructionOrExpressionGroupMetadata>&
GetAllInstructionOrExpressionGroupMetadata() const {
return instructionOrExpressionGroupMetadata;
}
///@}
#endif
/**
* \brief Return the name of all the extensions which are considered provided
@@ -566,6 +598,7 @@ class GD_CORE_API PlatformExtension {
///< actions/conditions/expressions/objects/behavior/event.
gd::String fullname; ///< Name displayed to users in the editor.
gd::String informations; ///< Description displayed to users in the editor.
gd::String category;
gd::String author; ///< Author displayed to users in the editor.
gd::String license; ///< License name displayed to users in the editor.
bool deprecated; ///< true if the extension is deprecated and shouldn't be
@@ -577,7 +610,6 @@ class GD_CORE_API PlatformExtension {
std::map<gd::String, gd::ObjectMetadata> objectsInfos;
std::map<gd::String, gd::BehaviorMetadata> behaviorsInfo;
std::map<gd::String, gd::EffectMetadata> effectsMetadata;
#if defined(GD_IDE_ONLY)
std::map<gd::String, gd::InstructionMetadata> conditionsInfos;
std::map<gd::String, gd::InstructionMetadata> actionsInfos;
std::map<gd::String, gd::ExpressionMetadata> expressionsInfos;
@@ -585,12 +617,12 @@ class GD_CORE_API PlatformExtension {
std::vector<gd::DependencyMetadata> extensionDependenciesMetadata;
std::map<gd::String, gd::EventMetadata> eventsInfos;
std::map<gd::String, gd::PropertyDescriptor> extensionPropertiesMetadata;
#endif
std::map<gd::String, InstructionOrExpressionGroupMetadata>
instructionOrExpressionGroupMetadata;
ObjectMetadata badObjectMetadata;
BehaviorMetadata badBehaviorMetadata;
EffectMetadata badEffectMetadata;
#if defined(GD_IDE_ONLY)
static std::map<gd::String, gd::InstructionMetadata>
badConditionsMetadata; ///< Used when a condition is not found in the
///< extension
@@ -600,12 +632,10 @@ class GD_CORE_API PlatformExtension {
static std::map<gd::String, gd::ExpressionMetadata>
badExpressionsMetadata; ///< Used when an expression is not found in the
///< extension
#endif
};
} // namespace gd
#if defined(GD_IDE_ONLY)
/** \brief Macro used by extensions in their constructor to declare how they
* have been compiled. \see gd::CompilationInfo
*/
@@ -619,23 +649,5 @@ class GD_CORE_API PlatformExtension {
compilationInfo.gccMinorVersion = __GNUC_MINOR__; \
compilationInfo.gccPatchLevel = __GNUC_PATCHLEVEL__; \
compilationInfo.informationCompleted = true;
#else
/** \brief Macro used by extensions in their constructor to declare how they
* have been compiled. \see gd::CompilationInfo
*/
#define GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION() \
compilationInfo.runtimeOnly = true; \
compilationInfo.sfmlMajorVersion = 2; \
compilationInfo.sfmlMinorVersion = 0; \
compilationInfo.gdCoreVersion = GD_VERSION_STRING; \
compilationInfo.sizeOfpInt = sizeof(int*); \
compilationInfo.gccMajorVersion = __GNUC__; \
compilationInfo.gccMinorVersion = __GNUC_MINOR__; \
compilationInfo.gccPatchLevel = __GNUC_PATCHLEVEL__; \
compilationInfo.informationCompleted = true;
#endif
#include "GDCore/Extensions/PlatformExtension.inl"
#endif // GDCORE_PLATFORMEXTENSION_H

View File

@@ -0,0 +1,27 @@
#include "GDCore/IDE/Events/EventsPositionFinder.h"
#include <map>
#include <memory>
#include <vector>
#include "GDCore/Events/Event.h"
#include "GDCore/Events/EventsList.h"
#include "GDCore/String.h"
namespace gd {
class BaseEvent;
class EventsList;
} // namespace gd
namespace gd {
bool EventsPositionFinder::DoVisitEvent(gd::BaseEvent& event) {
auto it = std::find(searchedEvents.begin(), searchedEvents.end(), &event);
if (it != searchedEvents.end()) {
positions[it - searchedEvents.begin()] = index;
}
index++;
return false;
}
EventsPositionFinder::~EventsPositionFinder() {}
} // namespace gd

View File

@@ -0,0 +1,48 @@
#ifndef EventsPositionFinder_H
#define EventsPositionFinder_H
#include "GDCore/Events/EventsList.h"
#include "GDCore/IDE/Events/ArbitraryEventsWorker.h"
#include "GDCore/String.h"
namespace gd {
class BaseEvent;
class EventsList;
} // namespace gd
namespace gd {
/**
* \brief Scans an event list to retrieve the position of a list of searched
* events when the events list is flattened.
*
* \ingroup IDE
*/
class GD_CORE_API EventsPositionFinder : public ArbitraryEventsWorker {
public:
EventsPositionFinder() : index(0){};
virtual ~EventsPositionFinder();
/**
* Return the positions of all searched events
*/
const std::vector<std::size_t>& GetPositions() const { return positions; }
/**
* Add an event for which the position must be reported in `GetPositions`.
*/
void AddEventToSearch(gd::BaseEvent* event) {
searchedEvents.push_back(event);
positions.push_back(gd::String::npos);
}
private:
bool DoVisitEvent(gd::BaseEvent& event) override;
std::vector<gd::BaseEvent*> searchedEvents;
std::vector<std::size_t> positions;
std::size_t index;
};
} // namespace gd
#endif // EventsPositionFinder_H

View File

@@ -542,7 +542,8 @@ void EventsRefactorer::ReplaceStringInEvents(gd::ObjectsContainer& project,
gd::String newString,
bool matchCase,
bool inConditions,
bool inActions) {
bool inActions,
bool inEventStrings) {
for (std::size_t i = 0; i < events.size(); ++i) {
if (inConditions) {
vector<gd::InstructionsList*> conditionsVectors =
@@ -571,6 +572,11 @@ void EventsRefactorer::ReplaceStringInEvents(gd::ObjectsContainer& project,
}
}
if (inEventStrings) {
bool eventStringModified = ReplaceStringInEventSearchableStrings(
project, layout, events[i], toReplace, newString, matchCase);
}
if (events[i].CanHaveSubEvents())
ReplaceStringInEvents(project,
layout,
@@ -579,7 +585,8 @@ void EventsRefactorer::ReplaceStringInEvents(gd::ObjectsContainer& project,
newString,
matchCase,
inConditions,
inActions);
inActions,
inEventStrings);
}
}
@@ -677,6 +684,29 @@ bool EventsRefactorer::ReplaceStringInConditions(
return somethingModified;
}
bool EventsRefactorer::ReplaceStringInEventSearchableStrings(
gd::ObjectsContainer& project,
gd::ObjectsContainer& layout,
gd::BaseEvent& event,
gd::String toReplace,
gd::String newString,
bool matchCase) {
vector<gd::String> newEventStrings;
vector<gd::String> stringEvent = event.GetAllSearchableStrings();
for (std::size_t sNb = 0; sNb < stringEvent.size(); ++sNb) {
gd::String newStringEvent =
matchCase ? stringEvent[sNb].FindAndReplace(toReplace, newString, true)
: ReplaceAllOccurencesCaseUnsensitive(
stringEvent[sNb], toReplace, newString);
newEventStrings.push_back(newStringEvent);
}
bool somethingModified = event.ReplaceAllSearchableStrings(newEventStrings);
return somethingModified;
}
vector<EventsSearchResult> EventsRefactorer::SearchInEvents(
const gd::Platform& platform,
gd::EventsList& events,

View File

@@ -117,7 +117,8 @@ class GD_CORE_API EventsRefactorer {
gd::String newString,
bool matchCase,
bool inConditions,
bool inActions);
bool inActions,
bool inEventString);
virtual ~EventsRefactorer(){};
@@ -208,6 +209,20 @@ class GD_CORE_API EventsRefactorer {
gd::String newString,
bool matchCase);
/**
* Replace all occurrences of a gd::String in strings of events (for example:
* comments and name of groups).
*
* \return true if something was modified.
*/
static bool ReplaceStringInEventSearchableStrings(
gd::ObjectsContainer& project,
gd::ObjectsContainer& layout,
gd::BaseEvent& event,
gd::String toReplace,
gd::String newString,
bool matchCase);
static bool SearchStringInFormattedText(const gd::Platform& platform,
gd::Instruction& instruction,
gd::String search,

View File

@@ -95,7 +95,7 @@ class GD_CORE_API ExpressionParameterMover
// Move parameter of an object function
const gd::String& thisObjectType = gd::GetTypeOfObject(
globalObjectsContainer, objectsContainer, node.objectName);
if (thisObjectType == behaviorType) {
if (thisObjectType == objectType) {
moveParameter(node.parameters);
hasDoneMoving = true;
}

View File

@@ -33,11 +33,4 @@ gd::Platform* PlatformManager::GetPlatform(
return NULL;
}
void PlatformManager::NotifyPlatformIDEInitialized() const {
for (std::size_t i = 0; i < platformsLoaded.size(); ++i) {
if (platformsLoaded[i] != std::shared_ptr<gd::Platform>())
platformsLoaded[i]->OnIDEInitialized();
}
}
} // namespace gd

View File

@@ -43,12 +43,6 @@ class GD_CORE_API PlatformManager {
return platformsLoaded;
};
/**
* \brief Notify each platform that the IDE is ready, by calling their
* OnIDEInitialized member function.
*/
void NotifyPlatformIDEInitialized() const;
static PlatformManager *Get() {
if (NULL == _singleton) {
_singleton = new PlatformManager;
@@ -65,11 +59,6 @@ class GD_CORE_API PlatformManager {
*/
static void DestroySingleton() {
if (NULL != _singleton) {
for (std::size_t i = 0; i < _singleton->platformsLoaded.size(); ++i) {
if (_singleton->platformsLoaded[i] != std::shared_ptr<gd::Platform>())
_singleton->platformsLoaded[i]->OnIDEClosed();
}
delete _singleton;
_singleton = NULL;
}

View File

@@ -33,6 +33,7 @@ void EventsFunctionsExtension::Init(const gd::EventsFunctionsExtension& other) {
description = other.description;
name = other.name;
fullName = other.fullName;
category = other.category;
tags = other.tags;
author = other.author;
authorIds = other.authorIds;
@@ -50,6 +51,7 @@ void EventsFunctionsExtension::SerializeTo(SerializerElement& element) const {
element.SetAttribute("description", description);
element.SetAttribute("name", name);
element.SetAttribute("fullName", fullName);
element.SetAttribute("category", category);
if (!originName.empty() || !originIdentifier.empty()) {
element.AddChild("origin")
.SetAttribute("name", originName)
@@ -87,6 +89,7 @@ void EventsFunctionsExtension::UnserializeFrom(
description = element.GetStringAttribute("description");
name = element.GetStringAttribute("name");
fullName = element.GetStringAttribute("fullName");
category = element.GetStringAttribute("category");
author = element.GetStringAttribute("author");
previewIconUrl = element.GetStringAttribute("previewIconUrl");
iconUrl = element.GetStringAttribute("iconUrl");

View File

@@ -84,6 +84,12 @@ class GD_CORE_API EventsFunctionsExtension : public EventsFunctionsContainer {
return *this;
}
const gd::String& GetCategory() const { return category; };
EventsFunctionsExtension& SetCategory(const gd::String& category_) {
category = category_;
return *this;
}
const std::vector<gd::String>& GetTags() const { return tags; };
std::vector<gd::String>& GetTags() { return tags; };
@@ -238,6 +244,7 @@ class GD_CORE_API EventsFunctionsExtension : public EventsFunctionsContainer {
gd::String description;
gd::String name;
gd::String fullName;
gd::String category;
std::vector<gd::String> tags;
std::vector<gd::String> authorIds;
gd::String author;

View File

@@ -66,6 +66,9 @@ Project::Project()
projectUuid(""),
useDeprecatedZeroAsDefaultZOrder(false),
useExternalSourceFiles(false),
isPlayableWithKeyboard(false),
isPlayableWithGamepad(false),
isPlayableWithMobile(false),
currentPlatform(NULL),
gdMajorVersion(gd::VersionWrapper::Major()),
gdMinorVersion(gd::VersionWrapper::Minor()),
@@ -495,6 +498,7 @@ void Project::UnserializeFrom(const SerializerElement& element) {
const SerializerElement& propElement =
element.GetChild("properties", 0, "Info");
SetName(propElement.GetChild("name", 0, "Nom").GetValue().GetString());
SetDescription(propElement.GetChild("description", 0).GetValue().GetString());
SetVersion(propElement.GetStringAttribute("version", "1.0.0"));
SetGameResolutionSize(
propElement.GetChild("windowWidth", 0, "WindowW").GetValue().GetInt(),
@@ -535,6 +539,27 @@ void Project::UnserializeFrom(const SerializerElement& element) {
authorIds.push_back(authorIdsElement.GetChild(i).GetStringValue());
}
categories.clear();
auto& categoriesElement = propElement.GetChild("categories");
categoriesElement.ConsiderAsArray();
for (std::size_t i = 0; i < categoriesElement.GetChildrenCount(); ++i) {
categories.push_back(categoriesElement.GetChild(i).GetStringValue());
}
auto& playableDevicesElement = propElement.GetChild("playableDevices");
playableDevicesElement.ConsiderAsArray();
for (std::size_t i = 0; i < playableDevicesElement.GetChildrenCount(); ++i) {
const auto& playableDevice =
playableDevicesElement.GetChild(i).GetStringValue();
if (playableDevice == "keyboard") {
isPlayableWithKeyboard = true;
} else if (playableDevice == "gamepad") {
isPlayableWithGamepad = true;
} else if (playableDevice == "mobile") {
isPlayableWithMobile = true;
}
}
// Compatibility with GD <= 5.0.0-beta101
if (VersionWrapper::IsOlderOrEqual(
gdMajorVersion, gdMinorVersion, gdBuildVersion, 0, 4, 0, 98, 0) &&
@@ -704,6 +729,7 @@ void Project::SerializeTo(SerializerElement& element) const {
SerializerElement& propElement = element.AddChild("properties");
propElement.AddChild("name").SetValue(GetName());
propElement.AddChild("description").SetValue(GetDescription());
propElement.SetAttribute("version", GetVersion());
propElement.AddChild("author").SetValue(GetAuthor());
propElement.AddChild("windowWidth").SetValue(GetGameResolutionWidth());
@@ -734,6 +760,24 @@ void Project::SerializeTo(SerializerElement& element) const {
authorIdsElement.AddChild("").SetStringValue(authorId);
}
auto& categoriesElement = propElement.AddChild("categories");
categoriesElement.ConsiderAsArray();
for (const auto& category : categories) {
categoriesElement.AddChild("").SetStringValue(category);
}
auto& playableDevicesElement = propElement.AddChild("playableDevices");
playableDevicesElement.ConsiderAsArray();
if (isPlayableWithKeyboard) {
playableDevicesElement.AddChild("").SetStringValue("keyboard");
}
if (isPlayableWithGamepad) {
playableDevicesElement.AddChild("").SetStringValue("gamepad");
}
if (isPlayableWithMobile) {
playableDevicesElement.AddChild("").SetStringValue("mobile");
}
// Compatibility with GD <= 5.0.0-beta101
if (useDeprecatedZeroAsDefaultZOrder) {
propElement.SetAttribute("useDeprecatedZeroAsDefaultZOrder", true);
@@ -909,6 +953,8 @@ Project& Project::operator=(const Project& other) {
void Project::Init(const gd::Project& game) {
name = game.name;
categories = game.categories;
description = game.description;
firstLayout = game.firstLayout;
version = game.version;
windowWidth = game.windowWidth;
@@ -925,6 +971,9 @@ void Project::Init(const gd::Project& game) {
author = game.author;
authorIds = game.authorIds;
isPlayableWithKeyboard = game.isPlayableWithKeyboard;
isPlayableWithGamepad = game.isPlayableWithGamepad;
isPlayableWithMobile = game.isPlayableWithMobile;
packageName = game.packageName;
orientation = game.orientation;
folderProject = game.folderProject;

View File

@@ -56,15 +56,35 @@ class GD_CORE_API Project : public ObjectsContainer {
///@{
/**
* \brief Change project name
* \brief Change the project name
*/
void SetName(const gd::String& name_) { name = name_; };
/**
* \brief Get project name
* \brief Get the project name
*/
const gd::String& GetName() const { return name; }
/**
* \brief Get the categories/genres of the project.
*/
const std::vector<gd::String>& GetCategories() const { return categories; };
/**
* \brief Get the categories of the project, to modify them (non-const).
*/
std::vector<gd::String>& GetCategories() { return categories; };
/**
* \brief Change the project description
*/
void SetDescription(const gd::String& description_) { description = description_; };
/**
* \brief Get the project description
*/
const gd::String& GetDescription() const { return description; }
/**
* \brief Change the version of the project.
* This can be freely set, but should follow "X.Y.Z" format for compatibility
@@ -73,7 +93,7 @@ class GD_CORE_API Project : public ObjectsContainer {
void SetVersion(const gd::String& version_) { version = version_; };
/**
* \brief Get project version.
* \brief Get the project version.
*/
const gd::String& GetVersion() const { return version; }
@@ -83,7 +103,7 @@ class GD_CORE_API Project : public ObjectsContainer {
void SetAuthor(const gd::String& author_) { author = author_; };
/**
* \brief Get project author name.
* \brief Get the project author name.
*/
const gd::String& GetAuthor() const { return author; }
@@ -98,14 +118,47 @@ class GD_CORE_API Project : public ObjectsContainer {
std::vector<gd::String>& GetAuthorIds() { return authorIds; };
/**
* \brief Change project package name.
* Define the project as playable with a keyboard.
* \param enable True to define the project as playable with a keyboard.
*/
void SetPlayableWithKeyboard(bool playable = true) { isPlayableWithKeyboard = playable; }
/**
* Check if the project is defined as playable with a keyboard.
*/
bool IsPlayableWithKeyboard() const { return isPlayableWithKeyboard; }
/**
* Define the project as playable with a gamepad.
* \param enable True to define the project as playable with a gamepad.
*/
void SetPlayableWithGamepad(bool playable = true) { isPlayableWithGamepad = playable; }
/**
* Check if the project is defined as playable with a gamepad.
*/
bool IsPlayableWithGamepad() const { return isPlayableWithGamepad; }
/**
* Define the project as playable on a mobile.
* \param enable True to define the project as playable on a mobile.
*/
void SetPlayableWithMobile(bool playable = true) { isPlayableWithMobile = playable; }
/**
* Check if the project is defined as playable on a mobile.
*/
bool IsPlayableWithMobile() const { return isPlayableWithMobile; }
/**
* \brief Change the project package name.
*/
void SetPackageName(const gd::String& packageName_) {
packageName = packageName_;
};
/**
* \brief Get project package name.
* \brief Get the project package name.
*/
const gd::String& GetPackageName() const { return packageName; }
@@ -119,7 +172,7 @@ class GD_CORE_API Project : public ObjectsContainer {
};
/**
* \brief Get project orientation ("default", "landscape", "portrait").
* \brief Get the project orientation ("default", "landscape", "portrait").
*/
const gd::String& GetOrientation() const { return orientation; }
@@ -884,6 +937,7 @@ class GD_CORE_API Project : public ObjectsContainer {
void Init(const gd::Project& project);
gd::String name; ///< Game name
gd::String description; ///< Game description
gd::String version; ///< Game version number (used for some exports)
unsigned int windowWidth; ///< Window default width
unsigned int windowHeight; ///< Window default height
@@ -923,6 +977,11 @@ class GD_CORE_API Project : public ObjectsContainer {
gd::String author; ///< Game author name, for publishing purpose.
std::vector<gd::String>
authorIds; ///< Game author ids, from GDevelop users DB.
std::vector<gd::String>
categories; ///< Game categories
bool isPlayableWithKeyboard; ///< The project is playable with a keyboard.
bool isPlayableWithGamepad; ///< The project is playable with a gamepad.
bool isPlayableWithMobile; ///< The project is playable on a mobile.
gd::String packageName; ///< Game package name
gd::String orientation; ///< Lock game orientation (on mobile devices).
///< "default", "landscape" or "portrait".

View File

@@ -27,6 +27,7 @@ void PropertyDescriptor::SerializeTo(SerializerElement& element) const {
extraInformationElement.AddChild("").SetStringValue(information);
}
element.AddChild("hidden").SetBoolValue(hidden);
element.AddChild("usageComplexity").SetIntValue(usageComplexity);
}
void PropertyDescriptor::UnserializeFrom(const SerializerElement& element) {
@@ -47,6 +48,7 @@ void PropertyDescriptor::UnserializeFrom(const SerializerElement& element) {
hidden = element.HasChild("hidden")
? element.GetChild("hidden").GetBoolValue()
: false;
usageComplexity = element.GetChild("usageComplexity").GetIntValue();
}
void PropertyDescriptor::SerializeValuesTo(SerializerElement& element) const {

View File

@@ -28,12 +28,12 @@ class GD_CORE_API PropertyDescriptor {
* \param propertyValue The value of the property.
*/
PropertyDescriptor(gd::String propertyValue)
: currentValue(propertyValue), type("string"), label(""), hidden(false) {}
: currentValue(propertyValue), type("string"), label(""), hidden(false), usageComplexity(5) {}
/**
* \brief Empty constructor creating an empty property to be displayed.
*/
PropertyDescriptor() : hidden(false){};
PropertyDescriptor() : hidden(false), usageComplexity(5) {};
/**
* \brief Destructor
@@ -104,6 +104,37 @@ class GD_CORE_API PropertyDescriptor {
return *this;
}
/**
* \brief Consider that the property is easy for a user to understand.
*/
PropertyDescriptor &MarkAsSimple() {
usageComplexity = 2;
return *this;
}
/**
* \brief Consider that the property is harder for a user to understand
* than a normal property.
*/
PropertyDescriptor &MarkAsAdvanced() {
usageComplexity = 7;
return *this;
}
/**
* \brief Consider that the property is complex for a user to understand.
*/
PropertyDescriptor &MarkAsComplex() {
usageComplexity = 9;
return *this;
}
/**
* \brief Return the usage complexity of this property for the user,
* from 0 (simple&easy to use) to 10 (complex to understand).
*/
int GetUsageComplexity() const { return usageComplexity; }
const gd::String& GetValue() const { return currentValue; }
const gd::String& GetType() const { return type; }
const gd::String& GetLabel() const { return label; }
@@ -168,6 +199,8 @@ class GD_CORE_API PropertyDescriptor {
///< choices, if a property is a displayed as a combo
///< box.
bool hidden;
int usageComplexity; ///< Evaluate the parameter from 0 (simple&easy to
///< use) to 10 (complex to understand)
};
} // namespace gd

View File

@@ -18,6 +18,16 @@
#include "GDCore/Tools/Localization.h"
#include "GDCore/Tools/Log.h"
namespace {
gd::String NormalizePathSeparator(const gd::String& path) {
gd::String normalizedPath = path;
while (normalizedPath.find('\\') != gd::String::npos)
normalizedPath.replace(normalizedPath.find('\\'), 1, "/");
return normalizedPath;
}
} // namespace
namespace gd {
gd::String Resource::badStr;
@@ -126,19 +136,20 @@ std::vector<gd::String> ResourcesManager::GetAllResourceNames() const {
}
std::vector<gd::String> ResourcesManager::FindFilesNotInResources(
const std::vector<gd::String>& filesToCheck) const {
std::unordered_set<gd::String> resourceFiles;
for (const auto& resource: resources) {
resourceFiles.insert(resource->GetFile());
const std::vector<gd::String>& filePathsToCheck) const {
std::unordered_set<gd::String> resourceFilePaths;
for (const auto& resource : resources) {
resourceFilePaths.insert(NormalizePathSeparator(resource->GetFile()));
}
std::vector<gd::String> filesNotInResources;
for(const gd::String& file: filesToCheck) {
if (resourceFiles.find(file) == resourceFiles.end())
filesNotInResources.push_back(file);
std::vector<gd::String> filePathsNotInResources;
for (const gd::String& file : filePathsToCheck) {
gd::String normalizedPath = NormalizePathSeparator(file);
if (resourceFilePaths.find(normalizedPath) == resourceFilePaths.end())
filePathsNotInResources.push_back(file);
}
return filesNotInResources;
return filePathsNotInResources;
}
std::map<gd::String, gd::PropertyDescriptor> Resource::GetProperties() const {
@@ -532,11 +543,7 @@ void ResourcesManager::SerializeTo(SerializerElement& element) const {
}
void ImageResource::SetFile(const gd::String& newFile) {
file = newFile;
// Convert all backslash to slashs.
while (file.find('\\') != gd::String::npos)
file.replace(file.find('\\'), 1, "/");
file = NormalizePathSeparator(newFile);
}
void ImageResource::UnserializeFrom(const SerializerElement& element) {
@@ -554,11 +561,7 @@ void ImageResource::SerializeTo(SerializerElement& element) const {
}
void AudioResource::SetFile(const gd::String& newFile) {
file = newFile;
// Convert all backslash to slashs.
while (file.find('\\') != gd::String::npos)
file.replace(file.find('\\'), 1, "/");
file = NormalizePathSeparator(newFile);
}
void AudioResource::UnserializeFrom(const SerializerElement& element) {
@@ -576,11 +579,7 @@ void AudioResource::SerializeTo(SerializerElement& element) const {
}
void FontResource::SetFile(const gd::String& newFile) {
file = newFile;
// Convert all backslash to slashs.
while (file.find('\\') != gd::String::npos)
file.replace(file.find('\\'), 1, "/");
file = NormalizePathSeparator(newFile);
}
void FontResource::UnserializeFrom(const SerializerElement& element) {
@@ -594,11 +593,7 @@ void FontResource::SerializeTo(SerializerElement& element) const {
}
void VideoResource::SetFile(const gd::String& newFile) {
file = newFile;
// Convert all backslash to slashs.
while (file.find('\\') != gd::String::npos)
file.replace(file.find('\\'), 1, "/");
file = NormalizePathSeparator(newFile);
}
void VideoResource::UnserializeFrom(const SerializerElement& element) {
@@ -612,11 +607,7 @@ void VideoResource::SerializeTo(SerializerElement& element) const {
}
void JsonResource::SetFile(const gd::String& newFile) {
file = newFile;
// Convert all backslash to slashs.
while (file.find('\\') != gd::String::npos)
file.replace(file.find('\\'), 1, "/");
file = NormalizePathSeparator(newFile);
}
void JsonResource::UnserializeFrom(const SerializerElement& element) {
@@ -649,13 +640,8 @@ bool JsonResource::UpdateProperty(const gd::String& name,
return true;
}
void BitmapFontResource::SetFile(const gd::String& newFile) {
file = newFile;
// Convert all backslash to slashs.
while (file.find('\\') != gd::String::npos)
file.replace(file.find('\\'), 1, "/");
file = NormalizePathSeparator(newFile);
}
void BitmapFontResource::UnserializeFrom(const SerializerElement& element) {

View File

@@ -447,7 +447,7 @@ class GD_CORE_API ResourcesManager {
* \brief Return a list of the files, from the specified input list,
* that are not used as files by the resources.
*/
std::vector<gd::String> FindFilesNotInResources(const std::vector<gd::String>& filesToCheck) const;
std::vector<gd::String> FindFilesNotInResources(const std::vector<gd::String>& filePathsToCheck) const;
/**
* \brief Return a (smart) pointer to a resource.

View File

@@ -14,7 +14,7 @@
class BehaviorWithRequiredBehaviorProperty : public gd::Behavior {
public:
BehaviorWithRequiredBehaviorProperty() {};
BehaviorWithRequiredBehaviorProperty(){};
virtual ~BehaviorWithRequiredBehaviorProperty(){};
virtual Behavior* Clone() const override {
return new BehaviorWithRequiredBehaviorProperty(*this);
@@ -25,7 +25,8 @@ class BehaviorWithRequiredBehaviorProperty : public gd::Behavior {
std::map<gd::String, gd::PropertyDescriptor> properties;
properties["requiredBehaviorProperty"]
.SetLabel("A required behavior")
.SetValue(behaviorContent.GetStringAttribute("requiredBehaviorProperty"))
.SetValue(
behaviorContent.GetStringAttribute("requiredBehaviorProperty"))
.SetType("Behavior")
.AddExtraInfo("MyExtension::MyBehavior");
return properties;
@@ -48,7 +49,7 @@ class BehaviorWithRequiredBehaviorProperty : public gd::Behavior {
class BehaviorWithRequiredBehaviorPropertyRequiringAnotherBehavior
: public gd::Behavior {
public:
BehaviorWithRequiredBehaviorPropertyRequiringAnotherBehavior() {};
BehaviorWithRequiredBehaviorPropertyRequiringAnotherBehavior(){};
virtual ~BehaviorWithRequiredBehaviorPropertyRequiringAnotherBehavior(){};
virtual Behavior* Clone() const override {
return new BehaviorWithRequiredBehaviorPropertyRequiringAnotherBehavior(
@@ -60,7 +61,8 @@ class BehaviorWithRequiredBehaviorPropertyRequiringAnotherBehavior
std::map<gd::String, gd::PropertyDescriptor> properties;
properties["requiredBehaviorProperty"]
.SetLabel("A required behavior")
.SetValue(behaviorContent.GetStringAttribute("requiredBehaviorProperty"))
.SetValue(
behaviorContent.GetStringAttribute("requiredBehaviorProperty"))
.SetType("Behavior")
.AddExtraInfo("MyExtension::BehaviorWithRequiredBehaviorProperty");
return properties;
@@ -87,11 +89,26 @@ void SetupProjectWithDummyPlatform(gd::Project& project,
std::shared_ptr<gd::PlatformExtension> baseObjectExtension =
std::shared_ptr<gd::PlatformExtension>(new gd::PlatformExtension);
// Create the base object. All objects "inherits" from it.
baseObjectExtension->SetExtensionInformation(
"BuiltinObject", "Base Object dummy extension", "", "", "");
auto baseObject = baseObjectExtension->AddObject<gd::Object>(
auto& baseObject = baseObjectExtension->AddObject<gd::Object>(
"", "Dummy Base Object", "Dummy Base Object", "");
// Add this expression for all objects. But it requires a "capability".
baseObject
.AddStrExpression("GetSomethingRequiringEffectCapability",
"Get something, but this requires the effect capability for the object.",
"",
"",
"")
.AddParameter("object", _("Object"), "")
.AddParameter("expression", _("Number parameter"))
.SetRequiresBaseObjectCapability("effect")
.SetFunctionName("getSomethingRequiringEffectCapability");
// Create an extension with various stuff inside.
std::shared_ptr<gd::PlatformExtension> extension =
std::shared_ptr<gd::PlatformExtension>(new gd::PlatformExtension);
extension->SetExtensionInformation(
@@ -116,7 +133,8 @@ void SetupProjectWithDummyPlatform(gd::Project& project,
"",
"",
"")
.AddParameter("bitmapFontResource", "Parameter 1 (a bitmap font resource)")
.AddParameter("bitmapFontResource",
"Parameter 1 (a bitmap font resource)")
.AddParameter("imageResource", "Parameter 2 (an image resource)")
.AddParameter("soundfile", "Parameter 3 (an audio resource)")
.SetFunctionName("doSomethingWithResources");
@@ -260,10 +278,10 @@ void SetupProjectWithDummyPlatform(gd::Project& project,
.SetFunctionName("getBehaviorStringWith1Param");
behavior
.AddExpression("GetBehaviorNumberWith1Param",
"Get number from behavior with 1 param",
"",
"",
"")
"Get number from behavior with 1 param",
"",
"",
"")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "MyExtension::MyBehavior")
.AddParameter("expression", _("Number parameter"))
@@ -310,6 +328,16 @@ void SetupProjectWithDummyPlatform(gd::Project& project,
gd::make_unique<gd::BehaviorsSharedData>());
}
{
auto& object = extension
->AddObject<gd::Object>(
"FakeObjectWithUnsupportedCapability",
"FakeObjectWithUnsupportedCapability",
"This is FakeObjectWithUnsupportedCapability",
"")
.AddUnsupportedBaseObjectCapability("effect");
}
platform.AddExtension(baseObjectExtension);
platform.AddExtension(extension);
project.AddPlatform(platform);

View File

@@ -23,6 +23,14 @@ TEST_CASE("ExpressionCodeGenerator", "[common][events]") {
layout1.InsertNewObject(project, "MyExtension::Sprite", "MySpriteObject", 0);
layout1.InsertNewObject(
project, "MyExtension::Sprite", "MyOtherSpriteObject", 1);
layout1.InsertNewObject(project,
"MyExtension::FakeObjectWithUnsupportedCapability",
"MyFakeObjectWithUnsupportedCapability",
2);
auto &group = layout1.GetObjectGroups().InsertNew("AllObjects");
group.AddObject("MySpriteObject");
group.AddObject("MyOtherSpriteObject");
group.AddObject("MyFakeObjectWithUnsupportedCapability");
gd::ExpressionParser2 parser(platform, project, layout1);
@@ -283,6 +291,51 @@ TEST_CASE("ExpressionCodeGenerator", "[common][events]") {
"getNumberWith2Params(1, \"2\")");
}
}
SECTION("Invalid function calls (capabilities)") {
{
// Capability is supported, so the expression is valid.
auto node = parser.ParseExpression(
"string",
"MySpriteObject.GetSomethingRequiringEffectCapability(123)");
gd::ExpressionCodeGenerator expressionCodeGenerator(codeGenerator,
context);
REQUIRE(node);
node->Visit(expressionCodeGenerator);
REQUIRE(
expressionCodeGenerator.GetOutput() ==
"MySpriteObject.getSomethingRequiringEffectCapability(123) ?? \"\"");
}
{
// Capability is not supported, so the expression is not even valid.
auto node =
parser.ParseExpression("string",
"MyFakeObjectWithUnsupportedCapability."
"GetSomethingRequiringEffectCapability(123)");
gd::ExpressionCodeGenerator expressionCodeGenerator(codeGenerator,
context);
REQUIRE(node);
node->Visit(expressionCodeGenerator);
REQUIRE(expressionCodeGenerator.GetOutput() == "\"\"");
}
{
// We use a group, capability is supported only by one object of the
// group. The expression itself is valid, but code generation should skip
// the objects with unsupported capability.
auto node = parser.ParseExpression(
"string", "AllObjects.GetSomethingRequiringEffectCapability(123)");
gd::ExpressionCodeGenerator expressionCodeGenerator(codeGenerator,
context);
REQUIRE(node);
node->Visit(expressionCodeGenerator);
REQUIRE(
expressionCodeGenerator.GetOutput() ==
"MyOtherSpriteObject.getSomethingRequiringEffectCapability(123) ?? "
"MySpriteObject.getSomethingRequiringEffectCapability(123) ?? \"\"");
}
}
SECTION("Invalid variables") {
{
// Test an empty expression

View File

@@ -19,6 +19,10 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
SetupProjectWithDummyPlatform(project, platform);
auto &layout1 = project.InsertNewLayout("Layout1", 0);
layout1.InsertNewObject(project, "MyExtension::Sprite", "MySpriteObject", 0);
layout1.InsertNewObject(project,
"MyExtension::FakeObjectWithUnsupportedCapability",
"MyFakeObjectWithUnsupportedCapability",
1);
gd::ExpressionParser2 parser(platform, project, layout1);
@@ -1351,6 +1355,33 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
}
}
SECTION(
"Valid function call with an object expression requiring a capability") {
auto node = parser.ParseExpression(
"string", "MySpriteObject.GetSomethingRequiringEffectCapability(123)");
REQUIRE(node != nullptr);
gd::ExpressionValidator validator;
node->Visit(validator);
REQUIRE(validator.GetErrors().size() == 0);
}
SECTION(
"Invalid function call with an object expression requiring a "
"capability") {
auto node =
parser.ParseExpression("string",
"MyFakeObjectWithUnsupportedCapability."
"GetSomethingRequiringEffectCapability(123)");
REQUIRE(node != nullptr);
gd::ExpressionValidator validator;
node->Visit(validator);
REQUIRE(validator.GetErrors().size() == 1);
REQUIRE(validator.GetErrors()[0]->GetMessage() ==
"This expression exists, but it can't be used on this object.");
}
SECTION("Fuzzy/random tests") {
{
auto testExpression = [&parser](const gd::String &expression) {

View File

@@ -35,7 +35,11 @@ module.exports = {
'Florian Rival',
'MIT'
)
.setExtensionHelpPath('/all-features/admob');
.setExtensionHelpPath('/all-features/admob')
.setCategory('Ads');
extension
.addInstructionOrExpressionGroupMetadata(_('AdMob'))
.setIcon('JsPlatform/Extensions/admobicon24.png');
extension
.registerProperty('AdMobAppIdAndroid')
@@ -87,7 +91,7 @@ module.exports = {
'account being flagged for invalid activity.'
),
_('Enable test mode (serving test ads, for development): _PARAM0_'),
_('AdMob'),
'',
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
@@ -105,7 +109,7 @@ module.exports = {
'Check if a banner is currently loading. It will be shown automatically when loaded.'
),
_('Banner is loading'),
_('AdMob'),
'',
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
@@ -119,7 +123,7 @@ module.exports = {
_('Banner showing'),
_('Check if there is a banner being displayed.'),
_('Banner is showing'),
_('AdMob'),
'',
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
@@ -133,7 +137,7 @@ module.exports = {
_('Banner had an error'),
_('Check if there was a error while displaying a banner.'),
_('Banner ad had an error'),
_('AdMob'),
'',
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
@@ -159,7 +163,7 @@ module.exports = {
_(
'Configure the banner with Android ad unit ID: _PARAM0_, iOS ad unit ID: _PARAM1_, display at top: _PARAM2_'
),
_('AdMob'),
'',
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
@@ -190,7 +194,7 @@ module.exports = {
_('Show banner'),
_('Show the banner that was previously set up.'),
_('Show banner'),
_('AdMob'),
'',
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
@@ -206,7 +210,7 @@ module.exports = {
'Hide the banner. You can show it again with the corresponding action.'
),
_('Hide banner'),
_('AdMob'),
'',
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
@@ -224,7 +228,7 @@ module.exports = {
_('Interstitial loading'),
_('Check if an interstitial is currently loading.'),
_('Interstitial is loading'),
_('AdMob'),
'',
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
@@ -238,7 +242,7 @@ module.exports = {
_('Interstitial ready'),
_('Check if an interstitial is ready to be displayed.'),
_('Interstitial is ready'),
_('AdMob'),
'',
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
@@ -252,7 +256,7 @@ module.exports = {
_('Interstitial showing'),
_('Check if there is an interstitial being displayed.'),
_('Interstitial is showing'),
_('AdMob'),
'',
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
@@ -266,7 +270,7 @@ module.exports = {
_('Interstitial had an error'),
_('Check if there was a error while loading the interstitial.'),
_('Interstitial ad had an error'),
_('AdMob'),
'',
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
@@ -284,7 +288,7 @@ module.exports = {
_(
'Load interstitial with Android ad unit ID: _PARAM0_, iOS ad unit ID: _PARAM1_ (display automatically when loaded: _PARAM2_)'
),
_('AdMob'),
'',
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
@@ -315,7 +319,7 @@ module.exports = {
'Show the interstitial that was loaded. Will work only when the interstitial is fully loaded.'
),
_('Show the loaded interstitial'),
_('AdMob'),
'',
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
@@ -330,7 +334,7 @@ module.exports = {
_('Video loading'),
_('Check if a reward video is currently loading.'),
_('Reward video is loading'),
_('AdMob'),
'',
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
@@ -344,7 +348,7 @@ module.exports = {
_('Video ready'),
_('Check if a reward video is ready to be displayed.'),
_('Reward video is ready'),
_('AdMob'),
'',
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
@@ -358,7 +362,7 @@ module.exports = {
_('Video showing'),
_('Check if there is a reward video being displayed.'),
_('Reward video is showing'),
_('AdMob'),
'',
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
@@ -372,7 +376,7 @@ module.exports = {
_('Video had an error'),
_('Check if there was a error while loading the rewarded video.'),
_('Video ad had an error'),
_('AdMob'),
'',
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
@@ -388,7 +392,7 @@ module.exports = {
'Check if the reward of the video was given to the user.\nYou can mark this reward as cleared, so that the condition will be false and you can show later another reward video.'
),
_('User got the reward of the video (and clear this reward: _PARAM0_)'),
_('AdMob'),
'',
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
@@ -413,7 +417,7 @@ module.exports = {
_(
'Load reward video with Android ad unit ID: _PARAM0_, iOS ad unit ID: _PARAM1_ (display automatically when loaded: _PARAM2_)'
),
_('AdMob'),
'',
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
@@ -444,7 +448,7 @@ module.exports = {
'Show the reward video that was loaded. Will work only when the video is fully loaded.'
),
_('Show the loaded reward video'),
_('AdMob'),
'',
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
@@ -460,7 +464,7 @@ module.exports = {
'Mark the video reward as claimed. Useful if you used the condition to check if the reward was given to the user without clearing the reward.'
),
_('Mark the reward of the video as claimed'),
_('AdMob'),
'',
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)

View File

@@ -18,15 +18,20 @@ module.exports = {
gd /*: libGDevelop */
) {
const extension = new gd.PlatformExtension();
extension.setExtensionInformation(
'AdvancedWindow',
_('Advanced window management'),
_(
'Provides advanced features related to the game window positioning and interaction with the operating system.'
),
'Arthur Pacaud (arthuro555)',
'MIT'
);
extension
.setExtensionInformation(
'AdvancedWindow',
_('Advanced window management'),
_(
'Provides advanced features related to the game window positioning and interaction with the operating system.'
),
'Arthur Pacaud (arthuro555)',
'MIT'
)
.setCategory('Device');
extension
.addInstructionOrExpressionGroupMetadata(_('Advanced window management'))
.setIcon('res/actions/window24.png');
extension
.addAction(
@@ -34,7 +39,7 @@ module.exports = {
_('Change focus of the window'),
_('Make the window gain or lose focus.'),
_('Focus the window: _PARAM0_'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -52,7 +57,7 @@ module.exports = {
_('Window focused'),
_('Checks if the window is focused.'),
_('The window is focused'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -68,7 +73,7 @@ module.exports = {
_('Change visibility of the window'),
_('Make the window visible or invisible.'),
_('Window visible: _PARAM0_'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -86,7 +91,7 @@ module.exports = {
_('Window visible'),
_('Checks if the window is visible.'),
_('The window is visible'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -102,7 +107,7 @@ module.exports = {
_('Maximize the window'),
_('Maximize or unmaximize the window.'),
_('Maximize window: _PARAM0_'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -120,7 +125,7 @@ module.exports = {
_('Window maximized'),
_('Checks if the window is maximized.'),
_('The window is maximized'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -136,7 +141,7 @@ module.exports = {
_('Minimize the window'),
_('Minimize or unminimize the window.'),
_('Minimize window: _PARAM0_'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -154,7 +159,7 @@ module.exports = {
_('Window minimized'),
_('Checks if the window is minimized.'),
_('The window is minimized'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -170,7 +175,7 @@ module.exports = {
_('Enable the window'),
_('Enables or disables the window.'),
_('Enable window: _PARAM0_'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -188,7 +193,7 @@ module.exports = {
_('Window enabled'),
_('Checks if the window is enabled.'),
_('The window is enabled'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -204,7 +209,7 @@ module.exports = {
_('Allow resizing'),
_('Enables or disables resizing of the window by the user.'),
_('Enable window resizing: _PARAM0_'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -222,7 +227,7 @@ module.exports = {
_('Window resizable'),
_('Checks if the window can be resized.'),
_('The window can be resized'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -238,7 +243,7 @@ module.exports = {
_('Allow moving'),
_('Enables or disables moving of the window by the user.'),
_('Enable window moving: _PARAM0_'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -256,7 +261,7 @@ module.exports = {
_('Window movable'),
_('Checks if the window can be moved.'),
_('The window can be moved'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -272,7 +277,7 @@ module.exports = {
_('Allow maximizing'),
_('Enables or disables maximizing of the window by the user.'),
_('Enable window maximizing: _PARAM0_'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -290,7 +295,7 @@ module.exports = {
_('Window maximizable'),
_('Checks if the window can be maximized.'),
_('The window can be maximized'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -303,10 +308,10 @@ module.exports = {
extension
.addAction(
'SetMinimizable',
_('Allow mimizing'),
_('Allow minimizing'),
_('Enables or disables minimizing of the window by the user.'),
_('Enable window minimizing: _PARAM0_'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -324,7 +329,7 @@ module.exports = {
_('Window minimizable'),
_('Checks if the window can be minimized.'),
_('The window can be minimized'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -340,7 +345,7 @@ module.exports = {
_('Allow full-screening'),
_('Enables or disables full-screening of the window by the user.'),
_('Enable window full-screening: _PARAM0_'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -358,7 +363,7 @@ module.exports = {
_('Window full-screenable'),
_('Checks if the window can be full-screened.'),
_('The window can be set in fullscreen'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -374,7 +379,7 @@ module.exports = {
_('Allow closing'),
_('Enables or disables closing of the window by the user.'),
_('Enable window closing: _PARAM0_'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -392,7 +397,7 @@ module.exports = {
_('Window closable'),
_('Checks if the window can be closed.'),
_('The window can be closed'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -419,7 +424,7 @@ module.exports = {
_('Make the windows always on top'),
_('Puts the window constantly above all other windows.'),
_('Make window always on top: _PARAM0_, level: _PARAM1_'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -449,7 +454,7 @@ module.exports = {
_('Window always on top'),
_('Checks if the window is always on top.'),
_('The window is always on top'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -467,7 +472,7 @@ module.exports = {
'Puts the window in kiosk mode. This prevents the user from exiting fullscreen.'
),
_('Enable kiosk mode: _PARAM0_'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -485,7 +490,7 @@ module.exports = {
_('Kiosk mode'),
_('Checks if the window is currently in kiosk mode.'),
_('The window is in kiosk mode'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -501,7 +506,7 @@ module.exports = {
_('Enable window shadow'),
_('Enables or disables the window shadow.'),
_('Enable window shadow: _PARAM0_'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -519,7 +524,7 @@ module.exports = {
_('Shadow enabled'),
_("Checks if the window currently has it's shadow enabled."),
_('The window has a shadow'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -537,7 +542,7 @@ module.exports = {
'Enables or disables the content protection mode. This should prevent screenshots of the game from being taken.'
),
_('Enable content protection: _PARAM0_'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -555,7 +560,7 @@ module.exports = {
_('Allow focusing'),
_('Allow or disallow the user to focus the window.'),
_('Allow to focus the window: _PARAM0_'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -573,7 +578,7 @@ module.exports = {
_('Flash the window'),
_('Make the window flash or end flashing.'),
_('Make the window flash: _PARAM0_'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -591,12 +596,14 @@ module.exports = {
_('Set window opacity'),
_('Changes the window opacity.'),
_('Set the window opacity to _PARAM0_'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
.addParameter('expression', _('New opacity'), '', false)
.setParameterLongDescription('A number between 0 (fully transparent) and 1 (fully opaque).')
.setParameterLongDescription(
'A number between 0 (fully transparent) and 1 (fully opaque).'
)
.getCodeExtraInformation()
.setIncludeFile(
'Extensions/AdvancedWindow/electron-advancedwindowtools.js'
@@ -609,7 +616,7 @@ module.exports = {
_('Set window position'),
_('Changes the window position.'),
_('Set the window position to _PARAM0_;_PARAM1_'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window24.png',
'res/actions/window.png'
)
@@ -626,7 +633,7 @@ module.exports = {
'WindowX',
_('Window X position'),
_('Returns the current window X position.'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window.png'
)
.getCodeExtraInformation()
@@ -640,7 +647,7 @@ module.exports = {
'WindowY',
_('Window Y position'),
_('Returns the current window Y position.'),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window.png'
)
.getCodeExtraInformation()
@@ -656,7 +663,7 @@ module.exports = {
_(
'Returns the current window opacity (a number from 0 to 1, 1 being fully opaque).'
),
_('Advanced window management/Windows, Linux, macOS'),
_('Windows, Linux, macOS'),
'res/actions/window.png'
)
.getCodeExtraInformation()

View File

@@ -87,14 +87,16 @@ module.exports = {
.setValue(objectContent.bitmapFontResourceName)
.setType('resource')
.addExtraInfo('bitmapFont') //fnt or xml files
.setLabel(_('Bitmap Font'));
.setLabel(_('Bitmap Font'))
.setGroup(_("Font"));
objectProperties
.getOrCreate('textureAtlasResourceName')
.setValue(objectContent.textureAtlasResourceName)
.setType('resource')
.addExtraInfo('image')
.setLabel(_('Bitmap atlas image'));
.setLabel(_('Bitmap atlas image'))
.setGroup(_("Font"));
objectProperties
.getOrCreate('scale')
@@ -108,7 +110,7 @@ module.exports = {
.setValue(objectContent.tint)
.setType('color')
.setLabel(_('Font tint'))
.setGroup(_('Appearance'));
.setGroup(_("Font"));
objectProperties
.getOrCreate('wordWrap')
@@ -396,7 +398,7 @@ module.exports = {
objectsEditorService.registerEditorConfiguration(
'BitmapText::BitmapTextObject',
objectsEditorService.getDefaultObjectJsImplementationPropertiesEditor({
helpPagePath: '/objects/bitmaptext',
helpPagePath: '/objects/bitmap_text',
})
);
},

View File

@@ -25,13 +25,18 @@ module.exports = {
gd /*: libGDevelop */
) {
const extension = new gd.PlatformExtension();
extension.setExtensionInformation(
'DebuggerTools',
_('Debugger Tools'),
_('Allow to interact with the editor debugger from the game.'),
'Arthur Pacaud (arthuro555), Aurélien Vivet (Bouh)',
'MIT'
);
extension
.setExtensionInformation(
'DebuggerTools',
_('Debugger Tools'),
_('Allow to interact with the editor debugger from the game.'),
'Arthur Pacaud (arthuro555), Aurélien Vivet (Bouh)',
'MIT'
)
.setCategory('Advanced');
extension
.addInstructionOrExpressionGroupMetadata(_('Debugger Tools'))
.setIcon('res/actions/bug32.png');
extension
.addAction(
@@ -42,7 +47,7 @@ module.exports = {
'Note that events will be still executed until the end before the game is paused.'
),
_('Pause game execution'),
_('Debugger Tools'),
'',
'res/actions/bug32.png',
'res/actions/bug32.png'
)
@@ -61,7 +66,7 @@ module.exports = {
_(
'Enable debugging view of bounding boxes/collision masks: _PARAM1_ (include invisible objects: _PARAM2_, point names: _PARAM3_, custom points: _PARAM4_)'
),
_('Debugger Tools'),
'',
'res/actions/planicon24.png',
'res/actions/planicon.png'
)
@@ -91,7 +96,7 @@ module.exports = {
_(
'Log message _PARAM0_ of type _PARAM1_ to the console in group _PARAM2_'
),
_('Debugger Tools'),
'',
'res/actions/bug32.png',
'res/actions/bug32.png'
)

View File

@@ -15,7 +15,7 @@ class SerializerElement;
}
/**
* \brief Behavior that allows objects to be dragged with the mouse (or touch).
* \brief Behavior that destroys object outside the screen.
*/
class GD_EXTENSION_API DestroyOutsideBehavior : public gd::Behavior {
public:

View File

@@ -30,7 +30,10 @@ module.exports = {
),
"Matthias Meike",
"Open source (MIT License)"
).setExtensionHelpPath("/all-features/device-sensors");
).setExtensionHelpPath("/all-features/device-sensors")
.setCategory('Device');
extension.addInstructionOrExpressionGroupMetadata(_("Device sensors"))
.setIcon("JsPlatform/Extensions/orientation_active32.png");
extension
.addCondition(
@@ -40,8 +43,8 @@ module.exports = {
"The condition is true if the device orientation sensor is currently active"
),
_("Orientation sensor is active"),
_("Sensors/Orientation"),
"JsPlatform/Extensions/orientation_active24.png",
_("Orientation"),
"JsPlatform/Extensions/orientation_active32.png",
"JsPlatform/Extensions/orientation_active32.png"
)
.getCodeExtraInformation()
@@ -58,8 +61,8 @@ module.exports = {
"Compare the value of orientation alpha. (Range: 0 to 360°)"
),
_("the orientation alpha"),
_("Sensors/Orientation"),
"JsPlatform/Extensions/orientation_alpha24.png",
_("Orientation"),
"JsPlatform/Extensions/orientation_alpha32.png",
"JsPlatform/Extensions/orientation_alpha32.png"
)
.addParameter("relationalOperator", _("Sign of the test"), "number")
@@ -78,8 +81,8 @@ module.exports = {
"Compare the value of orientation beta. (Range: -180 to 180°)"
),
_("the orientation beta"),
_("Sensors/Orientation"),
"JsPlatform/Extensions/orientation_beta24.png",
_("Orientation"),
"JsPlatform/Extensions/orientation_beta32.png",
"JsPlatform/Extensions/orientation_beta32.png"
)
.addParameter("relationalOperator", _("Sign of the test"), "number")
@@ -98,8 +101,8 @@ module.exports = {
"Compare the value of orientation gamma. (Range: -90 to 90°)"
),
_("the orientation gamma"),
_("Sensors/Orientation"),
"JsPlatform/Extensions/orientation_gamma24.png",
_("Orientation"),
"JsPlatform/Extensions/orientation_gamma32.png",
"JsPlatform/Extensions/orientation_gamma32.png"
)
.addParameter("relationalOperator", _("Sign of the test"), "number")
@@ -116,8 +119,8 @@ module.exports = {
_("Activate orientation sensor"),
_("Activate the orientation sensor. (remember to turn it off again)"),
_("Activate the orientation sensor."),
_("Sensors/Orientation"),
"JsPlatform/Extensions/orientation_active24.png",
_("Orientation"),
"JsPlatform/Extensions/orientation_active32.png",
"JsPlatform/Extensions/orientation_active32.png"
)
.getCodeExtraInformation()
@@ -132,8 +135,8 @@ module.exports = {
_("Deactivate orientation sensor"),
_("Deactivate the orientation sensor."),
_("Deactivate the orientation sensor."),
_("Sensors/Orientation"),
"JsPlatform/Extensions/orientation_inactive24.png",
_("Orientation"),
"JsPlatform/Extensions/orientation_inactive32.png",
"JsPlatform/Extensions/orientation_inactive32.png"
)
.getCodeExtraInformation()
@@ -147,7 +150,7 @@ module.exports = {
"OrientationAbsolute",
_("Is Absolute"),
_("Get if the devices orientation is absolute and not relative"),
_("Sensors/Orientation"),
_("Orientation"),
"JsPlatform/Extensions/orientation_absolute16.png"
)
.getCodeExtraInformation()
@@ -161,7 +164,7 @@ module.exports = {
"OrientationAlpha",
_("Alpha value"),
_("Get the devices orientation Alpha (compass)"),
_("Sensors/Orientation"),
_("Orientation"),
"JsPlatform/Extensions/orientation_alpha16.png"
)
.getCodeExtraInformation()
@@ -175,7 +178,7 @@ module.exports = {
"OrientationBeta",
_("Beta value"),
_("Get the devices orientation Beta"),
_("Sensors/Orientation"),
_("Orientation"),
"JsPlatform/Extensions/orientation_beta16.png"
)
.getCodeExtraInformation()
@@ -189,7 +192,7 @@ module.exports = {
"OrientationGamma",
_("Gamma value"),
_("Get the devices orientation Gamma value"),
_("Sensors/Orientation"),
_("Orientation"),
"JsPlatform/Extensions/orientation_gamma16.png"
)
.getCodeExtraInformation()
@@ -206,8 +209,8 @@ module.exports = {
"The condition is true if the device motion sensor is currently active"
),
_("Motion sensor is active"),
_("Sensors/Motion"),
"JsPlatform/Extensions/motion_active24.png",
_("Motion"),
"JsPlatform/Extensions/motion_active32.png",
"JsPlatform/Extensions/motion_active32.png"
)
.getCodeExtraInformation()
@@ -224,8 +227,8 @@ module.exports = {
"Compare the value of rotation alpha. (Note: few devices support this sensor)"
),
_("the rotation alpha"),
_("Sensors/Motion"),
"JsPlatform/Extensions/motion_rotation_alpha24.png",
_("Motion"),
"JsPlatform/Extensions/motion_rotation_alpha32.png",
"JsPlatform/Extensions/motion_rotation_alpha32.png"
)
.addParameter("relationalOperator", _("Sign of the test"), "number")
@@ -244,8 +247,8 @@ module.exports = {
"Compare the value of rotation beta. (Note: few devices support this sensor)"
),
_("the rotation beta"),
_("Sensors/Motion"),
"JsPlatform/Extensions/motion_rotation_beta24.png",
_("Motion"),
"JsPlatform/Extensions/motion_rotation_beta32.png",
"JsPlatform/Extensions/motion_rotation_beta32.png"
)
.addParameter("relationalOperator", _("Sign of the test"), "number")
@@ -264,8 +267,8 @@ module.exports = {
"Compare the value of rotation gamma. (Note: few devices support this sensor)"
),
_("the rotation gamma"),
_("Sensors/Motion"),
"JsPlatform/Extensions/motion_rotation_gamma24.png",
_("Motion"),
"JsPlatform/Extensions/motion_rotation_gamma32.png",
"JsPlatform/Extensions/motion_rotation_gamma32.png"
)
.addParameter("relationalOperator", _("Sign of the test"), "number")
@@ -284,8 +287,8 @@ module.exports = {
"Compare the value of acceleration on the X-axis (m/s²)."
),
_("the acceleration X"),
_("Sensors/Motion"),
"JsPlatform/Extensions/motion_acceleration_x24.png",
_("Motion"),
"JsPlatform/Extensions/motion_acceleration_x32.png",
"JsPlatform/Extensions/motion_acceleration_x32.png"
)
.addParameter("relationalOperator", _("Sign of the test"), "number")
@@ -304,8 +307,8 @@ module.exports = {
"Compare the value of acceleration on the Y-axis (m/s²)."
),
_("the acceleration Y"),
_("Sensors/Motion"),
"JsPlatform/Extensions/motion_acceleration_y24.png",
_("Motion"),
"JsPlatform/Extensions/motion_acceleration_y32.png",
"JsPlatform/Extensions/motion_acceleration_y32.png"
)
.addParameter("relationalOperator", _("Sign of the test"), "number")
@@ -324,8 +327,8 @@ module.exports = {
"Compare the value of acceleration on the Z-axis (m/s²)."
),
_("the acceleration Z"),
_("Sensors/Motion"),
"JsPlatform/Extensions/motion_acceleration_z24.png",
_("Motion"),
"JsPlatform/Extensions/motion_acceleration_z32.png",
"JsPlatform/Extensions/motion_acceleration_z32.png"
)
.addParameter("relationalOperator", _("Sign of the test"), "number")
@@ -342,8 +345,8 @@ module.exports = {
_("Activate motion sensor"),
_("Activate the motion sensor. (remember to turn it off again)"),
_("Activate the motion sensor."),
_("Sensors/Motion"),
"JsPlatform/Extensions/motion_active24.png",
_("Motion"),
"JsPlatform/Extensions/motion_active32.png",
"JsPlatform/Extensions/motion_active32.png"
)
.getCodeExtraInformation()
@@ -358,8 +361,8 @@ module.exports = {
_("Deactivate motion sensor"),
_("Deactivate the motion sensor."),
_("Deactivate the motion sensor."),
_("Sensors/Motion"),
"JsPlatform/Extensions/motion_inactive24.png",
_("Motion"),
"JsPlatform/Extensions/motion_inactive32.png",
"JsPlatform/Extensions/motion_inactive32.png"
)
.getCodeExtraInformation()
@@ -373,7 +376,7 @@ module.exports = {
"RotationAlpha",
_("Alpha value"),
_("Get the devices rotation Alpha"),
_("Sensors/Motion"),
_("Motion"),
"JsPlatform/Extensions/motion_rotation_alpha16.png"
)
.getCodeExtraInformation()
@@ -387,7 +390,7 @@ module.exports = {
"RotationBeta",
_("Beta value"),
_("Get the devices rotation Beta"),
_("Sensors/Motion"),
_("Motion"),
"JsPlatform/Extensions/motion_rotation_beta16.png"
)
.getCodeExtraInformation()
@@ -401,7 +404,7 @@ module.exports = {
"RotationGamma",
_("Gamma value"),
_("Get the devices rotation Gamma"),
_("Sensors/Motion"),
_("Motion"),
"JsPlatform/Extensions/motion_rotation_gamma16.png"
)
.getCodeExtraInformation()
@@ -415,7 +418,7 @@ module.exports = {
"AccelerationX",
_("Acceleration X value"),
_("Get the devices acceleration on the X-axis (m/s²)"),
_("Sensors/Motion"),
_("Motion"),
"JsPlatform/Extensions/motion_acceleration_x16.png"
)
.getCodeExtraInformation()
@@ -429,7 +432,7 @@ module.exports = {
"AccelerationY",
_("Acceleration Y value"),
_("Get the devices acceleration on the Y-axis (m/s²)"),
_("Sensors/Motion"),
_("Motion"),
"JsPlatform/Extensions/motion_acceleration_y16.png"
)
.getCodeExtraInformation()
@@ -443,7 +446,7 @@ module.exports = {
"AccelerationZ",
_("Acceleration Z value"),
_("Get the devices acceleration on the Z-axis (m/s²)"),
_("Sensors/Motion"),
_("Motion"),
"JsPlatform/Extensions/motion_acceleration_z16.png"
)
.getCodeExtraInformation()

View File

@@ -34,7 +34,10 @@ module.exports = {
'Matthias Meike',
'Open source (MIT License)'
)
.setExtensionHelpPath('/all-features/device-vibration');
.setExtensionHelpPath('/all-features/device-vibration')
.setCategory('Device');
extension.addInstructionOrExpressionGroupMetadata(_("Device vibration"))
.setIcon("JsPlatform/Extensions/vibration_start32.png");
extension
.addDependency()
@@ -49,8 +52,8 @@ module.exports = {
_('Vibrate'),
_('Vibrate (Duration in ms).'),
_('Start vibration for _PARAM0_ ms'),
_('Vibration'),
'JsPlatform/Extensions/vibration_start24.png',
'',
'JsPlatform/Extensions/vibration_start32.png',
'JsPlatform/Extensions/vibration_start32.png'
)
.addParameter('expression', _('Duration'), '', false)
@@ -66,8 +69,8 @@ module.exports = {
'Vibrate (Duration in ms). You can add multiple comma-separated values where every second value determines the period of silence between two vibrations. This is a string value so use quotes.'
),
_('Start vibration for _PARAM0_ ms'),
_('Vibration'),
'JsPlatform/Extensions/vibration_pattern_start24.png',
'',
'JsPlatform/Extensions/vibration_pattern_start32.png',
'JsPlatform/Extensions/vibration_pattern_start32.png'
)
.addParameter(
@@ -86,8 +89,8 @@ module.exports = {
_('Stop vibration'),
_('Stop the vibration'),
_('Stop vibration'),
_('Vibration'),
'JsPlatform/Extensions/vibration_stop24.png',
'',
'JsPlatform/Extensions/vibration_stop32.png',
'JsPlatform/Extensions/vibration_stop32.png'
)
.getCodeExtraInformation()

View File

@@ -28,12 +28,16 @@ module.exports = {
extension
.setExtensionInformation(
'DialogueTree',
_('Dialogue Tree (Experimental)'),
_('Dialogue Tree (experimental)'),
'Handle dialogue trees, made using Yarn Spinner. Useful to make complex dialogues with multiple choices. The Yarn Spinner editor is embedded in GDevelop so you can edit your dialogues without leaving GDevelop.',
'Todor Imreorov',
'Open source (MIT License)'
)
.setExtensionHelpPath('/all-features/dialogue-tree');
.setExtensionHelpPath('/all-features/dialogue-tree')
.setCategory('Advanced');
extension
.addInstructionOrExpressionGroupMetadata(_('Dialogue Tree (experimental)'))
.setIcon('JsPlatform/Extensions/yarn32.png');
extension
.addAction(
@@ -43,8 +47,8 @@ module.exports = {
'Load a dialogue data object - Yarn json format, stored in a scene variable. Use this command to load all the Dialogue data at the beginning of the game.'
),
_('Load dialogue data from Scene variable _PARAM1_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter(
@@ -66,8 +70,8 @@ module.exports = {
'Load a dialogue data object - Yarn json format, stored in a Json file. Use this command to load all the Dialogue data at the beginning of the game.'
),
_('Load dialogue data from json file _PARAM1_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.addCodeOnlyParameter('currentScene', '')
@@ -90,8 +94,8 @@ module.exports = {
'Start dialogue from branch. Use this to initiate the dialogue from a specified branch.'
),
_('Start dialogue from branch _PARAM0_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('string', _('Dialogue branch'), '', false)
@@ -104,8 +108,8 @@ module.exports = {
_('Stop running dialogue'),
_('Stop the running dialogue. Use this to interrupt dialogue parsing.'),
_('Stop running dialogue'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.getCodeExtraInformation()
@@ -119,8 +123,8 @@ module.exports = {
'Go to the next dialogue line. Use this to advance to the next dialogue line when the player presses a button.'
),
_('Go to the next dialogue line'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.getCodeExtraInformation()
@@ -134,8 +138,8 @@ module.exports = {
'Set the selected option as confirmed, which will validate it and go forward to the next node. Use other actions to select options (see "select next option" and "Select previous option").'
),
_('Confirm selected Option'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.getCodeExtraInformation()
@@ -149,8 +153,8 @@ module.exports = {
'Select next Option (add 1 to selected option number). Use this when the dialogue line is of type "options" and the player has pressed a button to change selected option.'
),
_('Select next Option'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.getCodeExtraInformation()
@@ -164,8 +168,8 @@ module.exports = {
'Select previous Option (subtract 1 from selected option number). Use this when the dialogue line is of type "options" and the player has pressed a button to change selected option.'
),
_('Select previous Option'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.getCodeExtraInformation()
@@ -179,8 +183,8 @@ module.exports = {
'Select option by number. Use this when the dialogue line is of type "options" and the player has pressed a button to change selected option.'
),
_('Select option at index _PARAM0_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('expression', _('Option index number'), '', false)
@@ -195,8 +199,8 @@ module.exports = {
'Scroll clipped text. Use this with a timer and "get clipped text" when you want to create a typewriter effect. Every time the action runs, a new character appears from the text.'
),
_('Scroll clipped text'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.getCodeExtraInformation()
@@ -210,8 +214,8 @@ module.exports = {
'Complete the clipped text scrolling. Use this action whenever you want to skip scrolling.'
),
_('Complete clipped text scrolling'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.getCodeExtraInformation()
@@ -225,8 +229,8 @@ module.exports = {
'Set dialogue state string variable. Use this to set a variable that the dialogue data is using.'
),
_('Set dialogue state string variable _PARAM0_ to _PARAM1_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('string', _('State Variable Name'), '', false)
@@ -242,8 +246,8 @@ module.exports = {
'Set dialogue state number variable. Use this to set a variable that the dialogue data is using.'
),
_('Set dialogue state number variable _PARAM0_ to _PARAM1_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('string', _('State Variable Name'), '', false)
@@ -259,8 +263,8 @@ module.exports = {
'Set dialogue state boolean variable. Use this to set a variable that the dialogue data is using.'
),
_('Set dialogue state boolean variable _PARAM0_ to _PARAM1_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('string', _('State Variable Name'), '', false)
@@ -276,8 +280,8 @@ module.exports = {
'Save dialogue state. Use this to store the dialogue state into a variable, which can later be used for saving the game. That way player choices can become part of the game save.'
),
_('Save dialogue state to _PARAM0_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('globalvar', _('Global Variable'))
@@ -292,8 +296,8 @@ module.exports = {
'Load dialogue state. Use this to restore dialogue state, if you have stored in a variable before with the "Save state" action.'
),
_('Load dialogue state from _PARAM0_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('globalvar', _('Global Variable'), '', false)
@@ -308,8 +312,8 @@ module.exports = {
'Clear dialogue state. This resets all dialogue state accumulated by the player choices. Useful when the player is starting a new game.'
),
_('Clear dialogue state'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.getCodeExtraInformation()
@@ -320,7 +324,7 @@ module.exports = {
'LineText',
_('Get the current dialogue line text'),
_('Returns the current dialogue line text'),
_('Dialogue Tree (experimental)'),
'',
'JsPlatform/Extensions/yarn32.png'
)
.getCodeExtraInformation()
@@ -331,7 +335,7 @@ module.exports = {
'OptionsCount',
_('Get the number of options in an options line type'),
_('Get the number of options in an options line type'),
_('Dialogue Tree (experimental)'),
'',
'JsPlatform/Extensions/yarn32.png'
)
.getCodeExtraInformation()
@@ -344,7 +348,7 @@ module.exports = {
_(
"Get the text of an option from an Options line type, using the option's Number. The numbers start from 0."
),
_('Dialogue Tree (experimental)'),
'',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('expression', _('Option Index Number'), '', false)
@@ -358,7 +362,7 @@ module.exports = {
_(
"Get the text of all available options from an Options line type as a horizontal list. You can also pass the selected option's cursor string, which by default is ->"
),
_('Dialogue Tree (experimental)'),
'',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('string', _('Options Selection Cursor'), '', false)
@@ -373,7 +377,7 @@ module.exports = {
_(
"Get the text of all available options from an Options line type as a vertical list. You can also pass the selected option's cursor string, which by default is ->"
),
_('Dialogue Tree (experimental)'),
'',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('string', _('Options Selection Cursor'), '', false)
@@ -388,7 +392,7 @@ module.exports = {
_(
'Get the number of the currently selected option. Use this to help you render the option selection marker at the right place.'
),
_('Dialogue Tree (experimental)'),
'',
'JsPlatform/Extensions/yarn32.png'
)
.getCodeExtraInformation()
@@ -401,7 +405,7 @@ module.exports = {
_(
'Get dialogue line text clipped by the typewriter effect. Use the "Scroll clipped text" action to control the typewriter effect.'
),
_('Dialogue Tree (experimental)'),
'',
'JsPlatform/Extensions/yarn32.png'
)
.getCodeExtraInformation()
@@ -412,7 +416,7 @@ module.exports = {
'BranchTitle',
_('Get the title of the current branch of the running dialogue'),
_('Get the title of the current branch of the running dialogue'),
_('Dialogue Tree (experimental)'),
'',
'JsPlatform/Extensions/yarn32.png'
)
.getCodeExtraInformation()
@@ -423,7 +427,7 @@ module.exports = {
'BranchTags',
_('Get the tags of the current branch of the running dialogue'),
_('Get the tags of the current branch of the running dialogue'),
_('Dialogue Tree (experimental)'),
'',
'JsPlatform/Extensions/yarn32.png'
)
.getCodeExtraInformation()
@@ -438,7 +442,7 @@ module.exports = {
_(
'Get a tag of the current branch of the running dialogue via its index'
),
_('Dialogue Tree (experimental)'),
'',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('expression', _('Tag Index Number'), '', false)
@@ -452,7 +456,7 @@ module.exports = {
_(
'Get the parameters of a command call - <<command withParameter anotherParameter>>'
),
_('Dialogue Tree (experimental)'),
'',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('expression', _('parameter Index Number'), '', true)
@@ -464,7 +468,7 @@ module.exports = {
'CommandParametersCount',
_('Get the number of parameters in the currently passed command'),
_('Get the number of parameters in the currently passed command'),
_('Dialogue Tree (experimental)'),
'',
'JsPlatform/Extensions/yarn32.png'
)
.getCodeExtraInformation()
@@ -479,7 +483,7 @@ module.exports = {
_(
'Get parameter from a Tag found by the branch contains tag condition'
),
_('Dialogue Tree (experimental)'),
'',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('expression', _('parameter Index Number'), '', true)
@@ -491,7 +495,7 @@ module.exports = {
'VisitedBranchTitles',
_('Get a list of all visited branches'),
_('Get a list of all visited branches'),
_('Dialogue Tree (experimental)'),
'',
'JsPlatform/Extensions/yarn32.png'
)
.getCodeExtraInformation()
@@ -502,7 +506,7 @@ module.exports = {
'BranchText',
_('Get the full raw text of the current branch'),
_('Get the full raw text of the current branch'),
_('Dialogue Tree (experimental)'),
'',
'JsPlatform/Extensions/yarn32.png'
)
.getCodeExtraInformation()
@@ -513,7 +517,7 @@ module.exports = {
'Variable',
_('Get dialogue state value'),
_('Get dialogue state value'),
_('Dialogue Tree (experimental)'),
'',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('string', _('Variable Name'), '', false)
@@ -528,8 +532,8 @@ module.exports = {
'Check if a specific Command is called. If it is a <<command withParameter>>, you can even get the parameter with the CommandParameter expression.'
),
_('Command <<_PARAM0_>> is called'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('string', _('Command String'), '', false)
@@ -544,8 +548,8 @@ module.exports = {
'Check if the current dialogue line line is one of the three existing types. Use this to set what logic is executed for each type.\nThe three types are as follows:\n- text: when displaying dialogue text.\n- options: when displaying [[branching/options]] for dialogue choices.\n-command: when <<commands>> are triggered by the dialogue data.'
),
_('The dialogue line is _PARAM0_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter(
@@ -565,8 +569,8 @@ module.exports = {
'Check if the dialogue is running. Use this to for things like locking the player movement while speaking with a non player character.'
),
_('Dialogue is running'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.getCodeExtraInformation()
@@ -580,8 +584,8 @@ module.exports = {
'Check if the dialogue has a branch with specified name. Use this to check if a dialogue branch exists in the loaded dialogue data.'
),
_('Dialogue has a branch named _PARAM0_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('string', _('Branch name'), '', false)
@@ -596,8 +600,8 @@ module.exports = {
'Check if a selected option has changed when the current dialogue line type is options. Use this to detect when the player has selected another option, so you can re-draw where the selection arrow is.'
),
_('Selected option has changed'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.getCodeExtraInformation()
@@ -611,8 +615,8 @@ module.exports = {
'Check if the current dialogue branch title is equal to a string. Use this to trigger game events when the player has visited a specific dialogue branch.'
),
_('The current dialogue branch title is _PARAM0_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('string', _('title name'), '', false)
@@ -627,8 +631,8 @@ module.exports = {
'Check if the current dialogue branch contains a specific tag. Tags are an alternative useful way to <<commands>> to drive game logic with the dialogue data.'
),
_('The current dialogue branch contains a _PARAM0_ tag'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('string', _('tag name'), '', false)
@@ -641,8 +645,8 @@ module.exports = {
_('Branch title has been visited'),
_('Check if a branch has been visited'),
_('Branch title _PARAM0_ has been visited'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('string', _('branch title'), '', false)
@@ -657,8 +661,8 @@ module.exports = {
'Compare dialogue state string variable. Use this to trigger game events via dialogue variables.'
),
_('Dialogue state string variable _PARAM0_ is equal to _PARAM1_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('string', _('State variable'), '', false)
@@ -674,8 +678,8 @@ module.exports = {
'Compare dialogue state number variable. Use this to trigger game events via dialogue variables.'
),
_('Dialogue state number variable _PARAM0_ is equal to _PARAM1_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('string', _('State variable'), '', false)
@@ -691,8 +695,8 @@ module.exports = {
'Compare dialogue state variable. Use this to trigger game events via dialogue variables.'
),
_('Dialogue state boolean variable _PARAM0_ is equal to _PARAM1_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('string', _('State variable'), '', false)
@@ -708,8 +712,8 @@ module.exports = {
'Check if the clipped text scrolling has completed. Use this to prevent the player from going to the next dialogue line before the typing effect has revealed the entire text.'
),
_('Clipped text has completed scrolling'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'',
'JsPlatform/Extensions/yarn32.png',
'JsPlatform/Extensions/yarn32.png'
)
.getCodeExtraInformation()

View File

@@ -6,6 +6,42 @@ This project is released under the MIT License.
*/
#include "DraggableBehavior.h"
#include "GDCore/CommonTools.h"
#include "GDCore/Project/PropertyDescriptor.h"
#include "GDCore/Serialization/SerializerElement.h"
#include "GDCore/Tools/Localization.h"
DraggableBehavior::DraggableBehavior() {}
void DraggableBehavior::InitializeContent(gd::SerializerElement& content) {
content.SetAttribute("checkCollisionMask", true);
}
std::map<gd::String, gd::PropertyDescriptor> DraggableBehavior::GetProperties(
const gd::SerializerElement& behaviorContent) const {
std::map<gd::String, gd::PropertyDescriptor> properties;
properties["checkCollisionMask"]
.SetValue(behaviorContent.GetBoolAttribute("checkCollisionMask")
? "true"
: "false")
.SetType("Boolean")
.SetLabel(_("Do a precision check against the object's collision mask"))
.SetDescription(
_("Use the object (custom) collision mask instead of the bounding "
"box, making the behavior more precise at the cost of "
"reduced performance"));
;
return properties;
}
bool DraggableBehavior::UpdateProperty(gd::SerializerElement& behaviorContent,
const gd::String& name,
const gd::String& value) {
if (name == "checkCollisionMask") {
behaviorContent.SetAttribute("checkCollisionMask", (value != "0"));
return true;
}
return false;
}

View File

@@ -24,9 +24,20 @@ class GD_EXTENSION_API DraggableBehavior : public gd::Behavior {
public:
DraggableBehavior();
virtual ~DraggableBehavior(){};
virtual Behavior* Clone() const { return new DraggableBehavior(*this); }
virtual Behavior* Clone() const override {
return new DraggableBehavior(*this);
}
private:
#if defined(GD_IDE_ONLY)
virtual std::map<gd::String, gd::PropertyDescriptor> GetProperties(
const gd::SerializerElement& behaviorContent) const override;
virtual bool UpdateProperty(gd::SerializerElement& behaviorContent,
const gd::String& name,
const gd::String& value) override;
#endif
virtual void InitializeContent(
gd::SerializerElement& behaviorContent) override;
};
#endif // DRAGGABLEBEHAVIOR_H

View File

@@ -14,9 +14,11 @@ namespace gdjs {
* When the owner is being dragged, no other manager can start dragging it.
*/
_draggedByDraggableManager: DraggableManager | null = null;
_checkCollisionMask: boolean;
constructor(runtimeScene, behaviorData, owner) {
super(runtimeScene, behaviorData, owner);
this._checkCollisionMask = behaviorData.checkCollisionMask ? true : false;
}
updateFromBehaviorData(oldBehaviorData, newBehaviorData): boolean {
@@ -196,6 +198,14 @@ namespace gdjs {
!draggableRuntimeBehavior.owner.insideObject(position[0], position[1])
) {
return false;
} else if (
draggableRuntimeBehavior._checkCollisionMask &&
!draggableRuntimeBehavior.owner.isCollidingWithPoint(
position[0],
position[1]
)
) {
return false;
}
if (this._draggableBehavior) {
// The previous best object to drag will not be dragged.

View File

@@ -34,20 +34,29 @@ describe('gdjs.DraggableRuntimeBehavior', function () {
instances: [],
});
var object = new gdjs.RuntimeObject(runtimeScene, {
var object = new gdjs.TestRuntimeObject(runtimeScene, {
name: 'obj1',
type: '',
behaviors: [{ name: 'Behavior1', type: 'DraggableBehavior::Draggable' }],
variables: [],
effects: [],
});
var object2 = new gdjs.RuntimeObject(runtimeScene, {
object.setCustomWidthAndHeight(10, 10);
var object2 = new gdjs.TestRuntimeObject(runtimeScene, {
name: 'obj1',
type: '',
behaviors: [{ name: 'Behavior1', type: 'DraggableBehavior::Draggable' }],
behaviors: [
{
name: 'Behavior1',
type: 'DraggableBehavior::Draggable',
// @ts-ignore - properties are not typed
checkCollisionMask: true,
},
],
variables: [],
effects: [],
});
object2.setCustomWidthAndHeight(10, 10);
runtimeScene.addObject(object);
runtimeScene.addObject(object2);
@@ -96,6 +105,70 @@ describe('gdjs.DraggableRuntimeBehavior', function () {
expect(object.getY()).to.be(700);
});
it('can drag an object without collision mask check', function () {
object.setPosition(450, 500);
object.setAngle(45);
// Dragged point is in the bounding box but not in hitbox
runtimeScene.renderAndStep(1000 / 60);
runtimeGame.getInputManager().onMouseMove(450, 500);
runtimeGame
.getInputManager()
.onMouseButtonPressed(gdjs.InputManager.MOUSE_LEFT_BUTTON);
runtimeScene.renderAndStep(1000 / 60);
runtimeGame.getInputManager().onMouseMove(750, 600);
runtimeScene.renderAndStep(1000 / 60);
runtimeGame
.getInputManager()
.onMouseButtonReleased(gdjs.InputManager.MOUSE_LEFT_BUTTON);
runtimeScene.renderAndStep(1000 / 60);
expect(object.getX()).to.be(750);
expect(object.getY()).to.be(600);
object.setAngle(0);
});
it('can drag an object with collision mask check', function () {
object2.setPosition(450, 500);
object2.setAngle(45);
// Dragged point is in the bounding box but not in hitbox
runtimeScene.renderAndStep(1000 / 60);
runtimeGame.getInputManager().onMouseMove(450, 500);
runtimeGame
.getInputManager()
.onMouseButtonPressed(gdjs.InputManager.MOUSE_LEFT_BUTTON);
runtimeScene.renderAndStep(1000 / 60);
runtimeGame.getInputManager().onMouseMove(750, 600);
runtimeScene.renderAndStep(1000 / 60);
runtimeGame
.getInputManager()
.onMouseButtonReleased(gdjs.InputManager.MOUSE_LEFT_BUTTON);
runtimeScene.renderAndStep(1000 / 60);
expect(object2.getX()).to.be(450);
expect(object2.getY()).to.be(500);
// Dragged point is in the bounding box and in hitbox
runtimeScene.renderAndStep(1000 / 60);
runtimeGame.getInputManager().onMouseMove(455, 505);
runtimeGame
.getInputManager()
.onMouseButtonPressed(gdjs.InputManager.MOUSE_LEFT_BUTTON);
runtimeScene.renderAndStep(1000 / 60);
runtimeGame.getInputManager().onMouseMove(855, 705);
runtimeScene.renderAndStep(1000 / 60);
runtimeGame
.getInputManager()
.onMouseButtonReleased(gdjs.InputManager.MOUSE_LEFT_BUTTON);
runtimeScene.renderAndStep(1000 / 60);
expect(object2.getX()).to.be(850);
expect(object2.getY()).to.be(700);
object2.setAngle(0);
});
[false, true].forEach((firstInFront) => {
it(`must drag the object in front (${
firstInFront ? '1st object' : '2nd object'
@@ -184,6 +257,65 @@ describe('gdjs.DraggableRuntimeBehavior', function () {
expect(object.getX()).to.be(850);
expect(object.getY()).to.be(700);
});
it('can drag an object without collision mask check', function () {
object.setPosition(450, 500);
object.setAngle(45);
// Dragged point is in the bounding box but not in hitbox
runtimeScene.renderAndStep(1000 / 60);
runtimeGame.getInputManager().onTouchStart(0, 450, 500);
runtimeScene.renderAndStep(1000 / 60);
runtimeGame.getInputManager().onFrameEnded();
runtimeGame.getInputManager().onTouchMove(0, 750, 600);
runtimeScene.renderAndStep(1000 / 60);
runtimeGame.getInputManager().onFrameEnded();
runtimeGame.getInputManager().onTouchEnd(0);
runtimeScene.renderAndStep(1000 / 60);
runtimeGame.getInputManager().onFrameEnded();
expect(object.getX()).to.be(750);
expect(object.getY()).to.be(600);
object.setAngle(0);
});
it('can drag an object with collision mask check', function () {
object2.setPosition(450, 500);
object2.setAngle(45);
// Dragged point is in the bounding box but not in hitbox
runtimeScene.renderAndStep(1000 / 60);
runtimeGame.getInputManager().onTouchStart(0, 450, 500);
runtimeScene.renderAndStep(1000 / 60);
runtimeGame.getInputManager().onFrameEnded();
runtimeGame.getInputManager().onTouchMove(0, 750, 600);
runtimeScene.renderAndStep(1000 / 60);
runtimeGame.getInputManager().onFrameEnded();
runtimeGame.getInputManager().onTouchEnd(0);
runtimeScene.renderAndStep(1000 / 60);
runtimeGame.getInputManager().onFrameEnded();
expect(object2.getX()).to.be(450);
expect(object2.getY()).to.be(500);
// Dragged point is in the bounding box but not in hitbox
runtimeScene.renderAndStep(1000 / 60);
runtimeGame.getInputManager().onTouchStart(0, 455, 505);
runtimeScene.renderAndStep(1000 / 60);
runtimeGame.getInputManager().onFrameEnded();
runtimeGame.getInputManager().onTouchMove(0, 855, 705);
runtimeScene.renderAndStep(1000 / 60);
runtimeGame.getInputManager().onFrameEnded();
runtimeGame.getInputManager().onTouchEnd(0);
runtimeScene.renderAndStep(1000 / 60);
runtimeGame.getInputManager().onFrameEnded();
expect(object2.getX()).to.be(850);
expect(object2.getY()).to.be(700);
object2.setAngle(0);
});
it('can drag 2 objects with multitouch', function () {
runtimeGame.getInputManager().touchSimulateMouse(false);
object.setPosition(450, 500);

View File

@@ -32,6 +32,9 @@ module.exports = {
'Florian Rival',
'MIT'
);
extension
.addInstructionOrExpressionGroupMetadata(_('My Dummy Extension'))
.setIcon('CppPlatform/Extensions/topdownmovementicon.png');
// Register Properties
extension
@@ -106,7 +109,7 @@ module.exports = {
'This is an example of a condition displayed in the events sheet. Will return true if the number is less than 10 and the length of the text is less than 5.'
),
_('Call the example condition with _PARAM0_ and _PARAM1_'),
_('Dummy Extension'),
'',
'res/conditions/camera24.png',
'res/conditions/camera.png'
)
@@ -123,7 +126,7 @@ module.exports = {
'DummyExpression',
_('Dummy expression example'),
_('This is an example of an expression'),
_('Dummy Extension'),
'',
'res/actions/camera.png'
)
.addParameter('expression', _('Maximum'), '', false)
@@ -135,7 +138,7 @@ module.exports = {
'DummyStrExpression',
_('Dummy string expression example'),
_('This is an example of an expression returning a string'),
_('Dummy Extension'),
'',
'res/actions/camera.png'
)
.getCodeExtraInformation()

View File

@@ -32,7 +32,10 @@ module.exports = {
"Florian Rival",
"Open source (MIT License)"
)
.setExtensionHelpPath("/publishing/publishing-to-facebook-instant-games");
.setExtensionHelpPath("/publishing/publishing-to-facebook-instant-games")
.setCategory('Third-party');
extension.addInstructionOrExpressionGroupMetadata(_("Facebook Instant Games"))
.setIcon("JsPlatform/Extensions/facebookicon32.png");
extension
.addAction(
@@ -44,9 +47,9 @@ module.exports = {
_(
"Save the content of _PARAM1_ in key _PARAM0_ of player data (store success message in _PARAM2_ or error in _PARAM3_)"
),
_("Facebook Instant Games/Player data"),
"JsPlatform/Extensions/facebookicon24.png",
"JsPlatform/Extensions/facebookicon16.png"
_("Player data"),
"JsPlatform/Extensions/facebookicon32.png",
"JsPlatform/Extensions/facebookicon32.png"
)
.addParameter("string", 'Data key name (e.g: "Lives")', "", false)
.addParameter("scenevar", "Scene variable with the content to save", "", false)
@@ -76,9 +79,9 @@ module.exports = {
_(
"Load player data with key _PARAM0_ in _PARAM1_ (or error in _PARAM2_)"
),
_("Facebook Instant Games/Player data"),
"JsPlatform/Extensions/facebookicon24.png",
"JsPlatform/Extensions/facebookicon16.png"
_("Player data"),
"JsPlatform/Extensions/facebookicon32.png",
"JsPlatform/Extensions/facebookicon32.png"
)
.addParameter("string", _('Data key name (e.g: "Lives")'), "", false)
.addParameter(
@@ -109,9 +112,9 @@ module.exports = {
_(
"In leaderboard _PARAM0_, save score _PARAM1_ for the player and extra data from _PARAM2_ (store success message in _PARAM3_ or error in _PARAM4_)"
),
_("Facebook Instant Games/Leaderboards"),
"JsPlatform/Extensions/facebookicon24.png",
"JsPlatform/Extensions/facebookicon16.png"
_("Leaderboards"),
"JsPlatform/Extensions/facebookicon32.png",
"JsPlatform/Extensions/facebookicon32.png"
)
.addParameter(
"string",
@@ -152,9 +155,9 @@ module.exports = {
_(
"Load player entry from leaderboard _PARAM0_. Set rank in _PARAM1_, score in _PARAM2_ (extra data if any in _PARAM3_ and error in _PARAM4_)"
),
_("Facebook Instant Games/Leaderboards"),
"JsPlatform/Extensions/facebookicon24.png",
"JsPlatform/Extensions/facebookicon16.png"
_("Leaderboards"),
"JsPlatform/Extensions/facebookicon32.png",
"JsPlatform/Extensions/facebookicon32.png"
)
.addParameter(
"string",
@@ -198,9 +201,9 @@ module.exports = {
_("Check if ads are supported"),
_("Check if showing ads is supported on this device (only mobile phones can show ads)"),
_("Ads can be shown on this device"),
_("Facebook Instant Games/Ads"),
"JsPlatform/Extensions/facebookicon24.png",
"JsPlatform/Extensions/facebookicon16.png"
_("Ads"),
"JsPlatform/Extensions/facebookicon32.png",
"JsPlatform/Extensions/facebookicon32.png"
)
.getCodeExtraInformation()
.setIncludeFile(
@@ -214,9 +217,9 @@ module.exports = {
_("Is the interstitial ad ready"),
_("Check if the interstitial ad requested from Facebook is loaded and ready to be shown."),
_("The interstitial ad is loaded and ready to be shown"),
_("Facebook Instant Games/Ads"),
"JsPlatform/Extensions/facebookicon24.png",
"JsPlatform/Extensions/facebookicon16.png"
_("Ads"),
"JsPlatform/Extensions/facebookicon32.png",
"JsPlatform/Extensions/facebookicon32.png"
)
.getCodeExtraInformation()
.setIncludeFile(
@@ -230,9 +233,9 @@ module.exports = {
_("Load and prepare an interstitial ad"),
_("Request and load an interstitial ad from Facebook, so that it is ready to be shown."),
_("Request and load an interstitial ad from Facebook (ad placement id: _PARAM0_, error in _PARAM1_)"),
_("Facebook Instant Games/Ads"),
"JsPlatform/Extensions/facebookicon24.png",
"JsPlatform/Extensions/facebookicon16.png"
_("Ads"),
"JsPlatform/Extensions/facebookicon32.png",
"JsPlatform/Extensions/facebookicon32.png"
)
.addParameter(
"string",
@@ -258,9 +261,9 @@ module.exports = {
_("Show the loaded interstitial ad"),
_("Show the interstitial ad previously loaded in memory. This won't work if you did not load the interstitial before."),
_("Show the interstitial ad previously loaded in memory (if any error, store it in _PARAM0_)"),
_("Facebook Instant Games/Ads"),
"JsPlatform/Extensions/facebookicon24.png",
"JsPlatform/Extensions/facebookicon16.png"
_("Ads"),
"JsPlatform/Extensions/facebookicon32.png",
"JsPlatform/Extensions/facebookicon32.png"
)
.addParameter(
"scenevar",
@@ -280,9 +283,9 @@ module.exports = {
_("Is the rewarded video ready"),
_("Check if the rewarded video requested from Facebook is loaded and ready to be shown."),
_("The rewarded video is loaded and ready to be shown"),
_("Facebook Instant Games/Ads"),
"JsPlatform/Extensions/facebookicon24.png",
"JsPlatform/Extensions/facebookicon16.png"
_("Ads"),
"JsPlatform/Extensions/facebookicon32.png",
"JsPlatform/Extensions/facebookicon32.png"
)
.getCodeExtraInformation()
.setIncludeFile(
@@ -296,9 +299,9 @@ module.exports = {
_("Load and prepare a rewarded video"),
_("Request and load a rewarded video from Facebook, so that it is ready to be shown."),
_("Request and load a rewarded video from Facebook (ad placement id: _PARAM0_, error in _PARAM1_)"),
_("Facebook Instant Games/Ads"),
"JsPlatform/Extensions/facebookicon24.png",
"JsPlatform/Extensions/facebookicon16.png"
_("Ads"),
"JsPlatform/Extensions/facebookicon32.png",
"JsPlatform/Extensions/facebookicon32.png"
)
.addParameter(
"string",
@@ -324,9 +327,9 @@ module.exports = {
_("Show the loaded rewarded video"),
_("Show the rewarded video previously loaded in memory. This won't work if you did not load the video before."),
_("Show the rewarded video previously loaded in memory (if any error, store it in _PARAM0_)"),
_("Facebook Instant Games/Ads"),
"JsPlatform/Extensions/facebookicon24.png",
"JsPlatform/Extensions/facebookicon16.png"
_("Ads"),
"JsPlatform/Extensions/facebookicon32.png",
"JsPlatform/Extensions/facebookicon32.png"
)
.addParameter(
"scenevar",
@@ -345,8 +348,8 @@ module.exports = {
"PlayerId",
_("Player identifier"),
_("Get the player unique identifier"),
_("Facebook Instant Games"),
"JsPlatform/Extensions/facebookicon16.png"
'',
"JsPlatform/Extensions/facebookicon32.png"
)
.getCodeExtraInformation()
.setIncludeFile(
@@ -359,8 +362,8 @@ module.exports = {
"PlayerName",
_("Player name"),
_("Get the player name"),
_("Facebook Instant Games"),
"JsPlatform/Extensions/facebookicon16.png"
'',
"JsPlatform/Extensions/facebookicon32.png"
)
.getCodeExtraInformation()
.setIncludeFile(

View File

@@ -28,12 +28,16 @@ module.exports = {
extension
.setExtensionInformation(
'FileSystem',
_('Filesystem'),
_('File system'),
_('Access the filesystem of the operating system.'),
'Matthias Meike',
'Open source (MIT License)'
)
.setExtensionHelpPath('/all-features/filesystem');
.setExtensionHelpPath('/all-features/filesystem')
.setCategory('Device');
extension
.addInstructionOrExpressionGroupMetadata(_('File system'))
.setIcon('JsPlatform/Extensions/filesystem_create_folder32.png');
extension
.addCondition(
@@ -41,8 +45,8 @@ module.exports = {
_('File or directory exists'),
_('Check if the file or directory exists.'),
_('The path _PARAM0_ exists'),
_('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_path_exists24.png',
_('Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_path_exists32.png',
'JsPlatform/Extensions/filesystem_path_exists32.png'
)
.addParameter('string', _('Path to file or directory'), '', false)
@@ -56,8 +60,8 @@ module.exports = {
_('Create a directory'),
_('Create a new directory at the specified path.'),
_('Create directory _PARAM0_'),
_('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_create_folder24.png',
_('Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_create_folder32.png',
'JsPlatform/Extensions/filesystem_create_folder32.png'
)
.addParameter('string', _('Directory'), '', false)
@@ -81,8 +85,8 @@ module.exports = {
'Save a text into a file. Only use this on small files to avoid any lag or freeze during the game execution.'
),
_('Save _PARAM0_ into file _PARAM1_'),
_('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_save_file24.png',
_('Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_save_file32.png',
'JsPlatform/Extensions/filesystem_save_file32.png'
)
.addParameter('string', _('String (text)'), '', false)
@@ -107,8 +111,8 @@ module.exports = {
"Save a text into a file asynchronously. Use this for large files to avoid any lag or freeze during game execution. The 'result' variable gets updated when the operation has finished."
),
_('Save _PARAM0_ into file _PARAM1_'),
_('Filesystem/Windows, Linux, MacOS/Asynchronous'),
'JsPlatform/Extensions/filesystem_save_file24.png',
_('Windows, Linux, MacOS/Asynchronous'),
'JsPlatform/Extensions/filesystem_save_file32.png',
'JsPlatform/Extensions/filesystem_save_file32.png'
)
.addParameter('string', _('String (text)'), '', false)
@@ -133,8 +137,8 @@ module.exports = {
'Save a scene variable (including, for structure, all the children) into a file in JSON format. Only use this on small files to avoid any lag or freeze during the game execution.'
),
_('Save scene variable _PARAM0_ into file _PARAM1_ as JSON'),
_('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_save_file24.png',
_('Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_save_file32.png',
'JsPlatform/Extensions/filesystem_save_file32.png'
)
.addParameter('scenevar', _('Scene variable'), '', false)
@@ -159,8 +163,8 @@ module.exports = {
"Save the scene variable (including, for structures, all the children) into a file in JSON format, asynchronously. Use this for large files to avoid any lag or freeze during game execution. The 'result' variable gets updated when the operation has finished."
),
_('Save scene variable _PARAM0_ into file _PARAM1_ as JSON'),
_('Filesystem/Windows, Linux, MacOS/Asynchronous'),
'JsPlatform/Extensions/filesystem_save_file24.png',
_('Windows, Linux, MacOS/Asynchronous'),
'JsPlatform/Extensions/filesystem_save_file32.png',
'JsPlatform/Extensions/filesystem_save_file32.png'
)
.addParameter('scenevar', _('Scene variable'), '', false)
@@ -185,8 +189,8 @@ module.exports = {
"Load a text from a file, asynchronously. Use this for large files to avoid any lag or freeze during game execution. The content of the file will be available in the scene variable after a small delay (usually a few milliseconds). The 'result' variable gets updated when the operation has finished."
),
_('Load text from _PARAM1_ into scene variable _PARAM0_ (Async)'),
_('Filesystem/Windows, Linux, MacOS/Asynchronous'),
'JsPlatform/Extensions/filesystem_load_file24.png',
_('Windows, Linux, MacOS/Asynchronous'),
'JsPlatform/Extensions/filesystem_load_file32.png',
'JsPlatform/Extensions/filesystem_load_file32.png'
)
.addParameter('scenevar', _('Scene variable'), '', false)
@@ -211,8 +215,8 @@ module.exports = {
'Load a text from a file. Only use this on small files to avoid any lag or freeze during the game execution.'
),
_('Load text from _PARAM1_ into scene variable _PARAM0_'),
_('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_load_file24.png',
_('Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_load_file32.png',
'JsPlatform/Extensions/filesystem_load_file32.png'
)
.addParameter('scenevar', _('Scene variable'), '', false)
@@ -237,8 +241,8 @@ module.exports = {
'Load a JSON formatted text from a file and convert it to a scene variable (potentially a structure variable with children). Only use this on small files to avoid any lag or freeze during the game execution.'
),
_('Load JSON from _PARAM1_ into scene variable _PARAM0_'),
_('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_save_file24.png',
_('Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_save_file32.png',
'JsPlatform/Extensions/filesystem_save_file32.png'
)
.addParameter('scenevar', _('Scene variable'), '', false)
@@ -263,8 +267,8 @@ module.exports = {
"Load a JSON formatted text from a file and convert it to a scene variable (potentially a structure variable with children), asynchronously. Use this for large files to avoid any lag or freeze during game execution. The content of the file will be available as a scene variable after a small delay (usually a few milliseconds). The 'result' variable gets updated when the operation has finished."
),
_('Load JSON from _PARAM1_ into scene variable _PARAM0_'),
_('Filesystem/Windows, Linux, MacOS/Asynchronous'),
'JsPlatform/Extensions/filesystem_save_file24.png',
_('Windows, Linux, MacOS/Asynchronous'),
'JsPlatform/Extensions/filesystem_save_file32.png',
'JsPlatform/Extensions/filesystem_save_file32.png'
)
.addParameter('scenevar', _('Scene variable'), '', false)
@@ -287,8 +291,8 @@ module.exports = {
_('Delete a file'),
_('Delete a file from the filesystem.'),
_('Delete the file _PARAM0_'),
_('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_delete_file24.png',
_('Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_delete_file32.png',
'JsPlatform/Extensions/filesystem_delete_file32.png'
)
.addParameter('string', _('File path'), '', false)
@@ -312,8 +316,8 @@ module.exports = {
'Delete a file from the filesystem asynchronously. The option result variable will be updated once the file is deleted.'
),
_('Delete the file _PARAM0_'),
_('Filesystem/Windows, Linux, MacOS/Asynchronous'),
'JsPlatform/Extensions/filesystem_delete_file24.png',
_('Windows, Linux, MacOS/Asynchronous'),
'JsPlatform/Extensions/filesystem_delete_file32.png',
'JsPlatform/Extensions/filesystem_delete_file32.png'
)
.addParameter('string', _('File path'), '', false)
@@ -334,7 +338,7 @@ module.exports = {
'DesktopPath',
_('Desktop folder'),
_('Get the path to the desktop folder.'),
_('Filesystem/Windows, Linux, MacOS'),
_('Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_folder32.png'
)
.addCodeOnlyParameter('currentScene', '')
@@ -347,7 +351,7 @@ module.exports = {
'DocumentsPath',
_('Documents folder'),
_('Get the path to the documents folder.'),
_('Filesystem/Windows, Linux, MacOS'),
_('Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_folder32.png'
)
.addCodeOnlyParameter('currentScene', '')
@@ -360,7 +364,7 @@ module.exports = {
'PicturesPath',
_('Pictures folder'),
_('Get the path to the pictures folder.'),
_('Filesystem/Windows, Linux, MacOS'),
_('Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_folder32.png'
)
.addCodeOnlyParameter('currentScene', '')
@@ -373,7 +377,7 @@ module.exports = {
'ExecutablePath',
_('Game executable file'),
_('Get the path to this game executable file.'),
_('Filesystem/Windows, Linux, MacOS'),
_('Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_folder32.png'
)
.addCodeOnlyParameter('currentScene', '')
@@ -386,7 +390,7 @@ module.exports = {
'ExecutableFolderPath',
_('Game executable folder'),
_('Get the path to this game executable folder.'),
_('Filesystem/Windows, Linux, MacOS'),
_('Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_folder32.png'
)
.addCodeOnlyParameter('currentScene', '')
@@ -399,7 +403,7 @@ module.exports = {
'UserdataPath',
_('Userdata folder (for application settings)'),
_('Get the path to userdata folder (for application settings).'),
_('Filesystem/Windows, Linux, MacOS'),
_('Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_folder32.png'
)
.addCodeOnlyParameter('currentScene', '')
@@ -412,7 +416,7 @@ module.exports = {
'UserHomePath',
_("User's Home folder"),
_('Get the path to the user home folder.'),
_('Filesystem/Windows, Linux, MacOS'),
_('Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_folder32.png'
)
.addCodeOnlyParameter('currentScene', '')
@@ -425,7 +429,7 @@ module.exports = {
'TempPath',
_('Temp folder'),
_('Get the path to temp folder.'),
_('Filesystem/Windows, Linux, MacOS'),
_('Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_folder32.png'
)
.addCodeOnlyParameter('currentScene', '')
@@ -438,7 +442,7 @@ module.exports = {
'PathDelimiter',
_('Path delimiter'),
_('Get the operating system path delimiter.'),
_('Filesystem/Windows, Linux, MacOS'),
_('Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_folder32.png'
)
.getCodeExtraInformation()
@@ -452,7 +456,7 @@ module.exports = {
_(
'Returns the portion of the path that represents the directories, without the ending file name.'
),
_('Filesystem/Windows, Linux, MacOS'),
_('Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_folder32.png'
)
.addParameter('string', _('File or folder path'), '', false)
@@ -465,7 +469,7 @@ module.exports = {
'FileName',
_('Get file name from a path'),
_('Returns the name of the file with its extension, if any.'),
_('Filesystem/Windows, Linux, MacOS'),
_('Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_folder32.png'
)
.addParameter('string', _('File path'), '', false)
@@ -480,7 +484,7 @@ module.exports = {
_(
'Returns the extension of the file designated by the given path, including the extension period. For example: ".txt".'
),
_('Filesystem/Windows, Linux, MacOS'),
_('Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_folder32.png'
)
.addParameter('string', _('File path'), '', false)

View File

@@ -28,7 +28,11 @@ module.exports = {
'Arthur Pacaud (arthuro555)',
'MIT'
)
.setExtensionHelpPath('/all-features/firebase');
.setExtensionHelpPath('/all-features/firebase')
.setCategory('Network');
extension
.addInstructionOrExpressionGroupMetadata(_('Firebase'))
.setIcon('JsPlatform/Extensions/firebase.png');
extension
.registerProperty('FirebaseConfig')
@@ -42,7 +46,7 @@ module.exports = {
_('Enable analytics'),
_('Enables Analytics for that project.'),
_('Enable analytics'),
_('Firebase/Analytics'),
_('Analytics'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -64,7 +68,7 @@ module.exports = {
'Can also pass additional data to the Analytics'
),
_('Trigger Event _PARAM0_ with argument _PARAM1_'),
_('Firebase/Analytics'),
_('Analytics'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -90,7 +94,7 @@ module.exports = {
'For advanced usage only.'
),
_("Set current user's ID to _PARAM0_"),
_('Firebase/Analytics'),
_('Analytics'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -114,7 +118,7 @@ module.exports = {
'Can be used to classify user in Analytics.'
),
_('Set property _PARAM0_ of the current user to _PARAM1_'),
_('Firebase/Analytics'),
_('Analytics'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -136,7 +140,7 @@ module.exports = {
'GetRemoteConfigString',
_('Get Remote setting as String'),
_('Get a setting from Firebase Remote Config as a string.'),
_('Firebase/Remote Config'),
_('Remote Config'),
'JsPlatform/Extensions/firebase.png'
)
.addParameter('string', _('Setting Name'), '', false)
@@ -156,7 +160,7 @@ module.exports = {
'GetRemoteConfigNumber',
_('Get Remote setting as Number'),
_('Get a setting from Firebase Remote Config as Number.'),
_('Firebase/Remote Config'),
_('Remote Config'),
'JsPlatform/Extensions/firebase.png'
)
.addParameter('string', _('Setting Name'), '', false)
@@ -177,7 +181,7 @@ module.exports = {
_('Set Remote Config Auto Update Inteval'),
_('Sets Remote Config Auto Update Inteval.'),
_('Set Remote Config Auto Update Inteval to _PARAM0_'),
_('Firebase/Remote Config'),
_('Remote Config'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -205,7 +209,7 @@ module.exports = {
'the config is still loading.'
),
_('Set default config to _PARAM0_'),
_('Firebase/Remote Config'),
_('Remote Config'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -229,7 +233,7 @@ module.exports = {
_('Force sync the configuration'),
_('Use this to sync the Remote Config with the client at any time.'),
_('Synchronize Remote Config'),
_('Firebase/Remote Config'),
_('Remote Config'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -245,10 +249,10 @@ module.exports = {
extension
.addAction(
'CreateBasicAccount',
_('Create account with with email'),
_('Create account with email'),
_('Create an account with email and password as credentials.'),
_('Create account with email _PARAM0_ and password _PARAM1_'),
_('Firebase/Authentication'),
_('Authentication'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -275,7 +279,7 @@ module.exports = {
_('Sign into an account with email'),
_('Sign into an account with email and password as credentials. '),
_('Connect to account with email _PARAM0_ and password _PARAM1_'),
_('Firebase/Authentication'),
_('Authentication'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -300,7 +304,7 @@ module.exports = {
_('Log out of the account'),
_('Logs out of the current account. '),
_('Log out from the account'),
_('Firebase/Authentication'),
_('Authentication'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -321,7 +325,7 @@ module.exports = {
'Provider authentication only works in the browser! Not on previews or pc/mobile exports.'
),
_('Connect to account with Provider _PARAM0_'),
_('Firebase/Authentication'),
_('Authentication'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -350,7 +354,7 @@ module.exports = {
_('Sign In as an anonymous guest'),
_('Sign into a temporary anonymous account.'),
_('Authenticate anonymously'),
_('Firebase/Authentication'),
_('Authentication'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -376,7 +380,7 @@ module.exports = {
'this before actions requiring authentications.'
),
_('Check for authentication'),
_('Firebase/Authentication'),
_('Authentication'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -394,7 +398,7 @@ module.exports = {
_(
'Get the user authentififcation token. The token is the proof of authentication.'
),
_('Firebase/Authentication'),
_('Authentication'),
'JsPlatform/Extensions/firebase.png'
)
.addParameter('string', _('Setting Name'), '', false)
@@ -412,7 +416,7 @@ module.exports = {
_('Is the user email address verified'),
_('Checks if the email address of the user got verified.'),
_('The email of the user is verified'),
_('Firebase/Authentication/User Management'),
_('Authentication/User Management'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -430,7 +434,7 @@ module.exports = {
'GetUserEmail',
_('Get the user email address'),
_('Gets the user email address.'),
_('Firebase/Authentication/User Management'),
_('Authentication/User Management'),
'JsPlatform/Extensions/firebase.png'
)
.getCodeExtraInformation()
@@ -447,7 +451,7 @@ module.exports = {
'GetAccountCreationTime',
_('Get the accounts creation time'),
_('Gets the accounts creation time.'),
_('Firebase/Authentication/User Management'),
_('Authentication/User Management'),
'JsPlatform/Extensions/firebase.png'
)
.getCodeExtraInformation()
@@ -464,7 +468,7 @@ module.exports = {
'GetLastLoginTime',
_('Get the user last login time'),
_('Gets the user last login time.'),
_('Firebase/Authentication/User Management'),
_('Authentication/User Management'),
'JsPlatform/Extensions/firebase.png'
)
.getCodeExtraInformation()
@@ -481,7 +485,7 @@ module.exports = {
'GetUserDisplayName',
_('Get the user display name'),
_('Gets the user display name.'),
_('Firebase/Authentication/User Management'),
_('Authentication/User Management'),
'JsPlatform/Extensions/firebase.png'
)
.getCodeExtraInformation()
@@ -498,7 +502,7 @@ module.exports = {
'GetPhoneNumber',
_('Get the user phone number'),
_('Gets the user phone number.'),
_('Firebase/Authentication/User Management'),
_('Authentication/User Management'),
'JsPlatform/Extensions/firebase.png'
)
.getCodeExtraInformation()
@@ -518,7 +522,7 @@ module.exports = {
'Gets the user Unique IDentifier. Use that to link data to an ' +
'user instead of the name or email.'
),
_('Firebase/Authentication/User Management'),
_('Authentication/User Management'),
'JsPlatform/Extensions/firebase.png'
)
.getCodeExtraInformation()
@@ -535,7 +539,7 @@ module.exports = {
'GetTenantID',
_('Get the user tenant ID'),
_('Gets the user tenant ID. For advanced usage only.'),
_('Firebase/Authentication/User Management'),
_('Authentication/User Management'),
'JsPlatform/Extensions/firebase.png'
)
.getCodeExtraInformation()
@@ -552,7 +556,7 @@ module.exports = {
'GetRefreshToken',
_('Get the user refresh token'),
_('Gets the user refresh token. For advanced usage only.'),
_('Firebase/Authentication/User Management'),
_('Authentication/User Management'),
'JsPlatform/Extensions/firebase.png'
)
.getCodeExtraInformation()
@@ -569,7 +573,7 @@ module.exports = {
'GetPhotoURL',
_('Get the user profile picture URL'),
_('Gets an URL to the user profile picture.'),
_('Firebase/Authentication/User Management'),
_('Authentication/User Management'),
'JsPlatform/Extensions/firebase.png'
)
.getCodeExtraInformation()
@@ -587,7 +591,7 @@ module.exports = {
_('Send a verification email'),
_('Send a link per email to verify the user email.'),
_('Send verification email'),
_('Firebase/Authentication/User Management'),
_('Authentication/User Management'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -606,7 +610,7 @@ module.exports = {
_('Set display name'),
_('Sets the user display name.'),
_("Set the user's display name to _PARAM0_"),
_('Firebase/Authentication/User Management'),
_('Authentication/User Management'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -626,7 +630,7 @@ module.exports = {
_('Set the user profile picture'),
_('Sets the user profile picture URL to a new one.'),
_("Set the user's profile picture URL to _PARAM0_"),
_('Firebase/Authentication/User Management'),
_('Authentication/User Management'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -652,7 +656,7 @@ module.exports = {
_(
"Change the user's email to _PARAM0_ and store result in _PARAM4_ (send verification email: _PARAM3_)"
),
_('Firebase/Authentication/User Management/Advanced'),
_('Authentication/User Management/Advanced'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -693,7 +697,7 @@ module.exports = {
_(
"Change the user's email to _PARAM0_ and store result in _PARAM2_ (send verification email: _PARAM1_)"
),
_('Firebase/Authentication/User Management/Advanced'),
_('Authentication/User Management/Advanced'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -732,7 +736,7 @@ module.exports = {
'Change the user password to _PARAM2_ and store result in ' +
'_PARAM4_ (send verification email: _PARAM3_)'
),
_('Firebase/Authentication/User Management/Advanced'),
_('Authentication/User Management/Advanced'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -774,7 +778,7 @@ module.exports = {
'Change the user password to _PARAM0_ and store result in ' +
'_PARAM2_ (send verification email: _PARAM1_)'
),
_('Firebase/Authentication/User Management/Advanced'),
_('Authentication/User Management/Advanced'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -810,7 +814,7 @@ module.exports = {
'Deletes the user account.'
),
_('Delete the user account and store result in _PARAM2_'),
_('Firebase/Authentication/User Management/Advanced'),
_('Authentication/User Management/Advanced'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -841,7 +845,7 @@ module.exports = {
'This is the same as "Delete the user account" but reauthenticates via an external provider.'
),
_('Delete the user account and store result in _PARAM0_'),
_('Firebase/Authentication/User Management/Advanced'),
_('Authentication/User Management/Advanced'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -868,7 +872,7 @@ module.exports = {
_('Enable performance measuring'),
_('Enables performance measuring.'),
_('Enable performance measuring'),
_('Firebase/Performance Measuring'),
_('Performance Measuring'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -889,7 +893,7 @@ module.exports = {
'They are used to measure performance of custom events.'
),
_('Create performance tracker: _PARAM0_'),
_('Firebase/Performance Measuring'),
_('Performance Measuring'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -911,7 +915,7 @@ module.exports = {
_('Start a tracer'),
_('Start measuring performance for that tracer'),
_('Start performance measuring on tracer _PARAM0_'),
_('Firebase/Performance Measuring'),
_('Performance Measuring'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -933,7 +937,7 @@ module.exports = {
_('Stop a tracer'),
_('Stop measuring performance for that tracer'),
_('Stop performance measuring on tracer _PARAM0_'),
_('Firebase/Performance Measuring'),
_('Performance Measuring'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -960,7 +964,7 @@ module.exports = {
_(
'Record performance for _PARAM1_ms with a delay of _PARAM2_ms (store in tracker _PARAM0_)'
),
_('Firebase/Performance Measuring'),
_('Performance Measuring'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -996,7 +1000,7 @@ module.exports = {
'Call HTTP Function _PARAM0_ with parameter(s) _PARAM1_ ' +
'(Callback variables: Value: _PARAM2_ State: _PARAM3_)'
),
_('Firebase/Functions'),
_('Functions'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1033,7 +1037,7 @@ module.exports = {
_('Enable Messaging'),
_('Enables Firebase push messaging.'),
_('Enable Firebase Messaging with Public Key _PARAM0_.'),
_('Firebase/Messaging'),
_('Messaging'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1055,7 +1059,7 @@ module.exports = {
_(
'Set a field to the timstamp on the server when the request arrives there'
),
_('Firebase/Cloud Firestore'),
_('Cloud Firestore'),
'JsPlatform/Extensions/firebase.png'
)
.getCodeExtraInformation()
@@ -1080,7 +1084,7 @@ module.exports = {
'A query allows to get a filtered and ordered list of documents in a collection.'
),
_('Create a query named _PARAM0_ for collection _PARAM1_'),
_('Firebase/Cloud Firestore/Queries/Initialize'),
_('Cloud Firestore/Queries/Initialize'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1103,7 +1107,7 @@ module.exports = {
_('Start a query from another query'),
_('Start a query with the same collection and filters as another one.'),
_('Create a query named _PARAM0_ from query _PARAM1_'),
_('Firebase/Cloud Firestore/Queries/Initialize'),
_('Cloud Firestore/Queries/Initialize'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1134,7 +1138,7 @@ module.exports = {
_(
'Filter query _PARAM0_ to remove documents whose field _PARAM1_ is not _PARAM2__PARAM3_'
),
_('Firebase/Cloud Firestore/Queries/Filters'),
_('Cloud Firestore/Queries/Filters'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1167,7 +1171,7 @@ module.exports = {
_(
'Filter query _PARAM0_ to remove documents whose field _PARAM1_ is not _PARAM2__PARAM3_'
),
_('Firebase/Cloud Firestore/Queries/Filters'),
_('Cloud Firestore/Queries/Filters'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1198,7 +1202,7 @@ module.exports = {
_('Order by field value'),
_('Orders all documents in the query by a the value of a field.'),
_('Order query _PARAM0_ by field _PARAM1_ (direction: _PARAM2_)'),
_('Firebase/Cloud Firestore/Queries/Filters'),
_('Cloud Firestore/Queries/Filters'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1234,7 +1238,7 @@ module.exports = {
_(
'Limit query _PARAM0_ to _PARAM1_ documents (begin from the end: _PARAM2_)'
),
_('Firebase/Cloud Firestore/Queries/Filters'),
_('Cloud Firestore/Queries/Filters'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1266,7 +1270,7 @@ module.exports = {
_(
'Skip documents with fields (before: _PARAM2_) value _PARAM1_ in query _PARAM0_ (include documents at that value: _PARAM3_)'
),
_('Firebase/Cloud Firestore/Queries/Filters'),
_('Cloud Firestore/Queries/Filters'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1308,7 +1312,7 @@ module.exports = {
_(
'Execute query _PARAM0_ and store results into _PARAM1_ (store result state in _PARAM2_)'
),
_('Firebase/Cloud Firestore/Queries/Execute'),
_('Cloud Firestore/Queries/Execute'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1350,7 +1354,7 @@ module.exports = {
_(
'Watch and automatically execute query _PARAM0_ and store results into _PARAM1_ (store result state in _PARAM2_)'
),
_('Firebase/Cloud Firestore/Queries/Execute'),
_('Cloud Firestore/Queries/Execute'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1392,7 +1396,7 @@ module.exports = {
'This needs to be called before any other firestore operation, otherwise it will fail.'
),
_('Enable persistence'),
_('Firebase/Cloud Firestore'),
_('Cloud Firestore'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1416,7 +1420,7 @@ module.exports = {
'This needs to be called before any other firestore operation, otherwise it will fail.'
),
_('Disable persistence'),
_('Firebase/Cloud Firestore'),
_('Cloud Firestore'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1437,7 +1441,7 @@ module.exports = {
_('Re-enable network'),
_('Re-enables the connection to the database after disabling it.'),
_('Re-enable network'),
_('Firebase/Cloud Firestore'),
_('Cloud Firestore'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1462,7 +1466,7 @@ module.exports = {
'cache, and any write operations will be queued until the network is restored.'
),
_('Disable network'),
_('Firebase/Cloud Firestore'),
_('Cloud Firestore'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1485,7 +1489,7 @@ module.exports = {
_(
'Write _PARAM2_ to firestore in document _PARAM1_ of collection _PARAM0_ (store result state in _PARAM3_)'
),
_('Firebase/Cloud Firestore/Documents'),
_('Cloud Firestore/Documents'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1517,7 +1521,7 @@ module.exports = {
_(
'Add _PARAM1_ to firestore collection _PARAM0_ (store result state in _PARAM2_)'
),
_('Firebase/Cloud Firestore/Documents'),
_('Cloud Firestore/Documents'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1548,7 +1552,7 @@ module.exports = {
_(
'Write _PARAM3_ to firestore in field _PARAM2_ of document _PARAM1_ in collection _PARAM0_ (store result state in _PARAM4_, Merge: _PARAM5_)'
),
_('Firebase/Cloud Firestore/Fields'),
_('Cloud Firestore/Fields'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1582,7 +1586,7 @@ module.exports = {
_(
'Update firestore document _PARAM1_ in collection _PARAM0_ with _PARAM2_ (store result state in _PARAM3_)'
),
_('Firebase/Cloud Firestore/Documents'),
_('Cloud Firestore/Documents'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1614,7 +1618,7 @@ module.exports = {
_(
'Update field _PARAM2_ of firestore document _PARAM1_ in collection _PARAM0_ with _PARAM3_ (store result state in _PARAM4_)'
),
_('Firebase/Cloud Firestore/Fields'),
_('Cloud Firestore/Fields'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1647,7 +1651,7 @@ module.exports = {
_(
'Delete firestore document _PARAM1_ in collection _PARAM0_ (store result state in _PARAM2_)'
),
_('Firebase/Cloud Firestore/Documents'),
_('Cloud Firestore/Documents'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1678,7 +1682,7 @@ module.exports = {
_(
'Delete field _PARAM2_ of firestore document _PARAM1_ in collection _PARAM0_ with (store result state in _PARAM3_)'
),
_('Firebase/Cloud Firestore/Fields'),
_('Cloud Firestore/Fields'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1710,7 +1714,7 @@ module.exports = {
_(
'Load firestore document _PARAM1_ from collection _PARAM0_ into _PARAM2_ (store result state in _PARAM3_)'
),
_('Firebase/Cloud Firestore/Documents'),
_('Cloud Firestore/Documents'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1747,7 +1751,7 @@ module.exports = {
_(
'Load field _PARAM2_ of firestore document _PARAM1_ in collection _PARAM0_ into _PARAM3_ (store result state in _PARAM4_)'
),
_('Firebase/Cloud Firestore/Fields'),
_('Cloud Firestore/Fields'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1787,7 +1791,7 @@ module.exports = {
_(
'Check for existence of _PARAM1_ in collection _PARAM0_ and store result in _PARAM2_ (store result state in _PARAM3_)'
),
_('Firebase/Cloud Firestore/Documents'),
_('Cloud Firestore/Documents'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1826,7 +1830,7 @@ module.exports = {
_(
'Check for existence of _PARAM2_ in document _PARAM1_ of collection _PARAM0_ and store result in _PARAM3_ (store result state in _PARAM4_)'
),
_('Firebase/Cloud Firestore/Fields'),
_('Cloud Firestore/Fields'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1866,7 +1870,7 @@ module.exports = {
_(
'List all documents in _PARAM0_ and store result in _PARAM1_ (store result state in _PARAM2_)'
),
_('Firebase/Cloud Firestore'),
_('Cloud Firestore'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1905,7 +1909,7 @@ module.exports = {
_(
'Save _PARAM0_ in location _PARAM1_ to Firebase storage and store access URL in _PARAM3_ (Format: _PARAM2_, Store result state in _PARAM4_)'
),
_('Firebase/Storage'),
_('Storage'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1946,7 +1950,7 @@ module.exports = {
_(
'Get a download url for _PARAM0_ and store it in _PARAM1_ (store result state in _PARAM2_)'
),
_('Firebase/Storage'),
_('Storage'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -1980,7 +1984,7 @@ module.exports = {
_(
'Write _PARAM1_ to Database in _PARAM0_ (store result state in _PARAM2_)'
),
_('Firebase/Realtime Database'),
_('Realtime Database'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -2007,7 +2011,7 @@ module.exports = {
_(
'Write _PARAM2_ in field _PARAM1_ of _PARAM0_ (store result state in _PARAM3_)'
),
_('Firebase/Realtime Database'),
_('Realtime Database'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -2035,7 +2039,7 @@ module.exports = {
_(
'Update varable _PARAM0_ with _PARAM1_ (store result state in _PARAM2_)'
),
_('Firebase/Realtime Database'),
_('Realtime Database'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -2062,7 +2066,7 @@ module.exports = {
_(
'Update field _PARAM1_ of _PARAM0_ with _PARAM2_ (store result state in _PARAM3_)'
),
_('Firebase/Realtime Database'),
_('Realtime Database'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -2090,7 +2094,7 @@ module.exports = {
_(
'Delete variable _PARAM0_ from database (store result state in _PARAM1_)'
),
_('Firebase/Realtime Database'),
_('Realtime Database'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -2116,7 +2120,7 @@ module.exports = {
_(
'Delete field _PARAM1_ of variable _PARAM0_ on the database (store result state in _PARAM2_)'
),
_('Firebase/Realtime Database'),
_('Realtime Database'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -2145,7 +2149,7 @@ module.exports = {
_(
'Load database variable _PARAM0_ into _PARAM1_ (store result state in _PARAM2_)'
),
_('Firebase/Realtime Database'),
_('Realtime Database'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -2179,7 +2183,7 @@ module.exports = {
_(
'Load field _PARAM1_ of database variable _PARAM0_ into _PARAM2_ (store result state in _PARAM3_)'
),
_('Firebase/Realtime Database'),
_('Realtime Database'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -2214,7 +2218,7 @@ module.exports = {
_(
'Check for existence of _PARAM0_ and store result in _PARAM1_ (store result state in _PARAM2_)'
),
_('Firebase/Realtime Database'),
_('Realtime Database'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)
@@ -2248,7 +2252,7 @@ module.exports = {
_(
'Check for existence of _PARAM1_ in database variable _PARAM0_ and store result in _PARAM2_ (store result state in _PARAM3_)'
),
_('Firebase/Realtime Database'),
_('Realtime Database'),
'JsPlatform/Extensions/firebase.png',
'JsPlatform/Extensions/firebase.png'
)

View File

@@ -13,12 +13,16 @@ This project is released under the MIT License.
void DeclareInventoryExtension(gd::PlatformExtension& extension) {
extension.SetExtensionInformation(
"Inventory",
_("Inventory"),
_("Inventories"),
_("Provides actions and conditions to add an inventory to your game, "
"with items in memory."),
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/all-features/inventory");
.SetExtensionHelpPath("/all-features/inventory")
.SetCategory("Advanced");
extension
.AddInstructionOrExpressionGroupMetadata(_("Inventories"))
.SetIcon("CppPlatform/Extensions/Inventoryicon.png");
#if defined(GD_IDE_ONLY)
extension
@@ -26,9 +30,9 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
_("Add an item"),
_("Add an item in an inventory."),
_("Add a _PARAM2_ to inventory _PARAM1_"),
_("Inventories"),
"CppPlatform/Extensions/Inventoryicon24.png",
"CppPlatform/Extensions/Inventoryicon16.png")
"",
"CppPlatform/Extensions/Inventoryicon.png",
"CppPlatform/Extensions/Inventoryicon.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Inventory name"))
@@ -41,9 +45,9 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
_("Remove an item"),
_("Remove an item from an inventory."),
_("Remove a _PARAM2_ from inventory _PARAM1_"),
_("Inventories"),
"CppPlatform/Extensions/Inventoryicon24.png",
"CppPlatform/Extensions/Inventoryicon16.png")
"",
"CppPlatform/Extensions/Inventoryicon.png",
"CppPlatform/Extensions/Inventoryicon.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Inventory name"))
@@ -56,9 +60,9 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
_("Item count"),
_("Compare the number of an item in an inventory."),
_("the count of _PARAM2_ in _PARAM1_"),
_("Inventories"),
"CppPlatform/Extensions/Inventoryicon24.png",
"CppPlatform/Extensions/Inventoryicon16.png")
"",
"CppPlatform/Extensions/Inventoryicon.png",
"CppPlatform/Extensions/Inventoryicon.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Inventory name"))
@@ -73,9 +77,9 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
_("Check if at least one of the specified items is in the "
"inventory."),
_("Inventory _PARAM1_ contains a _PARAM2_"),
_("Inventories"),
"CppPlatform/Extensions/Inventoryicon24.png",
"CppPlatform/Extensions/Inventoryicon16.png")
"",
"CppPlatform/Extensions/Inventoryicon.png",
"CppPlatform/Extensions/Inventoryicon.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Inventory name"))
@@ -91,9 +95,9 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
"each item is unlimited."),
_("Set the maximum count for _PARAM2_ in inventory _PARAM1_ "
"to _PARAM3_"),
_("Inventories"),
"CppPlatform/Extensions/Inventoryicon24.png",
"CppPlatform/Extensions/Inventoryicon16.png")
"",
"CppPlatform/Extensions/Inventoryicon.png",
"CppPlatform/Extensions/Inventoryicon.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Inventory name"))
@@ -109,9 +113,9 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
"inventory. This is the case by default for each item."),
_("Allow an unlimited count of _PARAM2_ in inventory "
"_PARAM1_: _PARAM3_"),
_("Inventories"),
"CppPlatform/Extensions/Inventoryicon24.png",
"CppPlatform/Extensions/Inventoryicon16.png")
"",
"CppPlatform/Extensions/Inventoryicon.png",
"CppPlatform/Extensions/Inventoryicon.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Inventory name"))
@@ -126,9 +130,9 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
_("Check if an item has reached its maximum number allowed "
"in the inventory."),
_("Inventory _PARAM1_ is full of _PARAM2_"),
_("Inventories"),
"CppPlatform/Extensions/Inventoryicon24.png",
"CppPlatform/Extensions/Inventoryicon16.png")
"",
"CppPlatform/Extensions/Inventoryicon.png",
"CppPlatform/Extensions/Inventoryicon.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Inventory name"))
@@ -142,9 +146,9 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
_("Mark an item as being equipped. If the item count is 0, it "
"won't be marked as equipped."),
_("Set _PARAM2_ as equipped in inventory _PARAM1_: _PARAM3_"),
_("Inventories"),
"CppPlatform/Extensions/Inventoryicon24.png",
"CppPlatform/Extensions/Inventoryicon16.png")
"",
"CppPlatform/Extensions/Inventoryicon.png",
"CppPlatform/Extensions/Inventoryicon.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Inventory name"))
@@ -158,9 +162,9 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
_("Item equipped"),
_("Check if an item is equipped."),
_("_PARAM2_ is equipped in inventory _PARAM1_"),
_("Inventories"),
"CppPlatform/Extensions/Inventoryicon24.png",
"CppPlatform/Extensions/Inventoryicon16.png")
"",
"CppPlatform/Extensions/Inventoryicon.png",
"CppPlatform/Extensions/Inventoryicon.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Inventory name"))
@@ -174,9 +178,9 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
_("Save all the items of the inventory in a scene variable, so that "
"it can be restored later."),
_("Save inventory _PARAM1_ in variable _PARAM2_"),
_("Inventories/Variables"),
"CppPlatform/Extensions/Inventoryicon24.png",
"CppPlatform/Extensions/Inventoryicon16.png")
_("Variables"),
"CppPlatform/Extensions/Inventoryicon.png",
"CppPlatform/Extensions/Inventoryicon.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Inventory name"))
@@ -189,9 +193,9 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
_("Load an inventory from a scene variable"),
_("Load the content of the inventory from a scene variable."),
_("Load inventory _PARAM1_ from variable _PARAM2_"),
_("Inventories/Variables"),
"CppPlatform/Extensions/Inventoryicon24.png",
"CppPlatform/Extensions/Inventoryicon16.png")
_("Variables"),
"CppPlatform/Extensions/Inventoryicon.png",
"CppPlatform/Extensions/Inventoryicon.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Inventory name"))
@@ -203,8 +207,8 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
.AddExpression("Count",
_("Item count"),
_("Get the number of an item in the inventory"),
_("Inventory"),
"CppPlatform/Extensions/Inventoryicon16.png")
"",
"CppPlatform/Extensions/Inventoryicon.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Inventory name"))
.AddParameter("string", _("Item name"))

View File

@@ -1,39 +1,40 @@
describe('Inventory', function () {
var runtimeGame = new gdjs.RuntimeGame({
variables: [],
properties: { windowWidth: 800, windowHeight: 600 },
resources: { resources: [] },
it('Inventories can be serialized then unserialized with no data loss', () => {
var runtimeGame = new gdjs.RuntimeGame({
variables: [],
properties: { windowWidth: 800, windowHeight: 600 },
resources: { resources: [] },
});
var runtimeScene = new gdjs.RuntimeScene(runtimeGame);
gdjs.evtTools.inventory.add(runtimeScene, 'MyInventory', 'sword');
gdjs.evtTools.inventory.add(runtimeScene, 'MyInventory', 'sword');
gdjs.evtTools.inventory.equip(runtimeScene, 'MyInventory', 'sword', true);
gdjs.evtTools.inventory.add(runtimeScene, 'MyInventory', 'armor');
gdjs.evtTools.inventory.setMaximum(runtimeScene, 'MyInventory', 'armor', 1);
var variable = new gdjs.Variable();
gdjs.evtTools.inventory.serializeToVariable(
runtimeScene,
'MyInventory',
variable
);
gdjs.evtTools.inventory.unserializeFromVariable(
runtimeScene,
'MyInventory2',
variable
);
expect(
gdjs.evtTools.inventory.count(runtimeScene, 'MyInventory2', 'sword')
).to.be(2);
expect(
gdjs.evtTools.inventory.isEquipped(runtimeScene, 'MyInventory2', 'sword')
).to.be(true);
expect(
gdjs.evtTools.inventory.count(runtimeScene, 'MyInventory2', 'armor')
).to.be(1);
expect(
gdjs.evtTools.inventory.add(runtimeScene, 'MyInventory2', 'armor')
).to.be(false);
});
var runtimeScene = new gdjs.RuntimeScene(runtimeGame);
gdjs.evtTools.inventory.add(runtimeScene, 'MyInventory', 'sword');
gdjs.evtTools.inventory.add(runtimeScene, 'MyInventory', 'sword');
gdjs.evtTools.inventory.equip(runtimeScene, 'MyInventory', 'sword', true);
gdjs.evtTools.inventory.add(runtimeScene, 'MyInventory', 'armor');
gdjs.evtTools.inventory.setMaximum(runtimeScene, 'MyInventory', 'armor', 1);
var variable = new gdjs.Variable();
gdjs.evtTools.inventory.serializeToVariable(
runtimeScene,
'MyInventory',
variable
);
gdjs.evtTools.inventory.unserializeFromVariable(
runtimeScene,
'MyInventory2',
variable
);
expect(
gdjs.evtTools.inventory.count(runtimeScene, 'MyInventory2', 'sword')
).to.be(2);
expect(
gdjs.evtTools.inventory.isEquipped(runtimeScene, 'MyInventory2', 'sword')
).to.be(true);
expect(
gdjs.evtTools.inventory.count(runtimeScene, 'MyInventory2', 'armor')
).to.be(1);
expect(
gdjs.evtTools.inventory.add(runtimeScene, 'MyInventory2', 'armor')
).to.be(false);
});

View File

@@ -0,0 +1,272 @@
// @flow
/**
* This is a declaration of an extension for GDevelop 5.
*
* Changes in this file are watched and automatically imported if the editor
* is running. You can also manually run `node import-GDJS-Runtime.js` (in newIDE/app/scripts).
*
* The file must be named "JsExtension.js", otherwise GDevelop won't load it.
* ⚠️ If you make a change and the extension is not loaded, open the developer console
* and search for any errors.
*
* More information on https://github.com/4ian/GDevelop/blob/master/newIDE/README-extensions.md
*/
/*::
// Import types to allow Flow to do static type checking on this file.
// Extensions declaration are typed using Flow (like the editor), but the files
// for the game engine are checked with TypeScript annotations.
import { type ObjectsRenderingService, type ObjectsEditorService } from '../JsExtensionTypes.flow.js'
*/
module.exports = {
createExtension: function (
_ /*: (string) => string */,
gd /*: libGDevelop */
) {
const extension = new gd.PlatformExtension();
extension
.setExtensionInformation(
'Leaderboards',
_('Leaderboards (experimental)'),
_('Allow your game to send scores to your leaderboards.'),
'Florian Rival',
'Open source (MIT License)'
)
.setExtensionHelpPath('/all-features/leaderboards')
.setCategory('Leaderboards')
.addInstructionOrExpressionGroupMetadata(_('Leaderboards'))
.setIcon('JsPlatform/Extensions/leaderboard.svg');
extension
.addAction(
'SavePlayerScore',
_('Save player score'),
_("Save the player's score to the given leaderboard."),
_(
'Send to leaderboard _PARAM1_ the score _PARAM2_ with player name: _PARAM3_.'
),
_('Save score'),
'JsPlatform/Extensions/leaderboard.svg',
'JsPlatform/Extensions/leaderboard.svg'
)
.addCodeOnlyParameter('currentScene', '')
.addParameter('leaderboardId', _('Leaderboard'), '', false)
.addParameter(
'expression',
_('Score to register for the player'),
'',
false
)
.addParameter('string', _('Name to register for the player'), '', false)
.addParameter(
'scenevar',
_('Variable where to store the saved score (optional)'),
'',
true
)
.addParameter(
'scenevar',
_(
'Variable where to store the error message (optional, if an error occurs)'
),
'',
true
)
.setHelpPath('/all-features/leaderboards')
.getCodeExtraInformation()
.setIncludeFile('Extensions/Leaderboards/sha256.js')
.addIncludeFile('Extensions/Leaderboards/leaderboardstools.js')
.setFunctionName('gdjs.evtTools.leaderboards.savePlayerScore');
extension
.addCondition(
'HasLastSaveErrored',
_('Last score save has errored'),
_('Check if the last attempt to save a score has errored.'),
_('Last score save in leaderboard _PARAM0_ has errored'),
_('Save score'),
'JsPlatform/Extensions/leaderboard.svg',
'JsPlatform/Extensions/leaderboard.svg'
)
.addParameter('leaderboardId', _('Leaderboard'), '', true)
.setParameterLongDescription(
_(
'If no leaderboard is specified, will return the value related to the last leaderboard save action.'
)
)
.setHelpPath('/all-features/leaderboards')
.getCodeExtraInformation()
.setIncludeFile('Extensions/Leaderboards/leaderboardstools.js')
.setFunctionName('gdjs.evtTools.leaderboards.hasSavingErrored');
extension
.addCondition(
'HasLastSaveSucceeded',
_('Last score save has succeeded'),
_('Check if the last attempt to save a score has succeeded.'),
_('Last score save in leaderboard _PARAM0_ has succeeded'),
_('Save score'),
'JsPlatform/Extensions/leaderboard.svg',
'JsPlatform/Extensions/leaderboard.svg'
)
.addParameter('leaderboardId', _('Leaderboard'), '', true)
.setParameterLongDescription(
_(
'If no leaderboard is specified, will return the value related to the last leaderboard save action that successfully ended.'
)
)
.setHelpPath('/all-features/leaderboards')
.getCodeExtraInformation()
.setIncludeFile('Extensions/Leaderboards/leaderboardstools.js')
.setFunctionName('gdjs.evtTools.leaderboards.hasBeenSaved');
extension
.addCondition(
'IsSaving',
_('Score is saving'),
_('Check if a score is currently being saved in leaderboard.'),
_('Score is saving in leaderboard _PARAM0_'),
_('Save score'),
'JsPlatform/Extensions/leaderboard.svg',
'JsPlatform/Extensions/leaderboard.svg'
)
.addParameter('leaderboardId', _('Leaderboard'), '', true)
.setParameterLongDescription(
_(
'If no leaderboard is specified, will return the value related to the last leaderboard save action.'
)
)
.setHelpPath('/all-features/leaderboards')
.getCodeExtraInformation()
.setIncludeFile('Extensions/Leaderboards/leaderboardstools.js')
.setFunctionName('gdjs.evtTools.leaderboards.isSaving');
extension
.addStrExpression(
'LastSaveError',
_('Error of last save attempt'),
_('Get the error of the last save attempt.'),
_('Error of last save attempt in leaderboard _PARAM0_'),
'JsPlatform/Extensions/leaderboard.svg'
)
.addParameter('leaderboardId', _('Leaderboard'), '', true)
.setParameterLongDescription(
_(
'If no leaderboard is specified, will return the value related to the last leaderboard save action.'
)
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/Leaderboards/leaderboardstools.js')
.setFunctionName('gdjs.evtTools.leaderboards.getLastSaveError');
extension
.addCondition(
'IsLeaderboardViewErrored',
_('Leaderboard display has errored'),
_('Check if the display of the leaderboard errored.'),
_('Leaderboard display has errored'),
_('Display leaderboard'),
'JsPlatform/Extensions/leaderboard.svg',
'JsPlatform/Extensions/leaderboard.svg'
)
.setHelpPath('/all-features/leaderboards')
.getCodeExtraInformation()
.setIncludeFile('Extensions/Leaderboards/leaderboardstools.js')
.setFunctionName('gdjs.evtTools.leaderboards.isLeaderboardViewErrored');
extension
.addCondition(
'IsLeaderboardViewLoaded',
_('Leaderboard display has loaded'),
_(
'Check if the display of the leaderboard has finished loading and been displayed on screen.'
),
_('Leaderboard display has loaded and is displayed on screen'),
_('Display leaderboard'),
'JsPlatform/Extensions/leaderboard.svg',
'JsPlatform/Extensions/leaderboard.svg'
)
.setHelpPath('/all-features/leaderboards')
.getCodeExtraInformation()
.setIncludeFile('Extensions/Leaderboards/leaderboardstools.js')
.setFunctionName('gdjs.evtTools.leaderboards.isLeaderboardViewLoaded');
extension
.addCondition(
'IsLeaderboardViewLoading',
_('Leaderboard display is loading'),
_('Check if the display of the leaderboard is loading.'),
_('Leaderboard display is loading'),
_('Display leaderboard'),
'JsPlatform/Extensions/leaderboard.svg',
'JsPlatform/Extensions/leaderboard.svg'
)
.setHelpPath('/all-features/leaderboards')
.getCodeExtraInformation()
.setIncludeFile('Extensions/Leaderboards/leaderboardstools.js')
.setFunctionName('gdjs.evtTools.leaderboards.isLeaderboardViewLoading');
extension
.addStrExpression(
'FormatPlayerName',
_('Format player name'),
_('Formats a name so that it can be submitted to a leaderboard.'),
_('Save score'),
'JsPlatform/Extensions/leaderboard.svg'
)
.addParameter('string', _('Raw player name'), '', false)
.getCodeExtraInformation()
.setIncludeFile('Extensions/Leaderboards/leaderboardstools.js')
.setFunctionName('gdjs.evtTools.leaderboards.formatPlayerName');
extension
.addAction(
'DisplayLeaderboard',
_('Display leaderboard'),
_(
'Display the specified leaderboard on top of the game. If a leaderboard was already displayed on top of the game, the new leaderboard will replace it.'
),
_('Display leaderboard _PARAM1_ (display a loader: _PARAM2_)'),
_('Display leaderboard'),
'JsPlatform/Extensions/leaderboard.svg',
'JsPlatform/Extensions/leaderboard.svg'
)
.addCodeOnlyParameter('currentScene', '')
.addParameter('leaderboardId', _('Leaderboard'), '', false)
.addParameter(
'yesorno',
_('Display loader while leaderboard is loading'),
'',
false
)
.setHelpPath('/all-features/leaderboards')
.getCodeExtraInformation()
.setIncludeFile('Extensions/Leaderboards/leaderboardstools.js')
.setFunctionName('gdjs.evtTools.leaderboards.displayLeaderboard');
extension
.addAction(
'CloseLeaderboardView',
_('Close current leaderboard'),
_('Close the leaderboard currently displayed on top of the game.'),
_('Close current leaderboard displayed on top of the game'),
_('Display leaderboard'),
'JsPlatform/Extensions/leaderboard.svg',
'JsPlatform/Extensions/leaderboard.svg'
)
.addCodeOnlyParameter('currentScene', '')
.setHelpPath('/all-features/leaderboards')
.getCodeExtraInformation()
.setIncludeFile('Extensions/Leaderboards/leaderboardstools.js')
.setFunctionName('gdjs.evtTools.leaderboards.closeLeaderboardView');
return extension;
},
runExtensionSanityTests: function (
gd /*: libGDevelop */,
extension /*: gdPlatformExtension*/
) {
return [];
},
};

View File

@@ -0,0 +1,653 @@
/// <reference path="sha256.d.ts" />
namespace gdjs {
const logger = new gdjs.Logger('Leaderboards');
export namespace evtTools {
export namespace leaderboards {
const computeDigest = (payload: string): string => {
const shaObj = new jsSHA('SHA-256', 'TEXT', { encoding: 'UTF8' });
shaObj.update(payload);
return shaObj.getHash('B64');
};
// Score saving
class ScoreSavingState {
lastScoreSavingStartedAt: number | null;
lastScoreSavingSucceededAt: number | null;
currentlySavingScore: number | null;
currentlySavingPlayerName: string | null;
lastSavedScore: number | null;
lastSavedPlayerName: string | null;
lastSaveError: string | null;
isScoreSaving: boolean;
hasScoreBeenSaved: boolean;
hasScoreSavingErrored: boolean;
constructor() {
this.lastScoreSavingStartedAt = null;
this.lastScoreSavingSucceededAt = null;
this.currentlySavingScore = null;
this.currentlySavingPlayerName = null;
this.lastSavedScore = null;
this.lastSavedPlayerName = null;
this.lastSaveError = null;
this.isScoreSaving = false;
this.hasScoreBeenSaved = false;
this.hasScoreSavingErrored = false;
}
isSameAsLastScore(playerName: string, score: number): boolean {
return (
this.lastSavedPlayerName === playerName &&
this.lastSavedScore === score
);
}
isAlreadySavingThisScore(playerName: string, score: number): boolean {
return (
this.isScoreSaving &&
this.currentlySavingPlayerName === playerName &&
this.currentlySavingScore === score
);
}
isTooSoonToSaveAnotherScore(): boolean {
return (
!!this.lastScoreSavingSucceededAt &&
Date.now() - this.lastScoreSavingSucceededAt < 500
);
}
startSaving(playerName: string, score: number): void {
this.lastScoreSavingStartedAt = Date.now();
this.isScoreSaving = true;
this.hasScoreBeenSaved = false;
this.hasScoreSavingErrored = false;
this.currentlySavingScore = score;
this.currentlySavingPlayerName = playerName;
}
closeSaving(): void {
this.lastScoreSavingSucceededAt = Date.now();
this.lastSavedScore = this.currentlySavingScore;
this.lastSavedPlayerName = this.currentlySavingPlayerName;
this.isScoreSaving = false;
this.hasScoreBeenSaved = true;
}
setError(errorCode: string): void {
this.lastSaveError = errorCode;
this.isScoreSaving = false;
this.hasScoreBeenSaved = false;
this.hasScoreSavingErrored = true;
}
}
let _scoreSavingStateByLeaderboard: {
[leaderboardId: string]: ScoreSavingState;
} = {};
// Leaderboard display
let _requestedLeaderboardId: string | null;
let _leaderboardViewIframe: HTMLIFrameElement | null = null;
let _leaderboardViewIframeErrored: boolean = false;
let _leaderboardViewIframeLoading: boolean = false;
let _leaderboardViewIframeLoaded: boolean = false;
let _errorTimeoutId: NodeJS.Timeout | null = null;
let _leaderboardViewClosingCallback:
| ((event: MessageEvent) => void)
| null = null;
const _loaderContainer: HTMLDivElement = document.createElement('div');
_loaderContainer.style.backgroundColor = '#000000';
_loaderContainer.style.display = 'flex';
_loaderContainer.style.height = '100%';
_loaderContainer.style.width = '100%';
_loaderContainer.style.justifyContent = 'center';
_loaderContainer.style.alignItems = 'center';
const _loader = document.createElement('img');
_loader.setAttribute('width', '50px');
_loader.setAttribute(
'src',
'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCAyNCAyNCI+CjxjaXJjbGUgb3BhY2l0eT0nMC4yNScgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iNCI+PC9jaXJjbGU+CjxwYXRoIG9wYWNpdHk9JzAuNzUnIGZpbGw9IiNGRkZGRkYiIGQ9Ik00IDEyYTggOCAwIDAxOC04VjBDNS4zNzMgMCAwIDUuMzczIDAgMTJoNHptMiA1LjI5MUE3Ljk2MiA3Ljk2MiAwIDAxNCAxMkgwYzAgMy4wNDIgMS4xMzUgNS44MjQgMyA3LjkzOGwzLTIuNjQ3eiI+PC9wYXRoPgo8L3N2Zz4='
);
try {
_loader.animate(
[{ transform: 'rotate(0deg)' }, { transform: 'rotate(359deg)' }],
{
duration: 3000,
iterations: Infinity,
}
);
} catch {
logger.warn('Animation not supported, loader will be fixed.');
}
_loaderContainer.appendChild(_loader);
const getLastScoreSavingState = function ({
hasSucceeded,
}: {
hasSucceeded: boolean;
}): ScoreSavingState | null {
const getDateField = (scoreSavingState: ScoreSavingState) =>
hasSucceeded
? scoreSavingState.lastScoreSavingSucceededAt
: scoreSavingState.lastScoreSavingStartedAt;
const scoreSavingStates = Object.values(
_scoreSavingStateByLeaderboard
).filter((scoreSavingState) => !!getDateField(scoreSavingState));
if (scoreSavingStates.length === 0) return null;
let lastScoreSavingState = scoreSavingStates[0];
scoreSavingStates.forEach((scoreSavingState) => {
const currentItemDate = getDateField(scoreSavingState);
const lastItemDate = getDateField(lastScoreSavingState);
if (
currentItemDate &&
lastItemDate &&
currentItemDate > lastItemDate
) {
lastScoreSavingState = scoreSavingState;
}
});
return lastScoreSavingState;
};
export const savePlayerScore = function (
runtimeScene: gdjs.RuntimeScene,
leaderboardId: string,
score: float,
playerName: string,
responseVar: gdjs.Variable,
errorVar: gdjs.Variable
) {
let scoreSavingState: ScoreSavingState;
if (_scoreSavingStateByLeaderboard[leaderboardId]) {
scoreSavingState = _scoreSavingStateByLeaderboard[leaderboardId];
if (scoreSavingState.isAlreadySavingThisScore(playerName, score)) {
logger.warn(
'There is already a request to save with this player name and this score. Ignoring this one.'
);
return;
}
if (scoreSavingState.isSameAsLastScore(playerName, score)) {
logger.warn(
'The player and score to be sent are the same as previous one. Ignoring this one.'
);
const errorCode = 'SAME_AS_PREVIOUS';
scoreSavingState.setError(errorCode);
errorVar.setString(errorCode);
return;
}
if (scoreSavingState.isTooSoonToSaveAnotherScore()) {
logger.warn(
'Last entry was sent too little time ago. Ignoring this one.'
);
const errorCode = 'TOO_FAST';
scoreSavingState.setError(errorCode);
errorVar.setString(errorCode);
return;
}
} else {
scoreSavingState = new ScoreSavingState();
_scoreSavingStateByLeaderboard[leaderboardId] = scoreSavingState;
}
errorVar.setString('');
responseVar.setString('');
scoreSavingState.startSaving(playerName, score);
const baseUrl = 'https://api.gdevelop-app.com/play';
const game = runtimeScene.getGame();
const payload = JSON.stringify({
playerName: formatPlayerName(playerName),
score: score,
sessionId: game.getSessionId(),
clientPlayerId: game.getPlayerId(),
location:
typeof window !== 'undefined' && (window as any).location
? (window as any).location.href
: '',
});
fetch(
`${baseUrl}/game/${gdjs.projectData.properties.projectUuid}/leaderboard/${leaderboardId}/entry`,
{
body: payload,
method: 'POST',
headers: {
'Content-Type': 'application/json',
Digest: computeDigest(payload),
},
}
).then(
(response) => {
if (!response.ok) {
const errorCode = response.status.toString();
logger.error(
'Server responded with an error:',
errorCode,
response.statusText
);
scoreSavingState.setError(errorCode);
errorVar.setString(errorCode);
return;
}
scoreSavingState.closeSaving();
return response.text().then(
(text) => {
responseVar.setString(text);
},
(error) => {
logger.warn(
'An error occurred when reading response but score has been saved:',
error
);
responseVar.setString('CANNOT_READ_RESPONSE');
}
);
},
(error) => {
logger.error('Error while submitting a leaderboard score:', error);
const errorCode = 'REQUEST_NOT_SENT';
scoreSavingState.setError(errorCode);
errorVar.setString(errorCode);
}
);
};
export const isSaving = function (leaderboardId?: string): boolean {
if (leaderboardId) {
return _scoreSavingStateByLeaderboard[leaderboardId]
? _scoreSavingStateByLeaderboard[leaderboardId].isScoreSaving
: false;
}
const lastScoreSavingState = getLastScoreSavingState({
hasSucceeded: false,
});
return lastScoreSavingState
? lastScoreSavingState.isScoreSaving
: false;
};
export const hasBeenSaved = function (leaderboardId?: string): boolean {
if (leaderboardId) {
return _scoreSavingStateByLeaderboard[leaderboardId]
? _scoreSavingStateByLeaderboard[leaderboardId].hasScoreBeenSaved
: false;
}
const lastScoreSavingState = getLastScoreSavingState({
hasSucceeded: true,
});
return lastScoreSavingState
? lastScoreSavingState.hasScoreBeenSaved
: false;
};
export const hasSavingErrored = function (
leaderboardId?: string
): boolean {
if (leaderboardId) {
return _scoreSavingStateByLeaderboard[leaderboardId]
? _scoreSavingStateByLeaderboard[leaderboardId]
.hasScoreSavingErrored
: false;
}
const lastScoreSavingState = getLastScoreSavingState({
hasSucceeded: false,
});
return lastScoreSavingState
? lastScoreSavingState.hasScoreSavingErrored
: false;
};
export const getLastSaveError = function (
leaderboardId?: string
): string | null {
if (leaderboardId) {
return _scoreSavingStateByLeaderboard[leaderboardId]
? _scoreSavingStateByLeaderboard[leaderboardId].lastSaveError
: 'NO_DATA_ERROR';
}
const lastScoreSavingState = getLastScoreSavingState({
hasSucceeded: false,
});
return lastScoreSavingState
? lastScoreSavingState.lastSaveError
: 'NO_DATA_ERROR';
};
export const formatPlayerName = function (rawName: string): string {
if (
!rawName ||
typeof rawName !== 'string' ||
(typeof rawName === 'string' && rawName.length === 0)
) {
return `Player${Math.round(
(Math.random() * 9 + 1) * 10000 // Number between 10,000 and 99,999
)}`;
}
return rawName
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
.replace(/\s/g, '_')
.replace(/[^\w|-]/g, '')
.slice(0, 30);
};
const checkLeaderboardAvailability = function (
url: string
): Promise<boolean> {
return fetch(url, {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
}).then(
(response) => {
if (!response.ok) {
logger.error(
`Error while fetching leaderboard view, server returned: ${response.status} ${response.statusText}`
);
return false;
}
return true;
},
(err) => {
logger.error('Error while fetching leaderboard view:', err);
return false;
}
);
};
const receiveMessageFromLeaderboardView = function (
runtimeScene: gdjs.RuntimeScene,
displayLoader: boolean,
event: MessageEvent
) {
switch (event.data) {
case 'closeLeaderboardView':
closeLeaderboardView(runtimeScene);
break;
case 'leaderboardViewLoaded':
if (displayLoader) {
if (_errorTimeoutId) clearTimeout(_errorTimeoutId);
displayLoaderInLeaderboardView(false, runtimeScene, {
callOnErrorIfDomElementContainerMissing: false,
});
}
if (!_leaderboardViewIframe) {
handleErrorDisplayingLeaderboard(
runtimeScene,
"The leaderboard view couldn't be found. Doing nothing."
);
return;
}
_leaderboardViewIframe.style.opacity = '1';
_leaderboardViewIframeLoaded = true;
_leaderboardViewIframeLoading = false;
break;
}
};
const handleErrorDisplayingLeaderboard = function (
runtimeScene: gdjs.RuntimeScene,
message: string
) {
logger.error(message);
_leaderboardViewIframeErrored = true;
_leaderboardViewIframeLoading = false;
closeLeaderboardView(runtimeScene);
};
const resetLeaderboardDisplayErrorTimeout = (
runtimeScene: gdjs.RuntimeScene
) => {
if (_errorTimeoutId) clearTimeout(_errorTimeoutId);
_errorTimeoutId = setTimeout(() => {
if (!_leaderboardViewIframeLoaded) {
handleErrorDisplayingLeaderboard(
runtimeScene,
'Leaderboard page did not send message in time. Closing leaderboard view.'
);
}
}, 5000);
};
const displayLoaderInLeaderboardView = function (
yesOrNo: boolean,
runtimeScene: gdjs.RuntimeScene,
options: { callOnErrorIfDomElementContainerMissing: boolean }
): boolean {
const domElementContainer = runtimeScene
.getGame()
.getRenderer()
.getDomElementContainer();
if (!domElementContainer) {
if (options.callOnErrorIfDomElementContainerMissing) {
handleErrorDisplayingLeaderboard(
runtimeScene,
"The div element covering the game couldn't be found, the leaderboard cannot be displayed."
);
}
return false;
}
if (yesOrNo) {
if (
domElementContainer.children &&
domElementContainer.children.length > 0
) {
domElementContainer.insertBefore(
_loaderContainer,
domElementContainer.children[0]
);
} else {
domElementContainer.appendChild(_loaderContainer);
}
if (_leaderboardViewIframe) {
_leaderboardViewIframe.style.opacity = '0';
}
} else {
try {
domElementContainer.removeChild(_loaderContainer);
if (_leaderboardViewIframe) {
_leaderboardViewIframe.style.opacity = '1';
}
} catch {}
}
return true;
};
const computeLeaderboardDisplayingIframe = function (
url: string
): HTMLIFrameElement {
const iframe = document.createElement('iframe');
iframe.src = url;
iframe.id = 'leaderboard-view';
iframe.style.position = 'absolute';
// To trigger iframe loading and be able to listen to its events, use `opacity: 0` instead of `visibility: hidden` or `display: none`
iframe.style.opacity = '0';
iframe.style.pointerEvents = 'all';
iframe.style.backgroundColor = '#FFFFFF';
iframe.style.top = '0px';
iframe.style.height = '100%';
iframe.style.left = '0px';
iframe.style.width = '100%';
iframe.style.border = 'none';
return iframe;
};
export const displayLeaderboard = function (
runtimeScene: gdjs.RuntimeScene,
leaderboardId: string,
displayLoader: boolean
) {
// First ensure we're not trying to display multiple times the same leaderboard (in which case
// we "de-duplicate" the request to display it).
if (leaderboardId === _requestedLeaderboardId) {
if (_leaderboardViewIframeLoading) {
logger.warn(
`Already loading the view for the requested loader (${leaderboardId}), ignoring.`
);
return;
}
if (_leaderboardViewIframeLoaded) {
logger.warn(
`Already loaded the view for the requested loader (${leaderboardId}), ignoring.`
);
return;
}
}
// We are now assured we want to display a new (or different) leaderboard: start loading it.
_requestedLeaderboardId = leaderboardId;
_leaderboardViewIframeErrored = false;
_leaderboardViewIframeLoaded = false;
_leaderboardViewIframeLoading = true;
if (displayLoader) {
displayLoaderInLeaderboardView(true, runtimeScene, {
callOnErrorIfDomElementContainerMissing: true,
});
}
const gameId = gdjs.projectData.properties.projectUuid;
const targetUrl = `https://liluo.io/games/${gameId}/leaderboard/${leaderboardId}?inGameEmbedded=true`;
checkLeaderboardAvailability(targetUrl).then(
(isAvailable) => {
if (leaderboardId !== _requestedLeaderboardId) {
logger.warn(
`Received a response for leaderboard ${leaderboardId} though the last leaderboard requested is ${_requestedLeaderboardId}, ignoring this response.`
);
return;
}
if (!isAvailable) {
handleErrorDisplayingLeaderboard(
runtimeScene,
'Leaderboard data could not be fetched. Closing leaderboard view if there is one.'
);
return;
}
if (_leaderboardViewIframe) {
resetLeaderboardDisplayErrorTimeout(runtimeScene);
if (displayLoader) {
displayLoaderInLeaderboardView(true, runtimeScene, {
callOnErrorIfDomElementContainerMissing: false,
});
}
_leaderboardViewIframe.src = targetUrl;
} else {
const domElementContainer = runtimeScene
.getGame()
.getRenderer()
.getDomElementContainer();
if (!domElementContainer) {
handleErrorDisplayingLeaderboard(
runtimeScene,
"The div element covering the game couldn't be found, the leaderboard cannot be displayed."
);
return;
}
resetLeaderboardDisplayErrorTimeout(runtimeScene);
_leaderboardViewIframe = computeLeaderboardDisplayingIframe(
targetUrl
);
if (typeof window !== 'undefined') {
_leaderboardViewClosingCallback = (event: MessageEvent) => {
receiveMessageFromLeaderboardView(
runtimeScene,
displayLoader,
event
);
};
(window as any).addEventListener(
'message',
_leaderboardViewClosingCallback,
true
);
}
domElementContainer.appendChild(_leaderboardViewIframe);
}
},
(err) => {
logger.error(err);
handleErrorDisplayingLeaderboard(
runtimeScene,
'An error occurred when fetching leaderboard data. Closing leaderboard view if there is one.'
);
return;
}
);
};
export const isLeaderboardViewErrored = function (): boolean {
return _leaderboardViewIframeErrored;
};
export const isLeaderboardViewLoaded = function (): boolean {
return _leaderboardViewIframeLoaded;
};
export const isLeaderboardViewLoading = function (): boolean {
return _leaderboardViewIframeLoading;
};
export const closeLeaderboardView = function (
runtimeScene: gdjs.RuntimeScene
) {
try {
displayLoaderInLeaderboardView(false, runtimeScene, {
callOnErrorIfDomElementContainerMissing: false,
});
if (!_leaderboardViewIframe) {
logger.info(
"The iframe displaying the current leaderboard couldn't be found, the leaderboard view must be already closed."
);
return;
}
const domElementContainer = runtimeScene
.getGame()
.getRenderer()
.getDomElementContainer();
if (!domElementContainer) {
logger.info(
"The div element covering the game couldn't be found, the leaderboard view must be already closed."
);
return;
}
if (typeof window !== 'undefined') {
(window as any).removeEventListener(
'message',
_leaderboardViewClosingCallback,
true
);
_leaderboardViewClosingCallback = null;
}
domElementContainer.removeChild(_leaderboardViewIframe);
_leaderboardViewIframe = null;
} finally {
// Don't reset the loading flag (the view of another leaderboard might be loading)
// or the error flag (we want to persist the error flag even after the view is closed),
// but reset the flag indicating the view is loaded (if it was).
_leaderboardViewIframeLoaded = false;
const gameCanvas = runtimeScene.getGame().getRenderer().getCanvas();
if (gameCanvas) gameCanvas.focus();
}
};
}
}
}

234
Extensions/Leaderboards/sha256.d.ts vendored Normal file
View File

@@ -0,0 +1,234 @@
declare type EncodingType = 'UTF8' | 'UTF16BE' | 'UTF16LE';
declare type FormatNoTextType =
| 'HEX'
| 'B64'
| 'BYTES'
| 'ARRAYBUFFER'
| 'UINT8ARRAY';
declare type FormatType = 'TEXT' | FormatNoTextType;
declare type GenericInputType =
| {
value: string;
format: 'TEXT';
encoding?: EncodingType;
}
| {
value: string;
format: 'B64' | 'HEX' | 'BYTES';
}
| {
value: ArrayBuffer;
format: 'ARRAYBUFFER';
}
| {
value: Uint8Array;
format: 'UINT8ARRAY';
};
declare type FixedLengthOptionsNoEncodingType =
| {
hmacKey?: GenericInputType;
}
| {
numRounds?: number;
};
declare type FixedLengthOptionsEncodingType =
| {
hmacKey?: GenericInputType;
encoding?: EncodingType;
}
| {
numRounds?: number;
encoding?: EncodingType;
};
interface packedValue {
value: number[];
binLen: number;
}
declare abstract class jsSHABase<StateT, VariantT> {
/**
* @param variant The desired SHA variant.
* @param inputFormat The input format to be used in future `update` calls.
* @param options Hashmap of extra input options.
*/
protected readonly shaVariant: VariantT;
protected readonly inputFormat: FormatType;
protected readonly utfType: EncodingType;
protected readonly numRounds: number;
protected abstract intermediateState: StateT;
protected keyWithIPad: number[];
protected keyWithOPad: number[];
protected remainder: number[];
protected remainderLen: number;
protected updateCalled: boolean;
protected processedLen: number;
protected macKeySet: boolean;
protected abstract readonly variantBlockSize: number;
protected abstract readonly bigEndianMod: -1 | 1;
protected abstract readonly outputBinLen: number;
protected abstract readonly isVariableLen: boolean;
protected abstract readonly HMACSupported: boolean;
protected abstract readonly converterFunc: (
input: any,
existingBin: number[],
existingBinLen: number
) => packedValue;
protected abstract readonly roundFunc: (block: number[], H: StateT) => StateT;
protected abstract readonly finalizeFunc: (
remainder: number[],
remainderBinLen: number,
processedBinLen: number,
H: StateT,
outputLen: number
) => number[];
protected abstract readonly stateCloneFunc: (state: StateT) => StateT;
protected abstract readonly newStateFunc: (variant: VariantT) => StateT;
protected abstract readonly getMAC:
| ((options: { outputLen: number }) => number[])
| null;
protected constructor(
variant: VariantT,
inputFormat: 'TEXT',
options?: FixedLengthOptionsEncodingType
);
protected constructor(
variant: VariantT,
inputFormat: FormatNoTextType,
options?: FixedLengthOptionsNoEncodingType
);
/**
* Hashes as many blocks as possible. Stores the rest for either a future update or getHash call.
*
* @param srcString The input to be hashed.
*/
update(srcString: string | ArrayBuffer | Uint8Array): void;
/**
* Returns the desired SHA hash of the input fed in via `update` calls.
*
* @param format The desired output formatting
* @param options Hashmap of output formatting options. `outputLen` must be specified for variable length hashes.
* `outputLen` replaces the now deprecated `shakeLen` key.
* @returns The hash in the format specified.
*/
getHash(
format: 'HEX',
options?: {
outputUpper?: boolean;
outputLen?: number;
shakeLen?: number;
}
): string;
getHash(
format: 'B64',
options?: {
b64Pad?: string;
outputLen?: number;
shakeLen?: number;
}
): string;
getHash(
format: 'BYTES',
options?: {
outputLen?: number;
shakeLen?: number;
}
): string;
getHash(
format: 'UINT8ARRAY',
options?: {
outputLen?: number;
shakeLen?: number;
}
): Uint8Array;
getHash(
format: 'ARRAYBUFFER',
options?: {
outputLen?: number;
shakeLen?: number;
}
): ArrayBuffer;
/**
* Sets the HMAC key for an eventual `getHMAC` call. Must be called immediately after jsSHA object instantiation.
*
* @param key The key used to calculate the HMAC
* @param inputFormat The format of key.
* @param options Hashmap of extra input options.
*/
setHMACKey(
key: string,
inputFormat: 'TEXT',
options?: {
encoding?: EncodingType;
}
): void;
setHMACKey(key: string, inputFormat: 'B64' | 'HEX' | 'BYTES'): void;
setHMACKey(key: ArrayBuffer, inputFormat: 'ARRAYBUFFER'): void;
setHMACKey(key: Uint8Array, inputFormat: 'UINT8ARRAY'): void;
/**
* Internal function that sets the MAC key.
*
* @param key The packed MAC key to use
*/
protected _setHMACKey(key: packedValue): void;
/**
* Returns the the HMAC in the specified format using the key given by a previous `setHMACKey` call.
*
* @param format The desired output formatting.
* @param options Hashmap of extra outputs options.
* @returns The HMAC in the format specified.
*/
getHMAC(
format: 'HEX',
options?: {
outputUpper?: boolean;
}
): string;
getHMAC(
format: 'B64',
options?: {
b64Pad?: string;
}
): string;
getHMAC(format: 'BYTES'): string;
getHMAC(format: 'UINT8ARRAY'): Uint8Array;
getHMAC(format: 'ARRAYBUFFER'): ArrayBuffer;
/**
* Internal function that returns the "raw" HMAC
*/
protected _getHMAC(): number[];
}
declare type VariantType = 'SHA-224' | 'SHA-256';
declare class jsSHA extends jsSHABase<number[], VariantType> {
intermediateState: number[];
variantBlockSize: number;
bigEndianMod: -1 | 1;
outputBinLen: number;
isVariableLen: boolean;
HMACSupported: boolean;
converterFunc: (
input: any,
existingBin: number[],
existingBinLen: number
) => packedValue;
roundFunc: (block: number[], H: number[]) => number[];
finalizeFunc: (
remainder: number[],
remainderBinLen: number,
processedBinLen: number,
H: number[]
) => number[];
stateCloneFunc: (state: number[]) => number[];
newStateFunc: (variant: VariantType) => number[];
getMAC: () => number[];
constructor(
variant: VariantType,
inputFormat: 'TEXT',
options?: FixedLengthOptionsEncodingType
);
constructor(
variant: VariantType,
inputFormat: FormatNoTextType,
options?: FixedLengthOptionsNoEncodingType
);
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,68 @@
// @ts-check
describe('Leaderboards', () => {
describe('formatPlayerName', () => {
it('it returns name if correct', () => {
expect(gdjs.evtTools.leaderboards.formatPlayerName('PlayerName')).to.be(
'PlayerName'
);
});
it('it returns name with underscores instead of whitespaces', () => {
expect(
gdjs.evtTools.leaderboards.formatPlayerName('My Player Name')
).to.be('My_Player_Name');
});
it("it doesn't change a name with vertical bars and hyphens", () => {
expect(gdjs.evtTools.leaderboards.formatPlayerName('Pla-yer|Name')).to.be(
'Pla-yer|Name'
);
});
it('it truncates name if longer than 30', () => {
expect(
gdjs.evtTools.leaderboards.formatPlayerName(
'aPlayerNameTh4tIsT00LongToBeSaved'
)
).to.be('aPlayerNameTh4tIsT00LongToBeSa');
});
it('it generates a predefined player name with a random number if input is void/wrong type/empty', () => {
// @ts-ignore
expect(gdjs.evtTools.leaderboards.formatPlayerName(null)).to.match(
/^Player\d{5}/
);
// @ts-ignore
expect(gdjs.evtTools.leaderboards.formatPlayerName(5)).to.match(
/^Player\d{5}/
);
// @ts-ignore
expect(gdjs.evtTools.leaderboards.formatPlayerName(undefined)).to.match(
/^Player\d{5}/
);
// @ts-ignore
expect(gdjs.evtTools.leaderboards.formatPlayerName(() => {})).to.match(
/^Player\d{5}/
);
// @ts-ignore
expect(gdjs.evtTools.leaderboards.formatPlayerName('')).to.match(
/^Player\d{5}/
);
});
it('it removes accents from latin letters', () => {
expect(gdjs.evtTools.leaderboards.formatPlayerName('plâyèrÏonisé')).to.be(
'playerIonise'
);
});
it('it removes non-accepted characters in a long name', () => {
expect(
gdjs.evtTools.leaderboards.formatPlayerName(
'aιΥÉᚱÀeThatsTooonToBeՏaѵÊĐThisPartAppears'
)
).to.be('aEAeThatsTooonToBeaEThisPartAp');
});
});
});

View File

@@ -243,7 +243,7 @@ module.exports = {
objectsEditorService.registerEditorConfiguration(
'Lighting::LightObject',
objectsEditorService.getDefaultObjectJsImplementationPropertiesEditor({
helpPagePath: '/objects/light',
helpPagePath: '/all-features/lighting/reference',
})
);
},

View File

@@ -53,8 +53,8 @@ namespace gdjs {
getAllObstaclesAround(
object: gdjs.RuntimeObject,
radius: number,
result: gdjs.BehaviorRBushAABB<gdjs.LightObstacleRuntimeBehavior>[]
) {
result: gdjs.LightObstacleRuntimeBehavior[]
): void {
// TODO: This would better be done using the object AABB (getAABB), as (`getCenterX`;`getCenterY`) point
// is not necessarily in the middle of the object (for sprites for example).
const x = object.getX();
@@ -70,9 +70,13 @@ namespace gdjs {
searchArea.maxX = x + radius;
// @ts-ignore
searchArea.maxY = y + radius;
const nearbyObstacles = this._obstacleRBush.search(searchArea);
const nearbyObstacles: gdjs.BehaviorRBushAABB<
gdjs.LightObstacleRuntimeBehavior
>[] = this._obstacleRBush.search(searchArea);
result.length = 0;
result.push.apply(result, nearbyObstacles);
nearbyObstacles.forEach((nearbyObstacle) =>
result.push(nearbyObstacle.behavior)
);
}
}

View File

@@ -369,9 +369,7 @@ namespace gdjs {
* @returns the vertices of mesh.
*/
_computeLightVertices(): Array<FloatPoint> {
const lightObstacles: gdjs.BehaviorRBushAABB<
LightObstacleRuntimeBehavior
>[] = [];
const lightObstacles: gdjs.LightObstacleRuntimeBehavior[] = [];
if (this._manager) {
this._manager.getAllObstaclesAround(
this._object,
@@ -402,9 +400,7 @@ namespace gdjs {
const obstaclePolygons: Array<gdjs.Polygon> = [];
obstaclePolygons.push(this._lightBoundingPoly);
for (let i = 0; i < lightObstacles.length; i++) {
const obstacleHitBoxes = lightObstacles[
i
].behavior.owner.getHitBoxesAround(
const obstacleHitBoxes = lightObstacles[i].owner.getHitBoxesAround(
searchAreaLeft,
searchAreaTop,
searchAreaRight,

View File

@@ -23,7 +23,10 @@ void DeclareLinkedObjectsExtension(gd::PlatformExtension& extension) {
"that is more efficient than using variables.",
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/all-features/linked-objects");
.SetExtensionHelpPath("/all-features/linked-objects")
.SetCategory("Advanced");
extension.AddInstructionOrExpressionGroupMetadata(_("Linked objects"))
.SetIcon("CppPlatform/Extensions/LinkedObjectsicon24.png");
#if defined(GD_IDE_ONLY)
@@ -33,9 +36,9 @@ void DeclareLinkedObjectsExtension(gd::PlatformExtension& extension) {
_("Link two objects together, so as to be able to get one "
"from the other."),
_("Link _PARAM1_ and _PARAM2_"),
_("Linked objects"),
"",
"CppPlatform/Extensions/LinkedObjectsicon24.png",
"CppPlatform/Extensions/LinkedObjectsicon16.png")
"CppPlatform/Extensions/LinkedObjectsicon24.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("objectPtr", _("Object 1"))
@@ -49,9 +52,9 @@ void DeclareLinkedObjectsExtension(gd::PlatformExtension& extension) {
_("Unlink two objects"),
_("Unlink two objects."),
_("Unlink _PARAM1_ and _PARAM2_"),
_("Linked objects"),
"",
"CppPlatform/Extensions/LinkedObjectsicon24.png",
"CppPlatform/Extensions/LinkedObjectsicon16.png")
"CppPlatform/Extensions/LinkedObjectsicon24.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("objectPtr", _("Object 1"))
@@ -65,9 +68,9 @@ void DeclareLinkedObjectsExtension(gd::PlatformExtension& extension) {
_("Unlink all objects from an object"),
_("Unlink all objects from an object."),
_("Unlink all objects from _PARAM1_"),
_("Linked objects"),
"",
"CppPlatform/Extensions/LinkedObjectsicon24.png",
"CppPlatform/Extensions/LinkedObjectsicon16.png")
"CppPlatform/Extensions/LinkedObjectsicon24.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("objectPtr", _("Object"))
@@ -82,9 +85,9 @@ void DeclareLinkedObjectsExtension(gd::PlatformExtension& extension) {
"next conditions and actions.\nThe condition will return "
"false if no object was taken into account."),
_("Take into account all \"_PARAM1_\" linked to _PARAM2_"),
_("Linked objects"),
"",
"CppPlatform/Extensions/LinkedObjectsicon24.png",
"CppPlatform/Extensions/LinkedObjectsicon16.png")
"CppPlatform/Extensions/LinkedObjectsicon24.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("objectList", _("Pick these objects..."))
@@ -100,9 +103,9 @@ void DeclareLinkedObjectsExtension(gd::PlatformExtension& extension) {
_("Take into account linked objects"),
_("Take objects linked to the object into account for next actions."),
_("Take into account all \"_PARAM1_\" linked to _PARAM2_"),
_("Linked objects"),
"",
"CppPlatform/Extensions/LinkedObjectsicon24.png",
"CppPlatform/Extensions/LinkedObjectsicon16.png")
"CppPlatform/Extensions/LinkedObjectsicon24.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("objectList", _("Pick these objects..."))

View File

@@ -211,8 +211,7 @@ namespace gdjs {
};
/**
* Gets an event from {@link events}
* or creates it if it doesn't exist.
* Get an event or creates it if it doesn't exist.
*/
export const getEvent = (name: string) => {
if (!events.hasOwnProperty(name)) events[name] = new Event();

View File

@@ -28,12 +28,16 @@ module.exports = {
extension
.setExtensionInformation(
'P2P',
_('Peer-to-Peer communication (experimental)'),
_('P2P (experimental)'),
'Allow game instances to communicate remotely using messages sent via WebRTC (P2P).',
'Arthur Pacaud (arthuro555)',
'MIT'
)
.setExtensionHelpPath('/all-features/p2p');
.setExtensionHelpPath('/all-features/p2p')
.setCategory('Network');
extension
.addInstructionOrExpressionGroupMetadata(_('P2P (experimental)'))
.setIcon('JsPlatform/Extensions/p2picon.svg');
extension
.addCondition(
@@ -41,7 +45,7 @@ module.exports = {
_('Event triggered by peer'),
_('Triggers once when a connected client sends the event'),
_('Event _PARAM0_ received from other client (data loss: _PARAM1_)'),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
)
@@ -60,7 +64,7 @@ module.exports = {
'True if the peer-to-peer extension initialized and is ready to use.'
),
_('Is P2P ready?'),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
)
@@ -79,7 +83,7 @@ module.exports = {
'if you want to analyse it or display it to the user.'
),
_('P2P error occurred'),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
)
@@ -94,7 +98,7 @@ module.exports = {
_('Peer disconnected'),
_('Triggers once when a peer disconnects.'),
_('P2P peer disconnected'),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
)
@@ -109,7 +113,7 @@ module.exports = {
_('Peer Connected'),
_('Triggers once when a remote peer initiates a connection.'),
_('P2P peer connected'),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
)
@@ -124,7 +128,7 @@ module.exports = {
_('Connect to another client'),
_('Connects the current client to another client using its id.'),
_('Connect to P2P client _PARAM0_'),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
)
@@ -140,7 +144,7 @@ module.exports = {
_('Connect to a broker server'),
_('Connects the extension to a broker server.'),
_('Connect to the broker server at http://_PARAM0_:_PARAM1_/'),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
)
@@ -166,7 +170,7 @@ module.exports = {
'This action needs to be called BEFORE connecting to the broker server.'
),
_('Use ICE server _PARAM0_ (username: _PARAM1_, password: _PARAM2_)'),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
)
@@ -184,7 +188,7 @@ module.exports = {
_('Connect to the default broker server'),
_('Connects to the default broker server.'),
_('Connect to the default broker server'),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
)
@@ -202,7 +206,7 @@ module.exports = {
'Must be called BEFORE connecting to a broker.'
),
_('Override the client ID with _PARAM0_'),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
)
@@ -220,7 +224,7 @@ module.exports = {
_(
'Trigger event _PARAM0_ on all connected clients (extra data: _PARAM1_)'
),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
)
@@ -237,7 +241,7 @@ module.exports = {
_('Trigger event on a specific client'),
_('Triggers an event on a specific connected client'),
_('Trigger event _PARAM1_ on client _PARAM0_ (extra data: _PARAM2_)'),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
)
@@ -257,7 +261,7 @@ module.exports = {
_(
'Trigger event _PARAM0_ on all connected clients (extra data: _PARAM1_)'
),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
)
@@ -279,7 +283,7 @@ module.exports = {
_('Trigger event on a specific client (variable)'),
_('Triggers an event on a specific connected client'),
_('Trigger event _PARAM1_ on client _PARAM0_ (extra data: _PARAM2_)'),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
)
@@ -307,7 +311,7 @@ module.exports = {
_(
'Overwrite _PARAM1_ with variable sent with last trigger of _PARAM0_'
),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
)
@@ -329,7 +333,7 @@ module.exports = {
_('Disconnect from a peer'),
_('Disconnects this client from another client.'),
_('Disconnect from client _PARAM0_'),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
)
@@ -345,7 +349,7 @@ module.exports = {
_('Disconnect from all peers'),
_('Disconnects this client from all other clients.'),
_('Disconnect from all clients'),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
)
@@ -360,7 +364,7 @@ module.exports = {
_('Disconnect from broker'),
_('Disconnects the client from the broker server.'),
_('Disconnect the client from the broker'),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
)
@@ -377,7 +381,7 @@ module.exports = {
'Disconnects the client from the broker server and all other clients.'
),
_('Disconnect the client from the broker and other clients'),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
)
@@ -393,7 +397,7 @@ module.exports = {
_(
'Returns the data received when the specified event was last triggered'
),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg'
)
.addParameter('string', _('Event name'), '', false)
@@ -407,7 +411,7 @@ module.exports = {
'GetEventSender',
_('Get event sender'),
_('Returns the id of the peer that triggered the event'),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg'
)
.addParameter('string', _('Event name'), '', false)
@@ -421,7 +425,7 @@ module.exports = {
'GetID',
_('Get client ID'),
_('Gets the client ID of the current game instance'),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg'
)
.getCodeExtraInformation()
@@ -434,7 +438,7 @@ module.exports = {
'GetLastError',
_('Get last error'),
_('Gets the description of the last P2P error'),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg'
)
.getCodeExtraInformation()
@@ -447,7 +451,7 @@ module.exports = {
'GetLastDisconnectedPeer',
_('Get last disconnected peer'),
_('Gets the ID of the latest peer that has disconnected.'),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg'
)
.getCodeExtraInformation()
@@ -460,7 +464,7 @@ module.exports = {
'GetLastConnectedPeer',
_('Get ID of the connected peer'),
_('Gets the ID of the newly connected peer.'),
_('P2P (experimental)'),
'',
'JsPlatform/Extensions/p2picon.svg'
)
.getCodeExtraInformation()

View File

@@ -294,8 +294,8 @@ void ExtensionSubDeclaration2(gd::ObjectMetadata& obj) {
obj.AddCondition("NoMoreParticles",
_("No more particles"),
_("Check if the object does not emit particles "
"anylonger, so as to destroy it for example."),
_("_PARAM0_ does not emit anylonger."),
"any longer, so as to destroy it for example."),
_("_PARAM0_ does not emit any longer"),
_("Common"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")

View File

@@ -45,7 +45,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
_("Move to a position"),
_("Move the object to a position"),
_("Move _PARAM0_ to _PARAM3_;_PARAM4_"),
"Movement on the path",
_("Movement on the path"),
"CppPlatform/Extensions/AStaricon24.png",
"CppPlatform/Extensions/AStaricon16.png")
.AddParameter("object", _("Object"))
@@ -61,7 +61,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
_("Path found"),
_("Check if a path has been found."),
_("A path has been found for _PARAM0_"),
"Movement on the path",
_("Movement on the path"),
"CppPlatform/Extensions/AStaricon24.png",
"CppPlatform/Extensions/AStaricon16.png")
@@ -74,7 +74,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
_("Destination reached"),
_("Check if the destination was reached."),
_("_PARAM0_ reached its destination"),
"Movement on the path",
_("Movement on the path"),
"CppPlatform/Extensions/AStaricon24.png",
"CppPlatform/Extensions/AStaricon16.png")

View File

@@ -70,8 +70,8 @@ namespace gdjs {
x: float,
y: float,
radius: float,
result: gdjs.BehaviorRBushAABB<gdjs.PathfindingObstacleRuntimeBehavior>[]
): any {
result: gdjs.PathfindingObstacleRuntimeBehavior[]
): void {
const searchArea = gdjs.staticObject(
PathfindingObstaclesManager.prototype.getAllObstaclesAround
);
@@ -83,9 +83,13 @@ namespace gdjs {
searchArea.maxX = x + radius;
// @ts-ignore
searchArea.maxY = y + radius;
const nearbyPlatforms = this._obstaclesRBush.search(searchArea);
const nearbyObstacles: gdjs.BehaviorRBushAABB<
gdjs.PathfindingObstacleRuntimeBehavior
>[] = this._obstaclesRBush.search(searchArea);
result.length = 0;
result.push.apply(result, nearbyPlatforms);
nearbyObstacles.forEach((nearbyObstacle) =>
result.push(nearbyObstacle.behavior)
);
}
}

View File

@@ -544,9 +544,7 @@ namespace gdjs {
//An array of nodes sorted by their estimate cost (First node = Lower estimate cost).
_openNodes: Node[] = [];
//Used by getNodes to temporarily store obstacles near a position.
_closeObstacles: gdjs.BehaviorRBushAABB<
PathfindingObstacleRuntimeBehavior
>[] = [];
_closeObstacles: gdjs.PathfindingObstacleRuntimeBehavior[] = [];
//Old nodes constructed in a previous search are stored here to avoid temporary objects (see _freeAllNodes method).
_nodeCache: Node[] = [];
@@ -787,7 +785,7 @@ namespace gdjs {
this._closeObstacles
);
for (let k = 0; k < this._closeObstacles.length; ++k) {
const obj = this._closeObstacles[k].behavior.owner;
const obj = this._closeObstacles[k].owner;
const topLeftCellX = Math.floor(
(obj.getDrawableX() - this._rightBorder - this._gridOffsetX) /
this._cellWidth
@@ -817,13 +815,13 @@ namespace gdjs {
yPos < bottomRightCellY
) {
objectsOnCell = true;
if (this._closeObstacles[k].behavior.isImpassable()) {
if (this._closeObstacles[k].isImpassable()) {
//The cell is impassable, stop here.
newNode.cost = -1;
break;
} else {
//Superimpose obstacles
newNode.cost += this._closeObstacles[k].behavior.getCost();
newNode.cost += this._closeObstacles[k].getCost();
}
}
}

View File

@@ -33,7 +33,11 @@ module.exports = {
'Florian Rival, Franco Maciel',
'MIT'
)
.setExtensionHelpPath('/behaviors/physics2');
.setExtensionHelpPath('/behaviors/physics2')
.setCategory('Advanced');
extension
.addInstructionOrExpressionGroupMetadata(_('Physics Engine 2.0'))
.setIcon('res/physics32.png');
var physics2Behavior = new gd.BehaviorJsImplementation();
// $FlowExpectedError - ignore Flow warning as we're creating a behavior
@@ -425,8 +429,8 @@ module.exports = {
_('Compare the world gravity on X axis.'),
_('the world gravity on X axis'),
_('Global'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -440,7 +444,7 @@ module.exports = {
_('World gravity on X axis'),
_('World gravity on X axis'),
_('Global'),
'res/physics16.png'
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -454,8 +458,8 @@ module.exports = {
_('Compare the world gravity on Y axis.'),
_('the world gravity on Y axis'),
_('Global'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -469,7 +473,7 @@ module.exports = {
_('World gravity on Y axis'),
_('World gravity on Y axis'),
_('Global'),
'res/physics16.png'
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -487,8 +491,8 @@ module.exports = {
),
_('Set the world gravity of _PARAM0_ to _PARAM2_;_PARAM3_'),
_('Global'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -504,8 +508,8 @@ module.exports = {
_('Compare the world time scale.'),
_('the world time scale'),
_('Global'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -524,9 +528,9 @@ module.exports = {
'While an object is needed, this will apply to all objects using the behavior.'
),
_('Set the world time scale of _PARAM0_ to _PARAM2_'),
_('Global'),
'res/physics24.png',
'res/physics16.png'
'',
'res/physics32.png',
'res/physics32.png'
)
.addParameter('objectList', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -541,7 +545,7 @@ module.exports = {
_('World time scale'),
_('World time scale'),
_('Global'),
'res/physics16.png'
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -556,8 +560,8 @@ module.exports = {
_('Test if an object is dynamic.'),
_('_PARAM0_ is dynamic'),
_('Dynamics'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -573,8 +577,8 @@ module.exports = {
),
_('Set _PARAM0_ as dynamic'),
_('Dynamics'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -588,8 +592,8 @@ module.exports = {
_('Test if an object is static.'),
_('_PARAM0_ is static'),
_('Dynamics'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -605,8 +609,8 @@ module.exports = {
),
_('Set _PARAM0_ as static'),
_('Dynamics'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -620,8 +624,8 @@ module.exports = {
_('Test if an object is kinematic.'),
_('_PARAM0_ is kinematic'),
_('Dynamics'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -637,8 +641,8 @@ module.exports = {
),
_('Set _PARAM0_ as kinematic'),
_('Dynamics'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -652,8 +656,8 @@ module.exports = {
_('Test if an object is being treat as a bullet.'),
_('_PARAM0_ is bullet'),
_('Dynamics'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -669,8 +673,8 @@ module.exports = {
),
_('Treat _PARAM0_ as bullet: _PARAM2_'),
_('Dynamics'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -686,8 +690,8 @@ module.exports = {
_('Test if an object has fixed rotation.'),
_('_PARAM0_ has fixed rotation'),
_('Dynamics'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -703,8 +707,8 @@ module.exports = {
),
_('Set _PARAM0_ fixed rotation: _PARAM2_'),
_('Dynamics'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -720,8 +724,8 @@ module.exports = {
_('Test if an object can sleep.'),
_('_PARAM0_ can sleep'),
_('Dynamics'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -737,8 +741,8 @@ module.exports = {
),
_('Allow _PARAM0_ to sleep: _PARAM2_'),
_('Dynamics'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -754,8 +758,8 @@ module.exports = {
_('Test if an object is sleeping.'),
_('_PARAM0_ is sleeping'),
_('Dynamics'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -772,8 +776,8 @@ module.exports = {
),
_('the shape scale'),
_('Body settings'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -789,8 +793,8 @@ module.exports = {
_('Test an object density.'),
_('the _PARAM0_ density'),
_('Body settings'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -807,8 +811,8 @@ module.exports = {
),
_('the density'),
_('Body settings'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -823,7 +827,7 @@ module.exports = {
_('Density of the object'),
_('Get the density of an object.'),
_('Body settings'),
'res/physics16.png'
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -837,8 +841,8 @@ module.exports = {
_('Test an object friction.'),
_('the _PARAM0_ friction'),
_('Body settings'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -855,8 +859,8 @@ module.exports = {
),
_('the friction'),
_('Body settings'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -871,7 +875,7 @@ module.exports = {
_('Friction of the object'),
_('Get the friction of an object.'),
_('Body settings'),
'res/physics16.png'
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -885,8 +889,8 @@ module.exports = {
_('Test an object restitution.'),
_('the _PARAM0_ restitution'),
_('Body settings'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -903,8 +907,8 @@ module.exports = {
),
_('the restitution'),
_('Body settings'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -919,7 +923,7 @@ module.exports = {
_('Restitution of the object'),
_('Get the restitution of an object.'),
_('Body settings'),
'res/physics16.png'
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -933,8 +937,8 @@ module.exports = {
_('Test an object linear damping.'),
_('the _PARAM0_ linear damping'),
_('Body settings'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -951,8 +955,8 @@ module.exports = {
),
_('the linear damping'),
_('Body settings'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -967,7 +971,7 @@ module.exports = {
_('Linear damping of the object'),
_('Get the linear damping of an object.'),
_('Body settings'),
'res/physics16.png'
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -981,8 +985,8 @@ module.exports = {
_('Test an object angular damping.'),
_('the _PARAM0_ angular damping'),
_('Body settings'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -999,8 +1003,8 @@ module.exports = {
),
_('the angular damping'),
_('Body settings'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1015,7 +1019,7 @@ module.exports = {
_('Angular damping of the object'),
_('Get the angular damping of an object.'),
_('Body settings'),
'res/physics16.png'
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1029,8 +1033,8 @@ module.exports = {
_('Test an object gravity scale.'),
_('the _PARAM0_ gravity scale'),
_('Body settings'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1047,8 +1051,8 @@ module.exports = {
),
_('the gravity scale'),
_('Body settings'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1063,7 +1067,7 @@ module.exports = {
_('Gravity scale of the object'),
_('Get the gravity scale of an object.'),
_('Body settings'),
'res/physics16.png'
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1078,8 +1082,8 @@ module.exports = {
_('Test if an object has a specific layer enabled.'),
_('_PARAM0_ has layer _PARAM2_ enabled'),
_('Filtering'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1096,8 +1100,8 @@ module.exports = {
),
_('Enable layer _PARAM2_ for _PARAM0_: _PARAM3_'),
_('Filtering'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1114,8 +1118,8 @@ module.exports = {
_('Test if an object has a specific mask enabled.'),
_('_PARAM0_ has mask _PARAM2_ enabled'),
_('Filtering'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1132,8 +1136,8 @@ module.exports = {
),
_('Enable mask _PARAM2_ for _PARAM0_: _PARAM3_'),
_('Filtering'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1151,8 +1155,8 @@ module.exports = {
_('Test an object linear velocity on X.'),
_('the linear velocity on X'),
_('Velocity'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1167,8 +1171,8 @@ module.exports = {
_('Modify an object linear velocity on X.'),
_('the linear velocity on X'),
_('Velocity'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1183,7 +1187,7 @@ module.exports = {
_('Linear velocity on X axis'),
_('Get the linear velocity of an object on X axis.'),
_('Velocity'),
'res/physics16.png'
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1197,8 +1201,8 @@ module.exports = {
_('Test an object linear velocity on Y.'),
_('the linear velocity on Y'),
_('Velocity'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1213,8 +1217,8 @@ module.exports = {
_('Modify an object linear velocity on Y.'),
_('the linear velocity on Y'),
_('Velocity'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1229,7 +1233,7 @@ module.exports = {
_('Linear velocity on Y axis'),
_('Get the linear velocity of an object on Y axis.'),
_('Velocity'),
'res/physics16.png'
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1243,8 +1247,8 @@ module.exports = {
_('Test an object linear velocity length.'),
_('the linear velocity length'),
_('Velocity'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1258,7 +1262,7 @@ module.exports = {
_('Linear velocity'),
_('Get the linear velocity of an object.'),
_('Velocity'),
'res/physics16.png'
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1272,8 +1276,8 @@ module.exports = {
_('Test an object angular velocity.'),
_('the angular velocity'),
_('Velocity'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1288,8 +1292,8 @@ module.exports = {
_('Modify an object angular velocity.'),
_('the angular velocity'),
_('Velocity'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1304,7 +1308,7 @@ module.exports = {
_('Angular velocity'),
_('Get the angular velocity of an object.'),
_('Velocity'),
'res/physics16.png'
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1321,8 +1325,8 @@ module.exports = {
),
_('Apply to _PARAM0_ a force of _PARAM2_;_PARAM3_'),
_('Forces & impulses'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1342,8 +1346,8 @@ module.exports = {
),
_('Apply to _PARAM0_ a force of angle _PARAM2_ and length _PARAM3_'),
_('Forces & impulses'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1365,8 +1369,8 @@ module.exports = {
'Apply to _PARAM0_ a force of length _PARAM2_ towards _PARAM3_;_PARAM4_'
),
_('Forces & impulses'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1387,8 +1391,8 @@ module.exports = {
),
_('Apply to _PARAM0_ an impulse of _PARAM2_;_PARAM3_'),
_('Forces & impulses'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1410,8 +1414,8 @@ module.exports = {
'Apply to _PARAM0_ an impulse of angle _PARAM2_ and length _PARAM3_ (applied at _PARAM4_;_PARAM5_)'
),
_('Forces & impulses'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1433,8 +1437,8 @@ module.exports = {
'Apply to _PARAM0_ an impulse of length _PARAM2_ towards _PARAM3_;_PARAM4_ (applied at _PARAM5_;_PARAM6_)'
),
_('Forces & impulses'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1455,8 +1459,8 @@ module.exports = {
),
_('Apply to _PARAM0_ a torque of _PARAM2_'),
_('Forces & impulses'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1473,8 +1477,8 @@ module.exports = {
),
_('Apply to _PARAM0_ an angular impulse of _PARAM2_'),
_('Forces & impulses'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1488,7 +1492,7 @@ module.exports = {
_('Mass center X'),
_('Mass center X'),
'',
'res/physics16.png'
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1501,7 +1505,7 @@ module.exports = {
_('Mass center Y'),
_('Mass center Y'),
'',
'res/physics16.png'
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1516,8 +1520,8 @@ module.exports = {
_('Test if an object is the first object on a joint.'),
_('_PARAM0_ is the first object for joint _PARAM2_'),
_('Joints'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1532,8 +1536,8 @@ module.exports = {
_('Test if an object is the second object on a joint.'),
_('_PARAM0_ is the second object for joint _PARAM2_'),
_('Joints'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1547,7 +1551,7 @@ module.exports = {
_('Joint first anchor X'),
_('Joint first anchor X'),
_('Joints'),
'res/physics16.png'
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1561,7 +1565,7 @@ module.exports = {
_('Joint first anchor Y'),
_('Joint first anchor Y'),
_('Joints'),
'res/physics16.png'
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1575,7 +1579,7 @@ module.exports = {
_('Joint second anchor X'),
_('Joint second anchor X'),
_('Joints'),
'res/physics16.png'
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1589,7 +1593,7 @@ module.exports = {
_('Joint second anchor Y'),
_('Joint second anchor Y'),
_('Joints'),
'res/physics16.png'
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1604,8 +1608,8 @@ module.exports = {
_('Test a joint reaction force.'),
_('the joint _PARAM2_ reaction force'),
_('Joints'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1620,7 +1624,7 @@ module.exports = {
_('Joint reaction force'),
_('Joint reaction force'),
_('Joints'),
'res/physics16.png'
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1635,8 +1639,8 @@ module.exports = {
_('Test a joint reaction torque.'),
_('the joint _PARAM2_ reaction torque'),
_('Joints'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1651,7 +1655,7 @@ module.exports = {
_('Joint reaction torque'),
_('Joint reaction torque'),
_('Joints'),
'res/physics16.png'
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -1666,8 +1670,8 @@ module.exports = {
_('Remove a joint from the scene.'),
_('Remove joint _PARAM2_'),
_('Joints'),
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
@@ -3731,8 +3735,8 @@ module.exports = {
_('Test if two objects collide.'),
_('_PARAM0_ is colliding with _PARAM2_'),
'',
'res/physics24.png',
'res/physics16.png'
'res/physics32.png',
'res/physics32.png'
)
.addParameter('objectList', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')

View File

@@ -16,7 +16,7 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
extension
.SetExtensionInformation(
"PlatformBehavior",
_("Platform Behavior"),
_("Platform behavior"),
"The platformer engine allows to create controllable objects that "
"can run and jump on other objects that are marked as platforms. It "
"supports various features commonly found in platformers: "
@@ -28,6 +28,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/behaviors/platformer");
extension.AddInstructionOrExpressionGroupMetadata(_("Platform behavior"))
.SetIcon("CppPlatform/Extensions/platformerobjecticon.png");
{
gd::BehaviorMetadata& aut = extension.AddBehavior(
@@ -41,26 +43,40 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
std::make_shared<PlatformerObjectBehavior>(),
std::make_shared<gd::BehaviorsSharedData>());
// Deprecated, use IsMovingEvenALittle instead
aut.AddCondition("IsMoving",
_("Is moving"),
_("Check if the object is moving (whether it is on the "
"floor or in the air)."),
_("_PARAM0_ is moving"),
"",
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.SetHidden()
.MarkAsSimple()
.SetFunctionName("IsMoving");
aut.AddScopedCondition("IsMovingEvenALittle",
_("Is moving"),
_("Check if the object is moving (whether it is on the "
"floor or in the air)."),
_("_PARAM0_ is moving"),
"",
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.MarkAsSimple();
aut.AddCondition("IsOnFloor",
_("Is on floor"),
_("Check if the object is on a platform."),
_("_PARAM0_ is on floor"),
"",
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.MarkAsSimple()
@@ -71,8 +87,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
_("Check if the object is on a ladder."),
_("_PARAM0_ is on ladder"),
"",
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.MarkAsAdvanced()
@@ -83,8 +99,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
_("Check if the object is jumping."),
_("_PARAM0_ is jumping"),
"",
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.MarkAsSimple()
@@ -98,8 +114,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"jump, the fall speed becomes higher than the jump speed."),
_("_PARAM0_ is falling"),
"",
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.SetFunctionName("IsFalling");
@@ -109,8 +125,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
_("Check if the object is grabbing a platform ledge."),
_("_PARAM0_ is grabbing a platform ledge"),
"",
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.SetFunctionName("IsGrabbingPlatform");
@@ -121,8 +137,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"per second per second)."),
_("the gravity"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
@@ -135,8 +151,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"second per second)."),
_("the gravity"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardOperatorParameters("number")
@@ -151,8 +167,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"second)."),
_("the maximum falling speed"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
@@ -166,8 +182,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"second)."),
_("the maximum falling speed"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardOperatorParameters("number")
@@ -182,8 +198,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"second)."),
_("the ladder climbing speed"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
@@ -196,8 +212,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"second)."),
_("the ladder climbing speed"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardOperatorParameters("number")
@@ -211,8 +227,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"second per second)."),
_("the horizontal acceleration"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
@@ -225,8 +241,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"second per second)."),
_("the horizontal acceleration"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardOperatorParameters("number")
@@ -240,8 +256,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"second per second)."),
_("the horizontal deceleration"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
@@ -254,8 +270,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"second per second)."),
_("the horizontal deceleration"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardOperatorParameters("number")
@@ -269,8 +285,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
_("Compare the maximum horizontal speed of the object (in pixels per second)."),
_("the maximum horizontal speed"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
@@ -282,8 +298,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
_("Change the maximum horizontal speed of an object (in pixels per second)."),
_("the maximum horizontal speed"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardOperatorParameters("number")
@@ -298,8 +314,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"Its value is always positive."),
_("the jump speed"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
@@ -313,8 +329,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"Its value is always positive."),
_("the jump speed"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardOperatorParameters("number")
@@ -329,8 +345,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"allow the initial jump speed to be maintained."),
_("the jump sustain time"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
@@ -343,8 +359,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"allow the initial jump speed to be maintained."),
_("the jump sustain time"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardOperatorParameters("number");
@@ -359,8 +375,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"(apart if it's on the floor)."),
_("Allow _PARAM0_ to jump again"),
_(""),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.MarkAsSimple()
@@ -374,8 +390,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"the object is not in the air."),
_("Forbid _PARAM0_ to air jump"),
_(""),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior");
@@ -386,8 +402,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"This action doesn't have any effect when the character is not jumping."),
_("Abort the current jump of _PARAM0_"),
_(""),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior");
@@ -396,8 +412,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
_("Check if the object can jump."),
_("_PARAM0_ can jump"),
"",
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.MarkAsSimple()
@@ -521,7 +537,7 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
aut.AddScopedCondition("IsUsingControl",
_("Control pressed or simulated"),
_("A control was applied from a default control or a simulated by an action."),
_("A control was applied from a default control or simulated by an action."),
_("_PARAM0_ has the _PARAM2_ key pressed or simulated"),
_(""),
"res/conditions/keyboard24.png",
@@ -565,8 +581,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
_("Check if the object can grab the platforms."),
_("_PARAM0_ can grab the platforms"),
"Options",
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.MarkAsSimple()
@@ -580,8 +596,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"is not falling or is in the first phase of a jump."),
_("the current falling speed"),
_(""),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardOperatorParameters("number")
@@ -594,8 +610,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"second). Its value is always positive."),
_("the current falling speed"),
_(""),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
@@ -609,8 +625,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"second). Its value is always positive."),
_("the current jump speed"),
_(""),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
@@ -624,8 +640,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"with negative values and to the right with positive ones"),
_("the current horizontal speed"),
_(""),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardOperatorParameters("number")
@@ -638,8 +654,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"with negative values and to the right with positive ones"),
_("the current horizontal speed"),
_(""),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
@@ -651,7 +667,7 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
_("Return the gravity applied on the object "
"(in pixels per second per second)."),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.SetFunctionName("GetGravity");
@@ -661,7 +677,7 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
_("Return the maximum falling speed of the object "
"(in pixels per second)."),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.SetFunctionName("GetMaxFallingSpeed");
@@ -671,7 +687,7 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
_("Return the ladder climbing speed of the object "
"(in pixels per second)."),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.SetFunctionName("GetLadderClimbingSpeed");
@@ -681,7 +697,7 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
_("Return the horizontal acceleration of the object "
"(in pixels per second per second)."),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.SetFunctionName("GetAcceleration");
@@ -691,7 +707,7 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
_("Return the horizontal deceleration of the object "
"(in pixels per second per second)."),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.SetFunctionName("GetDeceleration");
@@ -701,7 +717,7 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
_("Return the maximum horizontal speed of the object "
"(in pixels per second)."),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.SetFunctionName("GetMaxSpeed");
@@ -711,7 +727,7 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
_("Return the jump speed of the object "
"(in pixels per second). Its value is always positive."),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.SetFunctionName("GetJumpSpeed");
@@ -722,7 +738,7 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"This is the time during which keeping the jump button held "
"allow the initial jump speed to be maintained."),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior");
@@ -731,7 +747,7 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
_("Return the current fall speed of the object "
"(in pixels per second). Its value is always positive."),
_(""),
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.SetFunctionName("GetCurrentFallSpeed");
@@ -742,7 +758,7 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"(in pixels per second). The object moves to the left "
"with negative values and to the right with positive ones"),
_(""),
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.SetFunctionName("GetCurrentSpeed");
@@ -752,7 +768,7 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"(in pixels per second). Its value is always positive."),
_("Current jump speed"),
_(""),
"CppPlatform/Extensions/platformerobjecticon16.png")
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.SetFunctionName("GetCurrentJumpSpeed");
@@ -769,15 +785,14 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
std::make_shared<PlatformBehavior>(),
std::make_shared<gd::BehaviorsSharedData>());
aut.AddAction("ChangePlatformType",
_("Change platform type"),
_("Change the platform type of the object: Platform, "
"Jump-Through, or Ladder."),
_("Set platform type of _PARAM0_ to _PARAM2_"),
_("Platforms"),
"CppPlatform/Extensions/platformicon24.png",
"CppPlatform/Extensions/platformicon16.png")
"",
"CppPlatform/Extensions/platformicon.png",
"CppPlatform/Extensions/platformicon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformBehavior")
.AddParameter(
@@ -791,9 +806,9 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
_("Is object on given floor"),
_("Test if an object is on a given floor."),
_("_PARAM0_ is on floor _PARAM2_"),
_("Platforms"),
"CppPlatform/Extensions/platformicon24.png",
"CppPlatform/Extensions/platformicon16.png")
"",
"CppPlatform/Extensions/platformicon.png",
"CppPlatform/Extensions/platformicon.png")
.AddParameter("objectList", _("Object"), "", false)
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.AddParameter("objectList", _("Platforms"), "", false)

View File

@@ -53,6 +53,8 @@ class PlatformBehaviorJsExtension : public gd::PlatformExtension {
"PlatformBehavior::PlatformerObjectBehavior");
autConditions["PlatformBehavior::IsMoving"].SetFunctionName("isMoving");
autConditions["PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle"]
.SetFunctionName("isMovingEvenALittle");
autConditions["PlatformBehavior::IsOnFloor"].SetFunctionName("isOnFloor");
autConditions["PlatformBehavior::IsOnLadder"].SetFunctionName(
"isOnLadder");

View File

@@ -8,14 +8,14 @@ This project is released under the MIT License.
#include "PlatformerObjectBehavior.h"
#include <iostream>
#include <memory>
#include <map>
#include <memory>
#include "GDCore/Tools/Localization.h"
#include "GDCore/CommonTools.h"
#include "GDCore/Project/Layout.h"
#include "GDCore/Serialization/SerializerElement.h"
#include "GDCore/Project/PropertyDescriptor.h"
#include "GDCore/Serialization/SerializerElement.h"
#include "GDCore/Tools/Localization.h"
#include "PlatformBehavior.h"
void PlatformerObjectBehavior::InitializeContent(
@@ -48,7 +48,8 @@ PlatformerObjectBehavior::GetProperties(
gd::String::From(behaviorContent.GetDoubleAttribute("gravity")));
properties[_("Jump speed")].SetGroup(_("Jump")).SetValue(
gd::String::From(behaviorContent.GetDoubleAttribute("jumpSpeed")));
properties["jumpSustainTime"].SetGroup(_("Jump"))
properties["jumpSustainTime"]
.SetGroup(_("Jump"))
.SetValue(gd::String::From(
behaviorContent.GetDoubleAttribute("jumpSustainTime", 0)))
.SetLabel(_("Jump sustain time"))
@@ -58,8 +59,10 @@ PlatformerObjectBehavior::GetProperties(
"jumps."));
properties[_("Max. falling speed")].SetGroup(_("Jump")).SetValue(
gd::String::From(behaviorContent.GetDoubleAttribute("maxFallingSpeed")));
properties[_("Ladder climbing speed")].SetGroup(_("Ladder")).SetValue(gd::String::From(
behaviorContent.GetDoubleAttribute("ladderClimbingSpeed", 150)));
properties[_("Ladder climbing speed")]
.SetGroup(_("Ladder"))
.SetValue(gd::String::From(
behaviorContent.GetDoubleAttribute("ladderClimbingSpeed", 150)));
properties[_("Acceleration")].SetGroup(_("Walk")).SetValue(
gd::String::From(behaviorContent.GetDoubleAttribute("acceleration")));
properties[_("Deceleration")].SetGroup(_("Walk")).SetValue(
@@ -79,28 +82,38 @@ PlatformerObjectBehavior::GetProperties(
? "true"
: "false")
.SetType("Boolean");
properties[_("Automatically grab platform ledges without having to move horizontally")]
properties[_("Automatically grab platform ledges without having to move "
"horizontally")]
.SetGroup(_("Ledge"))
.SetValue(behaviorContent.GetBoolAttribute("canGrabWithoutMoving", false)
? "true"
: "false")
.SetType("Boolean");
properties[_("Grab offset on Y axis")].SetGroup(_("Ledge")).SetValue(
gd::String::From(behaviorContent.GetDoubleAttribute("yGrabOffset")));
properties[_("Grab tolerance on X axis")].SetGroup(_("Ledge")).SetValue(gd::String::From(
behaviorContent.GetDoubleAttribute("xGrabTolerance", 10)));
properties[_("Use frame per second dependent trajectories (deprecated)")]
.SetGroup(_("Jump"))
.SetType("Boolean")
.MarkAsAdvanced();
properties[_("Grab offset on Y axis")]
.SetGroup(_("Ledge"))
.SetValue(
gd::String::From(behaviorContent.GetDoubleAttribute("yGrabOffset")));
properties[_("Grab tolerance on X axis")]
.SetGroup(_("Ledge"))
.SetValue(gd::String::From(
behaviorContent.GetDoubleAttribute("xGrabTolerance", 10)));
properties["useLegacyTrajectory"]
.SetLabel(_("Use frame rate dependent trajectories (deprecated, it's "
"recommended to let this unchecked)"))
.SetGroup(_("Deprecated options (advanced)"))
.SetValue(behaviorContent.GetBoolAttribute("useLegacyTrajectory", true)
? "true"
: "false")
.SetType("Boolean");
.SetType("Boolean")
.MarkAsComplex();
properties[_("Can go down from jumpthru platforms")]
.SetGroup(_("Walk"))
.SetValue(behaviorContent.GetBoolAttribute("canGoDownFromJumpthru", false)
? "true"
: "false")
.SetType("Boolean");
.SetType("Boolean")
.MarkAsAdvanced();
return properties;
}
@@ -112,9 +125,10 @@ bool PlatformerObjectBehavior::UpdateProperty(
behaviorContent.SetAttribute("ignoreDefaultControls", (value == "0"));
else if (name == _("Can grab platform ledges"))
behaviorContent.SetAttribute("canGrabPlatforms", (value == "1"));
else if (name == _("Automatically grab platform ledges without having to move horizontally"))
else if (name == _("Automatically grab platform ledges without having to "
"move horizontally"))
behaviorContent.SetAttribute("canGrabWithoutMoving", (value == "1"));
else if (name == _("Use frame per second dependent trajectories (deprecated)"))
else if (name == "useLegacyTrajectory")
behaviorContent.SetAttribute("useLegacyTrajectory", (value == "1"));
else if (name == _("Can go down from jumpthru platforms"))
behaviorContent.SetAttribute("canGoDownFromJumpthru", (value == "1"));

Some files were not shown because too many files have changed in this diff Show More