Compare commits

...

223 Commits

Author SHA1 Message Date
Florian Rival
00eda8ced8 Bump newIDE version 2020-05-29 18:46:42 +02:00
Florian Rival
7ca5ef6e6c Update translations 2020-05-29 10:12:48 +02:00
Florian Rival
ff8f7e5877 Fix loading spinner still shown after failing to open a project
Don't show in changelog
2020-05-29 09:52:48 +02:00
Harsimran Singh Virk
c8739e3c24 Add Nord theme (#1722) 2020-05-26 23:20:40 +02:00
Florian Rival
69eacedc2b Fix pathfinding obstacle actions not working
Fix #1773
2020-05-26 09:09:16 +02:00
Florian Rival
e5f229e3f7 Fix typo 2020-05-25 10:37:52 +02:00
Florian Rival
74e43f2b43 Fix isPreview
Don't show in changelog
2020-05-24 20:06:10 +02:00
Arthur Pacaud
a04f641415 Add a condition to check if the game is running as a preview (#1740) 2020-05-24 19:01:22 +02:00
Arthur Pacaud
2e5a9e2cfa Fix path to newly created project not persisted between tabs (#1763) 2020-05-22 13:12:27 +02:00
Harsimran Singh Virk
cd4bfd767a Add menu to open recent projects (#1762) 2020-05-19 21:56:55 +02:00
Florian Rival
d9135636fe Fix currentStorageProvider lost after using it in ProjectStorageProviders
Don't show in changelog
2020-05-19 20:30:30 +02:00
Florian Rival
88e08ab7d8 Add AppVeyor status badge to Readme
Don't show in changelog
2020-05-18 21:14:50 +02:00
Florian Rival
6a3af0d57a Fix importing of GDevelop.js to newIDE
Was failing when newIDE was not installed.
Don't show in changelog.
2020-05-18 09:41:23 +02:00
Florian Rival
95b4091085 Fix importing of libGD.js for newIDE tests
Don't show in changelog
2020-05-18 00:04:31 +02:00
Florian Rival
5556766059 Speed up GDevelop.js compilation when "-- --dev" is specified
* This is done by compiling to wasm, without re-translating to JS, which is fine as it's for development only.
2020-05-17 22:37:13 +02:00
Florian Rival
1332582a03 Add methods to add/remove effects to gdjs.Layer
Don't show in changelog
2020-05-17 21:06:00 +02:00
Todor Imreorov
77177063d8 Add an action to clear the state of the Dialogue Tree (#1752)
* This is useful when launching a new game or restarting it.
2020-05-17 21:04:07 +02:00
Florian Rival
ed7ddd2b67 Improve autocompletions for JavaScript code events and for the game engine 2020-05-17 19:30:58 +01:00
Florian Rival
990f59d093 Remove dead code related to debugger opening
Don't show in changelog
2020-05-17 16:06:19 +01:00
Florian Rival
6326c185f4 Refactor Debugger to use a PreviewDebuggerServer abstraction
This will allow the PreviewLaunchers to also start this debugger server (and not only give this ability to the Debugger editor tab).
In the future, this also allow the web-app to have a different implementation of a debugger server.

Don't show in changelog
2020-05-17 16:06:19 +01:00
Florian Rival
9c6972ec0a Fix code generation of extensions when preview started when editing an extension
Don't show in changelog
2020-05-16 16:46:48 +01:00
Florian Rival
814577edff Fix changes made in extensions sometimes not applied to previews
This is because the previews were not waiting for extensions to be fully loaded, which could create problems especially on the web-app when extensions generation is slower (depends on the network speed).
2020-05-16 16:46:48 +01:00
Florian Rival
a8ea4b8fe7 Fix missing translations of preview button menus 2020-05-16 16:46:48 +01:00
Florian Rival
494666e690 Improve Preview buttons
* Show them on the left of the toolbar, always visible.
* Remember the last edited scene or external layout.
* Allow to override the default scene with an external layout.
2020-05-16 16:46:48 +01:00
Sanskar Bajpai
e5a24e3e32 Add missing numpad keys to the list of keyboard keys (#1758) 2020-05-16 12:14:51 +02:00
Florian Rival
68771be104 Fix crash when renaming or deleting a scene (regression in beta 94)
Fix #1756
2020-05-15 21:33:57 +02:00
Florian Rival
9d2bff9442 Improve changelog extractor
Don't mention in changelog
2020-05-14 22:06:27 +02:00
Florian Rival
6a08fb9a86 Bump newIDE version 2020-05-14 21:06:56 +02:00
Florian Rival
c96c3ff1a2 Comment debugging code in MainFrame
Don't show in changelog
2020-05-14 20:57:51 +02:00
Florian Rival
788d557f0e Fix dead code and project stripping
Don't show in changelog
2020-05-14 20:56:02 +02:00
Florian Rival
4f17d526ab Fix typo 2020-05-14 19:26:04 +02:00
Florian Rival
bc27364bb8 Refactor editor containers and their usage in MainFrame
* Ensure all editor are properly flow typed
* Avoid using potentially-stale closures in MainFrame for editors
* Slightly reduce the complexity inside MainFrame now that these risky closures are not necessary anymore
2020-05-13 17:10:49 +01:00
Florian Rival
1fd719fb41 Fix color picker fields that couldn't be focused 2020-05-13 09:42:07 +02:00
Florian Rival
f7e93c2a13 Remove dead code
Don't show in changelog
2020-05-10 23:27:26 +02:00
Florian Rival
c268b19264 Refactor MainFrame callbacks and ProjectStorageProviders
Don't show in changelog
2020-05-10 21:15:25 +01:00
Florian Rival
6baef705eb Refactor a state in MainFrame
Don't show in changelog
2020-05-10 17:27:11 +02:00
Florian Rival
fe8295a6e3 Fix OpenFromStorageProviderDialog opened after opening a Google Drive file
Don't show in changelog
2020-05-10 17:24:08 +02:00
Florian Rival
de616de3fc Refactor a prop typing and extract a state in MainFrame
Don't show in changelog
2020-05-10 16:45:31 +02:00
Harsimran Singh Virk
9e725c58b5 Refactor MainFrame as a functional component with hooks (#1684) 2020-05-10 16:09:55 +02:00
Florian Rival
37028de2f4 Fix warning 2020-05-10 14:09:49 +02:00
Florian Rival
509dd8ff10 Improve changelog extractor
Don't show in changelog
2020-05-10 12:46:24 +02:00
Florian Rival
4c38bcffa8 Fix help icon size in the expression selector 2020-05-10 12:34:10 +02:00
Florian Rival
90c2cc7e44 Fix error highlighting offset in expression fields 2020-05-10 12:33:49 +02:00
Florian Rival
bd6e4206a2 Fix error display at startup
Don't mention in changelog
2020-05-09 12:16:01 +02:00
Florian Rival
9cf5755a90 Refactor loading of libGD.js into index.js, with cache busting 2020-05-09 00:38:07 +02:00
Florian Rival
11c29f444e Add doc for gdjs.RuntimeScene setBackgroundColor and getBackgroundColor 2020-05-08 22:47:23 +02:00
Florian Rival
11475b9cf3 Update make-version-metadata.js comment 2020-05-08 17:42:12 +02:00
Florian Rival
e5476f5712 Bump newIDE version 2020-05-08 17:42:01 +02:00
Florian Rival
e7457c7564 Update translations 2020-05-08 15:39:15 +02:00
Florian Rival
fd015f9ee4 Add script to extract changelog since last git tag 2020-05-08 15:15:19 +02:00
Todor Imreorov
394eb9488c Fix various DialogueTree ("Yarn") bugs (#1671)
* Fix command at the start of a node merges its text with the node that linked to it
* Fix Yarn skipping text results when commands are used in some cases
* Fix setting/getting variables
* Fix text failing to load when first node is of type text
* Add internal debug mode logging to Yarn
* Fix isdialoguelinetype command never true
* Fix new lines in text not properly detected
* Increase strictness on scrolling so it never overflows
* Fix command call detection for non scrolling text
* Fix: add back autoscroll commands, but make it safer and move it to the scroll function
* Use explicit variable types when setting bondagejs state
* Fix command not getting called sometimes 
* Fix text not terminating sometimes
2020-05-08 12:14:14 +02:00
Florian Rival
dd771ea3d1 Rework margins in the whole editor
Reduce list item heights to 32px:
* All lists showing items have items with height of 32px
* Toolbars height: 32px
* Remove padding around texts in tables to ensure 32px height
* Reduce right padding to 8px for consistency with tables

Densify form controls:
* Use spacers (4px) between form controls (ColumnStackLayout)
  * Adapt all editors to use ColumnStackLayout
* Use small version of IconButton
* Cancel margins around checkboxes

Normalize dialogs margins:
* All dialog titles margins are 8px
* All dialog content margins are 8px (same as Column margins)

Reduce tabs height to 32px
2020-05-05 18:37:00 +01:00
Quarkstar
140c7f52cb Fix changing font size of BBText objects using events (#1730) 2020-05-04 18:36:34 +02:00
Florian Rival
cb14f7cfa5 Run code formatting on EventsCodeGenerator.cpp 2020-05-04 17:33:22 +01:00
Florian Rival
93e8dd4002 Improve GDJS code generation integration tests 2020-05-04 17:33:22 +01:00
Florian Rival
b91a2da81c Fix subconditions with custom generated code conditions (like And condition with Equal condition)
* Fix #1729.
* Add an integration test, to test the generated code.
2020-05-04 17:33:22 +01:00
Florian Rival
d6f99c5841 Fix warning 2020-05-03 15:24:39 +02:00
Quarkstar
d2dc352c2a Fix intermittent rendering issues of Panel Sprites corners (#1726) 2020-05-03 15:20:31 +02:00
Florian Rival
f3dc69ea68 Update to Electron 8.2.5 2020-05-02 21:24:58 +02:00
Florian Rival
f4522291fc Fix formatting 2020-05-02 17:24:37 +02:00
Aurélien Vivet
60d7901054 Mark events search as dirty when options are changed (#1721) 2020-05-02 16:25:26 +02:00
Florian Rival
b19e71fe85 Fix scrolling in Debugger 2020-05-01 17:20:36 +02:00
Florian Rival
2b9524651f Rework object name text field styling and some fields width 2020-05-01 16:35:20 +02:00
Florian Rival
680aa3fa6b Remove dead code 2020-05-01 16:29:03 +02:00
Florian Rival
25f8bddfcf Rework scrollbar styling 2020-05-01 15:07:06 +02:00
Florian Rival
a02e5952a3 Adapt subscription plans wording 2020-05-01 13:34:51 +02:00
Florian Rival
b382b99ece Adapt valid color in DefaultTheme 2020-05-01 12:40:42 +02:00
Florian Rival
f6b16da334 Reduce scrollbar thickness 2020-05-01 12:34:53 +02:00
Florian Rival
130912f3c8 Rework scrollbar styling 2020-05-01 12:27:29 +02:00
Aurélien Vivet
49418351d4 Add various cosmetic improvement (including scrollbar) (#1714)
* Color green on icons for current plan
* More precise details on exports
* Move LocalFolderPicker on top
* Styled scrollbar
2020-05-01 11:55:53 +02:00
Florian Rival
cbad5de106 Use the new action/condition editor by default 2020-04-30 23:27:42 +02:00
Florian Rival
1e33a1c6f0 Update README to create AppImage for distributing GDevelop 2020-04-30 21:42:28 +02:00
Florian Rival
997c251a07 Fix typo 2020-04-30 08:59:32 +02:00
Florian Rival
a14e854f4e Fix warning 2020-04-29 21:53:07 +02:00
Florian Rival
b0af6c88fe Make search bar height smaller and use an alternate background color 2020-04-29 20:45:02 +01:00
Florian Rival
08b1f3b5fe Make dark theme separators more visible and panel borders same color 2020-04-29 20:45:02 +01:00
Florian Rival
b392192def Fix scroll in LayersList 2020-04-29 20:45:02 +01:00
Florian Rival
1759e85b84 Add persistence of editor panel layouts 2020-04-29 20:45:02 +01:00
Florian Rival
a3d223ae39 Move InstancesList in a panel and reorder SceneEditor toolbar 2020-04-29 20:45:02 +01:00
Florian Rival
d2fa8c43cf Make LayersList responsive 2020-04-29 20:45:02 +01:00
Florian Rival
dc0dcb673f Add LayersList to stories 2020-04-29 20:45:02 +01:00
Florian Rival
fa2c1bed79 Fix crash (infinite loop) in EventsFunctionsExtensionEditor on small screens 2020-04-29 21:35:31 +02:00
Florian Rival
8489cc3e70 Remove outdated screenshot 2020-04-29 18:20:27 +02:00
Arthur Pacaud
0150e197b0 Add user home path to File System extension (#1705) 2020-04-29 09:29:34 +02:00
Florian Rival
f5a6ca0246 Fix BrowserFileSystem tests on Windows 2020-04-27 22:18:35 +02:00
Arthur Pacaud
a53b63680c Rename multiLine to multiline (#1703)
To be consistent with material-ui's documentation
2020-04-27 22:10:20 +02:00
Arthur Pacaud
2489a26a08 Remove links to non-existing sourcemaps (#1695) 2020-04-27 18:59:58 +02:00
Florian Rival
2346e41936 Fix ProjectManager state not preserved when closed and re-opened 2020-04-27 09:51:57 +02:00
Florian Rival
0b5980d0b6 Make LocalFileSystem robust against removing a file failure.
Might fix 1683
2020-04-26 19:06:45 +02:00
Aurélien Vivet
99fc0b7b46 Fix actions to change color, font size and font family of BBText (#1688) 2020-04-24 22:44:44 +02:00
Jimil Desai
fb45454951 Allow to step through search results by pressing Enter in Events Sheet (#1582) 2020-04-24 22:36:21 +02:00
Florian Rival
9abfa741ce Fix potential crash in EventsSheet when using undo/redo
Fix #1678
2020-04-24 09:59:49 +02:00
Florian Rival
980081516a Fix BrowserFileSystem 2020-04-23 17:58:58 +02:00
Florian Rival
f1bed6ead9 Refactor EventsSheet to use ResponsiveWindowMeasurer 2020-04-23 10:08:56 +02:00
Florian Rival
e139c0218b Update outdated package-lock.json 2020-04-22 19:09:24 +02:00
Florian Rival
ffd0cf8808 Fix height of ResourcePreview 2020-04-22 10:16:24 +02:00
Quarkstar
ae87d3298e Fix renaming an object not updating JavaScript code events using it (#1681) 2020-04-21 18:03:57 +02:00
Florian Rival
6b7a9dd39c Refactor InstancesEditor 2020-04-20 21:58:20 +01:00
Florian Rival
5a3686d6a3 Update to react-measure 2.3.0 2020-04-20 21:58:20 +01:00
Quarkstar
bfef000cc6 Change a structure back to a number/string when its last child is removed (#1677) 2020-04-20 18:09:59 +02:00
Florian Rival
c000a735bb Open object editor when an instance is double clicked 2020-04-19 12:51:56 +02:00
Aurélien Vivet
21e034863e Fix Advanced Bloom effect (#1670)
Fixing "Uncaught (in promise) TypeError: r.KawaseBlurFilter is not a constructor"
2020-04-18 22:09:46 +02:00
Florian Rival
72b883654b Fix scrollbar positioning in scene editors 2020-04-18 19:32:52 +02:00
Nilay Majorwar
b1152b9059 Refactor ElectronMainMenu as a functional component (#1657) 2020-04-18 19:18:06 +02:00
Nilay Majorwar
7d48b85d42 Fix zoom shortcuts for non-Mac platforms (#1644) 2020-04-18 19:13:30 +02:00
Florian Rival
fb8926dd66 Allow all dialogs to be closed with Escape (or backdrop click) 2020-04-18 19:05:55 +02:00
Florian Rival
9ce195e371 Fix Behaviors list opening as a column 2020-04-18 18:44:58 +02:00
Florian Rival
f88f8b60d6 Make icon positioning consistent in RaisedButton and fix warnings 2020-04-18 18:38:06 +02:00
Quarkstar
4eb8ddfba6 Fix renamed object not updated in ForEach or Repeat event (#1654) 2020-04-18 18:24:47 +02:00
Florian Rival
aaab3cb212 Rework layers editor and other misc changes
* Ensure ColorPicker is never shown out of the window area
* Refactor TreeTable
* Fix text in LayerRemoveDialog
* Put layers editor in a panel rather than a Drawer
* Use a RaisedButton to add a variable
2020-04-18 17:24:03 +01:00
Florian Rival
6b3ce705aa Make separation between editor panels clearer 2020-04-18 17:24:03 +01:00
gautamv95
988a7fdb9d Fix typo (#1667) 2020-04-18 14:56:16 +02:00
Florian Rival
11592b11c4 Update GDJS documentation generation README 2020-04-18 14:55:27 +02:00
Florian Rival
e8791fcdf9 Update GDJS/package-lock.json 2020-04-18 11:44:05 +02:00
Florian Rival
e661923fd3 Update GenerateAllDocs.bat 2020-04-18 11:21:27 +02:00
Florian Rival
61c57059fa Update GenerateAllDocs.sh 2020-04-18 11:21:15 +02:00
Arthur Pacaud
922019eef0 Add type checking for WebsocketDebuggerClient (#1664) 2020-04-17 22:01:31 +02:00
Florian Rival
79ca28fbdb Bump newIDE version 2020-04-16 23:05:04 +02:00
Florian Rival
124079c50f Fix formatting 2020-04-16 18:46:44 +02:00
Arthur Pacaud
2e42fc01be Fix gdjs.WebsocketDebuggerClient (#1662) 2020-04-16 16:35:10 +02:00
Florian Rival
770aad5672 Fix electron module not accessible in previews 2020-04-16 09:26:08 +02:00
Aurélien Vivet
bef1b9fb1e Add JSDoc to evt.common functions (#1640) 2020-04-15 22:14:17 +02:00
Florian Rival
831dce0f51 Bump newIDE version 2020-04-15 09:58:22 +02:00
Florian Rival
2da4e79d06 Upgrade material-ui to 4.9.10 to avoid infinite rerender of text areas (#1656) 2020-04-14 23:03:55 +02:00
Florian Rival
804a07c56e Add "Jump sustain time" to Platformer Object behavior (#1650) 2020-04-14 11:24:45 +02:00
Florian Rival
b367f13116 Fix popovers in ForEach/JsCode/Link/Repeat events
Also ensure the fields are focused when opened.
Fix #1653.
2020-04-14 10:04:33 +02:00
Florian Rival
581d7716f7 Fix imports 2020-04-14 10:01:27 +02:00
Nilay Majorwar
19de7aefbc Fix confirmation dialogs making the app lose the focus on Windows (#1649)
Fix #1646

Electron default confirm and alert dialogs don't play nicely with the focus on Windows.
2020-04-14 09:57:22 +02:00
Florian Rival
57759aa1b8 Run auto formatting on platformerobjectruntimebehavior.spec.js 2020-04-13 21:39:38 +02:00
Todor Imreorov
07876afc28 fix "Select option by number" in Dialogue Tree (#1648) 2020-04-13 19:17:06 +02:00
Aurélien Vivet
b9029fba4d Fix help button for BBText objects (#1647) 2020-04-13 14:46:13 +02:00
Florian Rival
c4ba357296 Bump newIDE version 2020-04-13 11:16:06 +02:00
Florian Rival
a47acbb82a Fix deploy script for web-app 2020-04-12 20:05:58 +02:00
Florian Rival
f1f93c9be0 Update translations 2020-04-12 19:54:05 +02:00
Florian Rival
f56d864efb Add cannon-ball-with-physics example 2020-04-12 19:29:19 +02:00
Florian Rival
017f8cf554 Update flappy bird example 2020-04-12 19:19:12 +02:00
Arthur Pacaud
d8546c5547 Add doc and type annotations to gdjs.WebsocketDebuggerClient (#1637) 2020-04-11 18:37:28 +02:00
Florian Rival
0bc6e41709 Remove extra console.log and close confirm dialog in development 2020-04-11 16:28:55 +02:00
Florian Rival
943fac772d Fix translation and warn about unsaved changes in CloseConfirmDialog 2020-04-10 23:24:34 +02:00
Florian Rival
327e4cb6a3 Fix horizontal scrollbar in ExpressionAutocompletionsDisplayer 2020-04-10 19:58:12 +02:00
Florian Rival
277989f329 Fix ExpressionSelector positioning when errors shown in an expression 2020-04-10 19:58:12 +02:00
Florian Rival
2bdae4ed14 Display autocompletions at the bottom of the input 2020-04-10 19:58:12 +02:00
Florian Rival
4bfbd7c78f Add autocompletions when typing an expression
Add ExpressionAutocompletion, ExpressionAutocompletionsDisplayer, ExpressionAutocompletionsHandler.
2020-04-10 19:58:12 +02:00
Harsimran Singh Virk
7b76564dda Fix for redundant scrollbar in Project Manager (#1635) 2020-04-10 14:35:50 +02:00
Florian Rival
41a2b87dd0 Fix unsaved changes not triggered when editing an object 2020-04-09 22:56:52 +02:00
Nilay Majorwar
397781bb98 Disable some menu items if no project is opened (#1626) 2020-04-09 22:25:23 +02:00
Florian Rival
b4fa741717 Upgrade to electron-builder 21.2.0
* Use new entitlement to avoid the packaged and signed macOS app to crash when launched.
* Don't upgrade to a newer version of electron-builder because not compatible with macOS 10.13 it seems
2020-04-09 21:47:14 +02:00
Nilay Majorwar
6e16bd764f Upgrade IDE to Electron v8.2.1 (#1589) 2020-04-09 21:34:51 +02:00
Florian Rival
1071b66c92 Enhance typing of MenuItemTemplate in the whole app 2020-04-08 19:42:02 +02:00
Florian Rival
9ff6d91717 Simplify a bit extra menu item handling in ProjectManager 2020-04-08 19:24:35 +02:00
Nilay Majorwar
bda1eb01d2 Add menu items to scene context menu to edit properties or variables (#1607) 2020-04-08 18:43:32 +02:00
Florian Rival
dfcaf472c7 Fix tests 2020-04-07 16:26:06 +02:00
Florian Rival
c8a9da6aea Fix some bad characters in results of HelpFinder 2020-04-05 19:26:23 +02:00
Florian Rival
daa50931ae Fix formatting 2020-04-05 17:31:01 +02:00
Florian Rival
f84a97a4f2 Move Cursor/touch on object condition to an "object" condition
See #1611
2020-04-05 17:25:09 +02:00
Aurélien Vivet
10d5c403a7 Add preload auto to fix video in electron 8+ and Chrome 76+ (#1624) 2020-04-05 17:14:28 +02:00
Florian Rival
15471e6e28 Move EventsScope to InstructionOrExpression folder 2020-04-05 14:21:35 +02:00
Florian Rival
7ccebc69fa Fix warnings in Storybook 2020-04-05 12:12:03 +02:00
Florian Rival
4c57fbc01f Rename enumerateInstructions to enumerateAllInstructions 2020-04-05 12:02:45 +02:00
Florian Rival
ed58ebd3be Add imperative methods to SemiControlledTextField 2020-04-05 11:40:08 +02:00
dependabot[bot]
9cae4fb264 Bump minimist from 1.2.0 to 1.2.3 in /newIDE/web-app (#1623)
Bumps [minimist](https://github.com/substack/minimist) from 1.2.0 to 1.2.3.
- [Release notes](https://github.com/substack/minimist/releases)
- [Commits](https://github.com/substack/minimist/compare/1.2.0...1.2.3)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-04-05 10:49:51 +02:00
Florian Rival
83e7314863 Clean the GDJS runtime folder only when starting the development app
Potential fix for filesystem issue like #1528
2020-04-04 22:36:03 +02:00
Florian Rival
8ec56164af Update GDevelop-services urls to use proper subdomains 2020-04-04 15:56:39 +02:00
Aurélien Vivet
ba0c4a9bc4 Improve bug reports with system details (#1612) 2020-04-04 15:51:24 +02:00
dependabot[bot]
8706dc727d Bump minimist from 1.2.0 to 1.2.3 in /newIDE/electron-app/app (#1619)
Bumps [minimist](https://github.com/substack/minimist) from 1.2.0 to 1.2.3.
- [Release notes](https://github.com/substack/minimist/releases)
- [Commits](https://github.com/substack/minimist/compare/1.2.0...1.2.3)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-04-04 13:53:15 +02:00
dependabot[bot]
7ee9facb34 Bump minimist from 1.2.0 to 1.2.3 in /newIDE/electron-app (#1620)
Bumps [minimist](https://github.com/substack/minimist) from 1.2.0 to 1.2.3.
- [Release notes](https://github.com/substack/minimist/releases)
- [Commits](https://github.com/substack/minimist/compare/1.2.0...1.2.3)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-04-04 13:52:58 +02:00
gautamv95
4190cbda88 Rationalise dismissing of dialogs with click outside/escape key (#1522)
Fix #1517
2020-04-01 10:05:03 +02:00
Florian Rival
aa73b01bbc Fix warning in ContextMenu 2020-04-01 09:54:43 +02:00
Florian Rival
b242c7863f Add asterisk in titlebar when the file is modified 2020-04-01 09:51:20 +02:00
Apostoles
41550ee10f Track changes to display a smart unsaved changes warning (#1523) 2020-03-31 22:35:08 +02:00
Florian Rival
7af0999f59 Remove obsolete ExternalEditor in LocalApp (#1604) 2020-03-31 09:45:15 +02:00
Nilay Majorwar
93e0ccc163 Add Prettier to electron-app and autoformat files (#1602) 2020-03-30 20:25:08 +02:00
Aurélien Vivet
94303fccc2 Update required CMake version for GDevelop.js (#1600) 2020-03-30 16:05:24 +02:00
Aurélien Vivet
33949fd93c Add option to use MinGW instead ninja for GDevelop.js (#1599) 2020-03-29 23:21:55 +02:00
Harsimran Singh Virk
bd40bb892c Fix selection issues in the Autocomplete lists (#1586) 2020-03-29 21:11:20 +02:00
Florian Rival
c2cf935bd9 Fix typo 2020-03-28 18:24:06 +01:00
Quarkstar
c7d5ab8013 Update Twist/ZoomBlur/RadialBlur to be centered by default (#1564)
Remove dependency on window size, preparing for object effects support
2020-03-25 23:33:55 +01:00
Florian Rival
e8c93a5622 Add autoHideScrollbar and fix scrolling in ScrollView 2020-03-25 22:36:03 +01:00
Garett Tok Ern Liang
348459481a Fix Left/Right Ctrl/Shift/Alt/Meta not recognised as separate keys (#1553) 2020-03-25 21:13:08 +01:00
Florian Rival
e7348f08c4 Update bouncing-ball-and-rope example 2020-03-24 21:46:35 +01:00
Harsimran Singh Virk
ef96adee92 Close InlinePopover after selection in an autocomplete field (#1568)
Also if Escape key is pressed
2020-03-24 08:55:40 +01:00
Florian Rival
66b3ec1686 Rename IsInformative to IsExact in ExpressionCompletionFinder 2020-03-23 23:32:33 +01:00
Arthur Pacaud
b77eb123e8 Move loadObject to registerObject method in gdjs.RuntimeScene (#1572) 2020-03-22 21:32:43 +01:00
Florian Rival
dcba4272e0 Fix description in CRT 2020-03-22 17:16:24 +01:00
Quarkstar
c2dd5a0a09 Allow to change the animation speed/frequency of effects (#1554) 2020-03-22 17:13:05 +01:00
Aurélien Vivet
a6ae265705 Improve visibility of parameter for checkbox in effects list (#1575) 2020-03-22 15:42:51 +01:00
Florian Rival
94fb2fede6 Remove dead code 2020-03-22 15:41:13 +01:00
Jimil Desai
7bcaf55342 Fix warning not showing when using a digit as first character for a name (#1560) 2020-03-22 15:24:28 +01:00
Geetesh Gupta
cc9632e7c1 Remember the directory previously chosen when selecting a resource (#1494) 2020-03-21 13:29:00 +01:00
Aurélien Vivet
3ff5dd7cd2 Add duplicate menu option in Project Manager (#1556) 2020-03-20 09:45:18 +01:00
Florian Rival
1193e1bbd0 Run Prettier autoformatting on some files 2020-03-19 23:17:38 +01:00
Harsimran Singh Virk
9c55b0acc6 Replace Downshift with material-ui Autocomplete. (#1453) 2020-03-19 22:45:21 +01:00
Jimil Desai
d03c1964cb Fix global objects not updated in other editors after modifying them in an editor (#1545) 2020-03-19 19:17:54 +01:00
Aurélien Vivet
e5695aacf6 Fix sentences for video object actions & clean whitespace (#1552) 2020-03-18 21:50:09 +01:00
Florian Rival
8e6d2da9f7 Fix crash in external events 2020-03-18 21:46:32 +01:00
Aurélien Vivet
5c043fd04a Add context menu to select the scene to start the preview with (#1429) 2020-03-18 21:28:18 +01:00
Pranav Shridhar
4edbd9d377 Added shortcut to export project (#1548) 2020-03-18 15:23:08 +01:00
Quarkstar
c6f21955a3 Add BulgePinch, Glitch, RadialBlur and Twist effects (#1531) 2020-03-18 15:20:01 +01:00
Florian Rival
03cc406459 Fix tests 2020-03-18 15:03:11 +01:00
Ferry Pie
c5d855b768 Make table headers bolder (#1512) 2020-03-17 15:03:40 +01:00
Pranav Shridhar
2aba1c57c4 Fix spinner shown in "See all my builds" when not logged in (#1542)
Fix #1541
2020-03-17 14:54:53 +01:00
Minisonny
9614549436 Fix ContextMenu positioning in the web-app (#1527)
Fix #1492
2020-03-17 09:36:26 +01:00
Florian Rival
f1730c239d Add type to ExpressionCompletionDescription::ForObject 2020-03-16 23:08:05 +01:00
Pranav Shridhar
acb19bf8ed Fix typos (#1535) 2020-03-16 19:03:58 +01:00
Florian Rival
4d63fbcca0 Fix Flow typing of components with useImperativeHandle 2020-03-15 13:12:30 +01:00
Florian Rival
eb19b6ba21 Remove Fullstory analytics 2020-03-14 18:48:45 +01:00
Florian Rival
d2747782b4 Remove mention to babel-loader in package.json.README.md 2020-03-14 17:24:20 +01:00
Nilay Majorwar
8202e6b38e Update react-scripts to v3.4.0 (#1526) 2020-03-14 17:22:08 +01:00
Florian Rival
6deb4fa122 Merge branch 'master' of github.com:4ian/GDevelop 2020-03-14 13:58:58 +01:00
Nilay Majorwar
3990064da9 Add Exit GDevelop option to File menu (#1524)
Closes #1498
2020-03-14 12:45:04 +01:00
Quarkstar
a315eabdce Reorder Effects/JsExtension.js (#1519) 2020-03-12 14:57:34 +01:00
Florian Rival
faa02d4459 Add proper handling of closing parenthesis in ExpressionCompletionFinder 2020-03-11 17:41:52 +00:00
Harsimran Singh Virk
8b294ae369 Fix tooltip content for editor titles (#1495)
Fix #1484
2020-03-10 22:21:26 +00:00
Florian Rival
cb43eb7780 Upgrade to Flow 0.120.1 2020-03-10 21:15:48 +00:00
Geetesh Gupta
765295fc5d Add Escape (and Enter) key to finish renaming groups and comments (#1488) 2020-03-09 20:51:42 +00:00
A.Dilshaad
beb3bde4a8 Make New scene naming convention more consistent (#1508) 2020-03-09 10:01:00 +00:00
Aurélien Vivet
fe5b519917 Add blending mode effect (#1499) 2020-03-08 23:34:53 +00:00
Geetesh Gupta
8661fbef07 Fix object name not selectable when renaming an object (#1477)
Fix #1440
2020-03-08 23:09:10 +00:00
Quarkstar
afd11d2480 Add old film, dot and color replace effects (#1497) 2020-03-08 17:44:06 +00:00
Florian Rival
c5ad9715df Fix project name not escaped in Cordova generated config.xml 2020-03-05 21:21:27 +00:00
Florian Rival
4362e8dd42 Add check for libGD.js size in electron app build and fix failure reports 2020-03-05 07:57:31 +00:00
Florian Rival
372fa46709 Fix yarn command wrongly removing space between words (#1491) 2020-03-04 22:39:17 +00:00
Florian Rival
c43cfcd49e Display human readable names for builds in the Builds list (#1489)
Fix #1421
2020-03-04 20:27:14 +00:00
576 changed files with 41753 additions and 31045 deletions

View File

@@ -31,12 +31,17 @@ vector<gd::InstructionsList*> ForEachEvent::GetAllActionsVectors() {
return allActions;
}
vector<gd::Expression*> ForEachEvent::GetAllExpressions() {
vector<gd::Expression*> allExpressions;
allExpressions.push_back(&objectsToPick);
vector<pair<gd::Expression*, gd::ParameterMetadata> >
ForEachEvent::GetAllExpressionsWithMetadata() {
vector<pair<gd::Expression*, gd::ParameterMetadata> >
allExpressionsWithMetadata;
auto metadata = gd::ParameterMetadata().SetType("object");
allExpressionsWithMetadata.push_back(
std::make_pair(&objectsToPick, metadata));
return allExpressions;
return allExpressionsWithMetadata;
}
vector<const gd::InstructionsList*> ForEachEvent::GetAllConditionsVectors()
const {
vector<const gd::InstructionsList*> allConditions;
@@ -52,11 +57,15 @@ vector<const gd::InstructionsList*> ForEachEvent::GetAllActionsVectors() const {
return allActions;
}
vector<const gd::Expression*> ForEachEvent::GetAllExpressions() const {
vector<const gd::Expression*> allExpressions;
allExpressions.push_back(&objectsToPick);
vector<pair<const gd::Expression*, const gd::ParameterMetadata> >
ForEachEvent::GetAllExpressionsWithMetadata() const {
vector<pair<const gd::Expression*, const gd::ParameterMetadata> >
allExpressionsWithMetadata;
auto metadata = gd::ParameterMetadata().SetType("object");
allExpressionsWithMetadata.push_back(
std::make_pair(&objectsToPick, metadata));
return allExpressions;
return allExpressionsWithMetadata;
}
void ForEachEvent::SerializeTo(SerializerElement& element) const {

View File

@@ -50,10 +50,13 @@ class GD_CORE_API ForEachEvent : public gd::BaseEvent {
virtual std::vector<const gd::InstructionsList*> GetAllConditionsVectors()
const;
virtual std::vector<const gd::InstructionsList*> GetAllActionsVectors() const;
virtual std::vector<const gd::Expression*> GetAllExpressions() const;
virtual std::vector<std::pair<const gd::Expression*, const gd::ParameterMetadata> >
GetAllExpressionsWithMetadata() const;
virtual std::vector<gd::InstructionsList*> GetAllConditionsVectors();
virtual std::vector<gd::InstructionsList*> GetAllActionsVectors();
virtual std::vector<gd::Expression*> GetAllExpressions();
virtual std::vector<std::pair<gd::Expression*, gd::ParameterMetadata> >
GetAllExpressionsWithMetadata();
virtual void SerializeTo(SerializerElement& element) const;
virtual void UnserializeFrom(gd::Project& project,

View File

@@ -31,11 +31,15 @@ vector<gd::InstructionsList*> RepeatEvent::GetAllActionsVectors() {
return allActions;
}
vector<gd::Expression*> RepeatEvent::GetAllExpressions() {
vector<gd::Expression*> allExpressions;
allExpressions.push_back(&repeatNumberExpression);
vector<pair<gd::Expression*, gd::ParameterMetadata> >
RepeatEvent::GetAllExpressionsWithMetadata() {
vector<pair<gd::Expression*, gd::ParameterMetadata> >
allExpressionsWithMetadata;
auto metadata = gd::ParameterMetadata().SetType("expression");
allExpressionsWithMetadata.push_back(
std::make_pair(&repeatNumberExpression, metadata));
return allExpressions;
return allExpressionsWithMetadata;
}
vector<const gd::InstructionsList*> RepeatEvent::GetAllConditionsVectors()
@@ -53,11 +57,15 @@ vector<const gd::InstructionsList*> RepeatEvent::GetAllActionsVectors() const {
return allActions;
}
vector<const gd::Expression*> RepeatEvent::GetAllExpressions() const {
vector<const gd::Expression*> allExpressions;
allExpressions.push_back(&repeatNumberExpression);
vector<pair<const gd::Expression*, const gd::ParameterMetadata> >
RepeatEvent::GetAllExpressionsWithMetadata() const {
vector<pair<const gd::Expression*, const gd::ParameterMetadata> >
allExpressionsWithMetadata;
auto metadata = gd::ParameterMetadata().SetType("expression");
allExpressionsWithMetadata.push_back(
std::make_pair(&repeatNumberExpression, metadata));
return allExpressions;
return allExpressionsWithMetadata;
}
void RepeatEvent::SerializeTo(SerializerElement& element) const {

View File

@@ -45,11 +45,14 @@ class GD_CORE_API RepeatEvent : public gd::BaseEvent {
virtual std::vector<gd::InstructionsList*> GetAllConditionsVectors();
virtual std::vector<gd::InstructionsList*> GetAllActionsVectors();
virtual std::vector<gd::Expression*> GetAllExpressions();
virtual std::vector<std::pair<gd::Expression*, gd::ParameterMetadata> >
GetAllExpressionsWithMetadata();
virtual std::vector<const gd::InstructionsList*> GetAllConditionsVectors()
const;
virtual std::vector<const gd::InstructionsList*> GetAllActionsVectors() const;
virtual std::vector<const gd::Expression*> GetAllExpressions() const;
virtual std::vector<std::pair<const gd::Expression*, const gd::ParameterMetadata> >
GetAllExpressionsWithMetadata() const;
virtual void SerializeTo(SerializerElement& element) const;
virtual void UnserializeFrom(gd::Project& project,

View File

@@ -12,6 +12,7 @@
#include <vector>
#include "GDCore/Events/Instruction.h"
#include "GDCore/Events/InstructionsList.h"
#include "GDCore/Extensions/Metadata/InstructionMetadata.h"
#include "GDCore/String.h"
namespace gd {
class EventsList;
@@ -127,15 +128,17 @@ class GD_CORE_API BaseEvent {
};
/**
* \brief Return a list of all expressions of the event.
* \note Used to preprocess or search in the expressions.
* \brief Return a list of all expressions of the event, each with their associated metadata.
* \note Used to preprocess or search in the expressions of the event.
*/
virtual std::vector<gd::Expression*> GetAllExpressions() {
std::vector<gd::Expression*> noExpr;
virtual std::vector<std::pair<gd::Expression*, gd::ParameterMetadata> >
GetAllExpressionsWithMetadata() {
std::vector<std::pair<gd::Expression*, gd::ParameterMetadata> > noExpr;
return noExpr;
};
virtual std::vector<const gd::Expression*> GetAllExpressions() const {
std::vector<const gd::Expression*> noExpr;
virtual std::vector<std::pair<const gd::Expression*, const gd::ParameterMetadata> >
GetAllExpressionsWithMetadata() const {
std::vector<std::pair<const gd::Expression*, const gd::ParameterMetadata> > noExpr;
return noExpr;
};

View File

@@ -348,7 +348,8 @@ class GD_CORE_API ExpressionParser2 {
return std::move(child);
}
return std::move(std::unique_ptr<VariableAccessorOrVariableBracketAccessorNode>());
return std::move(
std::unique_ptr<VariableAccessorOrVariableBracketAccessorNode>());
}
std::unique_ptr<FunctionCallNode> FreeFunction(
@@ -367,10 +368,10 @@ class GD_CORE_API ExpressionParser2 {
: MetadataProvider::GetStrExpressionMetadata(
platform, functionFullName);
auto parametersAndError = Parameters(metadata.parameters);
auto parametersNode = Parameters(metadata.parameters);
auto function = gd::make_unique<FunctionCallNode>(
type, std::move(parametersAndError.first), metadata, functionFullName);
function->diagnostic = std::move(parametersAndError.second);
type, std::move(parametersNode.parameters), metadata, functionFullName);
function->diagnostic = std::move(parametersNode.diagnostic);
if (!function->diagnostic)
function->diagnostic =
ValidateFunction(*function, identifierLocation.GetStartPosition());
@@ -379,6 +380,8 @@ class GD_CORE_API ExpressionParser2 {
identifierLocation.GetStartPosition(), GetCurrentPosition());
function->functionNameLocation = identifierLocation;
function->openingParenthesisLocation = openingParenthesisLocation;
function->closingParenthesisLocation =
parametersNode.closingParenthesisLocation;
return std::move(function);
}
@@ -421,14 +424,14 @@ class GD_CORE_API ExpressionParser2 {
: MetadataProvider::GetObjectStrExpressionMetadata(
platform, objectType, objectFunctionOrBehaviorName);
auto parametersAndError = Parameters(metadata.parameters, objectName);
auto function =
gd::make_unique<FunctionCallNode>(type,
objectName,
std::move(parametersAndError.first),
metadata,
objectFunctionOrBehaviorName);
function->diagnostic = std::move(parametersAndError.second);
auto parametersNode = Parameters(metadata.parameters, objectName);
auto function = gd::make_unique<FunctionCallNode>(
type,
objectName,
std::move(parametersNode.parameters),
metadata,
objectFunctionOrBehaviorName);
function->diagnostic = std::move(parametersNode.diagnostic);
if (!function->diagnostic)
function->diagnostic =
ValidateFunction(*function, objectNameLocation.GetStartPosition());
@@ -439,6 +442,8 @@ class GD_CORE_API ExpressionParser2 {
function->objectNameDotLocation = objectNameDotLocation;
function->functionNameLocation = objectFunctionOrBehaviorNameLocation;
function->openingParenthesisLocation = openingParenthesisLocation;
function->closingParenthesisLocation =
parametersNode.closingParenthesisLocation;
return std::move(function);
}
@@ -485,16 +490,16 @@ class GD_CORE_API ExpressionParser2 {
: MetadataProvider::GetBehaviorStrExpressionMetadata(
platform, behaviorType, functionName);
auto parametersAndError =
auto parametersNode =
Parameters(metadata.parameters, objectName, behaviorName);
auto function =
gd::make_unique<FunctionCallNode>(type,
objectName,
behaviorName,
std::move(parametersAndError.first),
metadata,
functionName);
function->diagnostic = std::move(parametersAndError.second);
auto function = gd::make_unique<FunctionCallNode>(
type,
objectName,
behaviorName,
std::move(parametersNode.parameters),
metadata,
functionName);
function->diagnostic = std::move(parametersNode.diagnostic);
if (!function->diagnostic)
function->diagnostic =
ValidateFunction(*function, objectNameLocation.GetStartPosition());
@@ -507,6 +512,8 @@ class GD_CORE_API ExpressionParser2 {
function->behaviorNameNamespaceSeparatorLocation =
behaviorNameNamespaceSeparatorLocation;
function->openingParenthesisLocation = openingParenthesisLocation;
function->closingParenthesisLocation =
parametersNode.closingParenthesisLocation;
function->functionNameLocation = functionNameLocation;
return std::move(function);
} else {
@@ -527,11 +534,17 @@ class GD_CORE_API ExpressionParser2 {
}
}
std::pair<std::vector<std::unique_ptr<ExpressionNode>>,
std::unique_ptr<gd::ExpressionParserError>>
Parameters(std::vector<gd::ParameterMetadata> parameterMetadata,
const gd::String &objectName = "",
const gd::String &behaviorName = "") {
// A temporary node that will be integrated into function nodes.
struct ParametersNode {
std::vector<std::unique_ptr<ExpressionNode>> parameters;
std::unique_ptr<gd::ExpressionParserError> diagnostic;
ExpressionParserLocation closingParenthesisLocation;
};
ParametersNode Parameters(
std::vector<gd::ParameterMetadata> parameterMetadata,
const gd::String &objectName = "",
const gd::String &behaviorName = "") {
std::vector<std::unique_ptr<ExpressionNode>> parameters;
// By convention, object is always the first parameter, and behavior the
@@ -543,8 +556,9 @@ class GD_CORE_API ExpressionParser2 {
SkipAllWhitespaces();
if (CheckIfChar(IsClosingParenthesis)) {
SkipChar();
return std::make_pair(std::move(parameters), nullptr);
auto closingParenthesisLocation = SkipChar();
return ParametersNode{
std::move(parameters), nullptr, closingParenthesisLocation};
} else {
if (parameterIndex < parameterMetadata.size()) {
const gd::String &type = parameterMetadata[parameterIndex].GetType();
@@ -588,10 +602,12 @@ class GD_CORE_API ExpressionParser2 {
}
}
return std::make_pair(
ExpressionParserLocation invalidClosingParenthesisLocation;
return ParametersNode{
std::move(parameters),
RaiseSyntaxError(_("The list of parameters is not terminated. Add a "
"closing parenthesis to end the parameters.")));
"closing parenthesis to end the parameters.")),
invalidClosingParenthesisLocation};
}
///@}
@@ -821,6 +837,7 @@ class GD_CORE_API ExpressionParser2 {
bool IsEndReached() { return currentPosition >= expression.size(); }
// A temporary node used when reading an identifier
struct IdentifierAndLocation {
gd::String name;
ExpressionParserLocation location;

View File

@@ -385,6 +385,8 @@ struct FunctionCallNode : public FunctionCallOrObjectFunctionNameOrEmptyNode {
///separator, if any.
ExpressionParserLocation
openingParenthesisLocation; ///< Location of the "(".
ExpressionParserLocation
closingParenthesisLocation; ///< Location of the ")".
};
/**

View File

@@ -13,11 +13,12 @@ namespace gd {
void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
gd::PlatformExtension& extension) {
extension
.SetExtensionInformation("BuiltinObject",
_("Features for all objects"),
_("Common features that can be used for all objects in GDevelop."),
"Florian Rival",
"Open source (MIT License)")
.SetExtensionInformation(
"BuiltinObject",
_("Features for all objects"),
_("Common features that can be used for all objects in GDevelop."),
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/objects/base_object/events");
gd::ObjectMetadata& obj = extension.AddObject<gd::Object>(
@@ -72,14 +73,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.UseStandardOperatorParameters("number")
.MarkAsSimple();
obj.AddAction(
"MettreXY",
_("Position of an object"),
_("Change the position of an object."),
_("Change the position of _PARAM0_: _PARAM1_ _PARAM2_ (x axis), _PARAM3_ _PARAM4_ (y axis)"),
_("Position"),
"res/actions/position24.png",
"res/actions/position.png")
obj.AddAction("MettreXY",
_("Position of an object"),
_("Change the position of an object."),
_("Change the position of _PARAM0_: _PARAM1_ _PARAM2_ (x "
"axis), _PARAM3_ _PARAM4_ (y axis)"),
_("Position"),
"res/actions/position24.png",
"res/actions/position.png")
.AddParameter("object", _("Object"))
.AddParameter("operator", _("Modification's sign"))
@@ -294,14 +295,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("objectvar", _("Variable"))
.UseStandardOperatorParameters("number");
obj.AddAction(
"ModVarObjetTxt",
_("Modify the text of a variable of an object"),
_("Modify the text of a variable of an object"),
_("the text of variable _PARAM1_"),
_("Variables"),
"res/actions/var24.png",
"res/actions/var.png")
obj.AddAction("ModVarObjetTxt",
_("Modify the text of a variable of an object"),
_("Modify the text of a variable of an object"),
_("the text of variable _PARAM1_"),
_("Variables"),
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Variable"))
@@ -473,14 +473,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("objectvar", _("Variable"))
.UseStandardRelationalOperatorParameters("number");
obj.AddCondition(
"VarObjetTxt",
_("Text of an object's variable"),
_("Compare the text of a variable of an object."),
_("the text of variable _PARAM1_"),
_("Variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
obj.AddCondition("VarObjetTxt",
_("Text of an object's variable"),
_("Compare the text of a variable of an object."),
_("the text of variable _PARAM1_"),
_("Variables"),
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Variable"))
@@ -634,6 +633,23 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("expression", _("Y position of the point"))
.MarkAsSimple();
extension
.AddCondition("SourisSurObjet",
_("The cursor/touch is on an object"),
_("Test if the cursor is over an object, or if the object "
"is being touched."),
_("The cursor/touch is on _PARAM0_"),
_("Mouse and touch"),
"res/conditions/surObjet24.png",
"res/conditions/surObjet.png")
.AddParameter("objectList", _("Object"))
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("yesorno", _("Accurate test (yes by default)"), "", true)
.SetDefaultValue("yes")
.AddCodeOnlyParameter("conditionInverted", "")
.MarkAsSimple();
obj.AddCondition(
"ObjectTimer",
_("Value of a timer"),

View File

@@ -21,23 +21,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
.SetExtensionHelpPath("/all-features/mouse-touch");
#if defined(GD_IDE_ONLY)
extension
.AddCondition("SourisSurObjet",
_("The cursor/touch is on an object"),
_("Test if the cursor is over an object, or if the object "
"is being touched."),
_("The cursor/touch is on _PARAM0_"),
_("Mouse and touch"),
"res/conditions/surObjet24.png",
"res/conditions/surObjet.png")
.AddParameter("objectList", _("Object"))
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("yesorno", _("Accurate test (yes by default)"), "", true)
.SetDefaultValue("yes")
.AddCodeOnlyParameter("conditionInverted", "")
.MarkAsSimple();
extension
.AddCondition(
"IsMouseWheelScrollingUp",

View File

@@ -380,7 +380,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
obj.AddAction("ChangeBlendMode",
_("Blend mode"),
_("Change the number of the blend mode of an object.\nThe "
"default blend mode is 0 (Alpha)."),
"default blend mode is 0 (Normal)."),
_("Change Blend mode of _PARAM0_ to _PARAM1_"),
_("Effects"),
"res/actions/color24.png",
@@ -388,7 +388,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
.AddParameter("object", _("Object"), "Sprite")
.AddParameter("expression",
_("Mode (0 : Alpha, 1 : Add, 2 : Multiply, 3 : None)"))
_("Mode (0: Normal, 1: Add, 2: Multiply, 3: Screen)"))
.MarkAsSimple();
obj.AddAction("FlipX",

View File

@@ -279,6 +279,43 @@ bool EventsRefactorer::RenameObjectInConditions(
return somethingModified;
}
bool EventsRefactorer::RenameObjectInEventParameters(
const gd::Platform& platform,
gd::ObjectsContainer& project,
gd::ObjectsContainer& layout,
gd::Expression& expression,
gd::ParameterMetadata parameterMetadata,
gd::String oldName,
gd::String newName) {
bool somethingModified = false;
if (gd::ParameterMetadata::IsObject(parameterMetadata.GetType()) &&
expression.GetPlainString() == oldName)
expression = gd::Expression(newName);
// Replace object's name in expressions
else if (ParameterMetadata::IsExpression(
"number", parameterMetadata.GetType())) {
gd::ExpressionParser2 parser(platform, project, layout);
auto node = parser.ParseExpression("number", expression.GetPlainString());
if (ExpressionObjectRenamer::Rename(*node, oldName, newName)) {
expression = ExpressionParser2NodePrinter::PrintNode(*node);
}
}
// Replace object's name in text expressions
else if (ParameterMetadata::IsExpression(
"string", parameterMetadata.GetType())) {
gd::ExpressionParser2 parser(platform, project, layout);
auto node = parser.ParseExpression("string", expression.GetPlainString());
if (ExpressionObjectRenamer::Rename(*node, oldName, newName)) {
expression = ExpressionParser2NodePrinter::PrintNode(*node);
}
}
return somethingModified;
}
void EventsRefactorer::RenameObjectInEvents(const gd::Platform& platform,
gd::ObjectsContainer& project,
gd::ObjectsContainer& layout,
@@ -300,6 +337,15 @@ void EventsRefactorer::RenameObjectInEvents(const gd::Platform& platform,
platform, project, layout, *actionsVectors[j], oldName, newName);
}
vector<pair<gd::Expression*, gd::ParameterMetadata>> expressionsWithMetadata =
events[i].GetAllExpressionsWithMetadata();
for (std::size_t j = 0; j < expressionsWithMetadata.size(); ++j) {
gd::Expression* expression = expressionsWithMetadata[j].first;
gd::ParameterMetadata parameterMetadata = expressionsWithMetadata[j].second;
bool somethingModified = RenameObjectInEventParameters(
platform, project, layout, *expression, parameterMetadata, oldName, newName);
}
if (events[i].CanHaveSubEvents())
RenameObjectInEvents(platform,
project,

View File

@@ -8,6 +8,7 @@
#include <memory>
#include <vector>
#include "GDCore/Events/Instruction.h"
#include "GDCore/Extensions/Metadata/InstructionMetadata.h"
#include "GDCore/String.h"
namespace gd {
class EventsList;
@@ -146,6 +147,20 @@ class GD_CORE_API EventsRefactorer {
gd::InstructionsList& instructions,
gd::String oldName,
gd::String newName);
/**
* Replace all occurrences of an object name by another name in an expression
* with the specified metadata
* ( include : objects or objects in math/text expressions ).
*
* \return true if something was modified.
*/
static bool RenameObjectInEventParameters(const gd::Platform& platform,
gd::ObjectsContainer& project,
gd::ObjectsContainer& layout,
gd::Expression& expression,
gd::ParameterMetadata parameterMetadata,
gd::String oldName,
gd::String newName);
/**
* Remove all conditions of the list using an object

View File

@@ -43,8 +43,9 @@ struct ExpressionCompletionDescription {
/**
* \brief Create a completion for an object with the given prefix
*/
static ExpressionCompletionDescription ForObject(const gd::String& prefix_) {
return ExpressionCompletionDescription(Object, "", prefix_);
static ExpressionCompletionDescription ForObject(const gd::String& type_,
const gd::String& prefix_) {
return ExpressionCompletionDescription(Object, type_, prefix_);
}
/**
@@ -114,23 +115,21 @@ struct ExpressionCompletionDescription {
const gd::String& GetBehaviorName() const { return behaviorName; }
/**
* \brief Set if the completion description is informative, i.e: it's not used
* to
* complete anything. Rather, it should display information about what is
* \brief Set if the completion description is exact, i.e: it's not used
* to complete anything. Rather, it should display information about what is
* described by the completion.
*/
ExpressionCompletionDescription& SetIsInformative(bool isInformative_) {
isInformative = isInformative_;
ExpressionCompletionDescription& SetIsExact(bool isExact_) {
isExact = isExact_;
return *this;
}
/**
* \brief Check if the completion description is informative, i.e: it's not
* used to
* complete anything. Rather, it should display information about what is
* described by the completion.
* \brief Check if the completion description is exact, i.e: it's not
* used to complete anything. Rather, it should display information
* about what is described by the completion.
*/
bool IsInformative() const { return isInformative; }
bool IsExact() const { return isExact; }
/** Default constructor, only to be used by Emscripten bindings. */
ExpressionCompletionDescription() : completionKind(Object){};
@@ -146,14 +145,14 @@ struct ExpressionCompletionDescription {
prefix(prefix_),
objectName(objectName_),
behaviorName(behaviorName_),
isInformative(false) {}
isExact(false) {}
CompletionKind completionKind;
gd::String type;
gd::String prefix;
gd::String objectName;
gd::String behaviorName;
bool isInformative;
bool isExact;
};
/**
@@ -164,7 +163,7 @@ std::ostream& operator<<(std::ostream& os,
os << "{ " << value.GetCompletionKind() << ", " << value.GetType() << ", "
<< value.GetPrefix() << ", " << value.GetObjectName() << ", "
<< value.GetBehaviorName() << ", "
<< (value.IsInformative() ? "informative" : "non-informative") << " }";
<< (value.IsExact() ? "exact" : "non-exact") << " }";
return os;
}
@@ -209,17 +208,20 @@ class GD_CORE_API ExpressionCompletionFinder
protected:
void OnVisitSubExpressionNode(SubExpressionNode& node) override {
completions.push_back(ExpressionCompletionDescription::ForObject(""));
completions.push_back(
ExpressionCompletionDescription::ForObject(node.type, ""));
completions.push_back(
ExpressionCompletionDescription::ForExpression(node.type, ""));
}
void OnVisitOperatorNode(OperatorNode& node) override {
completions.push_back(ExpressionCompletionDescription::ForObject(""));
completions.push_back(
ExpressionCompletionDescription::ForObject(node.type, ""));
completions.push_back(
ExpressionCompletionDescription::ForExpression(node.type, ""));
}
void OnVisitUnaryOperatorNode(UnaryOperatorNode& node) override {
completions.push_back(ExpressionCompletionDescription::ForObject(""));
completions.push_back(
ExpressionCompletionDescription::ForObject(node.type, ""));
completions.push_back(
ExpressionCompletionDescription::ForExpression(node.type, ""));
}
@@ -243,12 +245,12 @@ class GD_CORE_API ExpressionCompletionFinder
void OnVisitIdentifierNode(IdentifierNode& node) override {
if (gd::ParameterMetadata::IsObject(node.type)) {
// Only show completions of objects if an object is required
completions.push_back(
ExpressionCompletionDescription::ForObject(node.identifierName));
completions.push_back(ExpressionCompletionDescription::ForObject(
node.type, node.identifierName));
} else {
// Show completions for expressions and objects otherwise.
completions.push_back(
ExpressionCompletionDescription::ForObject(node.identifierName));
completions.push_back(ExpressionCompletionDescription::ForObject(
node.type, node.identifierName));
completions.push_back(ExpressionCompletionDescription::ForExpression(
node.type, node.identifierName));
}
@@ -259,8 +261,8 @@ class GD_CORE_API ExpressionCompletionFinder
// Behavior function (or behavior function being written, with the
// function name missing)
if (IsCaretOn(node.objectNameLocation)) {
completions.push_back(
ExpressionCompletionDescription::ForObject(node.objectName));
completions.push_back(ExpressionCompletionDescription::ForObject(
node.type, node.objectName));
} else if (IsCaretOn(node.objectNameDotLocation) ||
IsCaretOn(node.objectFunctionOrBehaviorNameLocation)) {
completions.push_back(ExpressionCompletionDescription::ForBehavior(
@@ -276,8 +278,8 @@ class GD_CORE_API ExpressionCompletionFinder
} else {
// Object function or behavior name
if (IsCaretOn(node.objectNameLocation)) {
completions.push_back(
ExpressionCompletionDescription::ForObject(node.objectName));
completions.push_back(ExpressionCompletionDescription::ForObject(
node.type, node.objectName));
} else if (IsCaretOn(node.objectNameDotLocation) ||
IsCaretOn(node.objectFunctionOrBehaviorNameLocation)) {
completions.push_back(ExpressionCompletionDescription::ForBehavior(
@@ -288,11 +290,14 @@ class GD_CORE_API ExpressionCompletionFinder
}
}
void OnVisitFunctionCallNode(FunctionCallNode& node) override {
bool isCaretOnParenthesis = IsCaretOn(node.openingParenthesisLocation) ||
IsCaretOn(node.closingParenthesisLocation);
if (!node.behaviorName.empty()) {
// Behavior function
if (IsCaretOn(node.objectNameLocation)) {
completions.push_back(
ExpressionCompletionDescription::ForObject(node.objectName));
completions.push_back(ExpressionCompletionDescription::ForObject(
node.type, node.objectName));
} else if (IsCaretOn(node.objectNameDotLocation) ||
IsCaretOn(node.behaviorNameLocation)) {
completions.push_back(ExpressionCompletionDescription::ForBehavior(
@@ -303,40 +308,38 @@ class GD_CORE_API ExpressionCompletionFinder
node.functionName,
node.objectName,
node.behaviorName)
.SetIsInformative(IsCaretOn(node.openingParenthesisLocation)));
.SetIsExact(isCaretOnParenthesis));
}
} else if (!node.objectName.empty()) {
// Object function
if (IsCaretOn(node.objectNameLocation)) {
completions.push_back(
ExpressionCompletionDescription::ForObject(node.objectName));
completions.push_back(ExpressionCompletionDescription::ForObject(
node.type, node.objectName));
} else {
// Add completions for behaviors, because we could imagine that the user
// wants to move from an object function to a behavior function, and so
// need behavior completions. Do this unless we're on the parenthesis
// (at which point we're only showing informative message about the
// function).
if (!IsCaretOn(node.openingParenthesisLocation)) {
if (!isCaretOnParenthesis) {
completions.push_back(ExpressionCompletionDescription::ForBehavior(
node.functionName, node.objectName));
}
completions.push_back(
ExpressionCompletionDescription::ForExpression(
node.type, node.functionName, node.objectName)
.SetIsInformative(IsCaretOn(node.openingParenthesisLocation)));
completions.push_back(ExpressionCompletionDescription::ForExpression(
node.type, node.functionName, node.objectName)
.SetIsExact(isCaretOnParenthesis));
}
} else {
// Free function
completions.push_back(
ExpressionCompletionDescription::ForExpression(node.type,
node.functionName)
.SetIsInformative(IsCaretOn(node.openingParenthesisLocation)));
completions.push_back(ExpressionCompletionDescription::ForExpression(
node.type, node.functionName)
.SetIsExact(isCaretOnParenthesis));
}
}
void OnVisitEmptyNode(EmptyNode& node) override {
completions.push_back(
ExpressionCompletionDescription::ForObject(node.text));
ExpressionCompletionDescription::ForObject(node.type, node.text));
completions.push_back(
ExpressionCompletionDescription::ForExpression(node.type, node.text));
}
@@ -344,6 +347,8 @@ class GD_CORE_API ExpressionCompletionFinder
private:
bool IsCaretOn(const ExpressionParserLocation& location,
bool inclusive = false) {
if (!location.IsValid()) return false;
return (location.GetStartPosition() <= searchedPosition &&
((!inclusive && searchedPosition < location.GetEndPosition()) ||
(inclusive && searchedPosition <= location.GetEndPosition())));

View File

@@ -4,6 +4,7 @@
* reserved. This project is released under the MIT License.
*/
#include "ProjectStripper.h"
#include "GDCore/Project/ExternalEvents.h"
#include "GDCore/Project/ExternalLayout.h"
#include "GDCore/Project/Layout.h"
@@ -20,61 +21,8 @@ void GD_CORE_API ProjectStripper::StripProjectForExport(gd::Project& project) {
project.GetLayout(i).GetObjectGroups().Clear();
project.GetLayout(i).GetEvents().Clear();
}
}
void GD_CORE_API ProjectStripper::StripProjectForLayoutEdition(
gd::Project& project, const gd::String& layoutName) {
while (project.GetExternalEventsCount() > 0)
project.RemoveExternalEvents(project.GetExternalEvents(0).GetName());
for (unsigned int i = 0; i < project.GetLayoutsCount(); ++i) {
auto& layout = project.GetLayout(i);
if (layoutName == layout.GetName()) continue;
project.GetLayout(i).GetEvents().Clear();
project.GetLayout(i).GetInitialInstances().Clear();
}
for (unsigned int i = 0; i < project.GetExternalEventsCount(); ++i) {
project.GetExternalEvents(i).GetEvents().Clear();
}
for (unsigned int i = 0; i < project.GetExternalLayoutsCount(); ++i) {
project.GetExternalLayout(i).GetInitialInstances().Clear();
}
}
void GD_CORE_API ProjectStripper::StripProjectForExternalLayoutEdition(
gd::Project& project, const gd::String& externalLayoutName) {
while (project.GetExternalEventsCount() > 0)
project.RemoveExternalEvents(project.GetExternalEvents(0).GetName());
gd::String associatedLayoutName;
if (project.HasExternalLayoutNamed(externalLayoutName)) {
associatedLayoutName =
project.GetExternalLayout(externalLayoutName).GetAssociatedLayout();
}
for (unsigned int i = 0; i < project.GetLayoutsCount(); ++i) {
auto& layout = project.GetLayout(i);
if (!associatedLayoutName.empty() &&
associatedLayoutName == layout.GetName())
continue;
project.GetLayout(i).GetEvents().Clear();
project.GetLayout(i).GetInitialInstances().Clear();
}
for (unsigned int i = 0; i < project.GetExternalEventsCount(); ++i) {
project.GetExternalEvents(i).GetEvents().Clear();
}
for (unsigned int i = 0; i < project.GetExternalLayoutsCount(); ++i) {
auto& externalLayout = project.GetExternalLayout(i);
if (externalLayoutName == externalLayout.GetName()) continue;
externalLayout.GetInitialInstances().Clear();
}
project.ClearEventsFunctionsExtensions();
}
} // namespace gd

View File

@@ -28,23 +28,6 @@ class GD_CORE_API ProjectStripper {
*/
static void StripProjectForExport(gd::Project& project);
/**
* \brief Strip project to keep only the full content of the specified
* layout. The content of other layouts, external events and external layouts
* is removed.
*/
static void StripProjectForLayoutEdition(gd::Project& project,
const gd::String& layoutName);
/**
* \brief Strip project to keep only the full content of the specified
* external layout and the associated layout.
* The content of other layouts, external events and external layouts is
* removed.
*/
static void StripProjectForExternalLayoutEdition(
gd::Project& project, const gd::String& externalLayoutName);
private:
ProjectStripper(){};
virtual ~ProjectStripper(){};

View File

@@ -181,7 +181,7 @@ class GD_CORE_API WholeProjectRefactorer {
bool isObjectGroup);
/**
* \brief Refactor the events function after an object or group is renamed
* \brief Refactor the events function after an object or group is removed
*
* This will update the events of the function and groups.
*/

View File

@@ -7,6 +7,7 @@
#include "Project.h"
#include <stdio.h>
#include <stdlib.h>
#include <cctype>
#include <SFML/System/Utf.hpp>
#include <fstream>
#include <map>
@@ -520,6 +521,9 @@ void Project::RemoveEventsFunctionsExtension(const gd::String& name) {
eventsFunctionsExtensions.erase(eventsFunctionExtension);
}
void Project::ClearEventsFunctionsExtensions() {
eventsFunctionsExtensions.clear();
}
#endif
void Project::UnserializeFrom(const SerializerElement& element) {
@@ -945,18 +949,16 @@ void Project::SerializeTo(SerializerElement& element) const {
#endif
}
bool Project::ValidateObjectName(const gd::String& name) {
bool Project::ValidateName(const gd::String& name) {
if (name.empty()) return false;
if (isdigit(name[0])) return false;
gd::String allowedCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";
return !(name.find_first_not_of(allowedCharacters) != gd::String::npos);
}
gd::String Project::GetBadObjectNameWarning() {
return _("Please use only letters, digits\nand underscores ( _ ).");
}
void Project::ExposeResources(gd::ArbitraryResourceWorker& worker) {
// See also gd::WholeProjectRefactorer::ExposeProjectEvents for a method that
// traverse the whole project (this time for events) and ExposeProjectEffects

View File

@@ -8,6 +8,7 @@
#define GDCORE_PROJECT_H
#include <memory>
#include <vector>
#include "GDCore/Project/LoadingScreen.h"
#include "GDCore/Project/ObjectGroupsContainer.h"
#include "GDCore/Project/ObjectsContainer.h"
@@ -460,22 +461,27 @@ class GD_CORE_API Project : public ObjectsContainer {
std::size_t GetLayoutsCount() const;
/**
* \brief \brief Adds a new empty layout called "name" at the specified
* \brief Add a new empty layout called "name" at the specified
* position in the layout list.
*/
gd::Layout& InsertNewLayout(const gd::String& name, std::size_t position);
/**
* \brief \brief Adds a new layout constructed from the layout passed as
* parameter. \note No pointer or reference must be kept on the layout passed
* as parameter. \param layout The layout that must be copied and inserted
* into the project \param position Insertion position. Even if the position
* \brief Add a new layout constructed from the layout passed as
* parameter.
* \param layout The layout that must be copied and inserted
* into the project
* \param position Insertion position. Even if the position
* is invalid, the layout must be inserted at the end of the layout list.
*
* \note No pointer or reference must be kept on the layout passed
* as parameter.
*
*/
gd::Layout& InsertLayout(const Layout& layout, std::size_t position);
/**
* Must delete layout named "name".
* \brief Delete layout named "name".
*/
void RemoveLayout(const gd::String& name);
@@ -592,7 +598,7 @@ class GD_CORE_API Project : public ObjectsContainer {
std::size_t position);
/**
* Must delete external events named "name".
* \brief Delete external events named "name".
*/
void RemoveExternalEvents(const gd::String& name);
#endif
@@ -673,7 +679,7 @@ class GD_CORE_API Project : public ObjectsContainer {
std::size_t position);
/**
* Must delete external layout named "name".
* \brief Delete external layout named "name".
*/
void RemoveExternalLayout(const gd::String& name);
@@ -694,37 +700,37 @@ class GD_CORE_API Project : public ObjectsContainer {
///@{
#if defined(GD_IDE_ONLY)
/**
* Return true if events functions extension called "name" exists.
* \brief Check if events functions extension called "name" exists.
*/
bool HasEventsFunctionsExtensionNamed(const gd::String& name) const;
/**
* Return a reference to the events functions extension called "name".
* \brief Return a reference to the events functions extension called "name".
*/
EventsFunctionsExtension& GetEventsFunctionsExtension(const gd::String& name);
/**
* Return a reference to the events functions extension called "name".
* \brief Return a reference to the events functions extension called "name".
*/
const EventsFunctionsExtension& GetEventsFunctionsExtension(
const gd::String& name) const;
/**
* Return a reference to the events functions extension at position "index" in
* the list
* \brief Return a reference to the events functions extension at position
* "index" in the list
*/
EventsFunctionsExtension& GetEventsFunctionsExtension(std::size_t index);
/**
* Return a reference to the events functions extension at position "index" in
* the list
* \brief Return a reference to the events functions extension at position
* "index" in the list
*/
const EventsFunctionsExtension& GetEventsFunctionsExtension(
std::size_t index) const;
/**
* Return the position of the events functions extension called "name" in the
* list
* \brief Return the position of the events functions extension called "name"
* in the list.
*/
std::size_t GetEventsFunctionsExtensionPosition(const gd::String& name) const;
@@ -736,7 +742,7 @@ class GD_CORE_API Project : public ObjectsContainer {
void SwapEventsFunctionsExtensions(std::size_t first, std::size_t second);
/**
* Return the number of events functions extension.
* \brief Returns the number of events functions extension.
*/
std::size_t GetEventsFunctionsExtensionsCount() const;
@@ -759,9 +765,14 @@ class GD_CORE_API Project : public ObjectsContainer {
std::size_t position);
/**
* Must delete the events functions extension named "name".
* \brief Delete the events functions extension named "name".
*/
void RemoveEventsFunctionsExtension(const gd::String& name);
/**
* \brief Remove all the events functions extensions.
*/
void ClearEventsFunctionsExtensions();
#endif
///@}
@@ -843,21 +854,10 @@ class GD_CORE_API Project : public ObjectsContainer {
///@{
/**
* Return true if \a objectName can be used as name for an object.
*
* Default implementation check if objectName is only composed of a-z,A-Z,0-9
* or _ characters an if does not conflict with an expression.
* Return true if \a name is valid (can be used safely for an object,
* behavior, events function name, etc...).
*/
static bool ValidateObjectName(const gd::String& objectName);
/**
* Return a message that will be displayed when an invalid object name has
* been entered.
*
* \note This message will be displayed by the IDE into a tooltip.
*/
static gd::String GetBadObjectNameWarning();
static bool ValidateName(const gd::String& name);
///@}
/** \name External source files

View File

@@ -76,6 +76,7 @@ const Variable& Variable::GetChild(const gd::String& name) const {
void Variable::RemoveChild(const gd::String& name) {
if (!isStructure) return;
children.erase(name);
isStructure = !children.empty();
}
bool Variable::RenameChild(const gd::String& oldName,
@@ -190,6 +191,7 @@ void Variable::RemoveRecursively(const gd::Variable& variableToRemove) {
it++;
}
}
isStructure = !children.empty();
}
Variable::Variable(const Variable& other)

View File

@@ -95,6 +95,14 @@ void Serializer::FromXML(SerializerElement& element,
}
#endif
gd::String Serializer::ToEscapedXMLString(const gd::String& str) {
return str.FindAndReplace("&", "&amp;")
.FindAndReplace("'", "&apos;")
.FindAndReplace("\"", "&quot;")
.FindAndReplace("<", "&lt;")
.FindAndReplace(">", "&gt;");
}
namespace {
/**

View File

@@ -27,14 +27,26 @@ class GD_CORE_API Serializer {
static void FromXML(SerializerElement& element,
const TiXmlElement* xmlElement);
#endif
/**
* \brief Escape a string for inclusion in a XML tag
*/
static gd::String ToEscapedXMLString(const gd::String& str);
///@}
/** \name JSON serialization.
* Serialize a SerializerElement from/to JSON.
*/
///@{
/**
* \brief Serialize a gd::SerializerElement to a JSON string.
*/
static gd::String ToJSON(const SerializerElement& element);
static SerializerElement FromJSON(const std::string& json);
/**
* \brief Parse a JSON string and returns a gd::SerializerElement for it.
*/
static SerializerElement FromJSON(const gd::String& json) {
return FromJSON(json.ToUTF8());
}

View File

@@ -34,7 +34,7 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
SECTION("Identifier") {
SECTION("Object or expression completions when type is string") {
std::vector<gd::ExpressionCompletionDescription> expectedCompletions{
gd::ExpressionCompletionDescription::ForObject("My"),
gd::ExpressionCompletionDescription::ForObject("string", "My"),
gd::ExpressionCompletionDescription::ForExpression("string", "My")};
REQUIRE(getCompletionsFor("string", "My", 0) == expectedCompletions);
REQUIRE(getCompletionsFor("string", "My", 1) == expectedCompletions);
@@ -42,7 +42,7 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
}
SECTION("Object or expression completions when type is number") {
std::vector<gd::ExpressionCompletionDescription> expectedCompletions{
gd::ExpressionCompletionDescription::ForObject("My"),
gd::ExpressionCompletionDescription::ForObject("number", "My"),
gd::ExpressionCompletionDescription::ForExpression("number", "My")};
REQUIRE(getCompletionsFor("number", "My", 0) == expectedCompletions);
REQUIRE(getCompletionsFor("number", "My", 1) == expectedCompletions);
@@ -50,14 +50,17 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
}
SECTION("Object when type is an object") {
std::vector<gd::ExpressionCompletionDescription> expectedCompletions{
gd::ExpressionCompletionDescription::ForObject("My")};
gd::ExpressionCompletionDescription::ForObject("object", "My")};
REQUIRE(getCompletionsFor("object", "My", 0) == expectedCompletions);
REQUIRE(getCompletionsFor("object", "My", 1) == expectedCompletions);
REQUIRE(getCompletionsFor("object", "My", 2) == expectedEmptyCompletions);
}
SECTION("Object when type is an object (alternate type)") {
// Also test alternate types also considered as objects (but that can
// result
// in different code generation):
// result in different code generation):
std::vector<gd::ExpressionCompletionDescription> expectedCompletions{
gd::ExpressionCompletionDescription::ForObject("objectPtr", "My")};
REQUIRE(getCompletionsFor("objectPtr", "My", 0) == expectedCompletions);
REQUIRE(getCompletionsFor("objectPtr", "My", 1) == expectedCompletions);
REQUIRE(getCompletionsFor("objectPtr", "My", 2) ==
@@ -66,7 +69,7 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
}
SECTION("Operator (number)") {
std::vector<gd::ExpressionCompletionDescription> expectedCompletions{
gd::ExpressionCompletionDescription::ForObject(""),
gd::ExpressionCompletionDescription::ForObject("number", ""),
gd::ExpressionCompletionDescription::ForExpression("number", "")};
REQUIRE(getCompletionsFor("number", "1 + ", 1) == expectedCompletions);
REQUIRE(getCompletionsFor("number", "1 + ", 2) == expectedCompletions);
@@ -74,7 +77,7 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
}
SECTION("Operator (string)") {
std::vector<gd::ExpressionCompletionDescription> expectedCompletions{
gd::ExpressionCompletionDescription::ForObject(""),
gd::ExpressionCompletionDescription::ForObject("string", ""),
gd::ExpressionCompletionDescription::ForExpression("string", "")};
REQUIRE(getCompletionsFor("string", "\"a\" + ", 3) == expectedCompletions);
REQUIRE(getCompletionsFor("string", "\"a\" + ", 4) == expectedCompletions);
@@ -87,10 +90,10 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
gd::ExpressionCompletionDescription::ForExpression("string",
"Function")};
std::vector<gd::ExpressionCompletionDescription>
expectedInformativeCompletions{
expectedExactCompletions{
gd::ExpressionCompletionDescription::ForExpression("string",
"Function")
.SetIsInformative(true)};
.SetIsExact(true)};
REQUIRE(getCompletionsFor("string", "Function(", 0) ==
expectedCompletions);
REQUIRE(getCompletionsFor("string", "Function(", 1) ==
@@ -98,9 +101,11 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
REQUIRE(getCompletionsFor("string", "Function(", 7) ==
expectedCompletions);
REQUIRE(getCompletionsFor("string", "Function(", 8) ==
expectedInformativeCompletions);
expectedExactCompletions);
REQUIRE(getCompletionsFor("string", "Function(", 9) ==
expectedEmptyCompletions);
REQUIRE(getCompletionsFor("string", "Function()", 9) ==
expectedExactCompletions);
}
SECTION("Unknown function, test with arguments") {
REQUIRE(getCompletionsFor("string", "Function(1", 9) ==
@@ -109,7 +114,7 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
expectedEmptyCompletions);
std::vector<gd::ExpressionCompletionDescription> expectedCompletions{
gd::ExpressionCompletionDescription::ForObject("a"),
gd::ExpressionCompletionDescription::ForObject("unknown", "a"),
gd::ExpressionCompletionDescription::ForExpression("unknown", "a")};
REQUIRE(getCompletionsFor("string", "Function(a", 9) ==
expectedCompletions);
@@ -128,7 +133,8 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
SECTION("Test 1") {
std::vector<gd::ExpressionCompletionDescription>
expectedObjectCompletions{
gd::ExpressionCompletionDescription::ForObject("MyObject")};
gd::ExpressionCompletionDescription::ForObject("string",
"MyObject")};
std::vector<gd::ExpressionCompletionDescription>
expectedBehaviorOrFunctionCompletions{
gd::ExpressionCompletionDescription::ForBehavior("Func",
@@ -154,7 +160,8 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
SECTION("Test 1") {
std::vector<gd::ExpressionCompletionDescription>
expectedObjectCompletions{
gd::ExpressionCompletionDescription::ForObject("MyObject")};
gd::ExpressionCompletionDescription::ForObject("string",
"MyObject")};
std::vector<gd::ExpressionCompletionDescription>
expectedBehaviorOrFunctionCompletions{
gd::ExpressionCompletionDescription::ForBehavior("Func",
@@ -162,10 +169,10 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
gd::ExpressionCompletionDescription::ForExpression(
"string", "Func", "MyObject")};
std::vector<gd::ExpressionCompletionDescription>
expectedInformativeFunctionCompletions{
expectedExactFunctionCompletions{
gd::ExpressionCompletionDescription::ForExpression(
"string", "Func", "MyObject")
.SetIsInformative(true)};
.SetIsExact(true)};
REQUIRE(getCompletionsFor("string", "MyObject.Func(", 0) ==
expectedObjectCompletions);
REQUIRE(getCompletionsFor("string", "MyObject.Func(", 7) ==
@@ -177,9 +184,11 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
REQUIRE(getCompletionsFor("string", "MyObject.Func(", 12) ==
expectedBehaviorOrFunctionCompletions);
REQUIRE(getCompletionsFor("string", "MyObject.Func(", 13) ==
expectedInformativeFunctionCompletions);
expectedExactFunctionCompletions);
REQUIRE(getCompletionsFor("string", "MyObject.Func(", 14) ==
expectedEmptyCompletions);
REQUIRE(getCompletionsFor("string", "MyObject.Func()", 14) ==
expectedExactFunctionCompletions);
}
}
@@ -187,7 +196,8 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
SECTION("Test 1") {
std::vector<gd::ExpressionCompletionDescription>
expectedObjectCompletions{
gd::ExpressionCompletionDescription::ForObject("MyObject")};
gd::ExpressionCompletionDescription::ForObject("string",
"MyObject")};
std::vector<gd::ExpressionCompletionDescription>
expectedBehaviorCompletions{
gd::ExpressionCompletionDescription::ForBehavior("MyBehavior",
@@ -218,7 +228,8 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
SECTION("Test 2") {
std::vector<gd::ExpressionCompletionDescription>
expectedObjectCompletions{
gd::ExpressionCompletionDescription::ForObject("MyObject")};
gd::ExpressionCompletionDescription::ForObject("string",
"MyObject")};
std::vector<gd::ExpressionCompletionDescription>
expectedBehaviorCompletions{
gd::ExpressionCompletionDescription::ForBehavior("MyBehavior",
@@ -248,7 +259,8 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
SECTION("Test 1") {
std::vector<gd::ExpressionCompletionDescription>
expectedObjectCompletions{
gd::ExpressionCompletionDescription::ForObject("MyObject")};
gd::ExpressionCompletionDescription::ForObject("string",
"MyObject")};
std::vector<gd::ExpressionCompletionDescription>
expectedBehaviorCompletions{
gd::ExpressionCompletionDescription::ForBehavior("MyBehavior",
@@ -258,10 +270,10 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
gd::ExpressionCompletionDescription::ForExpression(
"string", "Func", "MyObject", "MyBehavior")};
std::vector<gd::ExpressionCompletionDescription>
expectedInformativeFunctionCompletions{
expectedExactFunctionCompletions{
gd::ExpressionCompletionDescription::ForExpression(
"string", "Func", "MyObject", "MyBehavior")
.SetIsInformative(true)};
.SetIsExact(true)};
REQUIRE(getCompletionsFor("string", "MyObject.MyBehavior::Func(", 0) ==
expectedObjectCompletions);
REQUIRE(getCompletionsFor("string", "MyObject.MyBehavior::Func(", 7) ==
@@ -282,6 +294,14 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
expectedFunctionCompletions);
REQUIRE(getCompletionsFor("string", "MyObject.MyBehavior::Func(", 23) ==
expectedFunctionCompletions);
REQUIRE(getCompletionsFor("string", "MyObject.MyBehavior::Func(", 24) ==
expectedFunctionCompletions);
REQUIRE(getCompletionsFor("string", "MyObject.MyBehavior::Func(", 25) ==
expectedExactFunctionCompletions);
REQUIRE(getCompletionsFor("string", "MyObject.MyBehavior::Func(", 26) ==
expectedEmptyCompletions);
REQUIRE(getCompletionsFor("string", "MyObject.MyBehavior::Func()", 26) ==
expectedExactFunctionCompletions);
}
}
}

View File

@@ -1172,6 +1172,8 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
REQUIRE(textNode.location.GetEndPosition() == 23);
REQUIRE(identifierNode.location.GetStartPosition() == 25);
REQUIRE(identifierNode.location.GetEndPosition() == 30);
REQUIRE(functionNode.closingParenthesisLocation.GetStartPosition() == 30);
REQUIRE(functionNode.closingParenthesisLocation.GetEndPosition() == 31);
}
SECTION("Free function locations (with whitespaces)") {
auto node = parser.ParseExpression("number",
@@ -1192,6 +1194,8 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
REQUIRE(functionNode.functionNameLocation.GetEndPosition() == 16);
REQUIRE(functionNode.openingParenthesisLocation.GetStartPosition() == 18);
REQUIRE(functionNode.openingParenthesisLocation.GetEndPosition() == 19);
REQUIRE(functionNode.closingParenthesisLocation.GetStartPosition() == 32);
REQUIRE(functionNode.closingParenthesisLocation.GetEndPosition() == 33);
}
SECTION("Object function locations") {
auto node = parser.ParseExpression(
@@ -1231,6 +1235,8 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
REQUIRE(textNode.location.GetEndPosition() == 38);
REQUIRE(identifierNode.location.GetStartPosition() == 40);
REQUIRE(identifierNode.location.GetEndPosition() == 45);
REQUIRE(functionNode.closingParenthesisLocation.GetStartPosition() == 45);
REQUIRE(functionNode.closingParenthesisLocation.GetEndPosition() == 46);
}
SECTION("Object function name locations") {
auto node =
@@ -1306,6 +1312,8 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
REQUIRE(functionNode.functionNameLocation.GetEndPosition() == 33);
REQUIRE(functionNode.openingParenthesisLocation.GetStartPosition() == 34);
REQUIRE(functionNode.openingParenthesisLocation.GetEndPosition() == 35);
REQUIRE(functionNode.closingParenthesisLocation.GetStartPosition() == 48);
REQUIRE(functionNode.closingParenthesisLocation.GetEndPosition() == 49);
}
SECTION("Behavior function locations") {
auto node = parser.ParseExpression(
@@ -1350,6 +1358,8 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
REQUIRE(textNode.location.GetEndPosition() == 56);
REQUIRE(identifierNode.location.GetStartPosition() == 58);
REQUIRE(identifierNode.location.GetEndPosition() == 63);
REQUIRE(functionNode.closingParenthesisLocation.GetStartPosition() == 63);
REQUIRE(functionNode.closingParenthesisLocation.GetEndPosition() == 64);
}
SECTION("Behavior function name locations (with whitespace)") {
auto node = parser.ParseExpression(

View File

@@ -35,6 +35,8 @@ module.exports = {
if (propertyName in objectContent) {
if (typeof objectContent[propertyName] === 'boolean')
objectContent[propertyName] = newValue === '1';
else if (typeof objectContent[propertyName] === 'number')
objectContent[propertyName] = parseFloat(newValue);
else objectContent[propertyName] = newValue;
return true;
}
@@ -67,7 +69,7 @@ module.exports = {
objectProperties.set(
'fontSize',
new gd.PropertyDescriptor(objectContent.fontSize)
new gd.PropertyDescriptor(objectContent.fontSize.toString())
.setType('number')
.setLabel(_('Base size'))
);
@@ -111,7 +113,7 @@ module.exports = {
text:
'[b]bold[/b] [i]italic[/i] [size=15]smaller[/size] [font=times]times[/font] font\n[spacing=12]spaced out[/spacing]\n[outline=yellow]outlined[/outline] [shadow=red]DropShadow[/shadow] ',
opacity: 255,
fontSize: '20',
fontSize: 20,
visible: true,
color: '#000000',
fontFamily: 'Arial',
@@ -410,7 +412,7 @@ module.exports = {
objectsEditorService.registerEditorConfiguration(
'BBText::BBText',
objectsEditorService.getDefaultObjectJsImplementationPropertiesEditor({
helpPagePath: '/objects/bbtext_object',
helpPagePath: '/objects/bbtext',
})
);
},

View File

@@ -76,6 +76,7 @@ gdjs.BBTextRuntimeObjectPixiRenderer.prototype.updateText = function() {
gdjs.BBTextRuntimeObjectPixiRenderer.prototype.updateColor = function() {
this._pixiObject.textStyles.default.fill = this._object._color;
this._pixiObject.dirty = true;
};
gdjs.BBTextRuntimeObjectPixiRenderer.prototype.updateAlignment = function() {
@@ -83,10 +84,12 @@ gdjs.BBTextRuntimeObjectPixiRenderer.prototype.updateAlignment = function() {
this._pixiObject.dirty = true;
};
gdjs.BBTextRuntimeObjectPixiRenderer.prototype.updateFontFamily = function() {
this._pixiObject.textStyles.default.fontFamily = this._object._fontFamily;
this._pixiObject.textStyles.default.fontFamily = this._object._runtimeScene.getGame().getFontManager().getFontFamily(this._object._fontFamily);
this._pixiObject.dirty = true;
};
gdjs.BBTextRuntimeObjectPixiRenderer.prototype.updateFontSize = function() {
this._pixiObject.textStyles.default.fontSize = this._object._fontSize + 'px';
this._pixiObject.dirty = true;
};
gdjs.BBTextRuntimeObjectPixiRenderer.prototype.updatePosition = function() {

View File

@@ -25,7 +25,8 @@ gdjs.BBTextRuntimeObject = function(runtimeScene, objectData) {
gdjs.RuntimeObject.call(this, runtimeScene, objectData);
/** @type {number} */
this._opacity = objectData.content.opacity;
this._opacity = parseFloat(objectData.content.opacity);
// parseFloat should not be required, but GDevelop 5.0 beta 92 and below were storing it as a string.
/** @type {boolean} */
this._visible = objectData.content.visible;
/** @type {string} */
@@ -35,7 +36,8 @@ gdjs.BBTextRuntimeObject = function(runtimeScene, objectData) {
/** @type {string} */
this._fontFamily = objectData.content.fontFamily;
/** @type {number} */
this._fontSize = objectData.content.fontSize;
this._fontSize = parseFloat(objectData.content.fontSize);
// parseFloat should not be required, but GDevelop 5.0 beta 92 and below were storing it as a string.
/** @type {boolean} */
this._wordWrap = objectData.content.wordWrap;
/** @type {number} */

File diff suppressed because one or more lines are too long

View File

@@ -45,7 +45,7 @@ module.exports = {
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/DialogueTree/dialoguetools.js')
.addIncludeFile('Extensions/DialogueTree/bondage.min.js')
.addIncludeFile('Extensions/DialogueTree/bondage.js/dist/bondage.min.js')
.setFunctionName('gdjs.dialogueTree.loadFromSceneVariable');
extension
@@ -69,7 +69,7 @@ module.exports = {
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/DialogueTree/dialoguetools.js')
.addIncludeFile('Extensions/DialogueTree/bondage.min.js')
.addIncludeFile('Extensions/DialogueTree/bondage.js/dist/bondage.min.js')
.setFunctionName('gdjs.dialogueTree.loadFromJsonFile');
extension
@@ -168,15 +168,14 @@ module.exports = {
_(
'Select option by number. Use this when the dialogue line is of type "options" and the player has pressed a button to change selected option.'
),
_('Select option by number'),
_('Select option at index _PARAM0_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('expression', _('Option index number'), '', false)
.setDefaultValue('0')
.getCodeExtraInformation()
.setFunctionName('gdjs.dialogueTree.selectPreviousOption');
.setFunctionName('gdjs.dialogueTree.selectOption');
extension
.addAction(
@@ -210,21 +209,55 @@ module.exports = {
extension
.addAction(
'SetVariable',
_('Set dialogue state variable'),
'SetStringVariable',
_('Set dialogue state string variable'),
_(
'Set dialogue state variable. Use this to set a variable that the dialogue data is using.'
'Set dialogue state string variable. Use this to set a variable that the dialogue data is using.'
),
_('Set dialogue state variable _PARAM0_ to _PARAM1_'),
_('Set dialogue state string variable _PARAM0_ to _PARAM1_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('string', _('State Variable Name'), '', false)
.addParameter('expression', _('Variable Value'), '', false)
.addParameter('string', _('Variable string value'), '', false)
.getCodeExtraInformation()
.setFunctionName('gdjs.dialogueTree.setVariable');
extension
.addAction(
'SetNumberVariable',
_('Set dialogue state number variable'),
_(
'Set dialogue state number variable. Use this to set a variable that the dialogue data is using.'
),
_('Set dialogue state number variable _PARAM0_ to _PARAM1_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('string', _('State Variable Name'), '', false)
.addParameter('expression', _('Variable number value'), '', true)
.getCodeExtraInformation()
.setFunctionName('gdjs.dialogueTree.setVariable');
extension
.addAction(
'SetBooleanVariable',
_('Set dialogue state boolean variable'),
_(
'Set dialogue state boolean variable. Use this to set a variable that the dialogue data is using.'
),
_('Set dialogue state boolean variable _PARAM0_ to _PARAM1_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('string', _('State Variable Name'), '', false)
.addParameter('trueorfalse', _('Variable boolean value'), '', false)
.getCodeExtraInformation()
.setFunctionName('gdjs.dialogueTree.setVariable');
extension
.addAction(
'SaveState',
@@ -257,6 +290,21 @@ module.exports = {
.getCodeExtraInformation()
.setFunctionName('gdjs.dialogueTree.loadState');
extension
.addAction(
'ClearState',
_('Clear dialogue state'),
_(
'Clear dialogue state. This resets all dialogue state accumulated by the player choices. Useful when the player is starting a new game.'
),
_('Clear dialogue state'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'JsPlatform/Extensions/yarn32.png'
)
.getCodeExtraInformation()
.setFunctionName('gdjs.dialogueTree.clearState');
extension
.addStrExpression(
'LineText',
@@ -592,9 +640,9 @@ module.exports = {
extension
.addCondition(
'WasBranchVisited',
_('Branch title has been visited before'),
_('Check if the current branch has been visited before'),
_('Branch title _PARAM0_ has been visited before'),
_('Branch title has been visited'),
_('Check if a branch has been visited'),
_('Branch title _PARAM0_ has been visited'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'JsPlatform/Extensions/yarn32.png'
@@ -605,12 +653,12 @@ module.exports = {
extension
.addCondition(
'CompareDialogueStateVariable',
_('Compare dialogue state variable'),
'CompareDialogueStateStringVariable',
_('Compare dialogue state string variable'),
_(
'Compare dialogue state variable. Use this to trigger game events via dialogue variables.'
'Compare dialogue state string variable. Use this to trigger game events via dialogue variables.'
),
_('Dialogue state variable _PARAM0_ is equal to _PARAM1_'),
_('Dialogue state string variable _PARAM0_ is equal to _PARAM1_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'JsPlatform/Extensions/yarn32.png'
@@ -620,6 +668,40 @@ module.exports = {
.getCodeExtraInformation()
.setFunctionName('gdjs.dialogueTree.compareVariable');
extension
.addCondition(
'CompareDialogueStateNumberVariable',
_('Compare dialogue state number variable'),
_(
'Compare dialogue state number variable. Use this to trigger game events via dialogue variables.'
),
_('Dialogue state number variable _PARAM0_ is equal to _PARAM1_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('string', _('State variable'), '', false)
.addParameter('expression', _('Equal to'), '', false)
.getCodeExtraInformation()
.setFunctionName('gdjs.dialogueTree.compareVariable');
extension
.addCondition(
'CompareDialogueStateBooleanVariable',
_('Compare dialogue state boolean variable'),
_(
'Compare dialogue state variable. Use this to trigger game events via dialogue variables.'
),
_('Dialogue state boolean variable _PARAM0_ is equal to _PARAM1_'),
_('Dialogue Tree (experimental)'),
'JsPlatform/Extensions/yarn24.png',
'JsPlatform/Extensions/yarn32.png'
)
.addParameter('string', _('State variable'), '', false)
.addParameter('trueorfalse', _('Equal to'), '', false)
.getCodeExtraInformation()
.setFunctionName('gdjs.dialogueTree.compareVariable');
extension
.addCondition(
'HasClippedTextScrollingCompleted',

View File

@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2017 j hayley
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,66 @@
# bondage.js [![Build Status](https://travis-ci.org/jhayley/bondage.js.svg?branch=master)](https://travis-ci.org/jhayley/bondage.js)
[Yarn](https://github.com/InfiniteAmmoInc/Yarn) parser for Javascript, in the same vein as [YarnSpinner](https://github.com/thesecretlab/YarnSpinner).
# Usage
#### As a Web Tool
To run through your yarn files in your browser, go to http://hayley.zone/bondage.js, paste your yarn data in the field, then hit "compile".
#### As a Command Line Tool
Installation: `npm install -g bondage`
Now you can use the `bondage` command to run through Yarn files from the command line. You can load one or multiple files at a time. If you load multiple files and a two nodes are encountered with the same name, the node will be overwritten.
**Examples**
* Running a single file from the default start node (named "Start"): `bondage run yarnfile.json`
* Running a single file from the specified node name: `bondage run -s StartNode yarnfile.json`
* Running multiple files from the specified node name: `bondage run -s StartNode yarnfile1.json yarnfile2.json ...`
* See the compiled ast: `bondage compile --ast yarnfile.json`
* See the tokenized input: `bondage compile --tokens yarnfile.json`
#### As a Library
**Web**
Include [dist/bondage.min.js](https://github.com/jhayley/bondage.js/blob/master/dist/bondage.min.js) somewhere in your html, and the `bondage` variable will be added to the global scope. You can then access everything in the example below (such as `bondage.Runner`) through that variable.
**Node**
Installation: `npm install bondage`
```javascript
const fs = require('fs');
const bondage = require('bondage');
const runner = new bondage.Runner();
const yarnData = JSON.parse(fs.readFileSync('yarnFile.json'));
runner.load(yarnData);
// Loop over the dialogue from the node titled 'Start'
for (const result of runner.run('Start')) {
// Do something else with the result
if (result instanceof bondage.TextResult) {
console.log(result.text);
} else if (result instanceof bondage.OptionsResult) {
// This works for both links between nodes and shortcut options
console.log(result.options);
// Select based on the option's index in the array (if you don't select an option, the dialog will continue past them)
result.select(1);
} else if (result instanceof bondage.CommandResult) {
// If the text was inside <<here>>, it will get returned as a CommandResult string, which you can use in any way you want
console.log(result.text);
}
}
// Advance the dialogue manually from the node titled 'Start'
const d = runner.run('Start')
let result = d.next().value;
let nextResult = d.next().value;
// And so on
```
For usage of the yarn format itself, please see the [YarnSpinner Documentation](https://github.com/thesecretlab/YarnSpinner/tree/master/Documentation), everything there should carry here too (if something does not match up, please open an issue).

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,5 @@
This extension is using bondage.js library to parse yarn syntax.
https://github.com/hylyh/bondage.js
The current build used is built from commit 3c63e21

View File

@@ -101,7 +101,20 @@ gdjs.dialogueTree.isRunning = function() {
gdjs.dialogueTree.scrollClippedText = function() {
if (this.pauseScrolling || !this.dialogueIsRunning) return;
if (this.dialogueText) {
// Autoscroll commands so the user doesnt have to press again
if (
gdjs.dialogueTree._isLineTypeCommand() &&
this.dialogueDataType === 'text' &&
this.dialogueBranchTitle === this.dialogueData.data.title &&
this.lineNum === this.dialogueData.lineNum &&
gdjs.dialogueTree.hasClippedScrollingCompleted()
) {
gdjs.dialogueTree.goToNextDialogueLine();
return
}
// Increment scrolling of clipped text
if (this.dialogueText && this.dialogueDataType === 'text' && this.clipTextEnd < this.dialogueText.length) {
this.clipTextEnd += 1;
}
};
@@ -110,7 +123,7 @@ gdjs.dialogueTree.scrollClippedText = function() {
* Scroll the clipped text to its end, so the entire text is printed. This can be useful in keeping the event sheet logic simpler, while supporting more variation.
*/
gdjs.dialogueTree.completeClippedTextScrolling = function() {
if (this.pauseScrolling || !this.dialogueIsRunning || !this.dialogueText)
if (this.pauseScrolling || !this.dialogueIsRunning || !this.dialogueText || this.dialogueDataType !== 'text')
return;
this.clipTextEnd = this.dialogueText.length;
};
@@ -120,9 +133,11 @@ gdjs.dialogueTree.completeClippedTextScrolling = function() {
* Useful to prevent the user from skipping to next line before the current one has been printed fully.
*/
gdjs.dialogueTree.hasClippedScrollingCompleted = function() {
if (!this.dialogueIsRunning) return false;
if (this.dialogueData && this.dialogueText.length) {
return this.clipTextEnd >= this.dialogueText.length;
if (!this.dialogueIsRunning || this.dialogueDataType === '') return false;
if (this.dialogueData && this.dialogueText.length > 0 && this.clipTextEnd >= this.dialogueText.length) {
if (gdjs.dialogueTree.getVariable('debug')) console.warn('Scroll completed:', this.clipTextEnd,'/', this.dialogueText.length);
return true;
}
return false;
};
@@ -142,7 +157,6 @@ gdjs.dialogueTree.getClippedLineText = function() {
* Note that using this instead getClippedLineText will skip any <<wait>> commands entirely.
*/
gdjs.dialogueTree.getLineText = function() {
this.completeClippedTextScrolling();
return this.dialogueIsRunning && this.dialogueText.length
? this.dialogueText
: '';
@@ -163,6 +177,7 @@ gdjs.dialogueTree.commandParametersCount = function() {
* @param {number} paramIndex The index of the parameter to get.
*/
gdjs.dialogueTree.getCommandParameter = function(paramIndex) {
if (paramIndex === -1 && this.commandParameters.length > 0) return this.commandParameters[0];
if (
this.commandParameters &&
this.commandParameters.length >= paramIndex + 1
@@ -188,17 +203,20 @@ gdjs.dialogueTree.isCommandCalled = function(command) {
if (this.pauseScrolling || !commandCalls) return false;
return this.commandCalls.some(function(call, index) {
if (clipTextEnd < call.time) return false;
if (call.cmd === 'wait' && clipTextEnd !== dialogueText.length) {
if (clipTextEnd !== 0 && clipTextEnd < call.time) return false;
if (call.cmd === 'wait' && (clipTextEnd === 0 || clipTextEnd !== dialogueText.length)) {
gdjs.dialogueTree.pauseScrolling = true;
setTimeout(function() {
gdjs.dialogueTree.pauseScrolling = false;
commandCalls.splice(index, 1);
if (gdjs.dialogueTree.getVariable('debug')) console.info('CMD:', call);
}, parseInt(call.params[1], 10));
}
if (call.cmd === command) {
gdjs.dialogueTree.commandParameters = call.params;
commandCalls.splice(index, 1);
if (gdjs.dialogueTree.getVariable('debug')) console.info('CMD:', call);
return true;
}
});
@@ -339,7 +357,7 @@ gdjs.dialogueTree.selectOption = function(optionIndex) {
if (!this.dialogueIsRunning) return;
if (this.dialogueData.select) {
this.selectedOption = gdjs.dialogueTree._normalizedOptionIndex(
this.selectedOption
optionIndex
);
this.selectedOptionUpdated = true;
}
@@ -384,16 +402,21 @@ gdjs.dialogueTree.hasSelectedOptionChanged = function() {
* @param {string} type The type you want to check for ( one of the three above )
*/
gdjs.dialogueTree.isDialogueLineType = function(type) {
if (
this.commandCalls &&
this.commandCalls.some(function(call) {
return gdjs.dialogueTree.clipTextEnd > call.time && call.cmd === 'wait';
})
) {
return !this.pauseScrolling;
if (!this.dialogueIsRunning) return false;
if (this.commandCalls && type === 'command') {
if (
this.commandCalls.some(function(call) {
return gdjs.dialogueTree.clipTextEnd > call.time && call.cmd === 'wait';
})
) {
return !this.pauseScrolling;
}
if (this.commandCalls.length > 0 && this.commandParameters.length > 0) {
return true;
}
}
return this.dialogueIsRunning ? this.dialogueDataType === type : false;
return this.dialogueDataType === type;
};
/**
@@ -420,19 +443,27 @@ gdjs.dialogueTree.startFrom = function(startDialogueNode) {
if (!this.hasDialogueBranch(startDialogueNode)) return;
this.optionsCount = 0;
this.options = [];
this.dialogueBranchTitle = '';
this.dialogueBranchBody = '';
this.dialogueBranchTags = [];
this.tagParameters = [];
this.dialogue = this.runner.run(startDialogueNode);
this.dialogueData = null;
this.dialogueDataType = '';
this.dialogueText = '';
this.clipTextEnd = 0;
this.commandCalls = [];
this.commandParameters = [];
this.pauseScrolling = false;
this.dialogueData = this.dialogue.next().value;
this.dialogueBranchTags = this.dialogueData.data.tags;
this.dialogueBranchTitle = this.dialogueData.data.title;
this.dialogueBranchBody = this.dialogueData.data.body;
this.lineNum = this.dialogueData.lineNum;
if (gdjs.dialogueTree._isLineTypeText()){
this.dialogueDataType = 'text';
} else if (gdjs.dialogueTree._isLineTypeOptions()){
this.dialogueDataType = 'options';
} else {
this.dialogueDataType = 'command';
};
this.dialogueIsRunning = true;
gdjs.dialogueTree.goToNextDialogueLine();
};
@@ -462,32 +493,37 @@ gdjs.dialogueTree.goToNextDialogueLine = function() {
this.selectedOption = -1;
this.selectedOptionUpdated = false;
if (gdjs.dialogueTree._isLineTypeText()) {
if (
this.dialogueDataType === 'options' ||
this.dialogueDataType === 'text' ||
!this.dialogueDataType
) {
if (gdjs.dialogueTree.getVariable('debug')) console.info('parsing:', this.dialogueData);
if (!this.dialogueData) {
gdjs.dialogueTree.stopRunningDialogue();
} else if (gdjs.dialogueTree._isLineTypeText()) {
if (this.lineNum === this.dialogueData.lineNum && this.dialogueBranchTitle === this.dialogueData.data.title){
this.clipTextEnd = this.dialogueText.length - 1;
this.dialogueText +=
(this.dialogueText === '' ? '' : ' ') + this.dialogueData.text;
} else {
this.clipTextEnd = 0;
this.dialogueText = this.dialogueData.text;
this.commandCalls = [];
} else {
this.dialogueText += this.dialogueData.text;
}
this.dialogueDataType = 'text';
this.dialogueBranchTags = this.dialogueData.data.tags;
this.dialogueBranchTitle = this.dialogueData.data.title;
this.dialogueBranchBody = this.dialogueData.data.body;
this.lineNum = this.dialogueData.lineNum;
this.dialogueDataType = 'text';
this.dialogueData = this.dialogue.next().value;
} else if (gdjs.dialogueTree._isLineTypeOptions()) {
this.commandCalls = [];
this.dialogueDataType = 'options';
this.dialogueText = '';
this.clipTextEnd = 0;
this.optionsCount = this.dialogueData.options.length;
this.options = this.dialogueData.options;
this.selectedOptionUpdated = true;
} else if (gdjs.dialogueTree._isLineTypeCommand()) {
this.dialogueDataType = 'command';
var command = this.dialogueData.text.split(' ');
// If last command was to wait, increase time by one
var offsetTime =
@@ -505,11 +541,6 @@ gdjs.dialogueTree.goToNextDialogueLine = function() {
} else {
this.dialogueDataType = 'unknown';
}
if (gdjs.dialogueTree._isLineTypeCommand()) {
this.dialogueDataType = 'command';
gdjs.dialogueTree.goToNextDialogueLine();
}
};
/**
@@ -627,7 +658,7 @@ gdjs.dialogueTree.getBranchText = function() {
*/
gdjs.dialogueTree.getVariable = function(key) {
if (this.dialogueIsRunning && key in this.runner.variables.data) {
return this.runner.variables.data[key];
return this.runner.variables.get(key);
}
return '';
};
@@ -635,11 +666,11 @@ gdjs.dialogueTree.getVariable = function(key) {
/**
* Check if a specific variable created by the Dialogue parses exists and is equal to a specific value.
* @param {string} key The name of the variable you want to check the value of
* @param {string} value The value you want to check against
* @param {string|boolean|number} value The value you want to check against
*/
gdjs.dialogueTree.compareVariable = function(key, value) {
if (this.dialogueIsRunning && key in this.runner.variables.data) {
return this.runner.variables.data[key].toString() === value;
return this.runner.variables.get(key) === value;
}
return false;
};
@@ -647,11 +678,11 @@ gdjs.dialogueTree.compareVariable = function(key, value) {
/**
* Set a specific variable created by the Dialogue parser to a specific value.
* @param {string} key The name of the variable you want to set the value of
* @param {string} value The value you want to set
* @param {string|boolean|number} value The value you want to set
*/
gdjs.dialogueTree.setVariable = function(key, value) {
if (this.dialogueIsRunning && this.runner.variables.data) {
this.runner.variables.data[key] = value;
if (this.runner.variables) {
this.runner.variables.set(key, value);
}
};
@@ -662,7 +693,7 @@ gdjs.dialogueTree.setVariable = function(key, value) {
* @param {gdjs.Variable} outputVariable The variable where to store the State
*/
gdjs.dialogueTree.saveState = function(outputVariable) {
const dialogueState = {
var dialogueState = {
variables: gdjs.dialogueTree.runner.variables.data,
visited: gdjs.dialogueTree.runner.visited,
};
@@ -673,17 +704,32 @@ gdjs.dialogueTree.saveState = function(outputVariable) {
* Load the current State of the Dialogue Parser from a specified variable.
* Can be used to implement persistence in dialogue through your game's Load/Save function.
* That way you can later load all the dialogue choices the player has made.
* @param {gdjs.Variable} inputVariable The variable where to load the State from.
* @param {gdjs.Variable} inputVariable The structured variable where to load the State from.
*/
gdjs.dialogueTree.loadState = function(inputVariable) {
const jsonData = gdjs.evtTools.network.variableStructureToJSON(inputVariable);
var loadedState = JSON.parse(
gdjs.evtTools.network.variableStructureToJSON(inputVariable)
);
if (!loadedState) {
console.error('Load state variable is empty:', inputVariable);
return
}
try {
const loadedState = JSON.parse(
gdjs.evtTools.network.variableStructureToJSON(inputVariable)
);
gdjs.dialogueTree.runner.visited = loadedState.visited;
gdjs.dialogueTree.runner.variables.data = loadedState.variables;
gdjs.dialogueTree.runner.variables.data = {};
Object.keys(loadedState.variables).forEach(function(key) {
var value = loadedState.variables[key];
gdjs.dialogueTree.runner.variables.set(key, value);
});
} catch (e) {
console.error(e);
console.error('Failed to load state from variable:', inputVariable, e);
}
};
/**
* Clear the current State of the Dialogue Parser.
*/
gdjs.dialogueTree.clearState = function() {
gdjs.dialogueTree.runner.visited = {};
gdjs.dialogueTree.runner.variables.data = {};
};

View File

@@ -1,6 +1,11 @@
// @ts-check
describe('gdjs.DraggableRuntimeBehavior', function() {
var runtimeGame = new gdjs.RuntimeGame({variables: [], properties: {windowWidth: 800, windowHeight: 600}});
var runtimeGame = new gdjs.RuntimeGame({
variables: [],
resources: {resources: []},
// @ts-ignore
properties: {windowWidth: 800, windowHeight: 600}
});
var runtimeScene = new gdjs.RuntimeScene(runtimeGame);
runtimeScene.loadFromScene({
layers:[{name:"", visibility: true}],
@@ -10,8 +15,8 @@ describe('gdjs.DraggableRuntimeBehavior', function() {
instances: []
});
var object = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [{type: "DraggableBehavior::Draggable"}]});
var object2 = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [{type: "DraggableBehavior::Draggable"}]});
var object = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [{name: "Behavior1", type: "DraggableBehavior::Draggable"}], variables: []});
var object2 = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [{name: "Behavior1", type: "DraggableBehavior::Draggable"}], variables: []});
runtimeScene.addObject(object);
runtimeScene.addObject(object2);

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,18 @@
gdjs.PixiFiltersTools.registerFilterCreator('BlendingMode', {
makePIXIFilter: function(layer, effectData) {
var blendingModeFilter = new PIXI.filters.AlphaFilter();
return blendingModeFilter;
},
update: function(filter, layer) {},
updateDoubleParameter: function(filter, parameterName, value) {
if (parameterName === 'alpha') {
filter.alpha = value;
}
if (parameterName === 'blendmode') {
filter.blendMode = value;
}
},
updateStringParameter: function(filter, parameterName, value) {},
updateBooleanParameter: function(filter, parameterName, value) {},
});

View File

@@ -14,7 +14,7 @@ gdjs.PixiFiltersTools.registerFilterCreator('Blur', {
return;
if (parameterName === 'kernelSize') {
value = gdjs.PixiFiltersTools.clampKernelSize(value);
value = gdjs.PixiFiltersTools.clampKernelSize(value, 5, 15);
}
filter[parameterName] = value;

View File

@@ -0,0 +1,27 @@
gdjs.PixiFiltersTools.registerFilterCreator('BulgePinch', {
makePIXIFilter: function(layer, effectData) {
var bulgePinchFilter = new PIXI.filters.BulgePinchFilter();
return bulgePinchFilter;
},
update: function(filter, layer) {
},
updateDoubleParameter: function(filter, parameterName, value) {
if (parameterName === 'centerX') {
filter.center[0] = value;
}
else if (parameterName === 'centerY') {
filter.center[1] = value;
}
else if (parameterName === 'radius') {
filter.radius = value;
}
else if (parameterName === 'strength') {
filter.strength = gdjs.PixiFiltersTools.clampValue(value, -1, 1);
}
},
updateStringParameter: function(filter, parameterName, value) {
},
updateBooleanParameter: function(filter, parameterName, value) {
},
});

View File

@@ -0,0 +1,22 @@
gdjs.PixiFiltersTools.registerFilterCreator('ColorReplace', {
makePIXIFilter: function(layer, effectData) {
var colorReplaceFilter = new PIXI.filters.ColorReplaceFilter();
return colorReplaceFilter;
},
update: function(filter, layer) {},
updateDoubleParameter: function(filter, parameterName, value) {
if (parameterName === 'epsilon') {
filter.epsilon = value;
}
},
updateStringParameter: function(filter, parameterName, value) {
if (parameterName === 'originalColor') {
filter.originalColor = parseInt(value.replace('#', '0x'), 16);
}
else if (parameterName === 'newColor') {
filter.newColor = parseInt(value.replace('#', '0x'), 16);
}
},
updateBooleanParameter: function(filter, parameterName, value) {},
});

View File

@@ -1,13 +1,20 @@
gdjs.PixiFiltersTools.registerFilterCreator('CRT', {
makePIXIFilter: function(layer, effectData) {
var crtFilter = new PIXI.filters.CRTFilter();
crtFilter._animationTimer = 0;
return crtFilter;
},
update: function(filter, layer) {
if (filter.animated) {
filter.time += layer.getElapsedTime() / 1000;
filter.seed = Math.random();
if (filter.animationSpeed !== 0) {
// Multiply by 10 so that the default value is a sensible speed
filter.time += layer.getElapsedTime() / 1000 * 10 * filter.animationSpeed;
}
if (filter.animationFrequency !== 0) {
filter._animationTimer += layer.getElapsedTime() / 1000;
if (filter._animationTimer >= 1 / filter.animationFrequency) {
filter.seed = Math.random();
filter._animationTimer = 0;
}
}
},
updateDoubleParameter: function(filter, parameterName, value) {
@@ -27,6 +34,10 @@ gdjs.PixiFiltersTools.registerFilterCreator('CRT', {
filter.vignettingAlpha = value;
} else if (parameterName === 'vignettingBlur') {
filter.vignettingBlur = value;
} else if (parameterName === 'animationSpeed') {
filter.animationSpeed = value;
} else if (parameterName === 'animationFrequency') {
filter.animationFrequency = value;
}
},
updateStringParameter: function(filter, parameterName, value) {},
@@ -34,8 +45,5 @@ gdjs.PixiFiltersTools.registerFilterCreator('CRT', {
if (parameterName === 'verticalLine') {
filter.verticalLine = value;
}
if (parameterName === 'animated') {
filter.animated = value;
}
},
});

View File

@@ -0,0 +1,18 @@
gdjs.PixiFiltersTools.registerFilterCreator('Dot', {
makePIXIFilter: function(layer, effectData) {
var dotFilter = new PIXI.filters.DotFilter();
return dotFilter;
},
update: function(filter, layer) {},
updateDoubleParameter: function(filter, parameterName, value) {
if (parameterName === 'scale') {
filter.scale = value;
}
else if (parameterName === 'angle') {
filter.angle = value;
}
},
updateStringParameter: function(filter, parameterName, value) {},
updateBooleanParameter: function(filter, parameterName, value) {},
});

View File

@@ -0,0 +1,64 @@
gdjs.PixiFiltersTools.registerFilterCreator('Glitch', {
makePIXIFilter: function(layer, effectData) {
var glitchFilter = new PIXI.filters.GlitchFilter();
glitchFilter._animationTimer = 0;
return glitchFilter;
},
update: function(filter, layer) {
if (filter.animationFrequency !== 0) {
filter._animationTimer += layer.getElapsedTime() / 1000;
if (filter._animationTimer >= 1 / filter.animationFrequency) {
filter.seed = Math.random();
filter._animationTimer = 0;
}
}
},
updateDoubleParameter: function(filter, parameterName, value) {
if (parameterName === 'slices') {
filter.slices = value;
}
else if (parameterName === 'offset') {
filter.offset = value;
}
else if (parameterName === 'direction') {
filter.direction = value;
}
else if (parameterName === 'fillMode') {
filter.fillMode = value;
}
else if (parameterName === 'minSize') {
filter.minSize = value;
}
else if (parameterName === 'sampleSize') {
filter.sampleSize = value;
}
else if (parameterName === 'redX') {
filter.red.x = value;
}
else if (parameterName === 'redY') {
filter.red.y = value;
}
else if (parameterName === 'greenX') {
filter.green.x = value;
}
else if (parameterName === 'greenY') {
filter.green.y = value;
}
else if (parameterName === 'blueX') {
filter.blue.x = value;
}
else if (parameterName === 'blueY') {
filter.blue.y = value;
}
else if (parameterName === 'animationFrequency') {
filter.animationFrequency = value;
}
},
updateStringParameter: function(filter, parameterName, value) {},
updateBooleanParameter: function(filter, parameterName, value) {
if (parameterName === 'average') {
filter.average = value;
}
},
});

View File

@@ -5,8 +5,8 @@ gdjs.PixiFiltersTools.registerFilterCreator('Godray', {
return godrayFilter;
},
update: function(filter, layer) {
if (filter.animated) {
filter.time += layer.getElapsedTime() / 1000;
if (filter.animationSpeed !== 0) {
filter.time += layer.getElapsedTime() / 1000 * filter.animationSpeed;
}
},
updateDoubleParameter: function(filter, parameterName, value) {
@@ -22,6 +22,8 @@ gdjs.PixiFiltersTools.registerFilterCreator('Godray', {
filter.x = value;
} else if (parameterName === 'y') {
filter.y = value;
} else if (parameterName === 'animationSpeed') {
filter.animationSpeed = value;
}
},
updateStringParameter: function(filter, parameterName, value) {},
@@ -29,8 +31,5 @@ gdjs.PixiFiltersTools.registerFilterCreator('Godray', {
if (parameterName === 'parallel') {
filter.parallel = value;
}
if (parameterName === 'animated') {
filter.animated = value;
}
},
});

View File

@@ -0,0 +1,50 @@
gdjs.PixiFiltersTools.registerFilterCreator('OldFilm', {
makePIXIFilter: function(layer, effectData) {
var oldFilmFilter = new PIXI.filters.OldFilmFilter();
oldFilmFilter._animationTimer = 0;
return oldFilmFilter;
},
update: function(filter, layer) {
if (filter.animationFrequency !== 0) {
filter._animationTimer += layer.getElapsedTime() / 1000;
if (filter._animationTimer >= 1 / filter.animationFrequency) {
filter.seed = Math.random();
filter._animationTimer = 0;
}
}
},
updateDoubleParameter: function(filter, parameterName, value) {
if (parameterName === 'sepia') {
filter.sepia = value;
}
else if (parameterName === 'noise') {
filter.noise = value;
}
else if (parameterName === 'noiseSize') {
filter.noiseSize = value;
}
else if (parameterName === 'scratch') {
filter.scratch = value;
}
else if (parameterName === 'scratchDensity') {
filter.scratchDensity = value;
}
else if (parameterName === 'scratchWidth') {
filter.scratchWidth = value;
}
else if (parameterName === 'vignetting') {
filter.vignetting = value;
}
else if (parameterName === 'vignettingAlpha') {
filter.vignettingAlpha = value;
}
else if (parameterName === 'vignettingBlur') {
filter.vignettingBlur = value;
}
else if (parameterName === 'animationFrequency') {
filter.animationFrequency = value;
}
},
updateStringParameter: function(filter, parameterName, value) {},
updateBooleanParameter: function(filter, parameterName, value) {},
});

View File

@@ -6,4 +6,3 @@
* http://www.opensource.org/licenses/mit-license
*/
!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],n):n(t.__filters={},t.PIXI)}(this,function(t,n){"use strict";var r="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",e="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\n\nuniform float gamma;\nuniform float contrast;\nuniform float saturation;\nuniform float brightness;\nuniform float red;\nuniform float green;\nuniform float blue;\nuniform float alpha;\n\nvoid main(void)\n{\n vec4 c = texture2D(uSampler, vTextureCoord);\n\n if (c.a > 0.0) {\n c.rgb /= c.a;\n\n vec3 rgb = pow(c.rgb, vec3(1. / gamma));\n rgb = mix(vec3(.5), mix(vec3(dot(vec3(.2125, .7154, .0721), rgb)), rgb, saturation), contrast);\n rgb.r *= red;\n rgb.g *= green;\n rgb.b *= blue;\n c.rgb = rgb * brightness;\n\n c.rgb *= c.a;\n }\n\n gl_FragColor = c * alpha;\n}\n",i=function(t){function n(n){t.call(this,r,e),Object.assign(this,{gamma:1,saturation:1,contrast:1,brightness:1,red:1,green:1,blue:1,alpha:1},n)}return t&&(n.__proto__=t),n.prototype=Object.create(t&&t.prototype),n.prototype.constructor=n,n.prototype.apply=function(t,n,r,e){this.uniforms.gamma=Math.max(this.gamma,1e-4),this.uniforms.saturation=this.saturation,this.uniforms.contrast=this.contrast,this.uniforms.brightness=this.brightness,this.uniforms.red=this.red,this.uniforms.green=this.green,this.uniforms.blue=this.blue,this.uniforms.alpha=this.alpha,t.applyFilter(this,n,r,e)},n}(n.Filter);t.AdjustmentFilter=i,Object.defineProperty(t,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
//# sourceMappingURL=filter-adjustment.js.map

View File

@@ -6,4 +6,3 @@
* http://www.opensource.org/licenses/mit-license
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("pixi.js"),require("@pixi/filter-kawase-blur")):"function"==typeof define&&define.amd?define(["exports","pixi.js","@pixi/filter-kawase-blur"],t):t(e.__filters={},e.PIXI,e.PIXI.filters)}(this,function(e,t,r){"use strict";var o="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",i="\nuniform sampler2D uSampler;\nvarying vec2 vTextureCoord;\n\nuniform float threshold;\n\nvoid main() {\n vec4 color = texture2D(uSampler, vTextureCoord);\n\n // A simple & fast algorithm for getting brightness.\n // It's inaccuracy , but good enought for this feature.\n float _max = max(max(color.r, color.g), color.b);\n float _min = min(min(color.r, color.g), color.b);\n float brightness = (_max + _min) * 0.5;\n\n if(brightness > threshold) {\n gl_FragColor = color;\n } else {\n gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n }\n}\n",n=function(e){function t(t){void 0===t&&(t=.5),e.call(this,o,i),this.threshold=t}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var r={threshold:{configurable:!0}};return r.threshold.get=function(){return this.uniforms.threshold},r.threshold.set=function(e){this.uniforms.threshold=e},Object.defineProperties(t.prototype,r),t}(t.Filter),l="uniform sampler2D uSampler;\nvarying vec2 vTextureCoord;\n\nuniform sampler2D bloomTexture;\nuniform float bloomScale;\nuniform float brightness;\n\nvoid main() {\n vec4 color = texture2D(uSampler, vTextureCoord);\n color.rgb *= brightness;\n vec4 bloomColor = vec4(texture2D(bloomTexture, vTextureCoord).rgb, 0.0);\n bloomColor.rgb *= bloomScale;\n gl_FragColor = color + bloomColor;\n}\n",s=function(e){function i(i){e.call(this,o,l),"number"==typeof i&&(i={threshold:i}),i=Object.assign({threshold:.5,bloomScale:1,brightness:1,kernels:null,blur:8,quality:4,pixelSize:1,resolution:t.settings.RESOLUTION},i),this.bloomScale=i.bloomScale,this.brightness=i.brightness;var s=i.kernels,u=i.blur,a=i.quality,c=i.pixelSize,h=i.resolution;this._extractFilter=new n(i.threshold),this._extractFilter.resolution=h,this._blurFilter=s?new r.KawaseBlurFilter(s):new r.KawaseBlurFilter(u,a),this.pixelSize=c,this.resolution=h}e&&(i.__proto__=e),i.prototype=Object.create(e&&e.prototype),i.prototype.constructor=i;var s={resolution:{configurable:!0},threshold:{configurable:!0},kernels:{configurable:!0},blur:{configurable:!0},quality:{configurable:!0},pixelSize:{configurable:!0}};return i.prototype.apply=function(e,t,r,o,i){var n=e.getRenderTarget(!0);this._extractFilter.apply(e,t,n,!0,i);var l=e.getRenderTarget(!0);this._blurFilter.apply(e,n,l,!0,i),this.uniforms.bloomScale=this.bloomScale,this.uniforms.brightness=this.brightness,this.uniforms.bloomTexture=l,e.applyFilter(this,t,r,o),e.returnRenderTarget(l),e.returnRenderTarget(n)},s.resolution.get=function(){return this._resolution},s.resolution.set=function(e){this._resolution=e,this._extractFilter&&(this._extractFilter.resolution=e),this._blurFilter&&(this._blurFilter.resolution=e)},s.threshold.get=function(){return this._extractFilter.threshold},s.threshold.set=function(e){this._extractFilter.threshold=e},s.kernels.get=function(){return this._blurFilter.kernels},s.kernels.set=function(e){this._blurFilter.kernels=e},s.blur.get=function(){return this._blurFilter.blur},s.blur.set=function(e){this._blurFilter.blur=e},s.quality.get=function(){return this._blurFilter.quality},s.quality.set=function(e){this._blurFilter.quality=e},s.pixelSize.get=function(){return this._blurFilter.pixelSize},s.pixelSize.set=function(e){this._blurFilter.pixelSize=e},Object.defineProperties(i.prototype,s),i}(t.Filter);e.AdvancedBloomFilter=s,Object.defineProperty(e,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
//# sourceMappingURL=filter-advanced-bloom.js.map

View File

@@ -0,0 +1,8 @@
/*!
* @pixi/filter-alpha - v5.2.1
* Compiled Tue, 28 Jan 2020 23:33:11 UTC
*
* @pixi/filter-alpha is licensed under the MIT License.
* http://www.opensource.org/licenses/mit-license
*/
this.PIXI=this.PIXI||{},this.PIXI.filters=this.PIXI.filters||{};var _pixi_filter_alpha=function(t,r){"use strict";var e="varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform float uAlpha;\n\nvoid main(void)\n{\n gl_FragColor = texture2D(uSampler, vTextureCoord) * uAlpha;\n}\n",i=function(t){function i(i){void 0===i&&(i=1),t.call(this,r.defaultVertex,e,{uAlpha:1}),this.alpha=i}t&&(i.__proto__=t),i.prototype=Object.create(t&&t.prototype),i.prototype.constructor=i;var a={alpha:{configurable:!0}};return a.alpha.get=function(){return this.uniforms.uAlpha},a.alpha.set=function(t){this.uniforms.uAlpha=t},Object.defineProperties(i.prototype,a),i}(r.Filter);return t.AlphaFilter=i,t}({},PIXI);Object.assign(this.PIXI.filters,_pixi_filter_alpha);

View File

@@ -6,4 +6,3 @@
* http://www.opensource.org/licenses/mit-license
*/
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],n):n(e.__filters={},e.PIXI)}(this,function(e,n){"use strict";var o="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",r="varying vec2 vTextureCoord;\n\nuniform vec4 filterArea;\nuniform float pixelSize;\nuniform sampler2D uSampler;\n\nvec2 mapCoord( vec2 coord )\n{\n coord *= filterArea.xy;\n coord += filterArea.zw;\n\n return coord;\n}\n\nvec2 unmapCoord( vec2 coord )\n{\n coord -= filterArea.zw;\n coord /= filterArea.xy;\n\n return coord;\n}\n\nvec2 pixelate(vec2 coord, vec2 size)\n{\n return floor( coord / size ) * size;\n}\n\nvec2 getMod(vec2 coord, vec2 size)\n{\n return mod( coord , size) / size;\n}\n\nfloat character(float n, vec2 p)\n{\n p = floor(p*vec2(4.0, -4.0) + 2.5);\n if (clamp(p.x, 0.0, 4.0) == p.x && clamp(p.y, 0.0, 4.0) == p.y)\n {\n if (int(mod(n/exp2(p.x + 5.0*p.y), 2.0)) == 1) return 1.0;\n }\n return 0.0;\n}\n\nvoid main()\n{\n vec2 coord = mapCoord(vTextureCoord);\n\n // get the rounded color..\n vec2 pixCoord = pixelate(coord, vec2(pixelSize));\n pixCoord = unmapCoord(pixCoord);\n\n vec4 color = texture2D(uSampler, pixCoord);\n\n // determine the character to use\n float gray = (color.r + color.g + color.b) / 3.0;\n\n float n = 65536.0; // .\n if (gray > 0.2) n = 65600.0; // :\n if (gray > 0.3) n = 332772.0; // *\n if (gray > 0.4) n = 15255086.0; // o\n if (gray > 0.5) n = 23385164.0; // &\n if (gray > 0.6) n = 15252014.0; // 8\n if (gray > 0.7) n = 13199452.0; // @\n if (gray > 0.8) n = 11512810.0; // #\n\n // get the mod..\n vec2 modd = getMod(coord, vec2(pixelSize));\n\n gl_FragColor = color * character( n, vec2(-1.0) + modd * 2.0);\n\n}",t=function(e){function n(n){void 0===n&&(n=8),e.call(this,o,r),this.size=n}e&&(n.__proto__=e),n.prototype=Object.create(e&&e.prototype),n.prototype.constructor=n;var t={size:{configurable:!0}};return t.size.get=function(){return this.uniforms.pixelSize},t.size.set=function(e){this.uniforms.pixelSize=e},Object.defineProperties(n.prototype,t),n}(n.Filter);e.AsciiFilter=t,Object.defineProperty(e,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
//# sourceMappingURL=filter-ascii.js.map

View File

@@ -6,4 +6,3 @@
* http://www.opensource.org/licenses/mit-license
*/
!function(o,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],t):t(o.__filters={},o.PIXI)}(this,function(o,t){"use strict";var r="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",i="precision mediump float;\n\nvarying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform vec4 filterArea;\n\nuniform float transformX;\nuniform float transformY;\nuniform vec3 lightColor;\nuniform float lightAlpha;\nuniform vec3 shadowColor;\nuniform float shadowAlpha;\n\nvoid main(void) {\n vec2 transform = vec2(1.0 / filterArea) * vec2(transformX, transformY);\n vec4 color = texture2D(uSampler, vTextureCoord);\n float light = texture2D(uSampler, vTextureCoord - transform).a;\n float shadow = texture2D(uSampler, vTextureCoord + transform).a;\n\n color.rgb = mix(color.rgb, lightColor, clamp((color.a - light) * lightAlpha, 0.0, 1.0));\n color.rgb = mix(color.rgb, shadowColor, clamp((color.a - shadow) * shadowAlpha, 0.0, 1.0));\n gl_FragColor = vec4(color.rgb * color.a, color.a);\n}\n",n=function(o){function n(t){void 0===t&&(t={}),o.call(this,r,i),this.uniforms.lightColor=new Float32Array(3),this.uniforms.shadowColor=new Float32Array(3),t=Object.assign({rotation:45,thickness:2,lightColor:16777215,lightAlpha:.7,shadowColor:0,shadowAlpha:.7},t),this.rotation=t.rotation,this.thickness=t.thickness,this.lightColor=t.lightColor,this.lightAlpha=t.lightAlpha,this.shadowColor=t.shadowColor,this.shadowAlpha=t.shadowAlpha}o&&(n.__proto__=o),n.prototype=Object.create(o&&o.prototype),n.prototype.constructor=n;var e={rotation:{configurable:!0},thickness:{configurable:!0},lightColor:{configurable:!0},lightAlpha:{configurable:!0},shadowColor:{configurable:!0},shadowAlpha:{configurable:!0}};return n.prototype._updateTransform=function(){this.uniforms.transformX=this._thickness*Math.cos(this._angle),this.uniforms.transformY=this._thickness*Math.sin(this._angle)},e.rotation.get=function(){return this._angle/t.DEG_TO_RAD},e.rotation.set=function(o){this._angle=o*t.DEG_TO_RAD,this._updateTransform()},e.thickness.get=function(){return this._thickness},e.thickness.set=function(o){this._thickness=o,this._updateTransform()},e.lightColor.get=function(){return t.utils.rgb2hex(this.uniforms.lightColor)},e.lightColor.set=function(o){t.utils.hex2rgb(o,this.uniforms.lightColor)},e.lightAlpha.get=function(){return this.uniforms.lightAlpha},e.lightAlpha.set=function(o){this.uniforms.lightAlpha=o},e.shadowColor.get=function(){return t.utils.rgb2hex(this.uniforms.shadowColor)},e.shadowColor.set=function(o){t.utils.hex2rgb(o,this.uniforms.shadowColor)},e.shadowAlpha.get=function(){return this.uniforms.shadowAlpha},e.shadowAlpha.set=function(o){this.uniforms.shadowAlpha=o},Object.defineProperties(n.prototype,e),n}(t.Filter);o.BevelFilter=n,Object.defineProperty(o,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
//# sourceMappingURL=filter-bevel.js.map

View File

@@ -0,0 +1,8 @@
/*!
* @pixi/filter-bulge-pinch - v2.7.0
* Compiled Sun, 13 Jan 2019 22:51:52 UTC
*
* @pixi/filter-bulge-pinch is licensed under the MIT License.
* http://www.opensource.org/licenses/mit-license
*/
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],n):n((e=e||self).__filters={},e.PIXI)}(this,function(e,n){"use strict";var t="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",r="uniform float radius;\nuniform float strength;\nuniform vec2 center;\nuniform sampler2D uSampler;\nvarying vec2 vTextureCoord;\n\nuniform vec4 filterArea;\nuniform vec4 filterClamp;\nuniform vec2 dimensions;\n\nvoid main()\n{\n vec2 coord = vTextureCoord * filterArea.xy;\n coord -= center * dimensions.xy;\n float distance = length(coord);\n if (distance < radius) {\n float percent = distance / radius;\n if (strength > 0.0) {\n coord *= mix(1.0, smoothstep(0.0, radius / distance, percent), strength * 0.75);\n } else {\n coord *= mix(1.0, pow(percent, 1.0 + strength * 0.75) * radius / distance, 1.0 - percent);\n }\n }\n coord += center * dimensions.xy;\n coord /= filterArea.xy;\n vec2 clampedCoord = clamp(coord, filterClamp.xy, filterClamp.zw);\n vec4 color = texture2D(uSampler, clampedCoord);\n if (coord != clampedCoord) {\n color *= max(0.0, 1.0 - length(coord - clampedCoord));\n }\n\n gl_FragColor = color;\n}\n",o=function(e){function n(n,o,i){e.call(this,t,r),this.uniforms.dimensions=new Float32Array(2),this.center=n||[.5,.5],this.radius="number"==typeof o?o:100,this.strength="number"==typeof i?i:1}e&&(n.__proto__=e),n.prototype=Object.create(e&&e.prototype),n.prototype.constructor=n;var o={radius:{configurable:!0},strength:{configurable:!0},center:{configurable:!0}};return n.prototype.apply=function(e,n,t,r){this.uniforms.dimensions[0]=n.sourceFrame.width,this.uniforms.dimensions[1]=n.sourceFrame.height,e.applyFilter(this,n,t,r)},o.radius.get=function(){return this.uniforms.radius},o.radius.set=function(e){this.uniforms.radius=e},o.strength.get=function(){return this.uniforms.strength},o.strength.set=function(e){this.uniforms.strength=e},o.center.get=function(){return this.uniforms.center},o.center.set=function(e){this.uniforms.center=e},Object.defineProperties(n.prototype,o),n}(n.Filter);e.BulgePinchFilter=o,Object.defineProperty(e,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);

View File

@@ -6,4 +6,3 @@
* http://www.opensource.org/licenses/mit-license
*/
var __filters=function(e,i,t){"use strict";var o="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",r="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform sampler2D colorMap;\nuniform float _mix;\nuniform float _size;\nuniform float _sliceSize;\nuniform float _slicePixelSize;\nuniform float _sliceInnerSize;\nvoid main() {\n vec4 color = texture2D(uSampler, vTextureCoord.xy);\n\n vec4 adjusted;\n if (color.a > 0.0) {\n color.rgb /= color.a;\n float innerWidth = _size - 1.0;\n float zSlice0 = min(floor(color.b * innerWidth), innerWidth);\n float zSlice1 = min(zSlice0 + 1.0, innerWidth);\n float xOffset = _slicePixelSize * 0.5 + color.r * _sliceInnerSize;\n float s0 = xOffset + (zSlice0 * _sliceSize);\n float s1 = xOffset + (zSlice1 * _sliceSize);\n float yOffset = _sliceSize * 0.5 + color.g * (1.0 - _sliceSize);\n vec4 slice0Color = texture2D(colorMap, vec2(s0,yOffset));\n vec4 slice1Color = texture2D(colorMap, vec2(s1,yOffset));\n float zOffset = fract(color.b * innerWidth);\n adjusted = mix(slice0Color, slice1Color, zOffset);\n\n color.rgb *= color.a;\n }\n gl_FragColor = vec4(mix(color, adjusted, _mix).rgb, color.a);\n\n}",s=function(e){function s(i,t,s){void 0===t&&(t=!1),void 0===s&&(s=1),e.call(this,o,r),this._size=0,this._sliceSize=0,this._slicePixelSize=0,this._sliceInnerSize=0,this._scaleMode=null,this._nearest=!1,this.nearest=t,this.mix=s,this.colorMap=i}e&&(s.__proto__=e),s.prototype=Object.create(e&&e.prototype),s.prototype.constructor=s;var n={colorSize:{configurable:!0},colorMap:{configurable:!0},nearest:{configurable:!0}};return s.prototype.apply=function(e,i,t,o){this.uniforms._mix=this.mix,e.applyFilter(this,i,t,o)},n.colorSize.get=function(){return this._size},n.colorMap.get=function(){return this._colorMap},n.colorMap.set=function(e){e instanceof i.Texture||(e=i.Texture.from(e)),e&&e.baseTexture&&(e.baseTexture.scaleMode=this._scaleMode,e.baseTexture.mipmap=!1,this._size=e.height,this._sliceSize=1/this._size,this._slicePixelSize=this._sliceSize/this._size,this._sliceInnerSize=this._slicePixelSize*(this._size-1),this.uniforms._size=this._size,this.uniforms._sliceSize=this._sliceSize,this.uniforms._slicePixelSize=this._slicePixelSize,this.uniforms._sliceInnerSize=this._sliceInnerSize,this.uniforms.colorMap=e),this._colorMap=e},n.nearest.get=function(){return this._nearest},n.nearest.set=function(e){this._nearest=e,this._scaleMode=e?t.SCALE_MODES.NEAREST:t.SCALE_MODES.LINEAR;var i=this._colorMap;i&&i.baseTexture&&(i.baseTexture._glTextures={},i.baseTexture.scaleMode=this._scaleMode,i.baseTexture.mipmap=!1,i._updateID++,i.baseTexture.emit("update",i.baseTexture))},s.prototype.updateColorMap=function(){var e=this._colorMap;e&&e.baseTexture&&(e._updateID++,e.baseTexture.emit("update",e.baseTexture),this.colorMap=e)},s.prototype.destroy=function(i){this._colorMap&&this._colorMap.destroy(i),e.prototype.destroy.call(this)},Object.defineProperties(s.prototype,n),s}(i.Filter);return e.ColorMapFilter=s,e}({},PIXI,PIXI);Object.assign(PIXI.filters,__filters);
//# sourceMappingURL=filter-color-map.js.map

View File

@@ -0,0 +1,8 @@
/*!
* @pixi/filter-color-replace - v2.7.0
* Compiled Sun, 13 Jan 2019 22:51:52 UTC
*
* @pixi/filter-color-replace is licensed under the MIT License.
* http://www.opensource.org/licenses/mit-license
*/
!function(o,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],r):r((o=o||self).__filters={},o.PIXI)}(this,function(o,r){"use strict";var e="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",i="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform vec3 originalColor;\nuniform vec3 newColor;\nuniform float epsilon;\nvoid main(void) {\n vec4 currentColor = texture2D(uSampler, vTextureCoord);\n vec3 colorDiff = originalColor - (currentColor.rgb / max(currentColor.a, 0.0000000001));\n float colorDistance = length(colorDiff);\n float doReplace = step(colorDistance, epsilon);\n gl_FragColor = vec4(mix(currentColor.rgb, (newColor + colorDiff) * currentColor.a, doReplace), currentColor.a);\n}\n",n=function(o){function n(r,n,t){void 0===r&&(r=16711680),void 0===n&&(n=0),void 0===t&&(t=.4),o.call(this,e,i),this.uniforms.originalColor=new Float32Array(3),this.uniforms.newColor=new Float32Array(3),this.originalColor=r,this.newColor=n,this.epsilon=t}o&&(n.__proto__=o),n.prototype=Object.create(o&&o.prototype),n.prototype.constructor=n;var t={originalColor:{configurable:!0},newColor:{configurable:!0},epsilon:{configurable:!0}};return t.originalColor.set=function(o){var e=this.uniforms.originalColor;"number"==typeof o?(r.utils.hex2rgb(o,e),this._originalColor=o):(e[0]=o[0],e[1]=o[1],e[2]=o[2],this._originalColor=r.utils.rgb2hex(e))},t.originalColor.get=function(){return this._originalColor},t.newColor.set=function(o){var e=this.uniforms.newColor;"number"==typeof o?(r.utils.hex2rgb(o,e),this._newColor=o):(e[0]=o[0],e[1]=o[1],e[2]=o[2],this._newColor=r.utils.rgb2hex(e))},t.newColor.get=function(){return this._newColor},t.epsilon.set=function(o){this.uniforms.epsilon=o},t.epsilon.get=function(){return this.uniforms.epsilon},Object.defineProperties(n.prototype,t),n}(r.Filter);o.ColorReplaceFilter=n,Object.defineProperty(o,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);

View File

@@ -10,4 +10,3 @@
* Modified the minified file to work on pixi4 by renaming filterFrame to sourceFrame below
*/
var __filters=function(n,i){"use strict";var t="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",e="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\n\nuniform vec4 filterArea;\nuniform vec2 dimensions;\n\nconst float SQRT_2 = 1.414213;\n\nconst float light = 1.0;\n\nuniform float curvature;\nuniform float lineWidth;\nuniform float lineContrast;\nuniform bool verticalLine;\nuniform float noise;\nuniform float noiseSize;\n\nuniform float vignetting;\nuniform float vignettingAlpha;\nuniform float vignettingBlur;\n\nuniform float seed;\nuniform float time;\n\nfloat rand(vec2 co) {\n return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);\n}\n\nvoid main(void)\n{\n vec2 pixelCoord = vTextureCoord.xy * filterArea.xy;\n vec2 coord = pixelCoord / dimensions;\n\n vec2 dir = vec2(coord - vec2(0.5, 0.5));\n\n float _c = curvature > 0. ? curvature : 1.;\n float k = curvature > 0. ?(length(dir * dir) * 0.25 * _c * _c + 0.935 * _c) : 1.;\n vec2 uv = dir * k;\n\n gl_FragColor = texture2D(uSampler, vTextureCoord);\n vec3 rgb = gl_FragColor.rgb;\n\n\n if (noise > 0.0 && noiseSize > 0.0)\n {\n pixelCoord.x = floor(pixelCoord.x / noiseSize);\n pixelCoord.y = floor(pixelCoord.y / noiseSize);\n float _noise = rand(pixelCoord * noiseSize * seed) - 0.5;\n rgb += _noise * noise;\n }\n\n if (lineWidth > 0.0) {\n float v = (verticalLine ? uv.x * dimensions.x : uv.y * dimensions.y) * min(1.0, 2.0 / lineWidth ) / _c;\n float j = 1. + cos(v * 1.2 - time) * 0.5 * lineContrast;\n rgb *= j;\n float segment = verticalLine ? mod((dir.x + .5) * dimensions.x, 4.) : mod((dir.y + .5) * dimensions.y, 4.);\n rgb *= 0.99 + ceil(segment) * 0.015;\n }\n\n if (vignetting > 0.0)\n {\n float outter = SQRT_2 - vignetting * SQRT_2;\n float darker = clamp((outter - length(dir) * SQRT_2) / ( 0.00001 + vignettingBlur * SQRT_2), 0.0, 1.0);\n rgb *= darker + (1.0 - darker) * (1.0 - vignettingAlpha);\n }\n\n gl_FragColor.rgb = rgb;\n}\n",r=function(n){function i(i){n.call(this,t,e),this.uniforms.dimensions=new Float32Array(2),this.time=0,this.seed=0,Object.assign(this,{curvature:1,lineWidth:1,lineContrast:.25,verticalLine:!1,noise:0,noiseSize:1,seed:0,vignetting:.3,vignettingAlpha:1,vignettingBlur:.3,time:0},i)}n&&(i.__proto__=n),i.prototype=Object.create(n&&n.prototype),i.prototype.constructor=i;var r={curvature:{configurable:!0},lineWidth:{configurable:!0},lineContrast:{configurable:!0},verticalLine:{configurable:!0},noise:{configurable:!0},noiseSize:{configurable:!0},vignetting:{configurable:!0},vignettingAlpha:{configurable:!0},vignettingBlur:{configurable:!0}};return i.prototype.apply=function(n,i,t,e){this.uniforms.dimensions[0]=i.sourceFrame.width,this.uniforms.dimensions[1]=i.sourceFrame.height,this.uniforms.seed=this.seed,this.uniforms.time=this.time,n.applyFilter(this,i,t,e)},r.curvature.set=function(n){this.uniforms.curvature=n},r.curvature.get=function(){return this.uniforms.curvature},r.lineWidth.set=function(n){this.uniforms.lineWidth=n},r.lineWidth.get=function(){return this.uniforms.lineWidth},r.lineContrast.set=function(n){this.uniforms.lineContrast=n},r.lineContrast.get=function(){return this.uniforms.lineContrast},r.verticalLine.set=function(n){this.uniforms.verticalLine=n},r.verticalLine.get=function(){return this.uniforms.verticalLine},r.noise.set=function(n){this.uniforms.noise=n},r.noise.get=function(){return this.uniforms.noise},r.noiseSize.set=function(n){this.uniforms.noiseSize=n},r.noiseSize.get=function(){return this.uniforms.noiseSize},r.vignetting.set=function(n){this.uniforms.vignetting=n},r.vignetting.get=function(){return this.uniforms.vignetting},r.vignettingAlpha.set=function(n){this.uniforms.vignettingAlpha=n},r.vignettingAlpha.get=function(){return this.uniforms.vignettingAlpha},r.vignettingBlur.set=function(n){this.uniforms.vignettingBlur=n},r.vignettingBlur.get=function(){return this.uniforms.vignettingBlur},Object.defineProperties(i.prototype,r),i}(i.Filter);return n.CRTFilter=r,n}({},PIXI);Object.assign(PIXI.filters,__filters);
//# sourceMappingURL=filter-crt.js.map

View File

@@ -0,0 +1,8 @@
/*!
* @pixi/filter-dot - v2.7.0
* Compiled Sun, 13 Jan 2019 22:51:52 UTC
*
* @pixi/filter-dot is licensed under the MIT License.
* http://www.opensource.org/licenses/mit-license
*/
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],n):n((e=e||self).__filters={},e.PIXI)}(this,function(e,n){"use strict";var t="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",o="precision mediump float;\n\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nuniform vec4 filterArea;\nuniform sampler2D uSampler;\n\nuniform float angle;\nuniform float scale;\n\nfloat pattern()\n{\n float s = sin(angle), c = cos(angle);\n vec2 tex = vTextureCoord * filterArea.xy;\n vec2 point = vec2(\n c * tex.x - s * tex.y,\n s * tex.x + c * tex.y\n ) * scale;\n return (sin(point.x) * sin(point.y)) * 4.0;\n}\n\nvoid main()\n{\n vec4 color = texture2D(uSampler, vTextureCoord);\n float average = (color.r + color.g + color.b) / 3.0;\n gl_FragColor = vec4(vec3(average * 10.0 - 5.0 + pattern()), color.a);\n}\n",r=function(e){function n(n,r){void 0===n&&(n=1),void 0===r&&(r=5),e.call(this,t,o),this.scale=n,this.angle=r}e&&(n.__proto__=e),n.prototype=Object.create(e&&e.prototype),n.prototype.constructor=n;var r={scale:{configurable:!0},angle:{configurable:!0}};return r.scale.get=function(){return this.uniforms.scale},r.scale.set=function(e){this.uniforms.scale=e},r.angle.get=function(){return this.uniforms.angle},r.angle.set=function(e){this.uniforms.angle=e},Object.defineProperties(n.prototype,r),n}(n.Filter);e.DotFilter=r,Object.defineProperty(e,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);

View File

@@ -6,4 +6,3 @@
* http://www.opensource.org/licenses/mit-license
*/
!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports,require("@pixi/filter-kawase-blur"),require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","@pixi/filter-kawase-blur","pixi.js"],i):i(t.__filters={},t.PIXI.filters,t.PIXI)}(this,function(t,i,e){"use strict";var r="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",n="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform float alpha;\nuniform vec3 color;\nvoid main(void){\n vec4 sample = texture2D(uSampler, vTextureCoord);\n\n // Un-premultiply alpha before applying the color\n if (sample.a > 0.0) {\n sample.rgb /= sample.a;\n }\n\n // Premultiply alpha again\n sample.rgb = color.rgb * sample.a;\n\n // alpha user alpha\n sample *= alpha;\n\n gl_FragColor = sample;\n}",o=function(t){function o(o){o&&o.constructor!==Object&&(console.warn("DropShadowFilter now uses options instead of (rotation, distance, blur, color, alpha)"),o={rotation:o},void 0!==arguments[1]&&(o.distance=arguments[1]),void 0!==arguments[2]&&(o.blur=arguments[2]),void 0!==arguments[3]&&(o.color=arguments[3]),void 0!==arguments[4]&&(o.alpha=arguments[4])),o=Object.assign({rotation:45,distance:5,color:0,alpha:.5,shadowOnly:!1,kernels:null,blur:2,quality:3,pixelSize:1,resolution:e.settings.RESOLUTION},o),t.call(this);var l=o.kernels,a=o.blur,s=o.quality,u=o.pixelSize,c=o.resolution;this._tintFilter=new e.Filter(r,n),this._tintFilter.uniforms.color=new Float32Array(4),this._tintFilter.resolution=c,this._blurFilter=l?new i.KawaseBlurFilter(l):new i.KawaseBlurFilter(a,s),this.pixelSize=u,this.resolution=c,this.targetTransform=new e.Matrix;var p=o.shadowOnly,h=o.rotation,f=o.distance,d=o.alpha,g=o.color;this.shadowOnly=p,this.rotation=h,this.distance=f,this.alpha=d,this.color=g,this._updatePadding()}t&&(o.__proto__=t),o.prototype=Object.create(t&&t.prototype),o.prototype.constructor=o;var l={resolution:{configurable:!0},distance:{configurable:!0},rotation:{configurable:!0},alpha:{configurable:!0},color:{configurable:!0},kernels:{configurable:!0},blur:{configurable:!0},quality:{configurable:!0},pixelSize:{configurable:!0}};return o.prototype.apply=function(t,i,e,r){var n=t.getRenderTarget();n.transform=this.targetTransform,this._tintFilter.apply(t,i,n,!0),n.transform=null,this._blurFilter.apply(t,n,e,r),!0!==this.shadowOnly&&t.applyFilter(this,i,e,!1),t.returnRenderTarget(n)},o.prototype._updatePadding=function(){this.padding=this.distance+2*this.blur},o.prototype._updateTargetTransform=function(){this.targetTransform.tx=this.distance*Math.cos(this.angle),this.targetTransform.ty=this.distance*Math.sin(this.angle)},l.resolution.get=function(){return this._resolution},l.resolution.set=function(t){this._resolution=t,this._tintFilter&&(this._tintFilter.resolution=t),this._blurFilter&&(this._blurFilter.resolution=t)},l.distance.get=function(){return this._distance},l.distance.set=function(t){this._distance=t,this._updatePadding(),this._updateTargetTransform()},l.rotation.get=function(){return this.angle/e.DEG_TO_RAD},l.rotation.set=function(t){this.angle=t*e.DEG_TO_RAD,this._updateTargetTransform()},l.alpha.get=function(){return this._tintFilter.uniforms.alpha},l.alpha.set=function(t){this._tintFilter.uniforms.alpha=t},l.color.get=function(){return e.utils.rgb2hex(this._tintFilter.uniforms.color)},l.color.set=function(t){e.utils.hex2rgb(t,this._tintFilter.uniforms.color)},l.kernels.get=function(){return this._blurFilter.kernels},l.kernels.set=function(t){this._blurFilter.kernels=t},l.blur.get=function(){return this._blurFilter.blur},l.blur.set=function(t){this._blurFilter.blur=t,this._updatePadding()},l.quality.get=function(){return this._blurFilter.quality},l.quality.set=function(t){this._blurFilter.quality=t},l.pixelSize.get=function(){return this._blurFilter.pixelSize},l.pixelSize.set=function(t){this._blurFilter.pixelSize=t},Object.defineProperties(o.prototype,l),o}(e.Filter);t.DropShadowFilter=o,Object.defineProperty(t,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
//# sourceMappingURL=filter-drop-shadow.js.map

File diff suppressed because one or more lines are too long

View File

@@ -6,4 +6,3 @@
* http://www.opensource.org/licenses/mit-license
*/
!function(o,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],t):t(o.__filters={},o.PIXI)}(this,function(o,t){"use strict";var n="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",e="varying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nuniform sampler2D uSampler;\n\nuniform float distance;\nuniform float outerStrength;\nuniform float innerStrength;\nuniform vec4 glowColor;\nuniform vec4 filterArea;\nuniform vec4 filterClamp;\nconst float PI = 3.14159265358979323846264;\n\nvoid main(void) {\n vec2 px = vec2(1.0 / filterArea.x, 1.0 / filterArea.y);\n vec4 ownColor = texture2D(uSampler, vTextureCoord);\n vec4 curColor;\n float totalAlpha = 0.0;\n float maxTotalAlpha = 0.0;\n float cosAngle;\n float sinAngle;\n vec2 displaced;\n for (float angle = 0.0; angle <= PI * 2.0; angle += %QUALITY_DIST%) {\n cosAngle = cos(angle);\n sinAngle = sin(angle);\n for (float curDistance = 1.0; curDistance <= %DIST%; curDistance++) {\n displaced.x = vTextureCoord.x + cosAngle * curDistance * px.x;\n displaced.y = vTextureCoord.y + sinAngle * curDistance * px.y;\n curColor = texture2D(uSampler, clamp(displaced, filterClamp.xy, filterClamp.zw));\n totalAlpha += (distance - curDistance) * curColor.a;\n maxTotalAlpha += (distance - curDistance);\n }\n }\n maxTotalAlpha = max(maxTotalAlpha, 0.0001);\n\n ownColor.a = max(ownColor.a, 0.0001);\n ownColor.rgb = ownColor.rgb / ownColor.a;\n float outerGlowAlpha = (totalAlpha / maxTotalAlpha) * outerStrength * (1. - ownColor.a);\n float innerGlowAlpha = ((maxTotalAlpha - totalAlpha) / maxTotalAlpha) * innerStrength * ownColor.a;\n float resultAlpha = (ownColor.a + outerGlowAlpha);\n gl_FragColor = vec4(mix(mix(ownColor.rgb, glowColor.rgb, innerGlowAlpha / ownColor.a), glowColor.rgb, outerGlowAlpha / resultAlpha) * resultAlpha, resultAlpha);\n}\n",r=function(o){function r(t,r,i,l,a){void 0===t&&(t=10),void 0===r&&(r=4),void 0===i&&(i=0),void 0===l&&(l=16777215),void 0===a&&(a=.1),o.call(this,n,e.replace(/%QUALITY_DIST%/gi,""+(1/a/t).toFixed(7)).replace(/%DIST%/gi,""+t.toFixed(7))),this.uniforms.glowColor=new Float32Array([0,0,0,1]),this.distance=t,this.color=l,this.outerStrength=r,this.innerStrength=i}o&&(r.__proto__=o),r.prototype=Object.create(o&&o.prototype),r.prototype.constructor=r;var i={color:{configurable:!0},distance:{configurable:!0},outerStrength:{configurable:!0},innerStrength:{configurable:!0}};return i.color.get=function(){return t.utils.rgb2hex(this.uniforms.glowColor)},i.color.set=function(o){t.utils.hex2rgb(o,this.uniforms.glowColor)},i.distance.get=function(){return this.uniforms.distance},i.distance.set=function(o){this.uniforms.distance=o},i.outerStrength.get=function(){return this.uniforms.outerStrength},i.outerStrength.set=function(o){this.uniforms.outerStrength=o},i.innerStrength.get=function(){return this.uniforms.innerStrength},i.innerStrength.set=function(o){this.uniforms.innerStrength=o},Object.defineProperties(r.prototype,i),r}(t.Filter);o.GlowFilter=r,Object.defineProperty(o,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
//# sourceMappingURL=filter-glow.js.map

File diff suppressed because one or more lines are too long

View File

@@ -6,4 +6,3 @@
* http://www.opensource.org/licenses/mit-license
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],t):t(e.__filters={},e.PIXI)}(this,function(e,t){"use strict";var r="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",i="\nvarying vec2 vTextureCoord;\nuniform sampler2D uSampler;\n\nuniform vec2 uOffset;\n\nvoid main(void)\n{\n vec4 color = vec4(0.0);\n\n // Sample top left pixel\n color += texture2D(uSampler, vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y + uOffset.y));\n\n // Sample top right pixel\n color += texture2D(uSampler, vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y + uOffset.y));\n\n // Sample bottom right pixel\n color += texture2D(uSampler, vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y - uOffset.y));\n\n // Sample bottom left pixel\n color += texture2D(uSampler, vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y - uOffset.y));\n\n // Average\n color *= 0.25;\n\n gl_FragColor = color;\n}",o="\nvarying vec2 vTextureCoord;\nuniform sampler2D uSampler;\n\nuniform vec2 uOffset;\nuniform vec4 filterClamp;\n\nvoid main(void)\n{\n vec4 color = vec4(0.0);\n\n // Sample top left pixel\n color += texture2D(uSampler, clamp(vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y + uOffset.y), filterClamp.xy, filterClamp.zw));\n\n // Sample top right pixel\n color += texture2D(uSampler, clamp(vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y + uOffset.y), filterClamp.xy, filterClamp.zw));\n\n // Sample bottom right pixel\n color += texture2D(uSampler, clamp(vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y - uOffset.y), filterClamp.xy, filterClamp.zw));\n\n // Sample bottom left pixel\n color += texture2D(uSampler, clamp(vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y - uOffset.y), filterClamp.xy, filterClamp.zw));\n\n // Average\n color *= 0.25;\n\n gl_FragColor = color;\n}\n",n=function(e){function n(n,l,u){void 0===n&&(n=4),void 0===l&&(l=3),void 0===u&&(u=!1),e.call(this,r,u?o:i),this.uniforms.uOffset=new Float32Array(2),this._pixelSize=new t.Point,this.pixelSize=1,this._clamp=u,this._kernels=null,Array.isArray(n)?this.kernels=n:(this._blur=n,this.quality=l)}e&&(n.__proto__=e),n.prototype=Object.create(e&&e.prototype),n.prototype.constructor=n;var l={kernels:{configurable:!0},clamp:{configurable:!0},pixelSize:{configurable:!0},quality:{configurable:!0},blur:{configurable:!0}};return n.prototype.apply=function(e,t,r,i){var o,n=this.pixelSize.x/t.size.width,l=this.pixelSize.y/t.size.height;if(1===this._quality||0===this._blur)o=this._kernels[0]+.5,this.uniforms.uOffset[0]=o*n,this.uniforms.uOffset[1]=o*l,e.applyFilter(this,t,r,i);else{for(var u,s=e.getRenderTarget(!0),f=t,a=s,p=this._quality-1,x=0;x<p;x++)o=this._kernels[x]+.5,this.uniforms.uOffset[0]=o*n,this.uniforms.uOffset[1]=o*l,e.applyFilter(this,f,a,!0),u=f,f=a,a=u;o=this._kernels[p]+.5,this.uniforms.uOffset[0]=o*n,this.uniforms.uOffset[1]=o*l,e.applyFilter(this,f,r,i),e.returnRenderTarget(s)}},n.prototype._generateKernels=function(){var e=this._blur,t=this._quality,r=[e];if(e>0)for(var i=e,o=e/t,n=1;n<t;n++)i-=o,r.push(i);this._kernels=r},l.kernels.get=function(){return this._kernels},l.kernels.set=function(e){Array.isArray(e)&&e.length>0?(this._kernels=e,this._quality=e.length,this._blur=Math.max.apply(Math,e)):(this._kernels=[0],this._quality=1)},l.clamp.get=function(){return this._clamp},l.pixelSize.set=function(e){"number"==typeof e?(this._pixelSize.x=e,this._pixelSize.y=e):Array.isArray(e)?(this._pixelSize.x=e[0],this._pixelSize.y=e[1]):e instanceof t.Point?(this._pixelSize.x=e.x,this._pixelSize.y=e.y):(this._pixelSize.x=1,this._pixelSize.y=1)},l.pixelSize.get=function(){return this._pixelSize},l.quality.get=function(){return this._quality},l.quality.set=function(e){this._quality=Math.max(1,Math.round(e)),this._generateKernels()},l.blur.get=function(){return this._blur},l.blur.set=function(e){this._blur=e,this._generateKernels()},Object.defineProperties(n.prototype,l),n}(t.Filter);e.KawaseBlurFilter=n,Object.defineProperty(e,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
//# sourceMappingURL=filter-kawase-blur.js.map

File diff suppressed because one or more lines are too long

View File

@@ -6,4 +6,3 @@
* http://www.opensource.org/licenses/mit-license
*/
!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?o(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],o):o(e.__filters={},e.PIXI)}(this,function(e,o){"use strict";var t="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",r="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\n\nuniform vec2 thickness;\nuniform vec4 outlineColor;\nuniform vec4 filterClamp;\n\nconst float DOUBLE_PI = 3.14159265358979323846264 * 2.;\n\nvoid main(void) {\n vec4 ownColor = texture2D(uSampler, vTextureCoord);\n vec4 curColor;\n float maxAlpha = 0.;\n vec2 displaced;\n for (float angle = 0.; angle <= DOUBLE_PI; angle += ${angleStep}) {\n displaced.x = vTextureCoord.x + thickness.x * cos(angle);\n displaced.y = vTextureCoord.y + thickness.y * sin(angle);\n curColor = texture2D(uSampler, clamp(displaced, filterClamp.xy, filterClamp.zw));\n maxAlpha = max(maxAlpha, curColor.a);\n }\n float resultAlpha = max(maxAlpha, ownColor.a);\n gl_FragColor = vec4((ownColor.rgb + outlineColor.rgb * (1. - ownColor.a)) * resultAlpha, resultAlpha);\n}\n",n=function(e){function n(o,i,l){void 0===o&&(o=1),void 0===i&&(i=0),void 0===l&&(l=.1);var s=Math.max(l*n.MAX_SAMPLES,n.MIN_SAMPLES),a=(2*Math.PI/s).toFixed(7);e.call(this,t,r.replace(/\$\{angleStep\}/,a)),this.uniforms.thickness=new Float32Array([0,0]),this.thickness=o,this.uniforms.outlineColor=new Float32Array([0,0,0,1]),this.color=i,this.quality=l}e&&(n.__proto__=e),n.prototype=Object.create(e&&e.prototype),n.prototype.constructor=n;var i={color:{configurable:!0}};return n.prototype.apply=function(e,o,t,r){this.uniforms.thickness[0]=this.thickness/o.size.width,this.uniforms.thickness[1]=this.thickness/o.size.height,e.applyFilter(this,o,t,r)},i.color.get=function(){return o.utils.rgb2hex(this.uniforms.outlineColor)},i.color.set=function(e){o.utils.hex2rgb(e,this.uniforms.outlineColor)},Object.defineProperties(n.prototype,i),n}(o.Filter);n.MIN_SAMPLES=1,n.MAX_SAMPLES=100,e.OutlineFilter=n,Object.defineProperty(e,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
//# sourceMappingURL=filter-outline.js.map

View File

@@ -6,4 +6,3 @@
* http://www.opensource.org/licenses/mit-license
*/
var __filters=function(e,o){"use strict";var r="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",n="precision mediump float;\n\nvarying vec2 vTextureCoord;\n\nuniform vec2 size;\nuniform sampler2D uSampler;\n\nuniform vec4 filterArea;\n\nvec2 mapCoord( vec2 coord )\n{\n coord *= filterArea.xy;\n coord += filterArea.zw;\n\n return coord;\n}\n\nvec2 unmapCoord( vec2 coord )\n{\n coord -= filterArea.zw;\n coord /= filterArea.xy;\n\n return coord;\n}\n\nvec2 pixelate(vec2 coord, vec2 size)\n{\n\treturn floor( coord / size ) * size;\n}\n\nvoid main(void)\n{\n vec2 coord = mapCoord(vTextureCoord);\n\n coord = pixelate(coord, size);\n\n coord = unmapCoord(coord);\n\n gl_FragColor = texture2D(uSampler, coord);\n}\n",t=function(e){function o(o){void 0===o&&(o=10),e.call(this,r,n),this.size=o}e&&(o.__proto__=e),o.prototype=Object.create(e&&e.prototype),o.prototype.constructor=o;var t={size:{configurable:!0}};return t.size.get=function(){return this.uniforms.size},t.size.set=function(e){"number"==typeof e&&(e=[e,e]),this.uniforms.size=e},Object.defineProperties(o.prototype,t),o}(o.Filter);return e.PixelateFilter=t,e}({},PIXI);Object.assign(PIXI.filters,__filters);
//# sourceMappingURL=filter-pixelate.js.map

View File

@@ -0,0 +1,8 @@
/*!
* @pixi/filter-radial-blur - v2.7.0
* Compiled Sun, 13 Jan 2019 22:51:52 UTC
*
* @pixi/filter-radial-blur is licensed under the MIT License.
* http://www.opensource.org/licenses/mit-license
*/
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],n):n((e=e||self).__filters={},e.PIXI)}(this,function(e,n){"use strict";var t="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",r="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform vec4 filterArea;\n\nuniform float uRadian;\nuniform vec2 uCenter;\nuniform float uRadius;\nuniform int uKernelSize;\n\nconst int MAX_KERNEL_SIZE = 2048;\n\nvoid main(void)\n{\n vec4 color = texture2D(uSampler, vTextureCoord);\n\n if (uKernelSize == 0)\n {\n gl_FragColor = color;\n return;\n }\n\n float aspect = filterArea.y / filterArea.x;\n vec2 center = uCenter.xy / filterArea.xy;\n float gradient = uRadius / filterArea.x * 0.3;\n float radius = uRadius / filterArea.x - gradient * 0.5;\n int k = uKernelSize - 1;\n\n vec2 coord = vTextureCoord;\n vec2 dir = vec2(center - coord);\n float dist = length(vec2(dir.x, dir.y * aspect));\n\n float radianStep = uRadian;\n if (radius >= 0.0 && dist > radius) {\n float delta = dist - radius;\n float gap = gradient;\n float scale = 1.0 - abs(delta / gap);\n if (scale <= 0.0) {\n gl_FragColor = color;\n return;\n }\n radianStep *= scale;\n }\n radianStep /= float(k);\n\n float s = sin(radianStep);\n float c = cos(radianStep);\n mat2 rotationMatrix = mat2(vec2(c, -s), vec2(s, c));\n\n for(int i = 0; i < MAX_KERNEL_SIZE - 1; i++) {\n if (i == k) {\n break;\n }\n\n coord -= center;\n coord.y *= aspect;\n coord = rotationMatrix * coord;\n coord.y /= aspect;\n coord += center;\n\n vec4 sample = texture2D(uSampler, coord);\n\n // switch to pre-multiplied alpha to correctly blur transparent images\n // sample.rgb *= sample.a;\n\n color += sample;\n }\n\n gl_FragColor = color / float(uKernelSize);\n}\n",i=function(e){function n(n,i,o,a){void 0===n&&(n=0),void 0===i&&(i=[0,0]),void 0===o&&(o=5),void 0===a&&(a=-1),e.call(this,t,r),this._angle=0,this.angle=n,this.center=i,this.kernelSize=o,this.radius=a}e&&(n.__proto__=e),n.prototype=Object.create(e&&e.prototype),n.prototype.constructor=n;var i={angle:{configurable:!0},center:{configurable:!0},radius:{configurable:!0}};return n.prototype.apply=function(e,n,t,r){this.uniforms.uKernelSize=0!==this._angle?this.kernelSize:0,e.applyFilter(this,n,t,r)},i.angle.set=function(e){this._angle=e,this.uniforms.uRadian=e*Math.PI/180},i.angle.get=function(){return this._angle},i.center.get=function(){return this.uniforms.uCenter},i.center.set=function(e){this.uniforms.uCenter=e},i.radius.get=function(){return this.uniforms.uRadius},i.radius.set=function(e){(e<0||e===1/0)&&(e=-1),this.uniforms.uRadius=e},Object.defineProperties(n.prototype,i),n}(n.Filter);e.RadialBlurFilter=i,Object.defineProperty(e,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);

View File

@@ -6,4 +6,3 @@
* http://www.opensource.org/licenses/mit-license
*/
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],n):n(e.__filters={},e.PIXI)}(this,function(e,n){"use strict";var r="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",t="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\n\nuniform vec4 filterArea;\nuniform vec4 filterClamp;\nuniform vec2 dimensions;\n\nuniform bool mirror;\nuniform float boundary;\nuniform vec2 amplitude;\nuniform vec2 waveLength;\nuniform vec2 alpha;\nuniform float time;\n\nfloat rand(vec2 co) {\n return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);\n}\n\nvoid main(void)\n{\n vec2 pixelCoord = vTextureCoord.xy * filterArea.xy;\n vec2 coord = pixelCoord / dimensions;\n\n if (coord.y < boundary) {\n gl_FragColor = texture2D(uSampler, vTextureCoord);\n return;\n }\n\n float k = (coord.y - boundary) / (1. - boundary + 0.0001);\n float areaY = boundary * dimensions.y / filterArea.y;\n float v = areaY + areaY - vTextureCoord.y;\n float y = mirror ? v : vTextureCoord.y;\n\n float _amplitude = ((amplitude.y - amplitude.x) * k + amplitude.x ) / filterArea.x;\n float _waveLength = ((waveLength.y - waveLength.x) * k + waveLength.x) / filterArea.y;\n float _alpha = (alpha.y - alpha.x) * k + alpha.x;\n\n float x = vTextureCoord.x + cos(v * 6.28 / _waveLength - time) * _amplitude;\n x = clamp(x, filterClamp.x, filterClamp.z);\n\n vec4 color = texture2D(uSampler, vec2(x, y));\n\n gl_FragColor = color * _alpha;\n}\n",o=function(e){function n(n){e.call(this,r,t),Object.assign(this,{mirror:!0,boundary:.5,amplitude:[0,20],waveLength:[30,100],alpha:[1,1],time:0},n)}e&&(n.__proto__=e),n.prototype=Object.create(e&&e.prototype),n.prototype.constructor=n;var o={mirror:{configurable:!0},boundary:{configurable:!0},amplitude:{configurable:!0},waveLength:{configurable:!0},alpha:{configurable:!0}};return n.prototype.apply=function(e,n,r,t){this.uniforms.dimensions[0]=n.sourceFrame.width,this.uniforms.dimensions[1]=n.sourceFrame.height,this.uniforms.time=this.time,e.applyFilter(this,n,r,t)},o.mirror.set=function(e){this.uniforms.mirror=e},o.mirror.get=function(){return this.uniforms.mirror},o.boundary.set=function(e){this.uniforms.boundary=e},o.boundary.get=function(){return this.uniforms.boundary},o.amplitude.set=function(e){this.uniforms.amplitude[0]=e[0],this.uniforms.amplitude[1]=e[1]},o.amplitude.get=function(){return this.uniforms.amplitude},o.waveLength.set=function(e){this.uniforms.waveLength[0]=e[0],this.uniforms.waveLength[1]=e[1]},o.waveLength.get=function(){return this.uniforms.waveLength},o.alpha.set=function(e){this.uniforms.alpha[0]=e[0],this.uniforms.alpha[1]=e[1]},o.alpha.get=function(){return this.uniforms.alpha},Object.defineProperties(n.prototype,o),n}(n.Filter);e.ReflectionFilter=o,Object.defineProperty(e,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this.__filters);
//# sourceMappingURL=filter-reflection.js.map

View File

@@ -6,4 +6,3 @@
* http://www.opensource.org/licenses/mit-license
*/
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],r):r(e.__filters={},e.PIXI)}(this,function(e,r){"use strict";var t="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",n="precision mediump float;\n\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform vec4 filterArea;\nuniform vec2 red;\nuniform vec2 green;\nuniform vec2 blue;\n\nvoid main(void)\n{\n gl_FragColor.r = texture2D(uSampler, vTextureCoord + red/filterArea.xy).r;\n gl_FragColor.g = texture2D(uSampler, vTextureCoord + green/filterArea.xy).g;\n gl_FragColor.b = texture2D(uSampler, vTextureCoord + blue/filterArea.xy).b;\n gl_FragColor.a = texture2D(uSampler, vTextureCoord).a;\n}\n",o=function(e){function r(r,o,i){void 0===r&&(r=[-10,0]),void 0===o&&(o=[0,10]),void 0===i&&(i=[0,0]),e.call(this,t,n),this.red=r,this.green=o,this.blue=i}e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r;var o={red:{configurable:!0},green:{configurable:!0},blue:{configurable:!0}};return o.red.get=function(){return this.uniforms.red},o.red.set=function(e){this.uniforms.red=e},o.green.get=function(){return this.uniforms.green},o.green.set=function(e){this.uniforms.green=e},o.blue.get=function(){return this.uniforms.blue},o.blue.set=function(e){this.uniforms.blue=e},Object.defineProperties(r.prototype,o),r}(r.Filter);e.RGBSplitFilter=o,Object.defineProperty(e,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
//# sourceMappingURL=filter-rgb-split.js.map

View File

@@ -6,4 +6,3 @@
* http://www.opensource.org/licenses/mit-license
*/
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],e):e(t.__filters={},t.PIXI)}(this,function(t,e){"use strict";var i="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",r="varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform float blur;\nuniform float gradientBlur;\nuniform vec2 start;\nuniform vec2 end;\nuniform vec2 delta;\nuniform vec2 texSize;\n\nfloat random(vec3 scale, float seed)\n{\n return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed);\n}\n\nvoid main(void)\n{\n vec4 color = vec4(0.0);\n float total = 0.0;\n\n float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);\n vec2 normal = normalize(vec2(start.y - end.y, end.x - start.x));\n float radius = smoothstep(0.0, 1.0, abs(dot(vTextureCoord * texSize - start, normal)) / gradientBlur) * blur;\n\n for (float t = -30.0; t <= 30.0; t++)\n {\n float percent = (t + offset - 0.5) / 30.0;\n float weight = 1.0 - abs(percent);\n vec4 sample = texture2D(uSampler, vTextureCoord + delta / texSize * percent * radius);\n sample.rgb *= sample.a;\n color += sample * weight;\n total += weight;\n }\n\n color /= total;\n color.rgb /= color.a + 0.00001;\n\n gl_FragColor = color;\n}\n",n=function(t){function n(n,o,s,l){void 0===n&&(n=100),void 0===o&&(o=600),void 0===s&&(s=null),void 0===l&&(l=null),t.call(this,i,r),this.uniforms.blur=n,this.uniforms.gradientBlur=o,this.uniforms.start=s||new e.Point(0,window.innerHeight/2),this.uniforms.end=l||new e.Point(600,window.innerHeight/2),this.uniforms.delta=new e.Point(30,30),this.uniforms.texSize=new e.Point(window.innerWidth,window.innerHeight),this.updateDelta()}t&&(n.__proto__=t),n.prototype=Object.create(t&&t.prototype),n.prototype.constructor=n;var o={blur:{configurable:!0},gradientBlur:{configurable:!0},start:{configurable:!0},end:{configurable:!0}};return n.prototype.updateDelta=function(){this.uniforms.delta.x=0,this.uniforms.delta.y=0},o.blur.get=function(){return this.uniforms.blur},o.blur.set=function(t){this.uniforms.blur=t},o.gradientBlur.get=function(){return this.uniforms.gradientBlur},o.gradientBlur.set=function(t){this.uniforms.gradientBlur=t},o.start.get=function(){return this.uniforms.start},o.start.set=function(t){this.uniforms.start=t,this.updateDelta()},o.end.get=function(){return this.uniforms.end},o.end.set=function(t){this.uniforms.end=t,this.updateDelta()},Object.defineProperties(n.prototype,o),n}(e.Filter),o=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.updateDelta=function(){var t=this.uniforms.end.x-this.uniforms.start.x,e=this.uniforms.end.y-this.uniforms.start.y,i=Math.sqrt(t*t+e*e);this.uniforms.delta.x=t/i,this.uniforms.delta.y=e/i},e}(n),s=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.updateDelta=function(){var t=this.uniforms.end.x-this.uniforms.start.x,e=this.uniforms.end.y-this.uniforms.start.y,i=Math.sqrt(t*t+e*e);this.uniforms.delta.x=-e/i,this.uniforms.delta.y=t/i},e}(n),l=function(t){function e(e,i,r,n){void 0===e&&(e=100),void 0===i&&(i=600),void 0===r&&(r=null),void 0===n&&(n=null),t.call(this),this.tiltShiftXFilter=new o(e,i,r,n),this.tiltShiftYFilter=new s(e,i,r,n)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={blur:{configurable:!0},gradientBlur:{configurable:!0},start:{configurable:!0},end:{configurable:!0}};return e.prototype.apply=function(t,e,i){var r=t.getRenderTarget(!0);this.tiltShiftXFilter.apply(t,e,r),this.tiltShiftYFilter.apply(t,r,i),t.returnRenderTarget(r)},i.blur.get=function(){return this.tiltShiftXFilter.blur},i.blur.set=function(t){this.tiltShiftXFilter.blur=this.tiltShiftYFilter.blur=t},i.gradientBlur.get=function(){return this.tiltShiftXFilter.gradientBlur},i.gradientBlur.set=function(t){this.tiltShiftXFilter.gradientBlur=this.tiltShiftYFilter.gradientBlur=t},i.start.get=function(){return this.tiltShiftXFilter.start},i.start.set=function(t){this.tiltShiftXFilter.start=this.tiltShiftYFilter.start=t},i.end.get=function(){return this.tiltShiftXFilter.end},i.end.set=function(t){this.tiltShiftXFilter.end=this.tiltShiftYFilter.end=t},Object.defineProperties(e.prototype,i),e}(e.Filter);t.TiltShiftFilter=l,t.TiltShiftXFilter=o,t.TiltShiftYFilter=s,t.TiltShiftAxisFilter=n,Object.defineProperty(t,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
//# sourceMappingURL=filter-tilt-shift.js.map

View File

@@ -0,0 +1,8 @@
/*!
* @pixi/filter-twist - v2.7.0
* Compiled Sun, 13 Jan 2019 22:51:52 UTC
*
* @pixi/filter-twist is licensed under the MIT License.
* http://www.opensource.org/licenses/mit-license
*/
!function(o,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],n):n((o=o||self).__filters={},o.PIXI)}(this,function(o,n){"use strict";var r="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",e="varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform float radius;\nuniform float angle;\nuniform vec2 offset;\nuniform vec4 filterArea;\n\nvec2 mapCoord( vec2 coord )\n{\n coord *= filterArea.xy;\n coord += filterArea.zw;\n\n return coord;\n}\n\nvec2 unmapCoord( vec2 coord )\n{\n coord -= filterArea.zw;\n coord /= filterArea.xy;\n\n return coord;\n}\n\nvec2 twist(vec2 coord)\n{\n coord -= offset;\n\n float dist = length(coord);\n\n if (dist < radius)\n {\n float ratioDist = (radius - dist) / radius;\n float angleMod = ratioDist * ratioDist * angle;\n float s = sin(angleMod);\n float c = cos(angleMod);\n coord = vec2(coord.x * c - coord.y * s, coord.x * s + coord.y * c);\n }\n\n coord += offset;\n\n return coord;\n}\n\nvoid main(void)\n{\n\n vec2 coord = mapCoord(vTextureCoord);\n\n coord = twist(coord);\n\n coord = unmapCoord(coord);\n\n gl_FragColor = texture2D(uSampler, coord );\n\n}\n",t=function(o){function n(n,t,i){void 0===n&&(n=200),void 0===t&&(t=4),void 0===i&&(i=20),o.call(this,r,e),this.radius=n,this.angle=t,this.padding=i}o&&(n.__proto__=o),n.prototype=Object.create(o&&o.prototype),n.prototype.constructor=n;var t={offset:{configurable:!0},radius:{configurable:!0},angle:{configurable:!0}};return t.offset.get=function(){return this.uniforms.offset},t.offset.set=function(o){this.uniforms.offset=o},t.radius.get=function(){return this.uniforms.radius},t.radius.set=function(o){this.uniforms.radius=o},t.angle.get=function(){return this.uniforms.angle},t.angle.set=function(o){this.uniforms.angle=o},Object.defineProperties(n.prototype,t),n}(n.Filter);o.TwistFilter=t,Object.defineProperty(o,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);

View File

@@ -6,4 +6,3 @@
* http://www.opensource.org/licenses/mit-license
*/
!function(n,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],e):e(n.__filters={},n.PIXI)}(this,function(n,e){"use strict";var t="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",r="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform vec4 filterArea;\n\nuniform vec2 uCenter;\nuniform float uStrength;\nuniform float uInnerRadius;\nuniform float uRadius;\n\nconst float MAX_KERNEL_SIZE = 32.0;\n\nfloat random(vec3 scale, float seed) {\n // use the fragment position for a different seed per-pixel\n return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed);\n}\n\nvoid main() {\n\n float minGradient = uInnerRadius * 0.3;\n float innerRadius = (uInnerRadius + minGradient * 0.5) / filterArea.x;\n\n float gradient = uRadius * 0.3;\n float radius = (uRadius - gradient * 0.5) / filterArea.x;\n\n float countLimit = MAX_KERNEL_SIZE;\n\n vec2 dir = vec2(uCenter.xy / filterArea.xy - vTextureCoord);\n float dist = length(vec2(dir.x, dir.y * filterArea.y / filterArea.x));\n\n float strength = uStrength;\n\n float delta = 0.0;\n float gap;\n if (dist < innerRadius) {\n delta = innerRadius - dist;\n gap = minGradient;\n } else if (radius >= 0.0 && dist > radius) { // radius < 0 means it's infinity\n delta = dist - radius;\n gap = gradient;\n }\n\n if (delta > 0.0) {\n float normalCount = gap / filterArea.x;\n delta = (normalCount - delta) / normalCount;\n countLimit *= delta;\n strength *= delta;\n if (countLimit < 1.0)\n {\n gl_FragColor = texture2D(uSampler, vTextureCoord);\n return;\n }\n }\n\n // randomize the lookup values to hide the fixed number of samples\n float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);\n\n float total = 0.0;\n vec4 color = vec4(0.0);\n\n dir *= strength;\n\n for (float t = 0.0; t < MAX_KERNEL_SIZE; t++) {\n float percent = (t + offset) / MAX_KERNEL_SIZE;\n float weight = 4.0 * (percent - percent * percent);\n vec2 p = vTextureCoord + dir * percent;\n vec4 sample = texture2D(uSampler, p);\n\n // switch to pre-multiplied alpha to correctly blur transparent images\n // sample.rgb *= sample.a;\n\n color += sample * weight;\n total += weight;\n\n if (t > countLimit){\n break;\n }\n }\n\n color /= total;\n // switch back from pre-multiplied alpha\n color.rgb /= color.a + 0.00001;\n\n gl_FragColor = color;\n}\n",i=function(n){function e(e,i,o,a){void 0===e&&(e=.1),void 0===i&&(i=[0,0]),void 0===o&&(o=0),void 0===a&&(a=-1),n.call(this,t,r),this.center=i,this.strength=e,this.innerRadius=o,this.radius=a}n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e;var i={center:{configurable:!0},strength:{configurable:!0},innerRadius:{configurable:!0},radius:{configurable:!0}};return i.center.get=function(){return this.uniforms.uCenter},i.center.set=function(n){this.uniforms.uCenter=n},i.strength.get=function(){return this.uniforms.uStrength},i.strength.set=function(n){this.uniforms.uStrength=n},i.innerRadius.get=function(){return this.uniforms.uInnerRadius},i.innerRadius.set=function(n){this.uniforms.uInnerRadius=n},i.radius.get=function(){return this.uniforms.uRadius},i.radius.set=function(n){(n<0||n===1/0)&&(n=-1),this.uniforms.uRadius=n},Object.defineProperties(e.prototype,i),e}(e.Filter);n.ZoomBlurFilter=i,Object.defineProperty(n,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
//# sourceMappingURL=filter-zoom-blur.js.map

View File

@@ -0,0 +1,32 @@
gdjs.PixiFiltersTools.registerFilterCreator('RadialBlur', {
makePIXIFilter: function(layer, effectData) {
var radialBlurFilter = new PIXI.filters.RadialBlurFilter();
return radialBlurFilter;
},
update: function(filter, layer) {
filter.center[0] = Math.round(filter._centerX * layer.getWidth());
filter.center[1] = Math.round(filter._centerY * layer.getHeight());
},
updateDoubleParameter: function(filter, parameterName, value) {
if (parameterName === 'radius') {
filter.radius = (value < 0 ? -1 : value);
}
else if (parameterName === 'angle') {
filter.angle = value;
}
else if (parameterName === 'kernelSize') {
filter.kernelSize = gdjs.PixiFiltersTools.clampKernelSize(value, 3, 25);
}
else if (parameterName === 'centerX') {
filter._centerX = value;
}
else if (parameterName === 'centerY') {
filter._centerY = value;
}
},
updateStringParameter: function(filter, parameterName, value) {
},
updateBooleanParameter: function(filter, parameterName, value) {
},
});

View File

@@ -23,8 +23,8 @@ gdjs.PixiFiltersTools.registerFilterCreator("Reflection", {
return reflectionFilter;
},
update: function(filter, layer) {
if (filter.animated) {
filter.time -= layer.getElapsedTime() / 1000;
if (filter.animationSpeed !== 0) {
filter.time += layer.getElapsedTime() / 1000 * filter.animationSpeed;
}
},
updateDoubleParameter: function(filter, parameterName, value) {
@@ -55,14 +55,15 @@ gdjs.PixiFiltersTools.registerFilterCreator("Reflection", {
if (parameterName === "alphaEnding") {
filter.alpha[1] = value;
}
if (parameterName === "animationSpeed") {
filter.animationSpeed = value;
}
},
updateStringParameter: function(filter, parameterName, value) {},
updateBooleanParameter: function(filter, parameterName, value) {
if (parameterName === "mirror") {
filter.mirror = value;
}
if (parameterName === "animated") {
filter.animated = value;
}
}
});

View File

@@ -0,0 +1,32 @@
gdjs.PixiFiltersTools.registerFilterCreator('Twist', {
makePIXIFilter: function(layer, effectData) {
var twistFilter = new PIXI.filters.TwistFilter();
return twistFilter;
},
update: function(filter, layer) {
filter.offset[0] = Math.round(filter._offsetX * layer.getWidth());
filter.offset[1] = Math.round(filter._offsetY * layer.getHeight());
},
updateDoubleParameter: function(filter, parameterName, value) {
if (parameterName === 'radius') {
filter.radius = value;
}
else if (parameterName === 'angle') {
filter.angle = value;
}
else if (parameterName === 'padding') {
filter.padding = value;
}
else if (parameterName === 'offsetX') {
filter._offsetX = value;
}
else if (parameterName === 'offsetY') {
filter._offsetY = value;
}
},
updateStringParameter: function(filter, parameterName, value) {
},
updateBooleanParameter: function(filter, parameterName, value) {
},
});

View File

@@ -5,16 +5,18 @@ gdjs.PixiFiltersTools.registerFilterCreator('ZoomBlur', {
return zoomBlurFilter;
},
update: function(filter, layer) {
filter.center[0] = Math.round(filter._centerX * layer.getWidth());
filter.center[1] = Math.round(filter._centerY * layer.getHeight());
},
updateDoubleParameter: function(filter, parameterName, value) {
if (parameterName === 'centerX') {
filter.center[0]= Math.round(window.innerWidth * value);
filter._centerX = value;
}
else if (parameterName === 'centerY') {
filter.center[1] = Math.round(window.innerHeight * value);
filter._centerY = value;
}
else if (parameterName === 'innerRadius') {
filter.innerRadius = Math.round(window.innerWidth * value);
filter.innerRadius = value;
}
else if (parameterName === 'strength') {
filter.strength = gdjs.PixiFiltersTools.clampValue(value / 10, 0, 20);

View File

@@ -385,6 +385,19 @@ module.exports = {
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
.setFunctionName('gdjs.fileSystem.getUserdataPath');
extension
.addStrExpression(
'UserHomePath',
_('User\'s Home folder'),
_('Get the path to the user home folder.'),
_('Filesystem/Windows, Linux, MacOS'),
'JsPlatform/Extensions/filesystem_folder24.png',
'JsPlatform/Extensions/filesystem_folder32.png'
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
.setFunctionName('gdjs.fileSystem.getUserHomePath');
extension
.addStrExpression(
'TempPath',

View File

@@ -97,6 +97,23 @@ gdjs.fileSystem.getUserdataPath = function(runtimeScene) {
}
};
/**
* Get the path to the user's home folder (on Windows `C:\Users\<USERNAME>\` for example).
* @return {string} The path to user's "home" folder
*/
gdjs.fileSystem.getUserHomePath = function() {
const electron = runtimeScene
.getGame()
.getRenderer()
.getElectron();
if (electron) {
return electron.remote.app.getPath('home') || '';
} else {
return '';
}
};
/**
* Get the path to 'Temp' folder.
* @param {gdjs.RuntimeScene} runtimeScene The current scene

View File

@@ -1,5 +1,5 @@
describe('Inventory', function() {
var runtimeGame = new gdjs.RuntimeGame({variables: [], properties: {windowWidth: 800, windowHeight: 600}});
var runtimeGame = new gdjs.RuntimeGame({variables: [], properties: {windowWidth: 800, windowHeight: 600}, resources: {resources: []}});
var runtimeScene = new gdjs.RuntimeScene(runtimeGame);
gdjs.evtTools.inventory.add(runtimeScene, "MyInventory", "sword");

View File

@@ -1,6 +1,6 @@
describe('gdjs.LinksManager', function() {
var runtimeGame = new gdjs.RuntimeGame({variables: [], properties: {windowWidth: 800, windowHeight: 600}});
var runtimeGame = new gdjs.RuntimeGame({variables: [], properties: {windowWidth: 800, windowHeight: 600}, resources: {resources: []}});
var runtimeScene = new gdjs.RuntimeScene(runtimeGame);
runtimeScene.loadFromScene({
layers:[{name:"", visibility: true}],

View File

@@ -245,7 +245,7 @@ gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.setTexture = function(
texture,
makeInsideTexture(
new PIXI.Rectangle(
this._borderSprites[1].width - obj._rBorder,
texture.width - obj._rBorder,
0,
obj._rBorder,
obj._tBorder
@@ -261,7 +261,7 @@ gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.setTexture = function(
makeInsideTexture(
new PIXI.Rectangle(
0,
this._borderSprites[5].height - obj._bBorder,
texture.height - obj._bBorder,
obj._lBorder,
obj._bBorder
)
@@ -271,8 +271,8 @@ gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.setTexture = function(
texture,
makeInsideTexture(
new PIXI.Rectangle(
this._borderSprites[7].width - obj._rBorder,
this._borderSprites[7].height - obj._bBorder,
texture.width - obj._rBorder,
texture.height - obj._bBorder,
obj._rBorder,
obj._bBorder
)

View File

@@ -133,15 +133,14 @@ class PathfindingBehaviorJsExtension : public gd::PlatformExtension {
GetAllExpressionsForBehavior(
"PathfindingBehavior::PathfindingObstacleBehavior");
autActions["PathfindingObstacleBehavior::Cost"]
autActions["PathfindingBehavior::Cost"]
.SetFunctionName("setCost")
.SetGetter("getCost");
autConditions["PathfindingObstacleBehavior::Cost"].SetFunctionName(
"getCost");
autActions["PathfindingObstacleBehavior::SetImpassable"].SetFunctionName(
autConditions["PathfindingBehavior::Cost"].SetFunctionName("getCost");
autActions["PathfindingBehavior::SetImpassable"].SetFunctionName(
"setImpassable");
autConditions["PathfindingObstacleBehavior::IsImpassable"]
.SetFunctionName("isImpassable");
autConditions["PathfindingBehavior::IsImpassable"].SetFunctionName(
"isImpassable");
autExpressions["Cost"].SetFunctionName("getCost");
}

View File

@@ -754,8 +754,7 @@ module.exports = {
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setShapeScale')
.setFunctionName('setShapeScale')
.setGetter('getShapeScale');
aut
@@ -790,8 +789,7 @@ module.exports = {
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setDensity')
.setFunctionName('setDensity')
.setGetter('getDensity');
aut
@@ -840,7 +838,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setFriction')
.setGetter('getFriction');
aut
@@ -889,7 +886,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setRestitution')
.setGetter('getRestitution');
aut
@@ -938,7 +934,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setLinearDamping')
.setGetter('getLinearDamping');
aut
@@ -987,7 +982,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setAngularDamping')
.setGetter('getAngularDamping');
aut
@@ -1036,7 +1030,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setGravityScale')
.setGetter('getGravityScale');
aut
@@ -1157,7 +1150,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setLinearVelocityX')
.setGetter('getLinearVelocityX');
aut
@@ -1204,7 +1196,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setLinearVelocityY')
.setGetter('getLinearVelocityY');
aut
@@ -1280,7 +1271,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setAngularVelocity')
.setGetter('getAngularVelocity');
aut
@@ -1729,7 +1719,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setDistanceJointLength')
.setGetter('getDistanceJointLength');
aut
@@ -1762,7 +1751,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setDistanceJointFrequency')
.setGetter('getDistanceJointFrequency');
aut
@@ -1795,7 +1783,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setDistanceJointDampingRatio')
.setGetter('getDistanceJointDampingRatio');
aut
@@ -2091,7 +2078,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setRevoluteJointMotorSpeed')
.setGetter('getRevoluteJointMotorSpeed');
aut
@@ -2124,7 +2110,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setRevoluteJointMaxMotorTorque')
.setGetter('getRevoluteJointMaxMotorTorque');
aut
@@ -2405,7 +2390,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setPrismaticJointMotorSpeed')
.setGetter('getPrismaticJointMotorSpeed');
aut
@@ -2438,7 +2422,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setPrismaticJointMaxMotorForce')
.setGetter('getPrismaticJointMaxMotorForce');
aut
@@ -2709,7 +2692,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setGearJointRatio')
.setGetter('getGearJointRatio');
aut
@@ -2835,7 +2817,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setMouseJointMaxForce')
.setGetter('getMouseJointMaxForce');
aut
@@ -2868,7 +2849,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setMouseJointFrequency')
.setGetter('getMouseJointFrequency');
aut
@@ -2901,7 +2881,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setMouseJointDampingRatio')
.setGetter('getMouseJointDampingRatio');
aut
@@ -3071,7 +3050,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setWheelJointMotorSpeed')
.setGetter('getWheelJointMotorSpeed');
aut
@@ -3104,7 +3082,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setWheelJointMaxMotorTorque')
.setGetter('getWheelJointMaxMotorTorque');
aut
@@ -3151,7 +3128,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setWheelJointFrequency')
.setGetter('getWheelJointFrequency');
aut
@@ -3184,7 +3160,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setWheelJointDampingRatio')
.setGetter('getWheelJointDampingRatio');
aut
@@ -3281,7 +3256,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setWeldJointFrequency')
.setGetter('getWeldJointFrequency');
aut
@@ -3314,7 +3288,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setWeldJointDampingRatio')
.setGetter('getWeldJointDampingRatio');
aut
@@ -3390,7 +3363,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setRopeJointMaxLength')
.setGetter('getRopeJointMaxLength');
aut
@@ -3459,7 +3431,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setFrictionJointMaxForce')
.setGetter('getFrictionJointMaxForce');
aut
@@ -3492,7 +3463,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setFrictionJointMaxTorque')
.setGetter('getFrictionJointMaxTorque');
aut
@@ -3610,7 +3580,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setMotorJointAngularOffset')
.setGetter('getMotorJointAngularOffset');
aut
@@ -3643,7 +3612,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setMotorJointMaxForce')
.setGetter('getMotorJointMaxForce');
aut
@@ -3676,7 +3644,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setMotorJointMaxTorque')
.setGetter('getMotorJointMaxTorque');
aut
@@ -3709,7 +3676,6 @@ module.exports = {
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName('setMotorJointCorrectionFactor')
.setGetter('getMotorJointCorrectionFactor');
aut

View File

@@ -303,9 +303,34 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
.SetGetter("GetJumpSpeed")
.SetIncludeFile("PlatformBehavior/PlatformerObjectRuntimeBehavior.h");
aut.AddCondition(
"JumpSustainTime",
_("Jump sustain time"),
_("Compare the jump sustain time of the object (in seconds)."),
_("the jump sustain time"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
.MarkAsAdvanced();
aut.AddAction(
"JumpSustainTime",
_("Jump sustain time"),
_("Change the jump sustain time of an object (in seconds)."),
_("the jump sustain time"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon24.png",
"CppPlatform/Extensions/platformerobjecticon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardOperatorParameters("number");
aut.AddAction(
"SetCanJump",
_("Allow again jumping"),
_("Allow jumping again"),
_("When this action is executed, the object is able to jump again, "
"even if it is in the air: this can be useful to allow a double "
"jump for example. This is not a permanent effect: you must call "
@@ -502,6 +527,14 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.SetFunctionName("GetJumpSpeed")
.SetIncludeFile("PlatformBehavior/PlatformerObjectRuntimeBehavior.h");
aut.AddExpression("JumpSustainTime",
_("Jump sustain time"),
_("The time during which keeping the jump button held allow the initial jump speed to be maintained."),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior");
#endif
}
{

View File

@@ -92,6 +92,12 @@ class PlatformBehaviorJsExtension : public gd::PlatformExtension {
.SetFunctionName("setJumpSpeed")
.SetGetter("getJumpSpeed");
autExpressions["JumpSpeed"].SetFunctionName("getJumpSpeed");
autConditions["PlatformBehavior::JumpSustainTime"].SetFunctionName(
"getJumpSustainTime");
autActions["PlatformBehavior::JumpSustainTime"]
.SetFunctionName("setJumpSustainTime")
.SetGetter("getJumpSustainTime");
autExpressions["JumpSustainTime"].SetFunctionName("getJumpSustainTime");
autActions["PlatformBehavior::SetCanJump"].SetFunctionName("setCanJump");
autActions["PlatformBehavior::SimulateLeftKey"].SetFunctionName(

View File

@@ -6,11 +6,13 @@ This project is released under the MIT License.
*/
#include "PlatformerObjectBehavior.h"
#include <SFML/Window.hpp>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <memory>
#include "GDCore/Tools/Localization.h"
#include "GDCpp/Runtime/CommonTools.h"
#include "GDCpp/Runtime/Project/Layout.h"
@@ -22,6 +24,7 @@ This project is released under the MIT License.
#if defined(GD_IDE_ONLY)
#include <iostream>
#include <map>
#include "GDCore/Project/PropertyDescriptor.h"
#endif
@@ -34,6 +37,7 @@ void PlatformerObjectBehavior::InitializeContent(
behaviorContent.SetAttribute("deceleration", 1500);
behaviorContent.SetAttribute("maxSpeed", 250);
behaviorContent.SetAttribute("jumpSpeed", 600);
behaviorContent.SetAttribute("jumpSustainTime", 0.2);
behaviorContent.SetAttribute("ignoreDefaultControls", false);
behaviorContent.SetAttribute("slopeMaxAngle", 60);
behaviorContent.SetAttribute("canGrabPlatforms", false);
@@ -51,6 +55,14 @@ PlatformerObjectBehavior::GetProperties(
gd::String::From(behaviorContent.GetDoubleAttribute("gravity")));
properties[_("Jump speed")].SetValue(
gd::String::From(behaviorContent.GetDoubleAttribute("jumpSpeed")));
properties[_("jumpSustainTime")]
.SetValue(gd::String::From(
behaviorContent.GetDoubleAttribute("jumpSustainTime", 0)))
.SetLabel(_("Jump sustain time"))
.SetDescription(
_("Maximum time (in seconds) during which the jump strength is "
"sustained if the jump key is held - allowing variable height "
"jumps."));
properties[_("Max. falling speed")].SetValue(
gd::String::From(behaviorContent.GetDoubleAttribute("maxFallingSpeed")));
properties[_("Acceleration")].SetValue(
@@ -91,7 +103,7 @@ bool PlatformerObjectBehavior::UpdateProperty(
gd::Project& project) {
if (name == _("Default controls"))
behaviorContent.SetAttribute("ignoreDefaultControls", (value == "0"));
if (name == _("Round coordinates"))
else if (name == _("Round coordinates"))
behaviorContent.SetAttribute("roundCoordinates", (value == "1"));
else if (name == _("Can grab platform ledges"))
behaviorContent.SetAttribute("canGrabPlatforms", (value == "1"));
@@ -112,6 +124,8 @@ bool PlatformerObjectBehavior::UpdateProperty(
behaviorContent.SetAttribute("maxSpeed", value.To<double>());
else if (name == _("Jump speed"))
behaviorContent.SetAttribute("jumpSpeed", value.To<double>());
else if (name == _("jumpSustainTime"))
behaviorContent.SetAttribute("jumpSustainTime", value.To<double>());
else if (name == _("Slope max. angle")) {
double newMaxAngle = value.To<double>();
if (newMaxAngle < 0 || newMaxAngle >= 90) return false;

View File

@@ -323,6 +323,7 @@ void PlatformerObjectRuntimeBehavior::DoStepPreEvents(RuntimeScene& scene) {
}
if (jumping) {
// TODO: Port the jump sustain feature
requestedDeltaY -= currentJumpSpeed * timeDelta;
currentJumpSpeed -= gravity * timeDelta;
if (currentJumpSpeed < 0) {

File diff suppressed because it is too large Load Diff

View File

@@ -1,282 +1,483 @@
const makeTestRuntimeScene = () => {
const runtimeGame = new gdjs.RuntimeGame({
variables: [],
resources: {
resources: [],
},
properties: { windowWidth: 800, windowHeight: 600 },
});
const runtimeScene = new gdjs.RuntimeScene(runtimeGame);
runtimeScene.loadFromScene({
layers: [{ name: '', visibility: true }],
variables: [],
behaviorsSharedData: [],
objects: [],
instances: [],
});
runtimeScene._timeManager.getElapsedTime = function() {
return (1 / 60) * 1000;
};
return runtimeScene;
};
const addPlatformObject = runtimeScene => {
var platform = new gdjs.RuntimeObject(runtimeScene, {
name: 'obj2',
type: '',
behaviors: [
{
type: 'PlatformBehavior::PlatformBehavior',
canBeGrabbed: true,
},
],
});
platform.getWidth = function() {
return 60;
};
platform.getHeight = function() {
return 32;
};
runtimeScene.addObject(platform);
return platform;
};
describe('gdjs.PlatformerObjectRuntimeBehavior', function() {
var runtimeGame = new gdjs.RuntimeGame({variables: [], properties: {windowWidth: 800, windowHeight: 600}});
var runtimeScene = new gdjs.RuntimeScene(runtimeGame);
runtimeScene.loadFromScene({
layers: [{name: "", visibility: true}],
variables: [],
behaviorsSharedData: [],
objects: [],
instances: []
});
runtimeScene._timeManager.getElapsedTime = function() { return 1 / 60 * 1000; };
const runtimeScene = makeTestRuntimeScene();
//Put a platformer object in the air.
var object = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [{
type: "PlatformBehavior::PlatformerObjectBehavior",
name: "auto1",
gravity: 900,
maxFallingSpeed: 1500,
acceleration: 500,
deceleration: 1500,
maxSpeed: 500,
jumpSpeed: 1500,
canGrabPlatforms: true,
ignoreDefaultControls: true,
slopeMaxAngle: 60
}]});
object.getWidth = function() { return 10; };
object.getHeight = function() { return 20; };
runtimeScene.addObject(object);
object.setPosition(0, -100);
//Put a platformer object in the air.
var object = new gdjs.RuntimeObject(runtimeScene, {
name: 'obj1',
type: '',
behaviors: [
{
type: 'PlatformBehavior::PlatformerObjectBehavior',
name: 'auto1',
gravity: 900,
maxFallingSpeed: 1500,
acceleration: 500,
deceleration: 1500,
maxSpeed: 500,
jumpSpeed: 1500,
canGrabPlatforms: true,
ignoreDefaultControls: true,
slopeMaxAngle: 60,
},
],
});
object.getWidth = function() {
return 10;
};
object.getHeight = function() {
return 20;
};
runtimeScene.addObject(object);
object.setPosition(0, -100);
//Put a platform
var platform = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: [{
type: "PlatformBehavior::PlatformBehavior",
canBeGrabbed: true,
}]});
platform.getWidth = function() { return 60; };
platform.getHeight = function() { return 32; };
runtimeScene.addObject(platform);
platform.setPosition(0, -10);
//Put a platform
const platform = addPlatformObject(runtimeScene);
platform.setPosition(0, -10);
it('can fall when in the air', function() {
for(var i = 0; i<30; ++i) {
runtimeScene.renderAndStep();
if (i < 10) expect(object.getBehavior("auto1").isFalling()).to.be(true);
}
it('can fall when in the air', function() {
for (var i = 0; i < 30; ++i) {
runtimeScene.renderAndStep();
if (i < 10) expect(object.getBehavior('auto1').isFalling()).to.be(true);
}
//Check the platform stopped the platformer object.
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
expect(object.getBehavior("auto1").isFalling()).to.be(false);
expect(object.getBehavior("auto1").isMoving()).to.be(false);
//Check the platform stopped the platformer object.
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
expect(object.getBehavior('auto1').isFalling()).to.be(false);
expect(object.getBehavior('auto1').isMoving()).to.be(false);
for(var i = 0; i<35; ++i) { //Check that the platformer object can fall.
object.getBehavior("auto1").simulateRightKey();
runtimeScene.renderAndStep();
}
expect(object.getX()).to.be.within(87.50, 87.51);
expect(object.getY()).to.be(-24.75);
expect(object.getBehavior("auto1").isFalling()).to.be(true);
for (var i = 0; i < 35; ++i) {
//Check that the platformer object can fall.
object.getBehavior('auto1').simulateRightKey();
runtimeScene.renderAndStep();
}
expect(object.getX()).to.be.within(87.5, 87.51);
expect(object.getY()).to.be(-24.75);
expect(object.getBehavior('auto1').isFalling()).to.be(true);
for(var i = 0; i<100; ++i) { //Let the speed on X axis go back to 0.
runtimeScene.renderAndStep();
}
});
for (var i = 0; i < 100; ++i) {
//Let the speed on X axis go back to 0.
runtimeScene.renderAndStep();
}
});
it('can grab, and release, a platform', function() {
//Put the object near the right ledge of the platform.
object.setPosition(platform.getX() + platform.getWidth() + 2, platform.getY() - 10);
it('can grab, and release, a platform', function() {
//Put the object near the right ledge of the platform.
object.setPosition(
platform.getX() + platform.getWidth() + 2,
platform.getY() - 10
);
for(var i = 0; i<35; ++i) {
object.getBehavior("auto1").simulateLeftKey();
runtimeScene.renderAndStep();
}
for (var i = 0; i < 35; ++i) {
object.getBehavior('auto1').simulateLeftKey();
runtimeScene.renderAndStep();
}
//Check that the object grabbed the platform
expect(object.getX()).to.be.within(
platform.getX() + platform.getWidth() + 1,
platform.getX() + platform.getWidth() + 2
);
expect(object.getY()).to.be(platform.getY());
//Check that the object grabbed the platform
expect(object.getX()).to.be.within(
platform.getX() + platform.getWidth() + 1,
platform.getX() + platform.getWidth() + 2
);
expect(object.getY()).to.be(platform.getY());
object.getBehavior("auto1").simulateReleaseKey();
for(var i = 0; i<10; ++i) {
runtimeScene.renderAndStep();
}
object.getBehavior('auto1').simulateReleaseKey();
for (var i = 0; i < 10; ++i) {
runtimeScene.renderAndStep();
}
//Check that the object is falling
expect(object.getY()).to.be(1.25);
});
//Check that the object is falling
expect(object.getY()).to.be(1.25);
});
it('can track object height changes', function() {
//Put the object near the right ledge of the platform.
object.setPosition(platform.getX() + 10, platform.getY() - object.getHeight() - 1);
it('can track object height changes', function() {
//Put the object near the right ledge of the platform.
object.setPosition(
platform.getX() + 10,
platform.getY() - object.getHeight() - 1
);
for(var i = 0; i<15; ++i) {
runtimeScene.renderAndStep();
}
for (var i = 0; i < 15; ++i) {
runtimeScene.renderAndStep();
}
expect(object.getBehavior("auto1").isFalling()).to.be(false);
expect(object.getX()).to.be(10);
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
expect(object.getBehavior('auto1').isFalling()).to.be(false);
expect(object.getX()).to.be(10);
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
object.getHeight = function() { return 9; }
runtimeScene.renderAndStep();
expect(object.getBehavior("auto1").isFalling()).to.be(false);
expect(object.getY()).to.be(-19); // -19 = -10 (platform y) + -9 (object height)
object.getHeight = function() {
return 9;
};
runtimeScene.renderAndStep();
expect(object.getBehavior('auto1').isFalling()).to.be(false);
expect(object.getY()).to.be(-19); // -19 = -10 (platform y) + -9 (object height)
for(var i = 0; i<10; ++i) {
object.getBehavior("auto1").simulateRightKey();
runtimeScene.renderAndStep();
expect(object.getBehavior("auto1").isFalling()).to.be(false);
}
expect(object.getY()).to.be(-19);
expect(object.getX()).to.be.within(17.638, 17.639);
for (var i = 0; i < 10; ++i) {
object.getBehavior('auto1').simulateRightKey();
runtimeScene.renderAndStep();
expect(object.getBehavior('auto1').isFalling()).to.be(false);
}
expect(object.getY()).to.be(-19);
expect(object.getX()).to.be.within(17.638, 17.639);
object.getHeight = function() { return 20; }
runtimeScene.renderAndStep();
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
});
object.getHeight = function() {
return 20;
};
runtimeScene.renderAndStep();
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
});
});
describe('gdjs.PlatformerObjectRuntimeBehavior, jump and jump sustain (round coordinates on)', function() {
const runtimeScene = makeTestRuntimeScene();
//Put a platformer object on a platform
var object = new gdjs.RuntimeObject(runtimeScene, {
name: 'obj1',
type: '',
behaviors: [
{
type: 'PlatformBehavior::PlatformerObjectBehavior',
name: 'auto1',
gravity: 1500,
maxFallingSpeed: 1500,
acceleration: 500,
deceleration: 1500,
maxSpeed: 500,
jumpSpeed: 900,
canGrabPlatforms: true,
ignoreDefaultControls: true,
slopeMaxAngle: 60,
jumpSustainTime: 0.2,
roundCoordinates: true,
},
],
});
object.getWidth = function() {
return 10;
};
object.getHeight = function() {
return 20;
};
runtimeScene.addObject(object);
object.setPosition(0, -32);
//Put a platform
const platform = addPlatformObject(runtimeScene);
platform.setPosition(0, -10);
it('can jump', function() {
// Ensure the object falls on the platform
for (var i = 0; i < 10; ++i) {
runtimeScene.renderAndStep();
}
//Check the object is on the platform
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
expect(object.getBehavior('auto1').isFalling()).to.be(false);
expect(object.getBehavior('auto1').isMoving()).to.be(false);
// Jump without sustaining
object.getBehavior('auto1').simulateJumpKey();
for (var i = 0; i < 18; ++i) {
runtimeScene.renderAndStep();
}
// Check that we reached the maximum height
expect(object.getY()).to.be.within(-180, -179);
runtimeScene.renderAndStep();
expect(object.getY()).to.be(-180);
runtimeScene.renderAndStep();
expect(object.getY()).to.be.within(-180, -179);
// Then let the object fall
for (var i = 0; i < 60; ++i) {
runtimeScene.renderAndStep();
}
expect(object.getY()).to.be(-30);
});
it('can jump, sustaining the jump', function() {
//Check the object is on the platform
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
expect(object.getBehavior('auto1').isFalling()).to.be(false);
expect(object.getBehavior('auto1').isMoving()).to.be(false);
// Jump with sustaining as much as possible, and
// even more (18 frames at 60fps is greater than 0.2s)
for (var i = 0; i < 18; ++i) {
object.getBehavior('auto1').simulateJumpKey();
runtimeScene.renderAndStep();
}
// Check the height reached
expect(object.getY()).to.be(-230);
runtimeScene.renderAndStep();
expect(object.getY()).to.be(-235);
for (var i = 0; i < 5; ++i) {
// Verify that pressing the jump key does not change anything
object.getBehavior('auto1').simulateJumpKey();
runtimeScene.renderAndStep();
}
// Check that we reached the maximum height
expect(object.getY()).to.be(-247.5);
runtimeScene.renderAndStep();
expect(object.getY()).to.be(-247.5);
runtimeScene.renderAndStep();
expect(object.getY()).to.be.within(-247, -246);
// Then let the object fall
for (var i = 0; i < 60; ++i) {
runtimeScene.renderAndStep();
}
expect(object.getY()).to.be(-30);
});
it('can jump, and only sustain the jump while key held', function() {
//Check the object is on the platform
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
expect(object.getBehavior('auto1').isFalling()).to.be(false);
expect(object.getBehavior('auto1').isMoving()).to.be(false);
// Jump with sustaining a bit (5 frames at 60fps = 0.08s), then stop
for (var i = 0; i < 5; ++i) {
object.getBehavior('auto1').simulateJumpKey();
runtimeScene.renderAndStep();
}
expect(object.getY()).to.be.within(-101, -100);
// Stop holding the jump key
runtimeScene.renderAndStep();
for (var i = 0; i < 13; ++i) {
// then hold it again (but it's too late, jump sustain is gone for this jump)
object.getBehavior('auto1').simulateJumpKey();
runtimeScene.renderAndStep();
}
// Check that we reached the maximum height
expect(object.getY()).to.be.within(-206, -205);
runtimeScene.renderAndStep();
expect(object.getY()).to.be.within(-208, -207);
runtimeScene.renderAndStep();
expect(object.getY()).to.be.within(-208, -207);
runtimeScene.renderAndStep();
expect(object.getY()).to.be.within(-208, -207);
runtimeScene.renderAndStep();
expect(object.getY()).to.be.within(-206, -205);
runtimeScene.renderAndStep();
// Then let the object fall
for (var i = 0; i < 60; ++i) {
runtimeScene.renderAndStep();
}
expect(object.getY()).to.be(-30);
});
});
describe('gdjs.PlatformerObjectRuntimeBehavior, jumpthru', function() {
var runtimeGame = new gdjs.RuntimeGame({variables: [], properties: {windowWidth: 800, windowHeight: 600}});
var runtimeScene = new gdjs.RuntimeScene(runtimeGame);
runtimeScene.loadFromScene({
layers: [{name: "", visibility: true}],
variables: [],
behaviorsSharedData: [],
objects: [],
instances: []
});
runtimeScene._timeManager.getElapsedTime = function() { return 1 / 60 * 1000; };
const runtimeScene = makeTestRuntimeScene();
//Put a platformer object in a platform.
var object = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [{
type: "PlatformBehavior::PlatformerObjectBehavior",
name: "auto1",
roundCoordinates: true,
gravity: 900,
maxFallingSpeed: 1500,
acceleration: 500,
deceleration: 1500,
maxSpeed: 500,
jumpSpeed: 500,
canGrabPlatforms: true,
ignoreDefaultControls: true,
slopeMaxAngle: 60
}]});
object.getWidth = function() { return 10; };
object.getHeight = function() { return 20; };
runtimeScene.addObject(object);
object.setPosition(0, -30);
//Put a platformer object in a platform.
var object = new gdjs.RuntimeObject(runtimeScene, {
name: 'obj1',
type: '',
behaviors: [
{
type: 'PlatformBehavior::PlatformerObjectBehavior',
name: 'auto1',
roundCoordinates: true,
gravity: 900,
maxFallingSpeed: 1500,
acceleration: 500,
deceleration: 1500,
maxSpeed: 500,
jumpSpeed: 500,
canGrabPlatforms: true,
ignoreDefaultControls: true,
slopeMaxAngle: 60,
},
],
});
object.getWidth = function() {
return 10;
};
object.getHeight = function() {
return 20;
};
runtimeScene.addObject(object);
object.setPosition(0, -30);
//Put a platform
var platform = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: [{
type: "PlatformBehavior::PlatformBehavior",
canBeGrabbed: true,
platformType: "Platform",
}]});
platform.getWidth = function() { return 60; };
platform.getHeight = function() { return 32; };
runtimeScene.addObject(platform);
platform.setPosition(0, -10);
//Put a platform
const platform = addPlatformObject(runtimeScene);
platform.setPosition(0, -10);
// Put a jump thru, higher than the platform so that the object jump from under it
// and will land on it at the end of the jump.
var jumpthru = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: [{
type: "PlatformBehavior::PlatformBehavior",
canBeGrabbed: true,
platformType: "Jumpthru",
}]});
jumpthru.getWidth = function() { return 60; };
jumpthru.getHeight = function() { return 5; };
runtimeScene.addObject(jumpthru);
jumpthru.setPosition(0, -33);
// Put a jump thru, higher than the platform so that the object jump from under it
// and will land on it at the end of the jump.
var jumpthru = new gdjs.RuntimeObject(runtimeScene, {
name: 'obj2',
type: '',
behaviors: [
{
type: 'PlatformBehavior::PlatformBehavior',
canBeGrabbed: true,
platformType: 'Jumpthru',
},
],
});
jumpthru.getWidth = function() {
return 60;
};
jumpthru.getHeight = function() {
return 5;
};
runtimeScene.addObject(jumpthru);
jumpthru.setPosition(0, -33);
it('can jump through the jumpthru', function() {
//Check the platform stopped the platformer object.
for(var i = 0; i<5; ++i) {
runtimeScene.renderAndStep();
}
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
expect(object.getBehavior("auto1").isFalling()).to.be(false);
expect(object.getBehavior("auto1").isMoving()).to.be(false);
it('can jump through the jumpthru', function() {
//Check the platform stopped the platformer object.
for (var i = 0; i < 5; ++i) {
runtimeScene.renderAndStep();
}
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
expect(object.getBehavior('auto1').isFalling()).to.be(false);
expect(object.getBehavior('auto1').isMoving()).to.be(false);
// Check that the jump starts properly, and is not stopped on the jumpthru
object.getBehavior("auto1").simulateJumpKey();
runtimeScene.renderAndStep();
expect(object.getY()).to.be.within(-39, -38);
runtimeScene.renderAndStep();
expect(object.getY()).to.be.within(-47, -46);
runtimeScene.renderAndStep();
// At this step, the object is almost on the jumpthru (-53 + 20 (object height) = -33 (jump thru Y position)),
// but the object should not stop.
expect(object.getY()).to.be.within(-54, -53);
runtimeScene.renderAndStep();
expect(object.getY()).to.be.within(-61, -60);
runtimeScene.renderAndStep();
expect(object.getY()).to.be.within(-67, -66);
expect(object.getBehavior("auto1").isJumping()).to.be(true);
// Check that the jump starts properly, and is not stopped on the jumpthru
object.getBehavior('auto1').simulateJumpKey();
runtimeScene.renderAndStep();
expect(object.getY()).to.be.within(-39, -38);
runtimeScene.renderAndStep();
expect(object.getY()).to.be.within(-47, -46);
runtimeScene.renderAndStep();
// At this step, the object is almost on the jumpthru (-53 + 20 (object height) = -33 (jump thru Y position)),
// but the object should not stop.
expect(object.getY()).to.be.within(-54, -53);
runtimeScene.renderAndStep();
expect(object.getY()).to.be.within(-61, -60);
runtimeScene.renderAndStep();
expect(object.getY()).to.be.within(-67, -66);
expect(object.getBehavior('auto1').isJumping()).to.be(true);
// Continue the simulation and check that position is correct in the middle of the jump
for(var i = 0; i<20; ++i) {
runtimeScene.renderAndStep();
}
expect(object.getY()).to.be.within(-89, -88);
// Continue the simulation and check that position is correct in the middle of the jump
for (var i = 0; i < 20; ++i) {
runtimeScene.renderAndStep();
}
expect(object.getY()).to.be.within(-89, -88);
// Continue simulation and check that we arrive on the jumpthru
for(var i = 0; i<10; ++i) {
runtimeScene.renderAndStep();
}
expect(object.getY()).to.be.within(jumpthru.getY() - object.getHeight(), jumpthru.getY() - object.getHeight() + 1);
expect(object.getBehavior("auto1").isFalling()).to.be(false);
});
// Continue simulation and check that we arrive on the jumpthru
for (var i = 0; i < 10; ++i) {
runtimeScene.renderAndStep();
}
expect(object.getY()).to.be.within(
jumpthru.getY() - object.getHeight(),
jumpthru.getY() - object.getHeight() + 1
);
expect(object.getBehavior('auto1').isFalling()).to.be(false);
});
});
describe('gdjs.PlatformerObjectRuntimeBehavior, rounded coordinates (moving platforms)', function() {
var runtimeGame = new gdjs.RuntimeGame({variables: [], properties: {windowWidth: 800, windowHeight: 600}});
var runtimeScene = new gdjs.RuntimeScene(runtimeGame);
runtimeScene.loadFromScene({
layers: [{name: "", visibility: true}],
variables: [],
behaviorsSharedData: [],
objects: [],
instances: []
});
runtimeScene._timeManager.getElapsedTime = function() { return 1 / 60 * 1000; };
const runtimeScene = makeTestRuntimeScene();
//Put a platformer object on a platform.
var object = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [{
type: "PlatformBehavior::PlatformerObjectBehavior",
name: "auto1",
roundCoordinates: true,
gravity: 900,
maxFallingSpeed: 1500,
acceleration: 500,
deceleration: 1500,
maxSpeed: 500,
jumpSpeed: 1500,
canGrabPlatforms: true,
ignoreDefaultControls: true,
slopeMaxAngle: 60
}]});
object.getWidth = function() { return 10; };
object.getHeight = function() { return 20; };
runtimeScene.addObject(object);
object.setPosition(0, -30);
//Put a platformer object on a platform.
var object = new gdjs.RuntimeObject(runtimeScene, {
name: 'obj1',
type: '',
behaviors: [
{
type: 'PlatformBehavior::PlatformerObjectBehavior',
name: 'auto1',
roundCoordinates: true,
gravity: 900,
maxFallingSpeed: 1500,
acceleration: 500,
deceleration: 1500,
maxSpeed: 500,
jumpSpeed: 1500,
canGrabPlatforms: true,
ignoreDefaultControls: true,
slopeMaxAngle: 60,
},
],
});
object.getWidth = function() {
return 10;
};
object.getHeight = function() {
return 20;
};
runtimeScene.addObject(object);
object.setPosition(0, -30);
//Put a platform
var platform = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: [{
type: "PlatformBehavior::PlatformBehavior",
canBeGrabbed: true,
}]});
platform.getWidth = function() { return 60; };
platform.getHeight = function() { return 32; };
runtimeScene.addObject(platform);
platform.setPosition(0, -10);
//Put a platform
const platform = addPlatformObject(runtimeScene);
platform.setPosition(0, -10);
it('follows the platform', function() {
for(var i = 0; i<30; ++i) {
runtimeScene.renderAndStep();
}
it('follows the platform', function() {
for (var i = 0; i < 30; ++i) {
runtimeScene.renderAndStep();
}
// Check the object has not moved.
expect(object.getY()).to.be(-30);
expect(object.getX()).to.be(0);
expect(object.getBehavior("auto1").isOnFloor()).to.be(true);
expect(object.getBehavior("auto1").isFalling()).to.be(false);
expect(object.getBehavior("auto1").isMoving()).to.be(false);
// Check the object has not moved.
expect(object.getY()).to.be(-30);
expect(object.getX()).to.be(0);
expect(object.getBehavior('auto1').isOnFloor()).to.be(true);
expect(object.getBehavior('auto1').isFalling()).to.be(false);
expect(object.getBehavior('auto1').isMoving()).to.be(false);
// Check that the object follow the platform, even if the
// movement is less than one pixel.
platform.setX(platform.getX()+0.12);
runtimeScene.renderAndStep();
platform.setX(platform.getX()+0.12);
runtimeScene.renderAndStep();
platform.setX(platform.getX()+0.12);
runtimeScene.renderAndStep();
// Check that the object follow the platform, even if the
// movement is less than one pixel.
platform.setX(platform.getX() + 0.12);
runtimeScene.renderAndStep();
platform.setX(platform.getX() + 0.12);
runtimeScene.renderAndStep();
platform.setX(platform.getX() + 0.12);
runtimeScene.renderAndStep();
expect(object.getX()).to.be(0.36);
});
expect(object.getX()).to.be(0.36);
});
});

View File

@@ -42,6 +42,21 @@ void DeclareSystemInfoExtension(gd::PlatformExtension& extension) {
.AddCodeOnlyParameter("currentScene", "")
.SetFunctionName("SystemInfo::IsWebGLSupported")
.SetIncludeFile("SystemInfo/SystemInfoTools.h");
extension
.AddCondition(
"IsPreview",
_("Is the game running as a preview"),
_(
"Check if the game is currently being previewed in the editor. "
"This can be used to enable a \"Debug mode\" or do some work only in previews."
),
_("The game is being previewed in the editor"),
_("System information"),
"CppPlatform/Extensions/systeminfoicon24.png",
"CppPlatform/Extensions/systeminfoicon16.png")
.AddCodeOnlyParameter("currentScene", "");
#endif
}

View File

@@ -31,6 +31,10 @@ class SystemInfoJsExtension : public gd::PlatformExtension {
.codeExtraInformation
.SetIncludeFile("Extensions/SystemInfo/systeminfotools.js")
.SetFunctionName("gdjs.evtTools.systemInfo.isWebGLSupported");
GetAllConditions()["SystemInfo::IsPreview"]
.codeExtraInformation
.SetIncludeFile("Extensions/SystemInfo/systeminfotools.js")
.SetFunctionName("gdjs.evtTools.systemInfo.isPreview");
StripUnimplementedInstructionsAndExpressions();
GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION();

View File

@@ -36,4 +36,13 @@ gdjs.evtTools.systemInfo.isMobile = function() {
*/
gdjs.evtTools.systemInfo.isWebGLSupported = function(runtimeScene) {
return runtimeScene.getGame().getRenderer().isWebGLSupported();
};
};
/**
* Check if the game is running as a preview, launched from an editor.
* @param {gdjs.RuntimeScene} runtimeScene The current scene.
* @returns {boolean} true if the game is running as a preview.
*/
gdjs.evtTools.systemInfo.isPreview = function(runtimeScene) {
return runtimeScene.getGame().isPreview();
};

View File

@@ -10,203 +10,253 @@ Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com)
* @class TopDownMovementRuntimeBehavior
* @constructor
*/
gdjs.TopDownMovementRuntimeBehavior = function(runtimeScene, behaviorData, owner)
{
gdjs.RuntimeBehavior.call(this, runtimeScene, behaviorData, owner);
gdjs.TopDownMovementRuntimeBehavior = function(
runtimeScene,
behaviorData,
owner
) {
gdjs.RuntimeBehavior.call(this, runtimeScene, behaviorData, owner);
//Behavior configuration:
this._allowDiagonals = behaviorData.allowDiagonals;
this._acceleration = behaviorData.acceleration;
this._deceleration = behaviorData.deceleration;
this._maxSpeed = behaviorData.maxSpeed;
this._angularMaxSpeed = behaviorData.angularMaxSpeed;
this._rotateObject = behaviorData.rotateObject;
this._angleOffset = behaviorData.angleOffset;
this._ignoreDefaultControls = behaviorData.ignoreDefaultControls;
this._angle = 0; // The latest angle of movement, in degrees.
//Behavior configuration:
this._allowDiagonals = behaviorData.allowDiagonals;
this._acceleration = behaviorData.acceleration;
this._deceleration = behaviorData.deceleration;
this._maxSpeed = behaviorData.maxSpeed;
this._angularMaxSpeed = behaviorData.angularMaxSpeed;
this._rotateObject = behaviorData.rotateObject;
this._angleOffset = behaviorData.angleOffset;
this._ignoreDefaultControls = behaviorData.ignoreDefaultControls;
this._angle = 0; // The latest angle of movement, in degrees.
//Attributes used when moving
this._xVelocity = 0;
this._yVelocity = 0;
this._angularSpeed = 0;
this._leftKey = false;
this._rightKey = false;
this._upKey = false;
this._downKey = false;
//Attributes used when moving
this._xVelocity = 0;
this._yVelocity = 0;
this._angularSpeed = 0;
this._leftKey = false;
this._rightKey = false;
this._upKey = false;
this._downKey = false;
};
gdjs.TopDownMovementRuntimeBehavior.prototype = Object.create( gdjs.RuntimeBehavior.prototype );
gdjs.registerBehavior("TopDownMovementBehavior::TopDownMovementBehavior", gdjs.TopDownMovementRuntimeBehavior);
gdjs.TopDownMovementRuntimeBehavior.prototype = Object.create(
gdjs.RuntimeBehavior.prototype
);
gdjs.registerBehavior(
'TopDownMovementBehavior::TopDownMovementBehavior',
gdjs.TopDownMovementRuntimeBehavior
);
gdjs.TopDownMovementRuntimeBehavior.prototype.setAcceleration = function(acceleration) {
this._acceleration = acceleration;
gdjs.TopDownMovementRuntimeBehavior.prototype.setAcceleration = function(
acceleration
) {
this._acceleration = acceleration;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.getAcceleration = function() {
return this._acceleration;
return this._acceleration;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.setDeceleration = function(deceleration) {
this._deceleration = deceleration;
gdjs.TopDownMovementRuntimeBehavior.prototype.setDeceleration = function(
deceleration
) {
this._deceleration = deceleration;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.getDeceleration = function() {
return this._deceleration;
return this._deceleration;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.setMaxSpeed = function(maxSpeed) {
this._maxSpeed = maxSpeed;
this._maxSpeed = maxSpeed;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.getMaxSpeed = function() {
return this._maxSpeed;
return this._maxSpeed;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.setAngularMaxSpeed = function(angularMaxSpeed) {
this._angularMaxSpeed = angularMaxSpeed;
gdjs.TopDownMovementRuntimeBehavior.prototype.setAngularMaxSpeed = function(
angularMaxSpeed
) {
this._angularMaxSpeed = angularMaxSpeed;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.getAngularMaxSpeed = function() {
return this._angularMaxSpeed;
return this._angularMaxSpeed;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.setAngleOffset = function(angleOffset) {
this._angleOffset = angleOffset;
gdjs.TopDownMovementRuntimeBehavior.prototype.setAngleOffset = function(
angleOffset
) {
this._angleOffset = angleOffset;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.getAngleOffset = function() {
return this._angleOffset;
return this._angleOffset;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.allowDiagonals = function(allow) {
this._allowDiagonals = allow;
this._allowDiagonals = allow;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.diagonalsAllowed = function() {
return this._allowDiagonals;
return this._allowDiagonals;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.setRotateObject = function(allow) {
this._rotateObject = allow;
gdjs.TopDownMovementRuntimeBehavior.prototype.setRotateObject = function(
allow
) {
this._rotateObject = allow;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.isObjectRotated = function() {
return this._rotateObject;
return this._rotateObject;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.isMoving = function() {
return this._xVelocity !== 0 || this._yVelocity !== 0;
return this._xVelocity !== 0 || this._yVelocity !== 0;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.getSpeed = function() {
return Math.sqrt(this._xVelocity*this._xVelocity+this._yVelocity*this._yVelocity);
return Math.sqrt(
this._xVelocity * this._xVelocity + this._yVelocity * this._yVelocity
);
};
gdjs.TopDownMovementRuntimeBehavior.prototype.getXVelocity = function() {
return this._xVelocity;
return this._xVelocity;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.getYVelocity = function() {
return this._yVelocity;
return this._yVelocity;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.getAngle = function() {
return this._angle;
return this._angle;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.doStepPreEvents = function(runtimeScene)
{
var LEFTKEY = 37;
var UPKEY = 38;
var RIGHTKEY = 39;
var DOWNKEY = 40;
var SHIFTKEY = 16;
var object = this.owner;
var timeDelta = this.owner.getElapsedTime(runtimeScene)/1000;
gdjs.TopDownMovementRuntimeBehavior.prototype.doStepPreEvents = function(
runtimeScene
) {
var LEFTKEY = 37;
var UPKEY = 38;
var RIGHTKEY = 39;
var DOWNKEY = 40;
var object = this.owner;
var timeDelta = this.owner.getElapsedTime(runtimeScene) / 1000;
//Get the player input:
this._leftKey |= !this._ignoreDefaultControls && runtimeScene.getGame().getInputManager().isKeyPressed(LEFTKEY);
this._rightKey |= !this._ignoreDefaultControls && runtimeScene.getGame().getInputManager().isKeyPressed(RIGHTKEY);
this._downKey |= !this._ignoreDefaultControls && runtimeScene.getGame().getInputManager().isKeyPressed(DOWNKEY);
this._upKey |= !this._ignoreDefaultControls && runtimeScene.getGame().getInputManager().isKeyPressed(UPKEY);
//Get the player input:
this._leftKey |=
!this._ignoreDefaultControls &&
runtimeScene
.getGame()
.getInputManager()
.isKeyPressed(LEFTKEY);
this._rightKey |=
!this._ignoreDefaultControls &&
runtimeScene
.getGame()
.getInputManager()
.isKeyPressed(RIGHTKEY);
this._downKey |=
!this._ignoreDefaultControls &&
runtimeScene
.getGame()
.getInputManager()
.isKeyPressed(DOWNKEY);
this._upKey |=
!this._ignoreDefaultControls &&
runtimeScene
.getGame()
.getInputManager()
.isKeyPressed(UPKEY);
var direction = -1;
var directionInRad = 0;
var directionInDeg = 0;
if (!this._allowDiagonals) {
if (this._upKey && !this._downKey) direction = 6;
else if (!this._upKey && this._downKey) direction = 2;
var direction = -1;
var directionInRad = 0;
var directionInDeg = 0;
if (!this._allowDiagonals) {
if (this._upKey && !this._downKey) direction = 6;
else if (!this._upKey && this._downKey) direction = 2;
if (!this._upKey && !this._downKey) {
if (this._leftKey && !this._rightKey) direction = 4;
else if (!this._leftKey && this._rightKey) direction = 0;
}
if (!this._upKey && !this._downKey) {
if (this._leftKey && !this._rightKey) direction = 4;
else if (!this._leftKey && this._rightKey) direction = 0;
}
} else {
if (this._upKey && !this._downKey) {
if (this._leftKey && !this._rightKey) direction = 5;
else if (!this._leftKey && this._rightKey) direction = 7;
else direction = 6;
} else if (!this._upKey && this._downKey) {
if (this._leftKey && !this._rightKey) direction = 3;
else if (!this._leftKey && this._rightKey) direction = 1;
else direction = 2;
} else {
if (this._upKey && !this._downKey) {
if (this._leftKey && !this._rightKey) direction = 5;
else if (!this._leftKey && this._rightKey) direction = 7;
else direction = 6;
} else if (!this._upKey && this._downKey) {
if (this._leftKey && !this._rightKey) direction = 3;
else if (!this._leftKey && this._rightKey) direction = 1;
else direction = 2;
} else {
if (this._leftKey && !this._rightKey) direction = 4;
else if (!this._leftKey && this._rightKey) direction = 0;
}
if (this._leftKey && !this._rightKey) direction = 4;
else if (!this._leftKey && this._rightKey) direction = 0;
}
}
//Update the speed of the object
if (direction != -1) {
directionInRad = direction*Math.PI/4.0;
directionInDeg = direction*45;
//Update the speed of the object
if (direction != -1) {
directionInRad = (direction * Math.PI) / 4.0;
directionInDeg = direction * 45;
this._xVelocity += this._acceleration*timeDelta*Math.cos(directionInRad);
this._yVelocity += this._acceleration*timeDelta*Math.sin(directionInRad);
} else {
directionInRad = Math.atan2(this._yVelocity, this._xVelocity);
directionInDeg = Math.atan2(this._yVelocity, this._xVelocity)*180.0/Math.PI;
this._xVelocity +=
this._acceleration * timeDelta * Math.cos(directionInRad);
this._yVelocity +=
this._acceleration * timeDelta * Math.sin(directionInRad);
} else {
directionInRad = Math.atan2(this._yVelocity, this._xVelocity);
directionInDeg =
(Math.atan2(this._yVelocity, this._xVelocity) * 180.0) / Math.PI;
var xVelocityWasPositive = this._xVelocity >= 0;
var yVelocityWasPositive = this._yVelocity >= 0;
this._xVelocity -= this._deceleration*timeDelta*Math.cos(directionInRad);
this._yVelocity -= this._deceleration*timeDelta*Math.sin(directionInRad);
if ( this._xVelocity > 0 ^ xVelocityWasPositive ) this._xVelocity = 0;
if ( this._yVelocity > 0 ^ yVelocityWasPositive ) this._yVelocity = 0;
var xVelocityWasPositive = this._xVelocity >= 0;
var yVelocityWasPositive = this._yVelocity >= 0;
this._xVelocity -=
this._deceleration * timeDelta * Math.cos(directionInRad);
this._yVelocity -=
this._deceleration * timeDelta * Math.sin(directionInRad);
if ((this._xVelocity > 0) ^ xVelocityWasPositive) this._xVelocity = 0;
if ((this._yVelocity > 0) ^ yVelocityWasPositive) this._yVelocity = 0;
}
var speed = Math.sqrt(
this._xVelocity * this._xVelocity + this._yVelocity * this._yVelocity
);
if (speed > this._maxSpeed) {
this._xVelocity = this._maxSpeed * Math.cos(directionInRad);
this._yVelocity = this._maxSpeed * Math.sin(directionInRad);
}
this._angularSpeed = this._angularMaxSpeed; //No acceleration for angular speed for now
//Position object
object.setX(object.getX() + this._xVelocity * timeDelta);
object.setY(object.getY() + this._yVelocity * timeDelta);
//Also update angle if needed
if (this._xVelocity !== 0 || this._yVelocity !== 0) {
this._angle = directionInDeg;
if (this._rotateObject) {
object.rotateTowardAngle(
directionInDeg + this._angleOffset,
this._angularSpeed,
runtimeScene
);
}
}
var speed = Math.sqrt(this._xVelocity*this._xVelocity+this._yVelocity*this._yVelocity);
if ( speed > this._maxSpeed ) {
this._xVelocity = this._maxSpeed*Math.cos(directionInRad);
this._yVelocity = this._maxSpeed*Math.sin(directionInRad);
}
this._angularSpeed = this._angularMaxSpeed; //No acceleration for angular speed for now
//Position object
object.setX(object.getX()+this._xVelocity*timeDelta);
object.setY(object.getY()+this._yVelocity*timeDelta);
//Also update angle if needed
if ( (this._xVelocity !== 0 || this._yVelocity !== 0) ) {
this._angle = directionInDeg;
if (this._rotateObject) {
object.rotateTowardAngle(directionInDeg+this._angleOffset, this._angularSpeed, runtimeScene);
}
}
this._leftKey = false;
this._rightKey = false;
this._upKey = false;
this._downKey = false;
this._leftKey = false;
this._rightKey = false;
this._upKey = false;
this._downKey = false;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.simulateControl = function(input) {
if ( input === "Left" ) this._leftKey = true;
else if ( input === "Right" ) this._rightKey = true;
else if ( input === "Up" ) this._upKey = true;
else if ( input === "Down" ) this._downKey = true;
gdjs.TopDownMovementRuntimeBehavior.prototype.simulateControl = function(
input
) {
if (input === 'Left') this._leftKey = true;
else if (input === 'Right') this._rightKey = true;
else if (input === 'Up') this._upKey = true;
else if (input === 'Down') this._downKey = true;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.ignoreDefaultControls = function(ignore)
{
this._ignoreDefaultControls = ignore;
gdjs.TopDownMovementRuntimeBehavior.prototype.ignoreDefaultControls = function(
ignore
) {
this._ignoreDefaultControls = ignore;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.simulateLeftKey = function()
{
this._leftKey = true;
gdjs.TopDownMovementRuntimeBehavior.prototype.simulateLeftKey = function() {
this._leftKey = true;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.simulateRightKey = function()
{
this._rightKey = true;
gdjs.TopDownMovementRuntimeBehavior.prototype.simulateRightKey = function() {
this._rightKey = true;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.simulateUpKey = function()
{
this._upKey = true;
gdjs.TopDownMovementRuntimeBehavior.prototype.simulateUpKey = function() {
this._upKey = true;
};
gdjs.TopDownMovementRuntimeBehavior.prototype.simulateDownKey = function()
{
this._downKey = true;
gdjs.TopDownMovementRuntimeBehavior.prototype.simulateDownKey = function() {
this._downKey = true;
};

File diff suppressed because one or more lines are too long

View File

@@ -180,22 +180,20 @@ module.exports = {
.getCodeExtraInformation()
.setFunctionName("mute");
object
object
.addAction(
"SetTime",
_("Set time"),
_("Set the time of the video object in seconds"),
_("Set time of _PARAM0_: _PARAM1__PARAM2_ seconds"),
_("the time"),
"",
"JsPlatform/Extensions/videoicon24.png",
"JsPlatform/Extensions/videoicon16.png"
)
.addParameter("object", _("Video object"), "VideoObject", false)
.addParameter("operator", _("Modification's sign"), "", false)
.addParameter("expression", _("Time in seconds"), "", false)
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName("setCurrentTime")
.setManipulatedType("number")
.setGetter("getCurrentTime");
object
@@ -211,11 +209,9 @@ module.exports = {
"JsPlatform/Extensions/videoicon16.png"
)
.addParameter("object", _("Video object"), "VideoObject", false)
.addParameter("operator", _("Modification's sign"), "", false)
.addParameter("expression", _("Value"), "", false)
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName("setVolume")
.setManipulatedType("number")
.setGetter("getVolume");
object
@@ -384,11 +380,9 @@ module.exports = {
"JsPlatform/Extensions/videoicon16.png"
)
.addParameter("object", _("Video object"), "VideoObject", false)
.addParameter("operator", _("Modification's sign"), "", false)
.addParameter("expression", _("Opacity (0-255)"), "", false)
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName("setOpacity")
.setManipulatedType("number")
.setGetter("getOpacity");
object
@@ -431,11 +425,9 @@ module.exports = {
"JsPlatform/Extensions/videoicon16.png"
)
.addParameter("object", _("Video object"), "VideoObject", false)
.addParameter("operator", _("Modification's sign"), "", false)
.addParameter("expression", _("Speed "), "", false)
.useStandardOperatorParameters("number")
.getCodeExtraInformation()
.setFunctionName("setPlaybackSpeed")
.setManipulatedType("number")
.setGetter("getPlaybackSpeed");
object

View File

@@ -186,6 +186,9 @@ BaseObjectExtension::BaseObjectExtension() {
GetAllConditions()["RaycastToPosition"]
.SetFunctionName("RaycastObjectToPosition")
.SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h");
GetAllConditions()["SourisSurObjet"]
.SetFunctionName("CursorOnObject")
.SetIncludeFile("GDCpp/Extensions/Builtin/ObjectTools.h");
GetAllExpressions()["Count"]
.SetFunctionName("PickedObjectsCount")

View File

@@ -48,17 +48,13 @@ MouseExtension::MouseExtension() {
GetAllConditions()["MouseButtonReleased"]
.SetFunctionName("MouseButtonReleased")
.SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h");
GetAllConditions()["IsMouseWheelScrollingUp"]
GetAllConditions()["IsMouseWheelScrollingUp"]
.SetFunctionName("IsMouseWheelScrollingUp")
.SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h");
GetAllConditions()["IsMouseWheelScrollingDown"]
GetAllConditions()["IsMouseWheelScrollingDown"]
.SetFunctionName("IsMouseWheelScrollingDown")
.SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h");
GetAllConditions()["SourisSurObjet"]
.SetFunctionName("CursorOnObject")
.SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h");
GetAllExpressions()["MouseX"]
.SetFunctionName("GetCursorXPosition")
.SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h");

View File

@@ -1,7 +1,6 @@
#include "GDCpp/Extensions/Builtin/MouseTools.h"
#include <SFML/Graphics.hpp>
#include "GDCpp/Runtime/RuntimeLayer.h"
#include "GDCpp/Runtime/RuntimeObjectsListsTools.h"
#include "GDCpp/Runtime/RuntimeScene.h"
void GD_API CenterCursor(RuntimeScene &scene) {
@@ -83,14 +82,3 @@ bool GD_API IsMouseWheelScrollingUp(RuntimeScene &scene) {
bool GD_API IsMouseWheelScrollingDown(RuntimeScene &scene) {
return scene.GetInputManager().IsScrollingDown();
}
bool GD_API CursorOnObject(
std::map<gd::String, std::vector<RuntimeObject *> *> objectsLists,
RuntimeScene &scene,
bool precise,
bool conditionInverted) {
return PickObjectsIf(
objectsLists, conditionInverted, [&scene, precise](RuntimeObject *obj) {
return obj->CursorOnObject(scene, precise);
});
}

View File

@@ -26,10 +26,5 @@ bool GD_API MouseButtonReleased(RuntimeScene &scene, const gd::String &key);
int GD_API GetMouseWheelDelta(RuntimeScene &scene);
bool GD_API IsMouseWheelScrollingUp(RuntimeScene &scene);
bool GD_API IsMouseWheelScrollingDown(RuntimeScene &scene);
bool GD_API CursorOnObject(
std::map<gd::String, std::vector<RuntimeObject *> *> objectsLists,
RuntimeScene &scene,
bool precise,
bool conditionInverted);
#endif // MOUSETOOLS_H

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