Compare commits

...

843 Commits

Author SHA1 Message Date
D8H
fde1039707 Fix the isCameraRotatedIn3D condition. (#5311)
Do not show in changelog
2023-05-19 12:13:40 +02:00
D8H
73e087936a Fix mouse and multitouch controls when 3D cameras are rotated (#5309) 2023-05-19 11:37:55 +02:00
AlexandreS
260fd5949e Upgrade posthog-js [skip ci] (#5308)
Only show in developer changelog
2023-05-19 11:29:17 +02:00
github-actions[bot]
a4939181a5 Update translations [skip ci] (#5307)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2023-05-19 11:12:15 +02:00
AlexandreS
cab56451ff Bump newIDE version (#5306) 2023-05-19 10:12:22 +02:00
github-actions[bot]
7b32bbacd6 Update translations [skip ci] (#5300) 2023-05-19 10:02:01 +02:00
AlexandreS
a15707d655 Use correct reference to layer (#5305)
[skip-ci]
2023-05-19 10:00:58 +02:00
Aurélien Vivet
714a9f1198 Add a condition to check if a scene exists (#5297) 2023-05-19 09:24:15 +02:00
AlexandreS
2a91c54b0e Remove forgotten ref (#5304)
Don't show in changelog
2023-05-18 17:33:31 +02:00
Florian Rival
3272b8eda7 Fix 2D rendering sometimes occluding/cutting semi transparent 3D objects 2023-05-18 16:58:42 +02:00
AlexandreS
cd432a22b6 Fix crash when working with instances in the scene editor (#5303) 2023-05-18 16:28:19 +02:00
AlexandreS
9ac483156e Unsubscribe effects and asynchronous tasks (#5301)
Only show in developer changelog
2023-05-17 17:44:18 +02:00
AlexandreS
d0f39027af Slightly lighten project file when lots of comments are present in the events sheets (#5299) 2023-05-17 16:45:19 +02:00
github-actions[bot]
5d8a59533d Update translations [skip ci] (#5294)
Co-authored-by: 4ian <4ian@users.noreply.github.com>
2023-05-17 14:48:23 +02:00
D8H
243a72008b Fix a key exception in the 3D model object editor (#5298)
* Don't show in changelog
2023-05-17 14:39:10 +02:00
Florian Rival
e56cdac96a Fix 3D rendering after loading a scene (#5296) 2023-05-17 13:12:27 +02:00
AlexandreS
cf374737fc Add support for built-in 3D games (#5285)
* This provides new 3D objects: 3D Box (perfect to create walls, floors, or billboards) and 3D Model (to import objects created in a 3D modeling app).
* 2D and 3D can be mixed in a same game. Each layer of a game can contain 2D objects, 3D objects or a mix of both.
* This allows to build 2D games, 2.5D games and full 3D games: platformers, racing games, FPS, hyper casual games. It's easy to start adding 3D objects to an existing 2D game.
* You can set up a light by adding an ambient light and/or directional light in the effects of a 3D layer. 3D objects can be configured to react to light or ignore it.
* In the future, support for 3D objects will be improved: light objects, animations, etc...
2023-05-16 17:37:49 +02:00
Florian Rival
3d043f5264 Update the GDevelop app icon on web and desktop (#5295) 2023-05-16 16:21:02 +02:00
AlexandreS
032f53e4e3 Bump newIDE version (#5293) 2023-05-16 10:34:20 +02:00
github-actions[bot]
f68ae4b8d8 Update translations [skip ci] (#5282) 2023-05-16 09:37:57 +02:00
Clément Pasteau
fa40381fb4 Fix design of login & register (#5280)
Do not show in changelog
2023-05-15 09:55:44 +02:00
Florian Rival
544b6243ba Add some tooltips in the Events Sheet (#5290) 2023-05-14 21:01:47 +02:00
supertree-wook
0a03cbb89c Add support for mouse "Forward" and "Back" buttons (#5278) 2023-05-13 16:52:30 +02:00
supertree-wook
c00d75f047 Fix typo in comments and message strings (#5287) 2023-05-12 22:20:27 +02:00
Aurélien Vivet
5dce0684f5 Fix typo (#5284)
Do not show in changelog
2023-05-12 17:47:26 +02:00
D8H
cb44999538 Fix extension refresh on a new project. (#5283)
Do not show in changelog
2023-05-12 14:12:36 +02:00
D8H
4a9de2edf3 Fix the tile map scale action (#5281)
* Operators +=, -=, *= and /= were making previews crash.
2023-05-11 18:00:52 +02:00
github-actions[bot]
8c3728f8b7 Update translations [skip ci] (#5274)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2023-05-10 10:36:09 +02:00
Clément Pasteau
212c58f67c Fix TextInput having extra margins on iOS (#5277) 2023-05-09 10:35:54 +02:00
github-actions[bot]
f5d89c66ea Update translations [skip ci] (#5271)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2023-05-04 09:22:40 +02:00
supertree-wook
8fb139ff63 Rename the readme and license files to match standard (#5272)
Do not show in changelog
2023-05-04 09:22:12 +02:00
Clément Pasteau
0c0fb5da1c Fix generated .exe not working if the project name contains special characters (#5254) 2023-05-03 11:48:17 +02:00
github-actions[bot]
65a33589c0 Update translations [skip ci] (#5251)
Co-authored-by: 4ian <4ian@users.noreply.github.com>
2023-05-02 09:37:54 +02:00
supertree-wook
7ec5a95de8 Improve bug report template on GitHub (#5261)
Do not show in changelog
2023-05-02 09:37:01 +02:00
Aurélien Vivet
26289eec99 Fix typo (#5263)
Don't show in the changelog
2023-05-02 09:36:21 +02:00
Aurélien Vivet
cc0a01bbdb Add an action to focus a text input object (#5268)
* Useful to let the player type something without having them manually clicking/touching the input on the screen.
2023-05-01 21:21:57 +02:00
supertree-wook
a0fb289aaf Update to the new forum URL in some part of the interface (#5264) 2023-04-28 13:13:55 +02:00
D8H
94045aec91 Fix typo in comments and message strings (thanks @st-Wook!) (#5262)
Co-authored-by: supertree-wook <phk09242@supertree.co>
2023-04-28 11:58:51 +02:00
supertree-wook
b70d4c54c1 Improve bug report template on GitHub (#5259)
Only show in developer changelog
2023-04-26 14:24:45 +02:00
Aurélien Vivet
f269b820fc Add 2 expressions for the Tiled Sprite to get X & Y offset of the displayed image. (#5252) 2023-04-25 10:45:59 +02:00
Clément Pasteau
f91bde1fca Limit bio and username size (#5257)
Do not show in changelog
2023-04-25 10:25:55 +02:00
AlexandreS
73ac71dadf Add possibility to open events context menu on iOS devices (#4793) 2023-04-21 16:54:26 +02:00
AlexandreS
52fcf52ecc Prevent loss of focus when editing the value of an object variable in the instance properties panel (#5247) 2023-04-21 13:39:56 +02:00
supertree-wook
55c7c4e8bf Change Bug report issue template to Github Forms (#5250) 2023-04-21 10:35:14 +02:00
github-actions[bot]
d6a15d4090 Update translations [skip ci] (#5241)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2023-04-21 09:46:29 +02:00
supertree-wook
21a87daf64 Clean markdown files and fix typos (#5248)
Only show in develop changelog
2023-04-20 16:22:46 +02:00
AlexandreS
c712ab3163 fix: Correctly detect project manager open to fix some stall guided lessons (#5246) 2023-04-20 13:34:54 +02:00
AlexandreS
6c27c3dcf8 Improve command palette on mobile (#5249) 2023-04-20 13:34:09 +02:00
AlexandreS
f8de6c2ea9 Fix resource opening on iOS and opening of urls (#5245) 2023-04-19 14:10:20 +02:00
AlexandreS
b2e8c23944 Add text field to search in wiki on home page learn section (#5243) 2023-04-19 12:29:17 +02:00
AlexandreS
bfc6a69d77 Decrease checkbox padding to have the same appearance as small icon buttons (#5242)
Don't show in changelog
2023-04-18 15:42:52 +02:00
D8H
3abf81fda2 Add a grab tool to the collision mask and points editors (#5235)
* It also fixes the Physics2 polygon editor that wasn't refreshed when dragging a vertex.
2023-04-18 12:19:43 +02:00
D8H
4caef9c7e6 Add an special object parameter to handle object creation in extensions (#5239)
* It allows extension users to apply actions to the created objects.
2023-04-18 09:55:19 +02:00
github-actions[bot]
f9edfdef72 Update translations [skip ci] (#5233)
Co-authored-by: Bouh <Bouh@users.noreply.github.com>
2023-04-17 10:13:26 +02:00
DaddyPluM
4e0e4b9184 Rename license.txt to license.md (#4783)
Don't show in the changelog
2023-04-15 16:00:16 +02:00
Clément Pasteau
908926bf73 Allow deleting your account from the profile (#5232) 2023-04-13 17:18:49 +02:00
github-actions[bot]
2ba81cc7d6 Update translations [skip ci] (#5231)
Co-authored-by: D8H <D8H@users.noreply.github.com>
2023-04-13 14:06:56 +02:00
D8H
e77e1fb840 Allow event extensions to declare variable parameters (#5220) 2023-04-13 13:48:47 +02:00
D8H
f0f47ca2f0 Set collision mask zoom bounds relatively to the default zoom (#5229) 2023-04-13 13:48:10 +02:00
github-actions[bot]
07920fda9f Update translations [skip ci] (#5230)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2023-04-13 12:20:43 +02:00
D8H
48e4447212 Add a button to report extension issues (#5224) 2023-04-13 12:19:59 +02:00
Clément Pasteau
b69dcafcc6 Improve errors when registering game with translations (#5216) 2023-04-13 12:03:08 +02:00
D8H
89e06b0801 Fix collision mask editor image border size (#5228) 2023-04-13 11:52:36 +02:00
github-actions[bot]
5e1a6eb084 Update translations [skip ci] (#5225)
Co-authored-by: D8H <D8H@users.noreply.github.com>
2023-04-13 10:22:32 +02:00
D8H
f89a48fb2c Allow to lock layers in the editor (#5226) 2023-04-13 10:18:54 +02:00
D8H
ddb65012ce Allow to copy and paste effects from one object or layer to another (#5207) 2023-04-12 10:39:11 +02:00
D8H
bb0fe0ea37 Allow to copy and paste behaviors from one object to another (#5205) 2023-04-12 10:38:27 +02:00
D8H
747cdf0243 Allow drag and drop or copy and paste of properties in the extension editor (#5222) 2023-04-11 18:14:27 +02:00
Clément Pasteau
385ec5e9ca Fix long touch not working on iOS Safari (#5223) 2023-04-11 16:45:16 +02:00
github-actions[bot]
bcbdc35d72 Update translations [skip ci] (#5221)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2023-04-11 12:10:17 +02:00
Clément Pasteau
6053369474 Rework multiple fields to have selects (#5208)
* External Layout, Animation, Effect and Effect Parameter
2023-04-11 09:25:41 +02:00
AlexandreS
ed1e0852b5 Check other scenes for conflicts when creating or manipulating global object and groups (#5215) 2023-04-11 09:09:35 +02:00
D8H
23ce46439a Show invalid resources errors in the event sheet (#5218) 2023-04-09 18:50:43 +02:00
github-actions[bot]
d9b35018e7 Update translations [skip ci] (#5200)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2023-04-07 17:38:03 +02:00
AlexandreS
571ab1313d Recompute full url to include a refreshed token (#5217)
Don't show in changelog
2023-04-07 16:55:23 +02:00
AlexandreS
aff82c4733 Add possibility to close preview window with Cmd/Ctrl + W (#5214)
- The previous announce about making this feature available was wrong
2023-04-07 12:05:59 +02:00
AlexandreS
2d4fc0af07 Update function configuration after toggling async function (#5212)
Don't show in changelog
2023-04-07 11:18:13 +02:00
AlexandreS
7cadf35642 Allow to open or download resources of a cloud project from the Resources editor 2023-04-06 10:17:21 +02:00
D8H
73e1ea5ff1 Fix missing errors when a variable name is used alone in an expression (#5203) 2023-04-05 12:01:43 +02:00
AlexandreS
bc87caf640 Handle cloud project opening errors better (#5202)
Don't show in changelog
2023-04-05 10:28:25 +02:00
Florian Rival
95dfb391c4 Revert Publish icon (#5201)
Don't show in changelog
2023-04-05 08:58:40 +02:00
AlexandreS
4b973c9655 Do not raise error if community link field is empty (#5199)
Don't show in changelog
2023-04-04 18:22:55 +02:00
Clément Pasteau
23f24a3939 Bump to 5.1.160 2023-04-04 16:47:53 +02:00
github-actions[bot]
b3ed22806b Update translations [skip ci] (#5192) 2023-04-04 16:47:02 +02:00
Clément Pasteau
4afefafc76 Fix Fling game tutorial being properly closed and restarted on the saved step (#5198) 2023-04-04 16:28:43 +02:00
Florian Rival
d2a1d8620f Handle management of subscriptions made on another platform (#5196) 2023-04-04 14:33:19 +02:00
AlexandreS
fdfc028a2c Scroll editor tabs when a new tab is activated or opened (#5194) 2023-04-04 10:22:26 +02:00
Peter Anderson
48cd42fee0 Fix Objects Panel button to show correct tooltip (#5195) 2023-04-04 09:21:09 +02:00
Clément Pasteau
b215eff444 Add more customization to the user profile (#5181)
* Community links can now be entered (Twitter, Reddit, Discord, etc...)
* Those links will be displayed on your GDevelop profile as well as your gd.games profile page!
2023-04-03 16:17:21 +02:00
AlexandreS
1bf66a97ae Improve the UI of the alert messages so that they are more noticeable (#5186) 2023-04-03 11:59:43 +02:00
github-actions[bot]
cc6890a495 Update translations [skip ci] (#5182)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2023-03-31 14:04:32 +02:00
AlexandreS
418dd834c0 Fix attempt: Check cloud project before sending it to avoid corrupt cloud project (#5183) 2023-03-31 13:45:45 +02:00
D8H
e52faae332 Test the create action picking (#5178)
* Useful for dev only
2023-03-31 13:27:34 +02:00
Clément Pasteau
31809fdf61 Add missing types (#5184)
Do not show in changelog
2023-03-31 12:32:50 +02:00
AlexandreS
17504c1713 Add possibility to revert cloud project to last sane version (#5180) 2023-03-31 11:25:15 +02:00
github-actions[bot]
e29b79fdc9 Update translations [skip ci] (#5172)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2023-03-31 11:23:40 +02:00
Clément Pasteau
b0009cc999 Fix too many aliases for analytics (#5177)
Do not show in changelog
2023-03-31 11:12:57 +02:00
Clément Pasteau
384eb2b8ee Add sounds packs category on the asset store (#5179) 2023-03-30 14:39:20 +02:00
AlexandreS
5fa0627218 Randomize private asset packs in asset home (#5176)
Don't show in changelog
2023-03-30 11:11:15 +02:00
D8H
e66660d2df Fix the creation of a new frame with the image editor when the animation doesn't have a name (#5175)
* Don't show in changelog
2023-03-29 12:32:25 +02:00
Clément Pasteau
df6320c39f Display lessons on Learn section on mobile (#5174)
Do not show in changelog
2023-03-29 10:44:25 +02:00
D8H
ca667c02be [Tilemap] Fix collision name between tilemap object and collision mask object (#5173)
* Projects that use actions and conditions of the wrong object should still work. To fix the red underling of object names, actions for the right object can now be selected.
2023-03-29 10:00:18 +02:00
AlexandreS
62d0754b33 Update properties panel after paste or duplication of instances (#5171) 2023-03-28 15:36:17 +02:00
Clément Pasteau
4c4ca0d202 Try to fix providers crashing the app if services return an unexpected response (#5170)
Do not show in changelog
2023-03-28 13:08:37 +02:00
github-actions[bot]
5c68d117c6 Update translations [skip ci] (#5168)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2023-03-28 11:51:21 +02:00
AlexandreS
21b9ae47ab Update icons bis (#5169)
Don't show in changelog
2023-03-28 11:33:07 +02:00
D8H
e8687119c9 Fix errors not being displayed in expressions when an object or a behavior doesn't exist (#5146)
* GDevelop will now warn when an object (or group of objects) written in an expression is misspelled or does not exist in the scene.
2023-03-27 13:55:23 +02:00
D8H
9c09e26aaa Fix the Not condition to handle its last sub condition correctly (#5074) 2023-03-27 13:29:27 +02:00
Tristan Rhodes
c223abad60 Add property a property to particle to "Jump the emitter forward in time" when it's created (#5039)
* This works like the action of the same name, and allow newly created particle emitters to act as if they were emitting since a bit of time - useful when starting a scene for example to avoid seeing the initial particles being emitted.
2023-03-27 13:27:03 +02:00
github-actions[bot]
769de55317 Update translations [skip ci] (#5166)
Co-authored-by: D8H <D8H@users.noreply.github.com>
2023-03-27 13:22:37 +02:00
Clément Pasteau
0dfe765ae1 Increase allowed time to load the game in memory on Android before failing (#5110)
* This should help old or constrained devices to better run large games.
2023-03-27 13:21:50 +02:00
D8H
b94ce2b20d When renaming or removing an object, only refactor associated external events (#5155)
* The editor used to refactor every events that were used in the object layout even if they were associated to another layout which could result to errors.
2023-03-27 12:55:00 +02:00
Infokub
89eb61b4a6 Add a new expression to get the maximum of an inventory item (#5126) 2023-03-26 13:28:05 +02:00
Florian Rival
32ba55e726 Delete .devcontainer
Outdated and not working well

Don't show in changelog
2023-03-26 13:16:40 +02:00
Infokub
844ac23666 Add a warning about installing an extension from the store if it replaces an extension manually created (#5111) 2023-03-26 12:38:46 +02:00
github-actions[bot]
657036384d Update translations [skip ci] (#5161)
Co-authored-by: 4ian <4ian@users.noreply.github.com>
2023-03-24 19:21:52 +01:00
Florian Rival
b13ce5b17c Fix shape painter anti-aliasing select labels
Don't show in changelog
2023-03-24 18:30:12 +01:00
Clément Pasteau
8f0f5a5bc5 Fix the behavior fields crashing the app when edited inline in the Events Sheet (#5162) 2023-03-24 18:23:49 +01:00
AlexandreS
d23a064ca2 Update icons everywhere possible (#5160)
Don't show in changelog
2023-03-24 17:25:52 +01:00
github-actions[bot]
3b0dc66046 Update translations [skip ci] (#5159)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2023-03-24 17:00:00 +01:00
Clément Pasteau
356bde650b Improve selection of a Scene in an instruction with a drop-down list (#5154) 2023-03-24 16:27:38 +01:00
github-actions[bot]
6d25496f89 Update translations [skip ci] (#5157)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2023-03-24 16:19:39 +01:00
Oxey405
dfeeb864a5 Allow setting anti-aliasing on shape drawer (#4509)
* defaulted to "none", it allows 3 anti-aliasing options, from "low" to "high" increasing quality of the drawings.
2023-03-24 16:19:07 +01:00
Clément Pasteau
25c36d26db Fix drag preview causing a request without Origin (#5158)
* This request can be cached by Chrome and causing CORS issues for following requests.
2023-03-24 16:02:05 +01:00
Arthur Pacaud
36721c63e0 Improve various aspects of the Firebase extension (#5125)
* Update Firebase SDK to v8.10.0
* Fix small firebase usability issues
* Fix tracer stopping
* Fix a crash when using tracers
* Add password reset action to authentication
2023-03-24 15:32:10 +01:00
github-actions[bot]
69cd89ddb8 Update translations [skip ci] (#5153)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2023-03-23 18:27:22 +01:00
AlexandreS
2db4b54986 Add Algolia search results from the wiki to the command palette (#5148) 2023-03-23 16:31:58 +01:00
D8H
303a4d20ed Fix the default image name suggested to Piskel when the animation name is empty (#5152)
* The resource name was given with the extension which resulted to a file names with twice the extension.
2023-03-23 15:38:42 +01:00
Clément Pasteau
a09bfafd26 Improve guided lessons so they can be done on mobile (#5143) 2023-03-23 15:02:13 +01:00
github-actions[bot]
822329af63 Update translations [skip ci] (#5149)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2023-03-23 11:58:44 +01:00
Florian Rival
0b90e17307 Adapt the rendering of reference document to Markdown for the new wiki (#5112)
Don't show in changelog
2023-03-23 11:43:57 +01:00
github-actions[bot]
00817b4393 Update translations [skip ci] (#5140)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2023-03-22 11:26:46 +01:00
Clément Pasteau
2a5bbcb8d4 Add new guided lesson: Timer (#5144) 2023-03-22 11:05:41 +01:00
github-actions[bot]
7f03579855 Update translations [skip ci] (#5136)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2023-03-21 12:12:30 +01:00
Clément Pasteau
c7e42d1e88 Improve the selection of a layer in an instruction (#5119)
* The layer selection is now done via a dropdown by default, with the possibility to switch to an expression
2023-03-21 12:11:45 +01:00
AlexandreS
e3fd91681c Fix: Upgrade shifty to 2.20.4 to prevent tweens to be applied when a scene is resumed (#5139) 2023-03-21 11:07:24 +01:00
Clément Pasteau
c8392332c7 Block auto-translate tools to avoid unfixable crashes with React (#5138) 2023-03-21 10:12:41 +01:00
Clément Pasteau
14d7dafb79 Fix wrong props (#5137)
Do not show in changelog
2023-03-21 09:26:05 +01:00
Clément Pasteau
373d5e14b8 New guided lesson: Joystick (#5135) 2023-03-20 17:56:32 +01:00
github-actions[bot]
8b89896082 Update translations [skip ci] (#5133)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2023-03-20 17:50:01 +01:00
D8H
e7d213534e Revert: Report errors in expressions when an object or a behavior doesn't exist (#5118) (#5134)
Do not show in changelog
2023-03-20 15:08:40 +01:00
D8H
859b1d0a1c Refactor events when project elements are renamed (#5031)
* Project elements are: scenes, external layouts, external events, layers, layer effects, object effects, sprite animations and sprite points.
2023-03-20 12:02:36 +01:00
Clément Pasteau
2b6a14c612 Bump version to 5.1.159 (#5121) 2023-03-20 10:56:22 +01:00
github-actions[bot]
07051017b9 Update translations [skip ci] (#5131)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2023-03-20 10:51:29 +01:00
Clément Pasteau
0d5f238c75 Increase drag preview on touch screens (#5132)
Do not show in changelog
2023-03-20 10:43:45 +01:00
D8H
936c75b4ed Round dragged points and collision masks vertices of sprites (#5124) 2023-03-20 10:20:59 +01:00
AlexandreS
8d1bdfed25 Add possibility to scroll editor tabs horizontally with the mouse wheel (#5130) 2023-03-20 10:05:26 +01:00
github-actions[bot]
440205531f Update translations [skip ci] (#5123)
Co-authored-by: D8H <D8H@users.noreply.github.com>
2023-03-20 09:28:04 +01:00
D8H
8f45642a25 Fix the "pick all" and "pick a random" conditions when they are used in functions (#5128) 2023-03-19 13:24:24 +01:00
D8H
1e6ca8c403 Fix a regression on extension loading (#5127)
* Don't show in changelog
2023-03-19 13:23:42 +01:00
D8H
113e329d7a Fix a collision mask compatibility issue with a breaking change of Tiled 1.10 (#5122)
* Handle the "type" attribute as an alias of "class".
2023-03-17 19:22:03 +01:00
D8H
48ae688873 Report errors in expressions when an object or a behavior doesn't exist (#5118) 2023-03-17 15:24:24 +01:00
Clément Pasteau
fe77180748 Improve preview of dragged items (#5076)
* This is valid for Groups & Objects, and allows seeing the item while dragging on the canvas
* This also allows having a preview visible on touchscreens while dragging an item with your finger
2023-03-17 12:07:12 +01:00
D8H
48b88b9d92 Add tests on loop events and boolean operator conditions (#5117)
* Show in developer logs only
2023-03-16 18:12:32 +01:00
D8H
f57a8bc6cd Fix behaviors that were staying in the list after switching of project with an extension tab opened (#5102) 2023-03-16 18:10:36 +01:00
Clément Pasteau
1b827eb67b Always scroll to the newly created items across the app (#5114)
* This allows always seeing the element that was just added
* Works for Object/Group/Behavior/Effect/Animation/Function
2023-03-16 15:24:13 +01:00
github-actions[bot]
c3521db5ba Update translations [skip ci] (#5108)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2023-03-16 15:11:23 +01:00
Clément Pasteau
b51e47233e Remove some unnecessary dismissable info messages (#5115)
Do not show in changelog
2023-03-16 14:58:54 +01:00
github-actions[bot]
1bf9d3c432 Update translations [skip ci] (#5106)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2023-03-14 18:30:48 +01:00
Clément Pasteau
1c47d12033 Allow opening any guided lesson from the URL (#5107)
Do not show in changelog
2023-03-14 18:30:14 +01:00
Clément Pasteau
1250060848 Rework sprites list to make button sticky and improve mobile view (#5096) 2023-03-14 18:03:25 +01:00
AlexandreS
4712c3d9ef Add new guided lesson about how to add a health bar prefab (#5095) 2023-03-14 17:02:21 +01:00
Clément Pasteau
56cf1cf18f Allow opening instance properties from instance right click on canvas (#5105) 2023-03-14 16:09:22 +01:00
github-actions[bot]
0427766b9d Update translations [skip ci] (#5094)
Co-authored-by: D8H <D8H@users.noreply.github.com>
2023-03-14 15:18:18 +01:00
D8H
8cf20cdef2 [Tilemap] Fix the tile map resource property of the collision mask object to accept tilemap resources in addition to json ones (#5101) 2023-03-13 15:55:53 +01:00
D8H
b3f74a3e9b Keep example templates list order (#5103)
* Don't show in changelog
2023-03-13 15:04:44 +01:00
Clément Pasteau
38f15503e9 Improve Scene canvas interactions (#5072)
* Increase canvas FPS to 60 when interacting
* Reduce FPS to 10 when not using the canvas
* This should make the editor feel smoother when used, as well as save battery life when not using it!
* Also detect pinch zoom for trackpads
2023-03-10 18:09:51 +01:00
AlexandreS
47f15f6881 Keep scroll when navigating from page to page in the asset store (#5092) 2023-03-10 17:39:48 +01:00
Clément Pasteau
b0c8bf9625 Fix audio pack url download (#5093)
Do not show in changelog
2023-03-10 17:09:26 +01:00
github-actions[bot]
089c774ad6 Update translations [skip ci] (#5086)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2023-03-10 14:10:37 +01:00
Clément Pasteau
a2ca532749 Add new guided lesson: Camera Parallax (#5090) 2023-03-10 14:01:14 +01:00
AlexandreS
a6e7dd6160 Add possibility to close preview window with Cmd/Ctrl + W (#5088) 2023-03-10 11:33:55 +01:00
D8H
7b6f3c029d [Platformer] Fix horizontal speed losses when characters land or jump from a slope (#5077)
* It fixes a regression that was introduced in the 5.0.139 release.
2023-03-10 11:24:30 +01:00
D8H
6c31056be4 Fix the touch end condition to detect a touch that ends because the device can't handle more touches (#5079) 2023-03-09 17:39:29 +01:00
D8H
2f8287b017 Fix a white flash when opening a project with a tile map (#5084)
* Also allow atlas images to be bigger than expected as some artists extend them to add their names. The error was aiming to help to understand that rescaled atlas will not work without changing the tiles size, but artifacts can actually help figuring this out.
2023-03-09 16:31:55 +01:00
github-actions[bot]
0ef4012b03 Update translations [skip ci] (#5067)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2023-03-09 14:38:35 +01:00
Clément Pasteau
438d70e8ba Fix identifying correctly non auth users (#5085)
Do not show in changelog
2023-03-09 14:34:08 +01:00
AlexandreS
04214abc85 Update layers list when scene editor becomes active again (#5083)
Don't show in changelog
2023-03-09 12:21:29 +01:00
AlexandreS
32fa646e47 Better synchronize object groups between layout and external layout
- Also, in the project resources tab, refresh image preview when checking or unchecking the smooth image option.
2023-03-09 11:46:48 +01:00
AlexandreS
78952816b9 Fix: Change selected layer when it's removed (#5082) 2023-03-09 11:37:39 +01:00
Clément Pasteau
6057496ff8 Fix search results crashing if auto-translate is activated (#5081)
Do not show in changelog
2023-03-09 11:19:06 +01:00
AlexandreS
76f1832b4e Remove hard-coded color (#5075)
Don't show in changelog
2023-03-08 16:27:36 +01:00
Tristan Rhodes
d8e1c1ee8a Update wording for the "Create package for Android" button so that it is clearer (#5069) 2023-03-08 09:15:17 +01:00
D8H
3de8ec0759 Fix the unsupported instructions when a function is renamed (#5062)
* Extension creators no longer need to switch tabs to refresh the extension.
2023-03-07 16:28:05 +01:00
Arthur Pacaud
de3d5e6583 Update P2P hints/explanations shown in the editor (#5004)
* Add a mention to THNK as a multiplayer framework to try.
2023-03-07 16:06:17 +01:00
github-actions[bot]
a772c7baa9 Update translations [skip ci] (#5066)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2023-03-07 15:54:26 +01:00
Clément Pasteau
5730fcb611 Send additional info to analytics (#5061)
Do not show in changelog
2023-03-07 15:47:06 +01:00
Clément Pasteau
b601e94791 Add first mini guided lesson, Plinko Multiplier (#5051)
* This is the first lesson of many, with the goal of covering multiple game creation concepts
* The lessons are available in the Learn or Get Started sections of the homepage
* This lesson can be finished in just a few minutes, directly inside the app
* In this first lesson, we go through improving the score of a game, through variables
2023-03-07 14:51:50 +01:00
github-actions[bot]
b7bf4ea62b Update translations [skip ci] (#5064)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2023-03-07 12:52:47 +01:00
AlexandreS
46466d5c11 Warn user when adding an instance to a layer that is not visible (#5063) 2023-03-07 11:56:25 +01:00
github-actions[bot]
1892dc09c3 Update translations [skip ci] (#5057)
Co-authored-by: D8H <D8H@users.noreply.github.com>
2023-03-06 10:03:52 +01:00
AlexandreS
e5a710d7d5 Fix offset between image and container for small images (#5056)
Don't show in changelog
2023-03-03 15:24:51 +01:00
D8H
561e18a044 Fix extension renaming (#5054)
* Behaviors of the extension with the old name no longer stay in the list.
2023-03-03 15:23:41 +01:00
github-actions[bot]
fb9c29af52 Update translations [skip ci] (#5048)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2023-03-02 18:04:44 +01:00
AlexandreS
dade3483be Fix points preview to give priority to selected point when dragging a point (#5049)
Co-authored-by: D8H <Davy.Helard@gmail.com>
2023-03-02 16:54:38 +01:00
AlexandreS
05e6c41ed3 Add possibility to select layer on which instances will be added by default (#5046) 2023-03-02 16:04:13 +01:00
Florian Rival
cd6a400fcb Fix filters panel always opening on small screens (#5047)
* Also fix a confusing warning message when opening link in a markdown text (like in the changelog or in the tutorials) on mobile with unsaved changes in the project.
2023-03-02 15:33:14 +01:00
AlexandreS
b648ecba45 Add color to example difficulty tag (#5045) 2023-03-02 15:31:55 +01:00
github-actions[bot]
681636a74a Update translations [skip ci] (#5041)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2023-03-02 09:25:51 +01:00
AlexandreS
d4e8a7a314 Display asset packs from the same creator when viewing a premium asset pack (#5044) 2023-03-01 17:25:52 +01:00
AlexandreS
56ed187eba Bump newIDE version (#5040) 2023-03-01 13:16:47 +01:00
AlexandreS
6c26d69a7b Prevent in app tutorial tooltip from overflowing (#5043)
Don't show in changelog
2023-03-01 13:13:52 +01:00
D8H
b2d13077a8 Fix the position of pasted object instances to always appear on screen (#5020) 2023-03-01 11:52:49 +01:00
D8H
399d9c2c14 Add an action to include or exclude a child from its parent collision mask (#5000)
* This is useful for custom objects.
2023-03-01 11:51:25 +01:00
D8H
1d5bb98233 Allow extensions to define measurement units (#5010) 2023-03-01 11:23:31 +01:00
Florian Rival
e6c0c23789 Move the filter button and panel in the assets store (#5038)
Don't show in changelog
2023-03-01 11:18:19 +01:00
github-actions[bot]
33ce33215b Update translations [skip ci] (#5034)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2023-03-01 10:11:41 +01:00
AlexandreS
8f547c63b2 Add support for premium asset pack that contains audio only (#5036)
- Also supports asset pack that contains sprites and audio and gives possibility to download the audio of the pack
2023-03-01 09:49:33 +01:00
Florian Rival
4ac404ccfc Fix homepage layout shifts at loading (#5035)
* This makes the opening of GDevelop less "jumpy".
2023-02-28 18:08:34 +01:00
Florian Rival
f04ebc0e19 Allow usage of toolbar buttons to add an event or a sub-event when an action or a condition is selected (#5032) 2023-02-28 12:22:35 +01:00
Clément Pasteau
ebabcd0ddc Fix font for lists and menu padding (#5033)
Do not show in changelog
2023-02-28 11:13:12 +01:00
github-actions[bot]
afc279dd8a Update translations [skip ci] (#5021)
Co-authored-by: 4ian <4ian@users.noreply.github.com>
2023-02-28 10:23:27 +01:00
D8H
5bd8da0b75 Pass a context to the top-down movement hook methods (#5023)
* Don't show in changelog
2023-02-28 10:17:13 +01:00
Tristan Rhodes
3195813a0b Update nightly build links in documentation to 5.1 (#5030) 2023-02-27 17:39:54 +01:00
Florian Rival
de28cebb67 Fix warnings
Don't show in changelog
2023-02-27 15:10:26 +01:00
Florian Rival
d0038ce536 Highlight the icons of the opened editors in the toolbars (#5027) 2023-02-27 14:16:40 +01:00
D8H
60c0a0c1a8 Adapt the events of a behavior when it is copied from one extension to another (#4812) 2023-02-27 12:42:49 +01:00
Clément Pasteau
1df03601f8 Update extension icons (#5029)
Do not show in changelog
2023-02-27 11:29:40 +01:00
AlexandreS
474b6b6d9d Image preview fixes (#5028)
Don't show in changelog
2023-02-27 11:12:10 +01:00
Florian Rival
c1fad4c123 Fix variables sometimes overflowing out of the screen on small screens 2023-02-25 23:48:05 +01:00
D8H
9690f1f195 Fix instance selection box buttons margin (#5022) 2023-02-25 11:02:37 +01:00
D8H
0eabd5aed3 Fix the instance duplication to occur only when they are dragged (#5018) 2023-02-24 20:30:32 +01:00
Florian Rival
e0e7037dd8 Improve colors and design of the panels in the editors 2023-02-24 19:15:20 +01:00
AlexandreS
412dc0b4ea Improve zoom on the points and collision masks editors 2023-02-24 18:53:12 +01:00
github-actions[bot]
111c6eb014 Update translations [skip ci] (#5012)
Co-authored-by: D8H <D8H@users.noreply.github.com>
2023-02-24 18:15:43 +01:00
Florian Rival
1f0f62099b Fix parameters of an extension function overflowing on small screens 2023-02-24 18:14:41 +01:00
D8H
ea10467062 Fix Control and Shift handling in the instances editor (#5016) 2023-02-24 17:53:17 +01:00
Florian Rival
a6dac96db1 Adapt title sizes for small screens or small windows (#5017) 2023-02-24 17:00:53 +01:00
D8H
b8de8d4f15 Add missing group icons on the conditions and actions list (#5014) 2023-02-24 14:34:05 +01:00
Daniel R
d25cad5aaf Add shortcut (Ctrl+D or Cmd+D) to duplicate selected instance(s) on the scene editor (#5011) 2023-02-24 13:04:09 +01:00
D8H
f0583df184 Fix the note of the generated extension reference pages (#5013)
* Don't show in changelog
2023-02-24 12:47:27 +01:00
Arthur Pacaud
8d25904462 Allow to wait for Filesystem actions to finish before continuing the actions/sub-events following it (#5001)
* This means the Filesystem actions can optionally be set as being "waited for", like the "Wait X seconds" action.
2023-02-24 11:47:42 +01:00
github-actions[bot]
9e9db1fc4c Update translations [skip ci] (#5007)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2023-02-24 09:50:35 +01:00
Clément Pasteau
9047b5a4ec Improve objects panel design (#4997)
* Add button is more accessible, as well as search bar
* Slightly improve font-size and margins to fit more objects
* Also improve all listings in the app (Groups, Resources, Extensions objects)
2023-02-24 09:25:22 +01:00
Tristan Rhodes
4dbe90b9a2 Added new action "Jump emitter forward in time" (#4985)
* This is particularly useful to let emitters create lot of particles first then continue at a slower rate
2023-02-24 09:07:54 +01:00
Clément Pasteau
73b88b7d5e Activate gdevelop logo by default, with Watermark (#5009)
Do not show in changelog
2023-02-23 15:47:15 +01:00
D8H
e8bc3b7ee8 Allow JavaScript extensions to customize the top-down movement behavior (#4999)
* Only for developers
2023-02-23 14:34:20 +01:00
Clément Pasteau
baa3cad99a Remove yarn lock to avoid maintaining 2 lock files (#5008)
Do not show in changelog
2023-02-23 11:38:35 +01:00
Clément Pasteau
f477af7c6b Improve object dialog to display a warning if canceling after any change (#4989) 2023-02-23 11:22:52 +01:00
AlexandreS
f8cedfd357 Performance: Slightly reduce number of requests to server at app opening (#4990) 2023-02-23 10:45:30 +01:00
github-actions[bot]
1021447b02 Update translations [skip ci] (#5006)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2023-02-23 09:40:28 +01:00
Clément Pasteau
7567584ecd Fix yml indentation (#5005)
Do not show in changelog
2023-02-23 09:29:34 +01:00
Clément Pasteau
90f75fba42 Use Node16 for translations update to avoid package lock conflict (#5003)
Do not show in changelog
2023-02-22 17:33:38 +01:00
Florian Rival
fcc35f4e3c Fix outdated package-lock.json
Don't show in changelog
2023-02-22 14:28:29 +01:00
Florian Rival
01a7c48864 Don't show the Get Started page if the screen is too small when launching the app (#5002) 2023-02-22 14:21:27 +01:00
github-actions[bot]
be6a7753cf Update translations [skip ci] (#4966)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2023-02-21 18:23:37 +01:00
D8H
3b1e0a5750 Show function-related actions, conditions and expressions only when editing a function (#4992) 2023-02-21 18:23:01 +01:00
Clément Pasteau
4d2fd4752f Force node version 16 for storybook (#4996)
Do not show in changelog
2023-02-21 18:20:26 +01:00
Clément Pasteau
8e00e9615e Fix tutorial tooltip being translated and causing a crash on web (#4995) 2023-02-21 17:04:55 +01:00
D8H
68253017ee Add autocompletion for repeat events (#4993) 2023-02-21 16:01:51 +01:00
Florian Rival
35c91f6f99 Fix crash when closing a project after unsaved changes (#4994) 2023-02-21 14:55:11 +01:00
AlexandreS
803559fad8 Upgrade storybook (#4991)
Don't show in changelog
2023-02-21 12:14:29 +01:00
AlexandreS
e85229d38e Drag project manager items using icon and not label (#4988) 2023-02-20 16:51:54 +01:00
Clément Pasteau
e7381a7229 Simplify slug management so that is reads the cache value (#4973)
Do not show in changelog
2023-02-20 15:20:04 +01:00
D8H
257ba78486 Allow event-based objects to define a rotation center point (#4910)
* It will allow sliders to work vertically.
2023-02-20 11:55:53 +01:00
Aurélien Vivet
fb3d821368 Add a value range (#4877)
Don't show in changelog
2023-02-20 11:45:15 +01:00
Aurélien Vivet
a5068d8fcf Add a line about Silver plan unlocking the watermark & GD logo when the game loads. (#4979) 2023-02-20 10:58:22 +01:00
Florian Rival
d20b3228cf Fix Debugger crashing when GDevelop logo was enabled (#4980) 2023-02-19 19:29:06 +01:00
D8H
aae54ef331 Link the extension installation page on every extension page (#4974) 2023-02-18 16:07:20 +01:00
AlexandreS
caa5105651 Improve some things on mobile (#4971)
Don't show in changelog
2023-02-17 12:50:07 +01:00
Florian Rival
5eccdde332 Allow authentication to player accounts using an iframe in some exceptional cases (#4968)
Don't show in changelog
2023-02-17 11:49:23 +01:00
AlexandreS
c34d758ccf Fix display of Social network share buttons on mobile (#4969)
Don't show in changelog
2023-02-16 18:29:59 +01:00
AlexandreS
4e57d6aee9 Do not display importing resources dialog full screen (#4967)
Don't show in changelog
2023-02-16 16:52:00 +01:00
AlexandreS
74d208f736 Allow export dialog to only have the online web export (#4965)
Don't show in changelog
2023-02-16 16:19:10 +01:00
github-actions[bot]
d88b76becf Update translations [skip ci] (#4938)
Co-authored-by: D8H <D8H@users.noreply.github.com>
2023-02-16 15:49:51 +01:00
D8H
4a0e2481e6 Fix author chips wrapping on small screens (#4943) 2023-02-16 12:59:25 +01:00
D8H
612b041da4 Add tags for the code size and difficulty level of examples (#4958) 2023-02-16 11:16:56 +01:00
AlexandreS
3df7cd8e80 Add check on project file content existence at opening (#4961)
Don't show in changelog
2023-02-16 11:01:32 +01:00
AlexandreS
7ba96ed0ab Use safe area only on portrait (#4962)
Don't show in changelog
2023-02-15 19:17:18 +01:00
AlexandreS
689cd14947 Use device orientation to define default scene editor layout (#4960) 2023-02-15 17:55:10 +01:00
AlexandreS
de50dc7967 Use safe area to correctly display a few elements (#4959)
Don't show in changelog
2023-02-15 15:39:58 +01:00
Florian Rival
1aa2afaf85 Fix "Insert new..." menu option not doing anything if objects list was closed 2023-02-15 11:58:28 +01:00
Clément Pasteau
9120a52a08 Rename Liluo.io to gd.games (#4954) 2023-02-14 17:42:46 +01:00
AlexandreS
b0ffaebe91 Fix subscription diamond svg not displaying on Safari and Firefox (#4948)
Don't show in changelog
2023-02-14 16:09:34 +01:00
D8H
64a4a0b3a1 Add a tool to count the number of instructions of examples (#4952)
* Only show in "Internal changes" changelog
2023-02-14 15:52:53 +01:00
AlexandreS
cdfd7a7ab1 Autotranslate improvements (#4951)
Don't show in changelog
2023-02-14 14:08:57 +01:00
Florian Rival
a944ac43db Update README
Don't show in changelog
2023-02-14 12:40:59 +01:00
Clément Pasteau
b7a1a96e7b Update storybook urls (#4949)
Do not show in changelog
2023-02-14 09:54:02 +01:00
Clément Pasteau
29d71796cc Remove unused ravenjs (sentry) (#4940)
Do not show in changelog
2023-02-13 16:41:28 +01:00
AlexandreS
78a1361897 Use form in account related actions to simplify mobile experience (#4917)
Don't show in changelog
2023-02-13 14:27:05 +01:00
AlexandreS
e340784ad6 Prevent google translate issue (#4937)
Don't show in changelog
2023-02-13 14:22:08 +01:00
github-actions[bot]
511466f0b8 Update translations [skip ci] (#4909)
Co-authored-by: 4ian <4ian@users.noreply.github.com>
2023-02-13 10:39:08 +01:00
Florian Rival
3f4e372acb Fix check of subscriptions
Don't show in changelog
2023-02-10 17:01:18 +01:00
D8H
a73a92d748 Fix tile map loading for collision mask objects (#4916) 2023-02-10 15:52:06 +01:00
AlexandreS
6e131d8a17 Display asset pack categories in asset store homepage (#4905) 2023-02-10 14:57:24 +01:00
D8H
9ac4c021e0 Fix the number parameter color in the events (#4915) 2023-02-10 11:37:38 +01:00
AlexandreS
a1fbf91ac7 Add Eye icon to switch password visibility (#4914) 2023-02-09 17:16:13 +01:00
Clément Pasteau
3f8d01e25e Improve subscription messages when a redeem code has been used (#4912) 2023-02-09 16:56:54 +01:00
AlexandreS
03b4170d74 Fix resource store display for extension icon (#4913)
Don't show in changelog
2023-02-09 15:34:13 +01:00
AlexandreS
0146ad9c38 Add error boundary at the app level (#4911)
Don't show in changelog
2023-02-09 12:19:26 +01:00
Clément Pasteau
fbb23f86cd Rename and add more actions, conditions and expressions to manipulate array variables (#4904) 2023-02-08 16:53:57 +01:00
github-actions[bot]
1fdaeea4f8 Update translations [skip ci] (#4893)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2023-02-08 11:21:06 +01:00
Clément Pasteau
32b97f2c40 Improve search accuracy in the app (instructions, examples, objects, tags) (#4906)
* Use tokenized search to improve search with multiple words looking into multiple keys (ex: name & description)
2023-02-08 09:41:27 +01:00
AlexandreS
d61f8336a8 Fix firebase extension tests (#4907)
Don't show in changelog
2023-02-07 17:11:16 +01:00
Clément Pasteau
3448cd57fe Allow showing an alertMessage without an icon (#4903) 2023-02-06 16:41:55 +01:00
Clément Pasteau
b7333612aa Prompt for email verification when logging in or signing up (#4898) 2023-02-06 11:45:32 +01:00
Aurélien Vivet
de82182b37 fix typo (#4899)
Do not show in changelog
2023-02-06 08:47:53 +01:00
Clément Pasteau
a8177b0e6f Upgrade electron-builder (#4892)
* This should fix the auto-updater uninstalling GDevelop without re-installing it on Windows, if installed "for all users"
2023-02-03 13:48:43 +01:00
AlexandreS
9716ff14ed Fix: Use correct default values for effects with color parameters (#4891) 2023-02-03 12:06:26 +01:00
Clément Pasteau
f0e1d7a6d9 Bump to 5.1.157 (#4886)
Do not show in changelog
2023-02-02 15:48:45 +01:00
github-actions[bot]
dd89562405 Update translations [skip ci] (#4887)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2023-02-02 15:48:29 +01:00
Clément Pasteau
f0e56c4513 Update tutorials for offline use (#4888)
Do not show in changelog
2023-02-02 15:47:59 +01:00
Clément Pasteau
ad2ea0abb8 Improve search accuracy for conditions and actions (#4885) 2023-02-02 15:38:42 +01:00
D8H
7ff71ea11f Make the button to open condition/action extensions easier to see (#4884) 2023-02-02 15:35:01 +01:00
github-actions[bot]
cd1d82f7ee Update translations [skip ci] (#4839)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2023-02-02 15:34:09 +01:00
Clément Pasteau
0724b7d113 Move save to toolbar (#4883)
Do not show in changelog
2023-02-02 15:26:26 +01:00
Clément Pasteau
c58ea73631 Upgrade AdMob extension (#4881)
* Updated internal Google Ads SDK version
* Added "App open" ads
* Added "Rewarded Interstitial" ads
2023-02-02 13:03:41 +01:00
Arthur Pacaud
b1039c6146 Add support for asynchronous actions in extensions in the editor (#4819)
* By marking an action as asynchronous, the actions and sub-events following it will wait for it to end. This is similar to the "Wait X seconds" action.
* Don't forget to use the action *"End asynchronous function"* in the events to mark the end of the action. Otherwise, the action will never end.
2023-02-02 12:30:17 +01:00
D8H
1b5acc9fa9 Fix the instruction group of event functions with operator (#4882) 2023-02-02 11:38:16 +01:00
Clément Pasteau
54cf91f180 Display new objects in the New Object Dialog (#4871)
* Buttons
* Toggles, Switches and Sliders
* Multitouch Joysticks
* Health and loading bars
* (Those objects were previously available through the asset store and are now visible when creating an object from scratch)
2023-02-02 11:27:49 +01:00
D8H
a434e4d9a9 Add a button to jump to behavior events (#4878)
---------

Co-authored-by: Florian Rival <Florian.Rival@gmail.com>
2023-02-02 10:45:36 +01:00
Florian Rival
2f339dd170 Add a save icon button to the top left next to the app main menu 2023-02-01 22:33:07 +01:00
Florian Rival
e843ca67ad Update comment [skip ci]
Don't show in changelog
2023-02-01 15:32:30 +01:00
Florian Rival
e4286b2021 Show expiration date and clearer explanations when using a redemption code (#4879) 2023-02-01 09:37:45 +01:00
Florian Rival
4579568866 Fix formatting and improve namings
Don't show in changelog
2023-02-01 09:35:14 +01:00
Florian Rival
4543a03530 Render the grid of the scene in realtime when a change is made to the grid setup (#4880) 2023-02-01 09:26:33 +01:00
Florian Rival
5aed25a02f Hide labels from buttons to add objects (or other items) when a list is too narrow
Don't show in changelog
2023-01-31 22:16:09 +01:00
Florian Rival
6fd9cfe4c3 Fix Events Sheet crashes and inconsistent order or location of pasting (#4876)
* Fix extracting events to a function or to a group crashing sometimes the app
* Also ensure events are copied/pasted or moved in their order of selection
* Events or actions/conditions are now only pasted at a single location
  * We previously allowed pasted events/actions/conditions to be inserted multiple times for each selected event, but this was more confusing than useful.
  * Now, the pasted elements are only pasted on the last selected event/action/condition (usually the one you just right clicked)
2023-01-31 17:56:35 +01:00
D8H
091324d93b Add a condition to check if the player has just closed the leaderboard view (#4875) 2023-01-31 15:16:28 +01:00
D8H
d802bd14b9 Add an action to hide the player login banner (#4874) 2023-01-31 12:55:12 +01:00
D8H
f46a6dc421 Optimize the z-order action (#4868)
- Scenes should be faster to load
- Games that y-sort a lot of moving objects should run much faster.
2023-01-30 13:29:50 +01:00
Florian Rival
b09e783b06 Remove help buttons for each accordion in the editor of a custom object
Don't show in changelog
2023-01-30 12:43:27 +01:00
Florian Rival
e2a050b717 Reduce size of text alignment icons 2023-01-30 12:41:32 +01:00
Florian Rival
ae22d1b876 Fix warning
Don't show in changelog
2023-01-28 17:26:34 +01:00
Florian Rival
9e6e7166ef Allow to retry uploading a file that failed to be uploaded
Don't show in changelog
2023-01-28 16:56:29 +01:00
Florian Rival
22c71a8aef Fix regression in font loading
Don't show in changelog
2023-01-27 19:32:08 +01:00
Florian Rival
4908c84494 Adapt loading of resources to allow a token instead of a cookie (#4870)
Don't show in changelog
2023-01-27 18:11:39 +01:00
AlexandreS
e4f44f7899 Add possibility to display GDevelop watermark that opens Liluo creator page on click/touch (#4811) 2023-01-24 18:26:39 +01:00
AlexandreS
c441610123 Improve in app tutorial element highlighting (#4865)
Don't show in changelog
2023-01-24 17:48:55 +01:00
D8H
d724712aa4 Fix direction actions on Sprites after an animation change with custom origin (#4860)
* Impacted actions are "Turn toward a position" and "Add a force toward a position".
2023-01-24 15:04:36 +01:00
Florian Rival
08fc7d3e9f Fix typos in description of StartedTouchOrMouseId and StartedTouchOrMouseCount 2023-01-22 20:49:29 +01:00
Florian Rival
ba30665811 Open the file chooser when adding a sprite or choosing a resource with less clicks for Cloud projects (#4859)
*Choosing a file from the device/computer is also the default choice when adding any resource, like for local projects.
2023-01-22 19:17:27 +01:00
Florian Rival
c72658e2d6 Fix some missing extensions accepted for files for Cloud projects (#4858) 2023-01-22 18:35:19 +01:00
AlexandreS
a3fc7585b4 Show the number of instances on a layer in the dialog confirming its deletion (#4854) 2023-01-21 18:33:46 +01:00
Florian Rival
244bc7e274 Fix error when trying to save in Piskel immediately after saving a project in the cloud for the first time (#4857) 2023-01-21 17:06:35 +01:00
Florian Rival
5a5bf60aac Add a selector in external editors to choose if new files must be created, or existing files be edited (#4855) 2023-01-21 14:26:07 +01:00
Florian Rival
33a69849d9 Temporarily revert game with login template to use gdevelop-app.com to prevent CORS issue
Don't show in changelog
2023-01-20 16:56:07 +01:00
Florian Rival
131ee1534a Fix performance issue when pinching to zoom on the scene editor (#4852) 2023-01-20 16:54:40 +01:00
AlexandreS
614c324a63 Change SortableVirtualizedItemList ItemRow to use text field with same fontsize as when not editing (#4851)
Don't show in changelog
2023-01-20 15:12:31 +01:00
AlexandreS
ca4ff1fa6d Decrease line height in comments (#4850)
Don't show in changelog
2023-01-20 14:53:05 +01:00
AlexandreS
0e9ed86b4d Improved comment and group events display (#4846)
* Fix bug that added a new line when one typed Enter key to edit a comment event
* Focus comment or group event after adding it (so that one doesn't have to click on it after adding it)
* Keep the same style when editing a group or comment event
* Submit modifications of group or comment event with Ctrl/Cmd + Enter
2023-01-20 13:53:26 +01:00
Florian Rival
3961c2af4a Remove useless analytics event
Don't show in changelog
2023-01-20 10:33:22 +01:00
Daniel R
cc4d78b08a Don't snap to grid when resizing an instance if Alt key is pressed (#4847)
* This is similar to pressing Alt key when moving an object - it won't snap to the grid.
2023-01-20 09:12:46 +01:00
AlexandreS
8d13285c97 Fix GDJS tests (#4845)
Don't show in changelog
2023-01-19 09:36:21 +01:00
Florian Rival
7b7e13817c Hide the old, deprecated Text Entry object when creating a new object from scratch
* Instead, use the Text Input object to display a field to let the player write something.
2023-01-18 14:44:13 +01:00
Florian Rival
129ebeb4e4 Fix previews not automatically opened on iOS and Safari for the web-app (#4843) 2023-01-18 13:58:14 +01:00
Florian Rival
808f2bc802 Fix new images made with Piskel wrongly smoothed when the project is configured for pixel-art (#4844) 2023-01-18 13:35:43 +01:00
AlexandreS
c5935232f7 Add legacy flag on former plans (#4842)
Don't show in changelog
2023-01-18 12:37:06 +01:00
AlexandreS
35a8341964 Display former subscriptions (indie and pro) in user profile (#4841) 2023-01-18 11:02:24 +01:00
AlexandreS
95783fd58f Bump newIDE version 2023-01-17 15:49:19 +01:00
github-actions[bot]
a78aa4af6e Update translations [skip ci] (#4794) 2023-01-17 15:48:47 +01:00
D8H
4f4b2b7901 Replace touch conditions to also handle the mouse (#4785)
* Add expressions to get the mouse cursor position without touches moving it.
2023-01-17 15:27:58 +01:00
Tristan Rhodes
957f672b90 Add LinearVelocityAngle() expression for the Physics behavior (#4798) 2023-01-17 14:11:21 +01:00
AlexandreS
b9e932d0de Fix flaky animation frame setting action (#4835) 2023-01-17 14:04:11 +01:00
Florian Rival
fdd2362dae Show link to business plans in the subscription dialog (#4838)
As we're having more and more professionals (game designers, game studios), startups and large-scale companies using GDevelop, we're now providing dedicated plans for businesses: https://gdevelop.io/pricing. They come with dedicated support, ability to apply custom branding and more things for usage by enterprises or game studios.
2023-01-17 12:28:48 +01:00
AlexandreS
47583e3092 Fix: Display new resource created with Jfxr or Yarn in resource selector dropdown (#4834) 2023-01-16 15:24:58 +01:00
AlexandreS
8d7967d71a Commit variable name changes after build (#4833)
Do not show in changelog
2023-01-16 15:08:25 +01:00
AlexandreS
72142a62c4 Fix bug that prevented to close parameter popover on the event sheet (#4832) 2023-01-16 14:49:48 +01:00
D8H
619890a25f Fix extension life-cycle functions were not exported (#4830) 2023-01-16 14:39:55 +01:00
AlexandreS
debcd3045f Add autocompletions for some fields that can contain object groups (#4831)
* Effect name
* Effect parameter name
* Sprite point name
2023-01-16 14:37:46 +01:00
D8H
86635e4f66 Add a condition to check if the game has just resumed (#4824)
* It can be useful to display a pause menu when the player come back to the game.
2023-01-16 13:34:38 +01:00
D8H
eedc68b0f2 Fix pathfinding movement angle condition (#4825)
* Add a condition to check the movement angle of the top-down movement behavior.
2023-01-16 10:30:00 +01:00
Florian Rival
b1a6425ab8 Display, when available, video tutorials translated in other languages (#4829)
* For example, some French tutorials have been translated by https://www.youtube.com/@videogamecoder6395
* If you have some translated tutorials, please send them to us using this form: https://airtable.com/shrv295oHlsuS69el - the GDevelop team will review them and add them for your language.
2023-01-15 21:24:45 +01:00
Florian Rival
3d1ee5efcc Update yarn.lock
Don't show in changelog
2023-01-15 12:00:19 +01:00
Florian Rival
4d1fde608b Fix missing translation marker
Don't show in changelog
2023-01-14 14:19:06 +01:00
Florian Rival
e40666bd73 Improve wording of the action to set a Text Input read-only 2023-01-14 14:15:44 +01:00
Florian Rival
4a6c075e41 Fix plural in variable child count in the variables editor 2023-01-14 14:04:14 +01:00
Florian Rival
82426fa564 Fix tinting of deleted sprites sometimes wrongly used to render newly created objects (#4823)
Fix #4822
2023-01-13 14:35:37 +01:00
Florian Rival
a21eef6930 Rename the signing options to make clearer that the legacy options must not be used
Some users were trying to change the upload key when they wanted to update their app,
because they thought "new upload key" would generate a new upload key at every packaging,
instead of using the "default" key - while the other option uses a legacy key that must not
be used in 99.9% of cases

Don't show in changelog
2023-01-13 10:41:55 +01:00
D8H
c6112a1549 Allow custom objects to define an origin point (#4821)
*  Fix camera renderer position update when the center stays the same but dimensions change.
* Don't show in changelog.
2023-01-12 18:47:57 +01:00
D8H
d8350396df Add an action to toggle boolean property values (#4800) 2023-01-12 12:10:47 +01:00
Florian Rival
a8282aaf83 Add conditions to check if the game is exported as a native mobile or desktop app (#4820) 2023-01-12 11:27:47 +01:00
D8H
7de7fc7193 Allow anchored child-objects to scale with the child-object they target (#4818)
* Don't show in changelogs.
2023-01-11 23:49:08 +01:00
AlexandreS
81c5829267 Fix selection rectangle around an instance not displaying correctly for sprites with custom center (#4817) 2023-01-11 16:04:41 +01:00
D8H
07cf1a90a4 Fix a crash when an event-based object tries to access scene variables (#4816)
* Internal changes (for developers)
2023-01-11 14:11:19 +01:00
Florian Rival
3213985a81 Add two expressions to replace one or all occurrences of a text in another (#4809)
* `StrReplaceOne` can be used to replace one occurrence of a "pattern" in a text by another.
* `StrReplaceAll` can be used to replace all occurrences of a "pattern" in a text by another.
2023-01-10 12:39:59 +01:00
Clément Pasteau
d4441fda99 Disable player auth checkbox if offline and improve error message (#4810)
Do not show in changelog
2023-01-10 11:54:39 +01:00
Florian Rival
91c55fcf94 Ask for company name/size or goal when asking about GDevelop usage (#4807)
* Also ask for what's the goal for people using GDevelop for a personal/student usage. Useful to better understand the motivation of the user base.
2023-01-10 11:09:57 +01:00
D8H
6d7b5ac7d3 Add missing icons in the instruction tree (#4797) 2023-01-09 13:45:50 +01:00
Florian Rival
903b353b7b Fix LDtk maps not properly loaded when not having a IntGrid layer (#4806)
Fix #4803
2023-01-09 13:20:31 +01:00
Clément Pasteau
4dd189512b Show contact information from a feedback (#4804) 2023-01-09 12:42:09 +01:00
Clément Pasteau
535fa39a7b Fix renaming children objects of event-based Object (#4805)
Do not show in changelog
2023-01-09 12:41:41 +01:00
Daniel R
78c0cb944f Use F2 as a shortcut for renaming object in the Objects List Panel (#4682)
Thanks @danired!
Co-authored-by: Daniel Redondo <dani@easydevel.com>
2023-01-09 11:02:29 +01:00
Clément Pasteau
55e037484f Allow accessing user profile of a game feedback made by a connected player (#4796) 2023-01-09 10:58:49 +01:00
D8H
84392c08b2 Add an event that returns true when a new condition is added to an extension (#4802) 2023-01-09 09:25:47 +01:00
Florian Rival
0061b1cb8b Allow to close the Home page menu drawer by tapping outside
Don't show in changelog
2023-01-08 21:25:40 +01:00
github-actions[bot]
9e19aa8886 Update translations [skip ci] (#4750)
Co-authored-by: 4ian <4ian@users.noreply.github.com>
2023-01-06 14:40:33 +01:00
Clément Pasteau
f4b812ab29 Small fixes player auth (#4792)
* Prevent listening for liluo connection if not on web
* Catch any error when interacting with localstorage

Do not show in changelog
2023-01-06 14:39:21 +01:00
Florian Rival
106d9de47c Fix naming of filenames created from resources in an external editor (#4791)
Don't show in changelog
2023-01-05 22:52:29 +01:00
Florian Rival
ecbafe60d1 Fix crash sometimes happening when an action/condition was stored with more parameters than expected (#4786)
Don't show in changelog
2023-01-05 16:11:28 +01:00
D8H
c0ba26f1d5 Allow to add a vertex to a collision mask by pulling an edge (#4778)
* Vertices can also be removed by dropping them next to one of their neighbors.
2023-01-05 12:58:02 +01:00
AlexandreS
089be66e82 Fix top down behavior "Rotation speed" property keeping the value 180° for no reason (#4764) 2023-01-05 10:52:20 +01:00
Florian Rival
ffb8a399cd Add support for Piskel, Jfxr and Yarn on the web-app (#4779)
* When you're using the web version of GDevelop, be it on a mobile phone, tablet, Chromebook, traditional computer, on iOS, Android, Windows, Linux or macOS, you can now create and edit images with Piskel, sounds with Jfxr and dialogue trees with Yarn.
2023-01-04 22:42:50 +01:00
Clément Pasteau
63482a0cda Allow automatic player login when the game is hosted on Liluo (#4776)
Do not show in changelog
2023-01-03 16:49:25 +01:00
Clément Pasteau
4fe8dcaf0c Improve default build name (#4777)
Do not show in changelog
2023-01-03 15:35:22 +01:00
Florian Rival
9729461aa1 Add support for using Piskel (image editor), Jfxr (sound editor) and Yarn (dialogue editor) for Cloud projects on desktop (#4769) 2023-01-03 11:41:40 +01:00
D8H
26fcc9770b Add new collision mask vertices on the middle of edges (#4774) 2023-01-03 11:10:42 +01:00
D8H
c62f9c5c65 Fix missing export files for extensions (#4773) 2023-01-02 19:11:11 +01:00
Daniel R
9b199d5aa0 Fix missing space between "Add action" and "paste actions" labels (#4772) 2023-01-02 09:01:48 +01:00
AlexandreS
46e1a5c6e8 Fix Text object Scale X condition and action (#4768) 2022-12-30 11:39:03 +01:00
Aurélien Vivet
052a6240c5 Fix typo (#4766)
Don't show in changelog
2022-12-30 09:10:24 +01:00
AlexandreS
d081711838 Allow to use Escape key as way to cancel rename of object/group/scene/external layout (#4765)
* Also fix drag and drop of project manager items preventing to select text when renaming item
2022-12-30 09:05:03 +01:00
AlexandreS
f0151b2e1f Improve subscription panel and user experience (#4755) 2022-12-29 11:03:37 +01:00
AlexandreS
e2f42ca290 Fix unwelcome opening of keyboard on mobile on the app 2022-12-27 17:59:32 +01:00
Clément Pasteau
b7a3d85287 Allow opening the Game Dashboard from the Home Build page (#4730)
* This will work by default for new games
* For existing games, the option will appear the next time you save your project
2022-12-27 12:43:30 +01:00
Clément Pasteau
4b542e071a Allow navigating through asset packs of an Asset Creator from their profile (#4697) 2022-12-27 11:59:29 +01:00
Florian Rival
64cad25b81 Bump newIDE version (#4752) 2022-12-26 16:24:35 +01:00
Florian Rival
8472e30342 Show a warning about Piskel/Jfxr/Yarn not being available yet for cloud projects on desktop (#4751) 2022-12-26 16:23:29 +01:00
Clément Pasteau
1b7d258727 Remove mentions of "experimental" for features and tools widely used and supported (#4749) 2022-12-26 15:02:56 +01:00
github-actions[bot]
946b77093d Update translations [skip ci] (#4742)
Co-authored-by: 4ian <4ian@users.noreply.github.com>
2022-12-26 14:10:34 +01:00
Florian Rival
74c882f219 Fix wrong scrollbars in the Sprite editor 2022-12-26 12:50:40 +01:00
Florian Rival
abd417c494 Fix games crash because of some extensions not included in the generated games
Revert "Fix missing export files by including the free functions of every extension that is actually used (#4672)" (#4746) (commit 93121d1a1c)
2022-12-26 12:36:39 +01:00
Florian Rival
2005f9c37b Bump newIDE version 2022-12-24 11:30:25 +01:00
github-actions[bot]
b749ac1106 Update translations [skip ci] (#4736)
Co-authored-by: 4ian <4ian@users.noreply.github.com>
2022-12-24 11:21:40 +01:00
Baptiste Augrain
f34f901fa7 Add support for opacity of layers for Tiled tilemaps (#4739) 2022-12-24 11:21:03 +01:00
Florian Rival
c74110c058 Fix the storage provider default choice not being always the optimal one when running the tutorial 2022-12-23 23:29:44 +01:00
Baptiste Augrain
2a38be827c Add support for Tileset resources with .tsj extension (#4737) 2022-12-23 23:09:16 +01:00
D8H
7cd97e8cc4 Disable "missing shared data" error logs for custom objects. (#4735)
* Don't in changelog
2022-12-23 18:31:19 +01:00
github-actions[bot]
4c9445f6f5 Update translations [skip ci] (#4734)
Co-authored-by: 4ian <4ian@users.noreply.github.com>
2022-12-23 18:08:28 +01:00
Baptiste Augrain
b7772520b5 Add support for selecting directly .ldtk and .tmj files from the interface (#4733)
* Files saved from LDtk or from Tiled (using the .tmj format) can be now selected directly when choosing a Tilemap to be displayed by a Tilemap object.
2022-12-23 17:46:17 +01:00
D8H
93121d1a1c Fix missing export files by including the free functions of every extension that is actually used (#4672) 2022-12-23 17:33:52 +01:00
D8H
9f7c1a1748 Better display custom objects in the editor (#4643) 2022-12-23 17:21:47 +01:00
Florian Rival
f6fc2406a5 Fix missing menu items on web-app
Don't show in changelog
2022-12-23 15:32:37 +01:00
github-actions[bot]
daede19d0d Update translations [skip ci] (#4718)
Co-authored-by: 4ian <4ian@users.noreply.github.com>
2022-12-23 12:42:26 +01:00
Florian Rival
36e835c461 Don't enable player authentication if a tutorial is running when creating a new project
Don't show in changelog
2022-12-23 10:49:16 +01:00
Florian Rival
8d0b3ef53e Fix MarkdownText using a div instead of a span when not a standalone text
* Also add a missing translation
* Also enable player authentication by default when creating a new game
2022-12-23 10:13:58 +01:00
Florian Rival
7ccd2cd146 Update README with link to GDevelop-tutorials repository [skip ci]
* This is where the step-by-step onboarding is stored and future tutorials can be built by the community: https://github.com/GDevelopApp/GDevelop-tutorials

Only show in developer changelog
2022-12-22 22:59:40 +01:00
D8H
49974131d0 Improve installation of assets containing custom objects, like menu buttons, so that if an extension needs an update, a confirmation dialog is shown (#4724) 2022-12-22 19:27:54 +01:00
Baptiste Augrain
77320ce12e Add support for LDtk Tilemaps (#4575)
* Tilemaps made with [LDtk](https://ldtk.io/), a modern 2D level editor, can be now used directly. Make sure to save your map made in LDtk as a JSON file, create a new Tilemap object in GDevelop and in the Tilemap field, choose the LDtk file.
* Tilesets used by the LDtk Tilemap are automatically imported in your game - you don't need to import them separately.
* For more information, read about the [Tilemap object on the wiki](https://wiki.gdevelop.io/gdevelop5/objects/tilemap).

Co-authored-by: Davy Hélard <davy.helard@gmail.com>
Co-authored-by: Florian Rival <Florian.Rival@gmail.com>
2022-12-22 18:44:27 +01:00
Clément Pasteau
35833e6e23 Allow adding default player authentication when creating a project (#4714)
* New checkbox in the Project Creation dialog, which will apply best practices for player authentication on the empty project
2022-12-22 16:20:13 +01:00
AlexandreS
7436032787 Fix asset store preview (#4729)
Do not show in changelog
2022-12-22 15:48:15 +01:00
AlexandreS
aa4fd1bda9 Prefer scroll in homepage header rather than uncontrolled wrap (#4728)
Do not show in changelog
2022-12-22 11:46:04 +01:00
AlexandreS
e10dd57fed In the scene editor, paste cut instances at highest z order (#4726) 2022-12-22 10:53:26 +01:00
Florian Rival
893257491a Launch automatically the search in the asset store when typing (#4725) 2022-12-21 22:12:05 +01:00
AlexandreS
b8f04515f3 Do not close context menu when clicking on checkbox items (#4690) 2022-12-21 12:46:45 +01:00
AlexandreS
4a807b6053 Fix editor that was setting the z order of a new instance a bit randomly 2022-12-21 12:41:49 +01:00
AlexandreS
dbfef27d2e Fix leaderboard admin closing when trying to remove a leaderboard (#4691) 2022-12-21 11:08:24 +01:00
D8H
72b69e4cdf Add a sprite editor for custom objects with a locked animation list (#4719) 2022-12-21 09:32:24 +01:00
D8H
2f11cd667b Add an expression to get the number of frames in the current animation of a sprite object (#4722) 2022-12-21 09:30:03 +01:00
Florian Rival
d9de2a3177 Fix the asset store search
Don't show in changelog
2022-12-20 17:52:21 +01:00
AlexandreS
53828a6b61 Add possibility to drag n drop items in the project manager (scenes, external layouts, external events, extensions) (#4720) 2022-12-20 16:54:58 +01:00
github-actions[bot]
eb797281cf Update translations [skip ci] (#4696)
Co-authored-by: D8H <D8H@users.noreply.github.com>
2022-12-20 14:54:38 +01:00
Florian Rival
80f5a9a0d6 Add the asset store on the homepage (#4692)
* You can now browse free and premium asset packs from the home page, under the tab "Shop".
* When you have found great assets for your game, it's easy to add them in your game in a click. You can choose them to add them to a specific scene or to the whole project as global objects.
* If you're interested to sell your assets on the GDevelop asset store, check our wiki page to find how it works and the form to send us your assets: https://wiki.gdevelop.io/gdevelop5/community/sell-asset-pack-store
2022-12-20 14:49:54 +01:00
D8H
07ab4c938b Fix event-based objects properties that were changing for all instances at once (#4717)
* It was only affecting properties defined in the event-based objects not the one from child-object configurations.
2022-12-20 14:20:19 +01:00
AlexandreS
41fa153ddf Add description to a certain amount of parameters in actions and conditions (#4716) 2022-12-20 13:59:10 +01:00
Clément Pasteau
4cdac65944 Put beginner courses on top of Learn section (#4715) 2022-12-19 15:18:25 +01:00
AlexandreS
7b5036286f Fix scene background color setting via the textfield (#4713) 2022-12-19 12:42:27 +01:00
AlexandreS
fd4dd62f9b Allow text selection on game feedback cards (#4712) 2022-12-19 10:55:11 +01:00
Clément Pasteau
6701a52a88 Update shortcut to close project and quit app to match other app standards (#4711) 2022-12-19 10:51:42 +01:00
AlexandreS
0b61bb5053 Fix: Close all the dialogs at the same time when creating a project from an example (#4710) 2022-12-19 10:34:49 +01:00
AlexandreS
259e35d941 Use a constant zoom speed on the scene editor and on image preview, regardless of zoom factor (#4674) 2022-12-19 09:02:49 +01:00
Clément Pasteau
b9ac22208b Replace most float with double for better precision (#4689)
Do not show in changelog
2022-12-16 14:50:11 +01:00
Clément Pasteau
a991283bb5 Correctly display asset authors coming from premium asset packs (#4688) 2022-12-16 11:21:46 +01:00
Clément Pasteau
bf3ecceb06 Update service worker to put translations in cache (#4693)
* This should prevent unwanted {0} appearing on the web for each update
2022-12-16 09:24:32 +01:00
github-actions[bot]
b3bc1dd21b Update translations [skip ci] (#4685)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2022-12-15 12:34:23 +01:00
Clément Pasteau
d63b83b606 Improve instance number properties by hiding unnecessary decimals (#4557)
* "resize", "drag" or "rotate" of an instance in the editor will now round the properties to the nearest integer for ease of use.
  * This does not prevent entering digits in the instance properties directly
* The fields do not update the instance with "0" when a user is still typing (ex: "19," does not update the field)
* The "width/height/x/y/angle" properties can now correctly accept precise float numbers, avoiding excessive and inaccurate digits
2022-12-15 12:16:12 +01:00
AlexandreS
05e222c92d Bump newIDE version (#4684) 2022-12-14 14:56:53 +01:00
github-actions[bot]
d843a9e607 Update translations [skip ci] (#4670)
Co-authored-by: D8H <D8H@users.noreply.github.com>
2022-12-14 14:51:53 +01:00
AlexandreS
5d3f1a502c Fix release 152 issues (#4683)
Do not show in changelog
2022-12-14 14:47:56 +01:00
AlexandreS
fbcc63a0d0 Add message in build section when unable to fetch cloud projects (#4681)
Don't show in changelog
2022-12-13 16:59:37 +01:00
D8H
46a459bdb4 Fix the authors list on extension wiki pages (#4680)
* Don't show in changelog
2022-12-13 14:15:57 +01:00
Florian Rival
86c8467cdc Fix export of cloud projects on Windows (#4679)
Don't show in changelog
2022-12-13 12:50:11 +01:00
AlexandreS
5426f656cb Refresh cloud project after save as [skip ci] (#4677)
Don't show in changelog
2022-12-13 12:47:38 +01:00
AlexandreS
b7f4f3166e Use non clickable project manager section title [skip ci] (#4678) 2022-12-13 12:46:35 +01:00
D8H
e62b90d5ff Fix the wiki extension page generator and make it use headers instead of extension files (#4676)
* Don't show in changelog
2022-12-13 12:08:56 +01:00
AlexandreS
45c1c6c38a Fix import issue (#4675)
Don't show in changelog
2022-12-13 10:19:32 +01:00
Florian Rival
82524fba12 Make the extension markdown document generator script fails if an error occurred
Only show in developer changelog
2022-12-12 22:46:22 +01:00
AlexandreS
40fb6e4874 Remove cloud projects feature flag (#4673)
Don't show in changelog
2022-12-12 17:37:09 +01:00
AlexandreS
52742cfa10 Remove unused import (#4671)
Do not show in changelog
2022-12-12 16:13:39 +01:00
AlexandreS
702c71390b Remove unused macro conditions (#4669)
Do not show in changelog
2022-12-12 15:32:35 +01:00
github-actions[bot]
1a6074b8ea Update translations [skip ci] (#4649) 2022-12-12 15:26:56 +01:00
AlexandreS
0e45d468ea Bump newIDE version
Don't show in changelog
2022-12-12 15:25:31 +01:00
AlexandreS
ed900befd4 Hide project settings in new project setup dialog if creating from example (#4663)
Do not show in changelog
2022-12-12 15:24:44 +01:00
Clément Pasteau
16ccd168e0 Embed in-app tutorials in the editor so that they're available offline (#4646) 2022-12-12 14:55:55 +01:00
D8H
74cc7ac684 Fix extension function missing code files when exporting a project (#4665)
* The issue happened when a behavior used a function from its extension which itself also used another function.
2022-12-12 14:32:23 +01:00
D8H
52278180ab Allow to set the text alignment for text objects by property (#4648) 2022-12-12 14:17:16 +01:00
D8H
471053da11 Add a tooltip on the button to open extension functions (#4666) 2022-12-12 13:26:48 +01:00
AlexandreS
237786b0a0 Add lerp angle expression which takes the shortest path between two angles (#4664)
Co-authored-by: Tristan Rhodes <tristan.rhodes@gmail.com>
2022-12-12 11:37:43 +01:00
AlexandreS
ba52577c24 Use same design for open from dialog as for save to dialog (#4655)
Do not show in changelog
2022-12-12 09:58:25 +01:00
D8H
e99c3800e4 Fix the required behavior type field that were missing (#4659)
* Don't show in changelog
2022-12-12 09:30:40 +01:00
Florian Rival
c780b6c6d6 Alternate paid and free asset packs (#4656)
Don't show in changelog
2022-12-09 18:32:42 +01:00
AlexandreS
70380dc056 Support possibility to deprecate an in-app tutorial step (#4653)
Do not show in changelog
2022-12-09 16:25:48 +01:00
Daniel R
c1bed2ebb2 Fix picking a folder not updating the input field when creating a new project (#4654)
Co-authored-by: Daniel Redondo <dani@easydevel.com>
2022-12-09 16:05:45 +01:00
Florian Rival
d639f87f31 Improve the design of the project manager (#4652)
Don't show in changelog
2022-12-09 15:47:59 +01:00
Florian Rival
e8888bbe76 Fix context menus not working anymore on mobile/touchscreens (#4650)
Don't show in changelog
2022-12-09 13:58:52 +01:00
AlexandreS
4797ce3a8a Update translations post translation bug (#4651)
Don't show in changelog
2022-12-09 11:03:22 +01:00
AlexandreS
a44a20d1d5 Add a few setup options when creating a new project (#4645) 2022-12-09 09:41:21 +01:00
Florian Rival
5f717643b3 Display just icons in the toolbar for preview/publish on small screens
Don't show in changelog
2022-12-08 18:51:43 +01:00
github-actions[bot]
346e08192c Update translations [skip ci] (#4641)
Co-authored-by: 4ian <4ian@users.noreply.github.com>
2022-12-08 17:18:10 +01:00
Florian Rival
f2eddd9c88 Add back the project manager icon in the home page for now
To avoid disturbing existing users too much and because otherwise it's super hidden in the main menu.
Will be better once "existing projects" listing is improved with a button to open the project manager.

Don't show in changelog
2022-12-08 17:04:26 +01:00
Florian Rival
d6e21d0854 Improve menus on the web-app (#4644)
* Faster navigation: submenus open when their item is hovered.
* Shortcuts are now shown like on the desktop app.
* Menu items height are fixed and always the same.
2022-12-08 16:01:39 +01:00
Florian Rival
db11465b87 Improve the split buttons and the preview button to make it clearer (#4642)
Don't show in changelog
2022-12-08 15:33:04 +01:00
AlexandreS
48c532ad71 Add object name in instruction keys and ids to avoid duplicates (#4623)
Do not show in changelog
2022-12-08 14:59:00 +01:00
AlexandreS
72319df6f1 Add possibility to install any resource in project (#4640)
Do not show in changelog
2022-12-08 12:23:14 +01:00
Florian Rival
c596335b7b Add some space to drag the titlebar even if a lot of tabs are opened
Don't show in changelog
2022-12-08 11:21:00 +01:00
github-actions[bot]
a9b42de64b Update translations [skip ci] (#4639)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2022-12-08 10:40:17 +01:00
AlexandreS
64ea3461d0 Make autocomplete dropdowns more visible (#4634)
Do not show in changelog
2022-12-08 09:34:25 +01:00
Florian Rival
cef473ca0e Update GitHub screenshot [skip ci]
Don't show in changelog
2022-12-07 18:12:14 +01:00
github-actions[bot]
9378b325d0 Update translations [skip ci] (#4635)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2022-12-07 17:56:45 +01:00
Clément Pasteau
238043655c Send gdevelopVersion for in-app-tutorials (#4636)
Do not show in changelog
2022-12-07 17:39:52 +01:00
Florian Rival
731a64aa0f Redesign the top tabs and toolbars in the app, so the app looks modern and takes less space on the top of the screens (#4630)
* On desktop, the titlebar is now gone and replaced by the tabs and a button to open the main menu of the app.
* On the web-app, if installed (available on Chrome and Edge), the titlebar can also be retracted. Whatever your system or device, the menu can be accessed from the top left.
* The top toolbars have been entirely redesigned to be integrated below the tabs - which is more intuitive for new users. All the icons have been reworked to be cleaner, take less space, and be more modern.
* The debugger toolbar was also improved to display just Play/Pause according to the game state.
* Finally, the project manager was slightly redesigned to use new icons.
2022-12-07 17:22:38 +01:00
github-actions[bot]
e1e7344ca5 Update translations [skip ci] (#4617)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2022-12-07 17:04:51 +01:00
Clément Pasteau
a5d5f0b7a5 Fix allowing to type "/" inside the path for project folder (#4633)
Do not show in changelog
2022-12-07 16:49:02 +01:00
Clément Pasteau
3dcbe46fc7 Improve warning when a project autosave is detected on Desktop (#4632)
* Autosave will not be displayed if the files are the same
* Prevent showing a warning when a project with an autosave is opened after being zipped
* Improve overall wording and dialogs
2022-12-07 16:46:38 +01:00
Florian Rival
4d3d96a889 Fix SemiControlledAutoComplete not using the value entered when pressing Enter in a InlineParameterEditor
Don't show in changelog
2022-12-07 12:03:10 +01:00
Clément Pasteau
23631cc2ce Allow entering a donation link on the user profile (#4628)
* Accepts any type of donation page, Ko-fi, Patreon, Paypal, Github...
* Once entered, it will appear on your Liluo.io Game and Profile pages
2022-12-06 17:21:34 +01:00
AlexandreS
3937b59d73 Use same border radius between command palette and autocomplete picker (#4629)
Do not show in changelog
2022-12-06 11:44:54 +01:00
Florian Rival
3b594ded7d Add Enter as a key to validate changes to a parameter in an event sheet (#4621)
* Shift+Enter can be used to enter new lines in expressions when editing a parameter inline
2022-12-06 10:37:55 +01:00
AlexandreS
e8a7cad17c Restore possibility to search texts with parenthesis in events parameters (#4625) 2022-12-06 10:30:18 +01:00
Clément Pasteau
2557cf556c Allow leaderboard color customisation (#4612)
* Silver and Gold subscribers can now customize their leaderboard with 4 different colors
2022-12-05 18:05:37 +01:00
AlexandreS
7c51f0af81 Add link to asset store license + Add message when no projects in the list (#4624)
Do not show in changelog
2022-12-05 16:56:41 +01:00
D8H
dc146a7411 Add a command to generate an action and an expression for a custom object property (#4620)
* Don't show in changelog
2022-12-04 20:27:17 +01:00
D8H
7620bac88a Enable serialization of JS code events and extension descriptions as arrays of strings (#4613)
* Only show in developer changelog
2022-12-04 13:38:08 +01:00
AlexandreS
c51e4be22d Display password prompt when requesting checkout session for asset pack (#4616)
Do not show in changelog
2022-12-02 18:17:38 +01:00
github-actions[bot]
98499dfc53 Update translations [skip ci] (#4610)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2022-12-02 12:17:48 +01:00
AlexandreS
36de82c93f Few fixes (#4611)
Do not show in changelog
2022-12-02 11:55:43 +01:00
Daniel R
7e97edcad0 Add a new tab "Folders" in Preferences to allow to choose the default folder where local projects are created (#4582) 2022-12-02 11:50:58 +01:00
D8H
5abb0fd9e3 Fix boolean property condition sentences (#4605) 2022-12-02 11:45:13 +01:00
D8H
d80c21244f Boolean property generated actions no longer miss the "Value" parameter (#4594) 2022-12-02 11:44:17 +01:00
D8H
70f4d545b4 Display some behavior properties in one row (#4606) 2022-12-02 11:37:32 +01:00
github-actions[bot]
85355c3f17 Update translations [skip ci] (#4609)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2022-12-01 17:27:19 +01:00
github-actions[bot]
044cc5354f Update translations [skip ci] (#4607)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2022-12-01 17:11:46 +01:00
AlexandreS
5ff02b11fc Fix a few MUI component imports (#4608)
Do not show in changelog
2022-12-01 17:05:23 +01:00
github-actions[bot]
9bf24f9baf Update translations [skip ci] (#4604)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2022-12-01 16:30:12 +01:00
AlexandreS
958482ee44 Suggest a new and more complete 3-chapter in-app tutorial (#4476) 2022-12-01 16:18:42 +01:00
AlexandreS
7a1fb5b033 Improve loading of Home Build section to reduce layout shifts (#4603) 2022-12-01 11:28:49 +01:00
D8H
33b2fb0168 Show unit of measurements on properties of built-in extensions (#4576) 2022-11-30 21:18:54 +01:00
Clément Pasteau
5cad2be194 Improve Toggle styling (#4602) 2022-11-30 15:23:43 +01:00
Clément Pasteau
2b38aa5445 Simplify assets loading to prevent unnecessary calls (#4601)
Do not show in changelog
2022-11-30 14:26:38 +01:00
D8H
32279f02e9 Fix function name collision between event-based objects from the same extension (#4598) 2022-11-30 14:10:52 +01:00
Clément Pasteau
7452358656 Trigger Rename & Focus for Object, Group, Layout, Events (#4591) 2022-11-30 10:52:15 +01:00
D8H
d2ec483d71 Changing custom object opacity now works (#4597) 2022-11-29 10:43:17 +01:00
github-actions[bot]
4cb62d15bf Update translations [skip ci] (#4589)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2022-11-28 15:53:08 +01:00
AlexandreS
96bdbfc70b Correctly deactivate cloud projects on desktop app in prod (#4592)
Do not show in changelog
2022-11-28 15:47:55 +01:00
Clément Pasteau
a64815f500 Fix missing text formatting (#4587)
Do not show in changelog
2022-11-28 15:47:39 +01:00
Clément Pasteau
5ab8a3cd73 Improve initial dialog logic to avoid opening tab on subsequent profile openings. (#4590)
Do not show in changelog
2022-11-28 15:45:12 +01:00
D8H
7d0ecf113a Add a command to generate an action and an expression for a property (#4565) 2022-11-28 14:30:03 +01:00
D8H
de30049182 Show parameters description in expression documentations (#4585) 2022-11-28 13:19:42 +01:00
Clément Pasteau
c2a1fb63e1 Fix opening initial dialog again after closing it (#4588) 2022-11-28 12:34:22 +01:00
github-actions[bot]
8562019953 Update translations [skip ci] (#4572)
Co-authored-by: 4ian <4ian@users.noreply.github.com>
2022-11-28 10:34:59 +01:00
Florian Rival
f8232953b5 Add support for cloud projects to the desktop app (#4240)
* Also add support for the asset store in the objects editors - like on the web-app.
2022-11-27 18:09:27 +01:00
AlexandreS
d52ac6fc3e Send subscription dialog opening reason (#4586)
Do not show in changelog
2022-11-25 18:12:03 +01:00
Clément Pasteau
be4aab6d5c Allow opening up the feedback tab from URL query params (#4574)
Do not show in changelog
2022-11-25 17:18:32 +01:00
Clément Pasteau
4ed8ff15dd Improve Asset pack install dialog (#4583)
Do not show in changelog
2022-11-25 11:33:00 +01:00
Clément Pasteau
2dd1105a10 Improve Game Feedback management (#4579)
* Display the average game ratings at the top
* Add an option to mark all as read
* improve readability by adding a number for each rating
2022-11-25 10:12:11 +01:00
Clément Pasteau
0fce6aaaaa Fix missing scroll on points and collision mask editors (#4578) 2022-11-24 15:51:22 +01:00
Florian Rival
29797b7a2f Add analytics data when opening an asset pack or an asset (#4573)
Don't show in changelog
2022-11-24 09:41:24 +01:00
Clément Pasteau
7df7f9f458 Remove help button on additional info dialog (#4570)
Do not show in changelog
2022-11-23 15:20:52 +01:00
github-actions[bot]
fc61fa2c54 Update translations [skip ci] (#4571)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2022-11-23 15:20:36 +01:00
D8H
fccd3b8f2e Fix the drag and drop of the extension editor. (#4568)
* Items were not drop at the right position when they were moved down.
2022-11-23 15:08:33 +01:00
github-actions[bot]
5ca91cfac4 Update translations [skip ci] (#4569)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2022-11-23 15:08:17 +01:00
Clément Pasteau
628d18ac5a Improve login and signup flow (#4566)
* Small design improvements to the Log in & Sign up flows
* A dialog is now shown for every user on signup to gather a bit of information about who they are.
  * This information stays of course private and is helpful to gather information about GDevelop's usage
2022-11-23 14:58:17 +01:00
github-actions[bot]
61d5c08549 Update translations [skip ci] (#4555)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2022-11-23 14:54:05 +01:00
Clément Pasteau
34497c2783 Fix cleaning the resource URL when added from the resource store (#4567)
Do not show in changelog
2022-11-22 19:11:18 +01:00
Clément Pasteau
4627facfd5 Improve Searchbar's design and usability (#4553) 2022-11-21 16:16:07 +01:00
D8H
aee15424f2 Save the scroll position of the asset store (#4528) 2022-11-18 17:06:10 +01:00
D8H
6c44f6e937 Physics2 behavior no longer step before the first frame (#4559)
* It allows events to access to the initial object positions.
2022-11-18 17:05:28 +01:00
Clément Pasteau
a115df260f Revert time before showing warning in object edition (#4558)
Do not show in changelog
2022-11-18 10:24:56 +01:00
Clément Pasteau
6e7bc9c809 Improve the snackbar messages when saving a cloud project (#4554) 2022-11-16 16:42:23 +01:00
Clément Pasteau
57ce8dcbbf Bump to 5.1.151 (#4552) 2022-11-15 14:50:36 +01:00
Clément Pasteau
f86d0197c1 Fix stories crashing storybook (#4551)
Do not show in changelog
2022-11-15 14:49:05 +01:00
github-actions[bot]
c7b0f345c7 Update translations [skip ci] (#4549)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2022-11-15 14:44:40 +01:00
Clément Pasteau
9803b4b8f4 Fix points and collision editor not showing scrollbars (#4550)
Do not show in changelog
2022-11-15 14:30:59 +01:00
D8H
ef4815a37e Tabs no longer disappear when scrolling in the extension editor dialogs (#4545) 2022-11-15 12:00:34 +01:00
D8H
fd7d27e727 Include tags in the search for extensions and examples (#4544) 2022-11-15 11:55:52 +01:00
D8H
ce94c6ae2f Fix a typo in the "Related expression and condition" field (#4548)
* Don't show in changelog
2022-11-15 11:46:10 +01:00
Florian Rival
c638a38275 Add a button to redeem a code for subscriptions (#4542) 2022-11-14 17:57:25 +01:00
github-actions[bot]
e539fdb0e9 Update translations (#4536)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2022-11-14 11:22:27 +01:00
Clément Pasteau
2a9193e4c2 Hide warning if backdrop behavior is set to cancel (#4543)
Do not show in changelog
2022-11-14 11:13:35 +01:00
github-actions[bot]
cf8361be0c Update translations (#4534)
Do not show in changelog
2022-11-10 15:57:05 +01:00
Clément Pasteau
2ba5f03e67 Fix animation preview not taking full space (#4535)
Do not show in changelog
2022-11-10 15:53:14 +01:00
Clément Pasteau
d9435eda5a Bump version to 5.1.150 (#4530) 2022-11-10 13:28:04 +01:00
github-actions[bot]
bc807acf8a Update translations [skip ci] (#4512)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2022-11-10 13:27:52 +01:00
Clément Pasteau
194b60aa72 Rework Dialogs and tabs design (#4520)
* Overall redesign or the dialogs to display a title and more margins, helping buttons be more discernable from the content + cross at the top to close them easily.
* Redesign of the tabs to be more intuitive.
2022-11-10 12:59:54 +01:00
D8H
02bbdfecd4 Allow event-based behaviors to declare scene properties (#4464) 2022-11-10 11:43:16 +01:00
D8H
bf19ec5a68 [PathFinding] Improve pathfinding with a property to smooth the path. (#4515) 2022-11-10 11:40:07 +01:00
Florian Rival
59094110ca Serialize JS code events and extension descriptions as arrays of strings to make collaboration/reviews easier (#4468)
Only show in developer changelog
2022-11-09 18:39:23 +01:00
D8H
a35ead0ab2 Panel sprite objects now respect the resource smoothing option (#4526) 2022-11-09 15:21:31 +01:00
Clément Pasteau
669c10c462 Slightly improve animation preview zoom for the image to fit the canvas (#4527) 2022-11-09 14:16:57 +01:00
Clément Pasteau
2859f2a3b6 Improve Selection of resources in parameters (#4524)
* A button is now available to pick a file
* When there is only 1 external editor like Piskel, the button is made more visible
2022-11-09 10:41:35 +01:00
D8H
be675fc5e6 [Platformer] Make tests with events side effects more realistic (#4518)
* Don't show in changelog
2022-11-08 12:41:48 +01:00
Aurélien Vivet
2be238bc9e Fix Inconsistency in JSON Parsing events wording (#4514) 2022-11-08 11:26:36 +01:00
AlexandreS
5c08fb06d8 Display leaderboard limit in leaderboard admin for free accounts (#4497) 2022-11-07 16:52:18 +01:00
D8H
8ec96a7446 Fix the color property definition editor layout (#4513)
* Don't show in changelog
2022-11-07 15:30:25 +01:00
D8H
792ce82a28 Add a setting to show the custom object editor (#4503) 2022-11-07 12:06:33 +01:00
github-actions[bot]
da444d53cd Update translations [skip ci] (#4511)
Co-authored-by: D8H <D8H@users.noreply.github.com>
2022-11-07 10:38:28 +01:00
D8H
62a6d42488 Add autocompletion for choices and color property private actiton and condition parameters (#4481) 2022-11-07 10:24:53 +01:00
D8H
53e70c5a8f Add conditions to compare function parameter values (#4498) 2022-11-07 10:21:55 +01:00
Clément Pasteau
74ffba0f17 Fix Posthog alias (#4496)
Do not show in changelog
2022-11-07 10:18:26 +01:00
Clément Pasteau
4e03cf559d Handle new format for public asset resources (#4457)
Do not show in changelog
2022-11-07 10:16:12 +01:00
github-actions[bot]
4f5690503e Update translations [skip ci] (#4459)
* Don't show in changelog
2022-11-06 13:30:23 +01:00
D8H
8ac7284118 Allow to declare private event-based behaviors (#4479)
* It allows event-based objects to use behaviors internally without showing them to extension users.
2022-11-05 20:45:29 +01:00
D8H
16cdc9a047 Fix: parameter default value changes were not saved (#4489)
* Don't show in changelog
2022-11-04 18:16:46 +01:00
Clément Pasteau
ee43afa301 Show a warning when closing an editor dialog with a few unsaved changes (#4490)
* Applies on multiple editors: Object, Object group, Project properties, Variables list and Layers
2022-11-04 16:20:43 +01:00
AlexandreS
92bc846190 Add possibility to use markdown for asset descriptions (#4492)
Do not show in changelog
2022-11-04 14:18:38 +01:00
D8H
beb832be8b Fix flip instruction icons for custom objects (#4482)
* Don't show in changlog
2022-11-03 21:30:43 +01:00
D8H
961c78b468 Fix number expression field. (#4483)
* Don't show in changelog
2022-11-03 21:30:00 +01:00
D8H
2d7467bc27 Avoid to use regex look ahead as Safari doesn't support it. (#4480) 2022-11-03 09:33:16 +01:00
Clément Pasteau
0a9d9b940b Fix Animation Preview not taking full height and being stuck when duplicating an image (#4470) 2022-11-02 13:41:35 +01:00
D8H
f8bd457346 Translate event-based extension categories (#4471) 2022-11-02 10:21:35 +01:00
AlexandreS
6deeae76c5 Do not prevent inline parameter editor to be opened after dragging an action/condition 2022-11-02 10:18:31 +01:00
Clément Pasteau
473b16bbc1 Introduce no-unused-vars ts rule for GDJS & Extensions (#4469)
Do not show in changelog
2022-10-31 14:52:03 +01:00
Clément Pasteau
20a328dcd6 Fix Changelog displaying extensions bullet points properly (#4472) 2022-10-31 14:49:34 +01:00
AlexandreS
578aae7a69 Fix animation finished condition firing too early (#4444)
The condition was firing as soon as the animation was entering its last frame.
It now waits for the last frame to be displayed long enough (based on frame interval duration).
This fix applies to all future "Animation finished" conditions, current ones are not affected.
2022-10-31 09:06:15 +01:00
D8H
27f89b1b0f Fix events sheet warping when it contains a JS event (#4466) 2022-10-30 19:51:13 +01:00
D8H
bc75d6003c Add back parts of a revert for the TextImput fix (#4453)
* Don't show in changelog
2022-10-30 14:20:53 +01:00
D8H
fd03deb4ea Allow event extensions to define conditions and actions with an operator (#3909) 2022-10-29 23:20:10 +02:00
D8H
71f20d7852 Refactor to make some ParameterMetadata attributes private (type, supplementaryInformation and optional) (#4437) 2022-10-29 13:02:18 +02:00
D8H
9d121d0085 Suffix properties private instruction names with "property" to avoid them to overlap public ones (#4436) 2022-10-29 13:01:07 +02:00
Clément Pasteau
6292e338bc Fix importing path correctly on web (#4458) 2022-10-28 17:58:24 +02:00
Clément Pasteau
c5eb0bcc00 Bump version to 5.1.149 (#4451) 2022-10-28 11:23:50 +02:00
github-actions[bot]
a732fda4d9 Update translations [skip ci] (#4430)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2022-10-28 11:20:33 +02:00
Clément Pasteau
398bff8492 Fix input not being positioned properly (#4450) 2022-10-28 11:11:24 +02:00
D8H
f30e92a953 Make scene properties look the same as behavior properties (#4448)
* For instance, scene properties are used by the Physics2 behavior.
2022-10-27 21:48:52 +02:00
AlexandreS
8210c25acb UI improvements (#4440)
- Make some popovers and panels more discernable from the background
- Use the same drag and drop behavior for layers list as for the objects list on the scene editor
- Add object icons in the list of objects in a group
2022-10-27 10:23:05 +02:00
AlexandreS
6a13940e17 Add possibility to send instances to back or to front (Z order) in context menu (#4443) 2022-10-27 09:47:54 +02:00
AlexandreS
622aa7c08c Add warning message when updating liluo.io thumbnail from the project icons dialog (#4438) 2022-10-26 11:52:49 +02:00
Clément Pasteau
a71558a490 Create condition to know when a draggable object was just dropped (#4441) 2022-10-26 09:31:14 +02:00
Clément Pasteau
37539aa788 Rename Panel actions for consistency (#4439) 2022-10-25 18:45:23 +02:00
AlexandreS
789f819f25 Fix events sheet not wrapping on small screens (#4434) 2022-10-25 10:43:27 +02:00
AlexandreS
52ebfb8100 Remove starting value in tween variable actions
Also:
- Change phrasing for object tweens
2022-10-25 08:53:37 +02:00
Clément Pasteau
ecc5c689d2 Revert service worker update (#4432)
Do not show in changelog
2022-10-24 18:48:30 +02:00
Florian Rival
5b1e169557 Show variables that were used in the events, but not defined, in the autocompletions by default
* If you've not activated this since this was introduced, you can do so in the preferences.
2022-10-24 17:43:30 +02:00
Clément Pasteau
386e23b042 Bump version to 5.1.148 (#4429) 2022-10-24 12:11:18 +02:00
github-actions[bot]
fc76bafc7c Update translations [skip ci] (#4393)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2022-10-24 12:11:00 +02:00
AlexandreS
de53f4df4f Fix project name not updating in recent project files after saving (#4428) 2022-10-24 12:02:16 +02:00
D8H
9fedf124db Allow assets to declare extension dependencies without behaviors (#4354) 2022-10-22 14:40:47 +02:00
Clément Pasteau
2c68bb4bdd Modify the asset store to handle priced asset packs 2022-10-21 18:16:38 +02:00
AlexandreS
2360cf899f Performance optimization: Prevent pixi from rendering if any dialog is opened (#4415) 2022-10-21 15:01:04 +02:00
AlexandreS
3fc57c2b06 Add some particle emitter actions conditions and expressions (#4419)
- Max number of displayed particles
- Particle rotation min and max speeds
- Additive rendering setting
2022-10-21 14:04:44 +02:00
AlexandreS
b4f41e96ae Fix: Set line particle emitter origin at 0 to prevent rotation offset (#4421) 2022-10-21 12:29:09 +02:00
AlexandreS
b20108ddcb Fix particle emitter incoherent rotation speed of the particles (#4417) 2022-10-21 12:28:09 +02:00
AlexandreS
a58b039994 Update instance properties panel after a layer was created or renamed (#4420) 2022-10-21 12:13:57 +02:00
D8H
a7f218622e Add a button to export custom objects for the asset store (#4363)
* Don't show in changelog
2022-10-21 11:38:32 +02:00
AlexandreS
8d95eb4269 Fix: Ensure particle max force is not zero to prevent PIXI bug (#4418) 2022-10-20 18:20:27 +02:00
AlexandreS
4e46690418 Create homemade solution to display in app tutorials (#4394)
Do not show in changelog
2022-10-20 15:39:12 +02:00
Florian Rival
db1737281e Add word wrap in the code editors to avoid horizontal scrolling (#4413)
* Also fix some text overflowing out of the screen for some languages.

Fix #4412
2022-10-19 14:38:57 +02:00
AlexandreS
d5eecda570 Improve new scrollbars on scene editor canvas (#4411)
Do not show in changelog
2022-10-19 11:22:07 +02:00
D8H
80cb6d697c Handle custom objects at runtime (#4294)
* Don't show in changelog
2022-10-18 13:36:48 +02:00
Clément Pasteau
6b08fec747 Add missing translation for pasting an object (#4408) 2022-10-18 12:31:00 +02:00
D8H
2c92ce74ce Fix custom object configurations copy constructor (#4404)
* Don't show in changelog
2022-10-17 16:26:27 +02:00
D8H
30643ced07 Add some stories for event-based objects (#4401)
* Don't show in changelog
2022-10-16 23:57:18 +02:00
Peter Anderson
bf27761cff Fix grammar: change 'let' to 'leave'. (#4399) 2022-10-16 13:43:14 +02:00
Florian Rival
58df3aeca1 Show an error message if a sentence of a function of an extension is using a parameter that does not exist (#4395) 2022-10-14 23:15:30 +02:00
AlexandreS
69f8961e9e Fix: Keep variable name checks only for top level variables (#4392) 2022-10-14 15:57:59 +02:00
github-actions[bot]
1abb39ec17 Update translations [skip ci] (#4360)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2022-10-14 14:31:07 +02:00
Clément Pasteau
c5226c1e45 Fix clearing storage provider on project close (#4390)
Do not show in changelog
2022-10-14 14:06:02 +02:00
Florian Rival
d40789005b Add link to Liluo.io in the README
Don't show in changelog
2022-10-13 18:24:02 +02:00
D8H
fcbe5c364e Add a field to define behavior property descriptions (#4389) 2022-10-13 15:38:09 +02:00
D8H
df3433c55f Add autocompletion for timers, tweens and other extensions identifiers (#4386) 2022-10-13 13:39:53 +02:00
D8H
7d892fd976 Update extension field hints to fit the good practices (#4375) 2022-10-13 13:19:51 +02:00
D8H
56320d7253 Move some stories to LayoutEditor and ObjectEditor (#4388)
* Add a story for a custom object property editor.
* Add a story for the particle emitter editor.
2022-10-13 09:51:49 +02:00
AlexandreS
05acd061bd Fix leaderboard entry creation duplicate conditions to avoid spamming servers 2022-10-12 18:03:01 +02:00
Clément Pasteau
7991ceb351 Improve the editor scrollbars to be more intuitive (#4377) 2022-10-12 16:35:27 +02:00
Clément Pasteau
bf6d18ccbe Notify when a new version is available to be automatically installed on the web (#4371) 2022-10-12 16:31:58 +02:00
AlexandreS
536b7dcc62 Fix: Wrap text of game feedback when it's a single really long word 2022-10-12 11:45:51 +02:00
AlexandreS
a157f32d4a Fix: Update window border in scene editor when the project resolution is changed 2022-10-12 11:02:37 +02:00
Clément Pasteau
49f579f32d Allow using private assets in the asset store (#4355)
* Once a pack is bought, the assets are visible in the asset store directly
* The asset can be added when the project is saved locally, or on the cloud
* Fix Storage Provider being correctly reset when closing/opening a project
2022-10-11 13:59:40 +02:00
Clément Pasteau
8f4ecd373f Get Game categories from backend allowing more flexibility for jams (#4370)
Do not show in changelog
2022-10-07 18:32:33 +02:00
Aurélien Vivet
a3a53415b1 Add missing id for the onboarding (#4369)
Don't show in changelog
2022-10-07 15:49:13 +02:00
Aurélien Vivet
c278c0a432 Fix parameters order in the events sheet sentence of "Change the gradient of the text" action (#4368) 2022-10-07 10:40:39 +02:00
AlexandreS
862f270b83 Fix extension icon store displaying white hard-to-see icons on light theme 2022-10-07 09:56:55 +02:00
AlexandreS
7232dbc2fa Fix: Reinitialize object default hitboxes when reinitializing it (#4362) 2022-10-06 17:38:39 +02:00
AlexandreS
78cbe48718 Fix points editor not updating correctly when deleting points 2022-10-06 12:40:04 +02:00
Florian Rival
e153d295de Bump newIDE version 2022-10-06 10:35:33 +02:00
AlexandreS
1b8510655e Revert "Add expression and condition to get highest z order of a layer (#4346)" (#4359)
Don't show in changelog
2022-10-06 10:34:41 +02:00
github-actions[bot]
bd88127563 Update translations [skip ci] (#4342)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2022-10-06 10:25:39 +02:00
AlexandreS
01b9f09604 Fix: Add parameter to file reading actions to remove CR characters from files (#4352)
⚠️ If you had encountered an issue linked to this and changed your events to fix it, you might need to update your project and set this new parameter to "No"
2022-10-05 14:11:21 +02:00
Florian Rival
0db30f02c9 Add support for opening onboarding directly on the web-app
https://editor.gdevelop.io/?initial-dialog=onboarding

Don't show in changelog
2022-10-04 16:03:12 +02:00
D8H
a852e91690 Add missing expression group icons (#4353) 2022-10-04 14:56:59 +02:00
AlexandreS
79d6281061 Add expression and condition to get highest z order of a layer (#4346) 2022-10-04 14:31:49 +02:00
AlexandreS
eba6b2540c Add price to assets home private asset packs thumbnails and display them in their dialog (#4350)
Don't show in changelog
2022-10-04 12:13:25 +02:00
D8H
0706a54305 Reorganize extensions categories (#4345) 2022-10-04 10:37:27 +02:00
D8H
d929fd6e48 Add a test on sprite hit-boxes after a camera displacement (#4349)
* Don't show in changelog
2022-10-03 14:17:01 +02:00
Florian Rival
4dbabab052 Bump newIDE version 2022-09-30 15:43:18 +02:00
D8H
827c5d6442 Add an extension category filter (#4341) 2022-09-30 15:14:23 +02:00
Florian Rival
46be0e0ffc Change previews so that they use the development environment for GDevelop APIs if running GDevelop development version (#4343)
Only show in developer changelog
2022-09-30 14:55:50 +02:00
github-actions[bot]
72e3cf5b99 Update translations (#4313) 2022-09-30 10:12:34 +02:00
D8H
54f32a2542 Add new categories for extensions (#4331) 2022-09-29 18:24:06 +02:00
D8H
b826f66455 Make the custom object renderer works better with 9-patch and text child-objects (#4335)
* Don't show in changelogs.
2022-09-29 17:16:41 +02:00
D8H
6fc03cccc6 Add help buttons in the expression editor and the extension details dialog (#4337) 2022-09-29 15:44:16 +02:00
AlexandreS
ed7313a330 Add invert condition shortcut (J key by default - configurable in your preferences) (#4334) 2022-09-29 11:18:33 +02:00
D8H
7390f7cd6a Ensure required behavior properties can't be hidden (#4336) 2022-09-29 09:54:01 +02:00
D8H
4619ae824b Allow event-based objects to define a default name for created objects (#4329)
* Don't show in changelogs
2022-09-28 17:43:51 +02:00
D8H
0f69ee435f Add tests on behavior properties initialization and unserialization (#4314)
* Don't show in changelogs
2022-09-28 17:43:18 +02:00
AlexandreS
f46241d5a2 Fix bug that prevented converting a variable to JSON when one previously tried to access an out-of-index child in a variable array (#4333) 2022-09-28 17:39:53 +02:00
D8H
4c8ec48004 Add subsections for extensions categories in the Wiki (#4332)
* Add a warning message on pages for extensions from the community list.
2022-09-28 15:34:03 +02:00
AlexandreS
3ac121be4c Add asset packs that can be purchased in the Asset store home (#4328)
Do not show in changelog
2022-09-28 15:29:45 +02:00
D8H
3aa636861c Custom objects take the icon of one of their sprite child (#4316)
* Don't show in changelogs.
2022-09-27 16:19:12 +02:00
D8H
6d4b422be6 Fix extension description links on the Wiki (#4325) 2022-09-27 16:18:18 +02:00
Clément Pasteau
b8ee27f62c Improve player authentication
* Improve player authentication by indicating when the game is not registered
* Show a link to open the window if blocked

Do not show in changelog
2022-09-27 15:19:06 +02:00
AlexandreS
6996ff452d Fix various memory leaks when using the app (#4323) 2022-09-23 18:34:34 +02:00
AlexandreS
da7934c6ac Add context menu items to manipulate the view on the scene editor (#4307)
- Return to initial position (view matches the game resolution)
- Fit zoom to selected instances
- Fit zoom to the whole scene
- Select all instances of an object on the scene (in the context menu of an object)
2022-09-23 13:27:40 +02:00
Clément Pasteau
90bebcb404 Create GDevelop Authentication extension
* This is an experimental extension!
* It allows you to provide a login/register form to your players, with 1 action
* It connects the player automatically when they launch your game again
* It also provides a new action to submit a leaderboard entry without having to enter a username
* This is the beginning of Player Authentication and more features will come allowing creators to interact with their players
2022-09-23 10:44:58 +02:00
D8H
a29e7aae44 Bump newIDE version (#4317) 2022-09-22 12:22:11 +02:00
D8H
52201e2a36 Fix tiles rotation that was no longer applied in tile maps (#4315) 2022-09-22 10:25:38 +02:00
Florian Rival
50465badd7 Bump newIDE version 2022-09-21 10:01:17 +02:00
D8H
6e1bfb0190 Fix properties on the scene of the Physics behavior not working ("shared data" of behaviors not handled properly) (#4310) 2022-09-21 09:56:38 +02:00
Aurélien Vivet
40c7c57670 Add issue template for Asset Store Submission [skip ci] (#4309)
Don't show in changelog
2022-09-20 21:43:43 +02:00
github-actions[bot]
e51c73b293 Update translations [skip ci] (#4306)
Co-authored-by: 4ian <4ian@users.noreply.github.com>
2022-09-19 11:16:17 +02:00
Florian Rival
29d5d5fe75 Bump newIDE version 2022-09-19 10:23:17 +02:00
AlexandreS
6e1f2c4eee Fix parameter fields being reset to their old value after being changed (#4308) 2022-09-19 09:28:50 +02:00
Florian Rival
2f2a89faf6 Use a purple heart instead of a red one to look less like an error
Don't show in changelog
2022-09-16 12:23:15 +02:00
AlexandreS
4100b24dfd Improve display of black icons on dark themes (#4302) 2022-09-16 12:22:11 +02:00
AlexandreS
c616abe1c5 Bump newIDE version 2022-09-16 10:45:10 +02:00
Aurélien Vivet
35084de4f6 Add a new expression: Pi number (3.1415...) (#4304) 2022-09-16 10:30:46 +02:00
github-actions[bot]
6ecb5e9d8c Update translations [skip ci] (#4291)
Co-authored-by: D8H <D8H@users.noreply.github.com>
2022-09-16 10:09:03 +02:00
D8H
9532a8f6de Fix extension upgrades that was leaving duplicated behaviors. (#4301)
- Don't show in changelogs (the regression is between the 140 and the 141)
2022-09-15 15:43:28 +02:00
D8H
00a5b0b402 Fix events-based behavior default name. (#4300)
* Don't show in changelogs (the regression is between the 140 and the 141)
2022-09-15 11:57:28 +02:00
D8H
629567ad21 Fix tile maps with rectangular tiles (#4299) 2022-09-14 19:04:42 +02:00
D8H
5f21229ccc Remove a file commited by mistake (#4296) 2022-09-14 18:40:48 +02:00
Florian Rival
27cf2ef596 Remove shadow on home page menu buttons
Don't show in changelog
2022-09-14 16:44:47 +02:00
AlexandreS
2bc9a6d19d Fix previews on private navigation for cloud projects
Do not show in changelog
2022-09-14 16:29:15 +02:00
Florian Rival
c6c586459c Update the subscriptions plans to reflect the new ones and their updated benefits (#4290)
* Read [the blog post](https://gdevelop.io/blog/new-premium-subscriptions-online-services) for a full description of the updates and online services unlocked by the updated (and the existing) plans.
2022-09-14 11:33:37 +02:00
AlexandreS
a930011d8d Bump newIDE version 2022-09-14 10:24:54 +02:00
github-actions[bot]
51d723bd3d Update translations [skip ci] (#4284) 2022-09-14 10:21:23 +02:00
D8H
b63f968011 Fix resource refactoring for child-objects (#4289)
* Don't show in changelogs.
2022-09-14 09:41:07 +02:00
Florian Rival
3387c553d8 Fix previews not loading audio/font/json resources uploaded with the web-app (#4285)
Don't show in changelog
2022-09-13 16:41:33 +02:00
D8H
441cd20846 Fix a crash when renaming a child-object (#4281)
* Add tests for object renaming in events.
* Don't show in changelogs.
2022-09-13 12:46:20 +02:00
AlexandreS
f9871bd63d Add supported formats mimtypes to resource selector input accept attributes (#4283)
[skip-ci]
2022-09-13 11:51:22 +02:00
github-actions[bot]
bac11b3818 Update translations [skip ci] (#4230)
Co-authored-by: D8H <D8H@users.noreply.github.com>
2022-09-13 10:37:01 +02:00
D8H
3e32cb8cea Fix the events-based objects editor that were never showing up in dev mode (#4279)
* Don't show in changelogs
2022-09-12 10:48:22 +02:00
Florian Rival
db74a59730 Add support for markdown in announcements (#4280)
Don't show in changelog
2022-09-12 10:28:32 +02:00
D8H
e7d09531b7 Fix event-based behavior properties default values that were ignored (#4276)
* Don't show in changelogs
2022-09-09 17:56:27 +02:00
Florian Rival
97cf19180b Rename Behaviors/Functions to Extensions in the project manager (#4272)
Don't show in changelog
2022-09-09 14:08:13 +02:00
Florian Rival
5cc999c0a3 Add announcements and news in the homepage community tab (#4273)
* Also display "urgent" announcements at the top of the home page (which can be dismissed).
2022-09-09 10:50:49 +02:00
D8H
5eb0aa9e14 Add an instance render for custom objects (#4251)
* Don't show in changelogs
2022-09-06 12:41:38 +02:00
D8H
7f528649d7 Revert the RendererInstance parameter for the tile map extension (#4260)
* Don't show in changelogs
2022-09-05 19:38:47 +02:00
D8H
c4f44daa8c Expose a gdObject constructor for the asset script (#4268)
* Don't show in changelogs.
2022-09-05 16:14:54 +02:00
AlexandreS
7d00e78628 Change the name of exports to be based on the name and version of the game 2022-09-05 12:12:39 +02:00
Aurélien Vivet
887ced270a Add the possibility to receive the GDevelop newsletter from the Profile and on Signup (#4256) 2022-09-05 10:32:30 +02:00
D8H
b8e9bc801a Add a properties editor for custom objects (#4227)
* Don't show in changelogs
2022-09-02 14:13:41 +02:00
D8H
7f023e1a58 Remove useless SetIncludeFile call. (#4255)
- Most of them has a wrong path anyway.
- Don't show in changelogs.
2022-09-01 14:30:24 +02:00
AlexandreS
6606ddb260 Improve SVG display in Resource Store for dark themes 2022-09-01 09:31:04 +02:00
Clément Pasteau
a682c1baa8 Update "Submit New Extension" link with new format (#4254) 2022-08-31 14:47:32 +02:00
Clément Pasteau
d581af20e1 Improve Signup and Edit profile to show when a username is not available 2022-08-31 13:59:14 +02:00
Florian Rival
2abf636283 Fix tests on Windows
Don't show in changelog
2022-08-30 18:15:08 +02:00
D8H
7d09853c12 Fix tile maps layer filtering (#4249) 2022-08-30 14:31:28 +02:00
AlexandreS
bb88f3ae4d Add button to release notes in about dialog
Do not show in changelog
2022-08-30 13:52:10 +02:00
D8H
44b06039e1 Upgrade the Pixi tile map extension to 3.2.2 (#4212)
* It also lifts the 16,000 tiles limit.
2022-08-30 13:11:59 +02:00
Clément Pasteau
9c7f2e4293 Remove user public profile search type (#4243)
Do not show in changelog
2022-08-30 11:26:12 +02:00
AlexandreS
facbbe614d Add button in changelog dialog to read on Github to benefit from browser translator 2022-08-30 11:09:15 +02:00
AlexandreS
d5cadadf82 Fix browser translator crashing the app 2022-08-29 11:30:52 +02:00
D8H
aed4b76a3f Refactor behavior configuration model (#4217)
* Merge BehaviorContent into Behavior and add CustomBehavior
* Don't show in changelogs
2022-08-29 09:21:21 +02:00
Florian Rival
b1e03f4555 Add support for uploading your own files from your device for cloud project on the web-app (#4225)
* You can now upload your own files when working on the web-app, when your project is saved as a Cloud project.
* This means the web-app can be used without limits to build any game you could build on the desktop app.
* Support for Cloud projects on the desktop app will be available soon. You will also be able to save an existing project on your computer as a cloud project, or vice versa.
2022-08-28 22:30:58 +02:00
D8H
93be3153b5 Fix useless "Change" prefix in some actions name (#4238) 2022-08-28 21:44:23 +02:00
Aurélien Vivet
d0c9ff6754 Fix the action to tween the number of a scene variable (#4235) 2022-08-28 16:53:16 +02:00
AlexandreS
a5cf0896bc Fix the wording of the layer field when the layer is not optional (though it has a default value: the base layer) (#4232) 2022-08-26 17:12:40 +02:00
Clément Pasteau
7f6ce26c43 Handle players logging in to GDevelop and becoming creators (#4231)
Do not show in changelog
2022-08-26 13:51:45 +02:00
AlexandreS
eda9db6b40 Fix points coordinates inputs not losing focus when moving points on the preview 2022-08-26 09:55:37 +02:00
github-actions[bot]
b9405f5e7d Update translations [skip ci] (#4220)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2022-08-26 09:26:08 +02:00
Clément Pasteau
ca591f60d6 Improve game templates visibility
* Change "Create a new project" action from the command palette to directly open a blank project
* Add 2 new actions in the Desktop menu "Create an empty project" and "Create a project from a template"
* Templates are now displayed at the top of the Build section
* The button "Create a project" in the Build section now directly opens a blank project
2022-08-25 16:49:37 +02:00
Peter Anderson
214e012ec4 Rename object variables expression names to differentiate number and text variables. 2022-08-25 15:32:39 +02:00
Aurélien Vivet
9cc0172a60 Add Educational tag for games on Liluo.io (#4222) 2022-08-25 10:20:34 +02:00
Florian Rival
6e01228ae6 Fix Safari/iOS unable to load some images in the app (#4148) 2022-08-24 12:25:33 +02:00
github-actions[bot]
e22611625e Update translations [skip ci] (#4205)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2022-08-22 14:58:20 +02:00
Clément Pasteau
28ccb55a06 Improve onboarding banner (#4216)
Do not show in changelog
2022-08-22 14:41:07 +02:00
D8H
7893b892a3 Add an events-based object editor prototype (#4208)
* don't show in change logs
2022-08-22 14:05:58 +02:00
Arthur Pacaud
10b3c50a42 Fix parameter to specify the P2P port not being an expression (#4215) 2022-08-22 12:00:09 +02:00
D8H
8c5fbc6e34 Add missing translations for some messages shown when renaming an object (#4213) 2022-08-21 19:00:10 +02:00
Aurélien Vivet
a40382333b Fix the name of the "End Opacity" condition of the particle emitters (#4214) 2022-08-21 16:47:43 +02:00
Florian Rival
fb95f26fbb Update artifacts download script to include arm64 build artifacts [skip ci] [ci skip]
Don't show in changelog
2022-08-18 10:14:08 +02:00
Florian Rival
48a90ae86d Display a super thin or invisible scrollbars for the toolbar and tabs, according to the browser 2022-08-18 09:16:49 +02:00
Florian Rival
6303a50a9d Enable macOS build for Apple Silicon and arm64 builds for Linux (#4031) 2022-08-17 16:02:25 +02:00
D8H
a47ec5199e Limit the number of autocompletion elements displayed for extensions search tags. (#4207)
Don't show in changelog
2022-08-17 11:43:24 +02:00
D8H
a6921c2de3 Fix the extensions search bar that was only using the first 30 tags alphabetically (#4206) 2022-08-17 10:17:57 +02:00
Florian Rival
b21b6f0dfb Bump newIDE version 2022-08-16 18:01:34 +02:00
Florian Rival
c0d4480099 Update AdMob to declare AD_ID permission on Android, as required for Android 13 2022-08-16 17:50:53 +02:00
github-actions[bot]
56277ff5d3 Update translations [skip ci] (#4204)
Co-authored-by: 4ian <4ian@users.noreply.github.com>
2022-08-16 17:04:22 +02:00
Florian Rival
4fa1fbd5e2 Remove useless files being scanned for translations
Don't show in changelog
2022-08-16 16:51:30 +02:00
Florian Rival
f61ef1be2e Add monetization tab in game dashboard
* Allow to enable or disable ads on the game page if published on Liluo.io
* In the future, games that generate enough revenue will be able to opt-in into "revenue share", so that as a creator you can start earning from your game sessions.
* This also this allows to maintain free publishing on Liluo.io for all.
2022-08-16 16:40:52 +02:00
github-actions[bot]
bf387631ec Update translations [skip ci] (#4173)
Co-authored-by: 4ian <4ian@users.noreply.github.com>
2022-08-16 14:18:32 +02:00
Florian Rival
981752af26 Make compile-translations script more robust
Don't show in changelog
2022-08-16 14:09:52 +02:00
Florian Rival
58e5933c75 Update GDevelop logo in the about dialog
Don't show in changelog
2022-08-12 22:47:23 +02:00
Florian Rival
237ad8ce39 Show the full version number in the About dialog, and the update status for the web-app (#4202) 2022-08-12 20:41:23 +02:00
Florian Rival
02225cb0ec Move the preferences button in the home page (#4201)
* Also display the full GDevelop version number in the "About GDevelop" button in the home page - useful to check if you're on the latest version when using the web-app
2022-08-12 19:26:09 +02:00
Florian Rival
b34426e084 Add support for Android 12 splashscreen icon (#4200) 2022-08-12 18:48:10 +02:00
Florian Rival
23c09f3472 Fix buttons to download exported games not shown as primary buttons 2022-08-12 17:01:59 +02:00
D8H
59a7690748 Fix the "move parameter" refactor for expressions in the extension editor (#3968) 2022-08-12 14:04:12 +02:00
Aurélien Vivet
3e97d4b878 Clarify the name of the actions to resume a paused sound/music (#4199) 2022-08-12 12:20:27 +02:00
Florian Rival
d710dd0335 Fix sourcemap of Box2D wasm source wrongly included when exporting
Don't show in changelog
2022-08-11 21:53:13 +02:00
Aurélien Vivet
78695b6b17 Fix wrong description of Firebase "Check for a document's existence" action (#4198) 2022-08-11 21:48:24 +02:00
Florian Rival
4e3dec4356 Upgrade Admob so that it works with the latest Android SDK, required to publish apps on the Play Store (#4197) 2022-08-11 17:33:40 +02:00
D8H
f373e3b8d1 Fix the export of game using Box2d WASM library (#4195)
Don't show in changelog
2022-08-11 15:42:47 +02:00
Clément Pasteau
3e71c3a63f Fix saving project after creation (#4194)
Do not show in changelog
2022-08-10 11:31:49 +02:00
Clément Pasteau
86cad044d4 Add a test button to display staging assets in dev (#4170)
Do not show in changelog
2022-08-10 11:18:03 +02:00
Florian Rival
21b525ab98 Fix raycast condition not working properly on objects with multiple hitboxes (#4186) 2022-08-09 11:21:57 +02:00
Clément Pasteau
fb328fd0f5 Install fixes (#4190)
Do not show in changelog
2022-08-09 10:06:49 +02:00
Aurélien Vivet
afdb934a8a Fix typo (#4191) 2022-08-08 17:56:41 +02:00
AlexandreS
530f756e47 Add possibility to seal an instance (impossible to select it on the canvas) 2022-08-08 14:20:11 +02:00
Sebastian Krzyszkowiak
b1fb207a08 Minimize in game/real cursor flickering when showing/hiding the cursor (#4184) 2022-08-05 23:17:35 +02:00
Florian Rival
5f87213ccd Improve messages when reaching the maximum count of cloud projects 2022-08-05 22:56:21 +02:00
Florian Rival
9065454bfe Add more cloud projects for GDevelop online subscribers (#4183)
Don't show in changelog
2022-08-05 18:33:14 +02:00
Florian Rival
801fbb4b10 Fix orange outline sometimes appearing around the scene editor canvas 2022-08-05 18:29:22 +02:00
D8H
cfa538ec3d Fix the collision mask of rotated tiles that were sometimes misplaced (#4181) 2022-08-05 18:10:06 +02:00
D8H
504443dea4 Fix a game analytics test (#4182)
It was building data with fixed dates that were processed using the real today date.
Don't show in change logs.
2022-08-05 16:56:39 +02:00
Florian Rival
bdbc665d2e Fix exported WebManifest file having a syntax error when the game description has line breaks
Fix #4180
2022-08-05 09:13:25 +02:00
D8H
1d77f2da23 Replace the Box2D library with a WebAssembly one (#4153)
* It fixes a crash of the old Box2D library when a lot of objects with the Physics2 behavior were created.
* The same version of Box2d (2.3.1) is still used so there should not be any behavior change.
2022-08-04 18:11:00 +02:00
AlexandreS
7b6aa78aeb Fix memory leak at the end of a cloud project save (#4178)
Do not show in changelog
2022-08-04 16:19:09 +02:00
AlexandreS
e9aaed9d41 Fix json resource removed from project resources although it is used in event 2022-08-04 14:05:42 +02:00
Florian Rival
982c9e38c1 Add support for subscribing to GDevelop premium accounts with PayPal (#4166)
* You can now get a subscription, support GDevelop development and get more one-click online exports every day, using PayPal (or using credit cards as done previously).
2022-08-03 23:00:08 +02:00
Arthur Pacaud
c86388018c Add tween actions for camera zoom and camera rotation (#4174) 2022-08-03 22:21:45 +02:00
AlexandreS
6ae1b62df7 Add possibility to remove a project from the recent project list
Do not show in changelog
2022-08-03 17:42:33 +02:00
AlexandreS
ea745a49d7 Set storage provider before opening file metadata (#4175)
Do not show in changelog
2022-08-03 17:28:16 +02:00
AlexandreS
48fc2f640b Fix google drive project display in build section
Do not show in changelog
2022-08-03 16:31:15 +02:00
github-actions[bot]
a86ee8c338 Update translations [skip ci] (#4139)
Co-authored-by: AlexandreSi <AlexandreSi@users.noreply.github.com>
2022-08-03 15:52:37 +02:00
AlexandreS
1787b3c5c8 Improve communication around cloud projects
Do not show in changelog
2022-08-03 15:42:20 +02:00
D8H
3e246e3cf0 Fix the loading of tile map atlases that was aborted when the image contains unused pixels at the right or bottom. (#4167) 2022-08-02 10:53:04 +02:00
AlexandreS
5035d16bd4 Improve game dashboard naming
Do not show in changelog
2022-08-01 17:04:41 +02:00
AlexandreS
2f6109a21c Display a custom error message when user has too may cloud projects
Do not show in changelog
2022-08-01 14:42:21 +02:00
D8H
0792fdadc7 Fix the tile map collision mask debug rendering that wasn't refreshed when there was no collision condition nor bahavior (#4162) 2022-08-01 10:21:17 +02:00
Clément Pasteau
0ca596e287 Remove scrolling on liluo iframe (#4159) 2022-07-29 18:13:27 +02:00
Florian Rival
899a252ddd Fix starters shown at the bottom of the example list on Firefox 2022-07-29 17:32:50 +02:00
AlexandreS
d92bf23e58 Fix double opening of project
Do not show in changelog
2022-07-29 15:11:20 +02:00
AlexandreS
37ae451178 Improve Homepage project list with more context actions and better display for local projects 2022-07-29 14:30:36 +02:00
Clément Pasteau
9c47a92ea6 Move asset store actions to be at the bottom of the dialog 2022-07-29 13:22:34 +02:00
Aurélien Vivet
1afd4b94be Fix a typo: Remove a double from (#4154)
Don't show in the changelog
2022-07-29 10:47:07 +02:00
Clément Pasteau
4d5a3f499f Rework play section to display Liluo games (#4151)
* Rework play section to display Liluo games

* ensure message origin
2022-07-29 10:12:02 +02:00
AlexandreS
13da1c56fd Add GDevelop own Cloud storage for web-app project
In order to make the life easier for our users on the web-app, we created GDevelop's cloud storage.
With a GDevelop account on the web-app, you can now save your project online and retrieve it from any device.
2022-07-28 15:26:41 +02:00
Clément Pasteau
8131ffcdb5 Fix Asset cards text color to be visible on light theme (#4152) 2022-07-28 14:55:39 +02:00
AlexandreS
77f948bfbf Improve search and replace in event sheet
- Fix a bug that hangs GDevelop when replacing with an empty search text
- Allow to replace with an empty string to mimic a "Delete search text" feature
2022-07-27 15:33:28 +02:00
D8H
c6abfc5433 Add type definitions on the Physics2 extension (#4147) 2022-07-27 09:47:32 +02:00
Florian Rival
2777e458ae Fix Add condition/action buttons overflowing outside of their column on small screens 2022-07-26 23:13:19 +02:00
Florian Rival
1d0695d722 Improve again rendering of the examples list on small screens
Don't show in changelog
2022-07-26 23:00:33 +02:00
Florian Rival
1820575f52 Fix display of the examples/starters on small screens (#4146) 2022-07-26 18:16:41 +02:00
Arthur Pacaud
f62236788d Add various improvements to the P2P extension (#4145)
- Updated PeerJS.
- Fixes for Safari.
- Improved typings.
- New default TURN server.
- Add a JavaScript API to get access to the raw connection.
  This allows to send custom messages from JavaScript. This allows to use a binary protocol from JavaScript.
- Use Map instead of JavaScript objects in places where it makes sense (more performant and less error prone).
- Avoid making a redundant get for every connection on the map containing the connections.

Only show in developer changelog
2022-07-26 14:25:08 +02:00
D8H
247e2f39e0 Add actions to change the tile map dimensions (#4141) 2022-07-26 09:20:27 +02:00
D8H
30898058a4 Fix layer names in drop-down lists were translated even though they are defined by users (#4130) 2022-07-25 18:53:30 +02:00
D8H
4e5d268f63 Handle tile maps with invalid resources (#4140)
* Fix an uncatched exceptions when a tile map resource is not set.
* Show place-holders for tile map with invalid resources in the instances editor.
* Give a better default name to tile map collision mask objects.
* Add a border around the tile map collision mask objects in the instance editor.
2022-07-25 17:33:08 +02:00
github-actions[bot]
fc4072b055 Update translations [skip ci] (#4132)
Co-authored-by: D8H <D8H@users.noreply.github.com>
2022-07-25 11:18:38 +02:00
Clément Pasteau
9adec3ac72 Fix manual export URLs crashing the app on web (#4138) 2022-07-25 11:17:35 +02:00
D8H
95c2efbe07 Fix tilemaps object boxes to keep the empty tiles margins (#4133)
* It makes the same boxes as the tilemaps collision mask object to ease positioning.
* If the extra margin is not intended the right size can be set with Tiled.
2022-07-25 10:51:20 +02:00
Florian Rival
5a71b3a05f Add the unit (milliseconds) in the Tween behavior action parameters (#4137) 2022-07-24 22:23:35 +02:00
Florian Rival
fe87150cd4 Fix rendering of the home page on Safari (#4136) 2022-07-24 20:14:10 +02:00
Florian Rival
ddd3dc095a Fix wrong colors on the progress bar of the leaderboard creation dialog (#4135)
Don't show in changelog
2022-07-24 18:49:19 +02:00
Florian Rival
43bd02f99f Fix groups being redlined in the events sheet (#4134)
Do not show in changelog
2022-07-24 16:05:47 +02:00
github-actions[bot]
7ebf3c559b Update translations [skip ci] (#4122)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2022-07-22 14:04:30 +02:00
D8H
a5dca5fcb7 Fix: tilemaps were making the webapp crash due to a broken link. (#4131) 2022-07-22 14:03:19 +02:00
VegeTato
179a130d30 Update AboutDialog.js (#4127)
Added my twitter link beside my name :)
2022-07-22 11:00:50 +02:00
Peter Anderson
9953d33764 Issue #4119: Fix colours of expanded/collapsed arrows on event sheet. (#4129) 2022-07-22 10:58:58 +02:00
Clément Pasteau
5cb8603b56 Reduce max size of get started tiles (#4126)
Do not show in changelog
2022-07-22 10:10:04 +02:00
D8H
5278628480 Show typing errors of object parameters directly on the event sheet (#4121) 2022-07-21 09:23:40 +02:00
github-actions[bot]
99b615c573 Update translations [skip ci] (#4117)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2022-07-19 11:34:30 +02:00
2971 changed files with 168183 additions and 152979 deletions

View File

@@ -68,7 +68,7 @@ jobs:
- run:
name: Clean dist folder to keep only installers/binaries.
command: rm -rf "newIDE/electron-app/dist/mac/GDevelop 5.app"
command: rm -rf "newIDE/electron-app/dist/mac/GDevelop 5.app" && rm -rf "newIDE/electron-app/dist/mac-arm64/GDevelop 5.app"
# Upload artifacts (CircleCI)
- store_artifacts:
@@ -143,11 +143,11 @@ 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 zip deb --publish=never
command: export NODE_OPTIONS="--max-old-space-size=7168" && cd newIDE/electron-app && npm run build -- --linux --publish=never
- run:
name: Clean dist folder to keep only installers/binaries.
command: rm -rf newIDE/electron-app/dist/linux-unpacked
command: rm -rf newIDE/electron-app/dist/linux-unpacked && rm -rf newIDE/electron-app/dist/linux-arm64-unpacked
# Upload artifacts (CircleCI)
- store_artifacts:

View File

@@ -1,6 +0,0 @@
# This is the Dockerfile to create a "devcontainer".
# This is a way to quickly create a development environment,
# that can be used with GitHub workspaces.
# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.162.0/containers/codespaces-linux/.devcontainer/base.Dockerfile
FROM mcr.microsoft.com/vscode/devcontainers/universal:1-focal

View File

@@ -1,16 +0,0 @@
# Devcontainer (development environment in the cloud) for GDevelop (beta)
A devcontainer is the configuration to run a cloud development environment, available remotely.
This is notably used to run a **[GitHub Codespace](https://docs.github.com/en/github/developing-online-with-codespaces/about-codespaces)**. The advantage is that you can quickly experiment and do changes without installing anything on your computer.
> ⚠️ This development environment is in beta, and not everything is supported. This is useful for playing a bit with GDevelop codebase or to make quick changes. **In particular, it's not possible to test your changes on GDJS** because only the web-app can be launched.
It's recommended that you follow the usual [README](../newIDE/README.md) to get started, with development tools installed on your computer.
## Start a GitHub workspace to work on GDevelop (beta)
- Subscribe to the [beta edition of GitHub workspace](https://docs.github.com/en/github/developing-online-with-codespaces/about-codespaces#joining-the-beta).
- In the repository GitHub page, click **Code** and then choose **Open with Codespaces**.
- Wait for the Codespace to load and Visual Studio Code to open.
- When it's ready, open a terminal in Visual Studio Code.
- Follow the usual [README in `newIDE`](../newIDE/README.md) to get started, like you would do on your own computer.

View File

@@ -1,51 +0,0 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
// https://github.com/microsoft/vscode-dev-containers/tree/v0.162.0/containers/codespaces-linux
{
"name": "GitHub Codespaces for GDevelop",
"build": {
"dockerfile": "Dockerfile"
},
"settings": {
"terminal.integrated.shell.linux": "/bin/zsh",
"go.toolsManagement.checkForUpdates": "off",
"go.useLanguageServer": true,
"go.gopath": "/go",
"go.goroot": "/usr/local/go",
"python.pythonPath": "/opt/python/latest/bin/python",
"python.linting.enabled": true,
"python.linting.pylintEnabled": true,
"python.formatting.autopep8Path": "/usr/local/py-utils/bin/autopep8",
"python.formatting.blackPath": "/usr/local/py-utils/bin/black",
"python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf",
"python.linting.banditPath": "/usr/local/py-utils/bin/bandit",
"python.linting.flake8Path": "/usr/local/py-utils/bin/flake8",
"python.linting.mypyPath": "/usr/local/py-utils/bin/mypy",
"python.linting.pycodestylePath": "/usr/local/py-utils/bin/pycodestyle",
"python.linting.pydocstylePath": "/usr/local/py-utils/bin/pydocstyle",
"python.linting.pylintPath": "/usr/local/py-utils/bin/pylint",
"lldb.executable": "/usr/bin/lldb",
"files.watcherExclude": {
"**/target/**": true
}
},
"remoteUser": "codespace",
"overrideCommand": false,
"workspaceMount": "source=${localWorkspaceFolder},target=/home/codespace/workspace,type=bind,consistency=cached",
"workspaceFolder": "/home/codespace/workspace",
"runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined", "--privileged", "--init" ],
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"GitHub.vscode-pull-request-github",
"esbenp.prettier-vscode",
"ms-vscode.cpptools",
"xaver.clang-format",
"flowtype.flow-for-vscode"
],
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// "oryx build" will automatically install your dependencies and attempt to build your project
"postCreateCommand": "oryx build -p virtualenv_name=.venv || echo 'Could not auto-build. Skipping.'"
}

View File

@@ -0,0 +1,19 @@
---
name: "📦 Asset Store submission"
about: Submit a free asset pack for the GDevelop Asset Store.
title: ''
labels: "📦 Asset Store submission"
assignees: ''
---
BEFORE opening a new submission, please make sure that you:
- You have packaged the asset pack according [these rules](https://wiki.gdevelop.io/gdevelop5/community/contribute-to-the-assets-store). Otherwise, your package may be rejected or we will ask you to do the changes.
## Description
- License:
- Author:
- Link to the original website:
- Zip file:

View File

@@ -1,28 +0,0 @@
---
name: "\U0001F41BBug report"
about: Create a bug report about GDevelop or the game engine
title: ''
labels: ''
assignees: ''
---
## Describe the bug
A clear and concise description of what the bug is.
Please double check that the bug is not already reported in the issues list.
## To Reproduce
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
* Please include a link to a game if possible!
* If applicable, add screenshots to help explain your problem.
## Other details
* Include any OS/browser version/smartphone that you're using
* Which version of GDevelop are you using? The desktop app or the web-app?
* Add any other context about the problem here.

71
.github/ISSUE_TEMPLATE/--bug-report.yml vendored Normal file
View File

@@ -0,0 +1,71 @@
name: 🐛Bug report
description: Create a bug report about GDevelop or the game engine
body:
- type: checkboxes
attributes:
label: Is there an existing issue for this?
options:
- label: I have searched the [existing issues](https://github.com/4ian/GDevelop/issues)
required: true
- type: textarea
attributes:
label: Describe the bug
description: A clear and concise description of what the bug is.
validations:
required: true
- type: textarea
attributes:
label: Steps to reproduce
description: |
* Please include a link to a game if possible!
* If applicable, add screenshots to help explain your problem.
placeholder: |
1. Go to '...'
2. Click on '...'
3. Scroll down to '...'
4. See error
validations:
required: true
- type: dropdown
attributes:
label: GDevelop platform
description: Which platform of GDevelop are you using?
multiple: true
options:
- Desktop
- Web
- Mobile
validations:
required: true
- type: input
attributes:
label: GDevelop version
description: |
Which version of GDevelop are you using?
Take a look here: [Editor Home - About GDevelop - "This version of GDevelop is: ~~~"]
placeholder: 5.1.159? 5.1.160?
validations:
required: true
- type: textarea
attributes:
label: Platform info
value: |
<details>
*OS (e.g. Windows, Linux, macOS, Android, iOS)*
>
*OS Version (e.g. Windows 10, macOS 10.15)*
>
*Browser(For Web) (e.g. Chrome, Firefox, Safari)*
>
*Device(For Mobile) (e.g. iPhone 12, Samsung Galaxy S21)*
>
</details>
- type: textarea
attributes:
label: Additional context
description: Add any other context about the problem here.

View File

@@ -17,6 +17,10 @@ jobs:
build-storybook:
runs-on: ubuntu-latest
steps:
- uses: actions/setup-node@v3
with:
node-version: 16
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
@@ -57,8 +61,8 @@ jobs:
- name: Log urls to the Storybook
run: |
echo "Find the latest Storybook for this branch on http://gdevelop-storybook.s3-website-us-east-1.amazonaws.com/$(git rev-parse --abbrev-ref HEAD)/latest/index.html"
echo "Find the Storybook for this commit on http://gdevelop-storybook.s3-website-us-east-1.amazonaws.com/$(git rev-parse --abbrev-ref HEAD)/commit/$(git rev-parse HEAD)/index.html"
echo "Find the latest Storybook for this branch on https://gdevelop-storybook.s3.amazonaws.com/$(git rev-parse --abbrev-ref HEAD)/latest/index.html"
echo "Find the Storybook for this commit on https://gdevelop-storybook.s3.amazonaws.com/$(git rev-parse --abbrev-ref HEAD)/commit/$(git rev-parse HEAD)/index.html"
# Publish on Chromatic, only when manually launched (too costly to run on every commit).
- name: Publish Storybook to Chromatic

View File

@@ -11,6 +11,9 @@ jobs:
extract-translations:
runs-on: ubuntu-latest
steps:
- uses: actions/setup-node@v3
with:
node-version: 16
- uses: actions/checkout@v2
# Cache npm dependencies to speed up the workflow
@@ -38,7 +41,7 @@ jobs:
- name: Install Crowdin CLI
if: github.ref == 'refs/heads/master'
run: npm i -g @crowdin/cli
- name: Upload translations to Crowdin
run: crowdin upload sources
if: github.ref == 'refs/heads/master'

View File

@@ -14,6 +14,9 @@ jobs:
update-translations:
runs-on: ubuntu-latest
steps:
- uses: actions/setup-node@v3
with:
node-version: 16
- uses: actions/checkout@v2
# Cache npm dependencies to speed up the workflow
@@ -44,7 +47,7 @@ jobs:
# (Build and) download the most recent translations (PO files) from Crowdin.
- name: Install Crowdin CLI
run: npm i -g @crowdin/cli
- name: Download new translations from Crowdin
run: crowdin download
env:
@@ -66,8 +69,8 @@ jobs:
commit-message: Update translations [skip ci]
branch: chore/update-translations
delete-branch: true
title: '[Auto PR] Update translations'
title: "[Auto PR] Update translations"
body: |
This updates the translations by downloading them from Crowdin and compiling them for usage by the app.
Please double check the values in `newIDE/app/src/locales/LocalesMetadata.js` to ensure the changes are sensible.

View File

@@ -1,3 +1,3 @@
This is the directory where native or WebAssembly binaries of the C++ code of GDCore and GDJS are produced.
See GDevelop.js README for the instructions to compile after a change in the C++ source code.
See GDevelop.js README for the instructions to compile after a change in the C++ source code.

View File

@@ -1,5 +1,5 @@
#This is the CMake file used to build GDevelop.
#For more information, see the Readme.md file.
#For more information, see the README.md file.
cmake_minimum_required(VERSION 2.6)
cmake_policy(SET CMP0011 NEW)

View File

@@ -38,7 +38,7 @@ void CommentEvent::SerializeTo(SerializerElement &element) const {
.SetAttribute("textB", textB);
element.AddChild("comment").SetValue(com1);
element.AddChild("comment2").SetValue(com2);
if (!com2.empty()) element.AddChild("comment2").SetValue(com2);
}
void CommentEvent::UnserializeFrom(gd::Project &project,
@@ -53,7 +53,9 @@ void CommentEvent::UnserializeFrom(gd::Project &project,
textB = colorElement.GetIntAttribute("textB");
com1 = element.GetChild("comment", 0, "Com1").GetValue().GetString();
com2 = element.GetChild("comment2", 0, "Com2").GetValue().GetString();
if (element.HasChild("comment2")) {
com2 = element.GetChild("comment2", 0, "Com2").GetValue().GetString();
}
}
} // namespace gd

View File

@@ -13,6 +13,7 @@
namespace gd {
class Instruction;
class Project;
class EventVisitor;
}
class EventsCodeGenerationContext;

View File

@@ -16,6 +16,7 @@
#include "GDCore/Project/Object.h"
#include "GDCore/Project/Project.h"
#include "GDCore/Serialization/SerializerElement.h"
#include "GDCore/Events/EventVisitor.h"
using namespace std;
@@ -156,4 +157,14 @@ void LinkEvent::UnserializeFrom(gd::Project& project,
}
}
bool LinkEvent::AcceptVisitor(gd::EventVisitor &eventVisitor) {
return BaseEvent::AcceptVisitor(eventVisitor) |
eventVisitor.VisitLinkEvent(*this);
}
void LinkEvent::AcceptVisitor(gd::ReadOnlyEventVisitor &eventVisitor) const {
BaseEvent::AcceptVisitor(eventVisitor);
eventVisitor.VisitLinkEvent(*this);
}
} // namespace gd

View File

@@ -30,7 +30,7 @@ class GD_CORE_API LinkEvent : public gd::BaseEvent {
includeEnd(gd::String::npos),
linkWasInvalid(false){};
virtual ~LinkEvent();
virtual gd::LinkEvent* Clone() const { return new LinkEvent(*this); }
virtual gd::LinkEvent* Clone() const override { return new LinkEvent(*this); }
/**
* Get the link target (i.e. the scene or external events the link refers to).
@@ -86,7 +86,7 @@ class GD_CORE_API LinkEvent : public gd::BaseEvent {
/**
* The link event must always be preprocessed.
*/
virtual bool MustBePreprocessed() { return true; }
virtual bool MustBePreprocessed() override { return true; }
/**
* \brief Get a pointer to the list of events that are targeted by the link.
@@ -107,11 +107,14 @@ class GD_CORE_API LinkEvent : public gd::BaseEvent {
EventsList& eventList,
std::size_t indexOfTheEventInThisList);
virtual bool IsExecutable() const { return true; };
virtual bool IsExecutable() const override { return true; };
virtual void SerializeTo(SerializerElement& element) const;
virtual void SerializeTo(SerializerElement& element) const override;
virtual void UnserializeFrom(gd::Project& project,
const SerializerElement& element);
const SerializerElement& element) override;
bool AcceptVisitor(gd::EventVisitor& eventVisitor) override;
void AcceptVisitor(gd::ReadOnlyEventVisitor& eventVisitor) const override;
private:
gd::String

View File

@@ -43,7 +43,7 @@ gd::String EventsCodeGenerator::GenerateRelationalOperatorCall(
std::size_t relationalOperatorIndex = instrInfos.parameters.size();
for (std::size_t i = startFromArgument; i < instrInfos.parameters.size();
++i) {
if (instrInfos.parameters[i].type == "relationalOperator")
if (instrInfos.parameters[i].GetType() == "relationalOperator")
relationalOperatorIndex = i;
}
// Ensure that there is at least one parameter after the relational operator
@@ -95,7 +95,7 @@ gd::String EventsCodeGenerator::GenerateOperatorCall(
std::size_t operatorIndex = instrInfos.parameters.size();
for (std::size_t i = startFromArgument; i < instrInfos.parameters.size();
++i) {
if (instrInfos.parameters[i].type == "operator") operatorIndex = i;
if (instrInfos.parameters[i].GetType() == "operator") operatorIndex = i;
}
// Ensure that there is at least one parameter after the operator
@@ -164,7 +164,7 @@ gd::String EventsCodeGenerator::GenerateCompoundOperatorCall(
std::size_t operatorIndex = instrInfos.parameters.size();
for (std::size_t i = startFromArgument; i < instrInfos.parameters.size();
++i) {
if (instrInfos.parameters[i].type == "operator") operatorIndex = i;
if (instrInfos.parameters[i].GetType() == "operator") operatorIndex = i;
}
// Ensure that there is at least one parameter after the operator
@@ -215,7 +215,7 @@ gd::String EventsCodeGenerator::GenerateMutatorCall(
std::size_t operatorIndex = instrInfos.parameters.size();
for (std::size_t i = startFromArgument; i < instrInfos.parameters.size();
++i) {
if (instrInfos.parameters[i].type == "operator") operatorIndex = i;
if (instrInfos.parameters[i].GetType() == "operator") operatorIndex = i;
}
// Ensure that there is at least one parameter after the operator
@@ -273,8 +273,6 @@ gd::String EventsCodeGenerator::GenerateConditionCode(
if (instrInfos.codeExtraInformation.HasCustomCodeGenerator()) {
context.EnterCustomCondition();
conditionCode += GenerateReferenceToUpperScopeBoolean(
"conditionTrue", returnBoolean, context);
conditionCode += instrInfos.codeExtraInformation.customCodeGenerator(
condition, *this, context);
maxCustomConditionsDepth =
@@ -291,9 +289,9 @@ gd::String EventsCodeGenerator::GenerateConditionCode(
condition.SetParameters(parameters);
}
// Verify that there are no mismatchs between object type in parameters.
// Verify that there are no mismatches between object type in parameters.
for (std::size_t pNb = 0; pNb < instrInfos.parameters.size(); ++pNb) {
if (ParameterMetadata::IsObject(instrInfos.parameters[pNb].type)) {
if (ParameterMetadata::IsObject(instrInfos.parameters[pNb].GetType())) {
gd::String objectInParameter =
condition.GetParameter(pNb).GetPlainString();
@@ -303,11 +301,11 @@ gd::String EventsCodeGenerator::GenerateConditionCode(
!GetGlobalObjectsAndGroups().GetObjectGroups().Has(
objectInParameter)) {
return "/* Unknown object - skipped. */";
} else if (!instrInfos.parameters[pNb].supplementaryInformation.empty() &&
} else if (!instrInfos.parameters[pNb].GetExtraInfo().empty() &&
gd::GetTypeOfObject(GetGlobalObjectsAndGroups(),
GetObjectsAndGroups(),
objectInParameter) !=
instrInfos.parameters[pNb].supplementaryInformation) {
instrInfos.parameters[pNb].GetExtraInfo()) {
return "/* Mismatched object type - skipped. */";
}
}
@@ -483,9 +481,9 @@ gd::String EventsCodeGenerator::GenerateActionCode(
action.SetParameters(parameters);
}
// Verify that there are no mismatchs between object type in parameters.
// Verify that there are no mismatches between object type in parameters.
for (std::size_t pNb = 0; pNb < instrInfos.parameters.size(); ++pNb) {
if (ParameterMetadata::IsObject(instrInfos.parameters[pNb].type)) {
if (ParameterMetadata::IsObject(instrInfos.parameters[pNb].GetType())) {
gd::String objectInParameter = action.GetParameter(pNb).GetPlainString();
if (!GetObjectsAndGroups().HasObjectNamed(objectInParameter) &&
!GetGlobalObjectsAndGroups().HasObjectNamed(objectInParameter) &&
@@ -493,11 +491,11 @@ gd::String EventsCodeGenerator::GenerateActionCode(
!GetGlobalObjectsAndGroups().GetObjectGroups().Has(
objectInParameter)) {
return "/* Unknown object - skipped. */";
} else if (!instrInfos.parameters[pNb].supplementaryInformation.empty() &&
} else if (!instrInfos.parameters[pNb].GetExtraInfo().empty() &&
gd::GetTypeOfObject(GetGlobalObjectsAndGroups(),
GetObjectsAndGroups(),
objectInParameter) !=
instrInfos.parameters[pNb].supplementaryInformation) {
instrInfos.parameters[pNb].GetExtraInfo()) {
return "/* Mismatched object type - skipped. */";
}
}
@@ -670,6 +668,18 @@ gd::String EventsCodeGenerator::GenerateActionsListCode(
return outputCode;
}
const gd::String EventsCodeGenerator::GenerateRelationalOperatorCodes(const gd::String &operatorString) {
if (operatorString == "=") {
return "==";
}
if (operatorString != "<" && operatorString != ">" &&
operatorString != "<=" && operatorString != ">=" && operatorString != "!=") {
cout << "Warning: Bad relational operator: Set to == by default." << endl;
return "==";
}
return operatorString;
}
gd::String EventsCodeGenerator::GenerateParameterCodes(
const gd::Expression& parameter,
const gd::ParameterMetadata& metadata,
@@ -679,31 +689,24 @@ gd::String EventsCodeGenerator::GenerateParameterCodes(
supplementaryParametersTypes) {
gd::String argOutput;
if (ParameterMetadata::IsExpression("number", metadata.type)) {
if (ParameterMetadata::IsExpression("number", metadata.GetType())) {
argOutput = gd::ExpressionCodeGenerator::GenerateExpressionCode(
*this, context, "number", parameter, lastObjectName);
} else if (ParameterMetadata::IsExpression("string", metadata.type)) {
} else if (ParameterMetadata::IsExpression("string", metadata.GetType())) {
argOutput = gd::ExpressionCodeGenerator::GenerateExpressionCode(
*this, context, "string", parameter, lastObjectName);
} else if (ParameterMetadata::IsExpression("variable", metadata.type)) {
} else if (ParameterMetadata::IsExpression("variable", metadata.GetType())) {
argOutput = gd::ExpressionCodeGenerator::GenerateExpressionCode(
*this, context, metadata.type, parameter, lastObjectName);
} else if (ParameterMetadata::IsObject(metadata.type)) {
*this, context, metadata.GetType(), parameter, lastObjectName);
} else if (ParameterMetadata::IsObject(metadata.GetType())) {
// It would be possible to run a gd::ExpressionCodeGenerator if later
// objects can have nested objects, or function returning objects.
argOutput =
GenerateObject(parameter.GetPlainString(), metadata.type, context);
} else if (metadata.type == "relationalOperator") {
auto parameterString = parameter.GetPlainString();
argOutput += parameterString == "=" ? "==" : parameterString;
if (argOutput != "==" && argOutput != "<" && argOutput != ">" &&
argOutput != "<=" && argOutput != ">=" && argOutput != "!=") {
cout << "Warning: Bad relational operator: Set to == by default." << endl;
argOutput = "==";
}
GenerateObject(parameter.GetPlainString(), metadata.GetType(), context);
} else if (metadata.GetType() == "relationalOperator") {
argOutput += GenerateRelationalOperatorCodes(parameter.GetPlainString());
argOutput = "\"" + argOutput + "\"";
} else if (metadata.type == "operator") {
} else if (metadata.GetType() == "operator") {
argOutput += parameter.GetPlainString();
if (argOutput != "=" && argOutput != "+" && argOutput != "-" &&
argOutput != "/" && argOutput != "*") {
@@ -712,28 +715,31 @@ gd::String EventsCodeGenerator::GenerateParameterCodes(
}
argOutput = "\"" + argOutput + "\"";
} else if (ParameterMetadata::IsBehavior(metadata.type)) {
} else if (ParameterMetadata::IsBehavior(metadata.GetType())) {
argOutput = GenerateGetBehaviorNameCode(parameter.GetPlainString());
} else if (metadata.type == "key") {
} else if (metadata.GetType() == "key") {
argOutput = "\"" + ConvertToString(parameter.GetPlainString()) + "\"";
} else if (metadata.type == "audioResource" ||
metadata.type == "bitmapFontResource" ||
metadata.type == "fontResource" ||
metadata.type == "imageResource" ||
metadata.type == "jsonResource" ||
metadata.type == "videoResource" ||
} else if (metadata.GetType() == "audioResource" ||
metadata.GetType() == "bitmapFontResource" ||
metadata.GetType() == "fontResource" ||
metadata.GetType() == "imageResource" ||
metadata.GetType() == "jsonResource" ||
metadata.GetType() == "tilemapResource" ||
metadata.GetType() == "tilesetResource" ||
metadata.GetType() == "videoResource" ||
metadata.GetType() == "model3DResource" ||
// Deprecated, old parameter names:
metadata.type == "password" || metadata.type == "musicfile" ||
metadata.type == "soundfile" || metadata.type == "police") {
metadata.GetType() == "password" || metadata.GetType() == "musicfile" ||
metadata.GetType() == "soundfile" || metadata.GetType() == "police") {
argOutput = "\"" + ConvertToString(parameter.GetPlainString()) + "\"";
} else if (metadata.type == "mouse") {
} else if (metadata.GetType() == "mouse") {
argOutput = "\"" + ConvertToString(parameter.GetPlainString()) + "\"";
} else if (metadata.type == "yesorno") {
} else if (metadata.GetType() == "yesorno") {
auto parameterString = parameter.GetPlainString();
argOutput += (parameterString == "yes" || parameterString == "oui")
? GenerateTrue()
: GenerateFalse();
} else if (metadata.type == "trueorfalse") {
} else if (metadata.GetType() == "trueorfalse") {
auto parameterString = parameter.GetPlainString();
// This is duplicated in AdvancedExtension.cpp for GDJS
argOutput += (parameterString == "True" || parameterString == "Vrai")
@@ -741,21 +747,21 @@ gd::String EventsCodeGenerator::GenerateParameterCodes(
: GenerateFalse();
}
// Code only parameter type
else if (metadata.type == "inlineCode") {
argOutput += metadata.supplementaryInformation;
else if (metadata.GetType() == "inlineCode") {
argOutput += metadata.GetExtraInfo();
} else {
// Try supplementary types if provided
if (supplementaryParametersTypes) {
for (std::size_t i = 0; i < supplementaryParametersTypes->size(); ++i) {
if ((*supplementaryParametersTypes)[i].first == metadata.type)
if ((*supplementaryParametersTypes)[i].first == metadata.GetType())
argOutput += (*supplementaryParametersTypes)[i].second;
}
}
// Type unknown
if (argOutput.empty()) {
if (!metadata.type.empty())
cout << "Warning: Unknown type of parameter \"" << metadata.type
if (!metadata.GetType().empty())
cout << "Warning: Unknown type of parameter \"" << metadata.GetType()
<< "\"." << std::endl;
argOutput += "\"" + ConvertToString(parameter.GetPlainString()) + "\"";
}
@@ -1030,7 +1036,7 @@ gd::String EventsCodeGenerator::GenerateFreeCondition(
for (std::size_t i = 0; i < instrInfos.parameters.size();
++i) // Some conditions already have a "conditionInverted" parameter
{
if (instrInfos.parameters[i].type == "conditionInverted")
if (instrInfos.parameters[i].GetType() == "conditionInverted")
conditionAlreadyTakeCareOfInversion = true;
}
if (!conditionAlreadyTakeCareOfInversion && conditionInverted)
@@ -1051,7 +1057,7 @@ gd::String EventsCodeGenerator::GenerateObjectCondition(
// Prepare call
// Add a static_cast if necessary
gd::String objectFunctionCallNamePart =
(!instrInfos.parameters[0].supplementaryInformation.empty())
(!instrInfos.parameters[0].GetExtraInfo().empty())
? "static_cast<" + objInfo.className + "*>(" +
GetObjectListName(objectName, context) + "[i])->" +
instrInfos.codeExtraInformation.functionCallName
@@ -1233,7 +1239,7 @@ size_t EventsCodeGenerator::GenerateSingleUsageUniqueIdFor(
<< std::endl;
}
// Base the unique id on the adress in memory so that the same instruction
// Base the unique id on the address in memory so that the same instruction
// in memory will get the same id across different code generations.
size_t uniqueId = (size_t)instruction;

View File

@@ -404,6 +404,18 @@ class GD_CORE_API EventsCodeGenerator {
return boolName;
}
/**
* \brief Generate the full name for accessing to a boolean variable used for
* conditions.
*
* Default implementation just returns the boolean name passed as argument.
*/
virtual gd::String GenerateUpperScopeBooleanFullName(
const gd::String& boolName,
const gd::EventsCodeGenerationContext& context) {
return boolName;
}
/**
* \brief Must create a boolean. Its value must be false.
*
@@ -481,6 +493,9 @@ class GD_CORE_API EventsCodeGenerator {
*/
size_t GenerateSingleUsageUniqueIdForEventsList();
virtual const gd::String GenerateRelationalOperatorCodes(
const gd::String& operatorString);
protected:
/**
* \brief Generate the code for a single parameter.
@@ -490,9 +505,9 @@ class GD_CORE_API EventsCodeGenerator {
* - object : Object name -> string
* - expression : Mathematical expression -> number (double)
* - string : %Text expression -> string
* - layer, color, file, joyaxis : Same as string
* - layer, color, file, stringWithSelector : Same as string
* - relationalOperator : Used to make a comparison between the function
resturn value and value of the parameter preceding the relationOperator
return value and value of the parameter preceding the relationOperator
parameter -> string
* - operator : Used to update a value using a setter and a getter -> string
* - key, mouse, objectvar, scenevar, globalvar, password, musicfile,
@@ -662,19 +677,6 @@ class GD_CORE_API EventsCodeGenerator {
return "!(" + predicat + ")";
};
/**
* \brief Must create a boolean which is a reference to a boolean declared in
* the parent scope.
*
* The default implementation generates C-style code.
*/
virtual gd::String GenerateReferenceToUpperScopeBoolean(
const gd::String& referenceName,
const gd::String& referencedBoolean,
gd::EventsCodeGenerationContext& context) {
return "bool & " + referenceName + " = " + referencedBoolean + ";\n";
}
virtual gd::String GenerateFreeCondition(
const std::vector<gd::String>& arguments,
const gd::InstructionMetadata& instrInfos,
@@ -783,7 +785,7 @@ class GD_CORE_API EventsCodeGenerator {
const gd::Project* project; ///< The project being used.
const gd::Layout* scene; ///< The scene being generated.
bool errorOccurred; ///< Must be set to true if an error occured.
bool errorOccurred; ///< Must be set to true if an error occurred.
bool compilationForRuntime; ///< Is set to true if the code generation is
///< made for runtime only.

View File

@@ -51,8 +51,8 @@ gd::String ExpressionCodeGenerator::GenerateExpressionCode(
codeGenerator.GetObjectsAndGroups(),
rootType);
node->Visit(validator);
if (!validator.GetErrors().empty()) {
std::cout << "Error: \"" << validator.GetErrors()[0]->GetMessage()
if (!validator.GetFatalErrors().empty()) {
std::cout << "Error: \"" << validator.GetFatalErrors()[0]->GetMessage()
<< "\" in: \"" << expression.GetPlainString() << "\" ("
<< rootType << ")" << std::endl;
@@ -170,7 +170,7 @@ void ExpressionCodeGenerator::OnVisitIdentifierNode(IdentifierNode& node) {
}
else {
// This is for function names that are put in IdentifierNode
// because the type is needed to tell them appart from variables.
// because the type is needed to tell them apart from variables.
output += GenerateDefaultValue(type);
}
}

View File

@@ -9,6 +9,7 @@
#include "GDCore/Events/Builtin/AsyncEvent.h"
#include "GDCore/Events/CodeGeneration/EventsCodeGenerator.h"
#include "GDCore/Events/EventsList.h"
#include "GDCore/Events/EventVisitor.h"
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
#include "GDCore/Extensions/Platform.h"
#include "GDCore/Extensions/PlatformExtension.h"
@@ -140,6 +141,14 @@ void BaseEvent::Preprocess(gd::EventsCodeGenerator& codeGenerator,
}
}
bool BaseEvent::AcceptVisitor(gd::EventVisitor& eventVisitor) {
return eventVisitor.VisitEvent(*this);
}
void BaseEvent::AcceptVisitor(gd::ReadOnlyEventVisitor& eventVisitor) const {
eventVisitor.VisitEvent(*this);
}
BaseEventSPtr GD_CORE_API CloneRememberingOriginalEvent(BaseEventSPtr event) {
gd::BaseEventSPtr copy(event->Clone());
// Original event is either the original event of the copied event, or the

View File

@@ -24,6 +24,8 @@ class EventsCodeGenerationContext;
class Platform;
class SerializerElement;
class Instruction;
class EventVisitor;
class ReadOnlyEventVisitor;
} // namespace gd
namespace gd {
@@ -238,6 +240,9 @@ class GD_CORE_API BaseEvent {
*/
virtual void UnserializeFrom(gd::Project& project,
const SerializerElement& element){};
virtual bool AcceptVisitor(gd::EventVisitor& eventVisitor);
virtual void AcceptVisitor(gd::ReadOnlyEventVisitor& eventVisitor) const;
///@}
/** \name Common properties

View File

@@ -0,0 +1,71 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#pragma once
#include <iostream>
#include <memory>
#include <vector>
#include "GDCore/String.h"
namespace gd {
class BaseEvent;
class LinkEvent;
} // namespace gd
namespace gd {
/**
* \brief Visitor of any kind of event.
*
* \ingroup Events
*/
class GD_CORE_API EventVisitor {
public:
virtual ~EventVisitor(){};
/**
* Called to do some work on an event.
*
* \return true if the event must be deleted from the events list, false
* otherwise.
*/
virtual bool VisitEvent(gd::BaseEvent& linkEvent) = 0;
/**
* Called to do some work on a link event.
*
* Note that VisitEvent is also called with this event.
*
* \return true if the event must be deleted from the events list, false
* otherwise.
*/
virtual bool VisitLinkEvent(gd::LinkEvent& linkEvent) = 0;
};
/**
* \brief Visitor of any kind of event.
*
* \ingroup Events
*/
class GD_CORE_API ReadOnlyEventVisitor {
public:
virtual ~ReadOnlyEventVisitor(){};
/**
* Called to do some work on an event.
*/
virtual void VisitEvent(const gd::BaseEvent& linkEvent) = 0;
/**
* Called to do some work on a link event.
*
* Note that VisitEvent is also called with this event.
*/
virtual void VisitLinkEvent(const gd::LinkEvent& linkEvent) = 0;
};
}

View File

@@ -55,6 +55,10 @@ void Instruction::SetParameter(std::size_t nb, const gd::Expression& val) {
parameters[nb] = val;
}
void Instruction::AddParameter(const gd::Expression& val) {
parameters.push_back(val);
}
std::shared_ptr<Instruction> GD_CORE_API
CloneRememberingOriginalElement(std::shared_ptr<Instruction> instruction) {
std::shared_ptr<Instruction> copy =

View File

@@ -123,6 +123,11 @@ class GD_CORE_API Instruction {
*/
void SetParameter(std::size_t nb, const gd::Expression& val);
/** Add a parameter at the end
* \param val The new value of the parameter
*/
void AddParameter(const gd::Expression& val);
/** \brief Get a reference to the std::vector containing the parameters.
* \return A std::vector containing the parameters
*/

View File

@@ -184,8 +184,8 @@ void EventsListSerialization::UpdateInstructionsFromGD2x(
for (std::size_t j = 0;
j < parameters.size() && j < metadata.parameters.size();
++j) {
if (metadata.parameters[j].type == "relationalOperator" ||
metadata.parameters[j].type == "operator") {
if (metadata.parameters[j].GetType() == "relationalOperator" ||
metadata.parameters[j].GetType() == "operator") {
if (j == parameters.size() - 1) {
std::cout << "ERROR: No more parameters after a [relational]operator "
"when trying to update an instruction from GD2.x";

View File

@@ -33,7 +33,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
"res/function32.png",
"res/function32.png")
.SetHelpPath("/events/functions/return")
.AddParameter("expression", "The number to be returned")
.AddParameter("expression", _("The number to be returned"))
.SetRelevantForFunctionEventsOnly()
.MarkAsAdvanced();
extension
@@ -47,7 +48,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
"res/function32.png",
"res/function32.png")
.SetHelpPath("/events/functions/return")
.AddParameter("string", "The text to be returned")
.AddParameter("string", _("The text to be returned"))
.SetRelevantForFunctionEventsOnly()
.MarkAsAdvanced();
extension
@@ -60,7 +62,38 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
"res/function32.png",
"res/function32.png")
.SetHelpPath("/events/functions/return")
.AddParameter("trueorfalse", "Should the condition be true or false?")
.AddParameter("trueorfalse", _("Should the condition be true or false?"))
.SetRelevantForFunctionEventsOnly()
.MarkAsAdvanced();
extension
.AddAction("CopyArgumentToVariable",
_("Copy function parameter to variable"),
_("Copy a function parameter (also called \"argument\") to a variable. "
"The parameter type must be a variable."),
_("Copy the parameter _PARAM0_ into the variable _PARAM1_"),
"",
"res/function32.png",
"res/function32.png")
.SetHelpPath("/events/functions/return")
.AddParameter("functionParameterName", _("Parameter name"), "variable")
.AddParameter("scenevar", _("Scene variable"))
.SetRelevantForFunctionEventsOnly()
.MarkAsAdvanced();
extension
.AddAction("CopyVariableToArgument",
_("Copy variable to function parameter"),
_("Copy a variable to function parameter (also called \"argument\"). "
"The parameter type must be a variable."),
_("Copy the variable _PARAM1_ into the parameter _PARAM0_"),
"",
"res/function32.png",
"res/function32.png")
.SetHelpPath("/events/functions/return")
.AddParameter("functionParameterName", _("Parameter name"), "variable")
.AddParameter("scenevar", _("Scene variable"))
.SetRelevantForFunctionEventsOnly()
.MarkAsAdvanced();
extension
@@ -74,26 +107,57 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
"",
"res/function32.png",
"res/function32.png")
.AddParameter("functionParameterName", "Parameter name")
.AddParameter("functionParameterName", _("Parameter name"), "number,string,boolean")
.SetRelevantForFunctionEventsOnly()
.MarkAsAdvanced();
extension
.AddExpression(
"GetArgumentAsNumber",
_("Get function parameter value"),
_("Get function parameter (also called \"argument\") value"),
_("Get function parameter (also called \"argument\") value."),
"",
"res/function16.png")
.AddParameter("functionParameterName", "Parameter name");
.AddParameter("functionParameterName", _("Parameter name"), "number,string,boolean")
.SetRelevantForFunctionEventsOnly();
extension
.AddStrExpression(
"GetArgumentAsString",
_("Get function parameter text"),
_("Get function parameter (also called \"argument\") text "),
_("Get function parameter (also called \"argument\") text."),
"",
"res/function16.png")
.AddParameter("functionParameterName", "Parameter name");
.AddParameter("functionParameterName", _("Parameter name"), "number,string,boolean")
.SetRelevantForFunctionEventsOnly();
extension
.AddCondition(
"CompareArgumentAsNumber",
_("Compare function parameter value"),
_("Compare function parameter (also called \"argument\") value."),
_("Parameter _PARAM0_"),
"",
"res/function32.png",
"res/function16.png")
.AddParameter("functionParameterName", _("Parameter name"), "number,string,boolean")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.SetRelevantForFunctionEventsOnly();
extension
.AddCondition(
"CompareArgumentAsString",
_("Compare function parameter text"),
_("Compare function parameter (also called \"argument\") text."),
_("Parameter _PARAM0_"),
"",
"res/function32.png",
"res/function16.png")
.AddParameter("functionParameterName", _("Parameter name"), "number,string,boolean")
.UseStandardRelationalOperatorParameters(
"string", gd::ParameterOptions::MakeNewOptions())
.SetRelevantForFunctionEventsOnly();
}
} // namespace gd

View File

@@ -15,11 +15,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAsyncExtension(
extension
.SetExtensionInformation(
"BuiltinAsync",
_("Async functions"),
_("Asynchronous functions"),
_("Functions that defer the execution of the events after it."),
"Arthur Pacaud (arthuro555)",
"Open source (MIT License)")
.SetCategory("Advanced");
extension.AddInstructionOrExpressionGroupMetadata(_("Asynchronous functions"))
.SetIcon("res/function32.png");
extension.AddEvent("Async",
_("Async event"),
@@ -27,6 +29,19 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAsyncExtension(
"",
"res/eventaddicon.png",
std::make_shared<gd::AsyncEvent>());
extension
.AddAction(
"ResolveAsyncEventsFunction",
_("End asynchronous function"),
_("Mark an asynchronous function as finished. This will allow the "
"actions and subevents following it to be run."),
"Mark asynchronous function as ended",
"",
"res/actions/quit24.png",
"res/actions/quit.png")
.AddCodeOnlyParameter("eventsFunctionContext", "")
.SetRelevantForAsynchronousFunctionEventsOnly();
}
} // namespace gd

View File

@@ -23,6 +23,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
.SetCategory("Audio");
extension.AddInstructionOrExpressionGroupMetadata(_("Sounds and music"))
.SetIcon("res/actions/music24.png");
extension.AddInstructionOrExpressionGroupMetadata(_("Sounds on channels"))
.SetIcon("res/actions/son24.png");
extension
.AddAction("PlaySoundCanal",
@@ -73,9 +75,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
extension
.AddAction("RePlaySoundCanal",
_("Play the sound of a channel"),
_("Play the sound of the channel."),
_("Play the sound of channel _PARAM1_"),
_("Resume playing a sound on a channel"),
_("Resume playing a sound on a channel that was paused."),
_("Resume the sound of channel _PARAM1_"),
_("Sounds on channels"),
"res/actions/son24.png",
"res/actions/son.png")
@@ -132,9 +134,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
extension
.AddAction("RePlayMusicCanal",
_("Play the music of a channel"),
_("Play the music of the channel."),
_("Play the music of channel _PARAM1_"),
_("Resume playing a music on a channel"),
_("Resume playing a music on a channel that was paused."),
_("Resume the music of channel _PARAM1_"),
_("Music on channels"),
"res/actions/music24.png",
"res/actions/music.png")
@@ -146,69 +148,83 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
.AddAction("ModVolumeSoundCanal",
_("Volume of the sound on a channel"),
_("This action modifies the volume of the sound on the "
"specified channel. The volume is between 0 and 100."),
"specified channel."),
_("the volume of the sound on channel _PARAM1_"),
_("Sounds on channels"),
"res/actions/sonVolume24.png",
"res/actions/sonVolume.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Volume (0-100)")))
.MarkAsAdvanced();
extension
.AddAction("ModVolumeMusicCanal",
_("Volume of the music on a channel"),
_("This action modifies the volume of the music on the "
"specified channel. The volume is between 0 and 100."),
"specified channel."),
_("the volume of the music on channel _PARAM1_"),
_("Music on channels"),
"res/actions/musicVolume24.png",
"res/actions/musicVolume.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Volume (0-100)")))
.MarkAsAdvanced();
extension
.AddAction("ModGlobalVolume",
_("Game global volume"),
_("This action modifies the global volume of the game. The "
"volume is between 0 and 100."),
_("This action modifies the global volume of the game."),
_("the global sound level"),
"",
"res/actions/volume24.png",
"res/actions/volume.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Volume (0-100)")))
.MarkAsSimple();
extension
.AddAction("ModPitchSoundChannel",
_("Pitch of the sound of a channel"),
_("This action modifies the pitch (speed) of the sound on a "
"channel.\n1 is the default pitch."),
"channel."),
_("the pitch of the sound on channel _PARAM1_"),
_("Sounds on channels"),
"res/actions/son24.png",
"res/actions/son.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Pitch (1 by default)")))
.MarkAsAdvanced();
extension
.AddAction("ModPitchMusicChannel",
_("Pitch of the music on a channel"),
_("This action modifies the pitch of the music on the "
"specified channel. 1 is the default pitch"),
"specified channel."),
_("the pitch of the music on channel _PARAM1_"),
_("Music on channels"),
"res/actions/music24.png",
"res/actions/music.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Pitch (1 by default)")))
.MarkAsAdvanced();
extension
@@ -222,7 +238,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
"res/actions/son.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Position (in seconds)")))
.MarkAsAdvanced();
extension
@@ -236,7 +255,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
"res/actions/music.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Position (in seconds)")))
.MarkAsAdvanced();
extension
@@ -448,15 +470,17 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
.AddCondition(
"SoundCanalVolume",
_("Volume of the sound on a channel"),
_("Test the volume of the sound on the specified channel. The volume "
"is between 0 and 100."),
_("Test the volume of the sound on the specified channel."),
_("the volume of the sound on channel _PARAM1_"),
_("Sounds on channels"),
"res/conditions/sonVolume24.png",
"res/conditions/sonVolume.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Volume to compare to (0-100)")))
.MarkAsAdvanced();
extension
@@ -471,7 +495,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
"res/conditions/musicVolume.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Volume to compare to (0-100)")))
.MarkAsAdvanced();
extension
@@ -484,7 +511,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
"res/conditions/volume24.png",
"res/conditions/volume.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Volume to compare to (0-100)")));
extension
.AddCondition(
@@ -498,22 +528,27 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
"res/conditions/sonVolume.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Pitch to compare to (1 by default)")))
.MarkAsAdvanced();
extension
.AddCondition(
"MusicChannelPitch",
_("Pitch of the music on a channel"),
_("Test the pitch (speed) of the music on a specified channel. 1 is "
"the default pitch."),
_("Test the pitch (speed) of the music on a specified channel."),
_("the pitch of the music on channel _PARAM1_"),
_("Music on channels"),
"res/conditions/musicVolume24.png",
"res/conditions/musicVolume.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Pitch to compare to (1 by default)")))
.MarkAsAdvanced();
extension
@@ -527,7 +562,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
"res/conditions/sonVolume.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Position to compare to (in seconds)")))
.MarkAsAdvanced();
extension
@@ -541,7 +579,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
"res/conditions/musicVolume.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Position to compare to (in seconds)")))
.MarkAsAdvanced();
extension

View File

@@ -27,8 +27,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.SetIcon("res/actions/create24.png");
extension.AddInstructionOrExpressionGroupMetadata(_("Movement using forces"))
.SetIcon("res/actions/force24.png");
extension.AddInstructionOrExpressionGroupMetadata(_("Variables"))
.SetIcon("res/conditions/var24.png");
extension.AddInstructionOrExpressionGroupMetadata(_("Position"))
.SetIcon("res/actions/position24_black.png");
gd::ObjectMetadata& obj = extension.AddObject<gd::Object>(
gd::ObjectMetadata& obj = extension.AddObject<gd::ObjectConfiguration>(
"", _("Base object"), _("Base object"), "res/objeticon24.png");
obj.AddCondition("PosX",
@@ -36,11 +40,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Compare the X position of the object."),
_("the X position"),
_("Position"),
"res/conditions/position24.png",
"res/conditions/position.png")
"res/conditions/position24_black.png",
"res/conditions/position_black.png")
.AddParameter("object", _("Object"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsSimple();
obj.AddAction("MettreX",
@@ -48,11 +53,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Change the X position of an object."),
_("the X position"),
_("Position"),
"res/actions/position24.png",
"res/actions/position.png")
"res/actions/position24_black.png",
"res/actions/position_black.png")
.AddParameter("object", _("Object"))
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions())
.MarkAsSimple();
obj.AddCondition("PosY",
@@ -60,11 +66,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Compare the Y position of an object."),
_("the Y position"),
_("Position"),
"res/conditions/position24.png",
"res/conditions/position.png")
"res/conditions/position24_black.png",
"res/conditions/position_black.png")
.AddParameter("object", _("Object"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsSimple();
obj.AddAction("MettreY",
@@ -72,11 +79,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Change the Y position of an object."),
_("the Y position"),
_("Position"),
"res/actions/position24.png",
"res/actions/position.png")
"res/actions/position24_black.png",
"res/actions/position_black.png")
.AddParameter("object", _("Object"))
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions())
.MarkAsSimple();
obj.AddAction("MettreXY",
@@ -85,8 +93,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Change the position of _PARAM0_: _PARAM1_ _PARAM2_ (x "
"axis), _PARAM3_ _PARAM4_ (y axis)"),
_("Position"),
"res/actions/position24.png",
"res/actions/position.png")
"res/actions/position24_black.png",
"res/actions/position_black.png")
.AddParameter("object", _("Object"))
.AddParameter("operator", _("Modification's sign"), "number")
@@ -102,8 +110,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"_PARAM2_ (x "
"axis), _PARAM3_ _PARAM4_ (y axis)"),
_("Position/Center"),
"res/actions/position24.png",
"res/actions/position.png")
"res/actions/position24_black.png",
"res/actions/position_black.png")
.AddParameter("object", _("Object"))
.AddParameter("operator", _("Modification's sign"), "number")
.AddParameter("expression", _("X position"))
@@ -118,9 +126,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("the X position of the center of rotation"),
_("the X position of the center"),
_("Position/Center"),
"res/actions/position24.png")
"res/actions/position24_black.png")
.AddParameter("object", _("Object"))
.UseStandardParameters("number");
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
obj.AddExpressionAndConditionAndAction(
"number",
@@ -129,9 +137,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("the Y position of the center of rotation"),
_("the Y position of the center"),
_("Position/Center"),
"res/actions/position24.png")
"res/actions/position24_black.png")
.AddParameter("object", _("Object"))
.UseStandardParameters("number");
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
obj.AddExpressionAndCondition("number",
"BoundingBoxLeft",
@@ -140,9 +148,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"the object) left position"),
_("the bounding box left position"),
_("Position/Bounding Box"),
"res/conditions/bounding-box-left.svg")
"res/conditions/bounding-box-left_black.svg")
.AddParameter("object", _("Object"))
.UseStandardParameters("number");
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
obj.AddExpressionAndCondition(
"number",
@@ -151,9 +159,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("the bounding box (the area encapsulating the object) top position"),
_("the bounding box top position"),
_("Position/Bounding Box"),
"res/conditions/bounding-box-top.svg")
"res/conditions/bounding-box-top_black.svg")
.AddParameter("object", _("Object"))
.UseStandardParameters("number");
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
obj.AddExpressionAndCondition("number",
"BoundingBoxRight",
@@ -162,9 +170,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"the object) right position"),
_("the bounding box right position"),
_("Position/Bounding Box"),
"res/conditions/bounding-box-right.svg")
"res/conditions/bounding-box-right_black.svg")
.AddParameter("object", _("Object"))
.UseStandardParameters("number");
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
obj.AddExpressionAndCondition("number",
"BoundingBoxBottom",
@@ -173,9 +181,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"the object) bottom position"),
_("the bounding box bottom position"),
_("Position/Bounding Box"),
"res/conditions/bounding-box-bottom.svg")
"res/conditions/bounding-box-bottom_black.svg")
.AddParameter("object", _("Object"))
.UseStandardParameters("number");
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
obj.AddExpressionAndCondition("number",
"BoundingBoxCenterX",
@@ -184,9 +192,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"the object) center X position"),
_("the bounding box center X position"),
_("Position/Bounding Box"),
"res/conditions/bounding-box-center.svg")
"res/conditions/bounding-box-center_black.svg")
.AddParameter("object", _("Object"))
.UseStandardParameters("number");
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
obj.AddExpressionAndCondition("number",
"BoundingBoxCenterY",
@@ -195,9 +203,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"the object) center Y position"),
_("the bounding box center Y position"),
_("Position/Bounding Box"),
"res/conditions/bounding-box-center.svg")
"res/conditions/bounding-box-center_black.svg")
.AddParameter("object", _("Object"))
.UseStandardParameters("number");
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
obj.AddAction("MettreAutourPos",
_("Put around a position"),
@@ -222,11 +230,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Change the angle of rotation of an object (in degrees)."),
_("the angle"),
_("Angle"),
"res/actions/direction24.png",
"res/actions/direction.png")
"res/actions/direction24_black.png",
"res/actions/direction_black.png")
.AddParameter("object", _("Object"))
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Angle (in degrees)")));
obj.AddAction("Rotate",
_("Rotate"),
@@ -234,8 +245,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"counterclockwise otherwise."),
_("Rotate _PARAM0_ at speed _PARAM1_ deg/second"),
_("Angle"),
"res/actions/direction24.png",
"res/actions/direction.png")
"res/actions/rotate24_black.png",
"res/actions/rotate_black.png")
.AddParameter("object", _("Object"))
.AddParameter("expression", _("Angular speed (in degrees per second)"))
@@ -248,8 +259,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Rotate an object towards an angle with the specified speed."),
_("Rotate _PARAM0_ towards _PARAM1_ at speed _PARAM2_ deg/second"),
_("Angle"),
"res/actions/direction24.png",
"res/actions/direction.png")
"res/actions/rotate24_black.png",
"res/actions/rotate_black.png")
.AddParameter("object", _("Object"))
.AddParameter("expression", _("Angle to rotate towards (in degrees)"))
@@ -264,8 +275,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Rotate _PARAM0_ towards _PARAM1_;_PARAM2_ at speed "
"_PARAM3_ deg/second"),
_("Angle"),
"res/actions/direction24.png",
"res/actions/direction.png")
"res/actions/rotate24_black.png",
"res/actions/rotate_black.png")
.AddParameter("object", _("Object"))
.AddParameter("expression", _("X position"))
@@ -382,7 +393,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/actions/planicon.png")
.AddParameter("object", _("Object"))
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions());
obj.AddAction("ChangeLayer",
_("Layer"),
@@ -393,13 +405,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/actions/layer.png")
.AddParameter("object", _("Object"))
.AddParameter("layer", _("Move it to this layer (base layer if empty)"))
.AddParameter("layer", _("Move it to this layer"))
.SetDefaultValue("\"\"")
.MarkAsAdvanced();
obj.AddAction("ModVarObjet",
_("Value of an object variable"),
_("Change the value of an object variable."),
_("Change number variable"),
_("Modify the number value of an object variable."),
_("the variable _PARAM1_"),
_("Variables"),
"res/actions/var24.png",
@@ -407,11 +419,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Variable"))
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions());
obj.AddAction("ModVarObjetTxt",
_("Text of an object variable"),
_("Change the text of an object variable."),
_("Change text variable"),
_("Modify the text of an object variable."),
_("the text of variable _PARAM1_"),
_("Variables"),
"res/actions/var24.png",
@@ -419,11 +432,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Variable"))
.UseStandardOperatorParameters("string");
.UseStandardOperatorParameters("string",
ParameterOptions::MakeNewOptions());
obj.AddAction("SetObjectVariableAsBoolean",
_("Boolean value of an object variable"),
_("Change the boolean value of an object variable."),
_("Change boolean variable"),
_("Modify the boolean value of an object variable."),
_("Set the boolean value of variable _PARAM1_ of "
"_PARAM0_ to _PARAM2_"),
_("Variables"),
@@ -436,7 +450,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
obj.AddAction(
"ToggleObjectVariableAsBoolean",
_("Toggle the boolean value of an object variable"),
_("Toggle boolean variable"),
_("Toggles the boolean value of an object variable.") + "\n" +
_("If it was true, it will become false, and if it was false "
"it will become true."),
@@ -451,37 +465,39 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
obj.AddCondition("ObjectVariableChildExists",
_("Child existence"),
_("Check if the specified child of the variable exists."),
_("Check if the specified child of the object "
"structure variable exists."),
_("Child _PARAM2_ of variable _PARAM1_ of _PARAM0_ exists"),
_("Variables/Collections/Structures"),
_("Variables/Arrays and structures"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Variable"))
.AddParameter("objectvar", _("Structure variable"))
.AddParameter("string", _("Name of the child"))
.MarkAsAdvanced();
obj.AddAction("ObjectVariableRemoveChild",
_("Remove a child"),
_("Remove a child from an object variable."),
_("Remove a child from an object structure variable."),
_("Remove child _PARAM2_ from variable _PARAM1_ of _PARAM0_"),
_("Variables/Collections/Structures"),
_("Variables/Arrays and structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Variable"))
.AddParameter("objectvar", _("Structure variable"))
.AddParameter("string", _("Child's name"))
.MarkAsAdvanced();
obj.AddAction("ObjectVariableClearChildren",
_("Clear variable"),
_("Remove all the children from the object variable."),
_("Clear children"),
_("Remove all the children from the object array or structure "
"variable."),
_("Clear children from variable _PARAM1_ of _PARAM0_"),
_("Variables/Collections"),
_("Variables/Arrays and structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Variable"))
.AddParameter("objectvar", _("Array or structure variable"))
.MarkAsAdvanced();
obj.AddAction("Cache",
@@ -512,11 +528,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Compare the angle of the specified object."),
_("the angle (in degrees)"),
_("Angle"),
"res/conditions/direction24.png",
"res/conditions/direction.png")
"res/conditions/direction24_black.png",
"res/conditions/direction_black.png")
.AddParameter("object", _("Object"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Angle to compare to (in degrees)")))
.MarkAsAdvanced();
obj.AddCondition("Plan",
@@ -528,7 +547,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/conditions/planicon.png")
.AddParameter("object", _("Object"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddCondition("Layer",
@@ -585,7 +605,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/conditions/vitesse.png")
.AddParameter("object", _("Object"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddCondition("AngleOfDisplacement",
@@ -604,8 +625,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.MarkAsAdvanced();
obj.AddCondition("VarObjet",
_("Value of an object variable"),
_("Compare the value of an object variable."),
_("Number variable"),
_("Compare the number value of an object variable."),
_("the variable _PARAM1_"),
_("Variables"),
"res/conditions/var24.png",
@@ -613,10 +634,11 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Variable"))
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions());
obj.AddCondition("VarObjetTxt",
_("Text of an object variable"),
_("Text variable"),
_("Compare the text of an object variable."),
_("the text of variable _PARAM1_"),
_("Variables"),
@@ -625,10 +647,11 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Variable"))
.UseStandardRelationalOperatorParameters("string");
.UseStandardRelationalOperatorParameters(
"string", ParameterOptions::MakeNewOptions());
obj.AddCondition("ObjectVariableAsBoolean",
_("Boolean value of an object variable"),
_("Boolean variable"),
_("Compare the boolean value of an object variable."),
_("The boolean value of variable _PARAM1_ of object "
"_PARAM0_ is _PARAM2_"),
@@ -642,7 +665,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
obj.AddCondition("VarObjetDef",
"Variable defined",
"Check if the variable is defined.",
"Check if the object variable is defined.",
"Variable _PARAM1 of _PARAM0_ is defined",
_("Variables"),
"res/conditions/var24.png",
@@ -650,78 +673,131 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("object", _("Object"))
.AddParameter("string", _("Variable"))
.SetHidden();
.SetHidden(); // Deprecated.
obj.AddAction(
"ObjectVariablePush",
_("Append variable to an object array"),
_("Appends a variable to the end of an object array variable."),
_("Append variable _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
_("Variables/Collections/Arrays"),
_("Add existing variable"),
_("Adds an existing variable to the end of an object array variable."),
_("Add variable _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
_("Variables/Arrays and structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Array variable"))
.AddParameter("scenevar", _("Scene variable with the content to append"))
.SetParameterLongDescription(
_("The content of the variable will *be copied* and appended at the "
"end of the array."))
.AddParameter("scenevar", _("Scene variable with the content to add"))
.SetParameterLongDescription(_("The content of the object variable will "
"*be copied* and added at the "
"end of the array."))
.MarkAsAdvanced();
obj.AddAction(
"ObjectVariablePushString",
_("Append a string to an object array"),
_("Appends a string to the end of an object array variable."),
_("Append string _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
_("Variables/Collections/Arrays"),
_("Add text variable"),
_("Adds a text (string) to the end of an object array variable."),
_("Add text _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
_("Variables/Arrays and structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Array variable"))
.AddParameter("string", _("String to append"))
.AddParameter("string", _("Text to add"))
.MarkAsAdvanced();
obj.AddAction(
"ObjectVariablePushNumber",
_("Append a number to an object array"),
_("Appends a number to the end of an object array variable."),
_("Append number _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
_("Variables/Collections/Arrays"),
"res/actions/var24.png",
"res/actions/var.png")
obj.AddAction("ObjectVariablePushNumber",
_("Add number variable"),
_("Adds a number to the end of an object array variable."),
_("Add number _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
_("Variables/Arrays and structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Array variable"))
.AddParameter("expression", _("Number to append"))
.AddParameter("expression", _("Number to add"))
.MarkAsAdvanced();
obj.AddAction(
"ObjectVariablePushBool",
_("Append a boolean to an object array"),
_("Appends a boolean to the end of an object array variable."),
_("Append boolean _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
_("Variables/Collections/Arrays"),
_("Add boolean variable"),
_("Adds a boolean to the end of an object array variable."),
_("Add boolean _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
_("Variables/Arrays and structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Array variable"))
.AddParameter("trueorfalse", _("Boolean to append"))
.AddParameter("trueorfalse", _("Boolean to add"))
.MarkAsAdvanced();
obj.AddAction(
"ObjectVariableRemoveAt",
_("Remove variable from an object array (by index)"),
_("Remove variable by index"),
_("Removes a variable at the specified index of an object array "
"variable."),
_("Remove variable at index _PARAM2_ from array variable _PARAM1_ of "
"_PARAM0_"),
_("Variables/Collections/Arrays"),
_("Variables/Arrays and structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Variable"))
.AddParameter("objectvar", _("Array variable"))
.AddParameter("expression", _("Index to remove"))
.MarkAsAdvanced();
obj.AddCondition(
"ObjectVariableChildCount",
_("Number of children"),
_("Compare the number of children in an object array variable."),
_("The number of children in the array variable _PARAM1_"),
_("Variables/Arrays and structures"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Variable"))
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddStrExpression(
"ArrayVariableFirstString",
_("First text child"),
_("Get the value of the first element of an object array variable, if "
"it is a text (string) variable."),
_("Variables/Arrays and structures"),
"res/actions/var.png")
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Array variable"));
obj.AddExpression(
"ArrayVariableFirstNumber",
_("First number child"),
_("Get the value of the first element of an object array variable, if "
"it is a number variable."),
_("Variables/Arrays and structures"),
"res/actions/var.png")
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Array variable"));
obj.AddStrExpression(
"ArrayVariableLastString",
_("Last text child"),
_("Get the value of the last element of an object array variable, if "
"it is a text (string) variable."),
_("Variables/Arrays and structures"),
"res/actions/var.png")
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Array variable"));
obj.AddExpression(
"ArrayVariableLastNumber",
_("Last number child"),
_("Get the value of the last element of an object array variable, if "
"it is a number variable."),
_("Variables/Arrays and structures"),
"res/actions/var.png")
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Array variable"));
obj.AddCondition("BehaviorActivated",
_("Behavior activated"),
_("Check if the behavior is activated for the object."),
@@ -886,7 +962,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/conditions/timer24.png",
"res/conditions/timer.png")
.AddParameter("object", _("Object"))
.AddParameter("string", _("Timer's name"))
.AddParameter("identifier", _("Timer's name"), "objectTimer")
.AddParameter("expression", _("Time in seconds"))
.SetHidden();
@@ -900,7 +976,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/conditions/timer24.png",
"res/conditions/timer.png")
.AddParameter("object", _("Object"))
.AddParameter("string", _("Timer's name"))
.AddParameter("identifier", _("Timer's name"), "objectTimer")
.AddParameter("relationalOperator", _("Sign of the test"), "time")
.AddParameter("expression", _("Time in seconds"))
.SetManipulatedType("number");
@@ -913,7 +989,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/conditions/timerPaused24.png",
"res/conditions/timerPaused.png")
.AddParameter("object", _("Object"))
.AddParameter("string", _("Timer's name"))
.AddParameter("identifier", _("Timer's name"), "objectTimer")
.MarkAsAdvanced();
obj.AddAction(
@@ -926,7 +1002,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/actions/timer24.png",
"res/actions/timer.png")
.AddParameter("object", _("Object"))
.AddParameter("string", _("Timer's name"));
.AddParameter("identifier", _("Timer's name"), "objectTimer");
obj.AddAction("PauseObjectTimer",
_("Pause an object timer"),
@@ -936,7 +1012,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/actions/pauseTimer24.png",
"res/actions/pauseTimer.png")
.AddParameter("object", _("Object"))
.AddParameter("string", _("Timer's name"))
.AddParameter("identifier", _("Timer's name"), "objectTimer")
.MarkAsAdvanced();
obj.AddAction("UnPauseObjectTimer",
@@ -947,7 +1023,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/actions/unPauseTimer24.png",
"res/actions/unPauseTimer.png")
.AddParameter("object", _("Object"))
.AddParameter("string", _("Timer's name"))
.AddParameter("identifier", _("Timer's name"), "objectTimer")
.MarkAsAdvanced();
obj.AddAction("RemoveObjectTimer",
@@ -958,28 +1034,28 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/actions/timer24.png",
"res/actions/timer.png")
.AddParameter("object", _("Object"))
.AddParameter("string", _("Timer's name"))
.AddParameter("identifier", _("Timer's name"), "objectTimer")
.MarkAsAdvanced();
obj.AddExpression("X",
_("X position"),
_("X position of the object"),
_("Position"),
"res/actions/position.png")
"res/actions/position_black.png")
.AddParameter("object", _("Object"));
obj.AddExpression("Y",
_("Y position"),
_("Y position of the object"),
_("Position"),
"res/actions/position.png")
"res/actions/position_black.png")
.AddParameter("object", _("Object"));
obj.AddExpression("Angle",
_("Angle"),
_("Current angle, in degrees, of the object"),
_("Angle"),
"res/actions/direction.png")
"res/actions/direction_black.png")
.AddParameter("object", _("Object"));
obj.AddExpression("ForceX",
@@ -1022,14 +1098,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Width"),
_("Width of the object"),
_("Size"),
"res/actions/scaleWidth.png")
"res/actions/scaleWidth_black.png")
.AddParameter("object", _("Object"));
obj.AddExpression("Largeur",
_("Width"),
_("Width of the object"),
_("Size"),
"res/actions/scaleWidth.png")
"res/actions/scaleWidth_black.png")
.AddParameter("object", _("Object"))
.SetHidden();
@@ -1037,14 +1113,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Height"),
_("Height of the object"),
_("Size"),
"res/actions/scaleHeight.png")
"res/actions/scaleHeight_black.png")
.AddParameter("object", _("Object"));
obj.AddExpression("Hauteur",
_("Height"),
_("Height of the object"),
_("Size"),
"res/actions/scaleHeight.png")
"res/actions/scaleHeight_black.png")
.AddParameter("object", _("Object"))
.SetHidden();
@@ -1098,23 +1174,24 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("expression", _("Target Y position"));
obj.AddExpression("Variable",
_("Object variable"),
_("Value of an object variable"),
_("Number variable"),
_("Number value of an object variable"),
_("Variables"),
"res/actions/var.png")
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Variable"));
obj.AddExpression("VariableChildCount",
_("Number of children of an object variable"),
_("Number of children of an object variable"),
_("Variables"),
"res/actions/var.png")
obj.AddExpression(
"VariableChildCount",
_("Number of children"),
_("Number of children in an object array or structure variable"),
_("Variables/Arrays and structures"),
"res/actions/var.png")
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Variable"));
.AddParameter("objectvar", _("Array or structure variable"));
obj.AddStrExpression("VariableString",
_("Object variable"),
_("Text variable"),
_("Text of an object variable"),
_("Variables"),
"res/actions/var.png")
@@ -1127,7 +1204,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Object timers"),
"res/actions/time.png")
.AddParameter("object", _("Object"))
.AddParameter("string", _("Timer's name"));
.AddParameter("identifier", _("Timer's name"), "objectTimer");
obj.AddExpression("AngleToObject",
_("Angle between two objects"),
@@ -1135,7 +1212,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"If you need the angle to an arbitrary position, "
"use AngleToPosition."),
_("Angle"),
"res/actions/position.png")
"res/actions/position_black.png")
.AddParameter("object", _("Object"))
.AddParameter("objectPtr", _("Object"));
@@ -1146,7 +1223,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"getting the cartesian coordinates of a 2D vector, using "
"its polar coordinates."),
_("Position"),
"res/actions/position.png")
"res/actions/position_black.png")
.AddParameter("object", _("Object"))
.AddParameter("expression", _("Angle, in degrees"))
.AddParameter("expression", _("Distance"));
@@ -1158,7 +1235,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"getting the cartesian coordinates of a 2D vector, using "
"its polar coordinates."),
_("Position"),
"res/actions/position.png")
"res/actions/position_black.png")
.AddParameter("object", _("Object"))
.AddParameter("expression", _("Angle, in degrees"))
.AddParameter("expression", _("Distance"));
@@ -1169,7 +1246,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"\"target\" position (in degrees). If you need the angle "
"between two objects, use AngleToObject."),
_("Angle"),
"res/actions/position.png")
"res/actions/position_black.png")
.AddParameter("object", _("Object"))
.AddParameter("expression", _("Target X position"))
.AddParameter("expression", _("Target Y position"));
@@ -1248,6 +1325,17 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.MarkAsSimple()
.SetRequiresBaseObjectCapability("effect");
obj.AddAction("SetIncludedInParentCollisionMask",
_("Include in parent collision mask"),
_("Include or exclude a child from its parent collision mask."),
_("Include _PARAM0_ in parent object collision mask: _PARAM1_"),
_("Collision"),
"res/function32.png",
"res/function32.png")
.AddParameter("object", _("Object"))
.AddParameter("yesorno", "Include in parent collision mask")
.SetRelevantForCustomObjectEventsOnly();
extension
.AddAction("Create",
_("Create an object"),
@@ -1261,7 +1349,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("objectListOrEmptyIfJustDeclared", _("Object to create"))
.AddParameter("expression", _("X position"))
.AddParameter("expression", _("Y position"))
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.MarkAsSimple();
@@ -1276,7 +1364,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/actions/create24.png",
"res/actions/create24.png")
.AddCodeOnlyParameter("objectsContext", "")
.AddParameter("objectListOrEmptyIfJustDeclared", _("Group of potential objects"))
.AddParameter("objectListOrEmptyIfJustDeclared",
_("Group of potential objects"))
.SetParameterLongDescription(
_("Group containing objects that can be created by the action."))
.AddParameter("string", _("Name of the object to create"))
@@ -1285,7 +1374,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"with this name are found in the group, no object will be created."))
.AddParameter("expression", _("X position"))
.AddParameter("expression", _("Y position"))
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.MarkAsAdvanced();
@@ -1315,7 +1404,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Objects"),
"res/actions/ajouthasard24.png",
"res/actions/ajouthasard.png")
.AddCodeOnlyParameter("currentScene", "")
.AddCodeOnlyParameter("objectsContext", "")
.AddParameter("objectList", _("Object"))
.MarkAsSimple();
@@ -1374,7 +1463,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Objects"),
"res/conditions/add24.png",
"res/conditions/add.png")
.AddCodeOnlyParameter("currentScene", "")
.AddCodeOnlyParameter("objectsContext", "")
.AddParameter("objectList", _("Object"))
.MarkAsAdvanced();
@@ -1389,7 +1478,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Objects"),
"res/conditions/ajouthasard24.png",
"res/conditions/ajouthasard.png")
.AddCodeOnlyParameter("currentScene", "")
.AddCodeOnlyParameter("objectsContext", "")
.AddParameter("objectList", _("Object"))
.MarkAsSimple();
@@ -1423,34 +1512,39 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/conditions/nbObjet24.png",
"res/conditions/nbObjet.png")
.AddParameter("objectList", _("Object"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsSimple()
.SetHidden();
extension.AddExpressionAndCondition(
"number",
"SceneInstancesCount",
_("Number of object instances on the scene"),
_("the number of instances of the specified objects living on the scene"),
_("the number of _PARAM1_ living on the scene"),
_("Objects"),
"res/conditions/nbObjet24.png")
.AddCodeOnlyParameter("objectsContext", "")
.AddParameter("objectListOrEmptyWithoutPicking", _("Object"))
.UseStandardParameters("number")
.MarkAsSimple();
extension
.AddExpressionAndCondition(
"number",
"SceneInstancesCount",
_("Number of object instances on the scene"),
_("the number of instances of the specified objects living on the "
"scene"),
_("the number of _PARAM1_ living on the scene"),
_("Objects"),
"res/conditions/nbObjet24.png")
.AddCodeOnlyParameter("objectsContext", "")
.AddParameter("objectListOrEmptyWithoutPicking", _("Object"))
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.MarkAsSimple();
extension.AddExpressionAndCondition(
"number",
"PickedInstancesCount",
_("Number of object instances currently picked"),
_("the number of instances picked by the previous conditions (or actions)"),
_("the number of _PARAM0_ currently picked"),
_("Objects"),
"res/conditions/nbObjet24.png")
.AddParameter("objectListOrEmptyWithoutPicking", _("Object"))
.UseStandardParameters("number")
.MarkAsSimple();
extension
.AddExpressionAndCondition(
"number",
"PickedInstancesCount",
_("Number of object instances currently picked"),
_("the number of instances picked by the previous conditions (or "
"actions)"),
_("the number of _PARAM0_ currently picked"),
_("Objects"),
"res/conditions/nbObjet24.png")
.AddParameter("objectListOrEmptyWithoutPicking", _("Object"))
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.MarkAsSimple();
extension
.AddCondition(
@@ -1494,7 +1588,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"Raycast",
_("Raycast"),
_("Sends a ray from the given source position and angle, "
"intersecting the closest object.\nThe instersected "
"intersecting the closest object.\nThe intersected "
"object will become the only one taken into account.\nIf "
"the condition is inverted, the object to be intersected "
"will be the farthest one within the ray radius."),
@@ -1525,11 +1619,11 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"RaycastToPosition",
_("Raycast to position"),
_("Sends a ray from the given source position to the final point, "
"intersecting the closest object.\nThe instersected "
"intersecting the closest object.\nThe intersected "
"object will become the only one taken into account.\nIf "
"the condition is inverted, the object to be intersected "
"will be the farthest one within the ray radius."),
_("Cast a ray from from _PARAM1_;_PARAM2_ to _PARAM3_;_PARAM4_ "
_("Cast a ray from _PARAM1_;_PARAM2_ to _PARAM3_;_PARAM4_ "
"against _PARAM0_, and save the "
"result in _PARAM5_, _PARAM6_"),
"",
@@ -1559,13 +1653,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"",
"res/conditions/nbObjet.png")
.AddParameter("objectList", _("Object"))
.SetHidden(); // Deprecated
.SetHidden(); // Deprecated
obj.AddStrExpression("ObjectName",
_("Object name"),
_("Return the name of the object"),
"",
"res/conditions/text.png")
"res/conditions/text_black.png")
.AddParameter("object", _("Object"));
obj.AddStrExpression("Layer",

View File

@@ -22,9 +22,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"object or a position.",
"Florian Rival",
"Open source (MIT License)")
.SetCategory("Camera")
.SetExtensionHelpPath("/interface/scene-editor/layers-and-cameras");
extension.AddInstructionOrExpressionGroupMetadata(_("Layers and cameras"))
.SetIcon("res/conditions/camera24.png");
extension.AddInstructionOrExpressionGroupMetadata(_("Effects"))
.SetIcon("res/actions/effect24.png");
extension
.AddExpressionAndConditionAndAction(
@@ -36,8 +39,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"",
"res/conditions/camera24.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardParameters("number")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
.SetDefaultValue("0")
@@ -68,8 +71,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"",
"res/conditions/camera24.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardParameters("number")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
.SetDefaultValue("0")
@@ -100,10 +103,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"",
"res/conditions/camera24.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number"), "", true)
.UseStandardParameters("number")
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
@@ -116,10 +119,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"",
"res/conditions/camera24.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number"), "", true)
.UseStandardParameters("number")
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
@@ -133,10 +136,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"",
"res/conditions/camera24.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number"), "", true)
.UseStandardParameters("number")
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
@@ -150,10 +153,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"",
"res/conditions/camera24.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number"), "", true)
.UseStandardParameters("number")
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
@@ -167,10 +170,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"",
"res/conditions/camera24.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number"), "", true)
.UseStandardParameters("number")
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
@@ -184,10 +187,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"",
"res/conditions/camera24.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number"), "", true)
.UseStandardParameters("number")
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
@@ -200,8 +203,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"",
"res/conditions/camera24.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardParameters("number")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
.SetDefaultValue("0")
@@ -221,7 +224,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"res/actions/camera24.png",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"))
.AddParameter("layer", _("Layer"))
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Width"), "", true)
.AddParameter("expression", _("Height"), "", true)
@@ -256,7 +259,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"res/actions/camera24.png",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"))
.AddParameter("layer", _("Layer"))
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number"))
.MarkAsComplex();
@@ -272,7 +275,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"res/actions/camera24.png",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"))
.AddParameter("layer", _("Layer"))
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number"))
.AddParameter("expression", _("Width"))
@@ -290,7 +293,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"res/actions/camera24.png",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"))
.AddParameter("layer", _("Layer"))
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number"))
.AddParameter(
@@ -309,7 +312,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
extension
.AddAction("ZoomCamera",
_("Change camera zoom"),
_("Camera zoom"),
_("Change camera zoom."),
_("Change camera zoom to _PARAM1_ (layer: _PARAM2_, camera: "
"_PARAM3_)"),
@@ -319,7 +322,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression",
_("Value (1:Initial zoom, 2:Zoom x2, 0.5:Unzoom x2...)"))
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
.SetDefaultValue("0");
@@ -351,46 +354,41 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"",
true)
.SetDefaultValue("yes")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
.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")
.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)
.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"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
.SetDefaultValue("0")
.MarkAsAdvanced();
extension
.AddAction(
"CentreCamera",
_("Center the camera on an object"),
_("Center the camera on the specified object."),
_("Center camera on _PARAM1_ (layer: _PARAM3_)"),
"",
"res/actions/camera24.png",
"res/actions/camera.png")
.AddAction("CentreCamera",
_("Center the camera on an object"),
_("Center the camera on the specified object."),
_("Center camera on _PARAM1_ (layer: _PARAM3_)"),
"",
"res/actions/camera24.png",
"res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("objectPtr", _("Object"))
.AddParameter("yesorno",
@@ -398,7 +396,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"",
true)
.SetDefaultValue("yes")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
.SetDefaultValue("0")
@@ -413,7 +411,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"res/actions/layer24.png",
"res/actions/layer.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"))
.AddParameter("layer", _("Layer"))
.SetDefaultValue("\"\"")
.MarkAsAdvanced();
@@ -426,7 +424,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"res/actions/layer24.png",
"res/actions/layer.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"))
.AddParameter("layer", _("Layer"))
.SetDefaultValue("\"\"")
.MarkAsAdvanced();
@@ -439,7 +437,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"res/conditions/layer24.png",
"res/conditions/layer.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"))
.AddParameter("layer", _("Layer"))
.SetDefaultValue("\"\"")
.MarkAsAdvanced();
@@ -452,10 +450,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"names) in the effects window."),
_("Set _PARAM3_ to _PARAM4_ for effect _PARAM2_ of layer _PARAM1_"),
_("Effects"),
"res/conditions/camera24.png",
"res/conditions/camera.png")
"res/actions/effect24.png",
"res/actions/effect.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("layerEffectName", _("Effect name"))
.AddParameter("layerEffectParameterName", _("Parameter name"))
@@ -471,10 +469,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"names) in the effects window."),
_("Set _PARAM3_ to _PARAM4_ for effect _PARAM2_ of layer _PARAM1_"),
_("Effects"),
"res/conditions/camera24.png",
"res/conditions/camera.png")
"res/actions/effect24.png",
"res/actions/effect.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("layerEffectName", _("Effect name"))
.AddParameter("layerEffectParameterName", _("Parameter name"))
@@ -490,10 +488,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"names) in the effects window."),
_("Enable _PARAM3_ for effect _PARAM2_ of layer _PARAM1_: _PARAM4_"),
_("Effects"),
"res/conditions/camera24.png",
"res/conditions/camera.png")
"res/actions/effect24.png",
"res/actions/effect.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("layerEffectName", _("Effect name"))
.AddParameter("layerEffectParameterName", _("Parameter name"))
@@ -505,11 +503,11 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Layer effect is enabled"),
_("The effect on a layer is enabled"),
_("Effect _PARAM2_ on layer _PARAM1_ is enabled"),
_("Effects"),
"res/conditions/camera24.png",
"res/conditions/camera.png")
_(""),
"res/actions/effect24.png",
"res/actions/effect.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("layerEffectName", _("Effect name"))
.MarkAsAdvanced();
@@ -520,10 +518,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Enable an effect on a layer"),
_("Enable effect _PARAM2_ on layer _PARAM1_: _PARAM3_"),
_("Effects"),
"res/conditions/camera24.png",
"res/conditions/camera.png")
"res/actions/effect24.png",
"res/actions/effect.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("layerEffectName", _("Effect name"))
.AddParameter("yesorno", _("Enable"), "", true)
@@ -539,9 +537,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"res/conditions/time24.png",
"res/conditions/time.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Time scale (1 by default)")))
.MarkAsAdvanced();
extension
@@ -554,7 +555,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"res/actions/time24.png",
"res/actions/time.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression",
_("Scale (1: Default, 2: 2x faster, 0.5: 2x slower...)"));
@@ -569,14 +570,15 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"res/conditions/layer24.png",
"res/conditions/layer.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
.AddAction("SetLayerDefaultZOrder",
_("Change layer default Z order"),
_("Layer default Z order"),
_("Change the default Z order set to objects when they are "
"created on a layer."),
_("Set the default Z order of objects created on _PARAM1_ to "
@@ -585,7 +587,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"res/actions/layer24.png",
"res/actions/layer.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("New default Z order"));
@@ -596,11 +598,11 @@ 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_"),
_("Lighting"),
_(""),
"res/actions/color24.png",
"res/actions/color.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"Lighting\"")
.AddParameter("color", _("Color"))
.MarkAsAdvanced();

View File

@@ -21,14 +21,14 @@ BuiltinExtensionsImplementer::ImplementsCommonConversionsExtension(
"Open source (MIT License)")
.SetExtensionHelpPath("/all-features/common-conversions");
extension.AddInstructionOrExpressionGroupMetadata(_("Conversion"))
.SetIcon("res/conditions/toujours24.png");
.SetIcon("res/conditions/toujours24_black.png");
extension
.AddExpression("ToNumber",
_("Text > Number"),
_("Convert the text to a number"),
"",
"res/conditions/toujours24.png")
"res/conditions/toujours24_black.png")
.AddParameter("string", _("Text to convert to a number"));
extension
@@ -36,7 +36,7 @@ BuiltinExtensionsImplementer::ImplementsCommonConversionsExtension(
_("Number > Text"),
_("Convert the result of the expression to text"),
"",
"res/conditions/toujours24.png")
"res/conditions/toujours24_black.png")
.AddParameter("expression", _("Expression to be converted to text"));
extension
@@ -45,7 +45,7 @@ BuiltinExtensionsImplementer::ImplementsCommonConversionsExtension(
_("Convert the result of the expression to text, "
"without using the scientific notation"),
"",
"res/conditions/toujours24.png")
"res/conditions/toujours24_black.png")
.AddParameter("expression", _("Expression to be converted to text"));
extension
@@ -54,7 +54,7 @@ BuiltinExtensionsImplementer::ImplementsCommonConversionsExtension(
_("Degrees > Radians"),
_("Converts the angle, expressed in degrees, into radians"),
"",
"res/conditions/toujours24.png")
"res/conditions/toujours24_black.png")
.AddParameter("expression", _("Angle, in degrees"));
extension
@@ -63,7 +63,7 @@ BuiltinExtensionsImplementer::ImplementsCommonConversionsExtension(
_("Radians > Degrees"),
_("Converts the angle, expressed in radians, into degrees"),
"",
"res/conditions/toujours24.png")
"res/conditions/toujours24_black.png")
.AddParameter("expression", _("Angle, in radians"));
extension
@@ -71,7 +71,7 @@ BuiltinExtensionsImplementer::ImplementsCommonConversionsExtension(
_("Convert scene variable to JSON"),
_("Convert a scene variable to JSON"),
_("JSON"),
"res/conditions/toujours24.png")
"res/conditions/toujours24_black.png")
.AddParameter("scenevar", _("Scene variable to be stringified"));
extension
@@ -79,7 +79,7 @@ BuiltinExtensionsImplementer::ImplementsCommonConversionsExtension(
_("Convert global variable to JSON"),
_("Convert a global variable to JSON"),
_("JSON"),
"res/conditions/toujours24.png")
"res/conditions/toujours24_black.png")
.AddParameter("globalvar", _("The global variable to be stringified"));
extension
@@ -87,7 +87,7 @@ BuiltinExtensionsImplementer::ImplementsCommonConversionsExtension(
_("Convert object variable to JSON"),
_("Convert an object variable to JSON"),
_("JSON"),
"res/conditions/toujours24.png")
"res/conditions/toujours24_black.png")
.AddParameter("objectPtr", _("The object with the variable"))
.AddParameter("objectvar", _("The object variable to be stringified"));
@@ -96,7 +96,7 @@ BuiltinExtensionsImplementer::ImplementsCommonConversionsExtension(
"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_"),
_("Convert JSON string _PARAM0_ and store it into variable _PARAM1_"),
"",
"res/actions/net24.png",
"res/actions/net.png")
@@ -108,7 +108,7 @@ BuiltinExtensionsImplementer::ImplementsCommonConversionsExtension(
.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 "
_("Convert JSON string _PARAM0_ and store it into global "
"variable _PARAM1_"),
"",
"res/actions/net24.png",

View File

@@ -33,7 +33,7 @@ BuiltinExtensionsImplementer::ImplementsCommonInstructionsExtension(
.SetExtensionHelpPath("/all-features/advanced-conditions");
extension
.AddInstructionOrExpressionGroupMetadata(_("Events and control flow"))
.SetIcon("res/conditions/toujours24.png");
.SetIcon("res/conditions/toujours24_black.png");
extension
.AddCondition("Always",
@@ -42,8 +42,8 @@ BuiltinExtensionsImplementer::ImplementsCommonInstructionsExtension(
"the condition is inverted)."),
_("Always"),
"",
"res/conditions/toujours24.png",
"res/conditions/toujours.png")
"res/conditions/toujours24_black.png",
"res/conditions/toujours_black.png")
.SetHelpPath("/all-features/advanced-conditions")
.AddCodeOnlyParameter("conditionInverted", "")
.MarkAsAdvanced();
@@ -61,8 +61,8 @@ BuiltinExtensionsImplementer::ImplementsCommonInstructionsExtension(
_("Check if one of the sub conditions is true"),
_("If one of these conditions is true:"),
"",
"res/conditions/or24.png",
"res/conditions/or.png")
"res/conditions/or24_black.png",
"res/conditions/or_black.png")
.SetCanHaveSubInstructions()
.MarkAsAdvanced();
@@ -72,8 +72,8 @@ BuiltinExtensionsImplementer::ImplementsCommonInstructionsExtension(
_("Check if all sub conditions are true"),
_("If all of these conditions are true:"),
"",
"res/conditions/and24.png",
"res/conditions/and.png")
"res/conditions/and24_black.png",
"res/conditions/and_black.png")
.SetCanHaveSubInstructions()
.MarkAsAdvanced();
@@ -84,8 +84,8 @@ BuiltinExtensionsImplementer::ImplementsCommonInstructionsExtension(
_("Return the contrary of the result of the sub conditions"),
_("Invert the logical result of these conditions:"),
"",
"res/conditions/not24.png",
"res/conditions/not.png")
"res/conditions/not24_black.png",
"res/conditions/not_black.png")
.SetCanHaveSubInstructions()
.MarkAsAdvanced();
@@ -104,8 +104,8 @@ BuiltinExtensionsImplementer::ImplementsCommonInstructionsExtension(
_("Compare the two numbers."),
_("_PARAM0_ _PARAM1_ _PARAM2_"),
"",
"res/conditions/egal24.png",
"res/conditions/egal.png")
"res/conditions/egal24_black.png",
"res/conditions/egal_black.png")
.SetHelpPath("/all-features/advanced-conditions")
.AddParameter("expression", _("First expression"))
.AddParameter("relationalOperator", _("Sign of the test"), "number")
@@ -125,8 +125,8 @@ BuiltinExtensionsImplementer::ImplementsCommonInstructionsExtension(
_("Compare the two strings."),
_("_PARAM0_ _PARAM1_ _PARAM2_"),
"",
"res/conditions/egal24.png",
"res/conditions/egal.png")
"res/conditions/egal24_black.png",
"res/conditions/egal_black.png")
.SetHelpPath("/all-features/advanced-conditions")
.AddParameter("string", _("First string expression"))
.AddParameter("relationalOperator", _("Sign of the test"), "string")

View File

@@ -21,7 +21,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/all-features/storage")
.SetCategory("Device");
.SetCategory("Advanced");
extension.AddInstructionOrExpressionGroupMetadata(_("Storage"))
.SetIcon("res/conditions/fichier24.png");

View File

@@ -485,6 +485,23 @@ BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(
.AddParameter("expression", _("Angle, in degrees"))
.AddParameter("expression", _("Distance"));
extension
.AddExpression("Pi",
_("Number Pi (3.1415...)"),
_("The number Pi (3.1415...)"),
"",
"res/mathfunction.png")
.SetHelpPath("/all-features/expressions");
extension
.AddExpression("lerpAngle",
_("Lerp (Linear interpolation) between two angles"),
_("Linearly interpolates between two angles (in degrees) by taking the shortest direction around the circle."),
"",
"res/mathfunction.png")
.AddParameter("expression", _("Starting angle, in degrees"))
.AddParameter("expression", _("Destination angle, in degrees"))
.AddParameter("expression", _("Interpolation value between 0 and 1."));
}
} // namespace gd

View File

@@ -27,6 +27,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
.SetCategory("Input");
extension.AddInstructionOrExpressionGroupMetadata(_("Mouse and touch"))
.SetIcon("res/actions/mouse24.png");
extension.AddInstructionOrExpressionGroupMetadata(_("Multitouch"))
.SetIcon("res/conditions/touch24.png");
extension
.AddCondition(
@@ -153,42 +155,80 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
extension
.AddExpressionAndCondition(
"number",
"MouseX",
"CursorX",
_("Cursor X position"),
_("the X position of the cursor or of a touch"),
_("the cursor (or touch) X position"),
"",
"res/conditions/mouse24.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardParameters("number")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
.SetDefaultValue("0");
// Support for deprecated names:
extension.AddDuplicatedCondition("SourisX", "MouseX").SetHidden();
extension.AddDuplicatedExpression("SourisX", "MouseX").SetHidden();
extension.AddDuplicatedCondition("MouseX", "CursorX").SetHidden();
extension.AddDuplicatedExpression("MouseX", "CursorX").SetHidden();
extension.AddDuplicatedCondition("SourisX", "CursorX").SetHidden();
extension.AddDuplicatedExpression("SourisX", "CursorX").SetHidden();
extension
.AddExpressionAndCondition(
"number",
"MouseY",
"CursorY",
_("Cursor Y position"),
_("the Y position of the cursor or of a touch"),
_("the cursor (or touch) Y position"),
"",
"res/conditions/mouse24.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardParameters("number")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
.SetDefaultValue("0");
// Support for deprecated names:
extension.AddDuplicatedCondition("SourisY", "MouseY").SetHidden();
extension.AddDuplicatedExpression("SourisY", "MouseY").SetHidden();
extension.AddDuplicatedCondition("MouseY", "CursorY").SetHidden();
extension.AddDuplicatedExpression("MouseY", "CursorY").SetHidden();
extension.AddDuplicatedCondition("SourisY", "CursorY").SetHidden();
extension.AddDuplicatedExpression("SourisY", "CursorY").SetHidden();
extension
.AddExpressionAndCondition("number",
"MouseOnlyCursorX",
_("Mouse cursor X position"),
_("the X position of the mouse cursor"),
_("the mouse cursor X position"),
"",
"res/conditions/mouse24.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
.SetDefaultValue("0")
// It's only useful for extensions as they can't use TouchSimulateMouse.
.SetHidden();
extension
.AddExpressionAndCondition("number",
"MouseOnlyCursorY",
_("Mouse cursor Y position"),
_("the Y position of the mouse cursor"),
_("the mouse cursor Y position"),
"",
"res/conditions/mouse24.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
.SetDefaultValue("0")
// It's only useful for extensions as they can't use TouchSimulateMouse.
.SetHidden();
extension
.AddCondition("IsMouseInsideCanvas",
@@ -276,8 +316,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
"res/conditions/touch24.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Touch identifier"))
.UseStandardParameters("number")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
.SetDefaultValue("0");
@@ -292,8 +332,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
"res/conditions/touch24.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Touch identifier"))
.UseStandardParameters("number")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.AddParameter("layer", _("Layer"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
.SetDefaultValue("0");
@@ -334,44 +374,85 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
.AddCondition(
"HasAnyTouchStarted",
_("A new touch has started"),
_("Check if a touch has just started on this frame. The touch identifiers can be "
_("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", "")
.SetHidden();
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", "")
.SetHidden();
extension
.AddExpression("StartedTouchId",
_("Started touch identifier"),
_("The identifier of the touch that has just started on "
"this frame. The number of touches can be "
"accessed using StartedTouchCount()."),
_("Multitouch"),
"res/conditions/touch.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Touch index"))
.SetHidden();
extension
.AddCondition(
"HasAnyTouchOrMouseStarted",
_("A new touch has started"),
_("Check if a touch has just started or the mouse left button has "
"been pressed on this frame. The touch identifiers can be "
"accessed using StartedTouchOrMouseId() and "
"StartedTouchOrMouseCount()."),
_("A new touch has started"),
_("Multitouch"),
"res/conditions/touch24.png",
"res/conditions/touch.png")
.AddCodeOnlyParameter("currentScene", "");
extension
.AddExpression(
"StartedTouchCount",
"StartedTouchOrMouseCount",
_("Started touch count"),
_("The number of touches that have just started on this frame. The touch identifiers can be "
"accessed using StartedTouchId()."),
_("The number of touches (including the mouse) that have just "
"started on this frame. The touch identifiers can be "
"accessed using StartedTouchOrMouseId()."),
_("Multitouch"),
"res/conditions/touch.png")
.AddCodeOnlyParameter("currentScene", "");
extension
.AddExpression(
"StartedTouchId",
"StartedTouchOrMouseId",
_("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()."),
_("The identifier of the touch or mouse that has just started on "
"this frame. The number of touches can be "
"accessed using StartedTouchOrMouseCount()."),
_("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")
.AddCondition("HasTouchEnded",
_("A touch has ended"),
_("Check if a touch has ended or a mouse left button has "
"been released."),
_("The touch with identifier _PARAM1_ has ended"),
_("Multitouch"),
"res/conditions/touch24.png",
"res/conditions/touch.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Touch identifier"));

View File

@@ -48,7 +48,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsNetworkExtension(
.AddParameter("string", "Content type", "", true)
.SetParameterLongDescription(
"If empty, \"application/x-www-form-urlencoded\" will be used.")
.AddParameter("scenevar", "Reponse scene variable", "", true)
.AddParameter("scenevar", "Response scene variable", "", true)
.SetParameterLongDescription(
"The response of the server will be stored, as a string, in this "
"variable. If the server returns *JSON*, you may want to use the "

View File

@@ -54,6 +54,19 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSceneExtension(
.AddCodeOnlyParameter("currentScene", "")
.MarkAsSimple();
extension
.AddCondition("DoesSceneExist",
_("Does scene exist"),
_("Check if scene exists."),
_("Scene _PARAM1_ exists"),
"",
"res/actions/texte.png",
"res/actions/texte.png")
.SetHelpPath("/interface/scene-editor/events")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("sceneName", _("Name of the scene to check"))
.MarkAsSimple();
extension
.AddAction("Scene",
_("Change the scene"),
@@ -112,7 +125,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSceneExtension(
extension
.AddAction("SceneBackground",
_("Change background color"),
_("Background color"),
_("Change the background color of the scene."),
_("Set background color to _PARAM1_"),
"",
@@ -136,6 +149,20 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSceneExtension(
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("yesorno", _("Deactivate input when focus is lost"))
.MarkAsAdvanced();
extension
.AddCondition(
"HasGameJustResumed",
_("Game has just resumed"),
_("Check if the game has just resumed from being hidden. It "
"happens when the game tab is selected, a minimized window is "
"restored or the application is put back on front."),
_("Game has just resumed"),
"",
"res/actions/window24.png",
"res/actions/window.png")
.SetHelpPath("/interface/scene-editor/events")
.AddCodeOnlyParameter("currentScene", "");
}
} // namespace gd

View File

@@ -31,7 +31,7 @@ class GD_CORE_API Point {
/**
* Change point position.
*/
void SetXY(float x_, float y_) {
void SetXY(double x_, double y_) {
x = x_;
y = y_;
}
@@ -39,27 +39,27 @@ class GD_CORE_API Point {
/**
* Change point X position.
*/
void SetX(float x_) { x = x_; }
void SetX(double x_) { x = x_; }
/**
* Change point Y position.
*/
void SetY(float y_) { y = y_; }
void SetY(double y_) { y = y_; }
/**
* Get point X position.
*/
float GetX() const { return x; }
double GetX() const { return x; }
/**
* Get point Y position.
*/
float GetY() const { return y; }
double GetY() const { return y; }
private:
gd::String name;
float x;
float y;
double x;
double y;
};
#endif // GDCORE_POINT_H

View File

@@ -4,13 +4,15 @@
* reserved. This project is released under the MIT License.
*/
#include "Polygon2d.h"
#include "GDCore/Vector2.h"
#include <cmath>
#include <iostream>
void Polygon2d::Rotate(float angle) {
float t, cosa = cos(-angle),
sina = sin(-angle); // We want a clockwise rotation
#include "GDCore/Vector2.h"
void Polygon2d::Rotate(double angle) {
double t, cosa = cos(-angle),
sina = sin(-angle); // We want a clockwise rotation
for (std::size_t i = 0; i < vertices.size(); ++i) {
t = vertices[i].x;
@@ -19,7 +21,7 @@ void Polygon2d::Rotate(float angle) {
}
}
void Polygon2d::Move(float x, float y) {
void Polygon2d::Move(double x, double y) {
for (std::size_t i = 0; i < vertices.size(); i++) {
vertices[i].x += x;
vertices[i].y += y;
@@ -50,13 +52,13 @@ bool Polygon2d::IsConvex() const {
(edges[0].x * edges[0 + 1].y - edges[0].y * edges[0 + 1].x) > 0;
for (std::size_t i = 1; i < edges.size() - 1; ++i) {
float zCrossProduct =
double zCrossProduct =
edges[i].x * edges[i + 1].y - edges[i].y * edges[i + 1].x;
if ((zCrossProduct > 0) != zProductIsPositive) return false;
}
float lastZCrossProduct = edges[edges.size() - 1].x * edges[0].y -
edges[edges.size() - 1].y * edges[0].x;
double lastZCrossProduct = edges[edges.size() - 1].x * edges[0].y -
edges[edges.size() - 1].y * edges[0].x;
if ((lastZCrossProduct > 0) != zProductIsPositive) return false;
return true;
@@ -75,7 +77,7 @@ gd::Vector2f Polygon2d::ComputeCenter() const {
return center;
}
Polygon2d Polygon2d::CreateRectangle(float width, float height) {
Polygon2d Polygon2d::CreateRectangle(double width, double height) {
Polygon2d rect;
rect.vertices.push_back(gd::Vector2f(-width / 2.0f, -height / 2.0f));
rect.vertices.push_back(gd::Vector2f(+width / 2.0f, -height / 2.0f));

View File

@@ -5,9 +5,10 @@
*/
#ifndef GDCORE_POLYGON_H
#define GDCORE_POLYGON_H
#include "GDCore/Vector2.h"
#include <vector>
#include "GDCore/Vector2.h"
/**
* \brief Represents a polygon. Usually used for collisions masks.
*
@@ -42,7 +43,7 @@ class GD_CORE_API Polygon2d {
* \note Edges are updated, there is no need to call ComputeEdges after
* calling Move.
*/
void Move(float x, float y);
void Move(double x, double y);
/**
* \brief Rotate the polygon.
@@ -52,7 +53,7 @@ class GD_CORE_API Polygon2d {
* \warning edges vector is not updated, you have to call ComputeEdges if
* needed.
*/
void Rotate(float angle);
void Rotate(double angle);
/**
* \brief Automatically fill edges vector using vertices.
@@ -77,7 +78,7 @@ class GD_CORE_API Polygon2d {
/**
* \brief Create a rectangle
*/
static Polygon2d CreateRectangle(float width, float height);
static Polygon2d CreateRectangle(double width, double height);
///@}
};

View File

@@ -22,6 +22,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/objects/sprite");
extension.AddInstructionOrExpressionGroupMetadata(_("Sprite"))
.SetIcon("CppPlatform/Extensions/spriteicon.png");
gd::ObjectMetadata& obj =
extension
@@ -33,7 +35,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
.SetCategoryFullName(_("General"));
obj.AddAction("Opacity",
_("Change sprite opacity"),
_("Sprite opacity"),
_("Change the opacity of a Sprite. 0 is fully transparent, 255 "
"is opaque (default)."),
_("the opacity"),
@@ -42,7 +44,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/actions/opacity.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Opacity (0-255)")))
.MarkAsSimple();
obj.AddAction("ChangeAnimation",
@@ -55,7 +60,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/actions/animation.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions())
.MarkAsSimple();
obj.AddAction("SetAnimationName",
@@ -79,12 +85,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"is in 8 directions mode, the valid directions are 0..7"),
_("the direction"),
_("Direction"),
"res/actions/direction24.png",
"res/actions/direction.png")
"res/actions/direction24_black.png",
"res/actions/direction_black.png")
.SetHidden() // Hide as 8 direction is not supported officially in the
// interface.
.AddParameter("object", _("Object"), "Sprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddAction("ChangeSprite",
@@ -96,7 +103,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/actions/sprite.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddAction("PauseAnimation",
@@ -132,7 +140,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/actions/animation.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(_("Speed scale")))
.MarkAsSimple();
obj.AddAction("TourneVersPos",
@@ -140,8 +150,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"Rotate an object towards a position.",
"Rotate _PARAM0_ towards _PARAM1_;_PARAM2_",
_("Direction"),
"res/actions/direction24.png",
"res/actions/direction.png")
"res/actions/rotate24_black.png",
"res/actions/rotate_black.png")
.AddParameter("object", _("Object to be rotated"), "Sprite")
.AddParameter("expression", _("X position"))
@@ -156,11 +166,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
_("Modify the scale of the specified object."),
_("the scale"),
_("Size"),
"res/actions/scale24.png",
"res/actions/scale.png")
"res/actions/scale24_black.png",
"res/actions/scale_black.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Scale (1 by default)")))
.MarkAsAdvanced();
obj.AddAction("ChangeScaleWidth",
@@ -168,11 +181,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
_("Modify the scale of the width of an object."),
_("the width's scale"),
_("Size"),
"res/actions/scale24.png",
"res/actions/scale.png")
"res/actions/scaleWidth24_black.png",
"res/actions/scaleWidth_black.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Scale (1 by default)")))
.MarkAsAdvanced();
obj.AddAction("ChangeScaleHeight",
@@ -180,11 +196,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
_("Modify the scale of the height of an object."),
_("the height's scale"),
_("Size"),
"res/actions/scale24.png",
"res/actions/scale.png")
"res/actions/scaleHeight24_black.png",
"res/actions/scaleHeight_black.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Scale (1 by default)")))
.MarkAsAdvanced();
obj.AddAction("ChangeWidth",
@@ -192,11 +211,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
_("Change the width of a Sprite object."),
_("the width"),
_("Size"),
"res/actions/scale24.png",
"res/actions/scale.png")
"res/actions/scaleWidth24_black.png",
"res/actions/scaleWidth_black.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddCondition("Width",
@@ -204,11 +224,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
_("Compare the width of a Sprite object."),
_("the width"),
_("Size"),
"res/conditions/scaleWidth24.png",
"res/conditions/scaleWidth.png")
"res/conditions/scaleWidth24_black.png",
"res/conditions/scaleWidth_black.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddAction("ChangeHeight",
@@ -216,11 +237,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
_("Change the height of a Sprite object."),
_("the height"),
_("Size"),
"res/actions/scale24.png",
"res/actions/scale.png")
"res/actions/scaleHeight24_black.png",
"res/actions/scaleHeight_black.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddCondition("Height",
@@ -228,11 +250,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
_("Compare the height of a Sprite object."),
_("the height"),
_("Size"),
"res/conditions/scaleHeight24.png",
"res/conditions/scaleHeight.png")
"res/conditions/scaleHeight24_black.png",
"res/conditions/scaleHeight_black.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddAction("SetSize",
@@ -240,8 +263,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
_("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")
"res/actions/scale24_black.png",
"res/actions/scale_black.png")
.AddParameter("object", _("Object"))
.AddParameter("expression", _("Width"))
@@ -258,7 +281,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/conditions/animation.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddCondition("AnimationName",
@@ -281,12 +305,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"from 0 to 7. Otherwise, the direction is in degrees."),
_("the direction"),
_("Direction"),
"res/conditions/direction24.png",
"res/conditions/direction.png")
"res/conditions/direction24_black.png",
"res/conditions/direction_black.png")
.SetHidden() // Hide as 8 direction is not supported officially in the
// interface.
.AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions());
obj.AddCondition("Sprite",
_("Current frame"),
@@ -299,7 +324,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/conditions/sprite.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddCondition("AnimStopped",
@@ -322,6 +348,19 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/conditions/animation24.png",
"res/conditions/animation.png")
.AddParameter("object", _("Object"), "Sprite")
.MarkAsSimple()
.SetHidden();
obj.AddCondition("AnimationEnded2",
_("Animation finished"),
_("Check if the animation being played by the Sprite object "
"is finished."),
_("The animation of _PARAM0_ is finished"),
_("Animations and images"),
"res/conditions/animation24.png",
"res/conditions/animation.png")
.AddParameter("object", _("Object"), "Sprite")
.MarkAsSimple();
@@ -330,11 +369,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
_("Compare the scale of the width of an object."),
_("the width's scale"),
_("Size"),
"res/conditions/scaleWidth24.png",
"res/conditions/scaleWidth.png")
"res/conditions/scaleWidth24_black.png",
"res/conditions/scaleWidth_black.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Scale (1 by default)")))
.MarkAsAdvanced();
obj.AddCondition("ScaleHeight",
@@ -342,11 +384,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
_("Compare the scale of the height of an object."),
_("the height's scale"),
_("Size"),
"res/conditions/scaleHeight24.png",
"res/conditions/scaleHeight.png")
"res/conditions/scaleHeight24_black.png",
"res/conditions/scaleHeight_black.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Scale (1 by default)")))
.MarkAsAdvanced();
obj.AddCondition("Opacity",
@@ -359,7 +404,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/conditions/opacity.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Opacity to compare to (0-255)")))
.MarkAsSimple();
obj.AddCondition(
@@ -372,7 +420,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/conditions/opacity.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddAction("ChangeColor",
@@ -449,8 +498,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"Rotate an object towards another.",
"Rotate _PARAM0_ towards _PARAM1_",
_("Direction"),
"res/actions/direction24.png",
"res/actions/direction.png")
"res/actions/rotate24_black.png",
"res/actions/rotate_black.png")
.AddParameter("object", _("Object"), "Sprite")
.AddParameter("objectPtr", "Rotate toward this object")
@@ -461,7 +510,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
_("X position of a point"),
_("X position of a point"),
_("Position"),
"res/actions/position.png")
"res/actions/position_black.png")
.SetHidden()
.AddParameter("object", _("Object"), "Sprite")
.AddParameter("objectPointName", _("Name of the point"), "", true);
@@ -470,7 +519,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
_("Y position of a point"),
_("Y position of a point"),
_("Position"),
"res/actions/position.png")
"res/actions/position_black.png")
.SetHidden()
.AddParameter("object", _("Object"), "Sprite")
.AddParameter("objectPointName", _("Name of the point"), "", true);
@@ -479,7 +528,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
_("X position of a point"),
_("X position of a point"),
_("Position"),
"res/actions/position.png")
"res/actions/position_black.png")
.AddParameter("object", _("Object"), "Sprite")
.AddParameter("objectPointName", _("Name of the point"));
@@ -488,7 +537,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
_("Y position of a point"),
_("Y position of a point"),
_("Position"),
"res/actions/position.png")
"res/actions/position_black.png")
.AddParameter("object", _("Object"), "Sprite")
.AddParameter("objectPointName", _("Name of the point"));
@@ -497,7 +546,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
_("Direction"),
_("Direction of the object"),
_("Direction"),
"res/actions/direction.png")
"res/actions/direction_black.png")
.SetHidden()
.AddParameter("object", _("Object"), "Sprite");
@@ -505,7 +554,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
_("Direction"),
_("Direction of the object"),
_("Direction"),
"res/actions/direction.png")
"res/actions/direction_black.png")
.SetHidden() // Hide as 8 direction is not supported officially in the
// interface.
.AddParameter("object", _("Object"), "Sprite");
@@ -534,7 +583,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
obj.AddExpression("Sprite",
_("Image"),
_("Animation frame of the object"),
_("Current frame of the animation of the object"),
_("Animations and images"),
"res/actions/sprite.png")
.AddParameter("object", _("Object"), "Sprite");
obj.AddExpression("AnimationFrameCount",
_("Number of frames"),
_("Number of frames in the current animation of the object"),
_("Animations and images"),
"res/actions/sprite.png")
.AddParameter("object", _("Object"), "Sprite");
@@ -550,14 +606,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
_("Scale of the width of an object"),
_("Scale of the width of an object"),
_("Size"),
"res/actions/scaleWidth.png")
"res/actions/scaleWidth_black.png")
.AddParameter("object", _("Object"), "Sprite");
obj.AddExpression("ScaleY",
_("Scale of the height of an object"),
_("Scale of the height of an object"),
_("Size"),
"res/actions/scaleHeight.png")
"res/actions/scaleHeight_black.png")
.AddParameter("object", _("Object"), "Sprite");
obj.AddExpression("Opacity",

View File

@@ -25,8 +25,7 @@ namespace gd {
Animation SpriteObject::badAnimation;
SpriteObject::SpriteObject(gd::String name_)
: Object(name_), updateIfNotVisible(false) {}
SpriteObject::SpriteObject() : updateIfNotVisible(false) {}
SpriteObject::~SpriteObject(){};

View File

@@ -36,11 +36,11 @@ namespace gd {
* \see gd::BuiltinExtensionsImplementer::ImplementsSpriteExtension
* \ingroup SpriteObjectExtension
*/
class GD_CORE_API SpriteObject : public gd::Object {
class GD_CORE_API SpriteObject : public gd::ObjectConfiguration {
public:
SpriteObject(gd::String name_);
SpriteObject();
virtual ~SpriteObject();
std::unique_ptr<gd::Object> Clone() const override {
std::unique_ptr<gd::ObjectConfiguration> Clone() const override {
return gd::make_unique<SpriteObject>(*this);
}

View File

@@ -21,20 +21,20 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
"Open source (MIT License)")
.SetExtensionHelpPath("" /*TODO: Add a documentation page for this */);
extension.AddInstructionOrExpressionGroupMetadata(_("Text manipulation"))
.SetIcon("res/actions/text24.png");
.SetIcon("res/actions/text24_black.png");
extension.AddStrExpression("NewLine",
_("Insert a new line"),
_("Insert a new line"),
"",
"res/conditions/toujours24.png");
"res/conditions/toujours24_black.png");
extension
.AddStrExpression("FromCodePoint",
_("Get character from code point"),
_("Get character from code point"),
"",
"res/conditions/toujours24.png")
"res/conditions/toujours24_black.png")
.AddParameter("expression", _("Code point"));
@@ -43,7 +43,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
_("Uppercase a text"),
_("Uppercase a text"),
"",
"res/conditions/toujours24.png")
"res/conditions/toujours24_black.png")
.AddParameter("string", _("Text"));
@@ -52,7 +52,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
_("Lowercase a text"),
_("Lowercase a text"),
"",
"res/conditions/toujours24.png")
"res/conditions/toujours24_black.png")
.AddParameter("string", _("Text"));
@@ -61,7 +61,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
_("Get a portion of a text"),
_("Get a portion of a text"),
"",
"res/conditions/toujours24.png")
"res/conditions/toujours24_black.png")
.AddParameter("string", _("Text"))
.AddParameter("expression",
@@ -74,7 +74,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
_("Get a character from a text"),
_("Get a character from a text"),
"",
"res/conditions/toujours24.png")
"res/conditions/toujours24_black.png")
.AddParameter("string", _("Text"))
.AddParameter(
@@ -86,7 +86,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
_("Repeat a text"),
_("Repeat a text"),
"",
"res/conditions/toujours24.png")
"res/conditions/toujours24_black.png")
.AddParameter("string", _("Text to repeat"))
.AddParameter("expression", _("Repetition count"));
@@ -96,7 +96,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
_("Length of a text"),
_("Length of a text"),
"",
"res/conditions/toujours24.png")
"res/conditions/toujours24_black.png")
.AddParameter("string", _("Text"));
@@ -106,7 +106,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
_("Search in a text (return the position of the result or "
"-1 if not found)"),
"",
"res/conditions/toujours24.png")
"res/conditions/toujours24_black.png")
.AddParameter("string", _("Text"))
.AddParameter("string", _("Text to search for"));
@@ -117,7 +117,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
"Search in a text from the end (return the position of "
"the result or -1 if not found)",
"",
"res/conditions/toujours24.png")
"res/conditions/toujours24_black.png")
.AddParameter("string", _("Text"))
.AddParameter("string", _("Text to search for"))
@@ -126,12 +126,12 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
extension
.AddExpression(
"StrFindLast",
_("Search the last occurence in a text"),
_("Search the last occurence in a string (return the position of "
_("Search the last occurrence in a text"),
_("Search the last occurrence in a string (return the position of "
"the result, from the beginning of the string, or -1 if not "
"found)"),
"",
"res/conditions/toujours24.png")
"res/conditions/toujours24_black.png")
.AddParameter("string", _("Text"))
.AddParameter("string", _("Text to search for"));
@@ -142,7 +142,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
_("Search in a text, starting from a position (return the "
"position of the result or -1 if not found)"),
"",
"res/conditions/toujours24.png")
"res/conditions/toujours24_black.png")
.AddParameter("string", _("Text"))
.AddParameter("string", _("Text to search for"))
@@ -157,7 +157,7 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
"Search in a text from the end, starting from a position (return "
"the position of the result or -1 if not found)",
"",
"res/conditions/toujours24.png")
"res/conditions/toujours24_black.png")
.AddParameter("string", _("Text"))
.AddParameter("string", _("Text to search for"))
@@ -169,13 +169,13 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
extension
.AddExpression(
"StrFindLastFrom",
_("Search the last occurence in a text, starting from a position"),
_("Search in a text the last occurence, starting from a position "
_("Search the last occurrence in a text, starting from a position"),
_("Search in a text the last occurrence, starting from a position "
"(return "
" the position of the result, from the beginning of the string, or "
"-1 if not found)"),
"",
"res/conditions/toujours24.png")
"res/conditions/toujours24_black.png")
.AddParameter("string", _("Text"))
.AddParameter("string", _("Text to search for"))
@@ -183,6 +183,26 @@ BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension(
_("Position of the last character in the string to be "
"considered in the search"));
extension
.AddStrExpression("StrReplaceOne",
_("Replace the first occurrence of a text by another."),
_("Replace the first occurrence of a text by another."),
"",
"res/conditions/toujours24_black.png")
.AddParameter("string", _("Text in which the replacement must be done"))
.AddParameter("string", _("Text to find inside the first text"))
.AddParameter("string", _("Replacement to put instead of the text to find"));
extension
.AddStrExpression("StrReplaceAll",
_("Replace all occurrences of a text by another."),
_("Replace all occurrences of a text by another."),
"",
"res/conditions/toujours24_black.png")
.AddParameter("string", _("Text in which the replacement(s) must be done"))
.AddParameter("string", _("Text to find inside the first text"))
.AddParameter("string", _("Replacement to put instead of the text to find"));
}
} // namespace gd

View File

@@ -36,7 +36,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
"res/conditions/timer.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Time in seconds"))
.AddParameter("string", _("Timer's name"))
.AddParameter("identifier", _("Timer's name"), "sceneTimer")
.SetHidden();
extension
@@ -50,7 +50,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
"res/conditions/timer24.png",
"res/conditions/timer.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Timer's name"))
.AddParameter("identifier", _("Timer's name"), "sceneTimer")
.AddParameter("relationalOperator", _("Sign of the test"), "time")
.AddParameter("expression", _("Time in seconds"))
.SetManipulatedType("number");
@@ -65,7 +65,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
"res/conditions/time24.png",
"res/conditions/time.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Time scale (1 by default)")))
.MarkAsAdvanced();
extension
@@ -78,7 +81,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
"res/conditions/timerPaused24.png",
"res/conditions/timerPaused.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Timer's name"))
.AddParameter("identifier", _("Timer's name"), "sceneTimer")
.MarkAsAdvanced();
extension
@@ -93,7 +96,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
"res/actions/timer24.png",
"res/actions/timer.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Timer's name"));
.AddParameter("identifier", _("Timer's name"), "sceneTimer");
extension
.AddAction("PauseTimer",
@@ -105,7 +108,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
"res/actions/pauseTimer24.png",
"res/actions/pauseTimer.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Timer's name"))
.AddParameter("identifier", _("Timer's name"), "sceneTimer")
.MarkAsAdvanced();
extension
@@ -118,7 +121,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
"res/actions/unPauseTimer24.png",
"res/actions/unPauseTimer.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Timer's name"))
.AddParameter("identifier", _("Timer's name"), "sceneTimer")
.MarkAsAdvanced();
extension
@@ -131,12 +134,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
"res/actions/timer24.png",
"res/actions/timer.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Timer's name"))
.AddParameter("identifier", _("Timer's name"), "sceneTimer")
.MarkAsAdvanced();
extension
.AddAction("ChangeTimeScale",
_("Change time scale"),
_("Time scale"),
_("Change the time scale of the scene."),
_("Set the time scale of the scene to _PARAM1_"),
"",
@@ -148,14 +151,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
extension
.AddAction("Wait",
_("Wait X seconds (experimental)"),
_("Wait X seconds"),
_("Waits a number of seconds before running "
"the next actions (and sub-events)."),
_("Wait _PARAM0_ seconds"),
"",
"res/timer.svg",
"res/timer.svg")
.AddParameter("expression", "Time to wait in seconds")
"res/timer_black.svg",
"res/timer_black.svg")
.AddParameter("expression", _("Time to wait in seconds"))
.SetHelpPath("/all-features/timers-and-time/wait-action");
extension
@@ -191,7 +194,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
"",
"res/actions/time.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Timer's name"));
.AddParameter("identifier", _("Timer's name"), "sceneTimer");
extension
.AddExpression("TimeFromStart",

View File

@@ -27,30 +27,32 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddCondition("VarScene",
_("Value of a scene variable"),
_("Compare the value of a scene variable."),
_("the scene variable _PARAM0_"),
_("Number variable"),
_("Compare the number value of a scene variable."),
_("The number of scene variable _PARAM0_"),
_("Scene variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("scenevar", _("Variable"))
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions());
extension
.AddCondition("VarSceneTxt",
_("Text of a scene variable"),
_("Compare the text of a scene variable."),
_("the text of scene variable _PARAM0_"),
_("Text variable"),
_("Compare the text (string) of a scene variable."),
_("The text of scene variable _PARAM0_"),
_("Scene variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("scenevar", _("Variable"))
.UseStandardRelationalOperatorParameters("string");
.UseStandardRelationalOperatorParameters(
"string", ParameterOptions::MakeNewOptions());
extension
.AddCondition(
"SceneVariableAsBoolean",
_("Boolean value of a scene variable"),
_("Boolean variable"),
_("Compare the boolean value of a scene variable."),
_("The boolean value of scene variable _PARAM0_ is _PARAM1_"),
_("Scene variables"),
@@ -61,14 +63,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
.SetDefaultValue("true");
extension
.AddCondition(
"VariableChildExists",
_("Child existence"),
_("Check if the specified child of the scene variable exists."),
_("Child _PARAM1_ of scene variable _PARAM0_ exists"),
_("Scene variables/Collections/Structures"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddCondition("VariableChildExists",
_("Child existence"),
_("Check if the specified child of the scene structure "
"variable exists."),
_("Child _PARAM1_ of scene variable _PARAM0_ exists"),
_("Scene variables/Arrays and structures"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("scenevar", _("Variable"))
.AddParameter("string", _("Name of the child"))
.MarkAsAdvanced();
@@ -76,10 +78,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddCondition("GlobalVariableChildExists",
_("Child existence"),
_("Check if the specified child of the global "
_("Check if the specified child of the global structure "
"variable exists."),
_("Child _PARAM1_ of global variable _PARAM0_ exists"),
_("Global variables/Collections/Structures"),
_("Global variables/Arrays and structures"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("globalvar", _("Variable"))
@@ -88,7 +90,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddCondition("VarSceneDef",
"Test if a scene variable is defined",
"Variable defined",
"Test if the scene variable exists.",
"Scene variable _PARAM0_ is defined",
_("Scene variables"),
@@ -96,36 +98,38 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
"res/conditions/var.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Variable"))
.SetHidden();
.SetHidden(); // Deprecated.
extension
.AddCondition("VarGlobal",
_("Value of a global variable"),
_("Compare the value of a global variable."),
_("Number variable"),
_("Compare the number value of a global variable."),
_("the global variable _PARAM0_"),
_("Global variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("globalvar", _("Variable"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
.AddCondition("VarGlobalTxt",
_("Text of a global variable"),
_("Compare the text of a global variable."),
_("Text variable"),
_("Compare the text (string) of a global variable."),
_("the text of the global variable _PARAM0_"),
_("Global variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("globalvar", _("Variable"))
.UseStandardRelationalOperatorParameters("string")
.UseStandardRelationalOperatorParameters(
"string", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
.AddCondition(
"GlobalVariableAsBoolean",
_("Boolean value of a global variable"),
_("Boolean variable"),
_("Compare the boolean value of a global variable."),
_("The boolean value of global variable _PARAM0_ is _PARAM1_"),
_("Global variables"),
@@ -137,8 +141,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddCondition("VarGlobalDef",
"Test if a global variable is defined",
"Test if a global variable exists",
"Variable defined",
"Test if a global variable exists.",
"Global variable _PARAM0_ is defined",
_("Global variables"),
"res/conditions/var24.png",
@@ -146,34 +150,36 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Variable"))
.MarkAsAdvanced()
.SetHidden();
.SetHidden(); // Deprecated.
extension
.AddAction("ModVarScene",
_("Value of a scene variable"),
_("Change the value of a scene variable."),
_("Change number variable"),
_("Modify the number value of a scene variable."),
_("the scene variable _PARAM0_"),
_("Scene variables"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Variable"))
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions());
extension
.AddAction("ModVarSceneTxt",
_("String of a scene variable"),
_("Modify the text of a scene variable."),
_("Change text variable"),
_("Modify the text (string) of a scene variable."),
_("the text of scene variable _PARAM0_"),
_("Scene variables"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Variable"))
.UseStandardOperatorParameters("string");
.UseStandardOperatorParameters("string",
ParameterOptions::MakeNewOptions());
extension
.AddAction(
"SetSceneVariableAsBoolean",
_("Boolean value of a scene variable"),
_("Change boolean variable"),
_("Modify the boolean value of a scene variable."),
_("Set the boolean value of scene variable _PARAM0_ to _PARAM1_"),
_("Scene variables"),
@@ -184,7 +190,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddAction("ToggleSceneVariableAsBoolean",
_("Toggle boolean value of a scene variable"),
_("Toggle boolean variable"),
_("Toggle the boolean value of a scene variable.") + "\n" +
_("If it was true, it will become false, and if it was "
"false it will become true."),
@@ -196,32 +202,34 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddAction("ModVarGlobal",
_("Value of a global variable"),
_("Change the value of a global variable"),
_("Change number variable"),
_("Modify the number value of a global variable."),
_("the global variable _PARAM0_"),
_("Global variables"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Variable"))
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
.AddAction("ModVarGlobalTxt",
_("String of a global variable"),
_("Modify the text of a global variable."),
_("Change text variable"),
_("Modify the text (string) of a global variable."),
_("the text of global variable _PARAM0_"),
_("Global variables"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Variable"))
.UseStandardOperatorParameters("string")
.UseStandardOperatorParameters("string",
ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
.AddAction(
"SetGlobalVariableAsBoolean",
_("Boolean value of a global variable"),
_("Change boolean variable"),
_("Modify the boolean value of a global variable."),
_("Set the boolean value of global variable _PARAM0_ to _PARAM1_"),
_("Global variables"),
@@ -232,7 +240,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddAction("ToggleGlobalVariableAsBoolean",
_("Toggle boolean value of a global variable"),
_("Toggle boolean variable"),
_("Toggle the boolean value of a global variable.") + "\n" +
_("If it was true, it will become false, and if it was "
"false it will become true."),
@@ -243,202 +251,324 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
.AddParameter("globalvar", _("Variable"));
extension
.AddAction("VariableRemoveChild",
_("Remove a child"),
_("Remove a child from a scene variable."),
_("Remove child _PARAM1_ from scene variable _PARAM0_"),
_("Scene variables/Collections/Structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Variable"))
.AddAction(
"VariableRemoveChild",
_("Remove a child"),
_("Remove a child from a scene structure variable."),
_("Remove child _PARAM1_ from scene structure variable _PARAM0_"),
_("Scene variables/Arrays and structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Structure variable"))
.AddParameter("string", _("Child's name"))
.MarkAsAdvanced();
extension
.AddAction("GlobalVariableRemoveChild",
_("Remove a child"),
_("Remove a child from a global variable."),
_("Remove child _PARAM1_ from global variable _PARAM0_"),
_("Global variables/Collections/Structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Variable"))
.AddAction(
"GlobalVariableRemoveChild",
_("Remove a child"),
_("Remove a child from a global structure variable."),
_("Remove child _PARAM1_ from global structure variable _PARAM0_"),
_("Global variables/Arrays and structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Structure variable"))
.AddParameter("string", _("Child's name"))
.MarkAsAdvanced();
extension
.AddAction("VariableClearChildren",
_("Clear scene variable"),
_("Remove all the children from the scene variable."),
_("Clear children"),
_("Remove all the children from the scene structure or array "
"variable."),
_("Clear children from scene variable _PARAM0_"),
_("Scene variables/Collections"),
_("Scene variables/Arrays and structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Variable"))
.AddParameter("scenevar", _("Structure or array variable"))
.MarkAsAdvanced();
extension
.AddAction("GlobalVariableClearChildren",
_("Clear global variable"),
_("Remove all the children from the global variable."),
_("Clear children"),
_("Remove all the children from the global structure or array "
"variable."),
_("Clear children from global variable _PARAM0_"),
_("Global variables/Collections"),
_("Global variables/Arrays and structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Variable"))
.AddParameter("globalvar", _("Structure or array variable"))
.MarkAsAdvanced();
extension
.AddAction("SceneVariablePush",
_("Append variable to a scene array"),
_("Appends a variable at the end of a scene array variable."),
_("Append variable _PARAM1_ to array variable _PARAM0_"),
_("Scene variables/Collections/Arrays"),
_("Add existing variable"),
_("Adds an existing variable at the end of a scene array "
"variable."),
_("Add variable _PARAM1_ to array variable _PARAM0_"),
_("Scene variables/Arrays and structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Array variable"))
.AddParameter("scenevar", _("Scene variable with the content to append"))
.SetParameterLongDescription(_("The content of the variable will *be copied* and appended at the end of the array."))
.AddParameter("scenevar", _("Scene variable with the content to add"))
.SetParameterLongDescription(
_("The content of the variable will *be copied* and added at the "
"end of the array."))
.MarkAsAdvanced();
extension
.AddAction("SceneVariablePushString",
_("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_"),
_("Scene variables/Collections/Arrays"),
"res/actions/var24.png",
"res/actions/var.png")
.AddAction(
"SceneVariablePushString",
_("Add text variable"),
_("Adds a text (string) at the end of a scene array variable."),
_("Add text _PARAM1_ to array variable _PARAM0_"),
_("Scene variables/Arrays and structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Array variable"))
.AddParameter("string", _("String to append"))
.AddParameter("string", _("Text to add"))
.MarkAsAdvanced();
extension
.AddAction("SceneVariablePushNumber",
_("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_"),
_("Scene variables/Collections/Arrays"),
_("Add number variable"),
_("Adds a number at the end of a scene array variable."),
_("Add number _PARAM1_ to array variable _PARAM0_"),
_("Scene variables/Arrays and structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Array variable"))
.AddParameter("expression", _("Number to append"))
.AddParameter("expression", _("Number to add"))
.MarkAsAdvanced();
extension
.AddAction("SceneVariablePushBool",
_("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_"),
_("Scene variables/Collections/Arrays"),
_("Add boolean variable"),
_("Adds a boolean at the end of a scene array variable."),
_("Add boolean _PARAM1_ to array variable _PARAM0_"),
_("Scene variables/Arrays and structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Array variable"))
.AddParameter("trueorfalse", _("Boolean to append"))
.AddParameter("trueorfalse", _("Boolean to add"))
.MarkAsAdvanced();
extension
.AddAction(
"SceneVariableRemoveAt",
_("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_"),
_("Scene variables/Collections/Arrays"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Variable"))
.AddAction("SceneVariableRemoveAt",
_("Remove variable by index"),
_("Removes a variable at the specified index of a scene array "
"variable."),
_("Remove variable at index _PARAM1_ from scene array "
"variable _PARAM0_"),
_("Scene variables/Arrays and structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Array variable"))
.AddParameter("expression", _("Index to remove"))
.MarkAsAdvanced();
extension
.AddAction("GlobalVariablePush",
_("Append variable to a global array"),
_("Appends a variable at the end of a global array variable."),
_("Append variable _PARAM1_ to array variable _PARAM0_"),
_("Global variables/Collections/Arrays"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Array variable"))
.AddParameter("scenevar", _("Scene variable with the content to append"))
.SetParameterLongDescription(_("The content of the variable will *be copied* and appended at the end of the array."))
.AddCondition(
"SceneVariableChildCount",
_("Number of children"),
_("Compare the number of children in a scene array variable."),
_("The number of children in the array variable _PARAM0_"),
_("Scene variables/Arrays and structures"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("scenevar", _("Array variable"))
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
.AddStrExpression(
"SceneVariableFirstString",
_("First text child"),
_("Get the value of the first element of a scene array variable, if "
"it is a text (string)."),
_("Scene variables/Arrays and structures"),
"res/actions/var.png")
.AddParameter("scenevar", _("Array variable"));
extension
.AddExpression(
"SceneVariableFirstNumber",
_("First number child"),
_("Get the value of the first element of a scene array variable, if "
"it is a number."),
_("Scene variables/Arrays and structures"),
"res/actions/var.png")
.AddParameter("scenevar", _("Array variable"));
extension
.AddStrExpression(
"SceneVariableLastString",
_("Last text child"),
_("Get the value of the last element of a scene array variable, if "
"it is a text (string)."),
_("Scene variables/Arrays and structures"),
"res/actions/var.png")
.AddParameter("scenevar", _("Array variable"));
extension
.AddExpression(
"SceneVariableLastNumber",
_("Last number child"),
_("Get the value of the last element of a scene array variable, if "
"it is a number."),
_("Scene variables/Arrays and structures"),
"res/actions/var.png")
.AddParameter("scenevar", _("Array variable"));
extension
.AddAction(
"GlobalVariableRemoveAt",
_("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_"),
_("Global variables/Collections/Arrays"),
"GlobalVariablePush",
_("Add existing variable"),
_("Adds an existing variable at the end of a global array variable."),
_("Add variable _PARAM1_ to array variable _PARAM0_"),
_("Global variables/Arrays and structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Variable"))
.AddParameter("globalvar", _("Array variable"))
.AddParameter("scenevar", _("Scene variable with the content to add"))
.SetParameterLongDescription(
_("The content of the variable will *be copied* and added at the "
"end of the array."))
.MarkAsAdvanced();
extension
.AddAction("GlobalVariableRemoveAt",
_("Remove variable by index"),
_("Removes a variable at the specified index of a global "
"array variable."),
_("Remove variable at index _PARAM1_ from global array "
"variable _PARAM0_"),
_("Global variables/Arrays and structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Array variable"))
.AddParameter("expression", _("Index to remove"))
.MarkAsAdvanced();
extension
.AddAction("GlobalVariablePushString",
_("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_"),
_("Global variables/Collections/Arrays"),
"res/actions/var24.png",
"res/actions/var.png")
.AddAction(
"GlobalVariablePushString",
_("Add text variable"),
_("Adds a text (string) at the end of a global array variable."),
_("Add text _PARAM1_ to array variable _PARAM0_"),
_("Global variables/Arrays and structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Array variable"))
.AddParameter("string", _("String to append"))
.AddParameter("string", _("Text to add"))
.MarkAsAdvanced();
extension
.AddAction("GlobalVariablePushNumber",
_("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_"),
_("Global variables/Collections/Arrays"),
_("Add number variable"),
_("Adds a number at the end of a global array variable."),
_("Add number _PARAM1_ to array variable _PARAM0_"),
_("Global variables/Arrays and structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Array variable"))
.AddParameter("expression", _("Number to append"))
.AddParameter("expression", _("Number to add"))
.MarkAsAdvanced();
extension
.AddAction("GlobalVariablePushBool",
_("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_"),
_("Global variables/Collections/Arrays"),
_("Add boolean variable"),
_("Adds a boolean at the end of a global array variable."),
_("Add boolean _PARAM1_ to array variable _PARAM0_"),
_("Global variables/Arrays and structures"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Array variable"))
.AddParameter("trueorfalse", _("Boolean to append"))
.AddParameter("trueorfalse", _("Boolean to add"))
.MarkAsAdvanced();
extension
.AddExpression("GlobalVariableChildCount",
_("Number of children of a global variable"),
_("Number of children of a global variable"),
_("Global variables"),
.AddCondition(
"GlobalVariableChildCount",
_("Number of children"),
_("Compare the number of children in a global array variable."),
_("The number of children of the array variable _PARAM0_"),
_("Global variables/Arrays and structures"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("globalvar", _("Array variable"))
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
.AddStrExpression("GlobalVariableFirstString",
_("First text child"),
_("Value of the first element of a global array "
"variable, if it is a text (string) variable."),
_("Global variables/Arrays and structures"),
"res/actions/var.png")
.AddParameter("globalvar", _("Array variable"));
extension
.AddExpression("GlobalVariableFirstNumber",
_("First number child"),
_("Value of the first element of a global array "
"variable, if it is a number variable"),
_("Global variables/Arrays and structures"),
"res/actions/var.png")
.AddParameter("globalvar", _("Variable"));
.AddParameter("globalvar", _("Array variable"));
extension
.AddStrExpression(
"GlobalVariableLastString",
_("Last text child"),
_("Value of the last element of a global array variable, if "
"it is a text (string) variable."),
_("Global variables/Arrays and structures"),
"res/actions/var.png")
.AddParameter("globalvar", _("Array variable"));
extension
.AddExpression(
"GlobalVariableLastNumber",
_("Last number child"),
_("Value of the last element of a global array variable, if "
"it is a number variable"),
_("Global variables/Arrays and structures"),
"res/actions/var.png")
.AddParameter("globalvar", _("Array variable"));
extension
.AddExpression("GlobalVariableChildCount",
_("Number of children"),
_("Number of children in a global array or "
"structure variable"),
_("Global variables/Arrays and structures"),
"res/actions/var.png")
.AddParameter("globalvar", _("Array or structure variable"));
extension
.AddExpression("VariableChildCount",
_("Number of children of a scene variable"),
_("Number of children of a scene variable"),
_("Scene variables"),
_("Number of children"),
_("Number of children in a scene array or "
"structure variable"),
_("Scene variables/Arrays and structures"),
"res/actions/var.png")
.AddParameter("scenevar", _("Variable"));
.AddParameter("scenevar", _("Array or structure variable"));
extension
.AddExpression("Variable",
_("Value of a scene variable"),
_("Value of a scene variable"),
_("Number variable"),
_("Number value of a scene variable"),
_("Scene variables"),
"res/actions/var.png")
.AddParameter("scenevar", _("Variable"));
extension
.AddStrExpression("VariableString",
_("Text of a scene variable"),
_("Text variable"),
_("Text of a scene variable"),
_("Scene variables"),
"res/actions/var.png")
@@ -446,15 +576,15 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddExpression("GlobalVariable",
_("Value of a global variable"),
_("Value of a global variable"),
_("Number variable"),
_("Number value of a global variable"),
_("Global variables"),
"res/actions/var.png")
.AddParameter("globalvar", _("Name of the global variable"));
extension
.AddStrExpression("GlobalVariableString",
_("Text of a global variable"),
_("Text variable"),
_("Text of a global variable"),
_("Global variables"),
"res/actions/var.png")

View File

@@ -20,6 +20,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
"these features can be applied.",
"Florian Rival",
"Open source (MIT License)")
.SetCategory("User interface")
.SetExtensionHelpPath("/all-features/window");
extension
.AddInstructionOrExpressionGroupMetadata(
@@ -55,7 +56,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
extension
.AddAction("SetWindowMargins",
_("Change the window's margins"),
_("Window's margins"),
_("This action changes the margins, in pixels, between the "
"game frame and the window borders."),
_("Set margins of game window to "
@@ -71,7 +72,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
extension
.AddAction("SetGameResolutionSize",
_("Change the resolution of the game"),
_("Game resolution"),
_("Changes the resolution of the game, effectively changing "
"the game area size. This won't change the size of the "
"window in which the game is running."),
@@ -117,7 +118,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
extension
.AddAction("SetGameResolutionResizeMode",
_("Change the game resolution resize mode"),
_("Game resolution resize mode"),
_("Set if the width or the height of the game resolution "
"should be changed to fit the game window - or if the game "
"resolution should not be updated automatically."),
@@ -153,7 +154,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
extension
.AddAction("SetWindowIcon",
_("Change the window's icon"),
_("Window's icon"),
_("This action changes the icon of the game's window."),
_("Use _PARAM1_ as the icon for the game's window."),
"",
@@ -164,7 +165,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
extension
.AddAction("SetWindowTitle",
_("Change the window's title"),
_("Window's title"),
_("This action changes the title of the game's window."),
_("Change window title to _PARAM1_"),
"",

View File

@@ -14,12 +14,14 @@
#include "GDCore/Project/Behavior.h"
#include "GDCore/Project/BehaviorsSharedData.h"
#include "GDCore/Tools/Localization.h"
#include "GDCore/Tools/MakeUnique.h"
#include "GDCore/Tools/Log.h"
namespace gd {
BehaviorMetadata::BehaviorMetadata(
const gd::String& extensionNamespace_,
const gd::String& name_,
const gd::String& nameWithNamespace,
const gd::String& fullname_,
const gd::String& defaultName_,
const gd::String& description_,
@@ -29,21 +31,50 @@ BehaviorMetadata::BehaviorMetadata(
std::shared_ptr<gd::Behavior> instance_,
std::shared_ptr<gd::BehaviorsSharedData> sharedDatasInstance_)
: extensionNamespace(extensionNamespace_),
className(className_),
iconFilename(icon24x24),
instance(instance_),
sharedDatasInstance(sharedDatasInstance_) {
#if defined(GD_IDE_ONLY)
sharedDatasInstance(sharedDatasInstance_),
isEventBased(false) {
SetFullName(gd::String(fullname_));
SetDescription(gd::String(description_));
SetDefaultName(gd::String(defaultName_));
SetGroup(group_);
className = className_;
iconFilename = icon24x24;
#endif
if (instance) instance->SetTypeName(name_);
if (sharedDatasInstance) sharedDatasInstance->SetTypeName(name_);
if (!instance) {
gd::LogFatalError(
"Trying to create a BehaviorMetadata that has no "
"behavior. This will crash - please double check that the "
"BehaviorMetadata is valid for: " + nameWithNamespace);
}
if (instance) instance->SetTypeName(nameWithNamespace);
if (sharedDatasInstance) sharedDatasInstance->SetTypeName(nameWithNamespace);
}
BehaviorMetadata::BehaviorMetadata(
const gd::String& extensionNamespace,
const gd::String& nameWithNamespace,
const gd::String& fullname_,
const gd::String& defaultName_,
const gd::String& description_,
const gd::String& group_,
const gd::String& icon24x24_): BehaviorMetadata(
extensionNamespace,
nameWithNamespace,
fullname_,
defaultName_,
description_,
group_,
icon24x24_,
// Class name is the name, actually unused
defaultName_,
// It is only used to get the name for GetName.
gd::make_unique<gd::Behavior>("", nameWithNamespace),
nullptr){
isEventBased = true;
};
gd::InstructionMetadata& BehaviorMetadata::AddCondition(
const gd::String& name,
const gd::String& fullname,
@@ -52,7 +83,6 @@ gd::InstructionMetadata& BehaviorMetadata::AddCondition(
const gd::String& group,
const gd::String& icon,
const gd::String& smallicon) {
#if defined(GD_IDE_ONLY)
gd::String nameWithNamespace =
extensionNamespace.empty() ? name : extensionNamespace + name;
conditionsInfos[nameWithNamespace] = InstructionMetadata(extensionNamespace,
@@ -66,7 +96,6 @@ gd::InstructionMetadata& BehaviorMetadata::AddCondition(
.SetHelpPath(GetHelpPath())
.SetIsBehaviorInstruction();
return conditionsInfos[nameWithNamespace];
#endif
}
gd::InstructionMetadata& BehaviorMetadata::AddAction(
@@ -77,7 +106,6 @@ gd::InstructionMetadata& BehaviorMetadata::AddAction(
const gd::String& group,
const gd::String& icon,
const gd::String& smallicon) {
#if defined(GD_IDE_ONLY)
gd::String nameWithNamespace =
extensionNamespace.empty() ? name : extensionNamespace + name;
actionsInfos[nameWithNamespace] = InstructionMetadata(extensionNamespace,
@@ -91,7 +119,6 @@ gd::InstructionMetadata& BehaviorMetadata::AddAction(
.SetHelpPath(GetHelpPath())
.SetIsBehaviorInstruction();
return actionsInfos[nameWithNamespace];
#endif
}
gd::InstructionMetadata& BehaviorMetadata::AddScopedCondition(
@@ -102,7 +129,6 @@ gd::InstructionMetadata& BehaviorMetadata::AddScopedCondition(
const gd::String& group,
const gd::String& icon,
const gd::String& smallicon) {
#if defined(GD_IDE_ONLY)
gd::String nameWithNamespace =
GetName() + gd::PlatformExtension::GetNamespaceSeparator() + name;
conditionsInfos[nameWithNamespace] = InstructionMetadata(extensionNamespace,
@@ -116,7 +142,6 @@ gd::InstructionMetadata& BehaviorMetadata::AddScopedCondition(
.SetHelpPath(GetHelpPath())
.SetIsBehaviorInstruction();
return conditionsInfos[nameWithNamespace];
#endif
}
gd::InstructionMetadata& BehaviorMetadata::AddScopedAction(
@@ -127,7 +152,6 @@ gd::InstructionMetadata& BehaviorMetadata::AddScopedAction(
const gd::String& group,
const gd::String& icon,
const gd::String& smallicon) {
#if defined(GD_IDE_ONLY)
gd::String nameWithNamespace =
GetName() + gd::PlatformExtension::GetNamespaceSeparator() + name;
actionsInfos[nameWithNamespace] = InstructionMetadata(extensionNamespace,
@@ -141,7 +165,6 @@ gd::InstructionMetadata& BehaviorMetadata::AddScopedAction(
.SetHelpPath(GetHelpPath())
.SetIsBehaviorInstruction();
return actionsInfos[nameWithNamespace];
#endif
}
gd::ExpressionMetadata& BehaviorMetadata::AddExpression(
@@ -150,7 +173,6 @@ gd::ExpressionMetadata& BehaviorMetadata::AddExpression(
const gd::String& description,
const gd::String& group,
const gd::String& smallicon) {
#if defined(GD_IDE_ONLY)
// Be careful, behaviors expression do not have namespace (not necessary as
// we refer to the behavior name in the expression).
expressionsInfos[name] = ExpressionMetadata("number",
@@ -162,7 +184,6 @@ gd::ExpressionMetadata& BehaviorMetadata::AddExpression(
smallicon)
.SetHelpPath(GetHelpPath());
return expressionsInfos[name];
#endif
}
gd::ExpressionMetadata& BehaviorMetadata::AddStrExpression(
@@ -171,7 +192,6 @@ gd::ExpressionMetadata& BehaviorMetadata::AddStrExpression(
const gd::String& description,
const gd::String& group,
const gd::String& smallicon) {
#if defined(GD_IDE_ONLY)
// Be careful, behaviors expression do not have namespace (not necessary as
// we refer to the behavior name in the expression).
strExpressionsInfos[name] = ExpressionMetadata("string",
@@ -183,7 +203,6 @@ gd::ExpressionMetadata& BehaviorMetadata::AddStrExpression(
smallicon)
.SetHelpPath(GetHelpPath());
return strExpressionsInfos[name];
#endif
}
gd::MultipleInstructionMetadata BehaviorMetadata::AddExpressionAndCondition(
@@ -288,7 +307,6 @@ BehaviorMetadata::AddExpressionAndConditionAndAction(
expression, condition, action);
}
#if defined(GD_IDE_ONLY)
gd::InstructionMetadata& BehaviorMetadata::AddDuplicatedAction(
const gd::String& newActionName, const gd::String& copiedActionName) {
gd::String newNameWithNamespace = extensionNamespace + newActionName;
@@ -356,49 +374,44 @@ gd::ExpressionMetadata& BehaviorMetadata::AddDuplicatedStrExpression(
return strExpressionsInfos[newNameWithNamespace];
}
#endif
BehaviorMetadata& BehaviorMetadata::SetFullName(const gd::String& fullname_) {
#if defined(GD_IDE_ONLY)
fullname = fullname_;
#endif
return *this;
}
BehaviorMetadata& BehaviorMetadata::SetDefaultName(
const gd::String& defaultName_) {
#if defined(GD_IDE_ONLY)
defaultName = defaultName_;
#endif
return *this;
}
BehaviorMetadata& BehaviorMetadata::SetDescription(
const gd::String& description_) {
#if defined(GD_IDE_ONLY)
description = description_;
#endif
return *this;
}
BehaviorMetadata& BehaviorMetadata::SetGroup(const gd::String& group_) {
#if defined(GD_IDE_ONLY)
group = group_;
#endif
return *this;
}
BehaviorMetadata& BehaviorMetadata::SetIncludeFile(
const gd::String& includeFile) {
#if defined(GD_IDE_ONLY)
includeFiles.clear();
includeFiles.push_back(includeFile);
#endif
return *this;
}
BehaviorMetadata& BehaviorMetadata::AddIncludeFile(
const gd::String& includeFile) {
#if defined(GD_IDE_ONLY)
if (std::find(includeFiles.begin(), includeFiles.end(), includeFile) ==
includeFiles.end())
includeFiles.push_back(includeFile);
#endif
return *this;
}
BehaviorMetadata& BehaviorMetadata::AddRequiredFile(
const gd::String& requiredFile) {
if (std::find(requiredFiles.begin(), requiredFiles.end(), requiredFile) ==
requiredFiles.end())
requiredFiles.push_back(requiredFile);
return *this;
}
@@ -407,13 +420,25 @@ const gd::String& BehaviorMetadata::GetName() const {
}
gd::Behavior& BehaviorMetadata::Get() const {
if (!instance)
if (isEventBased) {
gd::LogFatalError("Error: Event-based behaviors don't have blueprint. "
"This method should not never be called.");
}
if (!instance) {
gd::LogFatalError(
"Trying to get a behavior from a BehaviorMetadata that has no "
"behavior. This will crash - please double check that the "
"BehaviorMetadata is valid.");
"BehaviorMetadata is valid for: " + className);
}
return *instance;
}
gd::BehaviorsSharedData* BehaviorMetadata::GetSharedDataInstance() const {
if (isEventBased) {
gd::LogFatalError("Error: Event-based behaviors don't have blueprint. "
"This method should not never be called.");
}
return sharedDatasInstance.get();
}
} // namespace gd

View File

@@ -29,7 +29,7 @@ class GD_CORE_API BehaviorMetadata {
public:
BehaviorMetadata(
const gd::String& extensionNamespace,
const gd::String& name_,
const gd::String& nameWithNamespace,
const gd::String& fullname_,
const gd::String& defaultName_,
const gd::String& description_,
@@ -38,6 +38,21 @@ class GD_CORE_API BehaviorMetadata {
const gd::String& className_,
std::shared_ptr<gd::Behavior> instance,
std::shared_ptr<gd::BehaviorsSharedData> sharedDatasInstance);
/**
* \brief Construct a behavior metadata, without "blueprint" behavior.
*
* \note This is used by events based behaviors.
*/
BehaviorMetadata(
const gd::String& extensionNamespace,
const gd::String& nameWithNamespace,
const gd::String& fullname_,
const gd::String& defaultName_,
const gd::String& description_,
const gd::String& group_,
const gd::String& icon24x24_);
BehaviorMetadata(){};
virtual ~BehaviorMetadata(){};
@@ -195,6 +210,13 @@ class GD_CORE_API BehaviorMetadata {
*/
BehaviorMetadata& AddIncludeFile(const gd::String& includeFile);
/**
* \brief Add a file to the already existing required files.
* \note These files are required for the behavior to work,
* but they are not executable.
*/
BehaviorMetadata& AddRequiredFile(const gd::String& requiredFile);
/**
* Get the help path of the behavior, relative to the GDevelop documentation
* root.
@@ -214,7 +236,6 @@ class GD_CORE_API BehaviorMetadata {
}
const gd::String& GetName() const;
#if defined(GD_IDE_ONLY)
const gd::String& GetFullName() const { return fullname; }
const gd::String& GetDefaultName() const { return defaultName; }
const gd::String& GetDescription() const { return description; }
@@ -235,20 +256,38 @@ class GD_CORE_API BehaviorMetadata {
* \note An empty string means the base object, so any object.
*/
const gd::String& GetObjectType() const { return objectType; }
#endif
/**
* Check if the behavior is private - it can't be used outside of its
* extension.
*/
bool IsPrivate() const { return isPrivate; }
/**
* Set that the behavior is private - it can't be used outside of its
* extension.
*/
BehaviorMetadata &SetPrivate() {
isPrivate = true;
return *this;
}
/**
* \brief Return the associated gd::Behavior, handling behavior contents.
*
* \note Returns a dumb Behavior for events based behaviors as CustomBehavior
* are using EventBasedBehavior.
*/
gd::Behavior& Get() const;
/**
* \brief Return the associated gd::BehaviorsSharedData, handling behavior
* shared data, if any (nullptr if none).
*
* \note Returns nullptr for events based behaviors as they don't declare
* shared data yet.
*/
gd::BehaviorsSharedData* GetSharedDataInstance() const {
return sharedDatasInstance.get();
}
gd::BehaviorsSharedData* GetSharedDataInstance() const;
/**
* \brief Return a reference to a map containing the names of the actions
@@ -271,30 +310,30 @@ class GD_CORE_API BehaviorMetadata {
*/
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;
std::map<gd::String, gd::ExpressionMetadata> expressionsInfos;
std::map<gd::String, gd::ExpressionMetadata> strExpressionsInfos;
std::vector<gd::String> includeFiles;
std::vector<gd::String> requiredFiles;
gd::String className;
#endif
private:
gd::String extensionNamespace;
gd::String helpPath;
#if defined(GD_IDE_ONLY)
gd::String fullname;
gd::String defaultName;
gd::String description;
gd::String group;
gd::String iconFilename;
gd::String objectType;
#endif
bool isPrivate = false;
// TODO: Nitpicking: convert these to std::unique_ptr to clarify ownership.
std::shared_ptr<gd::Behavior> instance;
std::shared_ptr<gd::BehaviorsSharedData> sharedDatasInstance;
bool isEventBased;
};
} // namespace gd

View File

@@ -62,7 +62,7 @@ class GD_CORE_API DependencyMetadata {
};
/**
* \brief Sets the type of dependecy (what will be used to install it)
* \brief Sets the type of dependency (what will be used to install it)
*
* This can either be "npm" or "cordova" for now.
*/

View File

@@ -7,9 +7,6 @@
namespace gd {
EffectMetadata::EffectMetadata(const gd::String& type_)
: type(type_), isMarkedAsNotWorkingForObjects(false) {}
EffectMetadata& EffectMetadata::SetIncludeFile(const gd::String& includeFile) {
includeFiles.clear();
includeFiles.push_back(includeFile);
@@ -23,9 +20,4 @@ EffectMetadata& EffectMetadata::AddIncludeFile(const gd::String& includeFile) {
return *this;
}
EffectMetadata& EffectMetadata::MarkAsNotWorkingForObjects() {
isMarkedAsNotWorkingForObjects = true;
return *this;
}
} // namespace gd

View File

@@ -3,8 +3,8 @@
* Copyright 2008-present Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef EFFECTMETADATA_H
#define EFFECTMETADATA_H
#pragma once
#include <functional>
#include <map>
#include <memory>
@@ -25,21 +25,25 @@ class GD_CORE_API EffectMetadata {
/**
* \brief Construct an effect metadata, with the given type
*/
EffectMetadata(const gd::String& type_);
EffectMetadata(const gd::String &type_)
: type(type_), isMarkedAsNotWorkingForObjects(false),
isMarkedAsOnlyWorkingFor2D(false), isMarkedAsOnlyWorkingFor3D(false),
isMarkedAsUnique(false) {}
/**
* \brief Default constructor, only used for initializing `badEffectMetadata`.
*/
EffectMetadata() {}
/**
* \brief Default constructor, only used for initializing
* `badEffectMetadata`.
*/
EffectMetadata() {}
virtual ~EffectMetadata(){};
virtual ~EffectMetadata(){};
/**
* \brief Set the name shown to the user.
*/
EffectMetadata& SetFullName(const gd::String& fullname_) {
fullname = fullname_;
return *this;
/**
* \brief Set the name shown to the user.
*/
EffectMetadata &SetFullName(const gd::String &fullname_) {
fullname = fullname_;
return *this;
};
/**
@@ -69,11 +73,6 @@ class GD_CORE_API EffectMetadata {
*/
EffectMetadata& AddIncludeFile(const gd::String& includeFile);
/**
* \brief Mark the effect as not working as an object effect.
*/
EffectMetadata& MarkAsNotWorkingForObjects();
/**
* \brief Return a reference to the properties of this effect.
*/
@@ -117,10 +116,65 @@ class GD_CORE_API EffectMetadata {
return includeFiles;
}
/**
* \brief Mark the effect as not working as an object effect.
*/
EffectMetadata& MarkAsNotWorkingForObjects() {
isMarkedAsNotWorkingForObjects = true;
return *this;
}
/**
* \brief Mark the effect as only working for the 2D renderer.
*/
EffectMetadata& MarkAsOnlyWorkingFor2D() {
isMarkedAsOnlyWorkingFor2D = true;
return *this;
}
/**
* \brief Mark the effect as only working for the 3D renderer.
*/
EffectMetadata& MarkAsOnlyWorkingFor3D() {
isMarkedAsOnlyWorkingFor3D = true;
return *this;
}
/**
* \brief Mark the effect as only addable once.
*/
EffectMetadata& MarkAsUnique() {
isMarkedAsUnique = true;
return *this;
}
/**
* \brief Check if the effect is marked as not working as an object effect.
*/
bool IsMarkedAsNotWorkingForObjects() const { return isMarkedAsNotWorkingForObjects; };
bool IsMarkedAsNotWorkingForObjects() const {
return isMarkedAsNotWorkingForObjects;
};
/**
* \brief Check if the effect is marked as only working for the 2D renderer.
*/
bool IsMarkedAsOnlyWorkingFor2D() const {
return isMarkedAsOnlyWorkingFor2D;
};
/**
* \brief Check if the effect is marked as only working for the 3D renderer.
*/
bool IsMarkedAsOnlyWorkingFor3D() const {
return isMarkedAsOnlyWorkingFor3D;
};
/**
* \brief Check if the effect can only be added once.
*/
bool IsMarkedAsUnique() const {
return isMarkedAsUnique;
};
private:
gd::String extensionNamespace;
@@ -130,8 +184,10 @@ class GD_CORE_API EffectMetadata {
gd::String description;
std::vector<gd::String> includeFiles;
bool isMarkedAsNotWorkingForObjects;
bool isMarkedAsOnlyWorkingFor2D;
bool isMarkedAsOnlyWorkingFor3D;
bool isMarkedAsUnique;
std::map<gd::String, gd::PropertyDescriptor> properties;
};
} // namespace gd
#endif // EFFECTMETADATA_H

View File

@@ -23,7 +23,8 @@ ExpressionMetadata::ExpressionMetadata(const gd::String& returnType_,
shown(true),
smallIconFilename(smallicon_),
extensionNamespace(extensionNamespace_),
isPrivate(false) {
isPrivate(false),
relevantContext("Any") {
}
ExpressionMetadata& ExpressionMetadata::SetHidden() {
@@ -37,22 +38,24 @@ gd::ExpressionMetadata& ExpressionMetadata::AddParameter(
const gd::String& supplementaryInformation,
bool parameterIsOptional) {
gd::ParameterMetadata info;
info.type = type;
info.SetType(type);
info.description = description;
info.codeOnly = false;
info.optional = parameterIsOptional;
info.supplementaryInformation =
info.SetOptional(parameterIsOptional);
info.SetExtraInfo(
// For objects/behavior, the supplementary information
// parameter is an object/behavior type...
(gd::ParameterMetadata::IsObject(type) ||
((gd::ParameterMetadata::IsObject(type) ||
gd::ParameterMetadata::IsBehavior(type))
// Prefix with the namespace if it's not already there.
&& !(supplementaryInformation.rfind(extensionNamespace, 0) == 0))
? (supplementaryInformation.empty()
? ""
: extensionNamespace +
supplementaryInformation //... so prefix it with the extension
// namespace.
)
: supplementaryInformation; // Otherwise don't change anything
: supplementaryInformation); // Otherwise don't change anything
// TODO: Assert against supplementaryInformation === "emsc" (when running with
// Emscripten), and warn about a missing argument when calling addParameter.
@@ -64,9 +67,9 @@ gd::ExpressionMetadata& ExpressionMetadata::AddParameter(
gd::ExpressionMetadata& ExpressionMetadata::AddCodeOnlyParameter(
const gd::String& type, const gd::String& supplementaryInformation) {
gd::ParameterMetadata info;
info.type = type;
info.SetType(type);
info.codeOnly = true;
info.supplementaryInformation = supplementaryInformation;
info.SetExtraInfo(supplementaryInformation);
parameters.push_back(info);
return *this;

View File

@@ -137,7 +137,7 @@ class GD_CORE_API ExpressionMetadata {
* to fulfill std::map requirements.
*/
ExpressionMetadata()
: returnType("unknown"), shown(false), isPrivate(false){};
: returnType("unknown"), shown(false), isPrivate(false), relevantContext("Any"){};
virtual ~ExpressionMetadata(){};
@@ -184,6 +184,67 @@ class GD_CORE_API ExpressionMetadata {
return *this;
}
/**
* Check if the instruction can be used in layouts or external events.
*/
bool IsRelevantForLayoutEvents() const {
return relevantContext == "Any" || relevantContext == "Layout";
}
/**
* Check if the instruction can be used in function events.
*/
bool IsRelevantForFunctionEvents() const {
return relevantContext == "Any" || relevantContext == "Function";
}
/**
* Check if the instruction can be used in asynchronous function events.
*/
bool IsRelevantForAsynchronousFunctionEvents() const {
return relevantContext == "Any" || relevantContext == "Function" ||
relevantContext == "AsynchronousFunction";
}
/**
* Check if the instruction can be used in custom object events.
*/
bool IsRelevantForCustomObjectEvents() const {
return relevantContext == "Any" || relevantContext == "Object";
}
/**
* Set that the instruction can be used in layouts or external events.
*/
ExpressionMetadata &SetRelevantForLayoutEventsOnly() {
relevantContext = "Layout";
return *this;
}
/**
* Set that the instruction can be used in function events.
*/
ExpressionMetadata &SetRelevantForFunctionEventsOnly() {
relevantContext = "Function";
return *this;
}
/**
* Set that the instruction can be used in asynchronous function events.
*/
ExpressionMetadata &SetRelevantForAsynchronousFunctionEventsOnly() {
relevantContext = "AsynchronousFunction";
return *this;
}
/**
* Set that the instruction can be used in custom object events.
*/
ExpressionMetadata &SetRelevantForCustomObjectEventsOnly() {
relevantContext = "Object";
return *this;
}
/**
* \see gd::InstructionMetadata::AddParameter
*/
@@ -222,6 +283,18 @@ class GD_CORE_API ExpressionMetadata {
return *this;
};
/**
* \brief Set the additional information, used for some parameters
* with special type (for example, it can contains the type of object accepted
* by the parameter), for the last added parameter.
*
* \see AddParameter
*/
ExpressionMetadata &SetParameterExtraInfo(const gd::String &extraInfo) {
if (!parameters.empty()) parameters.back().SetExtraInfo(extraInfo);
return *this;
}
/**
* \brief Mark this (object) expression as requiring the specified capability,
* offered by the base object.
@@ -256,7 +329,30 @@ class GD_CORE_API ExpressionMetadata {
*/
ExpressionCodeGenerationInformation& GetCodeExtraInformation() {
return codeExtraInformation;
};
}
/**
* \brief Erase any existing include file and add the specified include.
*/
ExpressionMetadata &SetIncludeFile(const gd::String &includeFile) {
codeExtraInformation.SetIncludeFile(includeFile);
return *this;
}
/**
* \brief Add a file to the already existing include files.
*/
ExpressionMetadata &AddIncludeFile(const gd::String &includeFile) {
codeExtraInformation.AddIncludeFile(includeFile);
return *this;
}
/**
* \brief Get the files that must be included to use the instruction.
*/
const std::vector<gd::String>& GetIncludeFiles() const {
return codeExtraInformation.GetIncludeFiles();
}
ExpressionCodeGenerationInformation codeExtraInformation;
@@ -291,6 +387,7 @@ class GD_CORE_API ExpressionMetadata {
gd::String extensionNamespace;
bool isPrivate;
gd::String requiredBaseObjectCapability;
gd::String relevantContext;
};
} // namespace gd

View File

@@ -47,7 +47,8 @@ InstructionMetadata::InstructionMetadata(const gd::String& extensionNamespace_,
usageComplexity(5),
isPrivate(false),
isObjectInstruction(false),
isBehaviorInstruction(false) {}
isBehaviorInstruction(false),
relevantContext("Any") {}
InstructionMetadata& InstructionMetadata::AddParameter(
const gd::String& type,
@@ -55,15 +56,17 @@ InstructionMetadata& InstructionMetadata::AddParameter(
const gd::String& supplementaryInformation,
bool parameterIsOptional) {
ParameterMetadata info;
info.type = type;
info.SetType(type);
info.description = description;
info.codeOnly = false;
info.optional = parameterIsOptional;
info.supplementaryInformation =
info.SetOptional(parameterIsOptional);
info.SetExtraInfo(
// For objects/behavior, the supplementary information
// parameter is an object/behavior type...
(gd::ParameterMetadata::IsObject(type) ||
((gd::ParameterMetadata::IsObject(type) ||
gd::ParameterMetadata::IsBehavior(type))
// Prefix with the namespace if it's not already there.
&& !(supplementaryInformation.rfind(extensionNamespace, 0) == 0))
? (supplementaryInformation.empty()
? ""
: extensionNamespace +
@@ -71,7 +74,7 @@ InstructionMetadata& InstructionMetadata::AddParameter(
// extension
// namespace.
)
: supplementaryInformation; // Otherwise don't change anything
: supplementaryInformation); // Otherwise don't change anything
// TODO: Assert against supplementaryInformation === "emsc" (when running with
// Emscripten), and warn about a missing argument when calling addParameter.
@@ -83,20 +86,24 @@ InstructionMetadata& InstructionMetadata::AddParameter(
InstructionMetadata& InstructionMetadata::AddCodeOnlyParameter(
const gd::String& type, const gd::String& supplementaryInformation) {
ParameterMetadata info;
info.type = type;
info.SetType(type);
info.codeOnly = true;
info.supplementaryInformation = supplementaryInformation;
info.SetExtraInfo(supplementaryInformation);
parameters.push_back(info);
return *this;
}
InstructionMetadata& InstructionMetadata::UseStandardOperatorParameters(
const gd::String& type) {
SetManipulatedType(type);
const gd::String& type, const ParameterOptions &options) {
const gd::String& expressionValueType =
gd::ValueTypeMetadata::GetPrimitiveValueType(type);
SetManipulatedType(expressionValueType);
if (type == "boolean") {
AddParameter("yesorno", _("New value"));
AddParameter(
"yesorno",
options.description.empty() ? _("New value") : options.description);
size_t valueParamIndex = parameters.size() - 1;
if (isObjectInstruction || isBehaviorInstruction) {
@@ -117,8 +124,10 @@ InstructionMetadata& InstructionMetadata::UseStandardOperatorParameters(
"_PARAM" + gd::String::From(valueParamIndex) + "_");
}
} else {
AddParameter("operator", _("Modification's sign"), type);
AddParameter(type == "number" ? "expression" : type, _("Value"));
AddParameter("operator", _("Modification's sign"), expressionValueType);
AddParameter(type,
options.description.empty() ? _("Value") : options.description,
options.typeExtraInfo);
size_t operatorParamIndex = parameters.size() - 2;
size_t valueParamIndex = parameters.size() - 1;
@@ -151,8 +160,10 @@ InstructionMetadata& InstructionMetadata::UseStandardOperatorParameters(
InstructionMetadata&
InstructionMetadata::UseStandardRelationalOperatorParameters(
const gd::String& type) {
SetManipulatedType(type);
const gd::String& type, const ParameterOptions &options) {
const gd::String& expressionValueType =
gd::ValueTypeMetadata::GetPrimitiveValueType(type);
SetManipulatedType(expressionValueType);
if (type == "boolean") {
if (isObjectInstruction || isBehaviorInstruction) {
@@ -168,8 +179,10 @@ InstructionMetadata::UseStandardRelationalOperatorParameters(
templateSentence.FindAndReplace("<subject>", sentence);
}
} else {
AddParameter("relationalOperator", _("Sign of the test"), type);
AddParameter(type == "number" ? "expression" : type, _("Value to compare"));
AddParameter("relationalOperator", _("Sign of the test"), expressionValueType);
AddParameter(type,
options.description.empty() ? _("Value to compare") : options.description,
options.typeExtraInfo);
size_t operatorParamIndex = parameters.size() - 2;
size_t valueParamIndex = parameters.size() - 1;

View File

@@ -14,6 +14,8 @@
#include "GDCore/Events/Instruction.h"
#include "GDCore/String.h"
#include "ParameterMetadata.h"
#include "ParameterOptions.h"
namespace gd {
class Project;
class Layout;
@@ -99,6 +101,67 @@ class GD_CORE_API InstructionMetadata {
return *this;
}
/**
* Check if the instruction can be used in layouts or external events.
*/
bool IsRelevantForLayoutEvents() const {
return relevantContext == "Any" || relevantContext == "Layout";
}
/**
* Check if the instruction can be used in function events.
*/
bool IsRelevantForFunctionEvents() const {
return relevantContext == "Any" || relevantContext == "Function";
}
/**
* Check if the instruction can be used in asynchronous function events.
*/
bool IsRelevantForAsynchronousFunctionEvents() const {
return relevantContext == "Any" || relevantContext == "Function" ||
relevantContext == "AsynchronousFunction";
}
/**
* Check if the instruction can be used in custom object events.
*/
bool IsRelevantForCustomObjectEvents() const {
return relevantContext == "Any" || relevantContext == "Object";
}
/**
* Set that the instruction can be used in layouts or external events.
*/
InstructionMetadata &SetRelevantForLayoutEventsOnly() {
relevantContext = "Layout";
return *this;
}
/**
* Set that the instruction can be used in function events.
*/
InstructionMetadata &SetRelevantForFunctionEventsOnly() {
relevantContext = "Function";
return *this;
}
/**
* Set that the instruction can be used in asynchronous function events.
*/
InstructionMetadata &SetRelevantForAsynchronousFunctionEventsOnly() {
relevantContext = "AsynchronousFunction";
return *this;
}
/**
* Set that the instruction can be used in custom object events.
*/
InstructionMetadata &SetRelevantForCustomObjectEventsOnly() {
relevantContext = "Object";
return *this;
}
/**
* Check if the instruction is asynchronous - it will be running in the
* background, executing the instructions following it before the frame after
@@ -109,8 +172,8 @@ class GD_CORE_API InstructionMetadata {
}
/**
* Check if the instruction asynchronicity is optional. If it is, it can either
* be used synchronously or asynchronously, with one function for each.
* Check if the instruction asynchronicity is optional. If it is, it can
* either be used synchronously or asynchronously, with one function for each.
*/
bool IsOptionallyAsync() const {
return IsAsync() && !codeExtraInformation.functionCallName.empty();
@@ -206,7 +269,7 @@ class GD_CORE_API InstructionMetadata {
if (!parameters.empty())
parameters.back().SetLongDescription(longDescription);
return *this;
};
}
/**
* \brief Set the additional information, used for some parameters
@@ -218,20 +281,27 @@ class GD_CORE_API InstructionMetadata {
InstructionMetadata &SetParameterExtraInfo(const gd::String &extraInfo) {
if (!parameters.empty()) parameters.back().SetExtraInfo(extraInfo);
return *this;
};
}
/**
* \brief Add the default parameters for an instruction manipulating the
* specified type ("string", "number") with the default operators.
*
* \note The type "string" can be declined in several subtypes.
* \see ParameterMetadata
*/
InstructionMetadata &UseStandardOperatorParameters(const gd::String &type);
InstructionMetadata &UseStandardOperatorParameters(
const gd::String &type, const ParameterOptions &options);
/**
* \brief Add the default parameters for an instruction comparing the
* specified type ("string", "number") with the default relational operators.
*
* \note The type "string" can be declined in several subtypes.
* \see ParameterMetadata
*/
InstructionMetadata &UseStandardRelationalOperatorParameters(
const gd::String &type);
const gd::String &type, const ParameterOptions &options);
/**
* \brief Mark the instruction as an object instruction. Automatically called
@@ -276,7 +346,7 @@ class GD_CORE_API InstructionMetadata {
*/
const gd::String &GetRequiredBaseObjectCapability() const {
return requiredBaseObjectCapability;
};
}
/**
* \brief Consider that the instruction is easy for a user to understand.
@@ -328,11 +398,12 @@ class GD_CORE_API InstructionMetadata {
}
/**
* Set the name of the function, doing asynchronous work, which will be called in
* the generated code. This function should return an asynchronous task
* (i.e: `gdjs.AsyncTask` in the JavaScript runtime).
* Set the name of the function, doing asynchronous work, which will be
* called in the generated code. This function should return an asynchronous
* task (i.e: `gdjs.AsyncTask` in the JavaScript runtime).
*
* \param functionName the name of the function doing asynchronous work to call.
* \param functionName the name of the function doing asynchronous work to
* call.
*/
ExtraInformation &SetAsyncFunctionName(const gd::String &functionName_) {
asyncFunctionCallName = functionName_;
@@ -361,7 +432,7 @@ class GD_CORE_API InstructionMetadata {
* _("the string"),
* _("Text"),
* "CppPlatform/Extensions/text24.png",
* "CppPlatform/Extensions/text.png");
* "CppPlatform/Extensions/text_black.png");
*
* .AddParameter("object", _("Object"), "Text", false)
* .AddParameter("operator", _("Modification operator"), "string")
@@ -476,17 +547,40 @@ class GD_CORE_API InstructionMetadata {
}
/**
* Set the name of the function, doing asynchronous work, which will be called in
* the generated code. This function should return an asynchronous task
* Set the name of the function, doing asynchronous work, which will be called
* in the generated code. This function should return an asynchronous task
* (i.e: `gdjs.AsyncTask` in the JavaScript runtime).
*
* \param functionName the name of the function doing asynchronous work to call.
* \note Shortcut for `codeExtraInformation.SetAsyncFunctionName`.
* \param functionName the name of the function doing asynchronous work to
* call. \note Shortcut for `codeExtraInformation.SetAsyncFunctionName`.
*/
ExtraInformation &SetAsyncFunctionName(const gd::String &functionName) {
return codeExtraInformation.SetAsyncFunctionName(functionName);
}
/**
* \brief Erase any existing include file and add the specified include.
*/
InstructionMetadata &SetIncludeFile(const gd::String &includeFile) {
codeExtraInformation.SetIncludeFile(includeFile);
return *this;
}
/**
* \brief Add a file to the already existing include files.
*/
InstructionMetadata &AddIncludeFile(const gd::String &includeFile) {
codeExtraInformation.AddIncludeFile(includeFile);
return *this;
}
/**
* \brief Get the files that must be included to use the instruction.
*/
const std::vector<gd::String> &GetIncludeFiles() const {
return codeExtraInformation.GetIncludeFiles();
};
std::vector<ParameterMetadata> parameters;
private:
@@ -506,6 +600,7 @@ class GD_CORE_API InstructionMetadata {
bool isObjectInstruction;
bool isBehaviorInstruction;
gd::String requiredBaseObjectCapability;
gd::String relevantContext;
};
} // namespace gd

View File

@@ -8,6 +8,8 @@
#include "GDCore/Extensions/Metadata/ExpressionMetadata.h"
#include "GDCore/Extensions/Metadata/InstructionMetadata.h"
#include "GDCore/String.h"
#include "ParameterOptions.h"
namespace gd {} // namespace gd
namespace gd {
@@ -32,8 +34,7 @@ class GD_CORE_API MultipleInstructionMetadata {
return MultipleInstructionMetadata(expression, condition, action);
}
static MultipleInstructionMetadata WithConditionAndAction(
gd::InstructionMetadata &condition,
gd::InstructionMetadata &action) {
gd::InstructionMetadata &condition, gd::InstructionMetadata &action) {
return MultipleInstructionMetadata(condition, action);
}
@@ -80,6 +81,17 @@ class GD_CORE_API MultipleInstructionMetadata {
return *this;
};
/**
* \see gd::InstructionMetadata::SetParameterExtraInfo
*/
MultipleInstructionMetadata &SetParameterExtraInfo(
const gd::String &defaultValue) {
if (expression) expression->SetParameterExtraInfo(defaultValue);
if (condition) condition->SetParameterExtraInfo(defaultValue);
if (action) action->SetParameterExtraInfo(defaultValue);
return *this;
};
/**
* \see gd::InstructionMetadata::SetParameterLongDescription
*/
@@ -116,9 +128,11 @@ class GD_CORE_API MultipleInstructionMetadata {
* \see gd::InstructionMetadata::UseStandardOperatorParameters
* \see gd::InstructionMetadata::UseStandardRelationalOperatorParameters
*/
MultipleInstructionMetadata &UseStandardParameters(const gd::String &type) {
if (condition) condition->UseStandardRelationalOperatorParameters(type);
if (action) action->UseStandardOperatorParameters(type);
MultipleInstructionMetadata &UseStandardParameters(
const gd::String &type, const ParameterOptions &options) {
if (condition)
condition->UseStandardRelationalOperatorParameters(type, options);
if (action) action->UseStandardOperatorParameters(type, options);
return *this;
}
@@ -154,6 +168,29 @@ class GD_CORE_API MultipleInstructionMetadata {
return *this;
}
/**
* \brief Get the files that must be included to use the instruction.
*/
const std::vector<gd::String> &GetIncludeFiles() const {
if (expression)
return expression->GetCodeExtraInformation().GetIncludeFiles();
if (condition)
return condition->GetCodeExtraInformation().GetIncludeFiles();
if (action) return action->GetCodeExtraInformation().GetIncludeFiles();
// It can't actually happen.
throw std::logic_error("no instruction metadata");
}
/**
* \see gd::InstructionMetadata::SetPrivate
*/
MultipleInstructionMetadata &SetPrivate() {
if (expression) expression->SetPrivate();
if (condition) condition->SetPrivate();
if (action) action->SetPrivate();
return *this;
}
/**
* \see gd::InstructionMetadata::MarkAsSimple
*/

View File

@@ -14,6 +14,7 @@
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Tools/Localization.h"
#include "GDCore/Tools/Log.h"
namespace gd {
@@ -22,45 +23,53 @@ ObjectMetadata::ObjectMetadata(const gd::String& extensionNamespace_,
const gd::String& fullname_,
const gd::String& description_,
const gd::String& icon24x24,
std::shared_ptr<gd::Object> blueprintObject_)
: extensionNamespace(extensionNamespace_),
blueprintObject(blueprintObject_) {
name = name_;
#if defined(GD_IDE_ONLY)
SetFullName(gd::String(fullname_));
SetDescription(gd::String(description_));
iconFilename = icon24x24;
#endif
createFunPtr =
[blueprintObject_](gd::String name) -> std::unique_ptr<gd::Object> {
if (blueprintObject_ == std::shared_ptr<gd::Object>()) {
std::cout
<< "Error: Unable to create object. Have you declared an extension "
"(or ObjectMetadata) without specifying an object as blueprint?"
<< std::endl;
std::shared_ptr<gd::ObjectConfiguration> blueprintObject_)
: ObjectMetadata(extensionNamespace_,
name_,
fullname_,
description_,
icon24x24,
[blueprintObject_]() -> std::unique_ptr<gd::ObjectConfiguration> {
if (blueprintObject_ == std::shared_ptr<gd::ObjectConfiguration>()) {
gd::LogFatalError(
"Error: Unable to create object. Have you declared an extension "
"(or ObjectMetadata) without specifying an object as blueprint?");
return nullptr;
}
std::unique_ptr<gd::Object> newObject = blueprintObject_->Clone();
newObject->SetName(name);
return newObject;
};
return blueprintObject_->Clone();
}) {
blueprintObject = blueprintObject_;
}
ObjectMetadata::ObjectMetadata(const gd::String& extensionNamespace_,
const gd::String& name_,
const gd::String& fullname_,
const gd::String& description_,
const gd::String& icon24x24)
: ObjectMetadata(extensionNamespace_,
name_,
fullname_,
description_,
icon24x24,
[]() -> std::unique_ptr<gd::ObjectConfiguration> {
gd::LogFatalError(
"Error: Event-based objects don't have blueprint. "
"This method should not never be called.");
return nullptr;
}) {}
ObjectMetadata::ObjectMetadata(const gd::String& extensionNamespace_,
const gd::String& name_,
const gd::String& fullname_,
const gd::String& description_,
const gd::String& icon24x24,
CreateFunPtr createFunPtrP)
: extensionNamespace(extensionNamespace_) {
name = name_;
#if defined(GD_IDE_ONLY)
: name(name_),
iconFilename(icon24x24),
createFunPtr(createFunPtrP),
extensionNamespace(extensionNamespace_) {
SetFullName(gd::String(fullname_));
SetDescription(gd::String(description_));
iconFilename = icon24x24;
#endif
createFunPtr = createFunPtrP;
}
gd::InstructionMetadata& ObjectMetadata::AddCondition(

View File

@@ -13,6 +13,7 @@
#include "GDCore/Extensions/Metadata/ExpressionMetadata.h"
#include "GDCore/Extensions/Metadata/InstructionMetadata.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Project/ObjectConfiguration.h"
#include "GDCore/String.h"
namespace gd {
class InstructionMetadata;
@@ -20,7 +21,7 @@ class MultipleInstructionMetadata;
class ExpressionMetadata;
} // namespace gd
typedef std::function<std::unique_ptr<gd::Object>(gd::String name)>
typedef std::function<std::unique_ptr<gd::ObjectConfiguration>()>
CreateFunPtr;
namespace gd {
@@ -42,11 +43,21 @@ class GD_CORE_API ObjectMetadata {
const gd::String& fullname_,
const gd::String& description_,
const gd::String& icon24x24_,
std::shared_ptr<gd::Object> blueprintObject_);
std::shared_ptr<gd::ObjectConfiguration> blueprintObject_);
/**
* \brief Construct an object metadata, without "blueprint" object
*
* \note This is used by events based objects.
*/
ObjectMetadata(const gd::String& extensionNamespace_,
const gd::String& name_,
const gd::String& fullname_,
const gd::String& description_,
const gd::String& icon24x24_);
/**
* \brief Construct an object metadata, with a function that will be called
* to instanciate a new object.
* to instantiate a new object.
*/
ObjectMetadata(const gd::String& extensionNamespace_,
const gd::String& name_,
@@ -213,7 +224,7 @@ class GD_CORE_API ObjectMetadata {
/**
* \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.
* interface.
*/
const std::set<gd::String>& GetUnsupportedBaseObjectCapabilities() const {
return unsupportedBaseObjectCapabilities;
@@ -221,7 +232,7 @@ class GD_CORE_API ObjectMetadata {
/**
* \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.
* supported by this object, and should be hidden in the editor interface.
*/
ObjectMetadata& AddUnsupportedBaseObjectCapability(
const gd::String& capability) {
@@ -231,7 +242,7 @@ class GD_CORE_API ObjectMetadata {
/**
* \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.
* supported by this object, and should be hidden in the editor interface.
*/
bool IsUnsupportedBaseObjectCapability(const gd::String& capability) const {
return unsupportedBaseObjectCapabilities.find(capability) != unsupportedBaseObjectCapabilities.end();
@@ -284,6 +295,22 @@ class GD_CORE_API ObjectMetadata {
*/
std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressions() { return strExpressionsInfos; };
/**
* \brief Set the object to be hidden in the IDE.
*
* Used mainly when an object is deprecated.
*/
ObjectMetadata &SetHidden() {
hidden = true;
return *this;
}
/**
* \brief Return true if the instruction must be hidden in the IDE.
*/
bool IsHidden() const { return hidden; }
std::map<gd::String, gd::InstructionMetadata> conditionsInfos;
std::map<gd::String, gd::InstructionMetadata> actionsInfos;
std::map<gd::String, gd::ExpressionMetadata> expressionsInfos;
@@ -303,11 +330,14 @@ class GD_CORE_API ObjectMetadata {
gd::String iconFilename;
gd::String categoryFullName;
std::set<gd::String> unsupportedBaseObjectCapabilities;
bool hidden = false;
std::shared_ptr<gd::Object>
std::shared_ptr<gd::ObjectConfiguration>
blueprintObject; ///< The "blueprint" object to be copied when a new
///< object is asked. Can be null in case a creation
///< function is passed.
///< function is passed or for events based objects
///< (CustomObject are using EventBasedObject, they
///< don't need blueprints).
};
} // namespace gd

View File

@@ -10,43 +10,26 @@
namespace gd {
ParameterMetadata::ParameterMetadata() : optional(false), codeOnly(false) {}
ParameterMetadata::ParameterMetadata() : codeOnly(false) {}
void ParameterMetadata::SerializeTo(SerializerElement& element) const {
element.SetAttribute("type", type);
element.SetAttribute("supplementaryInformation", supplementaryInformation);
element.SetAttribute("optional", optional);
valueTypeMetadata.SerializeTo(element);
element.SetAttribute("description", description);
element.SetAttribute("longDescription", longDescription);
element.SetAttribute("codeOnly", codeOnly);
element.SetAttribute("defaultValue", defaultValue);
if (!longDescription.empty()) {
element.SetAttribute("longDescription", longDescription);
}
if (codeOnly) {
element.SetAttribute("codeOnly", codeOnly);
}
element.SetAttribute("name", name);
}
void ParameterMetadata::UnserializeFrom(const SerializerElement& element) {
type = element.GetStringAttribute("type");
supplementaryInformation =
element.GetStringAttribute("supplementaryInformation");
optional = element.GetBoolAttribute("optional");
valueTypeMetadata.UnserializeFrom(element);
description = element.GetStringAttribute("description");
longDescription = element.GetStringAttribute("longDescription");
codeOnly = element.GetBoolAttribute("codeOnly");
defaultValue = element.GetStringAttribute("defaultValue");
name = element.GetStringAttribute("name");
}
// TODO factorize in a file with an enum and helpers?
const gd::String ParameterMetadata::numberType = "number";
const gd::String ParameterMetadata::stringType = "string";
const gd::String &ParameterMetadata::GetExpressionValueType(const gd::String &parameterType) {
if (parameterType == "number" || gd::ParameterMetadata::IsExpression("number", parameterType)) {
return ParameterMetadata::numberType;
}
if (parameterType == "string" || gd::ParameterMetadata::IsExpression("string", parameterType)) {
return ParameterMetadata::stringType;
}
return parameterType;
}
} // namespace gd

View File

@@ -6,16 +6,13 @@
#ifndef PARAMETER_METADATA_H
#define PARAMETER_METADATA_H
#if defined(GD_IDE_ONLY)
#include <map>
#include <memory>
#include "GDCore/String.h"
#include "GDCore/Extensions/Metadata/ValueTypeMetadata.h"
namespace gd {
class Project;
class Layout;
class EventsCodeGenerator;
class EventsCodeGenerationContext;
class SerializerElement;
} // namespace gd
@@ -32,17 +29,32 @@ class GD_CORE_API ParameterMetadata {
ParameterMetadata();
virtual ~ParameterMetadata(){};
/**
* \brief Return the metadata of the parameter type.
*/
gd::ValueTypeMetadata &GetValueTypeMetadata() { return valueTypeMetadata; }
/**
* \brief Set the metadata of the parameter type.
*/
ParameterMetadata &SetValueTypeMetadata(const gd::ValueTypeMetadata &valueTypeMetadata_) {
valueTypeMetadata = valueTypeMetadata_;
return *this;
}
/**
* \brief Return the type of the parameter.
* \see gd::ParameterMetadata::IsObject
* \deprecated Use gd::ValueTypeMetadata instead.
*/
const gd::String &GetType() const { return type; }
const gd::String &GetType() const { return valueTypeMetadata.GetName(); }
/**
* \brief Set the type of the parameter.
* \deprecated Use gd::ValueTypeMetadata instead.
*/
ParameterMetadata &SetType(const gd::String &type_) {
type = type_;
valueTypeMetadata.SetName(type_);
return *this;
}
@@ -71,29 +83,33 @@ class GD_CORE_API ParameterMetadata {
* \brief Return an optional additional information, used for some parameters
* with special type (for example, it can contains the type of object accepted
* by the parameter).
* \deprecated Use gd::ValueTypeMetadata instead.
*/
const gd::String &GetExtraInfo() const { return supplementaryInformation; }
const gd::String &GetExtraInfo() const { return valueTypeMetadata.GetExtraInfo(); }
/**
* \brief Set an optional additional information, used for some parameters
* with special type (for example, it can contains the type of object accepted
* by the parameter).
* \deprecated Use gd::ValueTypeMetadata instead.
*/
ParameterMetadata &SetExtraInfo(const gd::String &supplementaryInformation_) {
supplementaryInformation = supplementaryInformation_;
valueTypeMetadata.SetExtraInfo(supplementaryInformation_);
return *this;
}
/**
* \brief Return true if the parameter is optional.
* \deprecated Use gd::ValueTypeMetadata instead.
*/
bool IsOptional() const { return optional; }
bool IsOptional() const { return valueTypeMetadata.IsOptional(); }
/**
* \brief Set if the parameter is optional.
* \deprecated Use gd::ValueTypeMetadata instead.
*/
ParameterMetadata &SetOptional(bool optional_ = true) {
optional = optional_;
valueTypeMetadata.SetOptional(optional_);
return *this;
}
@@ -128,13 +144,15 @@ class GD_CORE_API ParameterMetadata {
/**
* \brief Get the default value for the parameter.
*/
const gd::String &GetDefaultValue() const { return defaultValue; }
const gd::String &GetDefaultValue() const {
return valueTypeMetadata.GetDefaultValue();
}
/**
* \brief Set the default value, if the parameter is optional.
*/
ParameterMetadata &SetDefaultValue(const gd::String &defaultValue_) {
defaultValue = defaultValue_;
valueTypeMetadata.SetDefaultValue(defaultValue_);
return *this;
}
@@ -151,26 +169,27 @@ class GD_CORE_API ParameterMetadata {
return *this;
}
// TODO Remove these deprecated functions.
/**
* \brief Return true if the type of the parameter is representing one object
* (or more, i.e: an object group).
*
* \see gd::ParameterMetadata::GetType
* \deprecated Use gd::ValueTypeMetadata instead.
*/
static bool IsObject(const gd::String &parameterType) {
return parameterType == "object" || parameterType == "objectPtr" ||
parameterType == "objectList" ||
parameterType == "objectListOrEmptyIfJustDeclared" ||
parameterType == "objectListOrEmptyWithoutPicking";
return gd::ValueTypeMetadata::IsTypeObject(parameterType);
}
/**
* \brief Return true if the type of the parameter is "behavior".
*
* \see gd::ParameterMetadata::GetType
* \deprecated Use gd::ValueTypeMetadata instead.
*/
static bool IsBehavior(const gd::String &parameterType) {
return parameterType == "behavior";
return gd::ValueTypeMetadata::IsTypeBehavior(parameterType);
}
/**
@@ -179,42 +198,22 @@ class GD_CORE_API ParameterMetadata {
* \note If you had a new type of parameter, also add it in the IDE (
* see EventsFunctionParametersEditor, ParameterRenderingService
* and ExpressionAutocompletion) and in the EventsCodeGenerator.
* \deprecated Use gd::ValueTypeMetadata instead.
*/
static bool IsExpression(const gd::String &type,
const gd::String &parameterType) {
if (type == "number") {
return parameterType == "expression" || parameterType == "camera" ||
parameterType == "forceMultiplier";
} else if (type == "string") {
return parameterType == "string" || parameterType == "layer" ||
parameterType == "color" || parameterType == "file" ||
parameterType == "joyaxis" ||
parameterType == "stringWithSelector" ||
parameterType == "sceneName" ||
parameterType == "layerEffectName" ||
parameterType == "layerEffectParameterName" ||
parameterType == "objectEffectName" ||
parameterType == "objectEffectParameterName" ||
parameterType == "objectPointName" ||
parameterType == "objectAnimationName" ||
parameterType == "functionParameterName" ||
parameterType == "externalLayoutName" ||
parameterType == "leaderboardId";
} else if (type == "variable") {
return parameterType == "objectvar" || parameterType == "globalvar" ||
parameterType == "scenevar";
}
return false;
return gd::ValueTypeMetadata::IsTypeExpression(type, parameterType);
}
/**
* \brief Return the expression type from the parameter type.
* Declinations of "number" and "string" types (like "forceMultiplier" or
* "sceneName") are replaced by "number" and "string".
* \deprecated Use gd::ValueTypeMetadata or gd::GetExpressionPrimitiveValueType instead.
*/
static const gd::String &GetExpressionValueType(const gd::String &parameterType);
static const gd::String numberType;
static const gd::String stringType;
static const gd::String &GetExpressionValueType(const gd::String &parameterType) {
return gd::ValueTypeMetadata::GetExpressionPrimitiveValueType(parameterType);
}
/** \name Serialization
*/
@@ -232,22 +231,17 @@ class GD_CORE_API ParameterMetadata {
// TODO: Deprecated public fields. Any direct usage should be moved to
// getter/setter.
gd::String type; ///< Parameter type
gd::String supplementaryInformation; ///< Used if needed
bool optional; ///< True if the parameter is optional
gd::String description; ///< Description shown in editor
bool codeOnly; ///< True if parameter is relative to code generation only,
///< i.e. must not be shown in editor
private:
gd::ValueTypeMetadata valueTypeMetadata; ///< Parameter type
gd::String longDescription; ///< Long description shown in the editor.
gd::String defaultValue; ///< Used as a default value in editor or if an
///< optional parameter is empty.
gd::String name; ///< The name of the parameter to be used in code
///< generation. Optional.
};
} // namespace gd
#endif
#endif // PARAMETER_METADATA_H

View File

@@ -11,6 +11,8 @@
#include "GDCore/Project/Project.h"
#include "GDCore/String.h"
#include "InstructionMetadata.h"
#include "GDCore/Events/Parsers/ExpressionParser2.h"
#include "GDCore/Events/Parsers/ExpressionParser2NodePrinter.h"
namespace gd {
void ParameterMetadataTools::ParametersToObjectsContainer(
@@ -85,7 +87,7 @@ void ParameterMetadataTools::IterateOverParametersWithIndex(
const gd::Expression& parameterValue =
pNb < parameters.size() ? parameters[pNb].GetPlainString() : "";
const gd::Expression& parameterValueOrDefault =
parameterValue.GetPlainString().empty() && parameterMetadata.optional
parameterValue.GetPlainString().empty() && parameterMetadata.IsOptional()
? Expression(parameterMetadata.GetDefaultValue())
: parameterValue;
@@ -101,6 +103,56 @@ void ParameterMetadataTools::IterateOverParametersWithIndex(
}
}
void ParameterMetadataTools::IterateOverParametersWithIndex(
const gd::Platform &platform,
const gd::ObjectsContainer &globalObjectsContainer,
const gd::ObjectsContainer &objectsContainer, FunctionCallNode &node,
std::function<void(const gd::ParameterMetadata &parameterMetadata,
std::unique_ptr<gd::ExpressionNode> &parameterNode,
size_t parameterIndex, const gd::String &lastObjectName)>
fn) {
gd::String lastObjectName = node.objectName;
const bool isObjectFunction = !node.objectName.empty();
const gd::ExpressionMetadata &metadata =
isObjectFunction ? MetadataProvider::GetObjectAnyExpressionMetadata(
platform,
GetTypeOfObject(globalObjectsContainer,
objectsContainer, node.objectName),
node.functionName)
: MetadataProvider::GetAnyExpressionMetadata(
platform, node.functionName);
if (gd::MetadataProvider::IsBadExpressionMetadata(metadata)) {
return;
}
size_t parameterIndex = 0;
for (size_t metadataIndex = (isObjectFunction ? 1 : 0);
metadataIndex < metadata.parameters.size() &&
parameterIndex < node.parameters.size();
++metadataIndex) {
auto &parameterMetadata = metadata.parameters[metadataIndex];
if (parameterMetadata.IsCodeOnly()) {
continue;
}
auto &parameterNode = node.parameters[parameterIndex];
++parameterIndex;
fn(parameterMetadata, parameterNode, parameterIndex, lastObjectName);
// Memorize the last object name. By convention, parameters that require
// an object (mainly, "objectvar" and "behavior") should be placed after
// the object in the list of parameters (if possible, just after).
// Search "lastObjectName" in the codebase for other place where this
// convention is enforced.
if (gd::ParameterMetadata::IsObject(parameterMetadata.GetType()))
// Object can't be expressions so it should always be the object name.
lastObjectName =
gd::ExpressionParser2NodePrinter::PrintNode(*parameterNode);
}
}
size_t ParameterMetadataTools::GetObjectParameterIndexFor(
const std::vector<gd::ParameterMetadata>& parametersMetadata,
size_t parameterIndex) {

View File

@@ -7,12 +7,16 @@
#ifndef ParameterMetadataTools_H
#define ParameterMetadataTools_H
#include <vector>
#include <memory>
#include "GDCore/String.h"
namespace gd {
class Platform;
class Project;
class ObjectsContainer;
class ParameterMetadata;
class Expression;
struct FunctionCallNode;
struct ExpressionNode;
} // namespace gd
namespace gd {
@@ -48,6 +52,21 @@ class GD_CORE_API ParameterMetadataTools {
size_t parameterIndex,
const gd::String& lastObjectName)> fn);
/**
* Iterate over the parameters of a FunctionCallNode.
* Callback function is called with the parameter metadata, its value
* and if applicable the name of the object it's linked to.
*/
static void IterateOverParametersWithIndex(
const gd::Platform &platform,
const gd::ObjectsContainer &globalObjectsContainer,
const gd::ObjectsContainer &objectsContainer, FunctionCallNode &node,
std::function<void(const gd::ParameterMetadata &parameterMetadata,
std::unique_ptr<gd::ExpressionNode> &parameterNode,
size_t parameterIndex,
const gd::String &lastObjectName)>
fn);
/**
* Given a parameter, return, if applicable, the index of the object parameter
* it's linked to.

View File

@@ -0,0 +1,35 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef PARAMETEROPTIONS_H
#define PARAMETEROPTIONS_H
#include "GDCore/String.h"
#include "ParameterMetadata.h"
namespace gd {} // namespace gd
namespace gd {
struct GD_CORE_API ParameterOptions {
gd::String description;
gd::String typeExtraInfo;
ParameterOptions &SetDescription(const gd::String &description_) {
description = description_;
return *this;
}
ParameterOptions &SetTypeExtraInfo(const gd::String &typeExtraInfo_) {
typeExtraInfo = typeExtraInfo_;
return *this;
}
static ParameterOptions MakeNewOptions() {
ParameterOptions emptyOptions;
return emptyOptions;
}
};
}
#endif // PARAMETEROPTIONS_H

View File

@@ -0,0 +1,93 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#include "ValueTypeMetadata.h"
#include "GDCore/CommonTools.h"
#include "GDCore/Serialization/SerializerElement.h"
namespace gd {
ValueTypeMetadata::ValueTypeMetadata() : optional(false) {}
void ValueTypeMetadata::SerializeTo(SerializerElement& element) const {
element.SetAttribute("type", name);
if (!supplementaryInformation.empty()) {
element.SetAttribute("supplementaryInformation", supplementaryInformation);
}
if (optional) {
element.SetAttribute("optional", optional);
}
if (!defaultValue.empty()) {
element.SetAttribute("defaultValue", defaultValue);
}
}
void ValueTypeMetadata::UnserializeFrom(const SerializerElement& element) {
name = element.GetStringAttribute("type");
supplementaryInformation =
element.GetStringAttribute("supplementaryInformation");
optional = element.GetBoolAttribute("optional");
defaultValue = element.GetStringAttribute("defaultValue");
}
const gd::String ValueTypeMetadata::numberType = "number";
const gd::String ValueTypeMetadata::stringType = "string";
const gd::String ValueTypeMetadata::variableType = "variable";
const gd::String ValueTypeMetadata::booleanType = "boolean";
const gd::String &ValueTypeMetadata::GetExpressionPrimitiveValueType(
const gd::String &parameterType) {
if (parameterType == "number" ||
gd::ValueTypeMetadata::IsTypeExpression("number", parameterType)) {
return ValueTypeMetadata::numberType;
}
if (parameterType == "string" ||
gd::ValueTypeMetadata::IsTypeExpression("string", parameterType)) {
return ValueTypeMetadata::stringType;
}
return parameterType;
}
const gd::String &
ValueTypeMetadata::GetPrimitiveValueType(const gd::String &parameterType) {
if (parameterType == "variable" ||
gd::ValueTypeMetadata::IsTypeExpression("variable", parameterType)) {
return ValueTypeMetadata::variableType;
}
if (parameterType == "boolean" || parameterType == "yesorno" ||
parameterType == "trueorfalse") {
return ValueTypeMetadata::booleanType;
}
// These 2 types are not strings from the code generator point of view,
// but it is for event-based extensions.
if (parameterType == "key" || parameterType == "mouse") {
return ValueTypeMetadata::stringType;
}
return GetExpressionPrimitiveValueType(parameterType);
}
const gd::String ValueTypeMetadata::numberValueType = "number";
const gd::String ValueTypeMetadata::booleanValueType = "boolean";
const gd::String ValueTypeMetadata::colorValueType = "color";
const gd::String ValueTypeMetadata::choiceValueType = "stringWithSelector";
const gd::String ValueTypeMetadata::stringValueType = "string";
const gd::String &ValueTypeMetadata::ConvertPropertyTypeToValueType(
const gd::String &propertyType) {
if (propertyType == "Number") {
return numberValueType;
} else if (propertyType == "Boolean") {
return booleanValueType;
} else if (propertyType == "Color") {
return colorValueType;
} else if (propertyType == "Choice") {
return choiceValueType;
}
// For "String" or default
return stringValueType;
};
} // namespace gd

View File

@@ -0,0 +1,253 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef VALUE_TYPE_METADATA_H
#define VALUE_TYPE_METADATA_H
#include <map>
#include <memory>
#include "GDCore/String.h"
namespace gd {
class SerializerElement;
} // namespace gd
namespace gd {
/**
* \brief Define a type for parameters of a function (action, condition or
* expression) or the returned value of an expression.
*
* \see gd::EventsFunction
* \ingroup Events
*/
class GD_CORE_API ValueTypeMetadata {
public:
ValueTypeMetadata();
virtual ~ValueTypeMetadata(){};
/**
* \brief Return the string representation of the type.
*/
const gd::String &GetName() const { return name; }
/**
* \brief Set the string representation of the type.
*/
ValueTypeMetadata &SetName(const gd::String &name_) {
name = name_;
return *this;
}
/**
* \brief Return an optional additional information, used for some parameters
* with special type (for example, it can contains the type of object accepted
* by the parameter).
*/
const gd::String &GetExtraInfo() const { return supplementaryInformation; }
/**
* \brief Set an optional additional information, used for some parameters
* with special type (for example, it can contains the type of object accepted
* by the parameter).
*/
ValueTypeMetadata &SetExtraInfo(const gd::String &supplementaryInformation_) {
supplementaryInformation = supplementaryInformation_;
return *this;
}
/**
* \brief Return true if the parameter is optional.
*/
bool IsOptional() const { return optional; }
/**
* \brief Set if the parameter is optional.
*/
ValueTypeMetadata &SetOptional(bool optional_ = true) {
optional = optional_;
return *this;
}
/**
* \brief Get the default value for the parameter.
*/
const gd::String &GetDefaultValue() const { return defaultValue; }
/**
* \brief Set the default value, if the parameter is optional.
*/
ValueTypeMetadata &SetDefaultValue(const gd::String &defaultValue_) {
defaultValue = defaultValue_;
return *this;
}
/**
* \brief Return true if the type is defined.
*/
bool IsDefined() const {
return !name.empty();
}
/**
* \brief Return true if the type is representing one object
* (or more, i.e: an object group).
*/
bool IsObject() const {
return gd::ValueTypeMetadata::IsTypeObject(name);
}
/**
* \brief Return true if the type is "behavior".
*/
bool IsBehavior() const {
return gd::ValueTypeMetadata::IsTypeBehavior(name);
}
/**
* \brief Return true if the type is an expression of the
* given type.
*/
bool IsNumber() const {
return gd::ValueTypeMetadata::IsTypeExpression("number", name);
}
/**
* \brief Return true if the type is a string.
*/
bool IsString() const {
return gd::ValueTypeMetadata::IsTypeExpression("string", name);
}
/**
* \brief Return true if the type of the parameter is a number.
* \note If you had a new type of parameter, also add it in the IDE (
* see EventsFunctionParametersEditor, ParameterRenderingService
* and ExpressionAutocompletion) and in the EventsCodeGenerator.
*/
bool IsVariable() const {
return gd::ValueTypeMetadata::IsTypeExpression("variable", name);
}
/**
* \brief Return true if the type is representing one object
* (or more, i.e: an object group).
*/
static bool IsTypeObject(const gd::String &parameterType) {
return parameterType == "object" || parameterType == "objectPtr" ||
parameterType == "objectList" ||
parameterType == "objectListOrEmptyIfJustDeclared" ||
parameterType == "objectListOrEmptyWithoutPicking";
}
/**
* \brief Return true if the type is "behavior".
*/
static bool IsTypeBehavior(const gd::String &parameterType) {
return parameterType == "behavior";
}
/**
* \brief Return true if the type is an expression of the given type.
* \note If you are adding a new type of parameter, also add it in the IDE (
* see EventsFunctionParametersEditor, ParameterRenderingService
* and ExpressionAutocompletion) and in the EventsCodeGenerator.
*/
static bool IsTypeExpression(const gd::String &type,
const gd::String &parameterType) {
if (type == "number") {
return parameterType == "number" || parameterType == "expression" ||
parameterType == "camera" || parameterType == "forceMultiplier";
} else if (type == "string") {
return parameterType == "string" || parameterType == "layer" ||
parameterType == "color" || parameterType == "file" ||
parameterType == "stringWithSelector" ||
parameterType == "sceneName" ||
parameterType == "layerEffectName" ||
parameterType == "layerEffectParameterName" ||
parameterType == "objectEffectName" ||
parameterType == "objectEffectParameterName" ||
parameterType == "objectPointName" ||
parameterType == "objectAnimationName" ||
parameterType == "functionParameterName" ||
parameterType == "externalLayoutName" ||
parameterType == "leaderboardId" ||
parameterType == "identifier";
} else if (type == "variable") {
return parameterType == "objectvar" || parameterType == "globalvar" ||
parameterType == "scenevar";
} else if (type == "resource") {
return parameterType == "fontResource" ||
parameterType == "soundfile" ||
parameterType == "musicfile" ||
parameterType == "bitmapFontResource" ||
parameterType == "imageResource" ||
parameterType == "jsonResource" ||
parameterType == "tilemapResource" ||
parameterType == "tilesetResource" ||
parameterType == "model3DResource";
}
return false;
}
/**
* \brief Return the expression type from the parameter type.
* Declinations of "number" and "string" types (like "forceMultiplier" or
* "sceneName") are replaced by "number" and "string".
*
* \note It only maps string and number types.
*/
static const gd::String &GetExpressionPrimitiveValueType(const gd::String &parameterType);
/**
* \brief Return the primitive type from the parameter type.
* Declinations of "number" and "string" types (like "forceMultiplier" or
* "sceneName") are replaced by "number" and "string".
*
* \note It also maps variable and boolean types.
*/
static const gd::String &GetPrimitiveValueType(const gd::String &parameterType);
static const gd::String numberType;
static const gd::String stringType;
static const gd::String variableType;
static const gd::String booleanType;
/**
* \brief Return the ValueTypeMetadata name for a property type.
* \see gd::PropertyDescriptor
*/
static const gd::String &ConvertPropertyTypeToValueType(const gd::String &propertyType);
/** \name Serialization
*/
///@{
/**
* \brief Serialize the ParameterMetadata to the specified element
*/
void SerializeTo(gd::SerializerElement &element) const;
/**
* \brief Load the ParameterMetadata from the specified element
*/
void UnserializeFrom(const gd::SerializerElement &element);
///@}
private:
gd::String name; ///< Parameter type
gd::String supplementaryInformation; ///< Used if needed
bool optional; ///< True if the parameter is optional
gd::String defaultValue; ///< Used as a default value in editor or if an
///< optional parameter is empty.
static const gd::String numberValueType;
static const gd::String booleanValueType;
static const gd::String colorValueType;
static const gd::String choiceValueType;
static const gd::String stringValueType;
};
} // namespace gd
#endif // VALUE_TYPE_METADATA_H

View File

@@ -7,7 +7,9 @@
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Project/ObjectConfiguration.h"
#include "GDCore/String.h"
#include "GDCore/Tools/Log.h"
using namespace std;
@@ -91,24 +93,22 @@ std::shared_ptr<gd::PlatformExtension> Platform::GetExtension(
return std::shared_ptr<gd::PlatformExtension>();
}
std::unique_ptr<gd::Object> Platform::CreateObject(
gd::String type, const gd::String& name) const {
std::unique_ptr<gd::ObjectConfiguration> Platform::CreateObjectConfiguration(
gd::String type) const {
if (creationFunctionTable.find(type) == creationFunctionTable.end()) {
std::cout << "Tried to create an object with an unknown type: " << type
<< " for platform " << GetName() << "!" << std::endl;
gd::LogWarning("Tried to create an object with an unknown type: " + type
+ " for platform " + GetName() + "!");
type = "";
if (creationFunctionTable.find("") == creationFunctionTable.end()) {
std::cout << "Unable to create a Base object!" << std::endl;
gd::LogError("Unable to create a Base object!");
return nullptr;
}
}
// Create a new object with the type we want.
std::unique_ptr<gd::Object> object =
(creationFunctionTable.find(type)->second)(name);
object->SetType(type);
return std::unique_ptr<gd::Object>(std::move(object));
auto objectConfiguration = (creationFunctionTable.find(type)->second)();
objectConfiguration->SetType(type);
return objectConfiguration;
}
#if defined(GD_IDE_ONLY)

View File

@@ -16,6 +16,7 @@ namespace gd {
class InstructionsMetadataHolder;
class Project;
class Object;
class ObjectConfiguration;
class Behavior;
class BehaviorMetadata;
class ObjectMetadata;
@@ -26,7 +27,7 @@ class LayoutEditorCanvas;
class ProjectExporter;
} // namespace gd
typedef std::function<std::unique_ptr<gd::Object>(gd::String name)>
typedef std::function<std::unique_ptr<gd::ObjectConfiguration>()>
CreateFunPtr;
#undef CreateEvent
@@ -146,8 +147,8 @@ class GD_CORE_API Platform {
/**
* \brief Create an object of given type with the specified name.
*/
std::unique_ptr<gd::Object> CreateObject(gd::String type,
const gd::String& name) const;
std::unique_ptr<gd::ObjectConfiguration> CreateObjectConfiguration(
gd::String type) const;
/**
* \brief Create an event of given type

View File

@@ -18,19 +18,18 @@
#include "GDCore/Extensions/Platform.h"
#include "GDCore/IDE/PlatformManager.h"
#include "GDCore/Project/Behavior.h"
#include "GDCore/Project/ObjectConfiguration.h"
#include "GDCore/Project/BehaviorsSharedData.h"
#include "GDCore/Tools/Localization.h"
namespace gd {
#if defined(GD_IDE_ONLY)
std::map<gd::String, gd::InstructionMetadata>
PlatformExtension::badConditionsMetadata;
std::map<gd::String, gd::InstructionMetadata>
PlatformExtension::badActionsMetadata;
std::map<gd::String, gd::ExpressionMetadata>
PlatformExtension::badExpressionsMetadata;
#endif
gd::InstructionMetadata& PlatformExtension::AddCondition(
const gd::String& name,
@@ -40,7 +39,6 @@ gd::InstructionMetadata& PlatformExtension::AddCondition(
const gd::String& group,
const gd::String& icon,
const gd::String& smallicon) {
#if defined(GD_IDE_ONLY)
gd::String nameWithNamespace = GetNameSpace() + name;
conditionsInfos[nameWithNamespace] = InstructionMetadata(GetNameSpace(),
nameWithNamespace,
@@ -52,7 +50,6 @@ gd::InstructionMetadata& PlatformExtension::AddCondition(
smallicon)
.SetHelpPath(GetHelpPath());
return conditionsInfos[nameWithNamespace];
#endif
}
gd::InstructionMetadata& PlatformExtension::AddAction(
@@ -63,7 +60,6 @@ gd::InstructionMetadata& PlatformExtension::AddAction(
const gd::String& group,
const gd::String& icon,
const gd::String& smallicon) {
#if defined(GD_IDE_ONLY)
gd::String nameWithNamespace = GetNameSpace() + name;
actionsInfos[nameWithNamespace] = InstructionMetadata(GetNameSpace(),
nameWithNamespace,
@@ -75,7 +71,6 @@ gd::InstructionMetadata& PlatformExtension::AddAction(
smallicon)
.SetHelpPath(GetHelpPath());
return actionsInfos[nameWithNamespace];
#endif
}
gd::ExpressionMetadata& PlatformExtension::AddExpression(
@@ -84,7 +79,6 @@ gd::ExpressionMetadata& PlatformExtension::AddExpression(
const gd::String& description,
const gd::String& group,
const gd::String& smallicon) {
#if defined(GD_IDE_ONLY)
gd::String nameWithNamespace = GetNameSpace() + name;
expressionsInfos[nameWithNamespace] = ExpressionMetadata("number",
GetNameSpace(),
@@ -95,7 +89,6 @@ gd::ExpressionMetadata& PlatformExtension::AddExpression(
smallicon)
.SetHelpPath(GetHelpPath());
return expressionsInfos[nameWithNamespace];
#endif
}
gd::ExpressionMetadata& PlatformExtension::AddStrExpression(
@@ -104,7 +97,6 @@ gd::ExpressionMetadata& PlatformExtension::AddStrExpression(
const gd::String& description,
const gd::String& group,
const gd::String& smallicon) {
#if defined(GD_IDE_ONLY)
gd::String nameWithNamespace = GetNameSpace() + name;
strExpressionsInfos[nameWithNamespace] = ExpressionMetadata("string",
GetNameSpace(),
@@ -115,7 +107,6 @@ gd::ExpressionMetadata& PlatformExtension::AddStrExpression(
smallicon)
.SetHelpPath(GetHelpPath());
return strExpressionsInfos[nameWithNamespace];
#endif
}
gd::MultipleInstructionMetadata PlatformExtension::AddExpressionAndCondition(
@@ -219,19 +210,17 @@ PlatformExtension::AddExpressionAndConditionAndAction(
expression, condition, action);
}
#if defined(GD_IDE_ONLY)
gd::DependencyMetadata& PlatformExtension::AddDependency() {
extensionDependenciesMetadata.push_back(DependencyMetadata());
return extensionDependenciesMetadata.back();
}
#endif
gd::ObjectMetadata& PlatformExtension::AddObject(
const gd::String& name,
const gd::String& fullname,
const gd::String& description,
const gd::String& icon24x24,
std::shared_ptr<gd::Object> instance) {
std::shared_ptr<gd::ObjectConfiguration> instance) {
gd::String nameWithNamespace = GetNameSpace() + name;
objectsInfos[nameWithNamespace] = ObjectMetadata(GetNameSpace(),
nameWithNamespace,
@@ -244,6 +233,21 @@ gd::ObjectMetadata& PlatformExtension::AddObject(
return objectsInfos[nameWithNamespace];
}
gd::ObjectMetadata& PlatformExtension::AddEventsBasedObject(
const gd::String& name,
const gd::String& fullname,
const gd::String& description,
const gd::String& icon24x24) {
gd::String nameWithNamespace = GetNameSpace() + name;
objectsInfos[nameWithNamespace] = ObjectMetadata(GetNameSpace(),
nameWithNamespace,
fullname,
description,
icon24x24)
.SetHelpPath(GetHelpPath());
return objectsInfos[nameWithNamespace];
}
gd::BehaviorMetadata& PlatformExtension::AddBehavior(
const gd::String& name,
const gd::String& fullname,
@@ -269,6 +273,25 @@ gd::BehaviorMetadata& PlatformExtension::AddBehavior(
return behaviorsInfo[nameWithNamespace];
}
gd::BehaviorMetadata& PlatformExtension::AddEventsBasedBehavior(
const gd::String& name,
const gd::String& fullname,
const gd::String& description,
const gd::String& group,
const gd::String& icon24x24) {
gd::String nameWithNamespace = GetNameSpace() + name;
behaviorsInfo[nameWithNamespace] = BehaviorMetadata(GetNameSpace(),
nameWithNamespace,
fullname,
// Default name is the name
name,
description,
group,
icon24x24)
.SetHelpPath(GetHelpPath());
return behaviorsInfo[nameWithNamespace];
}
gd::EffectMetadata& PlatformExtension::AddEffect(const gd::String& name) {
gd::String nameWithNamespace = GetNameSpace() + name;
effectsMetadata[nameWithNamespace] = EffectMetadata(nameWithNamespace);
@@ -282,7 +305,6 @@ gd::EventMetadata& PlatformExtension::AddEvent(
const gd::String& group_,
const gd::String& smallicon_,
std::shared_ptr<gd::BaseEvent> instance_) {
#if defined(GD_IDE_ONLY)
gd::String nameWithNamespace = GetNameSpace() + name_;
eventsInfos[nameWithNamespace] = gd::EventMetadata(nameWithNamespace,
fullname_,
@@ -291,7 +313,6 @@ gd::EventMetadata& PlatformExtension::AddEvent(
smallicon_,
instance_);
return eventsInfos[nameWithNamespace];
#endif
}
PlatformExtension& PlatformExtension::SetExtensionInformation(
@@ -371,8 +392,6 @@ std::vector<gd::String> PlatformExtension::GetBehaviorsTypes() const {
return behaviors;
}
#if defined(GD_IDE_ONLY)
gd::InstructionMetadata& PlatformExtension::AddDuplicatedAction(
const gd::String& newActionName, const gd::String& copiedActionName) {
gd::String newNameWithNamespace = GetNameSpace() + newActionName;
@@ -551,7 +570,6 @@ gd::BaseEventSPtr PlatformExtension::CreateEvent(
return std::shared_ptr<gd::BaseEvent>();
}
#endif
CreateFunPtr PlatformExtension::GetObjectCreationFunctionPtr(
const gd::String& objectType) const {
@@ -630,7 +648,6 @@ bool PlatformExtension::IsBuiltin() const {
builtinExtensions.end();
}
#if defined(GD_IDE_ONLY)
void PlatformExtension::StripUnimplementedInstructionsAndExpressions() {
for (std::map<gd::String, gd::InstructionMetadata>::iterator it =
GetAllActions().begin();
@@ -775,7 +792,40 @@ void PlatformExtension::StripUnimplementedInstructionsAndExpressions() {
++it;
}
}
#endif
gd::String
PlatformExtension::GetEventsFunctionFullType(const gd::String &extensionName,
const gd::String &functionName) {
const auto &separator = GetNamespaceSeparator();
return extensionName + separator + functionName;
}
gd::String PlatformExtension::GetBehaviorEventsFunctionFullType(
const gd::String &extensionName, const gd::String &behaviorName,
const gd::String &functionName) {
const auto &separator = GetNamespaceSeparator();
return extensionName + separator + behaviorName + separator + functionName;
}
gd::String
PlatformExtension::GetBehaviorFullType(const gd::String &extensionName,
const gd::String &behaviorName) {
const auto &separator = GetNamespaceSeparator();
return extensionName + separator + behaviorName;
}
gd::String PlatformExtension::GetObjectEventsFunctionFullType(
const gd::String &extensionName, const gd::String &objectName,
const gd::String &functionName) {
const auto &separator = GetNamespaceSeparator();
return extensionName + separator + objectName + separator + functionName;
}
gd::String PlatformExtension::GetObjectFullType(const gd::String &extensionName,
const gd::String &objectName) {
const auto &separator = GetNamespaceSeparator();
return extensionName + separator + objectName;
}
PlatformExtension::PlatformExtension()
: deprecated(false), category(_("General")) {}

View File

@@ -37,9 +37,10 @@ class ArbitraryResourceWorker;
class BehaviorsSharedData;
class Behavior;
class Object;
class ObjectConfiguration;
} // namespace gd
typedef std::function<std::unique_ptr<gd::Object>(gd::String name)>
typedef std::function<std::unique_ptr<gd::ObjectConfiguration>()>
CreateFunPtr;
namespace gd {
@@ -242,7 +243,21 @@ class GD_CORE_API PlatformExtension {
const gd::String& fullname_,
const gd::String& description_,
const gd::String& icon_,
std::shared_ptr<gd::Object> instance);
std::shared_ptr<gd::ObjectConfiguration> instance);
/**
* \brief Declare a new events based object as being part of the extension.
*
* \param name The name of the object
* \param fullname The user friendly name of the object
* \param description The user friendly description of the object
* \param icon The icon of the object.
*/
gd::ObjectMetadata& AddEventsBasedObject(
const gd::String& name_,
const gd::String& fullname_,
const gd::String& description_,
const gd::String& icon_);
/**
* \brief Declare a new behavior as being part of the extension.
@@ -267,6 +282,21 @@ class GD_CORE_API PlatformExtension {
std::shared_ptr<gd::Behavior> instance,
std::shared_ptr<gd::BehaviorsSharedData> sharedDatasInstance);
/**
* \brief Declare a new events based behavior as being part of the extension.
*
* \param name The name of the behavior
* \param fullname The user friendly name of the behavior
* \param description The user friendly description of the behavior
* \param icon The icon of the behavior.
*/
gd::BehaviorMetadata& AddEventsBasedBehavior(
const gd::String& name_,
const gd::String& fullname_,
const gd::String& description_,
const gd::String& group_,
const gd::String& icon_);
/**
* \brief Declare a new effect as being part of the extension.
* \param name The internal name of the effect (also called effect type).
@@ -590,7 +620,26 @@ class GD_CORE_API PlatformExtension {
*/
static gd::String GetNamespaceSeparator() { return "::"; }
private:
static gd::String GetEventsFunctionFullType(const gd::String &extensionName,
const gd::String &functionName);
static gd::String
GetBehaviorEventsFunctionFullType(const gd::String &extensionName,
const gd::String &behaviorName,
const gd::String &functionName);
static gd::String GetBehaviorFullType(const gd::String &extensionName,
const gd::String &behaviorName);
static gd::String
GetObjectEventsFunctionFullType(const gd::String &extensionName,
const gd::String &objectName,
const gd::String &functionName);
static gd::String GetObjectFullType(const gd::String &extensionName,
const gd::String &objectName);
private:
/**
* Set the namespace (the string all actions/conditions/expressions start
* with).

View File

@@ -25,8 +25,8 @@ gd::ObjectMetadata& PlatformExtension::AddObject(const gd::String& name,
fullname,
description,
icon24x24,
[](gd::String name) -> std::unique_ptr<gd::Object> {
return gd::make_unique<T>(name);
[]() -> std::unique_ptr<gd::ObjectConfiguration> {
return gd::make_unique<T>();
})
.SetHelpPath(GetHelpPath());

View File

@@ -42,7 +42,7 @@ class GD_CORE_API DependenciesAnalyzer {
*
* You can also call then
* DependenciesAnalyzer::ExternalEventsCanBeCompiledForAScene to check if the
* external events can be compiled separatly and called by a scene. \see
* external events can be compiled separately and called by a scene. \see
* DependenciesAnalyzer::ExternalEventsCanBeCompiledForAScene
*/
DependenciesAnalyzer(const gd::Project& project_,

View File

@@ -3,7 +3,6 @@
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#if defined(GD_IDE_ONLY)
#ifndef SCENECANVASSETTINGS_H
#define SCENECANVASSETTINGS_H
#include "GDCore/String.h"
@@ -43,4 +42,3 @@ private:
} // namespace gd
#endif // SCENECANVASSETTINGS_H
#endif

View File

@@ -0,0 +1,49 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#include "EventBasedBehaviorBrowser.h"
#include "GDCore/IDE/Events/ArbitraryEventsWorker.h"
#include "GDCore/IDE/Project/ArbitraryEventBasedBehaviorsWorker.h"
#include "GDCore/IDE/Project/ArbitraryEventsFunctionsWorker.h"
#include "GDCore/IDE/Project/ArbitraryObjectsWorker.h"
#include "GDCore/IDE/Project/ArbitraryBehaviorSharedDataWorker.h"
#include "GDCore/IDE/ProjectBrowserHelper.h"
#include "GDCore/Project/EventsBasedBehavior.h"
#include "GDCore/Project/Project.h"
#include "GDCore/String.h"
namespace gd {
void EventBasedBehaviorBrowser::ExposeEvents(
gd::Project &project, gd::ArbitraryEventsWorker &worker) const {
gd::ProjectBrowserHelper::ExposeEventsBasedBehaviorEvents(
project, eventsBasedBehavior, worker);
}
void EventBasedBehaviorBrowser::ExposeEvents(
gd::Project &project, gd::ArbitraryEventsWorkerWithContext &worker) const {
gd::ProjectBrowserHelper::ExposeEventsBasedBehaviorEvents(
project, eventsBasedBehavior, worker);
}
void EventBasedBehaviorBrowser::ExposeObjects(
gd::Project &project, gd::ArbitraryObjectsWorker &worker) const {}
void EventBasedBehaviorBrowser::ExposeFunctions(
gd::Project &project, gd::ArbitraryEventsFunctionsWorker &worker) const {
worker.Launch(eventsBasedBehavior.GetEventsFunctions());
}
void EventBasedBehaviorBrowser::ExposeEventBasedBehaviors(
gd::Project &project,
gd::ArbitraryEventBasedBehaviorsWorker &worker) const {
worker.Launch(eventsBasedBehavior);
}
void EventBasedBehaviorBrowser::ExposeBehaviorSharedDatas(
gd::Project &project, gd::ArbitraryBehaviorSharedDataWorker &worker) const {}
} // namespace gd

View File

@@ -0,0 +1,86 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#pragma once
#include "GDCore/IDE/ProjectBrowser.h"
namespace gd {
class Project;
class String;
class EventsFunctionsExtension;
class EventsFunction;
class EventsBasedBehavior;
class EventsBasedObject;
class ArbitraryEventsWorker;
class ArbitraryEventsWorkerWithContext;
class ArbitraryEventsFunctionsWorker;
class ArbitraryObjectsWorker;
class ArbitraryEventBasedBehaviorsWorker;
class ArbitraryBehaviorSharedDataWorker;
} // namespace gd
namespace gd {
/**
* \brief Expose event-based behavior contents to workers.
*/
class GD_CORE_API EventBasedBehaviorBrowser : public ProjectBrowser {
public:
EventBasedBehaviorBrowser(gd::EventsBasedBehavior &eventsBasedBehavior_)
: eventsBasedBehavior(eventsBasedBehavior_) {}
/**
* \brief Call the specified worker on all events of the event-based
* behavior.
*
* This should be the preferred way to traverse all the events of an event-based behavior.
*/
void ExposeEvents(gd::Project &project,
gd::ArbitraryEventsWorker &worker) const override;
/**
* \brief Call the specified worker on all events of the event-based
* behavior.
*
* This should be the preferred way to traverse all the events of an event-based behavior.
*/
void
ExposeEvents(gd::Project &project,
gd::ArbitraryEventsWorkerWithContext &worker) const override;
/**
* \brief Call the specified worker on all functions of the event-based behavior
*
* This should be the preferred way to traverse all the function signatures
* of an event-based behavior.
*/
void ExposeFunctions(gd::Project &project,
gd::ArbitraryEventsFunctionsWorker &worker) const override;
/**
* \brief Do nothing.
*/
void ExposeObjects(gd::Project &project,
gd::ArbitraryObjectsWorker &worker) const override;
/**
* \brief Call the specified worker on the event-based behavior.
*/
void ExposeEventBasedBehaviors(
gd::Project &project,
gd::ArbitraryEventBasedBehaviorsWorker &worker) const override;
/**
* \brief Do nothing.
*/
void ExposeBehaviorSharedDatas(gd::Project &project,
gd::ArbitraryBehaviorSharedDataWorker &worker) const override;
private:
gd::EventsBasedBehavior &eventsBasedBehavior;
};
} // namespace gd

View File

@@ -23,7 +23,7 @@ void ArbitraryEventsWorker::VisitEventList(gd::EventsList& events) {
DoVisitEventList(events);
for (std::size_t i = 0; i < events.size();) {
if (VisitEvent(events[i]))
if (events[i].AcceptVisitor(*this))
events.RemoveEvent(i);
else {
if (events[i].CanHaveSubEvents())
@@ -50,6 +50,10 @@ bool ArbitraryEventsWorker::VisitEvent(gd::BaseEvent& event) {
return false;
}
bool ArbitraryEventsWorker::VisitLinkEvent(gd::LinkEvent& linkEvent) {
return DoVisitLinkEvent(linkEvent);
}
void ArbitraryEventsWorker::VisitInstructionList(
gd::InstructionsList& instructions, bool areConditions) {
DoVisitInstructionList(instructions, areConditions);
@@ -73,4 +77,58 @@ bool ArbitraryEventsWorker::VisitInstruction(gd::Instruction& instruction,
ArbitraryEventsWorkerWithContext::~ArbitraryEventsWorkerWithContext() {}
ReadOnlyArbitraryEventsWorker::~ReadOnlyArbitraryEventsWorker() {}
void ReadOnlyArbitraryEventsWorker::VisitEventList(const gd::EventsList& events) {
DoVisitEventList(events);
for (std::size_t i = 0; i < events.size(); ++i) {
events[i].AcceptVisitor(*this);
if (events[i].CanHaveSubEvents()) {
VisitEventList(events[i].GetSubEvents());
}
}
}
void ReadOnlyArbitraryEventsWorker::VisitEvent(const gd::BaseEvent& event) {
DoVisitEvent(event);
const vector<const gd::InstructionsList*> conditionsVectors =
event.GetAllConditionsVectors();
for (std::size_t j = 0; j < conditionsVectors.size(); ++j) {
VisitInstructionList(*conditionsVectors[j], true);
}
const vector<const gd::InstructionsList*> actionsVectors = event.GetAllActionsVectors();
for (std::size_t j = 0; j < actionsVectors.size(); ++j) {
VisitInstructionList(*actionsVectors[j], false);
}
}
void ReadOnlyArbitraryEventsWorker::VisitLinkEvent(const gd::LinkEvent& linkEvent) {
DoVisitLinkEvent(linkEvent);
}
void ReadOnlyArbitraryEventsWorker::VisitInstructionList(
const gd::InstructionsList& instructions, bool areConditions) {
DoVisitInstructionList(instructions, areConditions);
for (std::size_t i = 0; i < instructions.size(); ++i) {
VisitInstruction(instructions[i], areConditions);
if (!instructions[i].GetSubInstructions().empty()) {
VisitInstructionList(instructions[i].GetSubInstructions(),
areConditions);
}
}
}
void ReadOnlyArbitraryEventsWorker::VisitInstruction(const gd::Instruction& instruction,
bool isCondition) {
DoVisitInstruction(instruction, isCondition);
}
ReadOnlyArbitraryEventsWorkerWithContext::~ReadOnlyArbitraryEventsWorkerWithContext() {}
} // namespace gd

View File

@@ -9,10 +9,12 @@
#include <memory>
#include <vector>
#include "GDCore/Events/InstructionsList.h"
#include "GDCore/Events/EventVisitor.h"
#include "GDCore/String.h"
namespace gd {
class Instruction;
class BaseEvent;
class LinkEvent;
class EventsList;
class ObjectsContainer;
} // namespace gd
@@ -28,7 +30,7 @@ namespace gd {
*
* \ingroup IDE
*/
class GD_CORE_API ArbitraryEventsWorker {
class GD_CORE_API ArbitraryEventsWorker : private EventVisitor {
public:
ArbitraryEventsWorker(){};
virtual ~ArbitraryEventsWorker();
@@ -40,7 +42,8 @@ class GD_CORE_API ArbitraryEventsWorker {
private:
void VisitEventList(gd::EventsList& events);
bool VisitEvent(gd::BaseEvent& event);
bool VisitEvent(gd::BaseEvent& event) override;
bool VisitLinkEvent(gd::LinkEvent& linkEvent) override;
void VisitInstructionList(gd::InstructionsList& instructions,
bool areConditions);
bool VisitInstruction(gd::Instruction& instruction, bool isCondition);
@@ -52,11 +55,21 @@ class GD_CORE_API ArbitraryEventsWorker {
/**
* Called to do some work on an event
* \return true if the instruction must be deleted from the events list, false
* \return true if the event must be deleted from the events list, false
* otherwise (default).
*/
virtual bool DoVisitEvent(gd::BaseEvent& event) { return false; };
/**
* Called to do some work on a link event.
*
* Note that DoVisitEvent is also called with this event.
*
* \return true if the event must be deleted from the events list, false
* otherwise (default).
*/
virtual bool DoVisitLinkEvent(gd::LinkEvent& event) { return false; };
/**
* Called to do some work on an instruction list
*/
@@ -121,6 +134,109 @@ class GD_CORE_API ArbitraryEventsWorkerWithContext
const gd::ObjectsContainer* currentObjectsContainer;
};
/**
* \brief ReadOnlyArbitraryEventsWorker is an abstract class used to browse events (and
* instructions). It can be used to implement autocompletion for example.
*
* \see gd::ReadOnlyArbitraryEventsWorkerWithContext
*
* \ingroup IDE
*/
class GD_CORE_API ReadOnlyArbitraryEventsWorker : private ReadOnlyEventVisitor {
public:
ReadOnlyArbitraryEventsWorker(){};
virtual ~ReadOnlyArbitraryEventsWorker();
/**
* \brief Launch the worker on the specified events list.
*/
void Launch(const gd::EventsList& events) { VisitEventList(events); };
private:
void VisitEventList(const gd::EventsList& events);
void VisitEvent(const gd::BaseEvent& event) override;
void VisitLinkEvent(const gd::LinkEvent& linkEvent) override;
void VisitInstructionList(const gd::InstructionsList& instructions,
bool areConditions);
void VisitInstruction(const gd::Instruction& instruction, bool isCondition);
/**
* Called to do some work on an event list.
*/
virtual void DoVisitEventList(const gd::EventsList& events){};
/**
* Called to do some work on an event
*/
virtual void DoVisitEvent(const gd::BaseEvent& event) {};
/**
* Called to do some work on a link event.
*
* Note that DoVisitEvent is also called with this event.
*/
virtual void DoVisitLinkEvent(const gd::LinkEvent& linkEvent) {};
/**
* Called to do some work on an instruction list
*/
virtual void DoVisitInstructionList(const gd::InstructionsList& instructions,
bool areConditions){};
/**
* Called to do some work on an instruction.
*/
virtual void DoVisitInstruction(const gd::Instruction& instruction,
bool isCondition) {};
};
/**
* \brief An events worker that will know about the context (the objects
* container). Useful for workers working on expressions notably.
*
* \see gd::ReadOnlyArbitraryEventsWorker
*
* \ingroup IDE
*/
class GD_CORE_API ReadOnlyArbitraryEventsWorkerWithContext
: public ReadOnlyArbitraryEventsWorker {
public:
ReadOnlyArbitraryEventsWorkerWithContext()
: currentGlobalObjectsContainer(nullptr),
currentObjectsContainer(nullptr){};
virtual ~ReadOnlyArbitraryEventsWorkerWithContext();
/**
* \brief Launch the worker on the specified events list,
* giving the objects container on which the events are applying to.
*/
void Launch(const gd::EventsList& events,
const gd::ObjectsContainer& globalObjectsContainer_,
const gd::ObjectsContainer& objectsContainer_) {
currentGlobalObjectsContainer = &globalObjectsContainer_;
currentObjectsContainer = &objectsContainer_;
ReadOnlyArbitraryEventsWorker::Launch(events);
};
void Launch(gd::EventsList& events) = delete;
protected:
const gd::ObjectsContainer& GetGlobalObjectsContainer() {
// Pointers are guaranteed to be not nullptr after
// Launch was called.
return *currentGlobalObjectsContainer;
};
const gd::ObjectsContainer& GetObjectsContainer() {
// Pointers are guaranteed to be not nullptr after
// Launch was called.
return *currentObjectsContainer;
};
private:
const gd::ObjectsContainer* currentGlobalObjectsContainer;
const gd::ObjectsContainer* currentObjectsContainer;
};
} // namespace gd
#endif // GDCORE_ARBITRARYEVENTSWORKER_H

View File

@@ -0,0 +1,25 @@
#include "BehaviorTypeRenamer.h"
#include "GDCore/Events/Instruction.h"
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/IDE/WholeProjectRefactorer.h"
#include "GDCore/IDE/Events/ExpressionTypeFinder.h"
#include "GDCore/Project/Behavior.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Project/Project.h"
namespace gd {
void BehaviorTypeRenamer::DoVisitObject(gd::Object& object) {
};
void BehaviorTypeRenamer::DoVisitBehavior(gd::Behavior& behavior) {
if (behavior.GetTypeName() == oldType) {
behavior.SetTypeName(newType);
}
};
BehaviorTypeRenamer::~BehaviorTypeRenamer() {}
} // namespace gd

View File

@@ -0,0 +1,38 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef GDCORE_BEHAVIORTYPERENAMER_H
#define GDCORE_BEHAVIORTYPERENAMER_H
#include <set>
#include "GDCore/IDE/Project/ArbitraryObjectsWorker.h"
#include "GDCore/String.h"
namespace gd {
class Object;
class Behavior;
} // namespace gd
namespace gd {
class GD_CORE_API BehaviorTypeRenamer : public ArbitraryObjectsWorker {
public:
BehaviorTypeRenamer(const gd::String& oldType_,
const gd::String& newType_)
: oldType(oldType_), newType(newType_){};
virtual ~BehaviorTypeRenamer();
private:
void DoVisitObject(gd::Object& object) override;
void DoVisitBehavior(gd::Behavior& behavior) override;
gd::String oldType;
gd::String newType;
};
}; // namespace gd
#endif // GDCORE_BEHAVIORTYPERENAMER_H

View File

@@ -0,0 +1,24 @@
#include "CustomObjectTypeRenamer.h"
#include "GDCore/Events/Instruction.h"
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/IDE/WholeProjectRefactorer.h"
#include "GDCore/IDE/Events/ExpressionTypeFinder.h"
#include "GDCore/Project/Behavior.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Project/Project.h"
namespace gd {
void CustomObjectTypeRenamer::DoVisitObject(gd::Object& object) {
if (object.GetType() == oldType) {
object.SetType(newType);
}
};
void CustomObjectTypeRenamer::DoVisitBehavior(gd::Behavior& behavior) {};
CustomObjectTypeRenamer::~CustomObjectTypeRenamer() {}
} // namespace gd

View File

@@ -0,0 +1,38 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef GDCORE_CUSTOMOBJECTTYPERENAMER_H
#define GDCORE_CUSTOMOBJECTTYPERENAMER_H
#include <set>
#include "GDCore/IDE/Project/ArbitraryObjectsWorker.h"
#include "GDCore/String.h"
namespace gd {
class Object;
class Behavior;
} // namespace gd
namespace gd {
class GD_CORE_API CustomObjectTypeRenamer : public ArbitraryObjectsWorker {
public:
CustomObjectTypeRenamer(const gd::String& oldType_,
const gd::String& newType_)
: oldType(oldType_), newType(newType_){};
virtual ~CustomObjectTypeRenamer();
private:
void DoVisitObject(gd::Object& object) override;
void DoVisitBehavior(gd::Behavior& behavior) override;
gd::String oldType;
gd::String newType;
};
}; // namespace gd
#endif // GDCORE_CUSTOMOBJECTTYPERENAMER_H

View File

@@ -120,7 +120,7 @@ bool EventsBehaviorRenamer::DoVisitInstruction(gd::Instruction& instruction,
const gd::Expression& parameterValue,
size_t parameterIndex,
const gd::String& lastObjectName) {
const gd::String& type = parameterMetadata.type;
const gd::String& type = parameterMetadata.GetType();
if (gd::ParameterMetadata::IsBehavior(type)) {
if (lastObjectName == objectName) {

View File

@@ -0,0 +1,254 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#include "EventsIdentifiersFinder.h"
#include "GDCore/Events/Event.h"
#include "GDCore/Events/Instruction.h"
#include "GDCore/Events/Parsers/ExpressionParser2NodePrinter.h"
#include "GDCore/Events/Parsers/ExpressionParser2NodeWorker.h"
#include "GDCore/Extensions/Metadata/ExpressionMetadata.h"
#include "GDCore/Extensions/Metadata/InstructionMetadata.h"
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
#include "GDCore/Extensions/Platform.h"
#include "GDCore/IDE/Events/ArbitraryEventsWorker.h"
#include "GDCore/Project/Layout.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Project/Project.h"
#include "GDCore/Project/ExternalEvents.h"
#include "GDCore/IDE/DependenciesAnalyzer.h"
using namespace std;
namespace gd {
namespace {
/**
* \brief Go through the nodes to search for identifier occurrences.
*
* \see gd::ExpressionParser2
*/
class GD_CORE_API IdentifierFinderExpressionNodeWorker
: public ExpressionParser2NodeWorker {
public:
IdentifierFinderExpressionNodeWorker(std::set<gd::String>& results_,
const gd::Platform &platform_,
const gd::ObjectsContainer &globalObjectsContainer_,
const gd::ObjectsContainer &objectsContainer_,
const gd::String& identifierType_,
const gd::String& objectName_ = "")
: results(results_),
platform(platform_),
globalObjectsContainer(globalObjectsContainer_),
objectsContainer(objectsContainer_),
identifierType(identifierType_),
objectName(objectName_){};
virtual ~IdentifierFinderExpressionNodeWorker(){};
protected:
void OnVisitSubExpressionNode(SubExpressionNode& node) override {
node.expression->Visit(*this);
}
void OnVisitOperatorNode(OperatorNode& node) override {
node.leftHandSide->Visit(*this);
node.rightHandSide->Visit(*this);
}
void OnVisitUnaryOperatorNode(UnaryOperatorNode& node) override {
node.factor->Visit(*this);
}
void OnVisitNumberNode(NumberNode& node) override {}
void OnVisitTextNode(TextNode& node) override {}
void OnVisitVariableNode(VariableNode& node) override {
if (node.child) node.child->Visit(*this);
}
void OnVisitVariableAccessorNode(VariableAccessorNode& node) override {
if (node.child) node.child->Visit(*this);
}
void OnVisitVariableBracketAccessorNode(
VariableBracketAccessorNode& node) override {
node.expression->Visit(*this);
if (node.child) node.child->Visit(*this);
}
void OnVisitIdentifierNode(IdentifierNode& node) override {}
void OnVisitObjectFunctionNameNode(ObjectFunctionNameNode& node) override {}
void OnVisitFunctionCallNode(FunctionCallNode& node) override {
bool considerFunction = objectName.empty() || node.objectName == objectName;
const bool isObjectFunction = !node.objectName.empty();
const gd::ExpressionMetadata &metadata = isObjectFunction ?
MetadataProvider::GetObjectAnyExpressionMetadata(
platform,
GetTypeOfObject(globalObjectsContainer, objectsContainer, objectName),
node.functionName):
MetadataProvider::GetAnyExpressionMetadata(platform, node.functionName);
if (gd::MetadataProvider::IsBadExpressionMetadata(metadata)) {
return;
}
size_t parameterIndex = 0;
for (size_t metadataIndex = (isObjectFunction ? 1 : 0); metadataIndex < metadata.parameters.size()
&& parameterIndex < node.parameters.size(); ++metadataIndex) {
auto& parameterMetadata = metadata.parameters[metadataIndex];
if (parameterMetadata.IsCodeOnly()) {
continue;
}
auto& parameterNode = node.parameters[parameterIndex];
++parameterIndex;
if (considerFunction && parameterMetadata.GetType() == "identifier"
&& parameterMetadata.GetExtraInfo() == identifierType) {
// Store the value of the parameter
results.insert(
gd::ExpressionParser2NodePrinter::PrintNode(*parameterNode));
} else {
parameterNode->Visit(*this);
}
}
}
void OnVisitEmptyNode(EmptyNode& node) override {}
private:
const gd::Platform &platform;
const gd::ObjectsContainer &globalObjectsContainer;
const gd::ObjectsContainer &objectsContainer;
std::set<gd::String>& results; ///< Reference to the std::set where argument
///< values must be stored.
gd::String identifierType; ///< The type of the parameters to be searched for.
gd::String objectName; ///< If not empty, parameters will be taken into
///< account only if related to this object.
};
/**
* \brief Go through the events to search for identifier occurrences.
*/
class GD_CORE_API IdentifierFinderEventWorker
: public ReadOnlyArbitraryEventsWorkerWithContext {
public:
IdentifierFinderEventWorker(std::set<gd::String>& results_,
const gd::Platform &platform_,
const gd::String& identifierType_,
const gd::String& objectName_ = "")
: results(results_),
platform(platform_),
identifierType(identifierType_),
objectName(objectName_){};
virtual ~IdentifierFinderEventWorker(){};
void DoVisitInstructionList(const gd::InstructionsList& instructions,
bool areConditions) override {
for (std::size_t aId = 0; aId < instructions.size(); ++aId) {
auto& instruction = instructions[aId];
gd::String lastObjectParameter = "";
const gd::InstructionMetadata& instrInfos =
areConditions ? MetadataProvider::GetConditionMetadata(
platform, instruction.GetType())
: MetadataProvider::GetActionMetadata(
platform, instruction.GetType());
for (std::size_t pNb = 0; pNb < instrInfos.parameters.size(); ++pNb) {
// The parameter has the searched type...
if (instrInfos.parameters[pNb].GetType() == "identifier"
&& instrInfos.parameters[pNb].GetExtraInfo() == identifierType) {
//...remember the value of the parameter.
if (objectName.empty() || lastObjectParameter == objectName) {
results.insert(instruction.GetParameter(pNb).GetPlainString());
}
}
// Search in expressions
else if (ParameterMetadata::IsExpression(
"number", instrInfos.parameters[pNb].GetType()) ||
ParameterMetadata::IsExpression(
"string", instrInfos.parameters[pNb].GetType())) {
auto node = instruction.GetParameter(pNb).GetRootNode();
IdentifierFinderExpressionNodeWorker searcher(
results,
platform,
GetGlobalObjectsContainer(),
GetObjectsContainer(),
identifierType,
objectName);
node->Visit(searcher);
}
// Remember the value of the last "object" parameter.
else if (gd::ParameterMetadata::IsObject(
instrInfos.parameters[pNb].GetType())) {
lastObjectParameter =
instruction.GetParameter(pNb).GetPlainString();
}
}
}
};
private:
const gd::Platform &platform;
std::set<gd::String>& results; ///< Reference to the std::set where argument
///< values must be stored.
gd::String identifierType; ///< The type of the parameters to be searched for.
gd::String objectName; ///< If not empty, parameters will be taken into
///< account only if related to this object.
};
} // namespace
std::set<gd::String> EventsIdentifiersFinder::FindAllIdentifierExpressions(
const gd::Platform& platform,
const gd::Project& project,
const gd::Layout& layout,
const gd::String& identifierType,
const gd::String& contextObjectName) {
std::set<gd::String> results;
const bool isObjectIdentifier = identifierType.find("object") == 0;
// The object from the context is only relevant for object identifiers.
auto& actualObjectName = isObjectIdentifier ? contextObjectName : "";
FindArgumentsInEventsAndDependencies(
results,
platform,
project,
layout,
identifierType,
actualObjectName);
return results;
}
void EventsIdentifiersFinder::FindArgumentsInEventsAndDependencies(
std::set<gd::String>& results,
const gd::Platform& platform,
const gd::Project& project,
const gd::Layout& layout,
const gd::String& identifierType,
const gd::String& objectName) {
IdentifierFinderEventWorker eventWorker(results,
platform,
identifierType,
objectName);
eventWorker.Launch(layout.GetEvents(), project, layout);
DependenciesAnalyzer dependenciesAnalyzer = DependenciesAnalyzer(project, layout);
dependenciesAnalyzer.Analyze();
for (const gd::String& externalEventName : dependenciesAnalyzer.GetExternalEventsDependencies()) {
const gd::ExternalEvents& externalEvents = project.GetExternalEvents(externalEventName);
IdentifierFinderEventWorker eventWorker(results,
platform,
identifierType,
objectName);
eventWorker.Launch(externalEvents.GetEvents(), project, layout);
}
for (const gd::String& sceneName : dependenciesAnalyzer.GetScenesDependencies()) {
const gd::Layout& dependencyLayout = project.GetLayout(sceneName);
IdentifierFinderEventWorker eventWorker(results,
platform,
identifierType,
objectName);
eventWorker.Launch(dependencyLayout.GetEvents(), project, dependencyLayout);
}
}
} // namespace gd

View File

@@ -0,0 +1,81 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef EVENTSIDENTIFIERSFINDER_H
#define EVENTSIDENTIFIERSFINDER_H
#include <set>
#include <vector>
#include "GDCore/Events/Event.h"
#include "GDCore/String.h"
namespace gd {
class Instruction;
class Platform;
class Object;
class Project;
class Layout;
} // namespace gd
namespace gd {
/**
* \brief Perform a search over a layout, searching for layout or object custom
* identifiers.
*
* \todo Refactor this class using ArbitraryEventsWorker
*
* \ingroup IDE
*/
class EventsIdentifiersFinder {
public:
EventsIdentifiersFinder(){};
virtual ~EventsIdentifiersFinder(){};
/**
* Construct a list containing all the expressions for a given identifier used
* in the layout.
*
* \param project The project to use.
* \param layout The layout to use.
* \param identifierType The identifier type to be analyzed.
* \param objectName If not empty, parameters will be taken into account
* only if the last object parameter is filled with
* this value.
* \return A std::set containing the names of all identifiers used.
*/
static std::set<gd::String> FindAllIdentifierExpressions(
const gd::Platform& platform,
const gd::Project& project,
const gd::Layout& layout,
const gd::String& identifierType,
const gd::String& objectName = "");
private:
/**
* Construct a list containing all the expressions for a given identifier used
* in the layout. It searches in events dependencies.
*
* \param results A std::set to fill with the expressions used for all parameters of the
* specified identifier type
* \param platform The platform of the project
* \param project The project to use.
* \param layout The layout to use.
* \param events The events to be analyzed
* \param identifierType The identifier type to be analyzed
* \param objectName If not empty, parameters will be taken into account
* only if the last object parameter is filled with
* this value.
*/
static void FindArgumentsInEventsAndDependencies(
std::set<gd::String>& results,
const gd::Platform& platform,
const gd::Project& project,
const gd::Layout& layout,
const gd::String& identifierType,
const gd::String& objectName = "");
};
} // namespace gd
#endif // EVENTSIDENTIFIERSFINDER_H

View File

@@ -30,7 +30,7 @@ bool EventsLeaderboardsLister::DoVisitInstruction(gd::Instruction& instruction,
for (int i = 0; i < instruction.GetParametersCount() &&
i < instrInfo.GetParametersCount();
++i)
if (instrInfo.GetParameter(i).type == "leaderboardId") {
if (instrInfo.GetParameter(i).GetType() == "leaderboardId") {
leaderboardIds.insert(instruction.GetParameter(i).GetPlainString());
}
return false;

View File

@@ -32,7 +32,7 @@ bool EventsLeaderboardsRenamer::DoVisitInstruction(gd::Instruction& instruction,
++i) {
const gd::ParameterMetadata parameter = instrInfo.GetParameter(i);
if (parameter.type == "leaderboardId") {
if (parameter.GetType() == "leaderboardId") {
const gd::String leaderboardId =
instruction.GetParameter(i).GetPlainString();

View File

@@ -19,6 +19,7 @@
#include "GDCore/IDE/Events/ExpressionValidator.h"
#include "GDCore/IDE/Events/InstructionSentenceFormatter.h"
#include "GDCore/Project/ObjectsContainer.h"
#include "GDCore/Project/EventsBasedObject.h"
#include "GDCore/IDE/Events/ExpressionTypeFinder.h"
using namespace std;
@@ -121,7 +122,7 @@ class GD_CORE_API ExpressionObjectRenamer : public ExpressionParser2NodeWorker {
bool hasDoneRenaming;
const gd::String& objectName;
const gd::String& objectNewName;
const gd::Platform &platform;
const gd::ObjectsContainer &globalObjectsContainer;
const gd::ObjectsContainer &objectsContainer;
@@ -216,7 +217,7 @@ class GD_CORE_API ExpressionObjectFinder : public ExpressionParser2NodeWorker {
private:
bool hasObject;
const gd::String& objectName;
const gd::Platform &platform;
const gd::ObjectsContainer &globalObjectsContainer;
const gd::ObjectsContainer &objectsContainer;
@@ -236,12 +237,12 @@ bool EventsRefactorer::RenameObjectInActions(const gd::Platform& platform,
MetadataProvider::GetActionMetadata(platform, actions[aId].GetType());
for (std::size_t pNb = 0; pNb < instrInfos.parameters.size(); ++pNb) {
// Replace object's name in parameters
if (gd::ParameterMetadata::IsObject(instrInfos.parameters[pNb].type) &&
if (gd::ParameterMetadata::IsObject(instrInfos.parameters[pNb].GetType()) &&
actions[aId].GetParameter(pNb).GetPlainString() == oldName)
actions[aId].SetParameter(pNb, gd::Expression(newName));
// Replace object's name in expressions
else if (ParameterMetadata::IsExpression(
"number", instrInfos.parameters[pNb].type)) {
"number", instrInfos.parameters[pNb].GetType())) {
auto node = actions[aId].GetParameter(pNb).GetRootNode();
if (ExpressionObjectRenamer::Rename(platform, project, layout, "number", *node, oldName, newName)) {
@@ -251,7 +252,7 @@ bool EventsRefactorer::RenameObjectInActions(const gd::Platform& platform,
}
// Replace object's name in text expressions
else if (ParameterMetadata::IsExpression(
"string", instrInfos.parameters[pNb].type)) {
"string", instrInfos.parameters[pNb].GetType())) {
auto node = actions[aId].GetParameter(pNb).GetRootNode();
if (ExpressionObjectRenamer::Rename(platform, project, layout, "string", *node, oldName, newName)) {
@@ -290,12 +291,12 @@ bool EventsRefactorer::RenameObjectInConditions(
conditions[cId].GetType());
for (std::size_t pNb = 0; pNb < instrInfos.parameters.size(); ++pNb) {
// Replace object's name in parameters
if (gd::ParameterMetadata::IsObject(instrInfos.parameters[pNb].type) &&
if (gd::ParameterMetadata::IsObject(instrInfos.parameters[pNb].GetType()) &&
conditions[cId].GetParameter(pNb).GetPlainString() == oldName)
conditions[cId].SetParameter(pNb, gd::Expression(newName));
// Replace object's name in expressions
else if (ParameterMetadata::IsExpression(
"number", instrInfos.parameters[pNb].type)) {
"number", instrInfos.parameters[pNb].GetType())) {
auto node = conditions[cId].GetParameter(pNb).GetRootNode();
if (ExpressionObjectRenamer::Rename(platform, project, layout, "number", *node, oldName, newName)) {
@@ -305,7 +306,7 @@ bool EventsRefactorer::RenameObjectInConditions(
}
// Replace object's name in text expressions
else if (ParameterMetadata::IsExpression(
"string", instrInfos.parameters[pNb].type)) {
"string", instrInfos.parameters[pNb].GetType())) {
auto node = conditions[cId].GetParameter(pNb).GetRootNode();
if (ExpressionObjectRenamer::Rename(platform, project, layout, "string", *node, oldName, newName)) {
@@ -411,8 +412,8 @@ void EventsRefactorer::RenameObjectInEvents(const gd::Platform& platform,
}
bool EventsRefactorer::RemoveObjectInActions(const gd::Platform& platform,
gd::ObjectsContainer& project,
gd::ObjectsContainer& layout,
gd::ObjectsContainer& globalObjectsContainer,
gd::ObjectsContainer& objectsContainer,
gd::InstructionsList& actions,
gd::String name) {
bool somethingModified = false;
@@ -424,27 +425,27 @@ bool EventsRefactorer::RemoveObjectInActions(const gd::Platform& platform,
MetadataProvider::GetActionMetadata(platform, actions[aId].GetType());
for (std::size_t pNb = 0; pNb < instrInfos.parameters.size(); ++pNb) {
// Find object's name in parameters
if (gd::ParameterMetadata::IsObject(instrInfos.parameters[pNb].type) &&
if (gd::ParameterMetadata::IsObject(instrInfos.parameters[pNb].GetType()) &&
actions[aId].GetParameter(pNb).GetPlainString() == name) {
deleteMe = true;
break;
}
// Find object's name in expressions
else if (ParameterMetadata::IsExpression(
"number", instrInfos.parameters[pNb].type)) {
"number", instrInfos.parameters[pNb].GetType())) {
auto node = actions[aId].GetParameter(pNb).GetRootNode();
if (ExpressionObjectFinder::CheckIfHasObject(platform, project, layout, "number", *node, name)) {
if (ExpressionObjectFinder::CheckIfHasObject(platform, globalObjectsContainer, objectsContainer, "number", *node, name)) {
deleteMe = true;
break;
}
}
// Find object's name in text expressions
else if (ParameterMetadata::IsExpression(
"string", instrInfos.parameters[pNb].type)) {
"string", instrInfos.parameters[pNb].GetType())) {
auto node = actions[aId].GetParameter(pNb).GetRootNode();
if (ExpressionObjectFinder::CheckIfHasObject(platform, project, layout, "string", *node, name)) {
if (ExpressionObjectFinder::CheckIfHasObject(platform, globalObjectsContainer, objectsContainer, "string", *node, name)) {
deleteMe = true;
break;
}
@@ -458,8 +459,8 @@ bool EventsRefactorer::RemoveObjectInActions(const gd::Platform& platform,
} else if (!actions[aId].GetSubInstructions().empty())
somethingModified =
RemoveObjectInActions(platform,
project,
layout,
globalObjectsContainer,
objectsContainer,
actions[aId].GetSubInstructions(),
name) ||
somethingModified;
@@ -470,8 +471,8 @@ bool EventsRefactorer::RemoveObjectInActions(const gd::Platform& platform,
bool EventsRefactorer::RemoveObjectInConditions(
const gd::Platform& platform,
gd::ObjectsContainer& project,
gd::ObjectsContainer& layout,
gd::ObjectsContainer& globalObjectsContainer,
gd::ObjectsContainer& objectsContainer,
gd::InstructionsList& conditions,
gd::String name) {
bool somethingModified = false;
@@ -484,27 +485,27 @@ bool EventsRefactorer::RemoveObjectInConditions(
conditions[cId].GetType());
for (std::size_t pNb = 0; pNb < instrInfos.parameters.size(); ++pNb) {
// Find object's name in parameters
if (gd::ParameterMetadata::IsObject(instrInfos.parameters[pNb].type) &&
if (gd::ParameterMetadata::IsObject(instrInfos.parameters[pNb].GetType()) &&
conditions[cId].GetParameter(pNb).GetPlainString() == name) {
deleteMe = true;
break;
}
// Find object's name in expressions
else if (ParameterMetadata::IsExpression(
"number", instrInfos.parameters[pNb].type)) {
"number", instrInfos.parameters[pNb].GetType())) {
auto node = conditions[cId].GetParameter(pNb).GetRootNode();
if (ExpressionObjectFinder::CheckIfHasObject(platform, project, layout, "number", *node, name)) {
if (ExpressionObjectFinder::CheckIfHasObject(platform, globalObjectsContainer, objectsContainer, "number", *node, name)) {
deleteMe = true;
break;
}
}
// Find object's name in text expressions
else if (ParameterMetadata::IsExpression(
"string", instrInfos.parameters[pNb].type)) {
"string", instrInfos.parameters[pNb].GetType())) {
auto node = conditions[cId].GetParameter(pNb).GetRootNode();
if (ExpressionObjectFinder::CheckIfHasObject(platform, project, layout, "string", *node, name)) {
if (ExpressionObjectFinder::CheckIfHasObject(platform, globalObjectsContainer, objectsContainer, "string", *node, name)) {
deleteMe = true;
break;
}
@@ -518,8 +519,8 @@ bool EventsRefactorer::RemoveObjectInConditions(
} else if (!conditions[cId].GetSubInstructions().empty())
somethingModified =
RemoveObjectInConditions(platform,
project,
layout,
globalObjectsContainer,
objectsContainer,
conditions[cId].GetSubInstructions(),
name) ||
somethingModified;
@@ -529,8 +530,8 @@ bool EventsRefactorer::RemoveObjectInConditions(
}
void EventsRefactorer::RemoveObjectInEvents(const gd::Platform& platform,
gd::ObjectsContainer& project,
gd::ObjectsContainer& layout,
gd::ObjectsContainer& globalObjectsContainer,
gd::ObjectsContainer& objectsContainer,
gd::EventsList& events,
gd::String name) {
for (std::size_t i = 0; i < events.size(); ++i) {
@@ -538,19 +539,19 @@ void EventsRefactorer::RemoveObjectInEvents(const gd::Platform& platform,
events[i].GetAllConditionsVectors();
for (std::size_t j = 0; j < conditionsVectors.size(); ++j) {
bool conditionsModified = RemoveObjectInConditions(
platform, project, layout, *conditionsVectors[j], name);
platform, globalObjectsContainer, objectsContainer, *conditionsVectors[j], name);
}
vector<gd::InstructionsList*> actionsVectors =
events[i].GetAllActionsVectors();
for (std::size_t j = 0; j < actionsVectors.size(); ++j) {
bool actionsModified = RemoveObjectInActions(
platform, project, layout, *actionsVectors[j], name);
platform, globalObjectsContainer, objectsContainer, *actionsVectors[j], name);
}
if (events[i].CanHaveSubEvents())
RemoveObjectInEvents(
platform, project, layout, events[i].GetSubEvents(), name);
platform, globalObjectsContainer, objectsContainer, events[i].GetSubEvents(), name);
}
}
@@ -565,6 +566,8 @@ std::vector<EventsSearchResult> EventsRefactorer::ReplaceStringInEvents(
bool inActions,
bool inEventStrings) {
vector<EventsSearchResult> modifiedEvents;
if (toReplace.empty()) return modifiedEvents;
for (std::size_t i = 0; i < events.size(); ++i) {
bool eventModified = false;
if (inConditions) {
@@ -770,15 +773,18 @@ vector<EventsSearchResult> EventsRefactorer::SearchInEvents(
const gd::String& ignored_characters =
EventsRefactorer::searchIgnoredCharacters;
search.replace_if(
search.begin(),
search.end(),
[ignored_characters](const char& c) {
return ignored_characters.find(c) != gd::String::npos;
},
"");
search = search.LeftTrim().RightTrim();
search.RemoveConsecutiveOccurrences(search.begin(), search.end(), ' ');
if (inEventSentences) {
// Remove ignored characters only when searching in event sentences.
search.replace_if(
search.begin(),
search.end(),
[ignored_characters](const char& c) {
return ignored_characters.find(c) != gd::String::npos;
},
"");
search = search.LeftTrim().RightTrim();
search.RemoveConsecutiveOccurrences(search.begin(), search.end(), ' ');
}
for (std::size_t i = 0; i < events.size(); ++i) {
bool eventAddedInResults = false;

View File

@@ -22,7 +22,7 @@ class EventsList;
namespace gd {
/**
* \brief List the values of the parameters of events and their type.
* \brief Allow to safely remove a bunch of events.
*
* \ingroup IDE
*/

View File

@@ -13,6 +13,7 @@
#include "GDCore/Extensions/Metadata/InstructionMetadata.h"
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
#include "GDCore/Extensions/Platform.h"
#include "GDCore/IDE/Events/ArbitraryEventsWorker.h"
#include "GDCore/Project/Layout.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Project/Project.h"
@@ -22,28 +23,28 @@
using namespace std;
namespace gd {
namespace {
/**
* \brief Go through the nodes and change the given object name to a new one.
* \brief Go through the nodes to search for variable occurrences.
*
* \see gd::ExpressionParser2
*/
class GD_CORE_API ExpressionParameterSearcher
class GD_CORE_API VariableFinderExpressionNodeWorker
: public ExpressionParser2NodeWorker {
public:
ExpressionParameterSearcher(const gd::Platform &platform_,
VariableFinderExpressionNodeWorker(std::set<gd::String>& results_,
const gd::Platform &platform_,
const gd::ObjectsContainer &globalObjectsContainer_,
const gd::ObjectsContainer &objectsContainer_,
std::set<gd::String>& results_,
const gd::String& parameterType_,
const gd::String& objectName_ = "")
: platform(platform_),
: results(results_),
platform(platform_),
globalObjectsContainer(globalObjectsContainer_),
objectsContainer(objectsContainer_),
results(results_),
parameterType(parameterType_),
objectName(objectName_){};
virtual ~ExpressionParameterSearcher(){};
virtual ~VariableFinderExpressionNodeWorker(){};
protected:
void OnVisitSubExpressionNode(SubExpressionNode& node) override {
@@ -74,27 +75,34 @@ class GD_CORE_API ExpressionParameterSearcher
void OnVisitFunctionCallNode(FunctionCallNode& node) override {
bool considerFunction = objectName.empty() || node.objectName == objectName;
const gd::ExpressionMetadata &metadata = node.objectName.empty() ?
MetadataProvider::GetAnyExpressionMetadata(platform, node.functionName) :
const bool isObjectFunction = !node.objectName.empty();
const gd::ExpressionMetadata &metadata = isObjectFunction ?
MetadataProvider::GetObjectAnyExpressionMetadata(
platform,
GetTypeOfObject(globalObjectsContainer, objectsContainer, objectName),
node.functionName);
node.functionName):
MetadataProvider::GetAnyExpressionMetadata(platform, node.functionName);
if (gd::MetadataProvider::IsBadExpressionMetadata(metadata)) {
return;
}
for (size_t i = 0; i < node.parameters.size() &&
i < metadata.parameters.size();
++i) {
auto& parameterMetadata = metadata.parameters[i];
size_t parameterIndex = 0;
for (size_t metadataIndex = (isObjectFunction ? 1 : 0); metadataIndex < metadata.parameters.size()
&& parameterIndex < node.parameters.size(); ++metadataIndex) {
auto& parameterMetadata = metadata.parameters[metadataIndex];
if (parameterMetadata.IsCodeOnly()) {
continue;
}
auto& parameterNode = node.parameters[parameterIndex];
++parameterIndex;
if (considerFunction && parameterMetadata.GetType() == parameterType) {
// Store the value of the parameter
results.insert(
gd::ExpressionParser2NodePrinter::PrintNode(*node.parameters[i]));
gd::ExpressionParser2NodePrinter::PrintNode(*parameterNode));
} else {
node.parameters[i]->Visit(*this);
parameterNode->Visit(*this);
}
}
}
@@ -112,18 +120,87 @@ class GD_CORE_API ExpressionParameterSearcher
///< account only if related to this object.
};
/**
* \brief Go through the events to search for variable occurrences.
*/
class GD_CORE_API VariableFinderEventWorker
: public ReadOnlyArbitraryEventsWorkerWithContext {
public:
VariableFinderEventWorker(std::set<gd::String>& results_,
const gd::Platform &platform_,
const gd::String& parameterType_,
const gd::String& objectName_ = "")
: results(results_),
platform(platform_),
parameterType(parameterType_),
objectName(objectName_){};
virtual ~VariableFinderEventWorker(){};
void DoVisitInstructionList(const gd::InstructionsList& instructions,
bool areConditions) override {
for (std::size_t aId = 0; aId < instructions.size(); ++aId) {
auto& instruction = instructions[aId];
gd::String lastObjectParameter = "";
const gd::InstructionMetadata& instrInfos =
areConditions ? MetadataProvider::GetConditionMetadata(
platform, instruction.GetType())
: MetadataProvider::GetActionMetadata(
platform, instruction.GetType());
for (std::size_t pNb = 0; pNb < instrInfos.parameters.size(); ++pNb) {
// The parameter has the searched type...
if (instrInfos.parameters[pNb].GetType() == parameterType) {
//...remember the value of the parameter.
if (objectName.empty() || lastObjectParameter == objectName)
results.insert(instruction.GetParameter(pNb).GetPlainString());
}
// Search in expressions
else if (ParameterMetadata::IsExpression(
"number", instrInfos.parameters[pNb].GetType()) ||
ParameterMetadata::IsExpression(
"string", instrInfos.parameters[pNb].GetType())) {
auto node = instruction.GetParameter(pNb).GetRootNode();
VariableFinderExpressionNodeWorker searcher(
results,
platform,
GetGlobalObjectsContainer(),
GetObjectsContainer(),
parameterType,
objectName);
node->Visit(searcher);
}
// Remember the value of the last "object" parameter.
else if (gd::ParameterMetadata::IsObject(
instrInfos.parameters[pNb].GetType())) {
lastObjectParameter =
instruction.GetParameter(pNb).GetPlainString();
}
}
}
};
private:
const gd::Platform &platform;
std::set<gd::String>& results; ///< Reference to the std::set where argument
///< values must be stored.
gd::String parameterType; ///< The type of the parameters to be searched for.
gd::String objectName; ///< If not empty, parameters will be taken into
///< account only if related to this object.
};
} // namespace
std::set<gd::String> EventsVariablesFinder::FindAllGlobalVariables(
const gd::Platform& platform, const gd::Project& project) {
std::set<gd::String> results;
for (std::size_t i = 0; i < project.GetLayoutsCount(); ++i) {
std::set<gd::String> results2 =
FindArgumentsInEventsAndDependencies(
FindArgumentsInEventsAndDependencies(
results,
platform,
project,
project.GetLayout(i),
"globalvar");
results.insert(results2.begin(), results2.end());
}
return results;
@@ -135,9 +212,12 @@ std::set<gd::String> EventsVariablesFinder::FindAllLayoutVariables(
const gd::Layout& layout) {
std::set<gd::String> results;
std::set<gd::String> results2 = FindArgumentsInEventsAndDependencies(
platform, project, layout, "scenevar");
results.insert(results2.begin(), results2.end());
FindArgumentsInEventsAndDependencies(
results,
platform,
project,
layout,
"scenevar");
return results;
}
@@ -149,159 +229,51 @@ std::set<gd::String> EventsVariablesFinder::FindAllObjectVariables(
const gd::Object& object) {
std::set<gd::String> results;
std::set<gd::String> results2 = FindArgumentsInEventsAndDependencies(
FindArgumentsInEventsAndDependencies(
results,
platform,
project,
layout,
"objectvar",
object.GetName());
results.insert(results2.begin(), results2.end());
return results;
}
std::set<gd::String> EventsVariablesFinder::FindArgumentsInInstructions(
const gd::Platform& platform,
const gd::Project& project,
const gd::Layout& layout,
const gd::InstructionsList& instructions,
bool instructionsAreConditions,
const gd::String& parameterType,
const gd::String& objectName) {
std::set<gd::String> results;
for (std::size_t aId = 0; aId < instructions.size(); ++aId) {
gd::String lastObjectParameter = "";
const gd::InstructionMetadata& instrInfos =
instructionsAreConditions ? MetadataProvider::GetConditionMetadata(
platform, instructions[aId].GetType())
: MetadataProvider::GetActionMetadata(
platform, instructions[aId].GetType());
for (std::size_t pNb = 0; pNb < instrInfos.parameters.size(); ++pNb) {
// The parameter has the searched type...
if (instrInfos.parameters[pNb].type == parameterType) {
//...remember the value of the parameter.
if (objectName.empty() || lastObjectParameter == objectName)
results.insert(instructions[aId].GetParameter(pNb).GetPlainString());
}
// Search in expressions
else if (ParameterMetadata::IsExpression(
"number", instrInfos.parameters[pNb].type) ||
ParameterMetadata::IsExpression(
"string", instrInfos.parameters[pNb].type)) {
auto node = instructions[aId].GetParameter(pNb).GetRootNode();
ExpressionParameterSearcher searcher(
platform,
project,
layout,
results,
parameterType,
objectName);
node->Visit(searcher);
}
// Remember the value of the last "object" parameter.
else if (gd::ParameterMetadata::IsObject(
instrInfos.parameters[pNb].type)) {
lastObjectParameter =
instructions[aId].GetParameter(pNb).GetPlainString();
}
}
if (!instructions[aId].GetSubInstructions().empty())
FindArgumentsInInstructions(platform,
project,
layout,
instructions[aId].GetSubInstructions(),
instructionsAreConditions,
parameterType);
}
return results;
}
std::set<gd::String> EventsVariablesFinder::FindArgumentsInEventsAndDependencies(
void EventsVariablesFinder::FindArgumentsInEventsAndDependencies(
std::set<gd::String>& results,
const gd::Platform& platform,
const gd::Project& project,
const gd::Layout& layout,
const gd::String& parameterType,
const gd::String& objectName) {
std::set<gd::String> results;
std::set<gd::String> results2 = FindArgumentsInEvents(
platform, project, layout, layout.GetEvents(), parameterType, objectName);
results.insert(results2.begin(), results2.end());
VariableFinderEventWorker eventWorker(results,
platform,
parameterType,
objectName);
eventWorker.Launch(layout.GetEvents(), project, layout);
DependenciesAnalyzer dependenciesAnalyzer = DependenciesAnalyzer(project, layout);
dependenciesAnalyzer.Analyze();
for (const gd::String& externalEventName : dependenciesAnalyzer.GetExternalEventsDependencies()) {
const gd::ExternalEvents& externalEvents = project.GetExternalEvents(externalEventName);
std::set<gd::String> results3 = FindArgumentsInEvents(
platform, project, layout, externalEvents.GetEvents(), parameterType, objectName);
results.insert(results3.begin(), results3.end());
VariableFinderEventWorker eventWorker(results,
platform,
parameterType,
objectName);
eventWorker.Launch(externalEvents.GetEvents(), project, layout);
}
for (const gd::String& sceneName : dependenciesAnalyzer.GetScenesDependencies()) {
const gd::Layout& dependencyLayout = project.GetLayout(sceneName);
std::set<gd::String> results3 = FindArgumentsInEvents(
platform, project, dependencyLayout, dependencyLayout.GetEvents(), parameterType, objectName);
results.insert(results3.begin(), results3.end());
VariableFinderEventWorker eventWorker(results,
platform,
parameterType,
objectName);
eventWorker.Launch(dependencyLayout.GetEvents(), project, dependencyLayout);
}
return results;
}
std::set<gd::String> EventsVariablesFinder::FindArgumentsInEvents(
const gd::Platform& platform,
const gd::Project& project,
const gd::Layout& layout,
const gd::EventsList& events,
const gd::String& parameterType,
const gd::String& objectName) {
std::set<gd::String> results;
for (std::size_t i = 0; i < events.size(); ++i) {
vector<const gd::InstructionsList*> conditionsVectors =
events[i].GetAllConditionsVectors();
for (std::size_t j = 0; j < conditionsVectors.size(); ++j) {
std::set<gd::String> results2 =
FindArgumentsInInstructions(platform,
project,
layout,
*conditionsVectors[j],
/*conditions=*/true,
parameterType,
objectName);
results.insert(results2.begin(), results2.end());
}
vector<const gd::InstructionsList*> actionsVectors =
events[i].GetAllActionsVectors();
for (std::size_t j = 0; j < actionsVectors.size(); ++j) {
std::set<gd::String> results2 =
FindArgumentsInInstructions(platform,
project,
layout,
*actionsVectors[j],
/*conditions=*/false,
parameterType,
objectName);
results.insert(results2.begin(), results2.end());
}
if (events[i].CanHaveSubEvents()) {
std::set<gd::String> results2 =
FindArgumentsInEvents(platform,
project,
layout,
events[i].GetSubEvents(),
parameterType,
objectName);
results.insert(results2.begin(), results2.end());
}
}
return results;
}
} // namespace gd

View File

@@ -23,7 +23,6 @@ namespace gd {
* \brief Perform a search over a project or a layout, searching for layout,
* global or object variables.
*
* \todo Refactor this class using ArbitraryEventsWorker
* \todo Rework this class to return the shapes (maybe even types?) of the
* variables (in particular for structures and arrays), so we can use this
* for better autocompletions in the variables dialogs in the IDE.
@@ -74,34 +73,13 @@ class EventsVariablesFinder {
const gd::Object& object);
private:
/**
* Construct a list of the value of the arguments for parameters of type @
* parameterType
*
* \param project The project used
* \param project The layout used
* \param instructions The instructions to be analyzed
* \param instructionsAreConditions True if the instructions are conditions.
* \param parameterType The parameters type to be analyzed
* \param objectName If not empty, parameters will be taken into account only
* if the last object parameter is filled with this value.
*
* \return A std::set filled with the values used for all parameters of the
* specified type
*/
static std::set<gd::String> FindArgumentsInInstructions(
const gd::Platform& platform,
const gd::Project& project,
const gd::Layout& layout,
const gd::InstructionsList& instructions,
bool instructionsAreConditions,
const gd::String& parameterType,
const gd::String& objectName = "");
/**
* Construct a list of the value of the arguments for parameters of type @
* parameterType. It searchs in events dependencies.
* parameterType. It searches in events dependencies.
*
* \param results A std::set to fill with the values used for all parameters of the
* specified type
* \param platform The platform of the project
* \param project The project used
* \param layout The layout used
@@ -110,40 +88,14 @@ class EventsVariablesFinder {
* \param objectName If not empty, parameters will be taken into account
* only if the last object parameter is filled with
* this value.
*
* \return A std::set filled with the values used for all parameters of the
* specified type
*/
static std::set<gd::String> FindArgumentsInEventsAndDependencies(
static void FindArgumentsInEventsAndDependencies(
std::set<gd::String>& results,
const gd::Platform& platform,
const gd::Project& project,
const gd::Layout& layout,
const gd::String& parameterType,
const gd::String& objectName = "");
/**
* Construct a list of the value of the arguments for parameters of type @
* parameterType. It doesn't search in events dependencies.
*
* \param platform The platform of the project
* \param project The project used
* \param layout The layout used
* \param events The events to be analyzed
* \param parameterType The parameters type to be analyzed
* \param objectName If not empty, parameters will be taken into account
* only if the last object parameter is filled with
* this value.
*
* \return A std::set filled with the values used for all parameters of the
* specified type
*/
static std::set<gd::String> FindArgumentsInEvents(
const gd::Platform& platform,
const gd::Project& project,
const gd::Layout& layout,
const gd::EventsList& events,
const gd::String& parameterType,
const gd::String& objectName);
};
} // namespace gd

View File

@@ -36,7 +36,7 @@ size_t GetMinimumParametersNumber(
size_t initialParameterIndex) {
size_t nb = 0;
for (std::size_t i = initialParameterIndex; i < parameters.size(); ++i) {
if (!parameters[i].optional && !parameters[i].codeOnly) nb++;
if (!parameters[i].IsOptional() && !parameters[i].codeOnly) nb++;
}
return nb;
@@ -77,24 +77,42 @@ ExpressionValidator::Type ExpressionValidator::ValidateFunction(const gd::Functi
MetadataProvider::GetBehaviorAnyExpressionMetadata(
platform, behaviorType, function.functionName);
if (!function.objectName.empty()) {
// 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);
Type returnType = StringToType(metadata.GetReturnType());
if (objectMetadata.IsUnsupportedBaseObjectCapability(
metadata.GetRequiredBaseObjectCapability())) {
RaiseTypeError(
_("This expression exists, but it can't be used on this object."),
function.objectNameLocation);
return StringToType(metadata.GetReturnType());
}
}
if (!function.objectName.empty() &&
!globalObjectsContainer.HasObjectNamed(function.objectName) &&
!globalObjectsContainer.GetObjectGroups().Has(function.objectName) &&
!objectsContainer.HasObjectNamed(function.objectName) &&
!objectsContainer.GetObjectGroups().Has(function.objectName)) {
RaiseTypeError(_("This object doesn't exist."),
function.objectNameLocation, /*isFatal=*/false);
return returnType;
}
Type returnType = StringToType(metadata.GetReturnType());
if (!function.behaviorName.empty() &&
!gd::HasBehaviorInObjectOrGroup(globalObjectsContainer, objectsContainer,
function.objectName,
function.behaviorName)) {
RaiseTypeError(_("This behavior is not attached to this object."),
function.behaviorNameLocation, /*isFatal=*/false);
return returnType;
}
if (!function.objectName.empty() &&
// If the function needs a capability on the object that may not be covered
// by all objects, check it now.
!metadata.GetRequiredBaseObjectCapability().empty()) {
const gd::ObjectMetadata &objectMetadata =
MetadataProvider::GetObjectMetadata(platform, objectType);
if (objectMetadata.IsUnsupportedBaseObjectCapability(
metadata.GetRequiredBaseObjectCapability())) {
RaiseTypeError(
_("This expression exists, but it can't be used on this object."),
function.objectNameLocation);
return returnType;
}
}
if (gd::MetadataProvider::IsBadExpressionMetadata(metadata)) {
RaiseError(
@@ -115,8 +133,8 @@ ExpressionValidator::Type ExpressionValidator::ValidateFunction(const gd::Functi
"number to a string."),
function.location);
return returnType;
}
else if (parentType != Type::Number && parentType != Type::NumberOrString) {
} else if (parentType != Type::Number &&
parentType != Type::NumberOrString) {
RaiseTypeError(_("You tried to use an expression that returns a "
"number, but another type is expected:") +
" " + TypeToString(parentType),
@@ -131,8 +149,8 @@ ExpressionValidator::Type ExpressionValidator::ValidateFunction(const gd::Functi
"string to a number."),
function.location);
return returnType;
}
else if (parentType != Type::String && parentType != Type::NumberOrString) {
} else if (parentType != Type::String &&
parentType != Type::NumberOrString) {
RaiseTypeError(_("You tried to use an expression that returns a "
"string, but another type is expected:") +
" " + TypeToString(parentType),
@@ -172,8 +190,7 @@ ExpressionValidator::Type ExpressionValidator::ValidateFunction(const gd::Functi
_("You have not entered enough parameters for the expression.") + " " +
expectedCountMessage,
function.location);
}
else {
} else {
RaiseError(
"extra_parameter",
_("This parameter was not expected by this expression. Remove it "
@@ -217,8 +234,7 @@ ExpressionValidator::Type ExpressionValidator::ValidateFunction(const gd::Functi
"parameter."),
parameter->location);
}
}
else if (gd::ParameterMetadata::IsObject(expectedParameterType)) {
} else if (gd::ParameterMetadata::IsObject(expectedParameterType)) {
if (dynamic_cast<IdentifierNode *>(parameter.get()) == nullptr) {
RaiseError(
"malformed_object_parameter",

View File

@@ -45,7 +45,7 @@ class GD_CORE_API ExpressionValidator : public ExpressionParser2NodeWorker {
/**
* \brief Helper function to check if a given node does not contain
* any error.
* any error including non-fatal ones.
*/
static bool HasNoErrors(const gd::Platform &platform,
const gd::ObjectsContainer &globalObjectsContainer,
@@ -54,16 +54,25 @@ class GD_CORE_API ExpressionValidator : public ExpressionParser2NodeWorker {
gd::ExpressionNode& node) {
gd::ExpressionValidator validator(platform, globalObjectsContainer, objectsContainer, rootType);
node.Visit(validator);
return validator.GetErrors().empty();
return validator.GetAllErrors().empty();
}
/**
* \brief Get only the fatal errors
*
* Expressions with fatal error can't be generated.
*/
const std::vector<ExpressionParserDiagnostic*>& GetFatalErrors() {
return fatalErrors;
};
/**
* \brief Get all the errors
*
* No errors means that the expression is valid.
*/
const std::vector<ExpressionParserDiagnostic*>& GetErrors() {
return errors;
const std::vector<ExpressionParserDiagnostic*>& GetAllErrors() {
return allErrors;
};
protected:
@@ -150,12 +159,29 @@ class GD_CORE_API ExpressionValidator : public ExpressionParser2NodeWorker {
void OnVisitNumberNode(NumberNode& node) override {
ReportAnyError(node);
childType = Type::Number;
CheckType(parentType, childType, node.location);
if (parentType == Type::String) {
RaiseTypeError(
_("You entered a number, but a text was expected (in quotes)."),
node.location);
} else if (parentType != Type::Number &&
parentType != Type::NumberOrString) {
RaiseTypeError(_("You entered a number, but this type was expected:") +
" " + TypeToString(parentType),
node.location);
}
}
void OnVisitTextNode(TextNode& node) override {
ReportAnyError(node);
childType = Type::String;
CheckType(parentType, childType, node.location);
if (parentType == Type::Number) {
RaiseTypeError(_("You entered a text, but a number was expected."),
node.location);
} else if (parentType != Type::String &&
parentType != Type::NumberOrString) {
RaiseTypeError(_("You entered a text, but this type was expected:") +
" " + TypeToString(parentType),
node.location);
}
}
void OnVisitVariableNode(VariableNode& node) override {
ReportAnyError(node);
@@ -163,7 +189,21 @@ class GD_CORE_API ExpressionValidator : public ExpressionParser2NodeWorker {
node.child->Visit(*this);
}
childType = Type::Variable;
CheckType(parentType, childType, node.location);
if (parentType == Type::String) {
RaiseTypeError(_("Variables must be surrounded by VariableString()."),
node.location);
} else if (parentType == Type::Number) {
RaiseTypeError(_("Variables must be surrounded by Variable()."),
node.location);
} else if (parentType == Type::NumberOrString) {
RaiseTypeError(
_("Variables must be surrounded by Variable() or VariableString()."),
node.location);
} else if (parentType != Type::Variable) {
RaiseTypeError(_("You entered a variable, but this type was expected:") +
" " + TypeToString(parentType),
node.location);
}
}
void OnVisitVariableAccessorNode(VariableAccessorNode& node) override {
ReportAnyError(node);
@@ -239,20 +279,26 @@ class GD_CORE_API ExpressionValidator : public ExpressionParser2NodeWorker {
enum Type {Unknown = 0, Number, String, NumberOrString, Variable, Object, Empty};
Type ValidateFunction(const gd::FunctionCallNode& function);
void ReportAnyError(const ExpressionNode& node) {
void ReportAnyError(const ExpressionNode& node, bool isFatal = true) {
if (node.diagnostic && node.diagnostic->IsError()) {
// Syntax errors are holden by the AST nodes.
// It's fine to give pointers on them as the AST live longer than errors
// handling.
errors.push_back(node.diagnostic.get());
allErrors.push_back(node.diagnostic.get());
if (isFatal) {
fatalErrors.push_back(node.diagnostic.get());
}
}
}
void RaiseError(const gd::String &type,
const gd::String &message, const ExpressionParserLocation &location) {
const gd::String &message, const ExpressionParserLocation &location, bool isFatal = true) {
auto diagnostic = gd::make_unique<ExpressionParserError>(
type, message, location);
errors.push_back(diagnostic.get());
allErrors.push_back(diagnostic.get());
if (isFatal) {
fatalErrors.push_back(diagnostic.get());
}
// Errors found by the validator are not holden by the AST nodes.
// They must be owned by the validator to keep living while errors are
// handled by the caller.
@@ -260,8 +306,8 @@ class GD_CORE_API ExpressionValidator : public ExpressionParser2NodeWorker {
}
void RaiseTypeError(
const gd::String &message, const ExpressionParserLocation &location) {
RaiseError("type_error", message, location);
const gd::String &message, const ExpressionParserLocation &location, bool isFatal = true) {
RaiseError("type_error", message, location, isFatal);
}
void RaiseOperatorError(
@@ -269,32 +315,6 @@ class GD_CORE_API ExpressionValidator : public ExpressionParser2NodeWorker {
RaiseError("invalid_operator", message, location);
}
void CheckType(Type expect, Type actual, const ExpressionParserLocation &location) {
if (actual == Type::String) {
if (expect == Type::Number) {
RaiseTypeError(_("You entered a text, but a number was expected."),
location);
}
else if (expect != Type::String && expect != Type::NumberOrString) {
RaiseTypeError(
_("You entered a text, but this type was expected:") + " " + TypeToString(expect),
location);
}
}
else if (actual == Type::Number) {
if (expect == Type::String) {
RaiseTypeError(
_("You entered a number, but a text was expected (in quotes)."),
location);
}
else if (expect != Type::Number && expect != Type::NumberOrString) {
RaiseTypeError(
_("You entered a number, but this type was expected:") + " " + TypeToString(expect),
location);
}
}
}
static Type StringToType(const gd::String &type);
static const gd::String &TypeToString(Type type);
static const gd::String unknownTypeString;
@@ -306,7 +326,8 @@ class GD_CORE_API ExpressionValidator : public ExpressionParser2NodeWorker {
static const gd::String identifierTypeString;
static const gd::String emptyTypeString;
std::vector<ExpressionParserDiagnostic*> errors;
std::vector<ExpressionParserDiagnostic*> fatalErrors;
std::vector<ExpressionParserDiagnostic*> allErrors;
std::vector<std::unique_ptr<ExpressionParserDiagnostic>> supplementalErrors;
Type childType;
Type parentType;

View File

@@ -78,13 +78,16 @@ class GD_CORE_API ExpressionParameterMover
void OnVisitObjectFunctionNameNode(ObjectFunctionNameNode& node) override {}
void OnVisitFunctionCallNode(FunctionCallNode& node) override {
auto moveParameter =
[this](std::vector<std::unique_ptr<gd::ExpressionNode>>& parameters) {
if (oldIndex >= parameters.size() || newIndex >= parameters.size())
[this](std::vector<std::unique_ptr<gd::ExpressionNode>>& parameters, int firstWrittenParameterIndex) {
size_t newExpressionIndex = newIndex - firstWrittenParameterIndex;
size_t oldExpressionIndex = oldIndex - firstWrittenParameterIndex;
if (oldExpressionIndex >= parameters.size() || newExpressionIndex >= parameters.size())
return;
auto movedParameterNode = std::move(parameters[oldIndex]);
parameters.erase(parameters.begin() + oldIndex);
parameters.insert(parameters.begin() + newIndex,
auto movedParameterNode = std::move(parameters[oldExpressionIndex]);
parameters.erase(parameters.begin() + oldExpressionIndex);
parameters.insert(parameters.begin() + newExpressionIndex,
std::move(movedParameterNode));
};
@@ -92,10 +95,13 @@ class GD_CORE_API ExpressionParameterMover
if (behaviorType.empty() && !objectType.empty() &&
!node.objectName.empty()) {
// Move parameter of an object function
// This refactor only applies on events object functions
// and events object functions doesn't exist yet.
// This is a dead code.
const gd::String& thisObjectType = gd::GetTypeOfObject(
globalObjectsContainer, objectsContainer, node.objectName);
if (thisObjectType == objectType) {
moveParameter(node.parameters);
moveParameter(node.parameters, 1);
hasDoneMoving = true;
}
} else if (!behaviorType.empty() && !node.behaviorName.empty()) {
@@ -103,12 +109,12 @@ class GD_CORE_API ExpressionParameterMover
const gd::String& thisBehaviorType = gd::GetTypeOfBehavior(
globalObjectsContainer, objectsContainer, node.behaviorName);
if (thisBehaviorType == behaviorType) {
moveParameter(node.parameters);
moveParameter(node.parameters, 2);
hasDoneMoving = true;
}
} else if (behaviorType.empty() && objectType.empty()) {
// Move parameter of a free function
moveParameter(node.parameters);
moveParameter(node.parameters, 1);
hasDoneMoving = true;
}
}
@@ -144,7 +150,7 @@ bool ExpressionsParameterMover::DoVisitInstruction(gd::Instruction& instruction,
for (std::size_t pNb = 0; pNb < metadata.parameters.size() &&
pNb < instruction.GetParametersCount();
++pNb) {
const gd::String& type = metadata.parameters[pNb].type;
const gd::String& type = metadata.parameters[pNb].GetType();
const gd::Expression& expression = instruction.GetParameter(pNb);
auto node = expression.GetRootNode();

View File

@@ -0,0 +1,24 @@
#include "InstructionsCountEvaluator.h"
#include "GDCore/Events/Instruction.h"
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/IDE/ProjectBrowserHelper.h"
namespace gd {
const int InstructionsCountEvaluator::ScanProject(gd::Project &project) {
InstructionsCountEvaluator worker(project);
gd::ProjectBrowserHelper::ExposeProjectEventsWithoutExtensions(project,
worker);
return worker.instructionCount;
};
// Instructions scanner
bool InstructionsCountEvaluator::DoVisitInstruction(
gd::Instruction &instruction, bool isCondition) {
instructionCount++;
return false;
}
} // namespace gd

View File

@@ -0,0 +1,50 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef GDCORE_INSTRUCTIONS_COUNT_EVALUATOR_H
#define GDCORE_INSTRUCTIONS_COUNT_EVALUATOR_H
#include <set>
#include "GDCore/Events/Parsers/ExpressionParser2NodeWorker.h"
#include "GDCore/IDE/Events/ArbitraryEventsWorker.h"
#include "GDCore/IDE/Project/ArbitraryObjectsWorker.h"
#include "GDCore/String.h"
namespace gd {
class Project;
class Object;
class Behavior;
} // namespace gd
namespace gd {
/**
* @brief Count the number of instructions in a project excluding extensions.
*
* This is used by the examples repository to evaluate examples size.
*
*/
class GD_CORE_API InstructionsCountEvaluator : public ArbitraryEventsWorker {
public:
/**
* Return the number of instructions in the project excluding extensions.
*/
static const int ScanProject(gd::Project &project);
private:
InstructionsCountEvaluator(gd::Project &project_)
: project(project_), instructionCount(0){};
gd::Project &project;
int instructionCount;
// Instructions Visitor
bool DoVisitInstruction(gd::Instruction &instruction,
bool isCondition) override;
};
}; // namespace gd
#endif

View File

@@ -0,0 +1,33 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#include "LinkEventTargetRenamer.h"
#include <map>
#include <memory>
#include <vector>
#include "GDCore/Events/Builtin/LinkEvent.h"
#include "GDCore/Events/Event.h"
#include "GDCore/Events/EventsList.h"
#include "GDCore/Project/Layout.h"
#include "GDCore/Project/Project.h"
#include "GDCore/String.h"
#include "GDCore/Tools/Log.h"
namespace gd {
bool LinkEventTargetRenamer::DoVisitLinkEvent(gd::LinkEvent &linkEvent) {
if (linkEvent.GetTarget() == oldName) {
linkEvent.SetTarget(newName);
}
return false;
}
LinkEventTargetRenamer::~LinkEventTargetRenamer() {}
} // namespace gd

View File

@@ -0,0 +1,44 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#pragma once
#include "GDCore/IDE/Events/ArbitraryEventsWorker.h"
#include "GDCore/String.h"
#include <map>
#include <memory>
#include <vector>
namespace gd {
class BaseEvent;
class LinkEvent;
class Platform;
class EventsList;
} // namespace gd
namespace gd {
/**
* \brief Replace in link events the name of external events.
*
* \ingroup IDE
*/
class GD_CORE_API LinkEventTargetRenamer
: public ArbitraryEventsWorkerWithContext {
public:
LinkEventTargetRenamer(const gd::Platform &platform_,
const gd::String &oldName_, const gd::String &newName_)
: platform(platform_), oldName(oldName_), newName(newName_){};
virtual ~LinkEventTargetRenamer();
private:
bool DoVisitLinkEvent(gd::LinkEvent &linkEvent) override;
const gd::Platform &platform;
gd::String oldName;
gd::String newName;
};
} // namespace gd

View File

@@ -0,0 +1,198 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#include "ProjectElementRenamer.h"
#include <map>
#include <memory>
#include <vector>
#include "GDCore/Events/Event.h"
#include "GDCore/Events/EventsList.h"
#include "GDCore/Events/Parsers/ExpressionParser2NodePrinter.h"
#include "GDCore/Events/Parsers/ExpressionParser2NodeWorker.h"
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
#include "GDCore/Extensions/Metadata/ParameterMetadataTools.h"
#include "GDCore/IDE/Events/ExpressionValidator.h"
#include "GDCore/Project/Layout.h"
#include "GDCore/Project/Project.h"
#include "GDCore/String.h"
#include "GDCore/Tools/Log.h"
namespace gd {
/**
* \brief Go through the nodes and find every function call parameter of a
* given type.
*
* \see gd::ExpressionParser2
*/
class GD_CORE_API ExpressionIdentifierStringFinder
: public ExpressionParser2NodeWorker {
public:
ExpressionIdentifierStringFinder(
const gd::Platform &platform_,
const gd::ObjectsContainer &globalObjectsContainer_,
const gd::ObjectsContainer &objectsContainer_,
const gd::String &expressionPlainString_,
const gd::String &parameterType_, const gd::String &objectName_,
const gd::String &layerName_, const gd::String &oldName_)
: platform(platform_), globalObjectsContainer(globalObjectsContainer_),
objectsContainer(objectsContainer_),
expressionPlainString(expressionPlainString_),
parameterType(parameterType_), objectName(objectName_),
layerName(layerName_), oldName(oldName_){};
virtual ~ExpressionIdentifierStringFinder(){};
const std::vector<gd::ExpressionParserLocation> GetOccurrences() const {
return occurrences;
}
protected:
void OnVisitSubExpressionNode(SubExpressionNode &node) override {
node.expression->Visit(*this);
}
void OnVisitOperatorNode(OperatorNode &node) override {
node.leftHandSide->Visit(*this);
node.rightHandSide->Visit(*this);
}
void OnVisitUnaryOperatorNode(UnaryOperatorNode &node) override {
node.factor->Visit(*this);
}
void OnVisitNumberNode(NumberNode &node) override {}
void OnVisitTextNode(TextNode &node) override {}
void OnVisitVariableNode(VariableNode &node) override {
if (node.child)
node.child->Visit(*this);
}
void OnVisitVariableAccessorNode(VariableAccessorNode &node) override {
if (node.child)
node.child->Visit(*this);
}
void OnVisitVariableBracketAccessorNode(
VariableBracketAccessorNode &node) override {
node.expression->Visit(*this);
if (node.child)
node.child->Visit(*this);
}
void OnVisitIdentifierNode(IdentifierNode &node) override {}
void OnVisitObjectFunctionNameNode(ObjectFunctionNameNode &node) override {}
void OnVisitFunctionCallNode(FunctionCallNode &node) override {
gd::String lastLayerName;
gd::ParameterMetadataTools::IterateOverParametersWithIndex(
platform, globalObjectsContainer, objectsContainer, node,
[&](const gd::ParameterMetadata &parameterMetadata,
std::unique_ptr<gd::ExpressionNode> &parameterNode,
size_t parameterIndex, const gd::String &lastObjectName) {
if (parameterMetadata.GetType() == "layer") {
// Remove quotes, it won't match if it's not a literal anyway.
lastLayerName = expressionPlainString.substr(
parameterNode->location.GetStartPosition() + 1,
parameterNode->location.GetEndPosition() -
parameterNode->location.GetStartPosition() - 2);
}
if (parameterMetadata.GetType() == parameterType) {
auto parameterExpressionPlainString = expressionPlainString.substr(
parameterNode->location.GetStartPosition(),
parameterNode->location.GetEndPosition() -
parameterNode->location.GetStartPosition());
if ((objectName.empty() || lastObjectName == objectName) &&
(layerName.empty() || lastLayerName == layerName) &&
parameterExpressionPlainString == "\"" + oldName + "\"") {
occurrences.push_back(parameterNode->location);
} else {
parameterNode->Visit(*this);
}
}
});
}
void OnVisitEmptyNode(EmptyNode &node) override {}
private:
const gd::Platform &platform;
const gd::ObjectsContainer &globalObjectsContainer;
const gd::ObjectsContainer &objectsContainer;
/// It's used to extract parameter content.
const gd::String &expressionPlainString;
const gd::String &oldName;
/// The type of parameter to check.
const gd::String parameterType;
/// If not empty, parameters will be taken into account only if related to
/// this object.
const gd::String objectName;
/// If not empty, parameters will be taken into account only if related to
/// this layer.
const gd::String layerName;
std::vector<gd::ExpressionParserLocation> occurrences;
};
bool ProjectElementRenamer::DoVisitInstruction(gd::Instruction &instruction,
bool isCondition) {
const auto &metadata = isCondition
? gd::MetadataProvider::GetConditionMetadata(
platform, instruction.GetType())
: gd::MetadataProvider::GetActionMetadata(
platform, instruction.GetType());
gd::String lastLayerName;
gd::ParameterMetadataTools::IterateOverParametersWithIndex(
instruction.GetParameters(), metadata.GetParameters(),
[&](const gd::ParameterMetadata &parameterMetadata,
const gd::Expression &parameterValue, size_t parameterIndex,
const gd::String &lastObjectName) {
if (parameterMetadata.GetType() == "layer") {
// Remove quotes, it won't match if it's not a literal anyway.
lastLayerName = parameterValue.GetPlainString().substr(
1, parameterValue.GetPlainString().length() - 2);
}
if (parameterMetadata.GetType() == parameterType &&
(objectName.empty() || lastObjectName == objectName) &&
(layerName.empty() || lastLayerName == layerName)) {
if (parameterValue.GetPlainString() == "\"" + oldName + "\"") {
instruction.SetParameter(parameterIndex,
gd::Expression("\"" + newName + "\""));
}
}
auto node = parameterValue.GetRootNode();
if (node) {
ExpressionIdentifierStringFinder finder(
platform, GetGlobalObjectsContainer(), GetObjectsContainer(),
parameterValue.GetPlainString(), parameterType, objectName,
layerName, oldName);
node->Visit(finder);
if (finder.GetOccurrences().size() > 0) {
gd::String newNameWithQuotes = "\"" + newName + "\"";
gd::String oldParameterValue = parameterValue.GetPlainString();
gd::String newParameterValue;
auto previousEndPosition = 0;
for (auto &&occurrenceLocation : finder.GetOccurrences()) {
newParameterValue += oldParameterValue.substr(
previousEndPosition,
occurrenceLocation.GetStartPosition() - previousEndPosition);
newParameterValue += newNameWithQuotes;
previousEndPosition = occurrenceLocation.GetEndPosition();
}
if (previousEndPosition < oldParameterValue.size()) {
newParameterValue += oldParameterValue.substr(
previousEndPosition,
oldParameterValue.size() - previousEndPosition);
}
instruction.SetParameter(parameterIndex,
gd::Expression(newParameterValue));
}
}
});
return false;
}
ProjectElementRenamer::~ProjectElementRenamer() {}
} // namespace gd

View File

@@ -0,0 +1,63 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#pragma once
#include "GDCore/IDE/Events/ArbitraryEventsWorker.h"
#include "GDCore/String.h"
#include <map>
#include <memory>
#include <vector>
namespace gd {
class BaseEvent;
class Platform;
class EventsList;
} // namespace gd
namespace gd {
/**
* \brief Replace in expressions and in parameters of actions or conditions
* occurrences of project element name. For instance, it can be layouts or
* object effects.
*
* \ingroup IDE
*/
class GD_CORE_API ProjectElementRenamer
: public ArbitraryEventsWorkerWithContext {
public:
ProjectElementRenamer(const gd::Platform &platform_,
const gd::String &parameterType_,
const gd::String &oldName_, const gd::String &newName_)
: platform(platform_), parameterType(parameterType_), oldName(oldName_),
newName(newName_){};
virtual ~ProjectElementRenamer();
void SetObjectConstraint(const gd::String &objectName_) {
objectName = objectName_;
}
void SetLayerConstraint(const gd::String &layerName_) {
layerName = layerName_;
}
private:
bool DoVisitInstruction(gd::Instruction &instruction,
bool isCondition) override;
const gd::Platform &platform;
const gd::String parameterType;
/// If not empty, parameters will be taken into account only if related to
/// this object.
gd::String objectName;
/// If not empty, parameters will be taken into account only if related to
/// this layer.
gd::String layerName;
const gd::String oldName;
const gd::String newName;
};
} // namespace gd

View File

@@ -2,39 +2,47 @@
#include "GDCore/Events/Instruction.h"
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
#include "GDCore/Extensions/Metadata/ParameterMetadataTools.h"
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/IDE/ProjectBrowserHelper.h"
#include "GDCore/IDE/WholeProjectRefactorer.h"
#include "GDCore/IDE/Events/ExpressionTypeFinder.h"
#include "GDCore/Project/BehaviorContent.h"
#include "GDCore/Project/Behavior.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Project/Project.h"
namespace gd {
std::set<gd::String> UsedExtensionsFinder::ScanProject(gd::Project& project) {
const UsedExtensionsResult UsedExtensionsFinder::ScanProject(gd::Project& project) {
UsedExtensionsFinder worker(project);
gd::WholeProjectRefactorer::ExposeProjectObjects(project, worker);
gd::WholeProjectRefactorer::ExposeProjectEvents(project, worker);
return worker.usedExtensions;
gd::ProjectBrowserHelper::ExposeProjectObjects(project, worker);
gd::ProjectBrowserHelper::ExposeProjectEvents(project, worker);
return worker.result;
};
// Objects scanner
void UsedExtensionsFinder::DoVisitObject(gd::Object& object) {
usedExtensions.insert(gd::MetadataProvider::GetExtensionAndObjectMetadata(
project.GetCurrentPlatform(), object.GetType())
.GetExtension()
.GetName());
void UsedExtensionsFinder::DoVisitObject(gd::Object &object) {
auto metadata = gd::MetadataProvider::GetExtensionAndObjectMetadata(
project.GetCurrentPlatform(), object.GetType());
result.GetUsedExtensions().insert(metadata.GetExtension().GetName());
for (auto &&includeFile : metadata.GetMetadata().includeFiles) {
result.GetUsedIncludeFiles().insert(includeFile);
}
};
// Behaviors scanner
void UsedExtensionsFinder::DoVisitBehavior(gd::BehaviorContent& behavior) {
usedExtensions.insert(
gd::MetadataProvider::GetExtensionAndBehaviorMetadata(
project.GetCurrentPlatform(), behavior.GetTypeName())
.GetExtension()
.GetName());
void UsedExtensionsFinder::DoVisitBehavior(gd::Behavior &behavior) {
auto metadata = gd::MetadataProvider::GetExtensionAndBehaviorMetadata(
project.GetCurrentPlatform(), behavior.GetTypeName());
result.GetUsedExtensions().insert(metadata.GetExtension().GetName());
for (auto &&includeFile : metadata.GetMetadata().includeFiles) {
result.GetUsedIncludeFiles().insert(includeFile);
}
for (auto &&includeFile : metadata.GetMetadata().requiredFiles) {
result.GetUsedRequiredFiles().insert(includeFile);
}
};
// Instructions scanner
@@ -46,29 +54,35 @@ bool UsedExtensionsFinder::DoVisitInstruction(gd::Instruction& instruction,
project.GetCurrentPlatform(), instruction.GetType())
: gd::MetadataProvider::GetExtensionAndActionMetadata(
project.GetCurrentPlatform(), instruction.GetType());
usedExtensions.insert(metadata.GetExtension().GetName());
result.GetUsedExtensions().insert(metadata.GetExtension().GetName());
for (auto&& includeFile : metadata.GetMetadata().GetIncludeFiles()) {
result.GetUsedIncludeFiles().insert(includeFile);
}
size_t i = 0;
for (auto expression : instruction.GetParameters()) {
const gd::String& parameterType =
metadata.GetMetadata().GetParameter(i).GetType();
i++;
gd::ParameterMetadataTools::IterateOverParameters(
instruction.GetParameters(),
metadata.GetMetadata().GetParameters(),
[this](const gd::ParameterMetadata& parameterMetadata,
const gd::Expression& parameterValue,
const gd::String& lastObjectName) {
const gd::String& parameterType = parameterMetadata.GetType();
if (gd::ParameterMetadata::IsExpression("string", parameterType)) {
rootType = "string";
expression.GetRootNode()->Visit(*this);
parameterValue.GetRootNode()->Visit(*this);
} else if (gd::ParameterMetadata::IsExpression("number", parameterType)) {
rootType = "number";
expression.GetRootNode()->Visit(*this);
parameterValue.GetRootNode()->Visit(*this);
} else if (gd::ParameterMetadata::IsExpression("variable", parameterType))
usedExtensions.insert("BuiltinVariables");
}
result.GetUsedExtensions().insert("BuiltinVariables");
});
return false;
}
// Expressions scanner
// Ignore litterals nodes
// Ignore literals nodes
void UsedExtensionsFinder::OnVisitNumberNode(NumberNode& node){};
void UsedExtensionsFinder::OnVisitTextNode(TextNode& node){};
@@ -93,31 +107,35 @@ void UsedExtensionsFinder::OnVisitUnaryOperatorNode(UnaryOperatorNode& node) {
// Add variable extension and visit sub-expressions on variable nodes
void UsedExtensionsFinder::OnVisitVariableNode(VariableNode& node) {
usedExtensions.insert("BuiltinVariables");
result.GetUsedExtensions().insert("BuiltinVariables");
if (node.child) node.child->Visit(*this);
};
void UsedExtensionsFinder::OnVisitVariableAccessorNode(
VariableAccessorNode& node) {
usedExtensions.insert("BuiltinVariables");
result.GetUsedExtensions().insert("BuiltinVariables");
if (node.child) node.child->Visit(*this);
};
void UsedExtensionsFinder::OnVisitVariableBracketAccessorNode(
VariableBracketAccessorNode& node) {
usedExtensions.insert("BuiltinVariables");
result.GetUsedExtensions().insert("BuiltinVariables");
node.expression->Visit(*this);
if (node.child) node.child->Visit(*this);
};
// Add extensions bound to Objects/Behaviors/Functions
void UsedExtensionsFinder::OnVisitIdentifierNode(IdentifierNode& node) {
auto type = gd::ExpressionTypeFinder::GetType(project.GetCurrentPlatform(), GetGlobalObjectsContainer(), GetObjectsContainer(), rootType, node);
void UsedExtensionsFinder::OnVisitIdentifierNode(IdentifierNode &node) {
auto type = gd::ExpressionTypeFinder::GetType(
project.GetCurrentPlatform(), GetGlobalObjectsContainer(),
GetObjectsContainer(), rootType, node);
if (gd::ParameterMetadata::IsObject(type)) {
usedExtensions.insert(gd::MetadataProvider::GetExtensionAndObjectMetadata(
project.GetCurrentPlatform(), node.identifierName)
.GetExtension()
.GetName());
auto metadata = gd::MetadataProvider::GetExtensionAndObjectMetadata(
project.GetCurrentPlatform(), node.identifierName);
result.GetUsedExtensions().insert(metadata.GetExtension().GetName());
for (auto &&includeFile : metadata.GetMetadata().includeFiles) {
result.GetUsedIncludeFiles().insert(includeFile);
}
}
};
@@ -138,7 +156,10 @@ void UsedExtensionsFinder::OnVisitFunctionCallNode(FunctionCallNode& node) {
return;
}
usedExtensions.insert(metadata.GetExtension().GetName());
result.GetUsedExtensions().insert(metadata.GetExtension().GetName());
for (auto&& includeFile : metadata.GetMetadata().GetIncludeFiles()) {
result.GetUsedIncludeFiles().insert(includeFile);
}
};
} // namespace gd

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