Compare commits

...

181 Commits

Author SHA1 Message Date
Florian Rival
2b40f57189 Fix Duration parameter of Vibrate action 2019-01-24 23:12:37 +00:00
Wend1go
fc3f8a945b Add actions for loading/saving files (raw or JSON) to Filesystem (#884) 2019-01-24 22:04:43 +00:00
Florian Rival
ed24871130 Fix crash in profiler when using a lot of nested groups 2019-01-23 22:12:49 +00:00
Florian Rival
e416fb0586 Merge branch 'master' of github.com:4ian/GDevelop 2019-01-23 21:52:45 +00:00
Florian Rival
5778131deb Improve debugger performance 2019-01-23 21:52:31 +00:00
Todor Imreorov
8e81f78596 Remember zoom/grid/window mask state for scenes and external layouts (#892) 2019-01-23 21:23:09 +00:00
Todor Imreorov
1abdcaf0c0 Warn user when renaming resource that it might break objects (#899) 2019-01-23 19:14:24 +00:00
Florian Rival
4af867ba3a Fix expression transforming structure variable to JSON 2019-01-23 17:47:15 +00:00
Todor Imreorov
f75c2297d7 Fix "Locate File" and related menu options after a resource is renamed (#898) 2019-01-22 19:28:47 +01:00
Florian Rival
72c4f88936 Add screen-shake and update downhill-bike-physics-demo example 2019-01-21 16:48:10 +01:00
Florian Rival
34bcfdfee7 Customize the style of markdown rendered text 2019-01-20 20:54:47 +00:00
Florian Rival
7e78d4de5a Display changelog when launching a new version for first time
* Also display changelog in AboutDialog
2019-01-20 20:54:47 +00:00
Bouh
971b7a2322 Prevent renaming elements with an already existing name in Project Manager (#888) 2019-01-19 17:44:07 +00:00
Todor Imreorov
9a95aabc87 Add --disable-update-check option to disable check for updates (#887) 2019-01-19 16:28:38 +00:00
Florian Rival
53dcfa1cbf Fix enabling/disabling alert messages 2019-01-18 17:45:20 +00:00
Florian Rival
0ed7ccfb72 Set shortcut to close project to Ctrl/Cmd+Shift+W 2019-01-17 17:31:15 +00:00
Florian Rival
0fcd5cbbb9 Bump newIDE version 2019-01-17 17:30:48 +00:00
Florian Rival
fb6b959636 Add downhill-bike-physics-demo example 2019-01-14 22:42:26 +00:00
Florian Rival
1d7f0f9f94 Fix Prettier 2019-01-14 21:54:34 +00:00
Florian Rival
4be527c18a Try to prevent any crash by catching any exception when setting window title 2019-01-14 21:47:03 +00:00
Florian Rival
5e770d460d Merge branch 'master' of github.com:4ian/GDevelop 2019-01-14 21:25:31 +00:00
Florian Rival
73daf0e940 Fix Facebook instant games needing a bundle configuration file 2019-01-14 21:25:22 +00:00
Franco Maciel
58d88835c5 Fix initial motors speed in actions of Physics2 behavior (#872) 2019-01-14 21:09:09 +00:00
Florian Rival
0aa66837d4 Fix login dialog not showing on top of export dialog
Fix #868
2019-01-14 11:29:02 +00:00
Florian Rival
11349086c7 Update all remaining examples from old Physics engine to Physics Engine 2.0 2019-01-13 23:36:29 +00:00
Zat
d3d636744e Fix wheel joint argument definitions (#871) 2019-01-13 22:10:50 +00:00
Bouh
5baf2d9735 Fix sentence a FB Instant Game action (#869) 2019-01-13 19:13:04 +00:00
Florian Rival
d0daf0b5a8 Update bouncing-ball-and-rope example with new Physics engine 2019-01-12 17:35:39 +00:00
Florian Rival
21841e0bce Add Ragdoll example 2019-01-12 17:06:35 +00:00
Florian Rival
417ab2ff3d Gray out the deprecated Physics Engine category in InstructionSelector 2019-01-11 20:04:24 +00:00
Florian Rival
caee5fdcc7 Change default name of Physics2 behavior 2019-01-11 19:48:25 +00:00
Florian Rival
1fbd58fa75 Change wording of the old Physics extension 2019-01-11 19:48:25 +00:00
Florian Rival
389deadac5 Also improve flow typing of Debugger Toolbar
Note that the way translations are done might be changed later, but
this is for reference if needed.
2019-01-11 19:48:25 +00:00
Florian Rival
7d52165a82 Add deprecation alert for instructions of old Physics engine 2019-01-11 19:48:25 +00:00
Florian Rival
5e3e7e25fc Fix opening of ExpressionSelector not showing the top with the search field 2019-01-10 08:35:08 +00:00
Florian Rival
56afb11e2c Hide object drop-down list after an object is selected 2019-01-10 08:26:07 +00:00
Florian Rival
b6a0cfef32 Fix linter warning 2019-01-10 08:10:17 +00:00
Florian Rival
37c3a6d38a Add explicit "OK" button in message box to fix issue on Linux
See #856
2019-01-10 08:07:55 +00:00
Zat
30f830589c Add expressions relative to body to Physics2 behavior (#854) 2019-01-09 09:26:31 +00:00
Florian Rival
5f8546c3b9 Avoid crash of the debugger with Particle Emitters
This is done by using _renderer as the name for the renderer property,
with an underscore, which is filtered by the debugger when the game
is dumped.
2019-01-06 22:59:21 +00:00
Zat
4c2997b2d9 Add missing Physics2Behavior expressions (#848) 2019-01-06 20:43:12 +00:00
Franco Maciel
2338b5bfd6 Use AABB to check if cursor is on object (#852) 2019-01-06 20:23:19 +00:00
Franco Maciel
8a07e9b6c5 Prevent crash with repeated and aligned vertices in Physics2 behavior (#850) 2019-01-06 17:26:43 +00:00
Florian Rival
61303c7cf9 Fix Prettier 2019-01-06 00:59:07 +00:00
Florian Rival
43eaf30750 Fix error in Flow typing in recent Flow versions 2019-01-05 19:01:30 +00:00
Florian Rival
db278485fc Improve Flow typing 2019-01-05 18:42:19 +00:00
Florian Rival
3f5b42dc90 Fix tests of InstructionOrExpressionSelector and make them more robust against changes 2019-01-05 18:38:55 +00:00
Florian Rival
cd285b5676 Display icons in the list of instructions or expressions 2019-01-05 18:11:47 +00:00
Franco Maciel
509ac8966e Prevent undefined vertices in Physics2 behaviors (#845) 2019-01-05 17:03:42 +00:00
Florian Rival
bda2a10b5f Improve Flow typing of InstructionOrExpressionSelector 2019-01-05 17:03:11 +00:00
Florian Rival
841e1a66b6 Fix updating shared properties of Physics2 2019-01-05 13:52:18 +00:00
Franco Maciel
3fc588b6e3 Add a new editor (with Polygon support) for Physics2 engine (#825)
* Physics editor and custom polygon support
* Add shape preview
* Dynamic dimension labels in function of the shape
* Add polygon editor
* Preview box, circle and edge
* Prevent invalid properties values
* Add BehaviorsEditorService
2019-01-05 12:28:45 +00:00
Florian Rival
50ebf6e5a2 Add support for creating objects in JS extensions + example 2019-01-05 12:03:24 +00:00
Florian Rival
cbe33d2bd1 Improve/fix mistakes in gdjs.TextRuntimeObject documentation 2019-01-03 22:45:24 +00:00
Florian Rival
8c8c297adb Make mouse button labels more accessible 2019-01-03 21:07:18 +00:00
Florian Rival
a8d927994b Change the mouse button labels in newIDE 2019-01-03 21:07:18 +00:00
Florian Rival
1fb3231f98 Use constants to represents button in the game engine 2019-01-03 21:07:18 +00:00
Bouh
70a58f1bd4 Fix Middle mouse button handling (#841) 2019-01-03 18:34:03 +00:00
Franco Maciel
302bcb718f Fix initial opacity undefined 2019-01-03 13:59:08 +00:00
Florian Rival
857c706f48 Add help link for PanelSprite object editor 2018-12-30 22:55:11 +01:00
Wend1go
5b5f91c1f9 Add example for screenshot extension (#835) 2018-12-30 21:54:15 +01:00
Wend1go
0652e19190 Brighten up Screenshot icons to better fit the dark theme (#834) 2018-12-30 11:34:25 +01:00
Wend1go
5feb4caa31 Add FileSystem extension (special path, file existence and creating directory) (#828) 2018-12-29 20:11:53 +01:00
Florian Rival
1cd5519b93 Fix snapshot tests 2018-12-29 20:08:56 +01:00
Florian Rival
96761c461d Adapt descriptions of storage actions to make clear that no files are written 2018-12-29 18:27:21 +01:00
Florian Rival
1a82663968 Add dismissable alerts to warn/help the user 2018-12-27 18:50:15 +01:00
Florian Rival
9111b56eb3 Add GetAngle/Get(X|Y)Velocity to top-down behavior 2018-12-27 16:53:44 +01:00
Florian Rival
d7f22bcf26 Update isometric-game example 2018-12-27 14:02:05 +01:00
Florian Rival
b9b0ed812d Update Platformer example 2018-12-27 12:03:00 +01:00
Florian Rival
6734644df4 Fix non prettified files 2018-12-27 12:00:51 +01:00
Florian Rival
ddeff6bfae Add shortcut to open Project Manager and focus search field when opening 2018-12-27 11:56:01 +01:00
Florian Rival
8f10eac512 Fix snapshot tests 2018-12-27 11:37:31 +01:00
Florian Rival
162524f779 Automatically close project manager after opening functions 2018-12-27 11:19:32 +01:00
Wend1go
1da347b08b Add Screenshot extension (for games running on Windows/macOS/Linux) (#806)
* Add functionality to take screenshots, when running on Electron.
2018-12-27 11:07:42 +01:00
Florian Rival
01b7f81507 Fix regression on rounding of platformer object X position and skeleton collision 2018-12-26 23:22:10 +01:00
Florian Rival
5a3d2cc2b9 Reduce iterations of polygon benchmark 2018-12-26 23:22:10 +01:00
Florian Rival
cb659eee6d Add pixel-perfect-platform-engine and update other examples 2018-12-26 23:22:10 +01:00
Florian Rival
0f24410a2e Fix platform engine 1-pixel offset bug
* "Bug" is fixed by ignoring edges when doing collision tests for
the platform engine.
* Also add an option to round coordinates and ensure pixel-perfect
alignement of characters on platforms (on by default)
* Also add an optional parameter to ignore edges when
doing a collision test (or when separating objects)
2018-12-26 23:22:10 +01:00
Todor Imreorov
a31ea1475d Add button to choose a new file for a resource in ResourcePropertiesEditor (#822) 2018-12-26 17:55:59 +01:00
Todor Imreorov
0cecf685ca Autoclose project manager when opening an editor (#826) 2018-12-26 14:36:49 +01:00
Florian Rival
f39af51fda Add benchmark for polygon collision test and add test runner for Firefox 2018-12-26 13:45:45 +01:00
Florian Rival
704eaacc7e Enable back all GDJS tests 2018-12-26 12:52:51 +01:00
Florian Rival
1f7bec0ff1 Add option to set scale mode ("sampling") of the game to nearest ("pixel-perfect") 2018-12-25 23:27:09 +01:00
Florian Rival
69ffa45ea9 Fix touch/mouse handling regression 2018-12-25 21:37:11 +01:00
Florian Rival
2558052a61 Fix visual artifacts when rendering rescaled games.
Artifacts where visible on rescaled games, especially when canvas
was small and the game pixel perfect. This was due to changing
Pixi renderer size instead of scaling the canvas.

For a perfect "pixel perfect" rendering, "image-rendering: pixelated"
would be needed on the canvas (to be added as a game settings)
(see for instance: https://gablaxian.com/articles/creating-a-game-with-javascript/scaling-the-canvas)
2018-12-25 18:15:27 +01:00
Florian Rival
abf40200cb Fix prettier for ExamplesInformation.js (auto-generated file) 2018-12-24 19:36:27 +01:00
Florian Rival
2fd4459364 Add 2 example for the new Physics Engine 2018-12-24 18:34:10 +01:00
Florian Rival
2ed9088b58 Fix lint warnings 2018-12-24 18:02:39 +01:00
Florian Rival
f69b9132ad Add test case for JSON array with numbers 2018-12-24 14:02:58 +01:00
Franco Maciel
fb7d3d589d Fix LShift key code (#823) 2018-12-24 13:19:08 +01:00
Franco Maciel
87acba5105 Fix JSON array parser separators (#819) 2018-12-23 19:17:36 +01:00
Franco Maciel
2d314ff51b Add New physics behavior (Physics2) (#775) 2018-12-23 00:15:25 +01:00
Florian Rival
5054678193 Fix functions list rendering and always shown functions in project manager 2018-12-22 23:44:25 +01:00
Todor Imreorov
aaf9d318a9 Add error color to resources with missing files (#818) 2018-12-22 22:52:34 +01:00
Florian Rival
cc92445d4c Update READMEs with more links/information/commands 2018-12-22 16:39:19 +01:00
Florian Rival
1649591442 Add check-format to check non prettified files and add it to TravisCI 2018-12-22 12:09:04 +01:00
Florian Rival
77faff3919 Upgrade Prettier and run Prettier on newIDE/app/src to fix some files 2018-12-22 11:41:50 +01:00
Florian Rival
873280d818 Fix tests after libGD.js update 2018-12-22 00:05:21 +01:00
Florian Rival
238b6a2a09 Fix un/serialization of JSON arrays by gd::Serializer 2018-12-21 21:02:13 +01:00
Florian Rival
98d0d5102e Bump newIDE version 2018-12-20 22:05:25 +00:00
Florian Rival
47818846e7 Fix Jfxr not opening 2018-12-20 21:56:27 +00:00
Florian Rival
8276eda243 Bump newIDE version 2018-12-20 17:51:36 +00:00
Todor Imreorov
ca2e00bd91 Add input for setting FPS for animation playback speed (#814) 2018-12-20 16:08:44 +00:00
Franco Maciel
6177b0197e Don't load AdMob ads if already loading/showing (#817) 2018-12-19 15:20:04 +00:00
Florian Rival
fb65b56cb7 Remove Submit Your Example button from web-app 2018-12-18 08:46:26 +00:00
Todor Imreorov
6f780f79e9 Add field to change time between frames to AnimationPreview (#811) 2018-12-18 08:44:29 +00:00
Florian Rival
d31f0793d5 Set default time between frames to 0.08 2018-12-18 08:14:20 +00:00
Todor Imreorov
88c88ad1eb Add menu item to remove all resources with invalid paths (#812) 2018-12-17 21:25:39 +00:00
Franco Maciel
4202e2672d Add actions to set Sprite size in pixels (#808) 2018-12-17 16:45:47 +00:00
Florian Rival
f29cc503bf Fix version number not properly applied to Android/Cordova builds
Fix #804
2018-12-16 13:58:26 +00:00
Florian Rival
1aa81949ce Fix AdMob extension not loaded in web-app 2018-12-16 12:56:30 +00:00
Florian Rival
4593f09131 Fix empty menu options shown in scene editor context menu 2018-12-16 12:49:47 +00:00
Florian Rival
782ea0e0af Fix right click in CodeEditor that could trigger the event context menu 2018-12-16 12:42:17 +00:00
Florian Rival
8e893e660b Add hint text on ObjectSelector 2018-12-16 12:28:51 +00:00
Florian Rival
384346c54e Fix horizontal scrollbar displayed in events + prettify EventsSheet.css 2018-12-16 12:25:04 +00:00
Florian Rival
df3920cce3 Fix link to help page for mouse action/conditions 2018-12-16 12:17:29 +00:00
Florian Rival
6e9ff4b682 Bump newIDE version 2018-12-11 21:26:07 +00:00
Todor Imreorov
df161c48fd Fix Piskel loading (#795)
Fix #792
2018-12-11 21:21:11 +00:00
Florian Rival
ee6a337e71 Bump the GDJS version used for web-app 2018-12-11 00:23:20 +00:00
Florian Rival
d5146a0c65 Bump newIDE version 2018-12-10 23:37:13 +00:00
Florian Rival
eae4683c4f Add plane-and-clouds and bouncing-ball-and-rope examples 2018-12-10 23:34:28 +00:00
Florian Rival
dec96a2f3a Add condition to check if Facebook Instant Games ads are supported 2018-12-10 23:22:44 +00:00
Florian Rival
9610eeb6e5 Add support for interstitial and reward video in Facebook Instant Games 2018-12-10 23:12:03 +00:00
Todor Imreorov
213cd0a8c7 Add options to locate/open/copy path of a resource in ResourcesList 2018-12-10 20:59:28 +00:00
Todor Imreorov
8a117c1813 Add support for Piskel layers (+scan/remove unused font/audio) (#731)
* Layers are stored as resource metadata (for single frame) or Direction metadata (for more than one frame). If metadata is detected, use it to load the frames with layers
* Add options to scan for fonts and remove unused audio and fonts.
2018-12-05 16:32:10 +00:00
Franco Maciel
73ff10bb1f Fix issue with draggable behavior when object is deleted while dragging (#779) 2018-12-01 15:40:39 +00:00
Franco Maciel
300efbbd5c Update forces pre-events, fixing issues like offsets in positioning (#776) 2018-11-30 19:18:30 +00:00
Florian Rival
2e240643a2 Make access to variables 50% faster 2018-11-28 23:12:07 +00:00
Florian Rival
aa16e90aac Fix potential memory corruption with JsCodeEvent (in GDevelop.js) 2018-11-28 22:15:58 +00:00
Florian Rival
137ffc2b84 Optimize and rename clearing to multiplier in gdjs.Force 2018-11-28 21:41:11 +00:00
Florian Rival
34b460e968 Fix typo 2018-11-28 21:41:11 +00:00
Florian Rival
30cb0bcfb3 Add forceMultiplier parameter type and add specific field for it in parameters 2018-11-28 21:41:11 +00:00
Florian Rival
1b7a667c79 Improve description of opacity and other actions/conditions 2018-11-25 19:55:20 +01:00
Florian Rival
9a4655eefc Improve conditions/actions to explain that opacity is in 0-255 range 2018-11-25 19:48:46 +01:00
Florian Rival
ca9a0d3d37 Prevent time between frames to be set too low or to 0 in SpriteEditor 2018-11-25 19:38:29 +01:00
Florian Rival
10d8d6c4a8 Make explicit when scene variables are being used in conditions/actions 2018-11-25 19:24:30 +01:00
Florian Rival
a7f4da8e40 Merge branch 'master' of github.com:4ian/GDevelop 2018-11-25 14:21:21 +01:00
Wend1go
40b3c688d1 Add 400% zoom option to scene editor (#768)
Ideal for pixelart games with 16x16px sprites
2018-11-25 14:15:52 +01:00
Florian Rival
fc340b9477 Add ColorExpressionField 2018-11-23 17:59:39 +00:00
Florian Rival
cc810b3e9f Fix empty icons in Cordova config.xml resulting in build failure 2018-11-21 22:25:06 +00:00
Florian Rival
7d165660a5 Fix rendering of ShapePainterRuntimeObject with absolute coordinates when far from camera
Fix #750
2018-11-21 00:31:37 +00:00
Florian Rival
8d35bbbfdf Update package-lock for electron-app 2018-11-19 23:47:28 +00:00
Florian Rival
8ebff3c15e Bump newIDE version 2018-11-19 23:41:03 +00:00
Florian Rival
a00fff9376 Upgrade to Electron 3.0.9 (#754) 2018-11-19 23:39:08 +00:00
Florian Rival
32f56f3366 Fix typo 2018-11-19 09:36:34 +00:00
Florian Rival
09eab9eb46 Fix ShapePainter hitboxes/aabb not updated when moved 2018-11-17 19:10:57 +00:00
Florian Rival
9fe379d073 Make games exported on Android fullscreen 2018-11-17 15:07:19 +00:00
Florian Rival
f21fbd9871 Fix typo 2018-11-15 10:52:22 +00:00
Oneoeigh
f38dfd1211 Improving wording in README.md (#743)
Slight changes to make it easier to understand
2018-11-14 00:30:10 +00:00
Florian Rival
eefc656d49 Add support for adding filter to icons on themes 2018-11-14 00:12:16 +00:00
Florian Rival
1490b34650 Update link to download libGD.js 2018-11-13 23:54:24 +00:00
Florian Rival
ff496c65a5 Merge pull request #742 from 4ian/feature/font-resource
Rework fonts loading
2018-11-13 23:33:18 +00:00
Florian Rival
e9a3e801f7 Update gdjs.FontManager to support files for Cocos2d-JS 2018-11-13 23:24:49 +00:00
Florian Rival
4f8401ab1a Update PixiResourcesLoader to handle font resource in editor 2018-11-13 22:45:38 +00:00
Florian Rival
871b01124f Refactor ResourcesInUseHelper and TextObject for exposing fonts 2018-11-13 22:13:40 +00:00
Florian Rival
45d2844d8b Add FontResource and rework loading to ensure all fonts are properly loaded
* Add FontManager to the game engine, used to load and get access to loaded fonts.
* Use fontfaceobserver library to detect when a font is loaded.
* Add FontResource as a resource, like AudioResource.
* Update the TextEditor to use a selector for fonts.
* Refactor ResourceSelector floating label text
2018-11-12 23:45:01 +00:00
Florian Rival
566517320d Increase benchmarks timeout to avoid timeout on CI 2018-11-11 22:08:34 +00:00
Florian Rival
15773bca85 Fix unserialization of metadata of Direction 2018-11-11 21:10:42 +00:00
Florian Rival
a48d7017ea Bump newIDE version 2018-11-08 22:15:09 +00:00
Florian Rival
7d1f52ded4 Fix tests broken since AdMobObject extension was removed 2018-11-05 18:58:32 +00:00
Florian Rival
569adc1500 Fix ReosurcesMergingHelper wrongly modifing extensions of files having filename conflicts during export 2018-11-05 18:52:23 +00:00
Florian Rival
e6eb193e8e Add Get/SetMetadata to Sprite's Direction 2018-11-05 16:36:54 +00:00
Florian Rival
b8c63dade1 Add jfxr-editor to the list of git ignored folder 2018-11-05 16:36:11 +00:00
Todor Imreorov
82f92d36f1 Replace Jsfx by Jfxr sound effects generator (#716)
Jfxr yields better results and has a better interface
2018-11-03 21:40:15 +00:00
Florian Rival
6b17c1febd Add new example for the AdMob extension 2018-10-31 23:45:10 +00:00
Florian Rival
95882d1289 Remove AdMobObject extension (replaced by AdMob extension) 2018-10-31 23:11:04 +00:00
Florian Rival
70340bba7f Fix typo and floating label 2018-10-31 22:05:55 +00:00
Florian Rival
c809be9a07 Fix cordova version for AdMob extension 2018-10-31 22:05:37 +00:00
Franco Maciel
cc7b0f524e Add a new AdMob extension (#702)
* Add AdMob application ID to the project
* Export AdMob application ID with Cordova
* Switch to cordova-plugin-admob-free
* Add banners and interstitials support
2018-10-31 00:08:43 +00:00
Florian Rival
a61784bb6c Add validation for function parameters names 2018-10-28 06:41:09 -07:00
Florian Rival
3f92fc2ee5 Add support for key and mouse parameters in functions 2018-10-28 06:41:09 -07:00
Florian Rival
a4c08305c7 Improve UI of function parameters 2018-10-28 06:41:09 -07:00
Florian Rival
067798ff2c Fix EventsSheet toolbar buttons when navigating between functions 2018-10-28 06:41:09 -07:00
Florian Rival
7a838fc8f9 Refactor GDJS benchmarks 2018-10-28 06:41:09 -07:00
Florian Rival
e669190ca2 Add commented lines that can be uncomment to display debug draw 2018-10-28 06:41:09 -07:00
Florian Rival
b84bb8630a Improve accuracy/performance of various computations and add benchmarks
Add tests for gdjs.Force
Add tests for gdjs.Layer
2018-10-28 06:41:09 -07:00
Florian Rival
fb849be246 Fix AABB computation for rotate objects
AABB was not properly computed for rotated objects or objects
with a non default center/origin. This could create issues while checking
collisions and for behaviors/logic relying on spatial hashing (platformer,
pathfinding).

* Add benchmark to compare the speed of the implementation for non rotated object
(simple/faster) and for rotated objects (always exact but 12-15% slower).
* Add a method to render AABB of objects to ease debugging.
* Also add a test game.
* Add tests for AABB
* Add tests for getHitboxes for gdjs.SpriteRuntimeObject
2018-10-28 06:41:09 -07:00
Florian Rival
382aa0f086 Bump newIDE version 2018-10-22 22:43:31 +01:00
Florian Rival
303873974c Improve grammar/wording/typos in SubscriptionDetails 2018-10-22 22:18:47 +01:00
Florian Rival
9f0ec46064 Fix GetArgumentAsString (and fix test game using it) 2018-10-22 22:03:32 +01:00
Wend1go
9b2fa5d080 Fix typos/grammer (#710) (#713)
Thanks to @ValiantCuriosity (See #710)
2018-10-22 21:38:57 +01:00
763 changed files with 133731 additions and 25383 deletions

View File

@@ -69,6 +69,7 @@ script:
- cd newIDE/app
- npm test
- npm run flow
- npm run check-format
- cd ../..
#GDJS game engine tests, disabled on Travis CI because ChromeHeadless can't be started.
#See them running on Semaphore-CI instead: https://semaphoreci.com/4ian/gd

View File

@@ -97,6 +97,7 @@
// Support for Flowtype:
"javascript.validate.enable": false,
"flow.useNPMPackagedFlow": true,
"flow.useLSP": false, // As we are in a monorepo, see https://github.com/flowtype/flow-for-vscode/issues/301
// Clang format styling (duplicated in scripts/CMakeClangUtils.txt)
"C_Cpp.clang_format_style": "{BasedOnStyle: Google, BinPackParameters: false, BinPackArguments: false}"

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 722 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 935 B

View File

@@ -0,0 +1,194 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 31.999999 32.000001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="filesystem_create_folder.svg"
inkscape:export-filename="/home/matthias/Programme/GD_MyFork/GDevelop/Binaries/Output/Release_Windows/JsPlatform/Extensions/create_folder16.png"
inkscape:export-xdpi="45"
inkscape:export-ydpi="45">
<defs
id="defs4">
<inkscape:path-effect
effect="skeletal"
id="path-effect6855"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect6842"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect4583"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4234"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#617da1;fill-opacity:1;fill-rule:evenodd;stroke:#617da1;stroke-width:1pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4231"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(0.8,0,0,0.8,10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.919596"
inkscape:cx="-14.99721"
inkscape:cy="14.343353"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="false"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:window-width="1920"
inkscape:window-height="1026"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="false"
inkscape:object-nodes="false"
inkscape:snap-smooth-nodes="false"
inkscape:snap-midpoints="false"
inkscape:snap-nodes="true"
units="px">
<inkscape:grid
type="xygrid"
id="grid6838" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="bg"
inkscape:groupmode="layer"
id="layer1"
style="opacity:0"
sodipodi:insensitive="true"
transform="translate(0,-1020.3622)">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.48900003;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5d3b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4136"
width="537.14288"
height="537.14288"
x="108.57143"
y="232.3622"
ry="0" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="vg"
transform="translate(0,-1020.3622)">
<path
style="opacity:1;fill:#80bbdb;fill-opacity:1;fill-rule:nonzero;stroke:#548dad;stroke-width:0.97142506;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 10.44448,1025.9309 c 0.65513,0 1.18165,0.5595 1.18165,1.2556 l 0,1.2733 16.256617,0 c 1.376723,0 2.484776,1.1774 2.484776,2.6403 l 0,13.0531 c 0,1.4629 -1.108053,2.6403 -2.484776,2.6403 l -23.7654964,0 c -1.3767228,0 -2.4847757,-1.1774 -2.4847757,-2.6403 l 0,-10.7551 0,-2.298 0,-3.9136 c 0,-0.6961 0.5265186,-1.2556 1.1816486,-1.2556 z"
id="rect4901"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sscssssssccsss" />
<path
style="opacity:1;fill:#5fa1c7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 2.1084458,1031.4784 0,0.7321 0,11.4039 c 0,1.5514 1.0713447,2.7998 2.4024592,2.7998 l 22.978188,0 c 1.331114,0 2.40246,-1.2484 2.40246,-2.7998 l 0,-12.136 -27.7831072,0 z"
id="path4919"
inkscape:connector-curvature="0" />
<path
sodipodi:type="star"
style="opacity:1;fill:#d9db30;fill-opacity:1;fill-rule:nonzero;stroke:#bec021;stroke-width:1.38540256;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4939"
sodipodi:sides="5"
sodipodi:cx="24.252151"
sodipodi:cy="1028.8562"
sodipodi:r1="7.8899426"
sodipodi:r2="3.9449718"
sodipodi:arg1="0.79249024"
sodipodi:arg2="1.4208088"
inkscape:flatsided="false"
inkscape:rounded="0"
inkscape:randomized="0"
d="m 29.791477,1034.4747 -4.949845,-1.7178 -4.221206,3.1037 0.104117,-5.2384 -4.256247,-3.0555 5.014193,-1.5197 1.590701,-4.9922 2.994825,4.2992 5.239353,-0.03 -3.163289,4.1767 z"
inkscape:transform-center-x="0.36431952"
inkscape:transform-center-y="-0.39846334" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 771 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 944 B

View File

@@ -0,0 +1,206 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 31.999999 32.000001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="filesystem_file_delete.svg"
inkscape:export-filename="/home/matthias/Programme/GD_MyFork/GDevelop/Binaries/Output/Release_Windows/JsPlatform/Extensions/filesystem_file_delete32.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs4">
<inkscape:path-effect
effect="skeletal"
id="path-effect6855"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect6842"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect4583"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4234"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#617da1;fill-opacity:1;fill-rule:evenodd;stroke:#617da1;stroke-width:1pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4231"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(0.8,0,0,0.8,10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="56.026486"
inkscape:cy="-2.8092946"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="false"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:window-width="1920"
inkscape:window-height="1026"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="false"
inkscape:object-nodes="false"
inkscape:snap-smooth-nodes="false"
inkscape:snap-midpoints="false"
inkscape:snap-nodes="true"
units="px"
inkscape:snap-grids="false">
<inkscape:grid
type="xygrid"
id="grid6838" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="bg"
inkscape:groupmode="layer"
id="layer1"
style="opacity:0"
sodipodi:insensitive="true"
transform="translate(0,-1020.3622)">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.48900003;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5d3b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4136"
width="537.14288"
height="537.14288"
x="108.57143"
y="232.3622"
ry="0" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="vg"
transform="translate(0,-1020.3622)">
<g
id="g4225"
transform="matrix(1.1128183,0,0,1.1128183,55.344213,-128.05315)">
<path
id="rect4177"
transform="translate(-9.5367432e-7,1020.3622)"
d="m -43.681641,13.882812 c -0.563451,0 -1.017578,0.452174 -1.017578,1.015626 l 0,22.210937 c 0,0.563451 0.454127,1.015625 1.017578,1.015625 l 16.652344,0 c 0.563451,0 1.017578,-0.452174 1.017578,-1.015625 l 0,-15.246094 -6.05664,-7.980469 -11.613282,0 z"
style="opacity:1;fill:#fcfdf1;fill-opacity:1;fill-rule:nonzero;stroke:#6e6f5e;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path4218"
d="m -31.837816,1034.2449 0,7.043 c 0,0.3498 0.283047,0.6328 0.632812,0.6328 l 5.19336,0 -5.826172,-7.6758 z"
style="opacity:1;fill:#fcfdf1;fill-opacity:1;fill-rule:nonzero;stroke:#6e6f5e;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<rect
style="opacity:1;fill:#a6a6a6;fill-opacity:1;fill-rule:nonzero;stroke:#5a5a5a;stroke-width:0.99999934;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4158"
width="8.9121208"
height="8.7162371"
x="10.293939"
y="1038.0229" />
<rect
style="opacity:1;fill:#a6a6a6;fill-opacity:1;fill-rule:nonzero;stroke:#5a5a5a;stroke-width:0.99999934;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4160"
width="8.9631233"
height="2.6948419"
x="-516.44586"
y="897.6803"
inkscape:transform-center-x="-3.1829089"
inkscape:transform-center-y="-3.4427076"
transform="matrix(0.86246101,-0.50612351,0.50612351,0.86246101,0,0)" />
<rect
y="1044.6921"
x="8.1238213"
height="1.985044"
width="2.0916421"
id="rect4162"
style="opacity:1;fill:#a6a6a6;fill-opacity:1;fill-rule:nonzero;stroke:#5a5a5a;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 556 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 741 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 974 B

View File

@@ -0,0 +1,181 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 31.999999 32.000001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="filesystem_file.svg"
inkscape:export-filename="/home/matthias/Programme/GD_MyFork/GDevelop/Binaries/Output/Release_Windows/JsPlatform/Extensions/filesystem_file16.png"
inkscape:export-xdpi="45"
inkscape:export-ydpi="45">
<defs
id="defs4">
<inkscape:path-effect
effect="skeletal"
id="path-effect6855"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect6842"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect4583"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4234"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#617da1;fill-opacity:1;fill-rule:evenodd;stroke:#617da1;stroke-width:1pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4231"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(0.8,0,0,0.8,10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="3.959798"
inkscape:cx="-51.539982"
inkscape:cy="23.000437"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="false"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:window-width="1920"
inkscape:window-height="1026"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="false"
inkscape:object-nodes="false"
inkscape:snap-smooth-nodes="false"
inkscape:snap-midpoints="false"
inkscape:snap-nodes="true"
units="px">
<inkscape:grid
type="xygrid"
id="grid6838" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="bg"
inkscape:groupmode="layer"
id="layer1"
style="opacity:0"
sodipodi:insensitive="true"
transform="translate(0,-1020.3622)">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.48900003;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5d3b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4136"
width="537.14288"
height="537.14288"
x="108.57143"
y="232.3622"
ry="0" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="vg"
transform="translate(0,-1020.3622)">
<g
id="g4225"
transform="matrix(1.1128183,0,0,1.1128183,55.344213,-128.05315)">
<path
id="rect4177"
transform="translate(-9.5367432e-7,1020.3622)"
d="m -43.681641,13.882812 c -0.563451,0 -1.017578,0.452174 -1.017578,1.015626 l 0,22.210937 c 0,0.563451 0.454127,1.015625 1.017578,1.015625 l 16.652344,0 c 0.563451,0 1.017578,-0.452174 1.017578,-1.015625 l 0,-15.246094 -6.05664,-7.980469 -11.613282,0 z"
style="opacity:1;fill:#fcfdf1;fill-opacity:1;fill-rule:nonzero;stroke:#6e6f5e;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path4218"
d="m -31.837816,1034.2449 0,7.043 c 0,0.3498 0.283047,0.6328 0.632812,0.6328 l 5.19336,0 -5.826172,-7.6758 z"
style="opacity:1;fill:#fcfdf1;fill-opacity:1;fill-rule:nonzero;stroke:#6e6f5e;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 482 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 612 B

View File

@@ -0,0 +1,177 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 31.999999 32.000001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="filesystem_folder.svg"
inkscape:export-filename="/home/matthias/Programme/GD_MyFork/GDevelop/Binaries/Output/Release_Windows/JsPlatform/Extensions/filesystem_folder16.png"
inkscape:export-xdpi="45"
inkscape:export-ydpi="45">
<defs
id="defs4">
<inkscape:path-effect
effect="skeletal"
id="path-effect6855"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect6842"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect4583"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4234"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#617da1;fill-opacity:1;fill-rule:evenodd;stroke:#617da1;stroke-width:1pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4231"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(0.8,0,0,0.8,10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.919596"
inkscape:cx="3.5385856"
inkscape:cy="13.013876"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="false"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:window-width="1920"
inkscape:window-height="1026"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="false"
inkscape:object-nodes="false"
inkscape:snap-smooth-nodes="false"
inkscape:snap-midpoints="false"
inkscape:snap-nodes="true"
units="px">
<inkscape:grid
type="xygrid"
id="grid6838" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="bg"
inkscape:groupmode="layer"
id="layer1"
style="opacity:0"
sodipodi:insensitive="true"
transform="translate(0,-1020.3622)">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.48900003;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5d3b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4136"
width="537.14288"
height="537.14288"
x="108.57143"
y="232.3622"
ry="0" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="vg"
transform="translate(0,-1020.3622)">
<path
style="opacity:1;fill:#80bbdb;fill-opacity:1;fill-rule:nonzero;stroke:#548dad;stroke-width:0.97142506;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 10.44448,1025.9309 c 0.65513,0 1.18165,0.5595 1.18165,1.2556 l 0,1.2733 16.256617,0 c 1.376723,0 2.484776,1.1774 2.484776,2.6403 l 0,13.0531 c 0,1.4629 -1.108053,2.6403 -2.484776,2.6403 l -23.7654964,0 c -1.3767228,0 -2.4847757,-1.1774 -2.4847757,-2.6403 l 0,-10.7551 0,-2.298 0,-3.9136 c 0,-0.6961 0.5265186,-1.2556 1.1816486,-1.2556 z"
id="rect4901"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sscssssssccsss" />
<path
style="opacity:1;fill:#5fa1c7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 2.1084458,1031.4784 0,0.7321 0,11.4039 c 0,1.5514 1.0713447,2.7998 2.4024592,2.7998 l 22.978188,0 c 1.331114,0 2.40246,-1.2484 2.40246,-2.7998 l 0,-12.136 -27.7831072,0 z"
id="path4919"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 465 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 B

View File

@@ -0,0 +1,203 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 31.999999 32.000001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="filesystem_load_file.svg"
inkscape:export-filename="/home/matthias/Programme/GD_MyFork/GDevelop/Binaries/Output/Release_Windows/JsPlatform/Extensions/filesystem_load_file16.png"
inkscape:export-xdpi="45"
inkscape:export-ydpi="45">
<defs
id="defs4">
<inkscape:path-effect
effect="skeletal"
id="path-effect6855"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect6842"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect4583"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4234"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#617da1;fill-opacity:1;fill-rule:evenodd;stroke:#617da1;stroke-width:1pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4231"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(0.8,0,0,0.8,10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="-15.256846"
inkscape:cy="-4.5327826"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="true"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:window-width="1920"
inkscape:window-height="1026"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:object-nodes="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="true"
inkscape:snap-nodes="true"
units="px">
<inkscape:grid
type="xygrid"
id="grid6838" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="bg"
inkscape:groupmode="layer"
id="layer1"
style="opacity:0"
sodipodi:insensitive="true"
transform="translate(0,-1020.3622)">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.48900003;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5d3b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4136"
width="537.14288"
height="537.14288"
x="108.57143"
y="232.3622"
ry="0" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="vg"
transform="translate(0,-1020.3622)">
<g
id="g4206">
<path
id="rect4177"
d="m 6.7344825,1022.8736 c -0.6270186,0 -1.1323794,0.5032 -1.1323794,1.1303 l 0,24.7167 c 0,0.627 0.5053608,1.1302 1.1323794,1.1302 l 18.5310335,0 c 0.627018,0 1.132379,-0.5032 1.132379,-1.1302 l 0,-16.9661 -6.73994,-8.8809 -12.9234725,0 z"
style="opacity:1;fill:#fcfdf1;fill-opacity:1;fill-rule:nonzero;stroke:#6e6f5e;stroke-width:1.66922748;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path4218"
d="m 19.914509,1022.8735 0,7.8376 c 0,0.3892 0.31498,0.7042 0.704204,0.7042 l 5.779267,0 -6.483471,-8.5418 z"
style="opacity:1;fill:#fcfdf1;fill-opacity:1;fill-rule:nonzero;stroke:#6e6f5e;stroke-width:1.66922748;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<g
id="g4202"
transform="translate(-0.22767735,0)">
<ellipse
style="opacity:1;fill:#d4d68c;fill-opacity:1;fill-rule:nonzero;stroke:#c8cb6c;stroke-width:0.69685775;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4194"
cx="16.227676"
cy="1044.2556"
rx="7.8167491"
ry="1.7860432" />
<ellipse
ry="0.47607893"
rx="3.9621422"
cy="1044.1664"
cx="16.227676"
id="ellipse4198"
style="opacity:1;fill:#fcfdf1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.45964342;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<path
style="fill:#368fac;fill-opacity:1;fill-rule:evenodd;stroke:#2b7188;stroke-width:0.81720334;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 15.999999,1032.9608 -4.451864,5.7416 2.225932,0 0,5.1577 4.451864,0 0,-5.1577 2.225932,0 z"
id="path4210"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 795 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,189 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 31.999999 32.000001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="filesystem_path_exists.svg"
inkscape:export-filename="/home/matthias/Programme/GD_MyFork/GDevelop/Binaries/Output/Release_Windows/JsPlatform/Extensions/filesystem_path_exists16.png"
inkscape:export-xdpi="45"
inkscape:export-ydpi="45">
<defs
id="defs4">
<inkscape:path-effect
effect="skeletal"
id="path-effect6855"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect6842"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect4583"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4234"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#617da1;fill-opacity:1;fill-rule:evenodd;stroke:#617da1;stroke-width:1pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4231"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(0.8,0,0,0.8,10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.919596"
inkscape:cx="3.5385856"
inkscape:cy="13.013876"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="false"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:window-width="1920"
inkscape:window-height="1026"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="false"
inkscape:object-nodes="false"
inkscape:snap-smooth-nodes="false"
inkscape:snap-midpoints="false"
inkscape:snap-nodes="true"
units="px">
<inkscape:grid
type="xygrid"
id="grid6838" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="bg"
inkscape:groupmode="layer"
id="layer1"
style="opacity:0"
sodipodi:insensitive="true"
transform="translate(0,-1020.3622)">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.48900003;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5d3b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4136"
width="537.14288"
height="537.14288"
x="108.57143"
y="232.3622"
ry="0" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="vg"
transform="translate(0,-1020.3622)">
<path
style="opacity:1;fill:#80bbdb;fill-opacity:1;fill-rule:nonzero;stroke:#548dad;stroke-width:0.97142506;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 10.44448,1025.9309 c 0.65513,0 1.18165,0.5595 1.18165,1.2556 l 0,1.2733 16.256617,0 c 1.376723,0 2.484776,1.1774 2.484776,2.6403 l 0,13.0531 c 0,1.4629 -1.108053,2.6403 -2.484776,2.6403 l -23.7654964,0 c -1.3767228,0 -2.4847757,-1.1774 -2.4847757,-2.6403 l 0,-10.7551 0,-2.298 0,-3.9136 c 0,-0.6961 0.5265186,-1.2556 1.1816486,-1.2556 z"
id="rect4901"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sscssssssccsss" />
<path
style="opacity:1;fill:#5fa1c7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 2.1084458,1031.4784 0,0.7321 0,11.4039 c 0,1.5514 1.0713447,2.7998 2.4024592,2.7998 l 22.978188,0 c 1.331114,0 2.40246,-1.2484 2.40246,-2.7998 l 0,-12.136 -27.7831072,0 z"
id="path4919"
inkscape:connector-curvature="0" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:33.25431824px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#9b80db;fill-opacity:1;stroke:#6e6f5e;stroke-width:1.19503343;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
x="5.8434677"
y="1048.4673"
id="text4229"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4231"
x="5.8434677"
y="1048.4673"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Arial Black';-inkscape-font-specification:'Arial Black, ';fill:#9b80db;fill-opacity:1;stroke:#6e6f5e;stroke-width:1.19503343;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">?</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 680 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 984 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,203 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 31.999999 32.000001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="filesystem_save_file.svg"
inkscape:export-filename="/home/matthias/Programme/GD_MyFork/GDevelop/Binaries/Output/Release_Windows/JsPlatform/Extensions/filesystem_save_file32.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs4">
<inkscape:path-effect
effect="skeletal"
id="path-effect6855"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect6842"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect4583"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4234"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#617da1;fill-opacity:1;fill-rule:evenodd;stroke:#617da1;stroke-width:1pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4231"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(0.8,0,0,0.8,10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="30.546725"
inkscape:cy="-3.8184969"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="true"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:window-width="1920"
inkscape:window-height="1026"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:object-nodes="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="true"
inkscape:snap-nodes="true"
units="px">
<inkscape:grid
type="xygrid"
id="grid6838" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="bg"
inkscape:groupmode="layer"
id="layer1"
style="opacity:0"
sodipodi:insensitive="true"
transform="translate(0,-1020.3622)">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.48900003;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5d3b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4136"
width="537.14288"
height="537.14288"
x="108.57143"
y="232.3622"
ry="0" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="vg"
transform="translate(0,-1020.3622)">
<g
id="g4206">
<path
id="rect4177"
d="m 6.7344825,1022.8736 c -0.6270186,0 -1.1323794,0.5032 -1.1323794,1.1303 l 0,24.7167 c 0,0.627 0.5053608,1.1302 1.1323794,1.1302 l 18.5310335,0 c 0.627018,0 1.132379,-0.5032 1.132379,-1.1302 l 0,-16.9661 -6.73994,-8.8809 -12.9234725,0 z"
style="opacity:1;fill:#fcfdf1;fill-opacity:1;fill-rule:nonzero;stroke:#6e6f5e;stroke-width:1.66922748;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path4218"
d="m 19.914509,1022.8735 0,7.8376 c 0,0.3892 0.31498,0.7042 0.704204,0.7042 l 5.779267,0 -6.483471,-8.5418 z"
style="opacity:1;fill:#fcfdf1;fill-opacity:1;fill-rule:nonzero;stroke:#6e6f5e;stroke-width:1.66922748;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<g
id="g4202"
transform="translate(-0.22767735,0)">
<ellipse
style="opacity:1;fill:#d4d68c;fill-opacity:1;fill-rule:nonzero;stroke:#c8cb6c;stroke-width:0.69685775;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4194"
cx="16.227676"
cy="1044.2556"
rx="7.8167491"
ry="1.7860432" />
<ellipse
ry="0.47607893"
rx="3.9621422"
cy="1044.1664"
cx="16.227676"
id="ellipse4198"
style="opacity:1;fill:#fcfdf1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.45964342;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<path
style="fill:#6aac36;fill-opacity:1;fill-rule:evenodd;stroke:#54882b;stroke-width:0.81720334;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 15.999999,1043.6019 -4.451864,-5.7416 2.225932,0 0,-5.1577 4.451864,0 0,5.1577 2.225932,0 z"
id="path4210"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 788 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 835 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 644 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 997 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 636 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 485 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 752 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 899 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 629 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 931 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 521 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 814 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1011 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 560 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 898 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,224 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 31.999999 32.000001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="take_screenshot.svg"
inkscape:export-filename="/home/matthias/Programme/GD_MyFork/GDevelop/Binaries/Output/Release_Windows/JsPlatform/Extensions/take_screenshot16.png"
inkscape:export-xdpi="45"
inkscape:export-ydpi="45">
<defs
id="defs4">
<inkscape:path-effect
effect="skeletal"
id="path-effect6933"
is_visible="true"
pattern="m -9.5367432e-7,1025.3622 c 0,-2.76 2.23999995367432,-5 4.99999995367432,-5 2.76,0 5,2.24 5,5 0,2.76 -2.24,5 -5,5 -2.76,0 -4.99999995367432,-2.24 -4.99999995367432,-5 z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect6855"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect6842"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect4583"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="1"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4234"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#617da1;fill-opacity:1;fill-rule:evenodd;stroke:#617da1;stroke-width:1pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path4231"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(0.8,0,0,0.8,10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.313709"
inkscape:cx="0.48062283"
inkscape:cy="15.066705"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="true"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:window-width="1920"
inkscape:window-height="1026"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="false"
inkscape:object-nodes="false"
inkscape:snap-smooth-nodes="false"
inkscape:snap-midpoints="false"
inkscape:snap-nodes="true"
units="px">
<inkscape:grid
type="xygrid"
id="grid6838" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="bg"
inkscape:groupmode="layer"
id="layer1"
style="opacity:0"
sodipodi:insensitive="true"
transform="translate(0,-1020.3622)">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.48900003;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5d3b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4136"
width="537.14288"
height="537.14288"
x="108.57143"
y="232.3622"
ry="0" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="vg"
transform="translate(0,-1020.3622)">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#535353;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4139"
width="31.889814"
height="20.333548"
x="0.055091862"
y="1026.1954"
ry="2.8092401" />
<circle
style="opacity:1;fill:#8c8c8c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4208"
cx="15.999999"
cy="1038.0809"
r="6.34375" />
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4210"
width="5.0598979"
height="5.2740483"
x="2.8781402"
y="1028.0603"
ry="2.6370242" />
<rect
style="opacity:1;fill:#535353;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4212"
width="11.124999"
height="4.3597975"
x="19.03125"
y="1023.6198"
ry="1.2027028" />
<rect
ry="0.59375"
y="1024.6122"
x="20.748579"
height="2.375"
width="7.6903405"
id="rect4214"
style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<circle
r="4.75"
cy="1038.0809"
cx="15.999999"
id="circle4216"
style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 684 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 909 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 567 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 840 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -370,8 +370,8 @@
<Unit filename="GDCore/IDE/Events/ExpressionsCorrectnessTesting.h" />
<Unit filename="GDCore/IDE/ExtensionsLoader.cpp" />
<Unit filename="GDCore/IDE/ExtensionsLoader.h" />
<Unit filename="GDCore/IDE/Project/ImagesUsedInventorizer.cpp" />
<Unit filename="GDCore/IDE/Project/ImagesUsedInventorizer.h" />
<Unit filename="GDCore/IDE/Project/ResourcesInUseHelper.cpp" />
<Unit filename="GDCore/IDE/Project/ResourcesInUseHelper.h" />
<Unit filename="GDCore/Extensions/Metadata/MetadataProvider.cpp" />
<Unit filename="GDCore/Extensions/Metadata/MetadataProvider.h" />
<Unit filename="GDCore/IDE/PlatformLoader.cpp" />

View File

@@ -257,7 +257,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
.AddAction("PlaySound",
_("Play a sound"),
_("Play a sound."),
_("Play the sound _PARAM1_, vol.: _PARAM3_, loop: _PARAM2_)"),
_("Play the sound _PARAM1_, vol.: _PARAM3_, loop: _PARAM2_"),
_("Audio"),
"res/actions/son24.png",
"res/actions/son.png")
@@ -276,7 +276,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
.AddAction("PlayMusic",
_("Play a music file"),
_("Play a music file."),
_("Play the music _PARAM1_, vol.: _PARAM3_, loop: _PARAM2_)"),
_("Play the music _PARAM1_, vol.: _PARAM3_, loop: _PARAM2_"),
_("Audio"),
"res/actions/music24.png",
"res/actions/music.png")

View File

@@ -176,27 +176,28 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddCodeOnlyParameter("currentScene", "")
.MarkAsAdvanced();
obj.AddAction("AddForceXY",
_("Add a force"),
_("Add a force to an object. The object will move according to "
"all of the forces it has."),
_("Add to _PARAM0_ a force of _PARAM1_ p/s on X axis and "
"_PARAM2_ p/s on Y axis"),
_("Movement"),
"res/actions/force24.png",
"res/actions/force.png")
obj.AddAction(
"AddForceXY",
_("Add a force"),
_("Add a force to an object. The object will move according to "
"all of the forces it has."),
_("Add to _PARAM0_ _PARAM3_ force of _PARAM1_ p/s on X axis and "
"_PARAM2_ p/s on Y axis"),
_("Movement"),
"res/actions/force24.png",
"res/actions/force.png")
.AddParameter("object", _("Object"))
.AddParameter("expression", _("Speed on X axis (in pixels per second)"))
.AddParameter("expression", _("Speed on Y axis (in pixels per second)"))
.AddParameter("expression", _("Damping (Default: 0)"));
.AddParameter("forceMultiplier", _("Force multiplier"));
obj.AddAction("AddForceAL",
_("Add a force (angle)"),
_("Add a force to an object. The object will move according to "
"all of the forces it has. This action creates the force "
"using the specified angle and length."),
_("Add to _PARAM0_ a force, angle: _PARAM1_ degrees and "
_("Add to _PARAM0_ _PARAM3_ force, angle: _PARAM1_ degrees and "
"length: _PARAM2_ pixels"),
_("Movement"),
"res/actions/force24.png",
@@ -205,14 +206,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("object", _("Object"))
.AddParameter("expression", _("Angle"))
.AddParameter("expression", _("Speed (in pixels per second)"))
.AddParameter("expression", _("Damping (Default: 0)"))
.AddParameter("forceMultiplier", _("Force multiplier"))
.MarkAsAdvanced();
obj.AddAction(
"AddForceVersPos",
_("Add a force to move toward a position"),
_("Add a force to an object to make it move toward a position."),
_("Move _PARAM0_ to _PARAM1_;_PARAM2_ with a force of _PARAM3_ "
_("Move _PARAM0_ to _PARAM1_;_PARAM2_ with _PARAM4_ force of _PARAM3_ "
"pixels"),
_("Movement"),
"res/actions/force24.png",
@@ -222,7 +223,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("expression", _("X position"))
.AddParameter("expression", _("Y position"))
.AddParameter("expression", _("Speed (in pixels per second)"))
.AddParameter("expression", _("Damping (Default: 0)"))
.AddParameter("forceMultiplier", _("Force multiplier"))
.MarkAsAdvanced();
obj.AddAction(
@@ -243,13 +244,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("expression", _("Y position of the center"))
.AddParameter("expression", _("Speed (in Degrees per seconds)"))
.AddParameter("expression", _("Distance (in pixels)"))
.AddParameter("expression", _("Damping (Default: 0)"))
.AddParameter("forceMultiplier", _("Force multiplier"))
.SetHidden();
obj.AddAction("Arreter",
_("Stop the object"),
_("Stop the object by deleting all of its forces."),
_("Stop the object _PARAM0_"),
_("Stop object _PARAM0_"),
_("Movement"),
"res/actions/arreter24.png",
"res/actions/arreter.png")
@@ -272,7 +273,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
obj.AddAction("ChangePlan",
_("Z order"),
_("Modify the Z-order of an object"),
_("Do _PARAM1__PARAM2_ to z-Order of _PARAM0_"),
_("Do _PARAM1__PARAM2_ to Z-order of _PARAM0_"),
_("Z order"),
"res/actions/planicon24.png",
"res/actions/planicon.png")
@@ -551,18 +552,19 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("yesorno", _("Activate?"))
.MarkAsAdvanced();
obj.AddAction("AddForceVers",
_("Add a force to move toward an object"),
_("Add a force to an object to make it move toward another."),
_("Move _PARAM0_ to _PARAM1_ with a force of _PARAM2_ pixels"),
_("Movement"),
"res/actions/forceVers24.png",
"res/actions/forceVers.png")
obj.AddAction(
"AddForceVers",
_("Add a force to move toward an object"),
_("Add a force to an object to make it move toward another."),
_("Move _PARAM0_ to _PARAM1_ with _PARAM3_ force of _PARAM2_ pixels"),
_("Movement"),
"res/actions/forceVers24.png",
"res/actions/forceVers.png")
.AddParameter("object", _("Object"))
.AddParameter("objectPtr", _("Target Object"))
.AddParameter("expression", _("Speed (in pixels per second)"))
.AddParameter("expression", _("Damping (Default: 0)"))
.AddParameter("forceMultiplier", _("Force multiplier"))
.MarkAsAdvanced();
obj.AddAction(
@@ -582,7 +584,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("objectPtr", _("Rotate around this object"))
.AddParameter("expression", _("Speed (in degrees per second)"))
.AddParameter("expression", _("Distance (in pixels)"))
.AddParameter("expression", _("Damping (Default: 0)"))
.AddParameter("forceMultiplier", _("Force multiplier"))
.MarkAsAdvanced();
obj.AddAction("MettreAutour",
@@ -640,6 +642,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("object", _("Object"))
.AddParameter("objectList", _("Objects"))
.AddParameter("yesorno",
_("Ignore objects that are touching each other on their "
"edges, but are not overlapping (default: no)"),
"",
true)
.SetDefaultValue("no")
.MarkAsSimple();
obj.AddCondition("CollisionPoint",
@@ -654,13 +662,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("expression", _("Y position of the point"))
.MarkAsSimple();
obj.AddCondition("ObjectTimer",
_("Value of a timer"),
_("Test the elapsed time of a timer."),
_("The timer _PARAM1_ of _PARAM0_ is greater than _PARAM2_ seconds"),
_("Timers"),
"res/conditions/timer24.png",
"res/conditions/timer.png")
obj.AddCondition(
"ObjectTimer",
_("Value of a timer"),
_("Test the elapsed time of a timer."),
_("The timer _PARAM1_ of _PARAM0_ is greater than _PARAM2_ seconds"),
_("Timers"),
"res/conditions/timer24.png",
"res/conditions/timer.png")
.AddParameter("object", _("Object"))
.AddParameter("string", _("Timer's name"))
.AddParameter("expression", _("Time in seconds"));
@@ -863,10 +872,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("objectvar", _("Variable"));
obj.AddExpression("ObjectTimerElapsedTime",
_("Timer value"),
_("Value of a timer"),
_("Timers"),
"res/actions/time.png")
_("Timer value"),
_("Value of a timer"),
_("Timers"),
"res/actions/time.png")
.AddParameter("object", _("Object"))
.AddParameter("string", _("Timer's name"));
@@ -1046,6 +1055,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("objectList", _("Object"))
.AddParameter("objectList", _("Object"))
.AddCodeOnlyParameter("conditionInverted", "")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("yesorno",
_("Ignore objects that are touching each other on their "
"edges, but are not overlapping (default: no)"),
"",
true)
.SetDefaultValue("no")
.MarkAsSimple();
extension

View File

@@ -13,9 +13,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
gd::PlatformExtension& extension) {
extension
.SetExtensionInformation("BuiltinFile",
_("Storage and files"),
_("Storage"),
_("Built-in extension providing functions "
"to store data and manipulate files."),
"to store data."),
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/all-features/storage");
@@ -26,55 +26,55 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
"GroupExists",
_("Existence of a group"),
_("Check if an element (example : PlayerState/CurrentLevel) exists "
"in the file.\nSpaces are forbidden in element names."),
_("_PARAM1_ exists in file _PARAM0_"),
"in the stored data.\nSpaces are forbidden in element names."),
_("_PARAM1_ exists in storage _PARAM0_"),
_("Storage"),
"res/conditions/fichier24.png",
"res/conditions/fichier.png")
.AddParameter("file", _("Filename"))
.AddParameter("string", _("Storage name"))
.AddParameter("string", _("Group"))
.MarkAsAdvanced();
extension
.AddAction(
"LoadFile",
_("Load a structured file in memory"),
_("This action loads the structured file in memory, so you can write "
"and read it.\nYou can open and write without using this action, "
"but it will be slower.\nIf you use this action, do not forget to "
"unload the file from memory.\n\nFor the native platform, the file "
"format is XML."),
_("Load structured file _PARAM0_ in memory"),
_("Load a storage in memory"),
_("This action loads the specified storage in memory, so you can "
"write and read it.\nYou can open and write without using this "
"action, but it will be slower.\nIf you use this action, do not "
"forget to unload the storage from memory."),
_("Load storage _PARAM0_ in memory"),
_("Storage"),
"res/actions/fichier24.png",
"res/actions/fichier.png")
.AddParameter("file", _("File"))
.AddParameter("string", _("Storage name"))
.MarkAsAdvanced();
extension
.AddAction("UnloadFile",
_("Close a structured file"),
_("This action closes the structured file previously loaded "
_("Close a storage"),
_("This action closes the structured data previously loaded "
"in memory, saving all changes made."),
_("Close structured file _PARAM0_"),
_("Close structured data _PARAM0_"),
_("Storage"),
"res/actions/fichier24.png",
"res/actions/fichier.png")
.AddParameter("file", _("File"))
.AddParameter("string", _("Storage name"))
.MarkAsAdvanced();
extension
.AddAction("EcrireFichierExp",
_("Write a value"),
_("Write the result of the expression in the file, in the "
"specified element.\nSpecify the structure leading to the "
"element using / (example : Root/Level/Current)\nSpaces are "
"forbidden in element names."),
_("Write _PARAM2_ in _PARAM1_ of file _PARAM0_"),
_("Storage"),
"res/actions/fichier24.png",
"res/actions/fichier.png")
.AddParameter("file", _("File"))
.AddAction(
"EcrireFichierExp",
_("Write a value"),
_("Write the result of the expression in the stored data, in the "
"specified element.\nSpecify the structure leading to the "
"element using / (example : Root/Level/Current)\nSpaces are "
"forbidden in element names."),
_("Write _PARAM2_ in _PARAM1_ of storage _PARAM0_"),
_("Storage"),
"res/actions/fichier24.png",
"res/actions/fichier.png")
.AddParameter("string", _("Storage name"))
.AddParameter("string", _("Group"))
.AddParameter("expression", _("Expression"));
@@ -82,14 +82,15 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
.AddAction(
"EcrireFichierTxt",
_("Write a text"),
_("Write the text in the file, in the specified element.\nSpecify "
_("Write the text in the specified storage, in the specified "
"element.\nSpecify "
"the structure leading to the element using / (example : "
"Root/Level/Current)\nSpaces are forbidden in element names."),
_("Write _PARAM2_ in _PARAM1_ of file _PARAM0_"),
_("Write _PARAM2_ in _PARAM1_ of storage _PARAM0_"),
_("Storage"),
"res/actions/fichier24.png",
"res/actions/fichier.png")
.AddParameter("file", _("File"))
.AddParameter("string", _("Storage name"))
.AddParameter("string", _("Group"))
.AddParameter("string", _("Text"));
@@ -101,11 +102,11 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
"variable.\nSpecify the structure leading to the element using / "
"(example : Root/Level/Current)\nSpaces are forbidden in element "
"names."),
_("Read _PARAM1_ from file _PARAM0_ and store value in _PARAM3_"),
_("Read _PARAM1_ from storage _PARAM0_ and store value in _PARAM3_"),
_("Storage"),
"res/actions/fichier24.png",
"res/actions/fichier.png")
.AddParameter("file", _("File"))
.AddParameter("string", _("Storage name"))
.AddParameter("string", _("Group"))
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("scenevar", _("Scene variables"));
@@ -118,11 +119,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
"variable.\nSpecify the structure leading to the element using / "
"(example : Root/Level/Current)\nSpaces are forbidden in element "
"names."),
_("Read _PARAM1_ from file _PARAM0_ and store as text in _PARAM3_"),
_("Read _PARAM1_ from storage _PARAM0_ and store as text in "
"_PARAM3_"),
_("Storage"),
"res/actions/fichier24.png",
"res/actions/fichier.png")
.AddParameter("file", _("File"))
.AddParameter("string", _("Storage name"))
.AddParameter("string", _("Group"))
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("scenevar", _("Scene variables"));
@@ -131,36 +133,37 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsFileExtension(
.AddAction("DeleteGroupFichier",
_("Delete an element"),
_("This action deletes the specified element from the "
"structured file.\nSpecify the structure leading to the "
"specified storage.\nSpecify the structure leading to the "
"element using / (example : Root/Level/Current)\nSpaces are "
"forbidden in element names."),
_("Delete _PARAM1_ from the file _PARAM0_"),
_("Delete _PARAM1_ from storage _PARAM0_"),
_("Storage"),
"res/actions/delete24.png",
"res/actions/delete.png")
.AddParameter("file", _("Filename"))
.AddParameter("string", _("Storage name"))
.AddParameter("string", _("Group"))
.MarkAsAdvanced();
extension
.AddAction("DeleteFichier",
_("Delete a file"),
_("Delete the file."),
_("Delete the file _PARAM0_"),
_("Files"),
"res/actions/delete24.png",
"res/actions/delete.png")
.AddParameter("file", _("Filename"));
.AddAction(
"DeleteFichier",
_("Clear a storage"),
_("Clear the specified storage, removing all data saved in it."),
_("Delete storage _PARAM0_"),
_("Storage"),
"res/actions/delete24.png",
"res/actions/delete.png")
.AddParameter("string", _("Storage name"));
extension
.AddCondition("FileExists",
_("A file exists"),
_("Test if the file exists."),
_("File _PARAM0_ exists"),
_("Files"),
_("A storage exists"),
_("Test if the specified storage exists."),
_("Storage _PARAM0_ exists"),
_("Storage"),
"res/conditions/fichier24.png",
"res/conditions/fichier.png")
.AddParameter("file", _("Filename"))
.AddParameter("string", _("Storage name"))
.MarkAsAdvanced();
extension

View File

@@ -18,7 +18,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
_("Built-in extension that enables the use of a mouse"),
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/events/mouse-touch");
.SetExtensionHelpPath("/all-features/mouse-touch");
#if defined(GD_IDE_ONLY)
extension

View File

@@ -89,7 +89,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSceneExtension(
.AddAction("Scene",
_("Change the scene"),
_("Stop this scene and start the specified one instead."),
_("Change for scene _PARAM1_"),
_("Change to scene _PARAM1_"),
_("Scene"),
"res/actions/replaceScene24.png",
"res/actions/replaceScene.png")

View File

@@ -15,7 +15,7 @@ using namespace std;
namespace gd {
Direction::Direction() : loop(false), timeBetweenFrame(1) {}
Direction::Direction() : loop(false), timeBetweenFrame(0.08) {}
Direction::~Direction(){};
@@ -75,6 +75,11 @@ void Direction::UnserializeFrom(const gd::SerializerElement& element) {
SetTimeBetweenFrames(
element.GetDoubleAttribute("timeBetweenFrames", 1, "tempsEntre"));
SetLoop(element.GetBoolAttribute("looping", false, "boucle"));
#if defined(GD_IDE_ONLY)
SetMetadata(element.HasAttribute("metadata") || element.HasChild("metadata")
? element.GetStringAttribute("metadata")
: "");
#endif
const gd::SerializerElement& spritesElement =
element.GetChild("sprites", 0, "Sprites");
@@ -182,6 +187,7 @@ void SaveSpritesDirection(const vector<Sprite>& sprites,
void Direction::SerializeTo(gd::SerializerElement& element) const {
element.SetAttribute("looping", IsLooping());
element.SetAttribute("timeBetweenFrames", GetTimeBetweenFrames());
if (!GetMetadata().empty()) element.SetAttribute("metadata", GetMetadata());
SaveSpritesDirection(sprites, element.AddChild("sprites"));
}
#endif

View File

@@ -6,17 +6,16 @@
#ifndef GDCORE_DIRECTION_H
#define GDCORE_DIRECTION_H
#include <vector>
#include "GDCore/String.h"
namespace gd {
class Sprite;
}
namespace gd {
class SerializerElement;
}
namespace gd {
/**
* \brief Class defining a direction of an Animation.
* \brief Class defining a direction (set of frames) of an Animation.
*
* \see SpriteObject
* \see Animation
@@ -32,78 +31,101 @@ class GD_CORE_API Direction {
virtual ~Direction();
/**
* Return true if sprites looping is activated
* \brief Return true if sprites looping is activated
*/
inline bool IsLooping() const { return loop; }
/**
* Set if the sprites must be looping or not.
* \brief Set if the sprites must be looping or not.
*/
void SetLoop(bool loop_);
/**
* Get the time between each sprite
* \brief Get the time between each sprite
*/
inline float GetTimeBetweenFrames() const { return timeBetweenFrame; }
/**
* Set the time between each sprite
* \brief Set the time between each sprite
*
* \param time Time between each sprite, in seconds.
*/
void SetTimeBetweenFrames(float time);
/**
* Return a reference to a sprite of the direction.
* \brief Return a reference to a sprite of the direction.
*
* \param nb The index of the sprite to be accessed. Bound checking is not
* made. \return A reference to the sprite.
* made.
*
* \return A reference to the sprite.
*/
const Sprite& GetSprite(std::size_t nb) const;
/**
* Return a reference to a sprite of the direction.
* \brief Return a reference to a sprite of the direction.
*
* \param nb The index of the sprite to be accessed. Bound checking is not
* made. \return A reference to the sprite.
* made.
*
* \return A reference to the sprite.
*/
Sprite& GetSprite(std::size_t nb);
/**
* Check if the direction contains sprites.
* \brief Check if the direction contains sprites.
*
* \return true if the direction does not have any sprite.
*/
bool HasNoSprites() const;
/**
* Return the number of sprite used in the direction
* \brief Return the number of sprite used in the direction
*
* \return The number of sprite used in the direction
*/
std::size_t GetSpritesCount() const;
/**
* Remove the sprite at the specified position.
* \brief Remove the sprite at the specified position.
*
* Bound-checking is made.
*/
void RemoveSprite(std::size_t index);
/**
* Clear the direction from all of its sprites
* \brief Clear the direction from all of its sprites
*/
void RemoveAllSprites();
/**
* Add a new sprite at the end of the list.
* \brief Add a new sprite at the end of the list.
*/
void AddSprite(const Sprite& sprite);
/**
* Swap the position of two sprites
* \brief Swap the position of two sprites
*/
void SwapSprites(std::size_t firstSpriteIndex, std::size_t secondSpriteIndex);
/**
* Change the position of the specified sprite.
* \brief Change the position of the specified sprite.
*/
void MoveSprite(std::size_t oldIndex, std::size_t newIndex);
#if defined(GD_IDE_ONLY)
/**
* \brief Set the metadata (any string) associated to the Direction.
* \note Can be used by external editors to store extra information.
*/
virtual void SetMetadata(const gd::String& metadata_) { metadata = metadata_; }
/**
* \brief Return the (optional) metadata associated to the Direction.
*/
virtual const gd::String& GetMetadata() const { return metadata; }
#endif
void UnserializeFrom(const gd::SerializerElement& element);
#if defined(GD_IDE_ONLY)
void SerializeTo(gd::SerializerElement& element) const;
@@ -113,6 +135,9 @@ class GD_CORE_API Direction {
bool loop; ///< true if the animation must loop.
float timeBetweenFrame; ///< The time between each sprite of the animation.
std::vector<Sprite> sprites; ///< The sprites of the direction.
#if defined(GD_IDE_ONLY)
gd::String metadata;
#endif
};
} // namespace gd

View File

@@ -17,7 +17,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
extension
.SetExtensionInformation("Sprite",
_("Sprite"),
_("Sprite are animated object which can be used for most elements of a game."),
_("Sprite are animated object which can be used "
"for most elements of a game."),
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/objects/sprite");
@@ -30,8 +31,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
#if defined(GD_IDE_ONLY)
obj.AddAction("Opacity",
_("Change object's opacity"),
_("Change the opacity of an object."),
_("Change Sprite opacity"),
_("Change the opacity of a Sprite. 0 is fully transparent, 255 "
"is opaque (default)."),
_("Do _PARAM1__PARAM2_ to the opacity of _PARAM0_"),
_("Visibility"),
"res/actions/opacity24.png",
@@ -39,7 +41,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
.AddParameter("object", _("Object"), "Sprite")
.AddParameter("operator", _("Modification's sign"))
.AddParameter("expression", _("Value"))
.AddParameter("expression", _("Value (between 0 and 255)"))
.MarkAsSimple()
.SetManipulatedType("number");
@@ -198,6 +200,34 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
.MarkAsAdvanced()
.SetManipulatedType("number");
obj.AddAction("ChangeWidth",
_("Width"),
_("Change the width of a Sprite object."),
_("Do _PARAM1__PARAM2_ to the width of _PARAM0_"),
_("Size"),
"res/actions/scale24.png",
"res/actions/scale.png")
.AddParameter("object", _("Object"), "Sprite")
.AddParameter("operator", _("Modification's sign"))
.AddParameter("expression", _("Value"))
.MarkAsAdvanced()
.SetManipulatedType("number");
obj.AddAction("ChangeHeight",
_("Height"),
_("Change the height of a Sprite object."),
_("Do _PARAM1__PARAM2_ to the height of _PARAM0_"),
_("Size"),
"res/actions/scale24.png",
"res/actions/scale.png")
.AddParameter("object", _("Object"), "Sprite")
.AddParameter("operator", _("Modification's sign"))
.AddParameter("expression", _("Value"))
.MarkAsAdvanced()
.SetManipulatedType("number");
obj.AddCondition(
"Animation",
_("Current animation"),
@@ -309,8 +339,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
obj.AddCondition("Opacity",
_("Opacity"),
_("Compare the opacity of an object, between 0 (fully "
"transparent) to 255 (opaque)"),
_("Compare the opacity of a Sprite, between 0 (fully "
"transparent) to 255 (opaque)."),
_("The opacity of _PARAM0_ is _PARAM1__PARAM2_"),
_("Visibility"),
"res/conditions/opacity24.png",

View File

@@ -23,9 +23,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
#if defined(GD_IDE_ONLY)
extension
.AddCondition("VarScene",
_("Value of a variable"),
_("Value of a scene variable"),
_("Compare the value of a scene variable."),
_("Variable _PARAM0_ is _PARAM1__PARAM2_"),
_("Scene variable _PARAM0_ is _PARAM1__PARAM2_"),
_("Variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
@@ -36,9 +36,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddCondition("VarSceneTxt",
_("Text of a variable"),
_("Text of a scene variable"),
_("Compare the text of a scene variable."),
_("The text of variable _PARAM0_ is _PARAM1__PARAM2_"),
_("The text of scene variable _PARAM0_ is _PARAM1__PARAM2_"),
_("Variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
@@ -51,8 +51,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
.AddCondition(
"VariableChildExists",
_("Child existence"),
_("Return true if the specified child of the variable exists."),
_("Child _PARAM1_ of variable _PARAM0_ exists"),
_("Return true if the specified child of the scene variable exists."),
_("Child _PARAM1_ of scene variable _PARAM0_ exists"),
_("Variables/Structures"),
"res/conditions/var24.png",
"res/conditions/var.png")
@@ -76,8 +76,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddCondition("VarSceneDef",
_("Test if a scene variable is defined"),
_("Test if the scene variable exist."),
_("Variable _PARAM0_ is defined"),
_("Test if the scene variable exists."),
_("Scene variable _PARAM0_ is defined"),
_("Variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
@@ -129,9 +129,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddAction("ModVarScene",
_("Value of a variable"),
_("Value of a scene variable"),
_("Modify the value of a scene variable."),
_("Do _PARAM1__PARAM2_ to variable _PARAM0_"),
_("Do _PARAM1__PARAM2_ to scene variable _PARAM0_"),
_("Variables"),
"res/actions/var24.png",
"res/actions/var.png")
@@ -142,9 +142,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddAction("ModVarSceneTxt",
_("String of a variable"),
_("String of a scene variable"),
_("Modify the text of a scene variable."),
_("Do _PARAM1__PARAM2_ to the text of variable _PARAM0_"),
_("Do _PARAM1__PARAM2_ to the text of scene variable _PARAM0_"),
_("Variables"),
"res/actions/var24.png",
"res/actions/var.png")
@@ -185,8 +185,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddAction("VariableRemoveChild",
_("Remove a child"),
_("Remove a child from a variable."),
_("Remove child _PARAM1_ from variable _PARAM0_"),
_("Remove a child from a scene variable."),
_("Remove child _PARAM1_ from scene variable _PARAM0_"),
_("Variables/Structure"),
"res/actions/var24.png",
"res/actions/var.png")
@@ -208,9 +208,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddAction("VariableClearChildren",
_("Clear variable"),
_("Remove all the children from the variable."),
_("Clear children from variable _PARAM0_"),
_("Clear scene variable"),
_("Remove all the children from the scene variable."),
_("Clear children from scene variable _PARAM0_"),
_("Variables/Structure"),
"res/actions/var24.png",
"res/actions/var.png")
@@ -230,7 +230,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddExpression("GlobalVariableChildCount",
_("Global variable number of children"),
_("Number of children of a global variable"),
_("Get the number of children of a global variable"),
_("Variables"),
"res/actions/var.png")
@@ -238,7 +238,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddExpression("VariableChildCount",
_("Scene variable number of children"),
_("Number of children of a scene variable"),
_("Get the number of children of a scene variable"),
_("Variables"),
"res/actions/var.png")
@@ -246,15 +246,15 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddExpression("Variable",
_("Scene variables"),
_("Scene variables"),
_("Value of a scene variable"),
_("Value of a scene variable"),
_("Variables"),
"res/actions/var.png")
.AddParameter("scenevar", _("Variable"));
extension
.AddStrExpression("VariableString",
_("Scene variables"),
_("Text of a scene variable"),
_("Text of a scene variable"),
_("Variables"),
"res/actions/var.png")
@@ -262,15 +262,15 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
extension
.AddExpression("GlobalVariable",
_("Global variables"),
_("Global variable"),
_("Value of a global variable"),
_("Value of a global variable"),
_("Variables"),
"res/actions/var.png")
.AddParameter("globalvar", _("Name of the global variable"));
extension
.AddStrExpression("GlobalVariableString",
_("Global variables"),
_("Text of a global variable"),
_("Text of a global variable"),
_("Variables"),
"res/actions/var.png")

View File

@@ -54,17 +54,19 @@ class GD_CORE_API ParameterMetadata {
/**
* \brief Return the name of the parameter.
*
*
* Name is optional, and won't be filled for most parameters of extensions.
* It is useful when generating a function from events, where parameters must be named.
* It is useful when generating a function from events, where parameters must
* be named.
*/
const gd::String &GetName() const { return name; }
/**
* \brief Set the name of the parameter.
*
*
* Name is optional, and won't be filled for most parameters of extensions.
* It is useful when generating a function from events, where parameters must be named.
* It is useful when generating a function from events, where parameters must
* be named.
*/
ParameterMetadata &SetName(const gd::String &name_) {
name = name_;
@@ -159,7 +161,8 @@ class GD_CORE_API ParameterMetadata {
static bool IsExpression(const gd::String &type,
const gd::String &parameterType) {
if (type == "number") {
return parameterType == "expression" || parameterType == "camera";
return parameterType == "expression" || parameterType == "camera" ||
parameterType == "forceMultiplier";
} else if (type == "string") {
return parameterType == "string" || parameterType == "layer" ||
parameterType == "color" || parameterType == "file" ||
@@ -174,12 +177,12 @@ class GD_CORE_API ParameterMetadata {
/**
* \brief Serialize the ParameterMetadata to the specified element
*/
void SerializeTo(gd::SerializerElement& element) const;
void SerializeTo(gd::SerializerElement &element) const;
/**
* \brief Load the ParameterMetadata from the specified element
*/
void UnserializeFrom(const gd::SerializerElement& element);
void UnserializeFrom(const gd::SerializerElement &element);
///@}
// TODO: Deprecated public fields. Any direct using should be moved to
@@ -193,8 +196,9 @@ class GD_CORE_API ParameterMetadata {
///< i.e. must not be shown in editor
gd::String defaultValue; ///< Used as a default value in editor or if an
///< optional parameter is empty.
private:
gd::String name; ///< The name of the parameter to be used in code generation. Optional.
private:
gd::String name; ///< The name of the parameter to be used in code
///< generation. Optional.
};
/**
@@ -219,9 +223,7 @@ class GD_CORE_API InstructionMetadata {
const gd::String &GetDescription() const { return description; }
const gd::String &GetSentence() const { return sentence; }
const gd::String &GetGroup() const { return group; }
ParameterMetadata &GetParameter(size_t i) {
return parameters[i];
}
ParameterMetadata &GetParameter(size_t i) { return parameters[i]; }
const ParameterMetadata &GetParameter(size_t i) const {
return parameters[i];
}

View File

@@ -19,7 +19,7 @@ class GD_CORE_API PropertyDescriptor {
* value. \param propertyValue The value of the property.
*/
PropertyDescriptor(gd::String propertyValue)
: currentValue(propertyValue), type("string") {}
: currentValue(propertyValue), type("string"), label("") {}
/**
* \brief Empty constructor creating an empty property to be displayed.
@@ -51,6 +51,14 @@ class GD_CORE_API PropertyDescriptor {
return *this;
}
/**
* \brief Change the label displayed in the property grid.
*/
PropertyDescriptor& SetLabel(gd::String label_) {
label = label_;
return *this;
}
/**
* \brief Add an information about the property.
* \note The information are arbitrary and are interpreted by the class
@@ -65,6 +73,7 @@ class GD_CORE_API PropertyDescriptor {
const gd::String& GetValue() const { return currentValue; }
const gd::String& GetType() const { return type; }
const gd::String& GetLabel() const { return label; }
const std::vector<gd::String>& GetExtraInfo() const {
return extraInformation;
}
@@ -74,6 +83,7 @@ class GD_CORE_API PropertyDescriptor {
gd::String
type; ///< The type of the property. This is arbitrary and interpreted by
///< the class responsible for updating the property grid.
gd::String label; //< The user-friendly property name
std::vector<gd::String>
extraInformation; ///< Can be used to store for example the available
///< choices, if a property is a displayed as a combo

View File

@@ -41,7 +41,7 @@
#include "GDCore/IDE/Dialogs/DndResourcesEditor.h"
#include "GDCore/IDE/Dialogs/PropertyDescriptor.h"
#include "GDCore/IDE/Dialogs/ResourceLibraryDialog.h"
#include "GDCore/IDE/Project/ImagesUsedInventorizer.h"
#include "GDCore/IDE/Project/ResourcesInUseHelper.h"
#include "GDCore/IDE/Project/ProjectResourcesAdder.h"
#include "GDCore/IDE/wxTools/FileProperty.h"
#include "GDCore/IDE/wxTools/SkinHelper.h"
@@ -1332,7 +1332,7 @@ void ResourcesEditor::Refresh() {
void ResourcesEditor::OnDeleteUnusedFiles(wxCommandEvent& event) {
std::vector<gd::String> unusedImages =
gd::ProjectResourcesAdder::GetAllUselessImages(project);
gd::ProjectResourcesAdder::GetAllUseless(project, "image");
// Construct corresponding wxArrayString with unused images
wxArrayString imagesNotUsed;

View File

@@ -21,7 +21,7 @@ using namespace std;
namespace gd {
void ArbitraryResourceWorker::ExposeImage(gd::String& imageName){
// Nothing to do, the image is a referece to a resource that
// Nothing to do, the image is a reference to a resource that
// is already exposed.
};
@@ -40,6 +40,21 @@ void ArbitraryResourceWorker::ExposeAudio(gd::String& audioName) {
ExposeFile(audioName);
};
void ArbitraryResourceWorker::ExposeFont(gd::String& fontName) {
for (auto resources : GetResources()) {
if (!resources) continue;
if (resources->HasResource(fontName) &&
resources->GetResource(fontName).GetKind() == "font") {
// Nothing to do, the font is a reference to a resource that
// is already exposed.
return;
}
}
ExposeFile(fontName);
};
void ArbitraryResourceWorker::ExposeResources(
gd::ResourcesManager* resourcesManager) {
if (!resourcesManager) return;

View File

@@ -34,7 +34,7 @@ namespace gd {
* sometimes update them.
*
* \see ResourcesMergingHelper
* \see gd::ImagesUsedInventorizer
* \see gd::ResourcesInUseHelper
*
* \see gd::LaunchResourceWorkerOnEvents
*
@@ -64,6 +64,12 @@ class GD_CORE_API ArbitraryResourceWorker {
*/
virtual void ExposeAudio(gd::String &audioName);
/**
* \brief Expose a font, which is either a reference to a "font" resource,
* or a filename if no resource with this name exists.
*/
virtual void ExposeFont(gd::String &fontName);
/**
* \brief Expose a shader.
* \warn Currently unsupported.

View File

@@ -1,52 +0,0 @@
/*
* GDevelop Core
* 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 IMAGESUSEDINVENTORIZER_H
#define IMAGESUSEDINVENTORIZER_H
#include <set>
#include <vector>
#include "GDCore/IDE/Project/ArbitraryResourceWorker.h"
#include "GDCore/String.h"
namespace gd {
/**
* \brief Class used to track all images used in a game.
*
* Usage example:
\code
gd::ImagesUsedInventorizer inventorizer;
project.ExposeResources(inventorizer);
//Get a set with the name of all images in the project:
std::set<gd::String> & usedImages = inventorizer.GetAllUsedImages();
\endcode
*
* \ingroup IDE
*/
class ImagesUsedInventorizer : public gd::ArbitraryResourceWorker {
public:
ImagesUsedInventorizer() : gd::ArbitraryResourceWorker(){};
virtual ~ImagesUsedInventorizer(){};
std::set<gd::String>& GetAllUsedImages() { return allUsedImages; };
virtual void ExposeFile(gd::String& resource){
/*Don't care, we just list images*/};
virtual void ExposeImage(gd::String& imageName) {
allUsedImages.insert(imageName);
};
protected:
std::set<gd::String> allUsedImages;
};
} // namespace gd
#endif // IMAGESUSEDINVENTORIZER_H
#endif

View File

@@ -5,7 +5,7 @@
*/
#include "ProjectResourcesAdder.h"
#include "GDCore/CommonTools.h"
#include "GDCore/IDE/Project/ImagesUsedInventorizer.h"
#include "GDCore/IDE/Project/ResourcesInUseHelper.h"
#include "GDCore/Project/Project.h"
#include "GDCore/Tools/Localization.h"
#include "GDCore/Tools/Log.h"
@@ -14,51 +14,52 @@ using namespace std;
namespace gd {
bool ProjectResourcesAdder::AddAllMissingImages(gd::Project& project) {
gd::ImagesUsedInventorizer inventorizer;
project.ExposeResources(inventorizer);
std::set<gd::String>& allImages = inventorizer.GetAllUsedImages();
bool ProjectResourcesAdder::AddAllMissing(gd::Project& project,
const gd::String& resourceType) {
// Search for resources used in the project
gd::ResourcesInUseHelper resourcesInUse;
project.ExposeResources(resourcesInUse);
ResourcesManager& resourcesManager = project.GetResourcesManager();
for (std::set<gd::String>::const_iterator it = allImages.begin();
it != allImages.end();
++it) {
if (!resourcesManager.HasResource(*it)) {
std::cout << "Adding missing resource \"" << *it << "\"to the project.";
resourcesManager.AddResource(*it, /*filename=*/*it, "image");
for (auto& resourceName : resourcesInUse.GetAll(resourceType)) {
if (!resourcesManager.HasResource(resourceName)) {
std::cout << "Adding missing resource \"" << resourceName
<< "\"to the project." << std::endl;
resourcesManager.AddResource(
resourceName, /*filename=*/resourceName, resourceType);
}
}
return true;
}
std::vector<gd::String> ProjectResourcesAdder::GetAllUselessImages(
gd::Project& project) {
std::vector<gd::String> ProjectResourcesAdder::GetAllUseless(
gd::Project& project, const gd::String& resourceType) {
std::vector<gd::String> unusedResources;
// Search for resources used in the project
gd::ResourcesInUseHelper resourcesInUse;
project.ExposeResources(resourcesInUse);
std::set<gd::String>& usedResources = resourcesInUse.GetAll(resourceType);
// Search for used images
gd::ImagesUsedInventorizer inventorizer;
project.ExposeResources(inventorizer);
std::set<gd::String>& usedImages = inventorizer.GetAllUsedImages();
// Search all images resources not used
// Search all resources not used
std::vector<gd::String> resources =
project.GetResourcesManager().GetAllResourceNames();
for (std::size_t i = 0; i < resources.size(); i++) {
if (project.GetResourcesManager().GetResource(resources[i]).GetKind() !=
"image")
resourceType)
continue;
if (usedImages.find(resources[i]) == usedImages.end())
if (usedResources.find(resources[i]) == usedResources.end())
unusedResources.push_back(resources[i]);
}
return unusedResources;
}
void ProjectResourcesAdder::RemoveAllUselessImages(gd::Project& project) {
std::vector<gd::String> unusedResources = GetAllUselessImages(project);
void ProjectResourcesAdder::RemoveAllUseless(gd::Project& project,
const gd::String& resourceType) {
std::vector<gd::String> unusedResources =
GetAllUseless(project, resourceType);
for (std::size_t i = 0; i < unusedResources.size(); ++i) {
project.GetResourcesManager().RemoveResource(unusedResources[i]);

View File

@@ -21,38 +21,35 @@ namespace gd {
class GD_CORE_API ProjectResourcesAdder {
public:
/**
* \brief Update the project so that all missing images are added, with an
* \brief Update the project so that all missing resources are added, with an
* filename that is equal to the missing resource name.
*
* \param project The project to be updated.
* \param resourceType The type of the resource the be searched
*
* \return true if no error happened
*/
static bool AddAllMissingImages(gd::Project& project);
static bool AddAllMissing(gd::Project& project, const gd::String & resourceType);
/**
* \brief Find all resources that are
* not used in the project.
*
* \note For now, only images resources can be tracked and marked
* as not used.
* \brief Find all resources of the specified kind that are
* not used by the project.
*
* \param project The project to be crawled.
* \param resourceType The type of the resource the be searched
*
* \return A vector containing the name of all unused resources
*/
static std::vector<gd::String> GetAllUselessImages(gd::Project& project);
static std::vector<gd::String> GetAllUseless(gd::Project& project, const gd::String & resourceType);
/**
* \brief Remove all resources that are not used
* in the project.
*
* \note For now, only images resources can be tracked and marked
* as not used.
* \brief Remove all resources of the specified kind that are not used
* by the project.
*
* \param project The project to be crawled.
* \param resourceType The type of the resource the be searched
*/
static void RemoveAllUselessImages(gd::Project& project);
static void RemoveAllUseless(gd::Project& project, const gd::String & resourceType);
};
} // namespace gd

View File

@@ -0,0 +1,72 @@
/*
* GDevelop Core
* 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 IMAGESUSEDINVENTORIZER_H
#define IMAGESUSEDINVENTORIZER_H
#include <set>
#include <vector>
#include "GDCore/IDE/Project/ArbitraryResourceWorker.h"
#include "GDCore/String.h"
namespace gd {
/**
* \brief Class used to track all resources used by a game,
* or a part of it (like a gd::Object).
*
* Usage example:
\code
gd::ResourcesInUseHelper resourcesInUse;
project.ExposeResources(resourcesInUse);
//Get a set with the name of all images in the project:
std::set<gd::String> & usedImages = resourcesInUse.GetAllImages();
\endcode
*
* \ingroup IDE
*/
class ResourcesInUseHelper : public gd::ArbitraryResourceWorker {
public:
ResourcesInUseHelper() : gd::ArbitraryResourceWorker(){};
virtual ~ResourcesInUseHelper(){};
std::set<gd::String>& GetAllImages() { return GetAll("image"); };
std::set<gd::String>& GetAllFonts() { return GetAll("font"); };
std::set<gd::String>& GetAllAudios() { return GetAll("audio"); };
std::set<gd::String>& GetAll(const gd::String& resourceType) {
return resourceType == "image"
? allImages
: (resourceType == "audio"
? allAudios
: (resourceType == "font") ? allFonts : emptyResources);
};
virtual void ExposeFile(gd::String& resource) override{
/*Don't care, we just list resource names*/
};
virtual void ExposeImage(gd::String& imageResourceName) override {
allImages.insert(imageResourceName);
};
virtual void ExposeAudio(gd::String& audioResourceName) override {
allAudios.insert(audioResourceName);
};
virtual void ExposeFont(gd::String& fontResourceName) override {
allFonts.insert(fontResourceName);
};
protected:
std::set<gd::String> allImages;
std::set<gd::String> allAudios;
std::set<gd::String> allFonts;
std::set<gd::String> emptyResources;
};
} // namespace gd
#endif // IMAGESUSEDINVENTORIZER_H
#endif

View File

@@ -49,11 +49,25 @@ void ResourcesMergingHelper::SetNewFilename(gd::String oldFilename,
gd::String newFilename) {
if (oldFilenames.find(oldFilename) != oldFilenames.end()) return;
// Make sure that the new filename is not already used.
gd::String finalFilename = gd::NewNameGenerator::Generate(
newFilename, [this](const gd::String& name) {
return newFilenames.find(name) != newFilenames.end();
});
// Extract baseName and extension from the new filename
size_t extensionPos = newFilename.find_last_of(".");
gd::String extension =
extensionPos != gd::String::npos
? newFilename.substr(extensionPos, newFilename.length())
: "";
gd::String baseName = newFilename.substr(0, extensionPos);
// Make sure that the new filename is not already used. Generate a
// new filename while there is a collision.
// Preserving extension is important.
gd::String finalFilename =
gd::NewNameGenerator::Generate(
baseName,
[this, extension](const gd::String& newBaseName) {
return newFilenames.find(newBaseName + extension) !=
newFilenames.end();
}) +
extension;
oldFilenames[oldFilename] = finalFilename;
newFilenames[finalFilename] = oldFilename;

View File

@@ -18,8 +18,10 @@ class AbstractFileSystem;
namespace gd {
/**
* \brief ResourcesMergingHelper is used (mainly during compilation) so
* as to inventory resources and change their filenames
* \brief ResourcesMergingHelper is used (mainly during export)
* to list resources and generate new filenames, to allow them to be all copied
* in a single directory (potentially changing the filename to avoid conflicts,
* but preserving extensions).
*
* \see ArbitraryResourceWorker
*
@@ -82,9 +84,9 @@ class GD_CORE_API ResourcesMergingHelper : public ArbitraryResourceWorker {
///< baseDirectory, will be preserved in
///< filenames.
bool preserveAbsoluteFilenames; ///< If set to true, the filenames which are
///< absolute ( C:\MyFile.png ) will not be
///< transformed into their filenames (
///< MyFile.png ).
///< absolute (C:\MyFile.png will not be
///< transformed into a relative filename
///< (MyFile.png).
gd::AbstractFileSystem&
fs; ///< The gd::AbstractFileSystem used to manipulate files.
};

View File

@@ -22,8 +22,8 @@
#include "GDCore/IDE/PlatformManager.h"
#include "GDCore/IDE/Project/ArbitraryResourceWorker.h"
#include "GDCore/IDE/wxTools/SafeYield.h"
#include "GDCore/Project/EventsFunctionsExtension.h"
#include "GDCore/Project/ChangesNotifier.h"
#include "GDCore/Project/EventsFunctionsExtension.h"
#include "GDCore/Project/ExternalEvents.h"
#include "GDCore/Project/ExternalLayout.h"
#include "GDCore/Project/ImageManager.h"
@@ -65,6 +65,7 @@ Project::Project()
version("1.0.0"),
packageName("com.example.gamename"),
orientation("landscape"),
adMobAppId(""),
folderProject(false),
#endif
windowWidth(800),
@@ -72,6 +73,7 @@ Project::Project()
maxFPS(60),
minFPS(10),
verticalSync(false),
scaleMode("linear"),
sizeOnStartupMode("adaptWidth"),
imageManager(std::make_shared<ImageManager>())
#if defined(GD_IDE_ONLY)
@@ -635,11 +637,13 @@ void Project::UnserializeFrom(const SerializerElement& element) {
propElement.GetChild("minFPS", 0, "FPSmin").GetValue().GetInt());
SetVerticalSyncActivatedByDefault(
propElement.GetChild("verticalSync").GetValue().GetBool());
SetScaleMode(propElement.GetStringAttribute("scaleMode", "linear"));
SetSizeOnStartupMode(propElement.GetStringAttribute("sizeOnStartupMode", ""));
#if defined(GD_IDE_ONLY)
SetAuthor(propElement.GetChild("author", 0, "Auteur").GetValue().GetString());
SetPackageName(propElement.GetStringAttribute("packageName"));
SetOrientation(propElement.GetStringAttribute("orientation", "default"));
SetAdMobAppId(propElement.GetStringAttribute("adMobAppId", ""));
SetFolderProject(propElement.GetBoolAttribute("folderProject"));
SetProjectFile(propElement.GetStringAttribute("projectFile"));
SetLastCompilationDirectory(propElement
@@ -911,11 +915,13 @@ void Project::SerializeTo(SerializerElement& element) const {
propElement.AddChild("minFPS").SetValue(GetMinimumFPS());
propElement.AddChild("verticalSync")
.SetValue(IsVerticalSynchronizationEnabledByDefault());
propElement.SetAttribute("scaleMode", scaleMode);
propElement.SetAttribute("sizeOnStartupMode", sizeOnStartupMode);
propElement.SetAttribute("projectFile", gameFile);
propElement.SetAttribute("folderProject", folderProject);
propElement.SetAttribute("packageName", packageName);
propElement.SetAttribute("orientation", orientation);
propElement.SetAttribute("adMobAppId", adMobAppId);
platformSpecificAssets.SerializeTo(
propElement.AddChild("platformSpecificAssets"));
loadingScreen.SerializeTo(propElement.AddChild("loadingScreen"));
@@ -1003,9 +1009,9 @@ gd::String Project::GetBadObjectNameWarning() {
}
void Project::ExposeResources(gd::ArbitraryResourceWorker& worker) {
// See also gd::WholeProjectRefactorer::ExposeProjectEvents for a method that traverse the whole
// project (this time for events).
// Ideally, this method could be moved outside of gd::Project.
// See also gd::WholeProjectRefactorer::ExposeProjectEvents for a method that
// traverse the whole project (this time for events). Ideally, this method
// could be moved outside of gd::Project.
// Add project resources
worker.ExposeResources(&GetResourcesManager());
@@ -1030,7 +1036,8 @@ void Project::ExposeResources(gd::ArbitraryResourceWorker& worker) {
// Add events functions extensions resources
for (std::size_t e = 0; e < GetEventsFunctionsExtensionsCount(); e++) {
auto& eventsFunctionsExtension = GetEventsFunctionsExtension(e);
for (auto&& eventsFunction : eventsFunctionsExtension.GetEventsFunctions()) {
for (auto&& eventsFunction :
eventsFunctionsExtension.GetEventsFunctions()) {
LaunchResourceWorkerOnEvents(*this, eventsFunction->GetEvents(), worker);
}
}
@@ -1245,12 +1252,14 @@ void Project::Init(const gd::Project& game) {
maxFPS = game.maxFPS;
minFPS = game.minFPS;
verticalSync = game.verticalSync;
scaleMode = game.scaleMode;
sizeOnStartupMode = game.sizeOnStartupMode;
#if defined(GD_IDE_ONLY)
author = game.author;
packageName = game.packageName;
orientation = game.orientation;
adMobAppId = game.adMobAppId;
folderProject = game.folderProject;
latestCompilationDirectory = game.latestCompilationDirectory;
platformSpecificAssets = game.platformSpecificAssets;

View File

@@ -116,6 +116,20 @@ class GD_CORE_API Project : public ObjectsContainer {
*/
const gd::String& GetOrientation() const { return orientation; }
/**
* \brief Change the project AdMob application ID (needed
* to use the AdMob extension). This has no effect on desktop
* and web browsers.
*/
void SetAdMobAppId(const gd::String& adMobAppId_) {
adMobAppId = adMobAppId_;
};
/**
* \brief Get the project AdMob application ID.
*/
const gd::String& GetAdMobAppId() const { return adMobAppId; }
/**
* Called when project file has changed.
*/
@@ -254,6 +268,16 @@ class GD_CORE_API Project : public ObjectsContainer {
*/
void SetVerticalSyncActivatedByDefault(bool enable) { verticalSync = enable; }
/**
* Return the scale mode used by the game (usually "linear" or "nearest").
*/
const gd::String& GetScaleMode() const { return scaleMode; }
/**
* Set the scale mode used by the game (usually "linear" or "nearest").
*/
void SetScaleMode(const gd::String& scaleMode_) { scaleMode = scaleMode_; }
/**
* Return a reference to the vector containing the names of extensions used by
* the project.
@@ -802,7 +826,7 @@ class GD_CORE_API Project : public ObjectsContainer {
* resources, sometimes update their filename or any other work or resources.
*
* See WholeProjectRefactorer for the same thing for events.
*
*
* \see WholeProjectRefactorer
* \see ArbitraryResourceWorker
*/
@@ -934,6 +958,7 @@ class GD_CORE_API Project : public ObjectsContainer {
unsigned int minFPS; ///< Minimum Frame Per Seconds ( slow down game if FPS
///< are below this number )
bool verticalSync; ///< If true, must activate vertical synchronization.
gd::String scaleMode;
gd::String
sizeOnStartupMode; ///< How to adapt the game size to the screen. Can be
///< "adaptWidth", "adaptHeight" or empty
@@ -962,6 +987,7 @@ class GD_CORE_API Project : public ObjectsContainer {
gd::String packageName; ///< Game package name
gd::String orientation; ///< Lock game orientation (on mobile devices).
///< "default", "landscape" or "portrait".
gd::String adMobAppId; ///< AdMob application ID.
bool
folderProject; ///< True if folder project, false if single file project.
gd::String gameFile; ///< File of the game

View File

@@ -79,6 +79,8 @@ std::shared_ptr<Resource> ResourcesManager::CreateResource(
return std::make_shared<ImageResource>();
else if (kind == "audio")
return std::make_shared<AudioResource>();
else if (kind == "font")
return std::make_shared<FontResource>();
std::cout << "Bad resource created (type: " << kind << ")" << std::endl;
return std::make_shared<Resource>();
@@ -92,7 +94,7 @@ bool ResourcesManager::HasResource(const gd::String& name) const {
return false;
}
std::vector<gd::String> ResourcesManager::GetAllResourceNames() {
std::vector<gd::String> ResourcesManager::GetAllResourceNames() const {
std::vector<gd::String> allResources;
for (std::size_t i = 0; i < resources.size(); ++i)
allResources.push_back(resources[i]->GetName());
@@ -134,19 +136,11 @@ bool ImageResource::UpdateProperty(const gd::String& name,
bool ResourcesManager::AddResource(const gd::Resource& resource) {
if (HasResource(resource.GetName())) return false;
try {
const Resource& castedResource = dynamic_cast<const Resource&>(resource);
std::shared_ptr<Resource> newResource =
std::shared_ptr<Resource>(castedResource.Clone());
if (newResource == std::shared_ptr<Resource>()) return false;
resources.push_back(newResource);
} catch (...) {
std::cout << "WARNING: Tried to add a resource which is not a GD C++ "
"Platform Resource to a GD C++ Platform project";
std::cout << char(7);
}
std::shared_ptr<Resource> newResource =
std::shared_ptr<Resource>(resource.Clone());
if (newResource == std::shared_ptr<Resource>()) return false;
resources.push_back(newResource);
return true;
}
@@ -408,16 +402,8 @@ bool ResourceFolder::HasResource(const gd::String& name) const {
void ResourceFolder::AddResource(const gd::String& name,
gd::ResourcesManager& parentManager) {
try {
ResourcesManager& manager = dynamic_cast<ResourcesManager&>(parentManager);
std::shared_ptr<Resource> resource =
std::dynamic_pointer_cast<Resource>(manager.GetResourceSPtr(name));
if (resource != std::shared_ptr<Resource>()) resources.push_back(resource);
} catch (...) {
std::cout << "Warning: A resources manager which is not part of GD C++ "
"Platform was used during call to AddResource"
<< std::endl;
}
std::shared_ptr<Resource> resource = parentManager.GetResourceSPtr(name);
if (resource != std::shared_ptr<Resource>()) resources.push_back(resource);
}
void ResourcesManager::RenameResource(const gd::String& oldName,
@@ -580,7 +566,31 @@ void AudioResource::SerializeTo(SerializerElement& element) const {
"file", GetFile()); // Keep the resource path in the current locale (but
// save it in UTF8 for compatibility on other OSes)
}
#endif
void FontResource::SetFile(const gd::String& newFile) {
file = newFile;
// Convert all backslash to slashs.
while (file.find('\\') != gd::String::npos)
file.replace(file.find('\\'), 1, "/");
}
void FontResource::UnserializeFrom(const SerializerElement& element) {
SetUserAdded(element.GetBoolAttribute("userAdded"));
SetFile(element.GetStringAttribute("file"));
}
#if defined(GD_IDE_ONLY)
void FontResource::SerializeTo(SerializerElement& element) const {
element.SetAttribute("userAdded", IsUserAdded());
element.SetAttribute(
"file", GetFile()); // Keep the resource path in the current locale (but
// save it in UTF8 for compatibility on other OSes)
}
#endif
#if defined(GD_IDE_ONLY)
ResourceFolder::ResourceFolder(const ResourceFolder& other) { Init(other); }
ResourceFolder& ResourceFolder::operator=(const ResourceFolder& other) {

View File

@@ -262,6 +262,34 @@ class GD_CORE_API AudioResource : public Resource {
gd::String file;
};
/**
* \brief Describe a font file used by a project.
*
* \see Resource
* \ingroup ResourcesManagement
*/
class GD_CORE_API FontResource : public Resource {
public:
FontResource() : Resource() { SetKind("font"); };
virtual ~FontResource(){};
virtual FontResource* Clone() const override {
return new FontResource(*this);
}
virtual const gd::String& GetFile() const override { return file; };
virtual void SetFile(const gd::String& newFile) override;
#if defined(GD_IDE_ONLY)
virtual bool UseFile() override { return true; }
void SerializeTo(SerializerElement& element) const override;
#endif
void UnserializeFrom(const SerializerElement& element) override;
private:
gd::String file;
};
/**
* \brief Inventory all resources used by a project
*
@@ -298,7 +326,7 @@ class GD_CORE_API ResourcesManager {
/**
* \brief Get a list containing the names of all resources.
*/
std::vector<gd::String> GetAllResourceNames();
std::vector<gd::String> GetAllResourceNames() const;
#if defined(GD_IDE_ONLY)
/**

View File

@@ -193,7 +193,7 @@ gd::String ValueToJSON(const SerializerValue& val) {
gd::String Serializer::ToJSON(const SerializerElement& element) {
if (element.IsValueUndefined()) {
if (!element.ConsideredAsArrayOf().empty()) {
if (element.ConsideredAsArray()) {
// Store the element as an array in JSON:
gd::String str = "[";
bool firstChild = true;
@@ -201,7 +201,9 @@ gd::String Serializer::ToJSON(const SerializerElement& element) {
if (element.GetAllAttributes().size() > 0) {
std::cout
<< "WARNING: A SerializerElement is considered as an array of "
<< element.ConsideredAsArrayOf()
<< (element.ConsideredAsArrayOf().empty()
? "[unnamed elements]"
: element.ConsideredAsArrayOf())
<< " but has attributes. These attributes won't be saved!"
<< std::endl;
}
@@ -215,9 +217,11 @@ gd::String Serializer::ToJSON(const SerializerElement& element) {
if (children[i].first != element.ConsideredAsArrayOf()) {
std::cout
<< "WARNING: A SerializerElement is considered as an array of "
<< element.ConsideredAsArrayOf() << " but has a children called "
<< children[i].first << ". This children won't be saved!"
<< std::endl;
<< (element.ConsideredAsArrayOf().empty()
? "[unnamed elements]"
: element.ConsideredAsArrayOf())
<< " but has a child called \"" << children[i].first
<< "\". This child won't be saved!" << std::endl;
continue;
}
@@ -422,6 +426,7 @@ size_t ParseJSONObject(const std::string& jsonStr,
return pos + 1;
} else if (jsonStr[pos] == '[') // Array
{
element.ConsiderAsArray();
unsigned int index = 0;
while (index == 0 || jsonStr[pos] == ',') {
pos++;
@@ -456,7 +461,7 @@ size_t ParseJSONObject(const std::string& jsonStr,
{
std::string str;
size_t endPos = pos;
const std::string separators = " \n,}";
const std::string separators = " \n,}]";
while (endPos < jsonStr.length() &&
separators.find_first_of(jsonStr[endPos]) == std::string::npos) {
endPos++;

View File

@@ -6,10 +6,10 @@ namespace gd {
SerializerElement SerializerElement::nullElement;
SerializerElement::SerializerElement() : valueUndefined(true) {}
SerializerElement::SerializerElement() : valueUndefined(true), isArray(false) {}
SerializerElement::SerializerElement(const SerializerValue& value)
: valueUndefined(false), elementValue(value) {}
: valueUndefined(false), elementValue(value), isArray(false) {}
SerializerElement::~SerializerElement() {}

View File

@@ -23,7 +23,7 @@ namespace gd {
class GD_CORE_API SerializerElement {
public:
SerializerElement();
SerializerElement(const SerializerValue & value);
SerializerElement(const SerializerValue &value);
virtual ~SerializerElement();
/** \name Value
@@ -178,18 +178,37 @@ class GD_CORE_API SerializerElement {
* Methods related to the children elements
*/
///@{
/**
* \brief Consider that the element is an array of elements, without specific
* name for the children element.
*
* When serialized to a format accepting arrays (like JSON), the element will
* be serialized to an array.
*/
void ConsiderAsArray() const { isArray = true; };
/**
* \brief Check if the element is considered as an array containing its
* children.
*
* As possible, this should be serialized to an array (possible JSON, but not
* in XML).
*/
bool ConsideredAsArray() const { return isArray; };
/**
* \brief Consider that the element is an array for elements with the given
* name.
*
* In this case, no child with a different name should be added. When
* serialized to format accepting arrays, the element will be serialized to an
* array.
* serialized to a format accepting arrays (like JSON), the element will be
* serialized to an array.
*
* \param name The name of the children.
*/
void ConsiderAsArrayOf(const gd::String &name,
const gd::String &deprecatedName = "") const {
ConsiderAsArray();
arrayOf = name;
deprecatedArrayOf = deprecatedName;
};
@@ -261,8 +280,10 @@ class GD_CORE_API SerializerElement {
std::map<gd::String, SerializerValue> attributes;
std::vector<std::pair<gd::String, std::shared_ptr<SerializerElement> > >
children;
mutable gd::String arrayOf;
mutable gd::String deprecatedArrayOf;
mutable bool isArray; ///< true if element is considered as an array
mutable gd::String arrayOf; ///< The name of the children (was useful for XML
///< parsed elements).
mutable gd::String deprecatedArrayOf; ///< Alternate name for children
};
} // namespace gd

View File

@@ -1,21 +1,26 @@
GDevelop Core
=================
# GDevelop Core (library to create, manipulate and export games)
This is the core library used to build platforms, extensions, tools for GDevelop. The IDE is also based on classes and tools offered by this library.
This is the core library used to handle games, build platforms, extensions and tools for GDevelop. The editor is based on classes and tools offered by this library.
Getting started
---------------
GDevelop Core is a portable C++ library, compiled to be used in JavaScript in the editor.
## 1) Getting started 🤓
First, take a look at the *Readme.md* at the root of the repository and the [developer documentation](http://4ian.github.io/GD-Documentation/).
Contributing
------------
## 2) How to contribute 😎
Any contribution is welcome! Whether you want to submit a bug report, a feature request
or any pull request so as to add a nice feature, do not hesitate to get in touch.
* Check the [the **roadmap** for ideas and features planned](https://trello.com/b/qf0lM7k8/gdevelop-roadmap).
* Follow the [Development](https://github.com/4ian/GDevelop/tree/master/newIDE#development) section of the README to set up GDevelop and start modifying either **the editor** or **[the game engine/extensions](https://github.com/4ian/GDevelop/tree/master/newIDE#development-of-the-game-engine-or-extensions)**.
* To submit your changes, you have first to create a Fork on GitHub (use the Fork button on the top right), then [create a Pull Request](https://help.github.com/articles/creating-a-pull-request-from-a-fork/).
License
-------
GDevelop Core is distributed under the MIT license: See license.txt for
GDevelop Core is distributed under the MIT license: see license.txt for
more information.

View File

@@ -87,11 +87,11 @@ TEST_CASE("Resources", "[common][resources]") {
SECTION("ProjectResourcesAdder") {
std::vector<gd::String> uselessResources =
gd::ProjectResourcesAdder::GetAllUselessImages(project);
gd::ProjectResourcesAdder::GetAllUseless(project, "image");
REQUIRE(uselessResources.size() == 2);
gd::ProjectResourcesAdder::RemoveAllUselessImages(project);
gd::ProjectResourcesAdder::RemoveAllUseless(project, "image");
std::vector<gd::String> remainingResources =
project.GetResourcesManager().GetAllResourceNames();
REQUIRE(remainingResources.size() == 2);

View File

@@ -65,6 +65,44 @@ TEST_CASE("Serializer", "[common]") {
REQUIRE(json == originalJSON);
}
SECTION("Idempotency of unserializing and serializing again") {
auto unserializeAndSerializeToJSON = [](const gd::String& originalJSON) {
SerializerElement element = Serializer::FromJSON(originalJSON);
return Serializer::ToJSON(element);
};
SECTION("Strings and numbers") {
gd::String test1 = "\"\"";
REQUIRE(unserializeAndSerializeToJSON(test1) == test1);
gd::String test2 = "123.455";
REQUIRE(unserializeAndSerializeToJSON(test2) == test2);
}
SECTION("Objects") {
gd::String test1 = "{}";
REQUIRE(unserializeAndSerializeToJSON(test1) == test1);
gd::String test2 = "{\"a\": 1}";
REQUIRE(unserializeAndSerializeToJSON(test2) == test2);
gd::String test3 = "{\"a\": 1,\"b\": {\"c\": 2}}";
REQUIRE(unserializeAndSerializeToJSON(test3) == test3);
}
SECTION("Arrays") {
gd::String test1 = "[]";
REQUIRE(unserializeAndSerializeToJSON(test1) == test1);
gd::String test2 = "[1,2]";
REQUIRE(unserializeAndSerializeToJSON(test2) == test2);
}
SECTION("Mixed") {
gd::String test1 =
"{\"hello\": {\"world\": [{},[],3,\"4\"],\"world2\": [-1,\"-2\","
"{\"-3\": [-4]}]}}";
REQUIRE(unserializeAndSerializeToJSON(test1) == test1);
gd::String test2 =
"{\"hello\": {\"world\": [{},[],3,4],\"world2\": [-1,\"-2\","
"{\"-3\": [-4]}]}}";
REQUIRE(unserializeAndSerializeToJSON(test2) == test2);
}
}
SECTION("Splitter") {
SECTION("Split elements") {
// Create some elements

View File

@@ -0,0 +1,361 @@
/**
* This is a declaration of an extension for GDevelop 5.
*
* Run `node import-GDJS-Runtime.js` (in newIDE/app/scripts) if you make any change
* to this extension file or to any other *.js file that you reference inside.
*
* The file must be named "JsExtension.js", otherwise GDevelop won't load it.
* ⚠️ If you make a change and the extension is not loaded, open the developer console
* and search for any errors.
*
* More information on https://github.com/4ian/GDevelop/blob/master/newIDE/README-extensions.md
*/
module.exports = {
createExtension: function(t, gd) {
const extension = new gd.PlatformExtension();
extension.setExtensionInformation(
'AdMob',
t('AdMob'),
t(
'Allow the game to display AdMob banner, interstitial and reward video ads'
),
'Franco Maciel',
'MIT'
);
// Banner
extension
.addCondition(
'BannerLoading',
t('Banner loading'),
t('Check if a banner is currently loading.'),
t('Banner is loading'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.isBannerLoading');
extension
.addCondition(
'BannerReady',
t('Banner ready'),
t('Check if a banner is ready to be displayed.'),
t('Banner is ready'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.isBannerReady');
extension
.addCondition(
'BannerShowing',
t('Banner showing'),
t('Check if there is a banner being displayed.'),
t('Banner is showing'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.isBannerShowing');
extension
.addCondition(
'BannerExists',
t('Banner exists'),
t('Check if there is a banner in memory (visible or hidden).'),
t('Banner exists'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.existBanner');
extension
.addAction(
'LoadBanner',
t('Load banner'),
t(
'Start loading a banner, you can display it automatically when finish loading.\nIf test mode is set to true a test banner will be displayed.'
),
t(
'Load banner (at top: _PARAM2_, overlap: _PARAM3_, show on load: _PARAM4_, test mode: _PARAM5_)'
),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.addParameter('string', t('Android banner ID'), '', false)
.addParameter('string', t('iOS banner ID'), '', false)
.addParameter(
'yesorno',
t('Display at top? (bottom otherwise)'),
'',
false
)
.setDefaultValue('false')
.addParameter('yesorno', t('Overlap webview?'), '', false)
.setDefaultValue('true')
.addParameter('yesorno', t('Display on load complete?'), '', false)
.setDefaultValue('true')
.addParameter('yesorno', t('Test mode?'), '', false)
.setDefaultValue('true')
.getCodeExtraInformation()
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.loadBanner');
extension
.addAction(
'ShowBanner',
t('Show banner'),
t('Show the banner, will work only when the banner is fully loaded.'),
t('Show banner'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.showBanner');
extension
.addAction(
'HideBanner',
t('Hide banner'),
t(
'Hide the banner. You can show it again with the corresponding action.'
),
t('Hide banner'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.hideBanner');
extension
.addAction(
'RemoveBanner',
t('Remove banner'),
t(
'Remove the banner. You have to load another banner to show it again.'
),
t('Remove banner'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.removeBanner');
// Interstitial
extension
.addCondition(
'InterstitialLoading',
t('Interstitial loading'),
t('Check if an interstitial is currently loading.'),
t('Interstitial is loading'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.isInterstitialLoading');
extension
.addCondition(
'InterstitialReady',
t('Interstitial ready'),
t('Check if an interstitial is ready to be displayed.'),
t('Interstitial is ready'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.isInterstitialReady');
extension
.addCondition(
'InterstitialShowing',
t('Interstitial showing'),
t('Check if there is an interstitial being displayed.'),
t('Interstitial is showing'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.isInterstitialShowing');
extension
.addAction(
'LoadInterstitial',
t('Load interstitial'),
t(
'Start loading an interstitial, you can display it automatically when finish loading.\nIf test mode is set to true a test interstitial will be displayed.'
),
t('Load interstitial (show on load: _PARAM2_, test mode: _PARAM3_)'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.addParameter('string', t('Android interstitial ID'), '', false)
.addParameter('string', t('iOS interstitial ID'), '', false)
.addParameter('yesorno', t('Display on load complete?'), '', false)
.setDefaultValue('true')
.addParameter('yesorno', t('Test mode?'), '', false)
.setDefaultValue('true')
.getCodeExtraInformation()
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.loadInterstitial');
extension
.addAction(
'ShowInterstitial',
t('Show interstitial'),
t(
'Show the interstitial, will work only when the interstitial is fully loaded.'
),
t('Show interstitial'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.showInterstitial');
// Reward video
extension
.addCondition(
'VideoLoading',
t('Video loading'),
t('Check if a reward video is currently loading.'),
t('Reward video is loading'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.isVideoLoading');
extension
.addCondition(
'VideoReady',
t('Video ready'),
t('Check if a reward video is ready to be displayed.'),
t('Reward video is ready'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.isVideoReady');
extension
.addCondition(
'VideoShowing',
t('Video showing'),
t('Check if there is a reward video being displayed.'),
t('Reward video is showing'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.isVideoShowing');
extension
.addCondition(
'VideoReward',
t('Video reward'),
t(
'Check if there is a video reward.\nYou can mark it as non-claimed yet, so you can check this reward in other events.'
),
t('Video reward given'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.addParameter('yesorno', t('Mark as claimed'), '', false)
.setDefaultValue('true')
.getCodeExtraInformation()
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.existVideoReward');
extension
.addAction(
'LoadVideo',
t('Load video'),
t(
'Start loading a reward video, you can display it automatically when finish loading.\nIf test mode is set to true a test video will be displayed.'
),
t('Load reward video (show on load: _PARAM2_, test mode: _PARAM3_)'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.addParameter('string', t('Android reward video ID'), '', false)
.addParameter('string', t('iOS reward video ID'), '', false)
.addParameter('yesorno', t('Display on load complete?'), '', false)
.setDefaultValue('true')
.addParameter('yesorno', t('Test mode?'), '', false)
.setDefaultValue('true')
.getCodeExtraInformation()
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.loadVideo');
extension
.addAction(
'ShowVideo',
t('Show video'),
t(
'Show the reward video, will work only when the video is fully loaded.'
),
t('Show reward video'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.showVideo');
extension
.addAction(
'ClaimReward',
t('Claim reward'),
t('Mark the video reward as claimed.'),
t('Claim video reward'),
t('AdMob'),
'JsPlatform/Extensions/admobicon24.png',
'JsPlatform/Extensions/admobicon16.png'
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/AdMob/admobtools.js')
.setFunctionName('gdjs.adMob.claimVideoReward');
return extension;
},
runExtensionSanityTests: function(gd, extension) {
return [];
},
};

View File

@@ -0,0 +1,352 @@
/**
* @memberof gdjs
* @class adMob
* @static
* @private
*/
gdjs.adMob = {
// Banner
bannerLoading: false,
bannerReady: false,
bannerShowing: false,
bannerExists: false,
bannerAutoshow: false, // Needed because the banner event listeners bug
// Interstitial
interstitialLoading: false,
interstitialReady: false,
interstitialShowing: false,
// Reward video
videoLoading: false,
videoReady: false,
videoShowing: false,
videoReward: false,
};
gdjs.adMob._getPlatformName = function() {
if (/(android)/i.test(navigator.userAgent)) {
return 'android';
} else if (/(ipod|iphone|ipad)/i.test(navigator.userAgent)) {
return 'ios';
} else {
return 'windowsPhone';
}
};
// Banner
gdjs.adMob.isBannerLoading = function() {
return gdjs.adMob.bannerLoading;
};
gdjs.adMob.isBannerReady = function() {
// This block is needed because the banner event listeners bug
if (gdjs.adMob.bannerAutoshow && gdjs.adMob.bannerReady) {
gdjs.adMob.bannerReady = false;
gdjs.adMob.bannerShowing = true;
gdjs.adMob.bannerExists = true;
}
return gdjs.adMob.bannerReady;
};
gdjs.adMob.isBannerShowing = function() {
// This block is needed because the banner event listeners bug
if (gdjs.adMob.bannerAutoshow && gdjs.adMob.bannerReady) {
gdjs.adMob.bannerReady = false;
gdjs.adMob.bannerShowing = true;
gdjs.adMob.bannerExists = true;
}
return gdjs.adMob.bannerShowing;
};
gdjs.adMob.existBanner = function() {
// This block is needed because the banner event listeners bug
if (gdjs.adMob.bannerAutoshow && gdjs.adMob.bannerReady) {
gdjs.adMob.bannerReady = false;
gdjs.adMob.bannerShowing = true;
gdjs.adMob.bannerExists = true;
}
return gdjs.adMob.bannerExists;
};
gdjs.adMob.loadBanner = function(
androidID,
iosID,
atTop,
overlap,
displayOnLoading,
testMode
) {
if (typeof admob === 'undefined') return;
if (
gdjs.adMob.bannerLoading ||
gdjs.adMob.bannerReady ||
gdjs.adMob.bannerExists
)
return;
admob.banner.config({
id: gdjs.adMob._getPlatformName() === 'android' ? androidID : iosID, // Support Android & iOS
bannerAtTop: atTop,
overlap: overlap,
autoShow: displayOnLoading,
isTesting: testMode,
});
admob.banner.prepare();
gdjs.adMob.bannerLoading = true;
gdjs.adMob.bannerReady = false;
// These lines are needed because the banner event listeners bug
gdjs.adMob.bannerAutoshow = displayOnLoading;
gdjs.adMob.bannerShowing = false;
gdjs.adMob.bannerExists = false;
};
gdjs.adMob.showBanner = function() {
if (typeof admob === 'undefined') return;
// This block is needed because the banner event listeners bug
if (gdjs.adMob.bannerReady) {
gdjs.adMob.bannerReady = false;
gdjs.adMob.bannerExists = true;
}
if (gdjs.adMob.bannerExists) gdjs.adMob.bannerShowing = true;
admob.banner.show();
};
gdjs.adMob.hideBanner = function() {
if (typeof admob === 'undefined') return;
if (gdjs.adMob.bannerExists) gdjs.adMob.bannerShowing = false;
admob.banner.hide();
};
gdjs.adMob.removeBanner = function() {
if (typeof admob === 'undefined') return;
// These lines are needed because the banner event listeners bug
gdjs.adMob.bannerExists = false;
gdjs.adMob.bannerShowing = false;
admob.banner.remove();
};
// Interstitial
gdjs.adMob.isInterstitialLoading = function() {
return gdjs.adMob.interstitialLoading;
};
gdjs.adMob.isInterstitialReady = function() {
return gdjs.adMob.interstitialReady;
};
gdjs.adMob.isInterstitialShowing = function() {
return gdjs.adMob.interstitialShowing;
};
gdjs.adMob.loadInterstitial = function(
androidID,
iosID,
displayOnLoading,
testMode
) {
if (typeof admob === 'undefined') return;
if (
gdjs.adMob.interstitialLoading ||
gdjs.adMob.interstitialReady ||
gdjs.adMob.interstitialShowing
)
return;
admob.interstitial.config({
id: gdjs.adMob._getPlatformName() === 'android' ? androidID : iosID, // Support Android & iOS
autoShow: displayOnLoading,
isTesting: testMode,
});
admob.interstitial.prepare();
gdjs.adMob.interstitialLoading = true;
gdjs.adMob.interstitialReady = false;
};
gdjs.adMob.showInterstitial = function() {
if (typeof admob === 'undefined') return;
admob.interstitial.show();
};
// Reward video
gdjs.adMob.isVideoLoading = function() {
return gdjs.adMob.videoLoading;
};
gdjs.adMob.isVideoReady = function() {
return gdjs.adMob.videoReady;
};
gdjs.adMob.isVideoShowing = function() {
return gdjs.adMob.videoShowing;
};
gdjs.adMob.existVideoReward = function(markAsClaimed) {
var reward = gdjs.adMob.videoReward;
if (markAsClaimed) gdjs.adMob.videoReward = false;
return reward;
};
gdjs.adMob.loadVideo = function(androidID, iosID, displayOnLoading, testMode) {
if (typeof admob === 'undefined') return;
if (
gdjs.adMob.videoLoading ||
gdjs.adMob.videoReady ||
gdjs.adMob.videoShowing
)
return;
admob.rewardvideo.config({
id: gdjs.adMob._getPlatformName() === 'android' ? androidID : iosID, // Support Android & iOS
autoShow: displayOnLoading,
isTesting: testMode,
});
admob.rewardvideo.prepare();
gdjs.adMob.videoLoading = true;
gdjs.adMob.videoReady = false;
};
gdjs.adMob.showVideo = function() {
if (typeof admob === 'undefined') return;
admob.rewardvideo.show();
};
gdjs.adMob.claimVideoReward = function() {
gdjs.adMob.videoReward = false;
};
// Banner event listeners
document.addEventListener(
'admob.banner.events.LOAD',
function() {
gdjs.adMob.bannerReady = true;
gdjs.adMob.bannerLoading = false;
},
false
);
document.addEventListener(
'admob.banner.events.LOAD_FAIL',
function() {
gdjs.adMob.bannerLoading = false;
},
false
);
// BUG: These two never get called
/*
document.addEventListener(
"admob.banner.events.OPEN",
function() {
gdjs.adMob.bannerExists = true;
gdjs.adMob.bannerShowing = true;
gdjs.adMob.bannerReady = false;
},
false
);
document.addEventListener(
"admob.banner.events.CLOSE",
function() {
gdjs.adMob.bannerExists = false;
gdjs.adMob.bannerShowing = false;
},
false
);
*/
// Interstitial event listeners
document.addEventListener(
'admob.interstitial.events.LOAD',
function() {
gdjs.adMob.interstitialReady = true;
gdjs.adMob.interstitialLoading = false;
},
false
);
document.addEventListener(
'admob.interstitial.events.LOAD_FAIL',
function() {
gdjs.adMob.interstitialLoading = false;
},
false
);
document.addEventListener(
'admob.interstitial.events.OPEN',
function() {
gdjs.adMob.interstitialShowing = true;
gdjs.adMob.interstitialReady = false;
},
false
);
document.addEventListener(
'admob.interstitial.events.CLOSE',
function() {
gdjs.adMob.interstitialShowing = false;
},
false
);
// Reward video event listeners
document.addEventListener(
'admob.rewardvideo.events.LOAD',
function() {
gdjs.adMob.videoReady = true;
gdjs.adMob.videoLoading = false;
},
false
);
document.addEventListener(
'admob.rewardvideo.events.LOAD_FAIL',
function() {
gdjs.adMob.videoLoading = false;
},
false
);
document.addEventListener(
'admob.rewardvideo.events.OPEN',
function() {
gdjs.adMob.videoShowing = true;
gdjs.adMob.videoReady = false;
},
false
);
document.addEventListener(
'admob.rewardvideo.events.CLOSE',
function() {
gdjs.adMob.videoShowing = false;
},
false
);
document.addEventListener(
'admob.rewardvideo.events.REWARD',
function() {
gdjs.adMob.videoReward = true;
},
false
);

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