Compare commits

...

280 Commits

Author SHA1 Message Date
Florian Rival
05d2019f80 Add support for passing a behavior as parameter in an expression 2019-05-20 23:50:06 +01:00
Florian Rival
049483dbbd Fix support for calling behavior methods from other behavior methods 2019-05-20 23:36:13 +01:00
Florian Rival
b8270eb55e Fix typo 2019-05-19 23:28:37 +01:00
Florian Rival
e737ab2443 Merge pull request #1049 from 4ian/feature/runtime-behavior
Events based behaviors 🚀
2019-05-19 23:20:58 +01:00
Florian Rival
7fe3fa1c6f Fix search/tags in ExtensionsSearch 2019-05-19 22:19:58 +01:00
Florian Rival
8d0ba97fbf Add author to EventsFunctionsExtension 2019-05-19 22:13:17 +01:00
Florian Rival
0be7ee859a Fix SetReturnString argument type 2019-05-19 16:51:55 +01:00
Florian Rival
eeeafff2b2 Add tags in ExtensionsSearch 2019-05-18 17:15:37 +01:00
Florian Rival
2bccc31cbb Remove useless TODO 2019-05-18 16:17:45 +01:00
Florian Rival
60bb4ad69f Remove warnings from .vscode/c_cpp_properties.json (2) 2019-05-18 16:08:32 +01:00
Florian Rival
fdfe7b35f6 Allow to replace an extension when importing one 2019-05-18 16:08:00 +01:00
Florian Rival
457940ab04 Add import/export to file for events functions extensions 2019-05-18 15:31:50 +01:00
Florian Rival
c9a90b2b77 Add support for short description and tags in EventsFunctionsExtension 2019-05-18 12:05:21 +01:00
Florian Rival
4e23c46ca1 Remove warnings from .vscode/c_cpp_properties.json 2019-05-18 00:58:28 +01:00
Florian Rival
a98575133f Add button to explain how to create new behaviors 2019-05-18 00:58:04 +01:00
Florian Rival
b7e85078d1 Remove some TODOs and add messages if too much extensions to display 2019-05-18 00:47:46 +01:00
Florian Rival
1494a474f1 Add button to search extensions in ProjectManager 2019-05-17 19:49:11 +01:00
Florian Rival
c7ba85ce03 Display extension full header in ExtensionInstallDialog and handle errors 2019-05-17 19:16:39 +01:00
Florian Rival
327be156f3 Rework EventsFunctionsExtensionsLoader to use context 2019-05-17 08:54:14 +01:00
Florian Rival
2d850b0798 [WIP] Add ExtensionsSearch to NewBehaviorDialog 2019-05-16 21:03:51 +01:00
Florian Rival
7d144f19c0 Add missing translation tags 2019-05-15 21:33:13 +01:00
Florian Rival
6496095d7c Add help links for events based behaviors 2019-05-15 21:31:54 +01:00
Florian Rival
1778aa1bc3 Add copy/cut/paste for events functions 2019-05-12 23:35:15 +01:00
Florian Rival
7769c02a86 Fix flow 2019-05-10 16:15:06 +01:00
Florian Rival
a97486b92b Remove CopyOf prefix when pasting things in ProjectManager 2019-05-10 16:08:38 +01:00
Florian Rival
6315857651 Fix copy/cut/paste for Events Functions/Behaviors Extensions 2019-05-10 16:02:29 +01:00
Florian Rival
99238a099d Only allow changing behavior's object type if actually possible 2019-05-10 15:49:27 +01:00
Florian Rival
58db3beaf8 Add more tests for WholeProjectRefactorer 2019-05-10 14:05:04 +01:00
Florian Rival
ccb18a0da4 Fix opening of behavior function from events sheet and prevent using reserved names 2019-05-10 12:49:54 +01:00
Florian Rival
89ac323c8e Add support for automatic refactoring when events function (including expressions) is renamed 2019-05-10 11:37:33 +01:00
Florian Rival
3073b9f44d Fix typos 2019-05-09 11:25:40 +01:00
Florian Rival
32dd269d18 Add automatic refactoring of project when an events based behavior is renamed 2019-05-08 16:05:03 +01:00
Florian Rival
b96fda0f8c Run Prettier 2019-05-08 10:47:57 +01:00
Florian Rival
4b85f23969 Prepare the new refactorings in WholeProjectRefactorer for behaviors 2019-05-08 00:20:02 +01:00
Florian Rival
e670563c92 Add tests for WholeProjectRefactorer and events based functions/extensions 2019-05-07 18:11:52 +01:00
Florian Rival
1e9dab2117 Fix Behavior field not automatically filling when editing expressions 2019-05-07 14:32:04 +01:00
Florian Rival
aac867f960 Set default minimum FPS to 20 2019-05-07 13:56:08 +01:00
Florian Rival
9e89f51a59 Ensure behavior type is displayed in selector even if unknown 2019-05-07 12:28:04 +01:00
Florian Rival
2d31e910fa Add support for EventsBasedBehavior object type 2019-05-07 00:46:45 +01:00
Florian Rival
6332230c4c Add basic test game for EventsBasedBehavior 2019-05-06 23:32:37 +01:00
Florian Rival
3161f641d8 Rename ownerRemovedFromScene to onOwnerRemovedFromScene 2019-05-06 23:08:41 +01:00
Florian Rival
6dba9d9031 Improve EventsBasedBehavior edition in IDE 2019-05-06 22:51:50 +01:00
Florian Rival
433dc763d1 Separate Behavior into BehaviorContent and Behavior, and add RuntimeBehavior for GDCpp 2019-05-03 22:47:21 +01:00
Wend1go
99416e93cc Fix the display of two parameters in FileSystem extension (#1046) 2019-05-02 10:35:37 +01:00
Florian Rival
68e01e253e Bump newIDE version 2019-05-01 17:49:48 +01:00
Florian Rival
b764fbbde7 Use checksum to verify if a third party editor needs update.
Also a protection against potential tampering of third party editors.
2019-05-01 13:53:59 +01:00
Florian Rival
73121d5d53 [WIP] Add code generation for EventsBasedBehavior (2) 2019-04-29 21:48:28 +01:00
Florian Rival
0a14872660 Bump newIDE version 2019-04-29 20:46:39 +01:00
Florian Rival
78834cbbfc Update translations 2019-04-29 20:43:05 +01:00
Florian Rival
7b69d41857 Remove useless GetCustomCodeInMain and related methods 2019-04-29 11:56:02 +01:00
Florian Rival
668bd6a983 Fix action to set the string returned by an events function (SetReturnString) 2019-04-29 11:25:27 +01:00
Florian Rival
2353815fdf [WIP] Add code generation for EventsBasedBehavior 2019-04-26 17:49:06 +01:00
Florian Rival
9bbc5e426c [WIP] Add support for EventsBasedBehavior in newIDE 2019-04-26 14:12:59 +01:00
Florian Rival
7925e75652 [WIP] Add EventsBasedBehavior 2019-04-26 14:12:59 +01:00
Florian Rival
13bc2a5cd8 Remove more dead code 2019-04-26 14:12:59 +01:00
Florian Rival
bf8d1a6a28 Remove dead code from gd::Layout 2019-04-26 14:12:59 +01:00
Florian Rival
338f062781 Refactor EventsFunctionsExtension to use EventsFunctionsContainer/SerializableWithNameList 2019-04-26 14:12:59 +01:00
Florian Rival
2cf2622b9e Fix crash at save (missing functions after integrating GDevelop.js in the repository) 2019-04-26 14:12:23 +01:00
Florian Rival
6d92430e76 Fix size of the game window when exported with Electron 2019-04-25 09:44:50 +01:00
Florian Rival
9b5a6d8bf0 Try more previous revision to find a pre-built libGD.js 2019-04-24 21:35:33 +01:00
Florian Rival
90c3f4f72b Avoid useless copy of arrays in ForEach event generated code
Lists of objects were wrongly initialized, creating a useless performance hit. All the objects of the "for each" were copied into arrays, before being emptied. And this, for every single object in the for each loop. This was particularly bad when a lot of objects were picked by the for each (if we have N objects, complexity was N*N copies of the array).
2019-04-24 21:23:16 +01:00
Florian Rival
c3794950ab Rename methods to declare list of objects without picking from scene, for consistency 2019-04-24 21:23:16 +01:00
Florian Rival
e7516baa0b Update bug report template to mention web-app 2019-04-24 19:29:28 +01:00
Florian Rival
88366b3362 Add margin around the full width InstructionEditorDialog 2019-04-23 22:47:13 +01:00
Florian Rival
dd93cecbcf Fix Events Sheet shortcuts 2019-04-23 21:53:35 +01:00
Florian Rival
359159b402 Remove VSCode flow workaround, as not needed anymore 2019-04-23 20:33:06 +01:00
Florian Rival
14b30677db Update README 2019-04-23 18:26:21 +01:00
Florian Rival
9f3dd50f99 Robustify import-libGD.js: allow to download a previous version of libGD.js if necessary 2019-04-23 18:00:54 +01:00
Florian Rival
1503b8eabd Update import-libGD.js error wording 2019-04-23 17:21:05 +01:00
Florian Rival
f3a86e93fd Don't error if libGD.js can't be downloaded, but a local one exists
This will happen when developers create commits on top of master
2019-04-23 17:19:12 +01:00
Florian Rival
c4b20ea7a4 Fix order for installation on Travis-CI
Install newIDE before building GDevelop.js will result in not finding any libGD.js for newIDE
2019-04-23 17:12:40 +01:00
Florian Rival
abf9321ed0 Update import-libGD.js to use an automatically built version 2019-04-23 17:08:30 +01:00
Florian Rival
ce9df3b57b Add back flags for C++11 2019-04-23 16:42:19 +01:00
Florian Rival
680c42c113 Remove check for C++11 compiler - assume compilers are now new enough to support it 2019-04-23 16:09:15 +01:00
Florian Rival
a648248680 Change output path of the Travis artifacts 2019-04-23 16:09:15 +01:00
Florian Rival
1693d863d3 Integrate GDevelop.js (emscripten bindings of Core/Extensions to JS) inside the repository 2019-04-23 16:09:15 +01:00
Florian Rival
ccc29ef416 Merge pull request #1034 from 4ian/refactor/remove-ide
Remove old IDE from GDevelop 5 codebase
2019-04-23 14:43:35 +01:00
Florian Rival
b9680e26e7 [WIP] Remove almost all remaining references to wxWidgets/GD4 IDE related code from codebase 2019-04-23 13:08:22 +01:00
Florian Rival
d444ed7e39 [WIP] Clean more old methods used only in GD4 2019-04-22 20:57:59 +01:00
Todor Imreorov
bb94cb2200 Add "Insert a New Object" to the Scene Editor context menu (#1025)
Visible when no instance selected
2019-04-22 15:01:27 +01:00
Florian Rival
eaf9494f91 [WIP] Remove deprecated network action 2019-04-22 14:57:28 +01:00
Florian Rival
d7abf86050 Fix preview crash with Firefox 2019-04-22 11:33:50 +01:00
Florian Rival
e8f4cfda85 Bump newIDE version 2019-04-22 00:34:48 +01:00
Florian Rival
e85c7dce01 Fix regression: slow opening of very large games 2019-04-21 22:58:24 +01:00
Florian Rival
87adc2cab9 [WIP] Clean old methods used only in GD4 in objects and behaviors (3) 2019-04-21 20:52:48 +01:00
Florian Rival
d59f40ff5d [WIP] Clean old methods used only in GD4 in objects and behaviors (2) 2019-04-21 19:40:05 +01:00
Florian Rival
edd98d8bd5 [WIP] Clean old methods used only in GD4 in objects and behaviors 2019-04-21 10:20:32 +01:00
Florian Rival
a8a6f2dfe9 Update translations 2019-04-21 00:01:36 +01:00
Florian Rival
73d9604107 [WIP] Remove all GDevelop 4 extensions not used in GDevelop 5 2019-04-20 23:29:59 +01:00
Florian Rival
04267acabc Add example video to BrowserResourceSources 2019-04-20 22:46:35 +01:00
Florian Rival
20e90e699c Add video-player example 2019-04-20 21:55:43 +01:00
Florian Rival
7f0033989a [WIP] Partially clean GDJS/GDCpp/GDCore of wxWidgets related code 2019-04-20 01:21:28 +01:00
Florian Rival
1de33312f3 Fix crash when using resource editor on web-app 2019-04-19 17:44:44 +01:00
Florian Rival
d1c6347f3d Add warning/information about using the Video object in the editor 2019-04-18 16:42:36 +01:00
Todor Imreorov
0ba44a4620 Add tooltips in Instances editor (#1023) 2019-04-17 17:43:28 +01:00
Florian Rival
db753e75cc Add empty renderer for VideoRuntimeObject for Cocos2D-JS 2019-04-17 09:46:25 +01:00
Bouh
db93a25b33 Add experimental Video extension (#951)
See remaining items here: https://github.com/4ian/GDevelop/pull/951#issuecomment-483974639
2019-04-17 08:43:30 +01:00
Florian Rival
1940b0cccd [WIP] Remove old IDE 2019-04-16 17:05:25 +01:00
Florian Rival
b101549c5b Add support for saving projects as multiple files (Folder Project) 2019-04-15 23:21:12 +01:00
Florian Rival
fefd862fbd Fix regression when launching external layout preview 2019-04-15 23:11:56 +01:00
Todor Imreorov
6333df011a Autosave projects when a preview is launched (#1015)
* Ask the user if they want to restore the autosave when opening a project with a recent autosave.
2019-04-14 17:46:15 +01:00
Florian Rival
d127cefdfb Fix Prettier 2019-04-13 16:02:11 +01:00
Florian Rival
5e325af153 Add help button in EventsFunctionExtractorDialog 2019-04-13 15:28:10 +01:00
Florian Rival
f57907c3d3 Update libGD.js version number 2019-04-13 10:10:24 +02:00
Florian Rival
64b59fd204 Fix some spacing 2019-04-13 10:09:43 +02:00
Florian Rival
ee53a59d69 Remove useless prop 2019-04-13 10:09:43 +02:00
Florian Rival
bf632c4c62 Add explanation about behavior arguments that differ from the behavior parameter name 2019-04-13 10:09:43 +02:00
Florian Rival
5add209ccf Improve naming in EventsContextAnalyzer 2019-04-13 10:09:43 +02:00
Florian Rival
480fc0dd4e Fix display of lists in EventsFunctionConfigurationEditor 2019-04-13 10:09:43 +02:00
Florian Rival
d9b22112c0 Add test for EventsFunctionExtractor 2019-04-13 10:09:43 +02:00
Florian Rival
9c4c2135d9 Add ScrollView 2019-04-13 10:09:43 +02:00
Florian Rival
1fca0e29ff Improve events function performance when querying objects 2019-04-13 10:09:43 +02:00
Florian Rival
b313b12004 Improve group support in EventsFunctionExtractor
Only expand groups into objects if the events are referencing one of these objects.
2019-04-13 10:09:43 +02:00
Florian Rival
37a3cf96b4 Add support for groups with behaviors in EventsFunctionExtractor 2019-04-13 10:09:43 +02:00
Florian Rival
59c2167f55 Add support for groups in EventsFunction 2019-04-13 10:09:43 +02:00
Florian Rival
42cbe3534f Add support for behaviors in EventsFunctionExtractor 2019-04-13 10:09:43 +02:00
Florian Rival
0a8ba7b838 Add EventsFunctionExtractor
No support for now for behaviors
2019-04-13 10:09:43 +02:00
Todor Imreorov
4e00dcf5ec Fix unzipper failing to extract external editors on Windows (#1018)
* Normalize paths
2019-04-10 09:44:00 +01:00
Todor Imreorov
098ec4941e Show resource name when hovering thumbnail (#1017) 2019-04-09 21:01:39 +01:00
Florian Rival
0b3b6f1b94 Robustify Clipboard handling 2019-04-07 20:28:16 +01:00
Todor Imreorov
9a64092244 Add variable/object thumbnail icons in the event sheet (#936) 2019-04-07 17:14:58 +01:00
Florian Rival
bc4fee0121 Remove preference to use the old expression parser 2019-04-07 16:38:33 +01:00
Florian Rival
b5e5db7755 Fix Flow 2019-04-07 16:37:10 +01:00
Florian Rival
c172d52116 Add alerts when entering dangerous values for minimum/maximum FPS values 2019-04-07 16:16:16 +01:00
Florian Rival
b7b94a18fb Add supporting for capping the maximum number of FPS, with safety margin 2019-04-07 16:06:05 +01:00
Wend1go
62858bbb68 Remove local paths in Pairs example (#1006) 2019-04-04 09:08:14 +01:00
Florian Rival
f078ad02f3 Add description for Pairs example, add it as starter 2019-04-04 00:24:24 +01:00
Wend1go
1c7d11a302 Add Tween behavior to animate object position/angle/properties (#980)
* Implementation based on Shifty.js
* Add examples
2019-04-03 23:34:11 +01:00
Bouh
20a62ef2dd Update link to Discord channel (#1004) 2019-04-02 13:18:41 +01:00
Kink
74e2aa1d24 Fix color picker in the scene properties (#1003)
Just inverted the checkbox and the colorfield : now the colorpicker doesn't show up over the checkbox button, and so there is no more "dead zone"  to pick a color in the color picker on the scene editor.
2019-04-02 12:36:35 +01:00
Florian Rival
18a99c664b Potential fix for games running on monitor/browsers with higher refresh rate (144hz, 70hz...) 2019-04-01 17:28:04 +01:00
Florian Rival
dde8d08693 Fix crash with LocalFolderPicker 2019-04-01 17:16:36 +01:00
Bouh
de1a47b013 Add checkboxes to filters by conditions/actions in the Events Search Panel (#996) 2019-04-01 17:48:04 +03:00
Todor Imreorov
75eaf911a2 Show object name when pasting and show hint if pasting as global
* also make font bold when object is global - so that it's easier to notice its status
2019-04-01 17:36:45 +03:00
Florian Rival
1dba4bbda8 Add updated package-lock.json after switching to unzipper 2019-03-26 22:17:53 +00:00
Todor Imreorov
9d14afa671 Disable menu items for disabling event/adding subevent if not applicable 2019-03-26 23:07:31 +01:00
Florian Rival
fd23daa3d2 Use unzipper instead of unzip2, removing dependencies on old fstream/graceful-fs 2019-03-26 21:51:20 +00:00
Florian Rival
9ba461675f Fix EmptyMessage wording in ResourcesPropertiesEditor 2019-03-18 20:55:16 +00:00
Florian Rival
0623cb2aaf Fix flow error 2019-03-17 22:59:08 +00:00
Florian Rival
ec6f8d04ed Add comment/errors for new version of react-sortable-tree 2019-03-17 22:16:05 +00:00
Florian Rival
06a4d30223 Make InstancesEditor initialization more robust against new react-dnd versions 2019-03-17 21:56:03 +00:00
Florian Rival
a27d0705a4 Fix typo in ParticleEmitterEditor 2019-03-17 20:39:35 +00:00
Florian Rival
60d7c8ca1e Fix deprecation warning with Pixi v4.8.6 2019-03-17 17:02:04 +00:00
Florian Rival
4b037c2543 Add marging to culling, to avoid issues when moving objects slightly out of the editor 2019-03-17 17:02:04 +00:00
Florian Rival
13302d7b30 Update to Pixi.js v4.8.6 (newIDE and GDJS game engine) 2019-03-17 17:02:04 +00:00
Florian Rival
596845cd76 Fix downhill-bike-physics-demo starter on web-app 2019-03-16 16:18:47 +00:00
Florian Rival
89316cbf50 Fix warning 2019-03-16 16:12:58 +00:00
Florian Rival
3cf8a8ea65 Add callbacks for when a gdjs.RuntimeScene is paused/resumed 2019-03-14 22:56:19 +00:00
Florian Rival
137a23b86a Bump newIDE version 2019-03-11 22:17:21 +00:00
Florian Rival
3dae2c50e6 Add geodash example and betabox-basics-learning-experience 2019-03-11 22:13:08 +00:00
Florian Rival
e288414684 Update translations 2019-03-11 21:53:00 +00:00
Florian Rival
0d965fc23c Merge branch 'master' of github.com:4ian/GDevelop 2019-03-11 21:01:36 +00:00
Florian Rival
728188114e Update forum links 2019-03-11 21:01:23 +00:00
Florian Rival
72a61be8ec Add button to report wrong translation 2019-03-11 20:34:19 +00:00
Florian Rival
3e822e4ef0 Remove useless minus sign 2019-03-11 20:34:08 +00:00
Bouh
29f7501dcf Add button to "Open Project Folder" in Resources Editor (#968) 2019-03-10 21:21:57 +00:00
Florian Rival
2544c71f30 Fix Flow 2019-03-10 19:09:20 +00:00
Florian Rival
6c629f6d68 Add performance warning for text object character size action 2019-03-09 19:54:32 +00:00
Florian Rival
fa022747e2 Make warnings about instruction/behaviors translatable 2019-03-09 19:51:44 +00:00
Florian Rival
d0a2491acd Fix wrong forbidden characters in translations 2019-03-07 23:48:56 +00:00
Florian Rival
816513ad85 Fix wrong merging of some duplicated translations and update translations 2019-03-07 23:42:54 +00:00
Florian Rival
b36cb17e4c Fix Prettier 2019-03-07 23:25:01 +00:00
Florian Rival
4fb27b6135 Don't mark Algolia as translatable 2019-03-07 23:18:31 +00:00
Florian Rival
96674f36b4 Fix click while renaming project item and warning when name is not changed 2019-03-07 23:13:37 +00:00
Florian Rival
c31de12048 Add max displayed rows number in TextEditor to avoid dialog mis positioning 2019-03-07 23:05:28 +00:00
Florian Rival
aaeaa8338b Fix Prettier 2019-03-07 22:03:50 +00:00
Florian Rival
f5827d4a48 Add missing translation in InstructionParametersEditor 2019-03-07 21:54:48 +00:00
Florian Rival
afe9d18b03 Button to open the events function editor from instruction editor 2019-03-07 21:53:51 +00:00
Zat
175e12b25b Allow both "Center" and "Centre" for Center point in expressions (#955) 2019-03-05 18:13:05 +00:00
Florian Rival
c4bb03d360 Revert to Pixi.js 3.0.11 for the IDE - will upgrade properly later 2019-03-03 16:27:03 +00:00
Florian Rival
acc34e8bda Add hint and differentiate buttons between string/number expression fields 2019-03-02 20:35:19 +00:00
Florian Rival
edecc01e14 Clean folder when importing GDJS Runtime files in newIDE 2019-03-02 20:34:13 +00:00
Florian Rival
808721a29f Update newIDE Pixi.js to version 4.8.6 2019-03-02 18:42:32 +00:00
Florian Rival
b57316b4f4 Fix Storybook build (babel stuck by locales large file) and add language button in StartPage 2019-03-02 16:04:40 +00:00
Florian Rival
8d57aa5353 Update translations and add translation support to LinkEvent 2019-03-02 15:18:49 +00:00
Florian Rival
2ce1c56005 Improve translation coverage and fix BrowserPreviewLinkDialog 2019-03-02 13:00:14 +00:00
Florian Rival
fc7c092cfb Exclude some files from the i18n coverage script 2019-03-02 12:19:35 +00:00
Florian Rival
e100b6f2c3 Add support for translations in Main menu 2019-03-02 01:41:09 +00:00
Florian Rival
ac2867f1a7 Fix Prettier 2019-02-28 23:08:18 +00:00
Florian Rival
3166daf041 Fix a bunch of mistakes/typos 2019-02-28 23:07:34 +00:00
Florian Rival
0c2d58e70b Make "Downhill Bike Racing" a starter 2019-02-28 22:57:27 +00:00
Florian Rival
af9ab09b3b Make some tooltips translatable 2019-02-28 22:45:43 +00:00
Florian Rival
0c8560e60d Separate languages in LanguageDialog according to progress 2019-02-28 22:18:35 +00:00
Florian Rival
5a44fd8b9f Fix wording in Particle actions/conditions 2019-02-24 17:11:57 +00:00
Florian Rival
20ce83ccfe Add image resource to the dummy example object 2019-02-23 14:58:05 +00:00
Florian Rival
0cc4543948 Add support for "resource" property and field in PropertiesEditor 2019-02-23 14:58:05 +00:00
Florian Rival
5ff045d74a Fix Prettier 2019-02-23 12:34:47 +00:00
Florian Rival
0fdf123f8d Improve Flow typing and fix tests 2019-02-23 12:17:10 +00:00
Florian Rival
ec0b934557 Add VideoResource 2019-02-22 20:20:13 +00:00
Florian Rival
7fa1e50c17 Fix typos 2019-02-22 20:00:46 +00:00
Florian Rival
9a7c5ead3a Fix edition button for children variables 2019-02-19 22:52:36 +01:00
Todor Imreorov
72282d4e6d Show instance variables in panel + inherited object variables + fix crash
* Show instance variables in InstancePropertiesEditor
* Display parent variables (not editable) and overriden variables in italic.
* Also Fix (existing) crashes when deleting variables.
  This was wrongly written:
    * no recursive search (`contains` 2nd argument not passed)
    * comparing a VariableAndName with a gdVariable made no sense.
2019-02-19 22:19:27 +01:00
Florian Rival
be950a7779 Add pseudolocalization (fake language) to detect hardcoded strings 2019-02-19 00:19:45 +01:00
Zat
d37ef30041 Update Howler to 2.1.1 (#939) 2019-02-17 12:43:36 +00:00
Florian Rival
53360bc189 Reload all extensions (including builtin) after a language change 2019-02-17 00:55:58 +00:00
Florian Rival
bfd6712a93 Ensure changes to language are immediately applied to interface.
Still need to reload GDevelop built-in extensions.
2019-02-17 00:25:29 +00:00
Florian Rival
6902f1495d Update translations 2019-02-16 19:40:26 +00:00
Florian Rival
156fd3bc19 Make Debugger Toolbar translatable 2019-02-16 19:33:35 +00:00
Florian Rival
b1303b4ad6 Update package-lock.json 2019-02-16 19:33:05 +00:00
Florian Rival
2fa3bb7b1b Merge pull request #919 from 4ian/refactor/cra2-and-jslingui
Add support for translations in GDevelop 5 🌎

For contributors, please merge master in your branches for your Pull Requests. 
See this comment: https://github.com/4ian/GDevelop/pull/919#issuecomment-464371931
Don't forget to remove `node_modules` folder in `newIDE/app`, and relaunch `npm install` or `yarn`, then `npm start` or `yarn start`.
2019-02-16 18:56:24 +00:00
Florian Rival
fca6f7627a Add unsafe-eval to fix issue with webpack for now 2019-02-16 18:22:43 +00:00
Florian Rival
e7bca87063 Update react-scripts and fix npm install 2019-02-12 23:50:28 +00:00
Florian Rival
a7afaa1241 Update translations 2019-02-10 20:34:27 +00:00
Florian Rival
e98f25255c Exclude deprecated extensions from translations 2019-02-10 18:35:52 +00:00
Florian Rival
b4bd225f78 Exclude GDCpp messages from translations (as only used in old IDE) 2019-02-10 18:10:44 +00:00
Florian Rival
2c0253fafa Improve translation handling and update all locale messages 2019-02-10 18:03:28 +00:00
Florian Rival
c8201949df Add LanguageDialog to choose language 2019-02-09 17:47:11 +00:00
Florian Rival
0426bcb2a6 Run Prettier 2019-02-09 16:11:52 +00:00
Florian Rival
9025d055a0 Fix translated dialog titles rendering and strings not to be translated 2019-02-09 16:10:32 +00:00
Florian Rival
bef6f04f89 Run "codemod" to internationalize files 2019-02-09 16:10:32 +00:00
Florian Rival
800d4f7098 Fix Prettier and npm/yarn format command to exclude locales folder 2019-02-09 16:02:22 +00:00
Florian Rival
e8d9d4fa4b Use custom build of @lingui/react while waiting for new version for Flow fixes 2019-02-09 15:51:42 +00:00
Florian Rival
c9e2d3f4e0 Fix broken TimeExtension.cpp 2019-02-09 14:12:56 +00:00
Florian Rival
43230003b8 Fix ExampleJsExtension broken after internationalization 2019-02-09 14:08:22 +00:00
Florian Rival
725069026c Fix issue with incompatible babel-loader version 2019-02-09 14:08:22 +00:00
Florian Rival
7729137a72 Upgrade to Storybook v4 2019-02-09 14:08:22 +00:00
Florian Rival
3c81b3decb Internationalize a few files and add a script to codemod most newIDE files 2019-02-09 14:08:22 +00:00
Florian Rival
460946e8f4 Add analyze-translations-coverage script 2019-02-09 14:08:22 +00:00
Florian Rival
6908ab9b3f Fix ElectronEventsBridge regression (menus not working anymore) 2019-02-09 14:08:22 +00:00
Florian Rival
0286f97145 Add temporary translation files to .gitignore 2019-02-09 14:08:22 +00:00
Florian Rival
a40ba2551d Update README to add commands for updating translations 2019-02-09 14:08:22 +00:00
Florian Rival
02c65bcf66 [WIP] Add translations support, using js-lingui, to newIDE (including libGD.js)
* Upgrade to Flow 0.92 and make fixes for it
* Convert all extensions to use _("...") instead of t("...") for translations,
  to be able to be parsed by gettext
* Handle translation in JS extensions
* Move Providers out of MainFrame
* Remove i18next
* Adapt ExtractTranslations script to handle js files (for extensions)
2019-02-09 14:08:22 +00:00
Florian Rival
ecf5401626 Update to create-react-app v2 2019-02-09 14:08:22 +00:00
Florian Rival
8866719ef0 Fix Time expression and add "timestamp" support 2019-02-09 13:27:55 +00:00
Wend1go
6a02f1b3c5 Add handling of 'stringWithSelector' parameters (#911) 2019-02-08 19:37:38 +00:00
Florian Rival
02d7c84e17 Update description of some actions/conditions 2019-02-08 17:49:49 +00:00
Florian Rival
0a9fb45841 Update link to download libGD.js 2019-02-06 23:48:16 +00:00
Florian Rival
6ddace1ec4 Add an example of an object action in ExampleJsExtension 2019-02-06 23:34:43 +00:00
Florian Rival
fc4107107b Make parameters like objectvar use the last object (not necessarily the parameter just before) 2019-02-06 23:17:13 +00:00
Florian Rival
30da9e6556 Add support for stringWithSelector parameter type 2019-02-06 22:53:53 +00:00
Florian Rival
939de1e928 Fix potential error in Facebook Instant Games export 2019-02-06 22:45:23 +00:00
Florian Rival
c8b3572cd8 Fix parameter extra information being prefixed by extension namespace 2019-02-06 22:44:29 +00:00
Florian Rival
d350243b2e Fix spelling of some conditions and actions 2019-02-06 22:08:50 +00:00
Florian Rival
ea68c31c07 Fix typo in "Common actions" category title 2019-02-05 12:01:53 +00:00
Wend1go
0dd837d127 Fix typo/spelling in README (#926) 2019-02-05 10:01:30 +00:00
Florian Rival
b5c019ae6b Add mention to JavaScript flavor in the newIDE readme. 2019-02-05 00:10:34 +00:00
Florian Rival
b4337d3746 Mention JavaScript flavor in extension README. 2019-02-05 00:08:45 +00:00
Franco Maciel
afc0a86903 Ensure size of the game during preview is the same as in settings (#924) 2019-02-04 22:15:55 +00:00
Florian Rival
2e6821d231 Add documentation about JS features/code style/typing 2019-02-04 21:30:54 +00:00
Kink
ea8a827937 Remove simulated clicks in game when the cursor leaves the window (#923) 2019-02-04 17:57:09 +00:00
Florian Rival
bc352424e1 Move "About GDevelop" menu item to help menu on Windows/Linux 2019-02-04 13:47:37 +00:00
Florian Rival
8e83f1581e Remove menu item to close the window (Win/Linux)
Was confusing with "Quit GDevelop 5" menu item
and was adding a Ctrl+W as shortcut that would
close the window.
2019-02-04 13:43:59 +00:00
Kink
ba593b46dd Update ColorPicker placement to avoid it going out of screen (#917) 2019-02-03 23:46:38 +00:00
Florian Rival
d8cfead994 Fix broken alignment for text and icons in Link events 2019-02-03 23:32:32 +00:00
Kink
cf7db809ac Properly show disabled Link events and adapt the rendering to the theme (#916) 2019-02-03 23:23:18 +00:00
Florian Rival
26dd33854f Bump newIDE version 2019-01-30 22:17:33 +00:00
Florian Rival
1ed530d946 Add endless-up-runner and space-invaders examples 2019-01-30 21:55:11 +00:00
Florian Rival
b85008c269 Fix prettier 2019-01-30 21:52:49 +00:00
Florian Rival
08ddb6e519 Fix potential crash if new release without description 2019-01-30 21:35:12 +00:00
Florian Rival
d37c55e86f Update version of libGD.js 2019-01-28 23:43:12 +00:00
Florian Rival
e2c7e1a145 Merge pull request #780 from 4ian/feature/expression-parser-2
Use ExpressionParser2 as the default parser for expression in games
2019-01-28 23:36:07 +00:00
Florian Rival
6ebf40647e Bump newIDE version 2019-01-28 23:16:20 +00:00
Florian Rival
ed42f1c54a Fix wrong parameters in downhill-bike-physics-demo 2019-01-28 23:16:20 +00:00
Florian Rival
c94097acfb Fix deprecated usage of X and Y with point name 2019-01-28 23:16:20 +00:00
Florian Rival
9c6c8564fa Fix handling of object parameters in expressions 2019-01-28 23:16:20 +00:00
Florian Rival
4b33373296 Fix ConvertToString and code generation for strings with backlash/escaped characters 2019-01-28 23:16:20 +00:00
Florian Rival
7ce11c5252 Add expression parser test checking for big list of naughty strings 2019-01-28 23:16:20 +00:00
Florian Rival
0d864ce6a7 Update error message and add test case 2019-01-28 23:16:20 +00:00
Florian Rival
a6360152cd Fix typing 2019-01-28 23:16:20 +00:00
Florian Rival
827fdbf05a Bump GDevelop Core version 2019-01-28 23:16:20 +00:00
Florian Rival
a4c372d945 Convert PointX/PointY argument to a string 2019-01-28 23:16:20 +00:00
Florian Rival
93708cb2f3 Properly handle numbers with leading 0 (normalize them to remove the extra 0) 2019-01-28 23:16:19 +00:00
Florian Rival
3035bc9386 Improve error messages for empty expressions 2019-01-28 23:16:19 +00:00
Florian Rival
4c789967c3 Fix code generation of invalid variable expressions 2019-01-28 23:16:19 +00:00
Florian Rival
75797f2c41 Fix real-time error highlighting in case expression is being written 2019-01-28 23:16:19 +00:00
Florian Rival
571686f180 Add highlighting of errors 2019-01-28 23:16:19 +00:00
Florian Rival
df68978adc Add edge cases fixes and fuzzy tests for ExpressionParser2 2019-01-28 23:16:19 +00:00
Florian Rival
7a87fd9924 Add support for unary operator in ExpressionParser2 2019-01-28 23:16:19 +00:00
Florian Rival
8d1502cb20 Fix parsing of behaviors expressions 2019-01-28 23:16:19 +00:00
Florian Rival
34b5038bd5 Refactor to use the new ExpressionCodeGenerator (or old one with a flag) 2019-01-28 23:16:19 +00:00
Florian Rival
a9e1120f00 Add gd::ExpressionCodeGenerator::GenerateExpressionCode 2019-01-28 23:16:19 +00:00
Florian Rival
b14238c692 Use ExpressionParser2 for EventsVariablesFinder 2019-01-28 23:16:19 +00:00
Florian Rival
dfe4a75fbd Use ExpressionParser2 for EventsContextAnalyzer 2019-01-28 23:16:19 +00:00
Florian Rival
4fd88072e9 Improve ExpressionParser2 and use it for GenericExpressionField and EventsRefactorer 2019-01-28 23:16:19 +00:00
Florian Rival
f2e6f19c34 Add ExpressionParser2NodePrinter 2019-01-28 23:16:18 +00:00
Florian Rival
66029c62ed Add Variable code generation for ExpressionParser2 2019-01-28 23:16:18 +00:00
Florian Rival
43d78a74bd Enhance ExpressionParser2 and add ExpressionCodeGenerator 2019-01-28 23:16:18 +00:00
Florian Rival
0ec6ebad07 Add ExpressionParser2 and tests 2019-01-28 23:16:18 +00:00
Florian Rival
8743672038 Update links to social network pages/profiles 2019-01-28 23:02:31 +00:00
Florian Rival
3fd032d898 Fix potential crash when deleting events or instructions 2019-01-27 23:54:56 +00:00
3738 changed files with 178764 additions and 755972 deletions

View File

@@ -5,22 +5,14 @@
-DGD_IDE_ONLY
-DMACOS
-DRELEASE
-DWXUSINGDLL
-D_FILE_OFFSET_BITS=64
-D__WXMAC__
-D__WXOSX_COCOA__
-D__WXOSX__
-DwxDEBUG_LEVEL=0
-D_WCHAR_H_CPLUSPLUS_98_CONFORMANCE_
-Wno-potentially-evaluated-expression
-std=gnu++11
-I/usr/local/Cellar/wxmac/3.0.2/include/wx-3.0
-DNDEBUG
-fPIC
-I/Users/florian/Projects/F/GD/ExtLibs/SFML/include
-I/Users/florian/Projects/F/GD/Core
-I/usr/local/Cellar/wxmac/3.0.2/lib/wx/include/osx_cocoa-unicode-3.0
-I/usr/local/Cellar/wxmac/3.0.2/include/wx-3.0
-I/Users/florian/Projects/F/GD/GDCpp/.
-I/Users/florian/Projects/F/GD/GDJS/.
-F/Users/florian/Projects/F/GD/ExtLibs/SFML/extlibs/libs-osx/Frameworks
-I./ExtLibs/SFML/include
-I./Core
-I./GDCpp/.
-I./GDJS/.
-F./ExtLibs/SFML/extlibs/libs-osx/Frameworks

View File

@@ -21,4 +21,5 @@ Steps to reproduce the behavior:
## Other details
* Include any OS/browser version/smartphone that you're using
* Which version of GDevelop are you using? The desktop app or the web-app?
* Add any other context about the problem here.

12
.gitignore vendored
View File

@@ -3,12 +3,11 @@
/docs/GDJS Documentation
/docs/GDCpp Documentation
/docs/GDCore Documentation
/ExtLibs/wxwidgets
/ExtLibs/wxWidgets
/ExtLibs/SFML
/ExtLibs/*.7z
/scripts/Repository keys
/scripts/logs/*.txt
/scripts/gdcore-gdcpp-gdjs-extensions-messages.pot
/Binaries/.build*
/Binaries/.embuild*
/Binaries/build*
@@ -19,14 +18,6 @@
/Binaries/Releases/**/*.tar.lzma
/Binaries/Releases/**/*.zip
/Binaries/Releases/**/*.deb
Binaries/Packaging/debian-source-package/gdevelop/
Binaries/Packaging/opensuse-build-service/gdevelop/
Binaries/Packaging/opensuse-build-service/final/
Binaries/Packaging/GDevelop.app
Binaries/Packaging/GDevelop.zip
Binaries/Packaging/GDevelop.pkg
Binaries/Packaging/logs
/GDevelop.js
*.depend
*.layout
*.xgdwe
@@ -45,7 +36,6 @@ Binaries/Packaging/logs
/Binaries/Output/Release_Linux/**
/Binaries/Output/Debug_Darwin/**
/Binaries/Output/Release_Darwin/**
/Binaries/Output/Frameworks/
!/Binaries/Output/Release_Linux/StartGDevelop.sh
!/Binaries/Output/Release_Linux/CppPlatform/
/Binaries/**/MinGW32

View File

@@ -9,23 +9,27 @@ cache:
directories:
- $HOME/.npm
git:
depth: 999999
env:
global:
- GCC_VERSION="4.8"
addons:
artifacts:
s3_region: "us-east-1"
target_paths:
- /$(git rev-parse HEAD)
paths:
- Binaries/Output/libGD.js/Release
apt:
sources:
- ubuntu-toolchain-r-test
packages:
#Build dependencies:
- cmake
# Build dependencies:
# (Cmake 3+ is required by Emscripten)
- cmake3
- p7zip-full
- g++-4.8
#SFML dependencies:
# SFML dependencies:
- libopenal-dev
- libjpeg-dev
- libglew-dev
@@ -35,43 +39,63 @@ addons:
- libglu1-mesa-dev
- libfreetype6-dev
#Activate X Virtual Framebuffer to allow tests to
#use SFML.
before_install:
#Activate X Virtual Framebuffer to allow tests to
#use SFML.
- "export DISPLAY=:99.0"
- "sh -e /etc/init.d/xvfb start"
# This workaround is required to avoid libstdc++ errors (Emscripten requires a recent version of libstdc++)
- wget -q -O libstdc++6 http://security.ubuntu.com/ubuntu/pool/main/g/gcc-5/libstdc++6_5.4.0-6ubuntu1~16.04.10_amd64.deb
- sudo dpkg --force-all -i libstdc++6
install:
#Get the correct version of gcc/g++
- if [ "$CXX" = "g++" ]; then export CXX="g++-${GCC_VERSION}" CC="gcc-${GCC_VERSION}"; fi
#Compile the tests only for GDCore and GDCpp
- mkdir .build-tests
- cd .build-tests
- cmake -DBUILD_GDJS=FALSE -DBUILD_TESTS=TRUE -DCMAKE_CXX_COMPILER=$(which $CXX) -DCMAKE_C_COMPILER=$(which $CC) ..
- make -j 4
- cd ..
# Install Emscripten (for GDevelop.js)
- git clone https://github.com/juj/emsdk.git
- cd emsdk
- ./emsdk install sdk-1.37.37-64bit
- ./emsdk activate sdk-1.37.37-64bit
- source ./emsdk_env.sh
- cd ..
# Install GDevelop.js dependencies and compile it
- cd GDevelop.js
- npm install -g grunt-cli
- npm install
- npm run build
- cd ..
#Install newIDE tests dependencies
- cd newIDE/app && npm install
- cd ../..
#Install GDJS tests dependencies
- cd GDJS/tests && npm install
- cd ../..
#Get the correct version of gcc/g++
- if [ "$CXX" = "g++" ]; then export CXX="g++-${GCC_VERSION}" CC="gcc-${GCC_VERSION}"; fi
#Compile the tests only
- mkdir .build-tests
- cd .build-tests
- cmake -DBUILD_GDJS=FALSE -DBUILD_IDE=FALSE -DBUILD_TESTS=TRUE -DNO_GUI=TRUE -DCMAKE_CXX_COMPILER=$(which $CXX) -DCMAKE_C_COMPILER=$(which $CC) ..
- make -j 4
- cd ..
script:
#GDCore and GDCpp game engine tests:
# GDCore and GDCpp game engine tests:
- cd .build-tests
- Core/GDCore_tests
- GDCpp/GDCpp_tests
- Extensions/PathfindingBehavior/PathfindingBehavior_Runtime_tests
- Extensions/LinkedObjects/LinkedObjects_Runtime_tests
- cd ..
#newIDE tests:
# GDevelop.js tests
- cd GDevelop.js
- npm test
- cd ..
# newIDE tests:
- cd newIDE/app
- npm test
- npm run flow
- npm run check-format
- cd ../..
#GDJS game engine tests, disabled on Travis CI because ChromeHeadless can't be started.
#See them running on Semaphore-CI instead: https://semaphoreci.com/4ian/gd
# GDJS game engine tests, disabled on Travis CI because ChromeHeadless can't be started.
# See them running on Semaphore-CI instead: https://semaphoreci.com/4ian/gd
# - cd GDJS/tests && npm test
# - cd ../..

View File

@@ -4,7 +4,6 @@
"name": "Mac",
"includePath": [
"${workspaceRoot}",
"${workspaceRoot}/IDE",
"${workspaceRoot}/GDCpp",
"${workspaceRoot}/GDJS",
"${workspaceRoot}/Extensions",
@@ -12,29 +11,21 @@
"${workspaceRoot}/ExtLibs/SFML/include",
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1",
"/usr/local/include",
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include",
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include",
"/usr/include",
"/usr/local/lib/wx/include/osx_cocoa-unicode-3.0",
"/usr/local/include/wx-3.0",
"${workspaceRoot}"
],
"defines": [
"GD_IDE_ONLY",
"__WXMAC__",
"__WXOSX__",
"__WXOSX_COCOA__",
"GD_CORE_API=/* Macro used to export classes on Windows, please ignore */",
"GD_API=/* Macro used to export classes on Windows, please ignore */",
"GD_EXTENSION_API=/* Macro used to export classes on Windows, please ignore */",
"WXUSINGDLL"
"GD_EXTENSION_API=/* Macro used to export classes on Windows, please ignore */"
],
"intelliSenseMode": "clang-x64",
"browse": {
"path": [
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1",
"/usr/local/include",
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include",
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include",
"/usr/include",
"${workspaceRoot}"
@@ -66,13 +57,9 @@
],
"defines": [
"GD_IDE_ONLY",
"__WXMAC__",
"__WXOSX__",
"__WXOSX_COCOA__",
"GD_CORE_API=/* Macro used to export classes on Windows, please ignore */",
"GD_API=/* Macro used to export classes on Windows, please ignore */",
"GD_EXTENSION_API=/* Macro used to export classes on Windows, please ignore */",
"WXUSINGDLL"
"GD_EXTENSION_API=/* Macro used to export classes on Windows, please ignore */"
],
"intelliSenseMode": "clang-x64",
"browse": {
@@ -102,13 +89,9 @@
"_DEBUG",
"UNICODE",
"GD_IDE_ONLY",
"__WXMAC__",
"__WXOSX__",
"__WXOSX_COCOA__",
"GD_CORE_API=/* Macro used to export classes on Windows, please ignore */",
"GD_API=/* Macro used to export classes on Windows, please ignore */",
"GD_EXTENSION_API=/* Macro used to export classes on Windows, please ignore */",
"WXUSINGDLL"
"GD_EXTENSION_API=/* Macro used to export classes on Windows, please ignore */"
],
"intelliSenseMode": "msvc-x64",
"browse": {
@@ -122,4 +105,4 @@
}
],
"version": 4
}
}

View File

@@ -77,7 +77,10 @@
"cstdint": "cpp",
"forward_list": "cpp",
"mutex": "cpp",
"__hash": "cpp"
"__hash": "cpp",
"__debug": "cpp",
"__threading_support": "cpp",
"any": "cpp"
},
"files.exclude": {
"Binaries/*build*": true,
@@ -94,10 +97,9 @@
"newIDE/app/resources/GDJS": true,
"newIDE/electron-app/app/www": true
},
// Support for Flowtype:
// Support for Flowtype (for newIDE):
"javascript.validate.enable": false,
"flow.useNPMPackagedFlow": true,
"flow.useLSP": false, // As we are in a monorepo, see https://github.com/flowtype/flow-for-vscode/issues/301
// Clang format styling (duplicated in scripts/CMakeClangUtils.txt)
"C_Cpp.clang_format_style": "{BasedOnStyle: Google, BinPackParameters: false, BinPackArguments: false}"

View File

@@ -0,0 +1,147 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="64"
height="64"
viewBox="0 0 16.933333 16.933334"
version="1.1"
id="svg8"
inkscape:version="0.91 r13725"
sodipodi:docname="tween_behavior.svg"
inkscape:export-filename="/home/matthias/Programme/GD_MyFork/tween_example/icons/tween_behavior16.png"
inkscape:export-xdpi="22.500002"
inkscape:export-ydpi="22.500002">
<defs
id="defs2">
<mask
maskUnits="userSpaceOnUse"
id="mask1103">
<rect
style="opacity:1;fill:#e8e7e7;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke"
id="rect1105"
width="4.5836725"
height="17.212158"
x="35.265717"
y="5.1149116" />
</mask>
<mask
maskUnits="userSpaceOnUse"
id="mask1131">
<path
style="opacity:1;fill:#64b1df;fill-opacity:1;stroke:none;stroke-width:12.09194851;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke"
d="M 60.625098,21.909981 V 4.9766519 H 43.691765 v 0.006 l 16.92765,16.9276491 z"
id="path1133"
inkscape:connector-curvature="0" />
</mask>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="6.0786873"
inkscape:cx="29.846777"
inkscape:cy="20.519613"
inkscape:document-units="mm"
inkscape:current-layer="layer2"
showgrid="false"
units="px"
inkscape:snap-page="true"
inkscape:snap-bbox="true"
inkscape:snap-nodes="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:showpageshadow="false"
inkscape:window-width="1920"
inkscape:window-height="1026"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="true">
<inkscape:grid
type="xygrid"
id="grid898" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Ebene1">
<rect
style="opacity:1;fill:#fefefe;fill-opacity:1;stroke:none;stroke-width:0.82572281;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke"
id="rect1051"
width="8.598958"
height="1.9843749"
x="-12.36927"
y="20.174479" />
<g
id="g3096"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
transform="translate(-43.691765,34.049609)">
<rect
style="opacity:1;fill:#4e9ac8;fill-opacity:1;stroke:none;stroke-width:12.09194851;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke"
id="rect3023"
width="16.933332"
height="16.933332"
x="43.691765"
y="-34.04929" />
<path
style="opacity:1;fill:#64b1df;fill-opacity:1;stroke:none;stroke-width:12.09194851;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke"
d="m 60.625099,-17.11628 0,-16.933329 -16.933333,0 0,0.006 16.92765,16.927649 z"
id="path3025"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#2c377f;stroke-width:1.60085762;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 47.198745,-30.887909 c 0,0 -3.27652,10.208224 0.152002,9.725277 3.410478,-0.480401 4.160872,-11.690975 8.651528,-9.26606 2.221298,1.19948 -0.281976,8.77544 -0.281976,8.77544"
id="path3027"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cssc" />
<circle
r="2.0333519"
cy="-30.52846"
cx="46.924824"
id="circle3045"
style="opacity:1;fill:#fefefe;fill-opacity:1;stroke:#424e96;stroke-width:0.80506569;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke" />
<path
style="opacity:1;fill:#e8e7e7;fill-opacity:1;stroke:none;stroke-width:0.64737606;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke"
d="m 45.769334,-31.686878 a 1.6231118,1.6471276 0 0 0 -0.472882,1.159772 1.6231118,1.6471276 0 0 0 1.623544,1.646848 1.6231118,1.6471276 0 0 0 1.142863,-0.479161 z"
id="path3047"
inkscape:connector-curvature="0" />
<circle
style="opacity:1;fill:#fefefe;fill-opacity:1;stroke:#424e96;stroke-width:1.28624356;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke"
id="circle3049"
cx="56.002975"
cy="-21.696535"
r="3.2486615" />
<path
style="opacity:1;fill:#e8e7e7;fill-opacity:1;stroke:none;stroke-width:1.03112972;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke"
d="m 54.141521,-23.515865 a 2.6043208,2.6043208 0 0 0 -0.760798,1.837285 2.6043208,2.6043208 0 0 0 2.604334,2.604333 2.6043208,2.6043208 0 0 0 1.837287,-0.760795 z"
id="path3051"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 776 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 19.1 16" style="enable-background:new 0 0 19.1 16;" xml:space="preserve">
<style type="text/css">
.st0{fill:#27AAE1;}
.st1{fill:#2B3990;}
.st2{fill:#FFFFFF;}
.st3{opacity:0.1;}
</style>
<rect id="base" x="2.9" y="1" class="st0" width="14" height="14"/>
<rect id="frame" x="3.9" y="3.7" class="st1" width="12" height="8.6"/>
<g id="hole">
<rect x="14.5" y="4.3" class="st2" width="1" height="0.9"/>
<rect x="4.4" y="4.3" class="st2" width="1" height="0.9"/>
<rect x="12" y="4.3" class="st2" width="1" height="0.9"/>
<rect x="6.9" y="4.3" class="st2" width="1" height="0.9"/>
<rect x="9.4" y="4.3" class="st2" width="1" height="0.9"/>
</g>
<g id="hole_1_">
<rect x="14.5" y="10.7" class="st2" width="1" height="0.9"/>
<rect x="4.4" y="10.7" class="st2" width="1" height="0.9"/>
<rect x="12" y="10.7" class="st2" width="1" height="0.9"/>
<rect x="6.9" y="10.7" class="st2" width="1" height="0.9"/>
<rect x="9.4" y="10.7" class="st2" width="1" height="0.9"/>
</g>
<polygon id="triangle_1_" class="st2" points="8.6,9.6 12.1,7.9 8.6,6.3 "/>
<g id="highlight">
<g class="st3">
<polygon points="16.9,15 2.9,1 2.9,15 "/>
<polygon class="st2" points="16.9,1 2.9,1 16.9,15 "/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key> <false/>
<key>com.apple.security.device.usb</key> <true/>
</dict>
</plist>

View File

@@ -1,120 +0,0 @@
#!/bin/sh
#Simply copy the entire GDevelop release directory into the bundle...
rm -rf GDevelop.app 2>&1 >/dev/null
cp -r macos-bundle-skeleton GDevelop.app
cp -r ../Output/Release_Darwin/ GDevelop.app/Contents/Resources/
cp -R ../../ExtLibs/SFML/extlibs/libs-osx/Frameworks GDevelop.app/Contents/
mkdir -p GDevelop.app/Contents/MacOS
mv GDevelop.app/Contents/Resources/GDIDE_launcher GDevelop.app/Contents/MacOS/GDIDE_launcher
type dylibbundler >/dev/null 2>&1 || { echo >&2 "Can't find dylibbundler, required to change libraries install names. Aborting..."; exit 1; }
#...and modify the internal paths to wxWidgets libraries:
#they are hardcoded in the executable (to /usr/local/lib or wherever they
#are installed).
#We use dylibbundler, that call install_name_tool to update the path to
#the external libs we depend one (i.e: wxWidgets). It also copy these
#libs into the 'libs' folder.
cd GDevelop.app/Contents/Resources/
echo . | dylibbundler -x GDIDE -b -cd -od -of -p '@executable_path/' > /dev/null
mv libs/* .
rm -rf libs
#Do the same for wxWidgets libs, to ensure that each wx library has
#the other local libraries as dependencies instead of the ones in /usr/local/[...].
for file in `ls libwx*`
do
echo . | dylibbundler -x $file -cd -od -of -p '@executable_path/'
done
#Do the same for GDCore and GDCpp.
#We don't need -b flag anymore as all external libs have already being copied.
echo . | dylibbundler -x libGDCpp.dylib -cd -od -of -p '@executable_path/' > /dev/null
echo . | dylibbundler -x libGDCore.dylib -cd -od -of -p '@executable_path/' > /dev/null
#Do the same for GDJS
cat <<EOF | dylibbundler -x JsPlatform/libGDJS.dylib -cd -od -of -p '@executable_path/' > /dev/null
JsPlatform
.
quit
EOF
#Do the same for all extensions
for file in `ls CppPlatform/Extensions/*.xgde`
do
echo "Updating libraries for $file..."
cat <<EOF | dylibbundler -x $file -cd -od -of -p '@executable_path/' > /dev/null
JsPlatform
CppPlatform/Extensions/
.
JsPlatform
CppPlatform/Extensions/
.
quit
EOF
done
for file in `ls JsPlatform/Extensions/*.xgde`
do
echo "Updating libraries for $file..."
cat <<EOF | dylibbundler -x $file -cd -od -of -p '@executable_path/' > /dev/null
JsPlatform
JsPlatform/Extensions/
.
JsPlatform
JsPlatform/Extensions/
.
quit
EOF
done
###Code signing and pkg building
#See http://kuvacode.com/blog/building-for-the-mac-app-store for more information
cd ../../..
#TODO:
rm -rf GDevelop.app/Contents/Resources/CppPlatform/Extensions/include/CommonDialogs/dlib-18.16/
rm -rf GDevelop.app/Contents/Resources/CppPlatform/Extensions/include/PhysicsBehavior/Box2D/Contributions
rm -rf GDevelop.app/Contents/Resources/CppPlatform/Extensions/Runtime/.xgd
rm -rf GDevelop.app/Contents/Resources/JsPlatform/Runtime/Extensions/CommonDialogs/dlib-18.16/
rm -rf GDevelop.app/Contents/Resources/JsPlatform/Runtime/Extensions/PhysicsBehavior/Box2D/Contributions
rm GDevelop.app/Contents/Resources/7zS.sfx
#Now sign the package:
function sign {
codesign -f -v --deep -s "Developer ID Application: Florian Rival" $1 --entitlements GDevelop.entitlements
}
for file in `ls GDevelop.app/Contents/Resources/*.dylib`
do
sign $file
done
for file in `ls GDevelop.app/Contents/Resources/CppPlatform/Extensions/*.{xgde,dylib}`
do
sign $file
done
for file in `ls GDevelop.app/Contents/Resources/JsPlatform/Extensions/*.{xgde,dylib}`
do
sign $file
done
for file in `ls GDevelop.app/Contents/Resources/CppPlatform/Extensions/Runtime/*.xgd`
do
sign $file
done
sign "GDevelop.app/Contents/Resources/CppPlatform/Runtime/ExeLinux"
sign "GDevelop.app/Contents/Resources/CppPlatform/Runtime/libGDCpp.dylib"
sign "GDevelop.app/Contents/Resources/JsPlatform/libGDJS.dylib"
sign "GDevelop.app/Contents/Resources/GDIDE"
sign "GDevelop.app/Contents/MacOS/GDIDE_launcher"
sign "GDevelop.app/Contents/Frameworks/sndfile.framework/Versions/Current"
sign "GDevelop.app/Contents/Frameworks/freetype.framework/Versions/Current"
sign "GDevelop.app"
#And create the pkg:
productbuild --component "GDevelop.app" /Applications --sign "Developer ID Installer: Florian Rival" --product "GDevelop.app/Contents/Info.plist" GDevelop.pkg

View File

@@ -1,91 +0,0 @@
#!/bin/bash
echo "This script will add the files needed by OBS in :\n'$PWD/opensuse-build-service/final'"
echo "Before that, enter those information:"
#Auto-detect last GDevelop version and current branch
(git tag -l *.*.* | sort -V -r) > versions
read autoversion < versions
(git rev-parse --abbrev-ref HEAD) > branch
read autobranch < branch
printf " GDevelop version ([ENTER] to use auto-detected [$autoversion]): "
read GD_VERSION
printf "$GD_VERSION"
if [ "$GD_VERSION" == "" ]; then
GD_VERSION="$autoversion"
fi
printf " Package revision (number): "
read PACKAGE_REV
printf " Git branch to use ([ENTER] to use current [$autobranch]): "
read BRANCH
if [ "$BRANCH" == "" ]; then
BRANCH="$autobranch"
fi
DATE=$(LC_ALL=C date +'%a, %d %b %Y %T %z')
GD_BASE_DIR=$(pwd)/../../
CUR_DIR=$(pwd)
echo "Started the OBS packaging process, using latest '$BRANCH' git tree"
#Remove old folders
printf " Preparing folders... "
if [ -d "opensuse-build-service/gdevelop" ]; then
rm -rf opensuse-build-service/gdevelop
fi
if [ -d "opensuse-build-service/final" ]; then
rm -rf opensuse-build-service/final
fi
mkdir -p opensuse-build-service/gdevelop
mkdir -p opensuse-build-service/final
echo "[OK]"
#Create the tar.gz containing the source
printf " Getting the sources... "
cd $GD_BASE_DIR
git archive --format tar.gz --output $CUR_DIR/opensuse-build-service/gdevelop/gdevelop_$GD_VERSION.orig.tar.gz --prefix=gdevelop-$GD_VERSION/ $BRANCH
cd $CUR_DIR/opensuse-build-service/gdevelop
tar zxf gdevelop_$GD_VERSION.orig.tar.gz
echo "[OK]"
#We need to include ExtLibs/SFML.7z because the buildbot do not have access to internet
printf " Copying SFML archive... "
cp -rf $GD_BASE_DIR/ExtLibs/SFML gdevelop-$GD_VERSION/ExtLibs/
echo "[OK]"
#Recreate the tar.gz with the added sources
printf " Creating the source archive... "
rm gdevelop_$GD_VERSION.orig.tar.gz
tar -zcf ../final/gdevelop_$GD_VERSION.orig.tar.gz gdevelop-$GD_VERSION/
echo "[OK]"
#Process SPEC and PKGBUILD files
cd ..
m4 -DMACRO_GD_VERSION=$GD_VERSION -DMACRO_PACKAGE_REV=$PACKAGE_REV gdevelop.spec >> final/gdevelop.spec
m4 -DMACRO_GD_VERSION=$GD_VERSION -DMACRO_PACKAGE_REV=$PACKAGE_REV PKGBUILD >> final/PKGBUILD
cp gdevelop-rpmlintrc final
cp PKGBUILD.install final
#Create the changelog and open an editor to edit it
echo -n "* " >> changelog.tmp
echo -n `LC_TIME=en_US date +"%a %b %e %Y"` >> changelog.tmp
echo -n " " >> changelog.tmp
echo -n `git config --get user.name` >> changelog.tmp
echo -n " <" >> changelog.tmp
echo -n `git config --get user.email` >> changelog.tmp
echo "> $GD_VERSION-$PACKAGE_REV" >> changelog.tmp
echo -n "- " >> changelog.tmp
"${EDITOR:-nano}" changelog.tmp
#Add the changelog at the end of the spec and as a separate file for PKGBUILD
mapfile < changelog.tmp
echo "${MAPFILE[@]}" >> final/gdevelop.spec
mv changelog.tmp final/PKGBUILD.changelog
#End
echo "Packaging process finished."

View File

@@ -1,63 +0,0 @@
#!/bin/sh
GPG_PUBLIC_KEY=0xA8025399
GD_VERSION=3.6.78
GD_VERSION_WITH_REV="$GD_VERSION"002
DISTRO=utopic
BRANCH=master
DATE=$(LC_ALL=C date +'%a, %d %b %Y %T %z')
GD_BASE_DIR=$(pwd)/../../
CUR_DIR=$(pwd)
UPLOAD="true"
DEBUILD_ARGS=""
while test $# -gt 0
do
case "$1" in
--no-upload) UPLOAD="false"
;;
--no-orig-tar-upload) DEBUILD_ARGS="-sd"
;;
esac
shift
done
echo "Started the debian source packaging process, using latest '$BRANCH' git tree"
#Create the changelog file
echo "gdevelop ($GD_VERSION_WITH_REV-1~$DISTRO) $DISTRO; urgency=low" > debian-source-package/extra-files/debian/changelog
echo "" >> debian-source-package/extra-files/debian/changelog
echo " * Released $GD_VERSION" >> debian-source-package/extra-files/debian/changelog
echo "" >> debian-source-package/extra-files/debian/changelog
echo " -- Florian <Florian.Rival@gmail.com> $DATE" >> debian-source-package/extra-files/debian/changelog
if [ -d "debian-source-package/gdevelop" ]; then
rm -rf debian-source-package/gdevelop
fi
mkdir -p debian-source-package/gdevelop
#Create the tar.gz containing the source
cd $GD_BASE_DIR
git archive --format tar.gz --output $CUR_DIR/debian-source-package/gdevelop/gdevelop_$GD_VERSION_WITH_REV.orig.tar.gz --prefix=gdevelop-$GD_VERSION_WITH_REV/ $BRANCH
cd $CUR_DIR/debian-source-package/gdevelop
tar zxvf gdevelop_$GD_VERSION_WITH_REV.orig.tar.gz
#We need to include ExtLibs/SFML.7z because buildbot do not have access to internet
cp $GD_BASE_DIR/ExtLibs/SFML.7z gdevelop-$GD_VERSION_WITH_REV/ExtLibs/
#Recreate the tar.gz with the added sources
rm gdevelop_$GD_VERSION_WITH_REV.orig.tar.gz
tar -zcvf gdevelop_$GD_VERSION_WITH_REV.orig.tar.gz gdevelop-$GD_VERSION_WITH_REV
#Add the debian folder
cp -r $CUR_DIR/debian-source-package/extra-files/debian gdevelop-$GD_VERSION_WITH_REV/
#Launch debuild
cd gdevelop-$GD_VERSION_WITH_REV/
debuild -S -sa -k$GPG_PUBLIC_KEY $DEBUILD_ARGS
cd ..
#Send ppa
if [ "$UPLOAD" = "true" ]; then
dput ppa:florian-rival/gdevelop gdevelop_$GD_VERSION_WITH_REV-1~"$DISTRO"_source.changes
fi;

View File

@@ -1,53 +0,0 @@
@echo off > %TEMP%\#
md logs
setLocal EnableDelayedExpansion
echo Script for packaging GDevelop for Windows
echo.
::Try to find Inno Setup
set INNOSETUP_EXE=C:\Program Files (x86)\Inno Setup 5\ISCC.exe
IF NOT EXIST "%INNOSETUP_EXE%" set INNOSETUP_EXE=C:\Program Files\Inno Setup 5\ISCC.exe
IF EXIST "%INNOSETUP_EXE%" (
echo "Note: InnoSetup found at %INNOSETUP_EXE%"
) ELSE (
echo Warning: InnoSetup Unicode not found! Skipping installer creation.
SET SKIPINSTALLER=1
)
echo Please ensure that locale directory is up to date with latest translations.
pause
echo Compiling Release target...
cd ..
IF EXIST "build" (
cd build
mingw32-make -j 4
cd ..
) ELSE (
echo Unable to find build directory, just make sure that GD is compiled inside Release_Windows
)
echo.
echo --Removing useless files...
del Output\Release_Windows\Examples\*.gdg.autosave > NUL 2> NUL
del Output\Release_Windows\log.txt > NUL 2> NUL
echo.
echo --Creating installer...
IF NOT "%SKIPINSTALLER%"=="1" "C:\Program Files (x86)\Inno Setup 5\ISCC.exe" Releases\InnoSetupInstallerScript.iss /Qp
IF "%SKIPINSTALLER%"=="1" echo (Skipped)
echo.
echo --Creating archive...
if exist Releases\gd4xxxx.7z (del Releases\gd4xxxx.7z)
cd Output\Release_Windows\
IF NOT "%SKIPINSTALLERANDARCHIVE%"=="1" "..\..\..\ExtLibs\7za.exe" a ..\..\Releases\gd4xxxx.7z * -bb
IF "%SKIPINSTALLERANDARCHIVE%"=="1" echo (Skipped)
cd ..\..\..
echo. >CON
echo Finished. Do not forget to : >CON
echo -Update news.txt >CON
echo -Update pad file >CON
pause >CON

View File

@@ -1,2 +0,0 @@
This directory contains scripts used to package GDevelop.
For Windows, packaging is made using Inno Setup, please ensure you have it installed.

View File

@@ -1,5 +0,0 @@
gdevelop (3.6.77001-1~utopic) utopic; urgency=low
* Released 3.6.77
-- Florian <Florian.Rival@gmail.com> Sat, 24 Jan 2015 17:46:44 +0100

View File

@@ -1,18 +0,0 @@
Source: gdevelop
Section: editors
Priority: optional
Maintainer: Florian <Florian.Rival@gmail.com>
Build-Depends: debhelper (>= 8.0.0), cmake, rsync, curl, p7zip-full, libwxgtk3.0-dev, libwebkitgtk-3.0-dev, libwebkitgtk-dev, libopenal-dev, libjpeg-dev, libglew-dev, libudev-dev, libxrandr-dev, libsndfile1-dev, libglu1-mesa-dev, libfreetype6-dev
Standards-Version: 3.9.4
Homepage: http://www.compilgames.net
#Vcs-Git: git://git.debian.org/collab-maint/gdevelop.git
#Vcs-Browser: http://git.debian.org/?p=collab-maint/gdevelop.git;a=summary
Package: gdevelop
Architecture: amd64
Depends: ${shlibs:Depends}, ${misc:Depends}, build-essential
Description: GDevelop, open source HTML5 and native game creator software
GDevelop is an open source game development software
allowing to create HTML5 and native games
without programming.

View File

@@ -1,38 +0,0 @@
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: gdevelop
Source: <url://example.com>
Files: *
Copyright: <years> <put author's name and email here>
<years> <likewise for another author>
License: <special license>
<Put the license of the package here indented by 1 space>
<This follows the format of Description: lines in control file>
.
<Including paragraphs>
# If you want to use GPL v2 or later for the /debian/* files use
# the following clauses, or change it to suit. Delete these two lines
Files: debian/*
Copyright: 2014 Florian <Florian.Rival@gmail.com>
License: GPL-2+
This package is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
.
This package is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>
.
On Debian systems, the complete text of the GNU General
Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
# Please also look if there are files or directories which have a
# different copyright/license attached and list them here.
# Please avoid to pick license terms that are more restrictive than the
# packaged work, as it may make Debian's contributions unacceptable upstream.

View File

@@ -1,2 +0,0 @@
license.txt
Readme.md

View File

@@ -1,14 +0,0 @@
#!/usr/bin/make -f
# -*- makefile -*-
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
%:
dh $@
override_dh_auto_configure:
dh_auto_configure -- -DCMAKE_INSTALL_PREFIX=/opt/gdevelop/useless -DCMAKE_BUILD_TYPE=Release -DNO_UPDATE_CHECKER=TRUE
override_dh_shlibdeps:
dh_shlibdeps --dpkg-shlibdeps-params=-ldebian/gdevelop/opt/gdevelop/

View File

@@ -1,337 +0,0 @@
; *** Inno Setup version 5.5.3+ Chinese (Simplified) messages ***
; By Qiming Li (qiming at clault.com)
;
; To download user-contributed translations of this file, go to:
; http://www.jrsoftware.org/files/istrans/
;
; Note: When translating this text, do not add periods (.) to the end of
; messages that didn't have them already, because on those messages Inno
; Setup adds the periods automatically (appending a period would result in
; two periods being displayed).
[LangOptions]
; The following three entries are very important. Be sure to read and
; understand the '[LangOptions] section' topic in the help file.
LanguageName=<4E2D><6587><FF08><7B80><4F53><FF09>
LanguageID=$0804
LanguageCodePage=936
; If the language you are translating to requires special font faces or
; sizes, uncomment any of the following entries and change them accordingly.
DialogFontName=<3D><><EFBFBD><EFBFBD>
;DialogFontSize=8
;WelcomeFontName=Verdana
;WelcomeFontSize=12
;TitleFontName=Arial
;TitleFontSize=29
;CopyrightFontName=Arial
;CopyrightFontSize=8
[Messages]
; *** Application titles
SetupAppTitle=<3D><>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>
SetupWindowTitle=<3D><>װ<EFBFBD><D7B0><EFBFBD><EFBFBD> - %1
UninstallAppTitle=ж<><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UninstallAppFullTitle=%1ж<31><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; *** Misc. common
InformationTitle=<3D><>Ϣ
ConfirmTitle=ȷ<><C8B7>
ErrorTitle=<3D><><EFBFBD><EFBFBD>
; *** SetupLdr messages
SetupLdrStartupMessage=<3D><>װ<EFBFBD>򵼽<EFBFBD><F2B5BCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD>ϰ<EFBFBD>װ%1<><31>ȷ<EFBFBD><C8B7>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LdrCannotCreateTemp=<3D>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>ֹ
LdrCannotExecTemp=<3D>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>ֹ
; *** Startup error messages
LastErrorMessage=%1.%n%n<><6E><EFBFBD><EFBFBD> %2: %3
SetupFileMissing=<3D><>װĿ¼<C4BF><C2BC>ȱʧ<C8B1>ļ<EFBFBD>%1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A3AC><EFBFBD><EFBFBD><EFBFBD>»<EFBFBD>ȡһ<C8A1>ݳ<EFBFBD><DDB3>򿽱<EFBFBD><F2BFBDB1><EFBFBD>
SetupFileCorrupt=<3D><>װ<EFBFBD>ļ<EFBFBD><C4BC>ѱ<EFBFBD><D1B1>𻵡<EFBFBD><F0BBB5A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>»<EFBFBD>ȡһ<C8A1>ݳ<EFBFBD><DDB3>򿽱<EFBFBD><F2BFBDB1><EFBFBD>
SetupFileCorruptOrWrongVer=<3D><>װ<EFBFBD>ļ<EFBFBD><C4BC>ѱ<EFBFBD><D1B1>𻵣<EFBFBD><F0BBB5A3><EFBFBD><EFBFBD><EFBFBD><EBB1BE>װ<EFBFBD>򵼰汾<F2B5BCB0><E6B1BE><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD><DDA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A3AC><EFBFBD><EFBFBD><EFBFBD>»<EFBFBD>ȡһ<C8A1>ݳ<EFBFBD><DDB3>򿽱<EFBFBD><F2BFBDB1><EFBFBD>
InvalidParameter=<3D><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD>%n%n%1
SetupAlreadyRunning=<3D><>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>С<EFBFBD>
WindowsVersionNotSupported=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><D6A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>Windows<77><EFBFBD><E6B1BE>
WindowsServicePackRequired=<3D><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>%1 Service Pack %2<><32><EFBFBD><EFBFBD><EFBFBD>°汾<C2B0><E6B1BE>
NotOnThisPlatform=<3D><><EFBFBD>򲻿<EFBFBD><F2B2BBBF><EFBFBD>%1<><31><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>
OnlyOnThisPlatform=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%1<><31><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>
OnlyOnTheseArchitectures=<3D><><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܹ<EFBFBD><DCB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>Windows<77><EFBFBD>ϰ<EFBFBD>װ<EFBFBD><D7B0>%n%n%1
MissingWOW64APIs=<3D><><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD>Windows<77>汾û<E6B1BE>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>64λ<34><CEBB>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD><C4B9>ܡ<EFBFBD><DCA1>밲װService Pack %1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WinVersionTooLowError=<3D><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>%2<><EFBFBD><E6B1BE><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>%1<><31>
WinVersionTooHighError=<3D><><EFBFBD>򲻿ɰ<F2B2BBBF>װ<EFBFBD><D7B0>%2<><32><EFBFBD><EFBFBD><EFBFBD>߰汾<DFB0><E6B1BE>%1<>ϡ<EFBFBD>
AdminPrivilegesRequired=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼Ϊ<C2BC><CEAA><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>ܰ<EFBFBD>װ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>
PowerUserPrivilegesRequired=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼Ϊ<C2BC><CEAA><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ܰ<EFBFBD>װ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>
SetupAppRunningError=<3D><>װ<EFBFBD>򵼼<EFBFBD><F2B5BCBC>⵽%1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>%n%n<><6E><EFBFBD>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>װ<EFBFBD><D7B0>
UninstallAppRunningError=ж<><D0B6><EFBFBD>򵼼<EFBFBD><F2B5BCBC>⵽%1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>%n%n<><6E><EFBFBD>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>ڣ<EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>
; *** Misc. errors
ErrorCreatingDir=<3D><>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>С<EFBFBD>%1<><31>
ErrorTooManyFilesInDir=<3D><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>С<EFBFBD>%1<><31><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ļ<EFBFBD>
; *** Setup common messages
ExitSetupTitle=<3D>˳<EFBFBD><CBB3><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>
ExitSetupMessage=<3D><>װ<EFBFBD><D7B0>δ<EFBFBD><CEB4><EFBFBD>ɡ<EFBFBD><C9A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򽫲<EFBFBD><F2BDABB2><EFBFBD><E1B1BB>װ<EFBFBD><D7B0> %n%n<><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɳ<EFBFBD><C9B3><EFBFBD><EFBFBD>İ<EFBFBD>װ<EFBFBD><D7B0>%n%nȷ<6E><C8B7><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AboutSetupMenuItem=<3D><><EFBFBD>ڰ<EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>(&A)<29><>
AboutSetupTitle=<3D><><EFBFBD>ڰ<EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>
AboutSetupMessage=%1<>汾%2%n%3%n%n%1<><31>ҳ<EFBFBD><D2B3>%n%4
AboutSetupNote=
TranslatorNote=
; *** Buttons
ButtonBack=< <20><>һ<EFBFBD><D2BB>(&B)
ButtonNext=<3D><>һ<EFBFBD><D2BB>(&N) >
ButtonInstall=<3D><>װ(&I)
ButtonOK=ȷ<><C8B7>
ButtonCancel=ȡ<><C8A1>
ButtonYes=<3D><>(&Y)
ButtonYesToAll=ȫѡ<C8AB><D1A1>(&A)
ButtonNo=<3D><>(&N)
ButtonNoToAll=ȫѡ<C8AB><D1A1>(&O)
ButtonFinish=<3D><><EFBFBD><EFBFBD>(&F)
ButtonBrowse=<3D><><EFBFBD><EFBFBD>(&B)<29><>
ButtonWizardBrowse=<3D><><EFBFBD><EFBFBD>(&R)<29><>
ButtonNewFolder=<3D><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>(&M)
; *** "Select Language" dialog messages
SelectLanguageTitle=ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SelectLanguageLabel=ѡ<><D1A1><EFBFBD><EFBFBD>װʱʹ<CAB1><CAB9><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD>
; *** Common wizard text
ClickNext=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>װ<EFBFBD>򵼡<EFBFBD>
BeveledLabel=
BrowseDialogTitle=<3D><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
BrowseDialogLabel=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>ѡȡһ<C8A1><D2BB><EFBFBD>ļ<EFBFBD><C4BC>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NewFolderName=<3D>½<EFBFBD><C2BD>ļ<EFBFBD><C4BC><EFBFBD>
; *** "Welcome" wizard page
WelcomeLabel1=<3D><>ӭʹ<D3AD><CAB9>[name]<5D><>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>
WelcomeLabel2=<3D><><EFBFBD>򵼽<EFBFBD><F2B5BCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD>ϰ<EFBFBD>װ[name/ver]%n%n<><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD>֮ǰ<D6AE>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD>
; *** "Password" wizard page
WizardPassword=<3D><><EFBFBD><EFBFBD>
PasswordLabel1=<3D><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB1A3><EFBFBD><EFBFBD>
PasswordLabel3=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>Сд<D0A1><D0B4>
PasswordEditLabel=<3D><><EFBFBD><EFBFBD>(&P)<29><>
IncorrectPassword=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB2BB>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD>
; *** "License Agreement" wizard page
WizardLicense=<3D><><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>
LicenseLabel=<3D><><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>Ϣ<EFBFBD><CFA2>Ȼ<EFBFBD><C8BB><EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
LicenseLabel3=<3D><><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD><E9A1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD>Э<EFBFBD><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȼ<EEA3AC><C8BB><EFBFBD><EFBFBD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>
LicenseAccepted=<3D>ҽ<EFBFBD><D2BD><EFBFBD>Э<EFBFBD><D0AD>(&A)
LicenseNotAccepted=<3D>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>(&D)
; *** "Information" wizard pages
WizardInfoBefore=<3D><>Ϣ
InfoBeforeLabel=<3D><><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>Ϣ<EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
InfoBeforeClickLabel=׼<><D7BC><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD>󣬵<EFBFBD><F3A3ACB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WizardInfoAfter=<3D><>Ϣ
InfoAfterLabel=<3D><><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>Ϣ<EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
InfoAfterClickLabel=׼<><D7BC><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD>󣬵<EFBFBD><F3A3ACB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; *** "User Information" wizard page
WizardUserInfo=<3D>û<EFBFBD><C3BB><EFBFBD>Ϣ
UserInfoDesc=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
UserInfoName=<3D>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>(&U)<29><>
UserInfoOrg=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(&O)<29><>
UserInfoSerial=<3D><><EFBFBD>к<EFBFBD><D0BA><EFBFBD>(&S)<29><>
UserInfoNameRequired=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>
; *** "Select Destination Location" wizard page
WizardSelectDir=ѡ<><D1A1><EFBFBD><EFBFBD>װλ<D7B0><CEBB>
SelectDirDesc=<3D><>[name]<5D><>װ<EFBFBD><D7B0><EFBFBD>δ<EFBFBD><CEB4><EFBFBD>
SelectDirLabel3=<3D><>װ<EFBFBD>򵼽<EFBFBD><F2B5BCBD><EFBFBD>[name]<5D><>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>С<EFBFBD>
SelectDirBrowseLabel=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫѡ<D2AA><D1A1><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ļ<EFBFBD><C4BC>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DiskSpaceMBLabel=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[mb]<5D><><EFBFBD>ֽڣ<D6BD>MB<4D><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4>̿ռ
CannotInstallToNetworkDrive=<3D>޷<EFBFBD><DEB7><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CannotInstallToUNCPath=<3D>޷<EFBFBD><DEB7><EFBFBD>װ<EFBFBD><D7B0>UNC·<43><C2B7><EFBFBD><EFBFBD>
InvalidPath=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>磺%n%nC:\Ӧ<>ó<EFBFBD><C3B3><EFBFBD>%n%n<><6E><EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD>ʽ<EFBFBD><CABD>UNC·<43><C2B7><EFBFBD><EFBFBD>%n%n\\<5C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\<5C><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC>
InvalidDrive=<3D><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>UNC<4E><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻ򲻿ɷ<F2B2BBBF><C9B7>ʡ<EFBFBD><CAA1><EFBFBD><EFBFBD><EFBFBD>ѡһ<D1A1><D2BB><EFBFBD><EFBFBD>
DiskSpaceWarningTitle=<3D><><EFBFBD>̿ռ<D5BC><E4B2BB>
DiskSpaceWarning=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%1ǧ<31>ֽڣ<D6BD>KB<4B><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿռ<C3BF><D5BC>ſɰ<C5BF>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%2ǧ<32>ֽڣ<D6BD>KB<4B><42><EFBFBD><EFBFBD><EFBFBD>ÿռ䡣%n%n<><6E>ȷ<EFBFBD><C8B7>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DirNameTooLong=<3D>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD>·<EFBFBD><C2B7>̫<EFBFBD><CCAB><EFBFBD><EFBFBD>
InvalidDirName=<3D>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
BadDirName32=<3D>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʋ<EFBFBD><C6B2>ܰ<EFBFBD><DCB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>%n%n%1
DirExistsTitle=<3D>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>Ѵ<EFBFBD><D1B4><EFBFBD>
DirExists=<3D>ļ<EFBFBD><C4BC><EFBFBD>%n%n%1%n%n<>Ѵ<EFBFBD><D1B4>ڡ<EFBFBD><DAA1><EFBFBD>ȷ<EFBFBD><C8B7>Ҫ<EFBFBD><D2AA>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DirDoesntExistTitle=<3D>ļ<EFBFBD><C4BC>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD>
DirDoesntExist=<3D>ļ<EFBFBD><C4BC><EFBFBD>%n%n%1%n%n<><6E><EFBFBD><EFBFBD><EFBFBD>ڡ<EFBFBD><DAA1><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; *** "Select Components" wizard page
WizardSelectComponents=ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SelectComponentsDesc=Ҫ<><D2AA>װ<EFBFBD><D7B0>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SelectComponentsLabel2=<3D><>ѡ<EFBFBD><D1A1>Ҫ<EFBFBD><D2AA>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼<EFBFBD><D7BC><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
FullInstallation=ȫ<><C8AB><EFBFBD><EFBFBD>װ
; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language)
CompactInstallation=<3D><><EFBFBD>లװ
CustomInstallation=<3D>Զ<EFBFBD><D4B6>尲װ
NoUninstallWarningTitle=<3D><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD><D1B4><EFBFBD>
NoUninstallWarning=<3D><>װ<EFBFBD>򵼼<EFBFBD><F2B5BCBC><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%n%n%1%n%nȡ<6E><C8A1>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%n%n<><6E>ȷ<EFBFBD><C8B7>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>
ComponentSize1=%1ǧ<31>ֽڣ<D6BD>KB<4B><42>
ComponentSize2=%1<><31><EFBFBD>ֽڣ<D6BD>MB<4D><42>
ComponentsDiskSpaceMBLabel=Ŀǰ<C4BF><C7B0>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[mb]<5D><><EFBFBD>ֽڣ<D6BD>MB<4D><42><EFBFBD><EFBFBD><EFBFBD>̿ռ
; *** "Select Additional Tasks" wizard page
WizardSelectTasks=ѡ<>񸽼<EFBFBD><F1B8BDBC><EFBFBD><EFBFBD><EFBFBD>
SelectTasksDesc=Ҫִ<D2AA><D6B4><EFBFBD><EFBFBD>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SelectTasksLabel2=<3D><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>װ[name]ʱ<><CAB1>Ҫִ<D2AA>еĸ<D0B5><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; *** "Select Start Menu Folder" wizard page
WizardSelectProgramGroup=ѡ<><D1A1><EFBFBD><EFBFBD>ʼ<EFBFBD>˵<EFBFBD><CBB5>ļ<EFBFBD><C4BC><EFBFBD>
SelectStartMenuFolderDesc=<3D>ѳ<EFBFBD><D1B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD>ʽ<EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD>
SelectStartMenuFolderLabel3=<3D><>װ<EFBFBD>򵼽<EFBFBD><F2B5BCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¿<EFBFBD>ʼ<EFBFBD>˵<EFBFBD><CBB5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD>ʽ<EFBFBD><CABD>
SelectStartMenuFolderBrowseLabel=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫѡ<D2AA><D1A1><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD><C4BC>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MustEnterGroupName=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GroupNameTooLong=<3D>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD>·<EFBFBD><C2B7>̫<EFBFBD><CCAB><EFBFBD><EFBFBD>
InvalidGroupName=<3D>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
BadGroupName=<3D>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʋ<EFBFBD><C6B2>ܰ<EFBFBD><DCB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>%n%n%1
NoProgramGroupCheck2=<3D><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>˵<EFBFBD><CBB5>ļ<EFBFBD><C4BC><EFBFBD>(&D)
; *** "Ready to Install" wizard page
WizardReady=<3D><>װ׼<D7B0><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ReadyLabel1=<3D><>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD>ϰ<EFBFBD>װ[name]<5D><>
ReadyLabel2a=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>Ҫȷ<D2AA>ϻ<EFBFBD><CFBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ReadyLabel2b=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>װ<EFBFBD><D7B0>
ReadyMemoUserInfo=<3D>û<EFBFBD><C3BB><EFBFBD>Ϣ<EFBFBD><CFA2>
ReadyMemoDir=<3D><>װλ<D7B0>ã<EFBFBD>
ReadyMemoType=<3D><>װ<EFBFBD><D7B0><EFBFBD>ͣ<EFBFBD>
ReadyMemoComponents=<3D><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ReadyMemoGroup=<3D><>ʼ<EFBFBD>˵<EFBFBD><CBB5>ļ<EFBFBD><C4BC>У<EFBFBD>
ReadyMemoTasks=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; *** "Preparing to Install" wizard page
WizardPreparing=׼<><D7BC><EFBFBD><EFBFBD>װ
PreparingDesc=<3D><>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD>ϰ<EFBFBD>װ[name]<5D><>
PreviousInstallNotCompleted=<3D>ϴγ<CFB4><CEB3><EFBFBD><EFBFBD><EFBFBD>װ/ж<><D0B6>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD>ɡ<EFBFBD><C9A1><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴΰ<CFB4>װ<EFBFBD><D7B0>%n%n<><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ[name]<5D><>
CannotContinue=<3D><>װ<EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>
ApplicationsFound=<3D><>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>µ<EFBFBD><C2B5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD>ռ<EFBFBD>á<EFBFBD><C3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>ر<EFBFBD><D8B1><EFBFBD>ЩӦ<D0A9>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD>
ApplicationsFound2=<3D><>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>µ<EFBFBD><C2B5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD>ռ<EFBFBD>á<EFBFBD><C3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>ر<EFBFBD><D8B1><EFBFBD>ЩӦ<D0A9>ó<EFBFBD><C3B3>򡣰<EFBFBD>װ<EFBFBD><D7B0><EFBFBD>ɺ󣬰<C9BA>װ<EFBFBD>򵼽<EFBFBD><F2B5BCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ЩӦ<D0A9>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD>
CloseApplications=<3D>Զ<EFBFBD><D4B6>ر<EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD>(&A)
DontCloseApplications=<3D><><EFBFBD>Զ<EFBFBD><D4B6>ر<EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD>(&D)
ErrorCloseApplications=<3D><>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7>Զ<EFBFBD><D4B6>ر<EFBFBD><D8B1><EFBFBD><EFBFBD>е<EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><D8B1><EFBFBD>Щռ<D0A9>ð<EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD>
; *** "Installing" wizard page
WizardInstalling=<3D><><EFBFBD>ڰ<EFBFBD>װ
InstallingLabel=<3D><><EFBFBD>Ժ򣬰<D4BA>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD>ϰ<EFBFBD>װ[name]<5D><>
; *** "Setup Completed" wizard page
FinishedHeadingLabel=[name]<5D><>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>
FinishedLabelNoIcons=<3D><>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD>ϰ<EFBFBD>װ[name]<5D><>
FinishedLabel=<3D><>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD>ϰ<EFBFBD>װ[name]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>Ѱ<EFBFBD>װ<EFBFBD>Ŀ<EFBFBD><C4BF>ݷ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD>򿪴<EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD>
ClickFinish=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>װ<EFBFBD><D7B0>
FinishedRestartLabel=Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[name]<5D>İ<EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>װ<EFBFBD>򵼱<EFBFBD><F2B5BCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>ԡ<EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
FinishedRestartMessage=Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[name]<5D>İ<EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>װ<EFBFBD>򵼱<EFBFBD><F2B5BCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>ԡ<EFBFBD>%n%nҪ<6E><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ShowReadmeCheck=<3D>ǣ<EFBFBD><C7A3><EFBFBD>Ҫ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
YesRadio=<3D>ǣ<EFBFBD><C7A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(&Y)
NoRadio=<3D><><EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(&N)
; used for example as 'Run MyProg.exe'
RunEntryExec=<3D><><EFBFBD><EFBFBD>%1
; used for example as 'View Readme.txt'
RunEntryShellExec=<3D><><EFBFBD><EFBFBD>%1
; *** "Setup Needs the Next Disk" stuff
ChangeDiskTitle=<3D><>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>һ<EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD>
SelectDiskLabel2=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%n%n<><6E><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PathLabel=·<><C2B7>(&P)<29><>
FileNotInDir2=<3D>ļ<EFBFBD><C4BC><EFBFBD>%1<><31><EFBFBD><EFBFBD><EFBFBD>ڡ<EFBFBD>%2<><32><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD>Ĵ<EFBFBD><C4B4>̻<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>С<EFBFBD>
SelectDirectoryLabel=<3D><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>һ<EFBFBD>Ŵ<EFBFBD><C5B4>̵<EFBFBD>λ<EFBFBD>á<EFBFBD>
; *** Installation phase messages
SetupAborted=<3D><>װδ<D7B0><CEB4><EFBFBD><EFBFBD><EFBFBD>ɡ<EFBFBD>%n%n<><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD>װ<EFBFBD>򵼡<EFBFBD>
EntryAbortRetryIgnore=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD><D4A1><EFBFBD><EFBFBD>³<EFBFBD><C2B3>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD><D4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>
; *** Installation status messages
StatusClosingApplications=<3D><><EFBFBD>ڹر<DAB9>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD>
StatusCreateDirs=<3D><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>С<EFBFBD>
StatusExtractFiles=<3D><><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
StatusCreateIcons=<3D><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD>ʽ<EFBFBD><CABD>
StatusCreateIniEntries=<3D><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>INI<4E><49>Ŀ<EFBFBD><C4BF>
StatusCreateRegistryEntries=<3D><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>
StatusRegisterFiles=<3D><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>
StatusSavingUninstall=<3D><><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>
StatusRunProgram=<3D><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>
StatusRestartingApplications=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD>
StatusRollback=<3D><><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ<EFBFBD>
; *** Misc. errors
ErrorInternal2=<3D>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%1
ErrorFunctionFailedNoCode=%1ʧ<31><CAA7>
ErrorFunctionFailed=%1ʧ<31>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%2
ErrorFunctionFailedWithMessage=%1ʧ<31>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%2<><32>%n%3
ErrorExecutingProgram=<3D>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD>%n%1
; *** Registry errors
ErrorRegOpenKey=<3D><><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%n%1\%2
ErrorRegCreateKey=<3D><><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%n%1\%2
ErrorRegWriteKey=д<><D0B4>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%n%1\%2
; *** INI errors
ErrorIniEntry=<3D><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>%1<><31><EFBFBD>д<EFBFBD><D0B4><EFBFBD>INI<4E><49>Ŀʱ<C4BF><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; *** File copying errors
FileAbortRetryIgnore=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD><D4A1><EFBFBD><EFBFBD>³<EFBFBD><C2B3>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD><D4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>
FileAbortRetryIgnore2=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD><D4A1><EFBFBD><EFBFBD>³<EFBFBD><C2B3>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD><D4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>
SourceIsCorrupted=Դ<>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SourceDoesntExist=Դ<>ļ<EFBFBD><C4BC><EFBFBD>%1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ExistingFileReadOnly=<3D><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊֻ<CEAA><D6BB><EFBFBD><EFBFBD>%n%n<><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD><D4A1>Ƴ<EFBFBD><C6B3><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD>³<EFBFBD><C2B3>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD><D4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>
ErrorReadingExistingDest=<3D><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
FileExists=<3D>ļ<EFBFBD><C4BC>Ѵ<EFBFBD><D1B4>ڡ<EFBFBD>%n%n<>ð<EFBFBD>װ<EFBFBD>򵼸<EFBFBD><F2B5BCB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ExistingFileNewer=<3D><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>Ȱ<EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>װ<EFBFBD>Ļ<EFBFBD>Ҫ<EFBFBD>¡<EFBFBD><C2A1><EFBFBD><EFBFBD><EFBFBD><E9B1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>%n%n<><6E>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
ErrorChangingAttr=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ErrorCreatingTemp=<3D><>Ŀ<EFBFBD><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ļ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ErrorReadingSource=<3D><>ȡԴ<C8A1>ļ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ErrorCopying=<3D><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ErrorReplacingExistingFile=<3D><EFBFBD><E6BBBB><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ErrorRestartReplace=<3D><><EFBFBD><EFBFBD><EFBFBD>滻ʧ<E6BBBB>ܣ<EFBFBD>
ErrorRenamingTemp=ΪĿ<CEAA><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ErrorRegisterServer=<3D>޷<EFBFBD>ע<EFBFBD>ᶯ̬<E1B6AF><CCAC><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD>DLL/OCX<43><58><EFBFBD><EFBFBD>%1
ErrorRegSvr32Failed=<3D><><EFBFBD><EFBFBD>RegSvr32ʧ<32>ܣ<EFBFBD><DCA3><EFBFBD><E4B7B5>ֵΪ<D6B5><CEAA>%1
ErrorRegisterTypeLib=<3D>޷<EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD>Ϳ⣺%1
; *** Post-installation errors
ErrorOpeningReadme=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ErrorRestartingComputer=<3D><>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD><D4A1><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; *** Uninstaller messages
UninstallNotFound=<3D>ļ<EFBFBD><C4BC><EFBFBD>%1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڡ<EFBFBD><DAA1>޷<EFBFBD>ж<EFBFBD>ء<EFBFBD>
UninstallOpenError=<3D>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>%1<><31><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD>ж<EFBFBD><D0B6>
UninstallUnsupportedVer=<3D>˰汾<CBB0><E6B1BE>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD>ʶ<EFBFBD><CAB6>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>־<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>%1<><31><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD>޷<EFBFBD>ж<EFBFBD><D0B6>
UninstallUnknownEntry=<3D><>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ֪<CEB4><D6AA>Ŀ (%1)
ConfirmUninstall=<3D><><EFBFBD>Ƿ<EFBFBD>ȷ<EFBFBD><C8B7>Ҫ<EFBFBD><D2AA>ȫɾ<C8AB><C9BE>%1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UninstallOnlyOnWin64=<3D>˰<EFBFBD>װֻ<D7B0><D6BB><EFBFBD><EFBFBD>64λWindows<77><73>ж<EFBFBD>ء<EFBFBD>
OnlyAdminCanUninstall=<3D>˰<EFBFBD>װֻ<D7B0><D6BB><EFBFBD>ɾ߱<C9BE><DFB1><EFBFBD><EFBFBD><EFBFBD>ԱȨ<D4B1>޵<EFBFBD><DEB5>û<EFBFBD>ж<EFBFBD>ء<EFBFBD>
UninstallStatusLabel=<3D><><EFBFBD>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE>%1<><31>
UninstalledAll=<3D>ѳɹ<D1B3><C9B9>ش<EFBFBD><D8B4><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE>%1<><31>
UninstalledMost=%1ж<31><D0B6><EFBFBD><EFBFBD><EFBFBD>ϡ<EFBFBD>%n%nijЩ<C4B3><D0A9>Ŀ<EFBFBD>޷<EFBFBD><DEB7><EFBFBD>ж<EFBFBD>ع<EFBFBD><D8B9><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD>Щ<EFBFBD><D0A9>Ŀ<EFBFBD><C4BF>
UninstalledAndNeedsRestart=<3D><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>%1<><31>ж<EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD>%n%nҪ<6E><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UninstallDataCorrupted=<3D>ļ<EFBFBD><C4BC><EFBFBD>%1<><31><EFBFBD><EFBFBD><EFBFBD>𻵡<EFBFBD><F0BBB5A1>޷<EFBFBD>ж<EFBFBD><D0B6>
; *** Uninstallation phase messages
ConfirmDeleteSharedFileTitle=ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
ConfirmDeleteSharedFile2=ϵͳ<CFB5><CDB3>ʾû<CABE><C3BB><EFBFBD>κγ<CEBA><CEB3><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>¹<EFBFBD><C2B9><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ҫɾ<D2AA><C9BE><EFBFBD>ù<EFBFBD><C3B9><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>%n%n<><6E><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD>ʹ<EFBFBD>ø<EFBFBD><C3B8>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD>񡰷񡱡<F1A1B0B7><F1A1B1A1><EFBFBD><EFBFBD>¸<EFBFBD><C2B8>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD>
SharedFileNameLabel=<3D>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
SharedFileLocationLabel=λ<>ã<EFBFBD>
WizardUninstalling=ж<><D0B6>״̬
StatusUninstalling=<3D><><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>%1<><31>
; *** Shutdown block reasons
ShutdownBlockReasonInstallingApp=<3D><><EFBFBD>ڰ<EFBFBD>װ%1<><31>
ShutdownBlockReasonUninstallingApp=<3D><><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>%1<><31>
; The custom messages below aren't used by Setup itself, but if you make
; use of them in your scripts, you'll want to translate them.
[CustomMessages]
NameAndVersion=%1<>汾%2
AdditionalIcons=<3D><><EFBFBD>ӿ<EFBFBD><D3BF>ݷ<EFBFBD>ʽ<EFBFBD><CABD>
CreateDesktopIcon=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD>ʽ(&D)
CreateQuickLaunchIcon=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD>ʽ(&Q)
ProgramOnTheWeb=%1<><31>վ
UninstallProgram=ж<><D0B6>%1
LaunchProgram=<3D><><EFBFBD><EFBFBD>%1
AssocFileExtension=<3D><>%1<><31>%2<>ļ<EFBFBD><C4BC><EFBFBD>չ<EFBFBD><D5B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(&A)
AssocingFileExtension=<3D><><EFBFBD>ڽ<EFBFBD>%1<><31>%2<>ļ<EFBFBD><C4BC><EFBFBD>չ<EFBFBD><D5B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AutoStartProgramGroupDescription=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AutoStartProgram=<3D>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>%1
AddonHostProgramNotFound=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD>%1<><31>%n%n<>Ƿ<EFBFBD><C7B7><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -1,8 +0,0 @@
#!/bin/bash
cd /opt/gdevelop
if [ -z ${1+x} ];
then
sh StartGDevelop.sh
else
sh StartGDevelop.sh "$1"
fi

View File

@@ -1,13 +0,0 @@
[Desktop Entry]
Version=1.0
Name=GDevelop
GenericName=Game creator IDE
GenericName[de]=Entwicklungsumgebung für Spiele
Comment=HTML5 and native game development software
Comment[de]=Entwicklungsumgebung für native und HTML5-Spiele
Exec=sh -c "gdevelop %F"
MimeType=application/x-gdevelop-project;
Icon=GDevelop
Terminal=false
Type=Application
Categories=Development;IDE;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 592 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 853 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -1,331 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="256"
height="256"
id="svg3126"
version="1.1"
inkscape:version="0.48.5 r10040"
sodipodi:docname="GDevelop-lowres.svg"
inkscape:export-filename="/home/victor/Developpement/GD/Binaries/Packaging/linux-extra-files/usr/share/icons/hicolor/16x16/apps/GDevelop.png"
inkscape:export-xdpi="5.625"
inkscape:export-ydpi="5.625">
<defs
id="defs3128">
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3870"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3864">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop3866" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop3868" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3087"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3089">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop3091" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop3093" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3095"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3097">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop3099" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop3101" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3103"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3105">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop3107" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop3109" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-1"
id="linearGradient3870-1"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3864-1">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop3866-1" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop3868-1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-1"
id="linearGradient4060"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4062">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop4064" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop4066" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-1"
id="linearGradient4068"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4070">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop4072" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop4074" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-1"
id="linearGradient4076"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4078">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop4080" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop4082" />
</linearGradient>
<linearGradient
y2="268.24673"
x2="168.82013"
y1="223.99173"
x1="168.82013"
gradientUnits="userSpaceOnUse"
id="linearGradient4091"
xlink:href="#linearGradient3864-1"
inkscape:collect="always" />
<linearGradient
y2="268.24673"
x2="168.82013"
y1="223.99173"
x1="168.82013"
gradientUnits="userSpaceOnUse"
id="linearGradient4093"
xlink:href="#linearGradient3864-1"
inkscape:collect="always" />
<linearGradient
y2="268.24673"
x2="168.82013"
y1="223.99173"
x1="168.82013"
gradientUnits="userSpaceOnUse"
id="linearGradient4095"
xlink:href="#linearGradient3864-1"
inkscape:collect="always" />
<linearGradient
y2="268.24673"
x2="168.82013"
y1="223.99173"
x1="168.82013"
gradientUnits="userSpaceOnUse"
id="linearGradient4097"
xlink:href="#linearGradient3864-1"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-1"
id="linearGradient4167"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-1"
id="linearGradient4169"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-1"
id="linearGradient4171"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-1"
id="linearGradient4173"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.80957032"
inkscape:cx="130.9262"
inkscape:cy="39.814734"
inkscape:current-layer="g4158"
showgrid="true"
inkscape:document-units="px"
inkscape:grid-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1006"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1" />
<metadata
id="metadata3131">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(0,192)">
<path
inkscape:connector-curvature="0"
style="fill:#604878;fill-opacity:1"
d="m 0,-192 255.99999,0 0,256 L 0,64 z"
id="rect3961-3" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Logo"
transform="translate(0,192)">
<g
id="g4158"
transform="matrix(1.3156402,0,0,1.3156402,87.33682,-103.64087)">
<g
inkscape:export-ydpi="50.027794"
inkscape:export-xdpi="50.027794"
inkscape:export-filename="D:\Florian\Pictures\GDevelop\Logos GDevelop\gdevelop-258x73.png"
style="fill:url(#linearGradient4173);fill-opacity:1"
id="g3851"
transform="translate(-135.23664,-243.63945)">
<g
style="fill:url(#linearGradient4169);fill-opacity:1"
id="g21">
<path
style="fill:url(#linearGradient4167);fill-opacity:1"
inkscape:connector-curvature="0"
id="path23"
d="m 172.503,303.436 c -12.338,0 -24.216,-3.336 -34.709,-10.6 -7.314,-5.061 -15.779,-16.489 -15.779,-35.863 0,-35.943 18.36,-49.061 55.256,-49.061 h 66.426 l 6.396,20.472 h -67.76 c -24.352,0 -38.832,1.899 -38.832,28.589 0,8.816 2.486,15.09 7.603,19.178 8.648,6.91 25.457,7.204 35.728,6.214 0,0 4.214,-13.551 4.908,-15.751 0.813,-2.578 0.457,-3.193 -2.079,-3.193 -3.663,0 -10.248,0 -17.237,0 -4.898,0 -9.71,-2.465 -9.71,-8.386 0,-5.718 4.477,-9.037 10.614,-9.037 10.626,0 32.511,0 36.607,0 5.37,0 10.85,0.77 8.054,9.271 l -14.807,44.906 c 0.001,10e-4 -12.096,3.261 -30.679,3.261 z" />
</g>
<path
style="fill:url(#linearGradient4171);fill-opacity:1"
inkscape:connector-curvature="0"
id="path25"
d="m 213.973,311.059 c -7.463,5.225 -18.517,8.113 -37.274,8.113 -32.329,0 -55.99,-11.617 -65.637,-34.138 -4.561,-10.645 -4.122,-22.71 -4.122,-39.027 H 85.455 c 0,17.206 -0.296,30.697 4.307,43.123 12.07,32.596 43.152,50.109 84.906,50.109 40.416,0 57.164,-11.525 68.082,-28.18 h -28.777 z" />
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -1,351 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="256"
height="256"
id="svg3126"
version="1.1"
inkscape:version="0.48.5 r10040"
sodipodi:docname="GDevelop.svg">
<defs
id="defs3128">
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3870"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3864">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop3866" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop3868" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3087"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3089">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop3091" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop3093" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3095"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3097">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop3099" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop3101" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3103"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3105">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop3107" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop3109" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-1"
id="linearGradient3870-1"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3864-1">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop3866-1" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop3868-1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-1"
id="linearGradient4060"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4062">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop4064" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop4066" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-1"
id="linearGradient4068"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4070">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop4072" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop4074" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-1"
id="linearGradient4076"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4078">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop4080" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop4082" />
</linearGradient>
<linearGradient
y2="268.24673"
x2="168.82013"
y1="223.99173"
x1="168.82013"
gradientUnits="userSpaceOnUse"
id="linearGradient4091"
xlink:href="#linearGradient3864-1"
inkscape:collect="always" />
<linearGradient
y2="268.24673"
x2="168.82013"
y1="223.99173"
x1="168.82013"
gradientUnits="userSpaceOnUse"
id="linearGradient4093"
xlink:href="#linearGradient3864-1"
inkscape:collect="always" />
<linearGradient
y2="268.24673"
x2="168.82013"
y1="223.99173"
x1="168.82013"
gradientUnits="userSpaceOnUse"
id="linearGradient4095"
xlink:href="#linearGradient3864-1"
inkscape:collect="always" />
<linearGradient
y2="268.24673"
x2="168.82013"
y1="223.99173"
x1="168.82013"
gradientUnits="userSpaceOnUse"
id="linearGradient4097"
xlink:href="#linearGradient3864-1"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-1"
id="linearGradient4167"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-1"
id="linearGradient4169"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-1"
id="linearGradient4171"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-1"
id="linearGradient4173"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.80957032"
inkscape:cx="128.45575"
inkscape:cy="39.814734"
inkscape:current-layer="svg3126"
showgrid="true"
inkscape:document-units="px"
inkscape:grid-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1006"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1" />
<metadata
id="metadata3131">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(0,192)">
<path
inkscape:connector-curvature="0"
style="fill:#604878;fill-opacity:1"
d="m 0,-192 255.99999,0 0,256 L 0,64 z"
id="rect3961-3" />
<path
style="fill:#000000;fill-opacity:0.19607843"
d="m 0,-192 0,80 c 17.537195,21.503835 37.384534,34.092368 54.25,40.124998 43.812716,15.68182 88.79436,16.268904 132.25,4.625008 28.64714,-7.675986 51.92073,-16.376103 69.5,-23.750004 L 256,-192 l -37.375,0 c -0.67043,17.02568 -1.5,37 -1.5,37 -35.24116,13.18006 -94.76964,27.92621 -131.75,11.75 -19.00714,-8.31253 -32.56004,-24.33749 -41.25,-48.75 L 0,-192 z M 0,-31.875002 0,53.124999 C 11.193881,57.460225 22.802204,61.088396 34.75,64 L 197,64 c 10.2141,-2.073897 20.56277,-4.453347 31,-7.25 9.7754,-2.61931 19.09175,-5.335394 28,-8.124998 l 0,-76.875004 c -11.95072,4.268195 -25.10846,8.418321 -39.875,12.375 C 130.08388,7.1796466 55.276708,2.2185193 0,-31.875002 z"
id="rect3961"
inkscape:connector-curvature="0" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Logo"
transform="translate(0,192)">
<g
id="g4158"
transform="matrix(1.3156402,0,0,1.3156402,87.33682,-103.64087)">
<g
inkscape:export-ydpi="50.027794"
inkscape:export-xdpi="50.027794"
inkscape:export-filename="D:\Florian\Pictures\GDevelop\Logos GDevelop\gdevelop-258x73.png"
style="fill:url(#linearGradient4173);fill-opacity:1"
id="g3851"
transform="translate(-135.23664,-243.63945)">
<g
style="fill:url(#linearGradient4169);fill-opacity:1"
id="g21">
<path
style="fill:url(#linearGradient4167);fill-opacity:1"
inkscape:connector-curvature="0"
id="path23"
d="m 172.503,303.436 c -12.338,0 -24.216,-3.336 -34.709,-10.6 -7.314,-5.061 -15.779,-16.489 -15.779,-35.863 0,-35.943 18.36,-49.061 55.256,-49.061 h 66.426 l 6.396,20.472 h -67.76 c -24.352,0 -38.832,1.899 -38.832,28.589 0,8.816 2.486,15.09 7.603,19.178 8.648,6.91 25.457,7.204 35.728,6.214 0,0 4.214,-13.551 4.908,-15.751 0.813,-2.578 0.457,-3.193 -2.079,-3.193 -3.663,0 -10.248,0 -17.237,0 -4.898,0 -9.71,-2.465 -9.71,-8.386 0,-5.718 4.477,-9.037 10.614,-9.037 10.626,0 32.511,0 36.607,0 5.37,0 10.85,0.77 8.054,9.271 l -14.807,44.906 c 0.001,10e-4 -12.096,3.261 -30.679,3.261 z" />
</g>
<path
style="fill:url(#linearGradient4171);fill-opacity:1"
inkscape:connector-curvature="0"
id="path25"
d="m 213.973,311.059 c -7.463,5.225 -18.517,8.113 -37.274,8.113 -32.329,0 -55.99,-11.617 -65.637,-34.138 -4.561,-10.645 -4.122,-22.71 -4.122,-39.027 H 85.455 c 0,17.206 -0.296,30.697 4.307,43.123 12.07,32.596 43.152,50.109 84.906,50.109 40.416,0 57.164,-11.525 68.082,-28.18 h -28.777 z" />
</g>
<g
inkscape:export-ydpi="50.027794"
inkscape:export-xdpi="50.027794"
inkscape:export-filename="D:\Florian\Pictures\GDevelop\Logos GDevelop\gdevelop-258x73.png"
style="fill:#377fc9;fill-opacity:1"
id="g3847"
transform="translate(-135.23664,-243.63945)">
<path
style="fill:#377fc9;fill-opacity:1"
d="m 191.619,267 c -0.958,3.051 -4.787,15.365 -4.787,15.365 -10.271,0.99 -27.08,0.696 -35.728,-6.214 -2.906,-2.323 -4.962,-5.353 -6.197,-9.151 h -22.069 c 2.297,13.391 9.007,21.72 14.956,25.836 10.493,7.264 22.371,10.6 34.709,10.6 18.583,0 30.68,-3.26 30.68,-3.26 L 214.122,267 h -22.503 z"
id="path45"
inkscape:connector-curvature="0" />
<path
style="fill:#377fc9;fill-opacity:1"
d="m 89.762,289.129 c 12.07,32.596 43.152,50.109 84.906,50.109 40.416,0 57.164,-11.525 68.082,-28.18 h -28.776 c -7.463,5.225 -18.517,8.113 -37.274,8.113 -32.329,0 -55.99,-11.617 -65.637,-34.139 -2.356,-5.5 -3.373,-11.385 -3.81,-18.033 H 85.74 c 0.425,8.007 1.468,15.233 4.022,22.13 z"
id="path47"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -1,517 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg4486"
height="256"
width="256"
version="1.0"
inkscape:version="0.48.5 r10040"
sodipodi:docname="applications-x-gdevelop-project-lowres.svg"
inkscape:export-filename="/home/victor/Developpement/GD/Binaries/Packaging/linux-extra-files/usr/share/icons/hicolor/32x32/mimetypes/applications-x-gdevelop-project.png"
inkscape:export-xdpi="11.25"
inkscape:export-ydpi="11.25">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1006"
id="namedview44"
showgrid="false"
inkscape:zoom="2.4583333"
inkscape:cx="66.320162"
inkscape:cy="140.39148"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1"
inkscape:current-layer="svg4486" />
<metadata
id="metadata51">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs4488">
<linearGradient
id="linearGradient5060">
<stop
id="stop5062"
offset="0" />
<stop
id="stop5064"
style="stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3312"
y2="5.4565001"
gradientUnits="userSpaceOnUse"
x2="36.358002"
gradientTransform="matrix(5.2173457,0,0,5.4422088,3.3921377,7.6656911)"
y1="7.9842548"
x1="33.047932">
<stop
id="stop8591"
style="stop-color:#fefefe"
offset="0" />
<stop
id="stop8593"
style="stop-color:#cbcbcb"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3316"
y2="46.016998"
gradientUnits="userSpaceOnUse"
x2="24"
gradientTransform="matrix(5.3241595,0,0,5.2058567,0.26069817,6.1689759)"
y1="2"
x1="24">
<stop
id="stop3213"
style="stop-color:#fff"
offset="0" />
<stop
id="stop3215"
style="stop-color:#fff;stop-opacity:0"
offset="1" />
</linearGradient>
<radialGradient
id="radialGradient3319"
gradientUnits="userSpaceOnUse"
cy="112.3"
cx="102"
gradientTransform="matrix(0.3617,0,0,-0.39078,0.85106,47.517)"
r="139.56">
<stop
id="stop41"
style="stop-color:#b7b8b9"
offset="0" />
<stop
id="stop47"
style="stop-color:#ececec"
offset=".18851" />
<stop
id="stop49"
style="stop-color:#fafafa;stop-opacity:0"
offset=".25718" />
<stop
id="stop51"
style="stop-color:#fff;stop-opacity:0"
offset=".30111" />
<stop
id="stop53"
style="stop-color:#fafafa;stop-opacity:0"
offset=".53130" />
<stop
id="stop55"
style="stop-color:#ebecec;stop-opacity:0"
offset="0.85454136" />
<stop
id="stop57"
style="stop-color:#e1e2e3;stop-opacity:0"
offset="1" />
</radialGradient>
<linearGradient
id="linearGradient3322"
y2="47.013"
gradientUnits="userSpaceOnUse"
x2="25.132"
gradientTransform="matrix(5.2293733,0,0,5.0001698,2.5355656,3.4346286)"
y1="0.98521"
x1="25.132">
<stop
id="stop3602"
style="stop-color:#f4f4f4"
offset="0" />
<stop
id="stop3604"
style="stop-color:#dbdbdb"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3324"
y2="2.9061999"
gradientUnits="userSpaceOnUse"
x2="-51.785999"
gradientTransform="matrix(4.222719,0,0,4.6794001,313.21263,-2.1383145)"
y1="50.785999"
x1="-51.785999">
<stop
id="stop3106"
style="stop-color:#aaa"
offset="0" />
<stop
id="stop3108"
style="stop-color:#c8c8c8"
offset="1" />
</linearGradient>
<radialGradient
id="radialGradient3327"
xlink:href="#linearGradient5060"
gradientUnits="userSpaceOnUse"
cy="486.64999"
cx="605.71002"
gradientTransform="matrix(0.12048476,0,0,0.07687178,140.38708,207.14432)"
r="117.14" />
<radialGradient
id="radialGradient3330"
xlink:href="#linearGradient5060"
gradientUnits="userSpaceOnUse"
cy="486.64999"
cx="605.71002"
gradientTransform="matrix(-0.12048476,0,0,0.07687178,115.6103,207.14432)"
r="117.14" />
<linearGradient
id="linearGradient3333"
y2="609.51001"
gradientUnits="userSpaceOnUse"
x2="302.85999"
gradientTransform="matrix(0.35206756,0,0,0.07687178,0.7516188,207.14432)"
y1="366.64999"
x1="302.85999">
<stop
id="stop5050"
style="stop-opacity:0"
offset="0" />
<stop
id="stop5056"
offset=".5" />
<stop
id="stop5052"
style="stop-opacity:0"
offset="1" />
</linearGradient>
<filter
id="filter3212"
height="1.3286999"
width="1.2969"
y="-0.16434"
x="-0.14846"
color-interpolation-filters="sRGB">
<feGaussianBlur
id="feGaussianBlur3214"
stdDeviation="0.77391625" />
</filter>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3870"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3864">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop3866" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop3868" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3087"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3089">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop3091" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop3093" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3095"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3097">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop3099" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop3101" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3103"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3105">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop3107" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop3109" />
</linearGradient>
<linearGradient
y2="268.24673"
x2="168.82013"
y1="223.99173"
x1="168.82013"
gradientUnits="userSpaceOnUse"
id="linearGradient3118"
xlink:href="#linearGradient3864"
inkscape:collect="always" />
<linearGradient
y2="268.24673"
x2="168.82013"
y1="223.99173"
x1="168.82013"
gradientUnits="userSpaceOnUse"
id="linearGradient3120"
xlink:href="#linearGradient3864"
inkscape:collect="always" />
<linearGradient
y2="268.24673"
x2="168.82013"
y1="223.99173"
x1="168.82013"
gradientUnits="userSpaceOnUse"
id="linearGradient3122"
xlink:href="#linearGradient3864"
inkscape:collect="always" />
<linearGradient
y2="268.24673"
x2="168.82013"
y1="223.99173"
x1="168.82013"
gradientUnits="userSpaceOnUse"
id="linearGradient3124"
xlink:href="#linearGradient3864"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3959"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3961"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3963"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3965"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3978"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3980"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3982"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3984"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3987"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientTransform="matrix(1.3351686,0,0,1.3351686,-101.71983,-230.26927)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3991"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3993"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3996"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientTransform="matrix(0.25532097,0,0,0.25532097,-19.9365,-46.605512)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient4008"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3351686,0,0,1.3351686,-101.71983,-230.26927)"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3850"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3241338,0,0,1.3351686,-99.218449,-230.26927)"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
</defs>
<rect
id="rect2879"
style="opacity:0.3;fill:url(#linearGradient3333)"
height="18.669386"
width="169.99648"
y="235.33061"
x="42.999413" />
<path
id="path2881"
style="opacity:0.3;fill:url(#radialGradient3330)"
d="m 42.999412,235.33064 v 18.66887 C 36.79476,254.03611 28,249.81601 28,244.66508 c 0,-5.15617 6.92369,-9.33444 14.999412,-9.33444 z"
inkscape:connector-curvature="0" />
<path
id="path2883"
style="opacity:0.3;fill:url(#radialGradient3327)"
d="m 212.99692,235.33064 v 18.66887 c 6.20727,0.0366 15.00308,-4.1835 15.00308,-9.33443 0,-5.15617 -6.92892,-9.33444 -15.00308,-9.33444 z"
inkscape:connector-curvature="0" />
<path
id="path4160"
style="fill:url(#linearGradient3322);stroke:url(#linearGradient3324);stroke-width:20;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
d="M 36.526493,16.048377 H 162.35044 c 7.35773,2.482121 46.88133,30.760218 57.20412,50.34213 V 246.17114 H 36.526493 V 16.04733 z"
inkscape:connector-curvature="0" />
<path
id="path4191"
style="fill:#614a79;fill-opacity:1"
d="m 41.032644,243.54076 c -1.042214,0 -1.891464,-0.91514 -1.891464,-2.04469 V 20.795601 c 0,-1.12693 0.84925,-2.042592 1.891464,-2.042592 39.13297,0.564771 82.493366,-0.844963 121.577706,0.14067 l 53.77364,46.363623 0.55431,176.240338 c 0,1.12955 -0.84715,2.04469 -1.89303,2.04469 H 41.032644 z"
inkscape:connector-curvature="0" />
<path
id="path2435"
style="opacity:0.6;fill:none;stroke:url(#linearGradient3316);stroke-width:29.06505775;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
d="M 215.88915,65.93621 V 243.03373 H 40.191894 V 19.184764 c 40.261294,-0.0016 81.480946,-0.0016 121.742226,-0.0016"
inkscape:connector-curvature="0" />
<path
id="path12038"
style="opacity:0.4;fill-rule:evenodd;filter:url(#filter3212)"
d="m 28.617,208.92126 c 4.283,0 2.154,8.4831 2.154,8.4831 0,0 10.357,-1.8023 10.357,2.8186 0,-2.6095 -11.302,-10.728 -12.511,-11.302 z"
inkscape:connector-curvature="0"
transform="matrix(5.2293733,0,0,5.2293733,2.5355665,-1074.2613)" />
<path
style="fill:url(#linearGradient4008);fill-opacity:1"
d="M 134.90625 47.28125 C 85.643862 47.28125 61.1875 64.822536 61.1875 112.8125 C 61.1875 138.68006 72.515824 153.9302 82.28125 160.6875 C 96.291177 170.38616 112.05794 174.90625 128.53125 174.90625 C 153.34269 174.90625 169.56385 170.50131 169.5625 170.5 L 189.3125 110.53125 C 193.04562 99.180993 185.70111 98.09375 178.53125 98.09375 L 129.6875 98.09375 C 121.49356 98.09375 115.46875 102.55298 115.46875 110.1875 C 115.46875 118.09301 121.99159 121.46875 128.53125 121.46875 L 151.5625 121.46875 C 154.94848 121.46875 155.42924 122.27667 154.34375 125.71875 C 153.41714 128.65614 147.8125 146.8125 147.8125 146.8125 C 134.09898 148.13433 111.64029 147.69478 100.09375 138.46875 C 93.261691 133.0106 89.8125 124.58335 89.8125 112.8125 C 89.8125 77.176826 109.26722 74.71875 141.78125 74.71875 L 200.9375 74.71875 L 200.9375 48 L 200.21875 47.28125 L 134.90625 47.28125 z "
id="path23" />
<path
style="fill:url(#linearGradient3850);fill-opacity:1"
d="m 54.501589,162.40625 0,38.75 c 20.142581,14.078 46.615101,21.46875 77.541301,21.46875 33.0844,0 54.18956,-5.86034 68.89461,-15.59375 l 0,-22 -16.8595,0 c -9.88201,6.97625 -24.44006,10.78125 -49.27685,10.78125 -36.584714,0 -64.874515,-11.34014 -80.299561,-33.40625 z"
id="path25"
inkscape:connector-curvature="0" />
<path
id="path4474"
style="fill:#f5f4f4;fill-opacity:1;fill-rule:evenodd"
d="m 159.72239,66.06117 71.21999,-0.287952 C 223.16981,48.054658 178.7852,8.8978731 159.72749,5.096393 z"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
</svg>

Before

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -1,518 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg4486"
height="256"
width="256"
version="1.0"
inkscape:version="0.48.5 r10040"
sodipodi:docname="applications-x-gdevelop-project.svg"
inkscape:export-filename="/home/victor/Developpement/GD/Binaries/Packaging/linux-extra-files/usr/share/icons/hicolor/256x256/mimetypes/applications-x-gdevelop-project.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1006"
id="namedview44"
showgrid="false"
inkscape:zoom="2.4583333"
inkscape:cx="154.18133"
inkscape:cy="99.214708"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1"
inkscape:current-layer="svg4486" />
<metadata
id="metadata51">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs4488">
<linearGradient
id="linearGradient5060">
<stop
id="stop5062"
offset="0" />
<stop
id="stop5064"
style="stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3312"
y2="5.4565001"
gradientUnits="userSpaceOnUse"
x2="36.358002"
gradientTransform="matrix(5.2173457,0,0,5.4422088,3.3921377,7.6656911)"
y1="8.059"
x1="32.891998">
<stop
id="stop8591"
style="stop-color:#fefefe"
offset="0" />
<stop
id="stop8593"
style="stop-color:#cbcbcb"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3316"
y2="46.016998"
gradientUnits="userSpaceOnUse"
x2="24"
gradientTransform="matrix(5.2293733,0,0,5.1131766,2.5355665,8.3932773)"
y1="2"
x1="24">
<stop
id="stop3213"
style="stop-color:#fff"
offset="0" />
<stop
id="stop3215"
style="stop-color:#fff;stop-opacity:0"
offset="1" />
</linearGradient>
<radialGradient
id="radialGradient3319"
gradientUnits="userSpaceOnUse"
cy="112.3"
cx="102"
gradientTransform="matrix(0.3617,0,0,-0.39078,0.85106,47.517)"
r="139.56">
<stop
id="stop41"
style="stop-color:#b7b8b9"
offset="0" />
<stop
id="stop47"
style="stop-color:#ececec"
offset=".18851" />
<stop
id="stop49"
style="stop-color:#fafafa;stop-opacity:0"
offset=".25718" />
<stop
id="stop51"
style="stop-color:#fff;stop-opacity:0"
offset=".30111" />
<stop
id="stop53"
style="stop-color:#fafafa;stop-opacity:0"
offset=".53130" />
<stop
id="stop55"
style="stop-color:#ebecec;stop-opacity:0"
offset="0.85454136" />
<stop
id="stop57"
style="stop-color:#e1e2e3;stop-opacity:0"
offset="1" />
</radialGradient>
<linearGradient
id="linearGradient3322"
y2="47.013"
gradientUnits="userSpaceOnUse"
x2="25.132"
gradientTransform="matrix(5.2293733,0,0,5.0001698,2.5355656,3.4346286)"
y1="0.98521"
x1="25.132">
<stop
id="stop3602"
style="stop-color:#f4f4f4"
offset="0" />
<stop
id="stop3604"
style="stop-color:#dbdbdb"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3324"
y2="2.9061999"
gradientUnits="userSpaceOnUse"
x2="-51.785999"
gradientTransform="matrix(4.222719,0,0,4.6794001,313.21263,-2.1383145)"
y1="50.785999"
x1="-51.785999">
<stop
id="stop3106"
style="stop-color:#aaa"
offset="0" />
<stop
id="stop3108"
style="stop-color:#c8c8c8"
offset="1" />
</linearGradient>
<radialGradient
id="radialGradient3327"
xlink:href="#linearGradient5060"
gradientUnits="userSpaceOnUse"
cy="486.64999"
cx="605.71002"
gradientTransform="matrix(0.12048476,0,0,0.07687178,140.38708,207.14432)"
r="117.14" />
<radialGradient
id="radialGradient3330"
xlink:href="#linearGradient5060"
gradientUnits="userSpaceOnUse"
cy="486.64999"
cx="605.71002"
gradientTransform="matrix(-0.12048476,0,0,0.07687178,115.6103,207.14432)"
r="117.14" />
<linearGradient
id="linearGradient3333"
y2="609.51001"
gradientUnits="userSpaceOnUse"
x2="302.85999"
gradientTransform="matrix(0.35206756,0,0,0.07687178,0.7516188,207.14432)"
y1="366.64999"
x1="302.85999">
<stop
id="stop5050"
style="stop-opacity:0"
offset="0" />
<stop
id="stop5056"
offset=".5" />
<stop
id="stop5052"
style="stop-opacity:0"
offset="1" />
</linearGradient>
<filter
id="filter3212"
height="1.3286999"
width="1.2969"
y="-0.16434"
x="-0.14846"
color-interpolation-filters="sRGB">
<feGaussianBlur
id="feGaussianBlur3214"
stdDeviation="0.77391625" />
</filter>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3870"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3864">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop3866" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop3868" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3087"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3089">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop3091" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop3093" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3095"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3097">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop3099" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop3101" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3103"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3105">
<stop
style="stop-color:#67ace3;stop-opacity:1;"
offset="0"
id="stop3107" />
<stop
style="stop-color:#4c90d4;stop-opacity:1"
offset="1"
id="stop3109" />
</linearGradient>
<linearGradient
y2="268.24673"
x2="168.82013"
y1="223.99173"
x1="168.82013"
gradientUnits="userSpaceOnUse"
id="linearGradient3118"
xlink:href="#linearGradient3864"
inkscape:collect="always" />
<linearGradient
y2="268.24673"
x2="168.82013"
y1="223.99173"
x1="168.82013"
gradientUnits="userSpaceOnUse"
id="linearGradient3120"
xlink:href="#linearGradient3864"
inkscape:collect="always" />
<linearGradient
y2="268.24673"
x2="168.82013"
y1="223.99173"
x1="168.82013"
gradientUnits="userSpaceOnUse"
id="linearGradient3122"
xlink:href="#linearGradient3864"
inkscape:collect="always" />
<linearGradient
y2="268.24673"
x2="168.82013"
y1="223.99173"
x1="168.82013"
gradientUnits="userSpaceOnUse"
id="linearGradient3124"
xlink:href="#linearGradient3864"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3959"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3961"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3963"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3965"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3978"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3980"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3982"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3984"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3987"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientTransform="matrix(1.3351686,0,0,1.3351686,-101.71983,-230.26927)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3991"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3993"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient3996"
gradientUnits="userSpaceOnUse"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673"
gradientTransform="matrix(0.25532097,0,0,0.25532097,-19.9365,-46.605512)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="linearGradient4008"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3351686,0,0,1.3351686,-101.71983,-230.26927)"
x1="168.82013"
y1="223.99173"
x2="168.82013"
y2="268.24673" />
</defs>
<rect
id="rect2879"
style="opacity:0.3;fill:url(#linearGradient3333)"
height="18.669386"
width="169.99648"
y="235.33061"
x="42.999413" />
<path
id="path2881"
style="opacity:0.3;fill:url(#radialGradient3330)"
d="m 42.999412,235.33064 v 18.66887 C 36.79476,254.03611 28,249.81601 28,244.66508 c 0,-5.15617 6.92369,-9.33444 14.999412,-9.33444 z"
inkscape:connector-curvature="0" />
<path
id="path2883"
style="opacity:0.3;fill:url(#radialGradient3327)"
d="m 212.99692,235.33064 v 18.66887 c 6.20727,0.0366 15.00308,-4.1835 15.00308,-9.33443 0,-5.15617 -6.92892,-9.33444 -15.00308,-9.33444 z"
inkscape:connector-curvature="0" />
<path
id="path4160"
style="fill:url(#linearGradient3322);stroke:url(#linearGradient3324);stroke-width:5.22895479;stroke-linejoin:round"
d="M 36.526493,16.048377 H 162.35044 c 7.35773,2.482121 46.88133,30.760218 57.20412,50.34213 V 246.17114 H 36.526493 V 16.04733 z"
inkscape:connector-curvature="0" />
<path
id="path4191"
style="fill:#614a79;fill-opacity:1"
d="m 41.032644,243.54076 c -1.042214,0 -1.891464,-0.91514 -1.891464,-2.04469 V 20.795601 c 0,-1.12693 0.84925,-2.042592 1.891464,-2.042592 39.13297,0.564771 82.493366,-0.844963 121.577706,0.14067 l 53.77364,46.363623 0.55431,176.240338 c 0,1.12955 -0.84715,2.04469 -1.89303,2.04469 H 41.032644 z"
inkscape:connector-curvature="0" />
<path
id="path2435"
style="opacity:0.6;fill:none;stroke:url(#linearGradient3316);stroke-width:5.22895479;stroke-linejoin:round"
d="M 214.32518,67.096473 V 241.04112 H 41.755866 V 21.177345 c 39.544521,-0.0016 80.030334,-0.0016 119.574844,-0.0016"
inkscape:connector-curvature="0" />
<path
id="path12038"
style="opacity:0.4;fill-rule:evenodd;filter:url(#filter3212)"
d="m 28.617,208.92126 c 4.283,0 2.154,8.4831 2.154,8.4831 0,0 10.357,-1.8023 10.357,2.8186 0,-2.6095 -11.302,-10.728 -12.511,-11.302 z"
inkscape:connector-curvature="0"
transform="matrix(5.2293733,0,0,5.2293733,2.5355665,-1074.2613)" />
<path
style="fill:url(#linearGradient4008);fill-opacity:1"
d="m 134.90408,47.27584 c -49.262388,0 -73.701481,17.540626 -73.701481,65.53059 0,25.86756 11.315485,41.12415 21.080911,47.88145 14.009927,9.69866 29.77396,14.21736 46.24727,14.21736 24.81144,0 41.01924,-4.41098 41.01789,-4.41229 l 19.77358,-59.97437 c 3.73312,-11.350257 -3.61573,-12.419768 -10.78559,-12.419768 l -48.86195,0 c -8.19394,0 -14.21737,4.458408 -14.21737,12.092928 0,7.90551 6.53378,11.27584 13.07344,11.27584 l 23.04193,0 c 3.38598,0 3.86359,0.80679 2.7781,4.24887 -0.92661,2.93739 -6.53671,21.08091 -6.53671,21.08091 -13.71352,1.32183 -36.1715,0.89171 -47.71804,-8.33432 -6.832059,-5.45815 -10.295327,-13.88576 -10.295327,-25.65661 0,-35.635674 19.452867,-38.07638 51.966897,-38.07638 l 69.77945,0 0,-16.078649 -11.31461,-11.375561 z"
id="path23"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sscsccssssscccsscccs" />
<path
style="fill:url(#linearGradient3987);fill-opacity:1"
d="m 44.533971,144.83634 0,49.51563 c 21.107555,18.51418 51.050717,28.2713 86.938329,28.2713 42.27645,0 65.13791,-9.402 80.07478,-24.18586 l 0,-13.40027 -27.61763,0 c -9.96436,6.97625 -24.63528,10.78559 -49.67905,10.78559 -43.164664,0 -74.875044,-15.52429 -87.755414,-45.59359 -0.761213,-1.77664 -1.394238,-3.54955 -1.961015,-5.3928 z"
id="path25"
inkscape:connector-curvature="0" />
<path
style="fill:#377fc9;fill-opacity:1"
d="m 154.12385,126.22077 c -1.27909,4.07357 -6.39145,20.51483 -6.39145,20.51483 -13.71352,1.32183 -36.15636,0.92931 -47.7029,-8.29672 -3.880008,-3.10159 -6.625116,-7.14714 -8.274047,-12.21811 H 62.289612 c 3.066886,17.87923 12.025865,28.99985 19.968786,34.4954 14.009921,9.69865 29.869052,14.15278 46.342372,14.15278 24.81143,0 40.96297,-4.35267 40.96297,-4.35267 l 14.60541,-44.29551 h -30.0453 z"
id="path45"
inkscape:connector-curvature="0" />
<path
style="fill:#377fc9;fill-opacity:1"
d="m 44.533971,144.67292 0,49.67905 c 21.107555,18.51418 51.050717,28.2713 86.938329,28.2713 42.27645,0 65.13791,-9.402 80.07478,-24.18586 l 0,-13.40027 -27.61763,0 c -9.96436,6.97625 -24.63528,10.78559 -49.67905,10.78559 -43.164658,0 -74.875044,-15.52292 -87.755414,-45.59359 -0.786414,-1.83588 -1.382241,-3.64823 -1.961015,-5.55622 z"
id="path47"
inkscape:connector-curvature="0" />
<path
id="path4474"
style="fill:url(#linearGradient3312);fill-rule:evenodd"
d="m 152.18454,18.265945 c 16.66602,0 12.21582,40.066412 12.21582,40.066412 0,0 53.20887,-5.130015 53.20887,19.034396 0,-5.888275 0.44972,-10.10315 -0.70074,-11.940752 -8.25195,-13.199984 -43.90058,-42.8202 -56.7753,-46.702487 -0.9622,-0.290753 -3.10102,-0.457569 -7.94865,-0.457569 z"
inkscape:connector-curvature="0" />
</svg>

Before

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
<mime-type type="application/x-gdevelop-project">
<comment>GDevelop project</comment>
<glob pattern="*.gdg"/>
<icon name="applications-x-gdevelop-project"/>
</mime-type>
</mime-info>

View File

@@ -1,34 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleDisplayName</key>
<string>GDevelop</string>
<key>CFBundleExecutable</key>
<string>GDIDE_launcher</string>
<key>CFBundleIconFile</key>
<string>icon.icns</string>
<key>CFBundleIdentifier</key>
<string>com.gdevelop</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>GDevelop</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>11</string>
<key>LSMinimumSystemVersion</key>
<string>10.6</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.developer-tools</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>

View File

@@ -1,36 +0,0 @@
# Maintainer: Victor Levasseur <victorlevasseur52@gmail.com>
pkgname=gdevelop
pkgver=MACRO_GD_VERSION
pkgrel=MACRO_PACKAGE_REV
pkgdesc="GDevelop is a full featured, open source game development software, allowing to create HTML5 and native games without needing any knowledge in a specific programming language. All the game logic is made thanks to an intuitive and powerful event based system."
arch=('i686' 'x86_64')
url="http://www.compilgames.net"
license=('GPL' 'MIT' 'zlib/png')
groups=()
install='PKGBUILD.install'
makedepends=('rsync' 'cmake' 'git' 'curl')
depends=('gcc' 'wxgtk' 'openal' 'p7zip' 'glew' 'libsndfile' 'systemd' 'libjpeg-turbo' 'desktop-file-utils' 'gtk-update-icon-cache')
changelog='PKGBUILD.changelog'
source=( "gdevelop_$pkgver.orig.tar.gz")
md5sums=(SKIP)
build() {
cd "$srcdir"/$pkgname-$pkgver
cd Binaries
rm -rf .build
mkdir .build
cd .build
cmake -DNO_UPDATE_CHECKER=TRUE ../..
#Build the whole project
make -j4
}
package() {
cd "$srcdir"/$pkgname-$pkgver
cd Binaries/.build
make install DESTDIR="$pkgdir"
#Remove sfml installed libs
rm -rf "$pkgdir"/usr/local
}

View File

@@ -1,18 +0,0 @@
post_install() {
update-mime-database usr/share/mime
update-desktop-database
gtk-update-icon-cache -q -t -f usr/share/icons/hicolor
}
post_upgrade() {
update-mime-database usr/share/mime
update-desktop-database
gtk-update-icon-cache -q -t -f usr/share/icons/hicolor
}
post_remove() {
update-mime-database usr/share/mime
update-desktop-database
gtk-update-icon-cache -q -t -f usr/share/icons/hicolor
}

View File

@@ -1,4 +0,0 @@
#Files needed by the IDE to build games (they are not part of a devel package)
addFilter("devel-file-in-non-devel-package.*/opt/gdevelop/CppPlatform/include/.*")
addFilter("devel-file-in-non-devel-package.*/opt/gdevelop/CppPlatform/Extensions/include/.*")
addFilter("devel-file-in-non-devel-package.*/opt/gdevelop/CppPlatform/Sources/.*")

View File

@@ -1,123 +0,0 @@
Name: gdevelop
Version: MACRO_GD_VERSION
Release: MACRO_PACKAGE_REV
Summary: GDevelop game creator
Group: extra
License: GPL LGPL MIT
URL: http://www.compilgames.net
Source0: gdevelop_%{version}.orig.tar.gz
Source100: gdevelop-rpmlintrc
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: git rsync curl gcc-c++ cmake p7zip glew-devel libsndfile-devel openal-soft-devel desktop-file-utils
%if 0%{?fedora}
BuildRequires: systemd-devel libjpeg-turbo-devel gtk2-devel wxGTK3-devel libX11-devel
%else
BuildRequires: update-desktop-files libudev-devel libjpeg8-devel wxWidgets-3_0-devel xorg-x11-devel
%endif
Requires: gcc-c++ p7zip
#Exlude SFML libs (as they are private)
%global privlibs libsfml-audio|libsfml-graphics|libsfml-network|libsfml-system|libsfml-window|libGDCore|libGDCpp|libGDJS
%global __provides_exclude ^(%{privlibs})\\.so.*
%global __requires_exclude ^(%{privlibs})\\.so.*
#Exclude Extensions directory from auto dep (so they are not provided)
%global __requires_exclude_from ^%{buildroot}/opt/gdevelop/CppPlatform/Extensions/.*$
%global __provides_exclude_from ^%{buildroot}/opt/gdevelop/CppPlatform/Extensions/.*$
%description
GDevelop is a full featured, open source game development software,
allowing to create HTML5 and native games without needing any knowledge
in a specific programming language. All the game logic is made thanks
to an intuitive and powerful event based system.
%prep
%setup -q -n gdevelop-%{version}
%build
#Configuration
cd Binaries
rm -rf .build
mkdir .build
cd .build
#Fedora's wx-config name contains the version (wx-config-3.0 instead of wx-config and wxrc-3.0 instead of wxrc-3.0)
%if 0%{?fedora}
cmake -DNO_UPDATE_CHECKER=TRUE -DwxWidgets_CONFIG_EXECUTABLE=/usr/bin/wx-config-3.0 -DwxWidgets_wxrc_EXECUTABLE=/usr/bin/wxrc-3.0 ../..
%else
cmake -DNO_UPDATE_CHECKER=TRUE ../..
%endif
#Build the whole project
make %{?_smp_mflags}
%install
rm -rf $RPM_BUILD_ROOT
cd Binaries/.build
make install DESTDIR=$RPM_BUILD_ROOT
#Remove sfml installed libs
rm -rf $RPM_BUILD_ROOT/usr/local
%if 0%{?fedora}
desktop-file-validate %{buildroot}%{_datadir}/applications/gdevelop.desktop
%else
%suse_update_desktop_file gdevelop
%endif
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root,-)
#GDevelop files
/opt/gdevelop
#Launch script
/usr/bin/gdevelop
#Desktop file
/usr/share/applications/gdevelop.desktop
#Icons
/usr/share/icons/hicolor/16x16/apps/GDevelop.png
/usr/share/icons/hicolor/16x16/mimetypes/applications-x-gdevelop-project.png
/usr/share/icons/hicolor/24x24/apps/GDevelop.png
/usr/share/icons/hicolor/24x24/mimetypes/applications-x-gdevelop-project.png
/usr/share/icons/hicolor/32x32/apps/GDevelop.png
/usr/share/icons/hicolor/32x32/mimetypes/applications-x-gdevelop-project.png
/usr/share/icons/hicolor/48x48/apps/GDevelop.png
/usr/share/icons/hicolor/48x48/mimetypes/applications-x-gdevelop-project.png
/usr/share/icons/hicolor/64x64/apps/GDevelop.png
/usr/share/icons/hicolor/64x64/mimetypes/applications-x-gdevelop-project.png
/usr/share/icons/hicolor/128x128/apps/GDevelop.png
/usr/share/icons/hicolor/128x128/mimetypes/applications-x-gdevelop-project.png
/usr/share/icons/hicolor/256x256/apps/GDevelop.png
/usr/share/icons/hicolor/256x256/mimetypes/applications-x-gdevelop-project.png
/usr/share/icons/hicolor/scalable/apps/GDevelop.svg
/usr/share/icons/hicolor/scalable/mimetypes/applications-x-gdevelop-project.svg
/usr/share/icons/hicolor/scalable/apps/GDevelop-lowres.svg
/usr/share/icons/hicolor/scalable/mimetypes/applications-x-gdevelop-project-lowres.svg
#Mime
/usr/share/mime/packages/gdevelop.xml
%post
update-mime-database %{_datadir}/mime >/dev/null 2>&1 || :
update-desktop-database >/dev/null 2>&1 || :
touch --no-create %{_datadir}/icons/hicolor >/dev/null 2>&1 || :
%postun
update-mime-database %{_datadir}/mime >/dev/null 2>&1 || :
update-desktop-database >/dev/null 2>&1 || :
if [ $1 -eq 0 ] ; then
touch --no-create %{_datadir}/icons/hicolor >/dev/null 2>&1
gtk-update-icon-cache %{_datadir}/icons/hicolor >/dev/null 2>&1 || :
fi
#Keep the changelog at the end as the packaging script adds the changelog at the end
%changelog

4
Binaries/README.md Normal file
View File

@@ -0,0 +1,4 @@
This is the directory where native/WebAssembly binaries from GDCore, GDCpp and GDJS are produced.
In particular, the extensions and/or the JS platform files will be
created into Output/Release_*OSNAME* with *OSNAME* being Windows, Linux or Darwin.

View File

@@ -1,4 +0,0 @@
This is the directory where binaries are produced.
In particular, the extensions and/or the JS platform files will be
created into Output/Release_OSNAME with OSNAME being Windows, Linux or Darwin.

View File

@@ -1,110 +0,0 @@
; Inno Setup installation script for GDevelop 4.
[Setup]
AppName=GDevelop
AppVersion=4.0
AppPublisher=Florian Rival
AppPublisherURL=http://www.compilgames.net
AppSupportURL=http://www.forum.compilgames.net
AppUpdatesURL=http://www.compilgames.net
DefaultDirName={pf}/GDevelop
DefaultGroupName=GDevelop
AllowNoIcons=yes
LicenseFile=..\Output\Release_Windows\License-en.rtf
InfoBeforeFile=..\Output\Release_Windows\Informations-en.rtf
OutputDir=.\
OutputBaseFilename=gd4097
Compression=lzma
SolidCompression=yes
SetupIconFile=..\Output\Release_Windows\res\icon.ico
VersionInfoVersion=4.0
WizardImageFile=Setup bitmap\wizbmp.bmp
WizardSmallImageFile=Setup bitmap/smallicon.bmp
AppCopyright=2008-2018 Florian Rival
VersionInfoCompany=Florian Rival
VersionInfoDescription=GDevelop setup
VersionInfoCopyright=2008-2018 Florian Rival
VersionInfoProductName=GDevelop
VersionInfoProductVersion=4.0
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl";
Name: "french"; MessagesFile: "compiler:Languages\French.isl"; LicenseFile: "..\Output\Release_Windows\License-fr.rtf"; InfoBeforeFile: "..\Output\Release_Windows\Informations-fr.rtf"
Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl";
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl";
Name: "portuguese"; MessagesFile: "compiler:Languages\Portuguese.isl";
Name: "german"; MessagesFile: "compiler:Languages\German.isl";
Name: "chinese"; MessagesFile: "..\Packaging\innosetup-languages\ChineseSimplified.isl";
Name: "italian"; MessagesFile: "compiler:Languages\Italian.isl";
Name: "finnish"; MessagesFile: "compiler:Languages\Finnish.isl";
Name: "polish"; MessagesFile: "compiler:Languages\Polish.isl";
Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl";
[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags:
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
[Components]
Name: "main"; Description: "GDevelop"; Types: full compact custom; Flags: fixed
Name: "example"; Description: "Exemples"; Types: full custom; Languages: french
Name: "example"; Description: "Examples"; Types: full custom; Languages: english russian italian polish chinese dutch finnish
Name: "example"; Description: "Ejemplos"; Types: full custom; Languages: spanish
Name: "res"; Description: "Ressources (Images, sons...)"; Types: full custom; Languages: french
Name: "res"; Description: "Resources (images, sounds...)"; Types: full custom; Languages: english russian italian polish chinese dutch finnish
Name: "res"; Description: "Recursos (im<69>genes, sonidos ...)"; Types: full custom; Languages: spanish
[Files]
Source: ..\Output\Release_Windows\GDIDE.exe; DestDir: {app}; Flags: ignoreversion
Source: ..\Output\Release_Windows\*; DestDir: {app}; Flags: ignoreversion
Source: ..\Output\Release_Windows\Templates\*; DestDir: {app}\Templates; Flags: ignoreversion createallsubdirs recursesubdirs; Components: main
Source: ..\Output\Release_Windows\res\*; DestDir: {app}\res; Flags: ignoreversion createallsubdirs recursesubdirs; Components: main
Source: ..\Output\Release_Windows\CppPlatform\*; DestDir: {app}\CppPlatform; Flags: ignoreversion createallsubdirs recursesubdirs; Components: main
Source: ..\Output\Release_Windows\JsPlatform\*; DestDir: {app}\JsPlatform; Flags: ignoreversion createallsubdirs recursesubdirs; Components: main
Source: ..\Output\Release_Windows\locale\*; DestDir: {app}\locale; Flags: ignoreversion createallsubdirs recursesubdirs; Components: main
Source: ..\Output\Release_Windows\Examples\*; DestDir: {app}\Examples; Flags: ignoreversion createallsubdirs recursesubdirs; Components: example
Source: ..\Output\Release_Windows\Free resources\*; DestDir: {app}\Free resources; Flags: ignoreversion createallsubdirs recursesubdirs; Components: res
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
Source: ..\Output\Release_Windows\icon.ico; DestDir: {app}; Flags: ignoreversion
Source: ..\Output\Release_Windows\SelectLanguage-en.cfg; DestDir: {userdocs}\..\.GDevelop; Flags: ignoreversion createallsubdirs recursesubdirs; DestName: SelectLanguage.cfg; Languages: english; Components: main
Source: ..\Output\Release_Windows\SelectLanguage-fr.cfg; DestDir: {userdocs}\..\.GDevelop; Flags: ignoreversion createallsubdirs recursesubdirs; DestName: SelectLanguage.cfg; Languages: french ; Components: main
Source: ..\Output\Release_Windows\SelectLanguage-es.cfg; DestDir: {userdocs}\..\.GDevelop; Flags: ignoreversion createallsubdirs recursesubdirs; DestName: SelectLanguage.cfg; Languages: spanish ; Components: main
Source: ..\Output\Release_Windows\SelectLanguage-ru.cfg; DestDir: {userdocs}\..\.GDevelop; Flags: ignoreversion createallsubdirs recursesubdirs; DestName: SelectLanguage.cfg; Languages: russian ; Components: main
Source: ..\Output\Release_Windows\SelectLanguage-de.cfg; DestDir: {userdocs}\..\.GDevelop; Flags: ignoreversion createallsubdirs recursesubdirs; DestName: SelectLanguage.cfg; Languages: german ; Components: main
Source: ..\Output\Release_Windows\SelectLanguage-pt.cfg; DestDir: {userdocs}\..\.GDevelop; Flags: ignoreversion createallsubdirs recursesubdirs; DestName: SelectLanguage.cfg; Languages: portuguese ; Components: main
Source: ..\Output\Release_Windows\SelectLanguage-pl.cfg; DestDir: {userdocs}\..\.GDevelop; Flags: ignoreversion createallsubdirs recursesubdirs; DestName: SelectLanguage.cfg; Languages: polish ; Components: main
Source: ..\Output\Release_Windows\SelectLanguage-zh.cfg; DestDir: {userdocs}\..\.GDevelop; Flags: ignoreversion createallsubdirs recursesubdirs; DestName: SelectLanguage.cfg; Languages: chinese ; Components: main
Source: ..\Output\Release_Windows\SelectLanguage-it.cfg; DestDir: {userdocs}\..\.GDevelop; Flags: ignoreversion createallsubdirs recursesubdirs; DestName: SelectLanguage.cfg; Languages: italian ; Components: main
Source: ..\Output\Release_Windows\SelectLanguage-nl.cfg; DestDir: {userdocs}\..\.GDevelop; Flags: ignoreversion createallsubdirs recursesubdirs; DestName: SelectLanguage.cfg; Languages: dutch ; Components: main
Source: ..\Output\Release_Windows\SelectLanguage-fi.cfg; DestDir: {userdocs}\..\.GDevelop; Flags: ignoreversion createallsubdirs recursesubdirs; DestName: SelectLanguage.cfg; Languages: finnish ; Components: main
[Icons]
Name: {group}\GDevelop; Filename: {app}\GDIDE.exe; WorkingDir: {app}
Name: {group}\Aide; Filename: http://www.wiki.compilgames.net ;Languages: french;
Name: {group}\Help; Filename: http://www.wiki.compilgames.net; Languages: english;
Name: {group}\Tutoriel; Filename: http://www.wiki.compilgames.net/doku.php/game_develop/tutoriels; Languages: french;
Name: {group}\Tutorial; Filename: http://www.wiki.compilgames.net/doku.php/en/game_develop/tutorials; Languages: english;
Name: {group}\{cm:ProgramOnTheWeb,GDevelop}; Filename: http://www.compilgames.net
Name: {group}\{cm:UninstallProgram,GDevelop}; Filename: {uninstallexe}
Name: {commondesktop}\GDevelop; Filename: {app}\GDIDE.exe; WorkingDir: {app}; Tasks: desktopicon
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\GDevelop; Filename: {app}\GDIDE.exe; WorkingDir: {app}; Tasks: quicklaunchicon
[Run]
Filename: {app}\GDIDE.exe; Description: {cm:LaunchProgram,GDevelop}; Flags: nowait postinstall skipifsilent
[Registry]
Root: HKCR; SubKey: .gdg; ValueType: string; ValueData: GDevelop Game; Flags: uninsdeletekey
Root: HKCR; SubKey: GDevelop Game; ValueType: string; ValueData: Game created with GDevelop; Flags: uninsdeletekey
Root: HKCR; SubKey: GDevelop Game\Shell\Open\Command; ValueType: string; ValueData: """{app}/GDIDE.exe"" ""%1"""; Flags: uninsdeletevalue
Root: HKCR; Subkey: GDevelop Game\DefaultIcon; ValueType: string; ValueData: {app}\icon.ico,-1; Flags: uninsdeletevalue
[InstallDelete]
Type: files; Name: "{app}\GDEditor.exe"
;Prevent crashes with incompatible extensions:
Type: files; Name: "{app}\CppPlatform\Extensions\TextBoxObject.xgdwe"
;Old extensions:
Type: files; Name: "{app}\CppPlatform\Extensions\AStarBehavior.xgdwe"
Type: filesandordirs; Name: "{app}\Extensions"
Type: filesandordirs; Name: "{app}\include"
Type: filesandordirs; Name: "{app}\Runtime"

View File

@@ -1,2 +0,0 @@
This is the directory where packaged binaries ready for release are produced.
See also Binaries/Packaging.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="ISO-8859-1" ?>
<News>
<Version Major="4" Minor="0" Build="92" Revision="0"/>
<Info Info="La version 4.0.92 est disponible.&#x0A;&#x0A;(Expérimental) Exportation des jeux HTML5 vers Android/iOS/Mac/Windows avec le moteur Cocos2d-JS.&#x0A;(Expérimental) Exportation des jeux natifs vers Android.&#x0A;&#x0A;Les objets avec le comportement 'Objet se déplaçant sur des plateformes' peuvent maintenant agripper les rebords des plateformes - il faut activer l'option dans le comportement de l'objet.&#x0A;Les animations des objets Sprite peuvent maintenant être nommés. Une condition et action ont été ajoutées pour utiliser ces noms.&#x0A;Ajout du support basique d'effets pour les jeux HTML5. ✨ Pour le moment, 3 effets sont disponibles et peuvent être attribués au calques d'une scène. &#x0A;Amélioration des performances des jeux HTML5&#x0A;Correction et améliorations pour les jeux HTML5 exportés avec Cocos2d-JS.&#x0A;Lors de la recherche dans les évènements, l'évènement surlignés est correctement affiché en dépliant au besoin les groupes/évènements repliés.&#x0A;Correction du rendu sur Windows avec les thèmes à fort contraste." Lien="http://compilgames.net"/>
<CommunityNews text="GDevApp est une web app de création de jeux basée sur GDevelop : venez essayer la plus avancée des applications online de création de jeux. Compatible avec les tablettes et fournie avec des superbes packs de graphismes pré-préparés." link1="https://github.com/4ian/GD" linkLabel1="GDevelop sur GitHub" link2="https://gdevapp.com?utm_source=software&amp;utm_medium=link_fr&amp;utm_campaign=launch" linkLabel2="Tester GDevApp, la nouvelle app de création de jeux"/>
</News>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="ISO-8859-1" ?>
<News>
<Version Major="4" Minor="0" Build="92" Revision="0"/>
<Info Info="Version 4.0.92 is available.&#x0A;&#x0A;New experimental option to export HTML5 games to Android/iOS/Mac/Windows using the Cocos2d as the underlying game engine.&#x0A;&#x0A; New experimental option to export native games to Android.&#x0A;&#x0A;Platformer object now have an option allowing them to grab platform ledges. Activate this option in the behavior and be sure to also enable this on platforms.&#x0A;Animations of Sprite objects can now be named. Specific actions/conditions are also available.&#x0A;Add basic support for effects for HTML5 games. For now, there are 3 simple effects (Night, LightNight, Sepia) and you can apply one of them on each layer of a scene.&#x0A;Performance improvement for HTML5 games.&#x0A;Fix text rendering when using a custom font, when exporting HTML5 games with Cocos2d-JS.&#x0A;Add support for non-smoothed texture for HTML5 games using Cocos2d-JS.&#x0A;Add support for storage actions when for HTML5 games using Cocos2d-JS on Android/iOS.&#x0A;When searching in events, events that are matched are unfolded.&#x0A;Provide compatibility with Windows high contrast themes (thanks @RandomShaper!)&#x0A;Many fixes" Lien="http://compilgames.net"/>
<CommunityNews text="GDevelop has a new website! Help us to translate it to your language by going on the Crowdin project.&#x0A;&#x0A;GDevApp is an online game creator based on GDevelop: Go try the most advanced game creation web app. Compatible with tablets and bundled with awesome graphics assets." link1="https://crowdin.com/project/gdevelop-website/" linkLabel1="Help translate GD website" link2="https://gdevapp.com?utm_source=software&amp;utm_medium=link_en&amp;utm_campaign=launch" linkLabel2="Try GDevApp, the online game creator based on GD"/>
</News>

View File

@@ -1,167 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<XML_DIZ_INFO>
<MASTER_PAD_VERSION_INFO>
<MASTER_PAD_VERSION>3.11</MASTER_PAD_VERSION>
<MASTER_PAD_EDITOR>PADManager 2.0.69</MASTER_PAD_EDITOR>
<MASTER_PAD_EDITOR_URL>http://robosoft.rudenko.com</MASTER_PAD_EDITOR_URL>
<MASTER_PAD_INFO>Portable Application Description, or PAD for short, is a data set that is used by shareware authors to disseminate information to anyone interested in their software products. To find out more go to http://www.asp-shareware.org/pad</MASTER_PAD_INFO>
</MASTER_PAD_VERSION_INFO>
<RoboSoft>
<Company_UIN>CMP-00C2117CDC1</Company_UIN>
<Company_Description></Company_Description>
<Product_UIN>APP-00C211F181F</Product_UIN>
<Publish_on_CD>FALSE</Publish_on_CD>
<RSProductType></RSProductType>
<Search_String></Search_String>
<Press_Release_Search_String></Press_Release_Search_String>
<NewsFeed_Search_String></NewsFeed_Search_String>
<Search_Engine_Search_String></Search_Engine_Search_String>
<Web_Directories_Search_String></Web_Directories_Search_String>
<Search_String_Unique></Search_String_Unique>
<Comments_For_Reviewer></Comments_For_Reviewer>
<Backlink></Backlink>
</RoboSoft>
<Company_Info>
<Company_Name>Florian Rival</Company_Name>
<Address_1>9, rue Alphonse Daudet</Address_1>
<Address_2></Address_2>
<City_Town>Muzillac</City_Town>
<State_Province>France</State_Province>
<Zip_Postal_Code>56190</Zip_Postal_Code>
<Country>France</Country>
<Company_WebSite_URL>http://www.compilgames.net</Company_WebSite_URL>
<Contact_Info>
<Contact_First_Name>Florian</Contact_First_Name>
<Contact_Last_Name>Rival</Contact_Last_Name>
<Contact_Email>Florian.rival@gmail.com</Contact_Email>
<Author_First_Name>Florian</Author_First_Name>
<Author_Last_Name>Rival</Author_Last_Name>
<Author_Email>Florian.rival@gmail.com</Author_Email>
</Contact_Info>
<Support_Info>
<Sales_Email>Florian.rival@gmail.com</Sales_Email>
<Support_Email>Florian.rival@gmail.com</Support_Email>
<General_Email>Florian.rival@gmail.com</General_Email>
<Sales_Phone></Sales_Phone>
<Support_Phone></Support_Phone>
<General_Phone></General_Phone>
<Fax_Phone></Fax_Phone>
</Support_Info>
</Company_Info>
<NewsFeed>
<NewsFeed_FORM>Y</NewsFeed_FORM>
<NewsFeed_VERSION>1.0</NewsFeed_VERSION>
<NewsFeed_URL>http://Submit-Everywhere.com/extensions/NewsFeed.htm</NewsFeed_URL>
<NewsFeed_DESCRIPTION>This PAD extension allows you to add your RSS and Atom news feeds info into your PAD file. This info can be used by RSS feed submission software or by feed directories themselves.</NewsFeed_DESCRIPTION>
<NewsFeed_Type>RSS 0.90</NewsFeed_Type>
<NewsFeed_Language>English</NewsFeed_Language>
<NewsFeed_Purpose>News</NewsFeed_Purpose>
<NewsFeed_Author_Email>Florian.rival@gmail.com</NewsFeed_Author_Email>
<NewsFeed_Author_First_Name>Florian</NewsFeed_Author_First_Name>
<NewsFeed_Author_Last_Name>Rival</NewsFeed_Author_Last_Name>
<NewsFeed_Feed_URL></NewsFeed_Feed_URL>
<NewsFeed_Site_Name></NewsFeed_Site_Name>
<NewsFeed_Site_URL></NewsFeed_Site_URL>
<NewsFeed_Title></NewsFeed_Title>
<NewsFeed_Description_70></NewsFeed_Description_70>
<NewsFeed_Description_250></NewsFeed_Description_250>
</NewsFeed>
<Program_Info>
<Program_Name>GDevelop</Program_Name>
<Program_Version>3</Program_Version>
<Program_Release_Month>07</Program_Release_Month>
<Program_Release_Day>11</Program_Release_Day>
<Program_Release_Year>2013</Program_Release_Year>
<Program_Cost_Dollars>0</Program_Cost_Dollars>
<Program_Type>Freeware</Program_Type>
<Program_Release_Status>Major Update</Program_Release_Status>
<Program_Install_Support>Install and Uninstall</Program_Install_Support>
<Program_OS_Support>WinXP,WinVista,WinVista x64,Win7 x32,Win7 x64,Win2000,Linux,Linux Gnome</Program_OS_Support>
<Program_Language>English,French</Program_Language>
<Program_Change_Info>Support for creating web based games (HTML5 games) that can be played on any modern browser or handheld device.</Program_Change_Info>
<Program_System_Requirements>Windows 2000, XP, Vista, 7 or Ubuntu</Program_System_Requirements>
<Program_Category_Class>Development::Other</Program_Category_Class>
<File_Info>
<File_Size_Bytes>46789632</File_Size_Bytes>
<File_Size_K>45693</File_Size_K>
<File_Size_MB>44.62</File_Size_MB>
<Filename_Versioned></Filename_Versioned>
<Filename_Previous></Filename_Previous>
<Filename_Generic></Filename_Generic>
<Filename_Long></Filename_Long>
</File_Info>
<Expire_Info>
<Has_Expire_Info>N</Has_Expire_Info>
<Expire_Based_On>Days</Expire_Based_On>
<Expire_Count></Expire_Count>
<Expire_Other_Info></Expire_Other_Info>
<Expire_Month></Expire_Month>
<Expire_Day></Expire_Day>
<Expire_Year></Expire_Year>
</Expire_Info>
<Program_Categories>Programming :: C &amp; C++ &amp; C#,Programming :: IDEs &amp; Coding Utilities,Games :: Gaming Tools</Program_Categories>
<Limitations>No limitations</Limitations>
<Program_Cost_Other_Code></Program_Cost_Other_Code>
<Program_Cost_Other></Program_Cost_Other>
<Awards></Awards>
<Program_Specific_Category></Program_Specific_Category>
<Includes_JAVA_VM></Includes_JAVA_VM>
<Includes_VB_Runtime></Includes_VB_Runtime>
<Includes_DirectX></Includes_DirectX>
</Program_Info>
<Web_Info>
<Application_URLs>
<Application_Info_URL>http://www.compilgames.net</Application_Info_URL>
<Application_Order_URL>http://www.ecompilgames.net</Application_Order_URL>
<Application_Screenshot_URL>http://www.compilgames.net/images/GameDevelop/Screen800600.jpg</Application_Screenshot_URL>
<Application_Icon_URL>http://www.compilgames.net/images/GameDevelop/icon32.gif</Application_Icon_URL>
<Application_XML_File_URL>http://www.compilgames.net/dl/gdpad.xml</Application_XML_File_URL>
</Application_URLs>
<Download_URLs>
<Primary_Download_URL>http://www.compilgames.net/dl/gd.exe</Primary_Download_URL>
<Secondary_Download_URL></Secondary_Download_URL>
<Additional_Download_URL_1></Additional_Download_URL_1>
<Additional_Download_URL_2></Additional_Download_URL_2>
</Download_URLs>
</Web_Info>
<Permissions>
<Distribution_Permissions>GDevelop can be freely distributed over the internet in an unchanged form.</Distribution_Permissions>
<EULA>· GDevelop
GDevelop is a freeware, meaning it is totally free.
-You can use the software, for personal or commercial use.
-The software is provided 'as-is', without any express or implied warranty.
-You can distribute the software to anybody provided you don't require money for it, you don't claim to be the author and you distribute the entire software with its installer.
-You must not try to decompile the software.
· Games created with GDevelop
-The author of GDevelop is not liable for games made with the software.
-If you create a game with GDevelop, an acknowledgment in the game documentation would be appreciated but is not required.
· If you have any questions
Contact the author : CompilGames@gmail.com
Go on our website : http://www.compilgames.net</EULA>
</Permissions>
<Program_Descriptions>
<English>
<Keywords>Development, creation, game, making, maker, programming, IDE, 2D, HTML5, 3D, develop, physics, build, create, C++</Keywords>
<Char_Desc_45>Free game development software</Char_Desc_45>
<Char_Desc_80>Free game creation software, allowing to create any kind of 2D games.</Char_Desc_80>
<Char_Desc_250>GDevelop is a free game creation software, allowing to make games for the web ( HTML5 ) or for Windows and Linux. No programming or coding skill is required! It is easy to use and powerful enough for advanced users.</Char_Desc_250>
<Char_Desc_450>GDevelop is a free game creation software, allowing to make games for the web ( HTML5 ) or for Windows and Linux. No programming or coding skill is required! It is easy to use and powerful enough for advanced users. All the game logic is made thanks to a powerful and intuitive events system. Many features are available: Physics, dynamic lights, particle systems, networking...</Char_Desc_450>
<Char_Desc_2000>GDevelop is a free game creation software, allowing to make games for the web ( HTML5 ) or for Windows and Linux. No programming or coding skill is required! It is easy to use and powerful enough for advanced users.
The creation under GDevelop is entirely visual : Creation of objects, image insertion, objects positioning...
The user interface allows you to preview your game and test it inside the editor, by simply clicking on a single button.
All the game logic is created using events, allowing to launch actions if some conditions are filled. An entire game can be created without using a single line of code as events are both easy to use and flexible, thanks to sub-events and custom events types like loop events or functions-like events.
Moreover, events are compiled by GDevelop to machine code, just like ordinary programming language used in commercial games: GDevelop is the only game development software which combine the simplicity of creation with the power of professional programming languages.
GDevelop provides you with many features for your project : Dynamic lights and particle systems are available trought dedicated objects, actions and conditions to create multiplayer games are available, 3D objects can be used to render buildings, realistic physics behaviour can be added to objects thanks to the Physics behavior.
Many of these features are provided thanks to official open source extensions, and external developers can also develop extensions to enhance GDevelop capabilities.</Char_Desc_2000>
</English>
</Program_Descriptions>
</XML_DIZ_INFO>

View File

@@ -17,12 +17,13 @@ endmacro()
gd_set_option(BUILD_CORE TRUE BOOL "TRUE to build GDevelop Core library, FALSE to use the already compiled binaries")
gd_set_option(BUILD_GDCPP TRUE BOOL "TRUE to build GDevelop C++ Platform")
gd_set_option(BUILD_GDJS TRUE BOOL "TRUE to build GDevelop JS Platform")
gd_set_option(BUILD_IDE TRUE BOOL "TRUE to build the IDE")
gd_set_option(BUILD_EXTENSIONS TRUE BOOL "TRUE to build the extensions")
gd_set_option(BUILD_TESTS FALSE BOOL "TRUE to build the tests")
gd_set_option(NO_GUI FALSE BOOL "TRUE to build without wxWidgets GUI")
gd_set_option(FULL_VERSION_NUMBER TRUE BOOL "TRUE to build GDevelop with its full version number (lastest tag + commit hash), FALSE to only use the lastest tag (avoid rebulding many source file when developping)")
# Disable deprecated code
set(NO_GUI TRUE CACHE BOOL "" FORCE) #Force disable old GUI related code.
#Setting up installation directory, for Linux (has to be done before "project" command).
IF(NOT WIN32)
if (NOT APPLE)
@@ -55,9 +56,7 @@ IF ("${CMAKE_BUILD_TYPE}" STREQUAL "")
set(CMAKE_BUILD_TYPE Release)
ENDIF()
IF (EMSCRIPTEN)
set(NO_GUI TRUE CACHE BOOL "" FORCE) #Force disable gui when compiling with emscripten.
set(BUILD_GDCPP FALSE CACHE BOOL "" FORCE) #Force disable GDC++ when compiling with emscripten.
set(BUILD_IDE FALSE CACHE BOOL "" FORCE) #Force disable IDE when compiling with emscripten.
ENDIF()
IF("${CMAKE_BUILD_TYPE}" STREQUAL "Release" AND NOT WIN32 AND CMAKE_COMPILER_IS_GNUCXX)
@@ -69,9 +68,9 @@ include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=gnu++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=gnu++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
elseif(COMPILER_SUPPORTS_CXX0X)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x")
else()
message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support (with GNU extensions). Please use a different C++ compiler.")
endif()
@@ -81,23 +80,19 @@ set(GD_base_dir ${CMAKE_CURRENT_SOURCE_DIR})
#Add all the CMakeLists:
ADD_SUBDIRECTORY(Version)
ADD_SUBDIRECTORY(ExtLibs)
IF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/Core/CMakeLists.txt" AND BUILD_CORE)
IF(BUILD_CORE)
ADD_SUBDIRECTORY(Core)
ENDIF()
IF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/GDJS/CMakeLists.txt" AND BUILD_GDJS)
IF(BUILD_GDJS)
ADD_SUBDIRECTORY(GDJS)
ENDIF()
IF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/GDCpp/CMakeLists.txt" AND BUILD_GDCPP)
IF(BUILD_GDCPP)
ADD_SUBDIRECTORY(GDCpp)
ENDIF()
IF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/IDE/CMakeLists.txt" AND BUILD_IDE)
ADD_SUBDIRECTORY(IDE)
ENDIF()
IF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/GDevelop.js/CMakeLists.txt" AND EMSCRIPTEN)
ADD_SUBDIRECTORY(GDevelop.js)
ENDIF()
IF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/Extensions/CMakeLists.txt" AND BUILD_EXTENSIONS)
IF(BUILD_EXTENSIONS)
ADD_SUBDIRECTORY(Extensions)
ENDIF()

View File

@@ -15,14 +15,6 @@ set(GDCORE_lib_dir ${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SY
#Dependencies on external libraries:
###
include_directories(${sfml_include_dir})
IF(WIN32) #Special case for wxWidgets on Windows
include_directories(${wxwidgets_include_dir})
ELSEIF (NOT EMSCRIPTEN AND NOT NO_GUI)
find_package(wxWidgets COMPONENTS core base adv net ribbon stc aui propgrid richtext html xrc REQUIRED)
include( "${wxWidgets_USE_FILE}" )
include_directories(${GTK_INCLUDE_DIRS})
link_directories(${GTK_LIBRARY_DIRS})
ENDIF(WIN32)
#Defines
###
@@ -30,14 +22,8 @@ add_definitions( -DGD_IDE_ONLY )
IF (EMSCRIPTEN)
add_definitions( -DEMSCRIPTEN )
ENDIF()
IF (NO_GUI)
add_definitions( -DGD_NO_WX_GUI )
ENDIF()
IF(CMAKE_BUILD_TYPE MATCHES "Debug")
add_definitions( -DDEBUG )
IF(WIN32)
add_definitions( -D__WXDEBUG__ )
ENDIF(WIN32)
ELSE()
add_definitions( -DRELEASE )
ENDIF()
@@ -45,11 +31,7 @@ ENDIF()
IF(WIN32)
add_definitions( -DWINDOWS )
add_definitions( "-DGD_CORE_API=__declspec(dllexport)" )
add_definitions( -D__GNUWIN32__ )
add_definitions( -D__WXMSW__ )
add_definitions( -DwxUSE_UNICODE=1 )
add_definitions( -DWXUSINGDLL )
ELSE()
IF(APPLE)
add_definitions( -DMACOS )
@@ -58,9 +40,6 @@ ELSE()
ENDIF()
add_definitions( -DGD_API= )
add_definitions( -DGD_CORE_API= )
IF (NOT NO_GUI)
add_definitions(${GTK_CFLAGS_OTHER})
ENDIF()
ENDIF(WIN32)
#The target
@@ -68,10 +47,6 @@ ENDIF(WIN32)
include_directories(.)
file(GLOB_RECURSE source_files GDCore/*)
IF(NO_GUI)
list(REMOVE_ITEM source_files "${CMAKE_CURRENT_SOURCE_DIR}/GDCore/IDE/Dialogs/GDCoreDialogs.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/GDCore/IDE/Dialogs/GDCoreDialogs.h" "${CMAKE_CURRENT_SOURCE_DIR}/GDCore/IDE/Dialogs/GDCoreDialogs_dialogs_bitmaps.cpp")
ENDIF()
file(GLOB_RECURSE formatted_source_files tests/* GDCore/Events/* GDCore/Extensions/* GDCore/IDE/* GDCore/Project/* GDCore/Serialization/* GDCore/Tools/*)
list(REMOVE_ITEM formatted_source_files "${CMAKE_CURRENT_SOURCE_DIR}/GDCore/IDE/Dialogs/GDCoreDialogs.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/GDCore/IDE/Dialogs/GDCoreDialogs.h" "${CMAKE_CURRENT_SOURCE_DIR}/GDCore/IDE/Dialogs/GDCoreDialogs_dialogs_bitmaps.cpp")
gd_add_clang_utils(GDCore "${formatted_source_files}")
@@ -95,8 +70,6 @@ IF(EMSCRIPTEN)
#Nothing.
ELSE()
target_link_libraries(GDCore ${sfml_LIBRARIES})
target_link_libraries(GDCore ${wxWidgets_LIBRARIES})
target_link_libraries(GDCore ${GTK_LIBRARIES})
ENDIF()
#Tests
@@ -112,6 +85,4 @@ if(BUILD_TESTS)
set_target_properties(GDCore_tests PROPERTIES BUILD_WITH_INSTALL_RPATH FALSE) #Allow finding dependencies directly from build path on Mac OS X.
target_link_libraries(GDCore_tests GDCore)
target_link_libraries(GDCore_tests ${sfml_LIBRARIES})
target_link_libraries(GDCore_tests ${wxWidgets_LIBRARIES})
target_link_libraries(GDCore_tests ${GTK_LIBRARIES})
endif()

View File

@@ -1,519 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="GDevelop Core" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug - Edittime">
<Option output="../IDE/bin/debug/GDCore.dll" imp_lib="$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).a" def_file="$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME)" prefix_auto="1" extension_auto="0" />
<Option object_output="obj/Debug/" />
<Option type="3" />
<Option compiler="gcc" />
<Option createDefFile="1" />
<Option createStaticLib="1" />
<Compiler>
<Add option="-g" />
<Add option="-DGD_CORE_API=__declspec(dllexport)" />
<Add option="-DDEBUG" />
<Add option="-DWINDOWS" />
<Add option="-D__GNUWIN32__" />
<Add option="-D__WXMSW__" />
<Add option="-D__WXDEBUG__" />
<Add option="-DwxUSE_UNICODE=1" />
<Add option="-DWXUSINGDLL" />
<Add option="-DBOOST_DISABLE_ASSERTS" />
<Add directory="../ExtLibs/wxwidgets/include" />
<Add directory="../ExtLibs/wxwidgets/lib/gcc_dll/mswud" />
</Compiler>
<Linker>
<Add option="-lmingw32" />
<Add option="-lopengl32" />
<Add option="-limm32" />
<Add option="-lcomctl32" />
<Add option="-lglu32" />
<Add option="-lws2_32" />
<Add option="-lgdi32" />
<Add option="-lwinmm" />
<Add option="-lwxmsw30ud_xrc" />
<Add option="-lwxmsw30ud_stc" />
<Add option="-lwxmsw30ud_richtext" />
<Add option="-lwxmsw30ud_ribbon" />
<Add option="-lwxmsw30ud_propgrid" />
<Add option="-lwxmsw30ud_aui" />
<Add option="-lwxmsw30ud_adv" />
<Add option="-lwxmsw30ud_html" />
<Add option="-lwxmsw30ud_core" />
<Add option="-lwxbase30ud_xml" />
<Add option="-lwxbase30ud_net" />
<Add option="-lwxexpatd" />
<Add option="-lwxbase30ud" />
<Add option="-lwxpngd" />
<Add option="-lwxjpegd" />
<Add option="-lwxzlibd" />
<Add option="-lwxtiffd" />
<Add option="-lsfml-audio-d" />
<Add option="-lsfml-graphics-d" />
<Add option="-lsfml-window-d" />
<Add option="-lsfml-network-d" />
<Add option="-lsfml-system-d" />
<Add directory="../ExtLibs/wxwidgets/lib/gcc_dll" />
<Add directory="../ExtLibs/wxwidgets/lib/gcc_dll/mswud" />
<Add directory="../ExtLibs/SFML/build-mingw-debug/lib" />
</Linker>
</Target>
<Target title="Development - Edittime">
<Option output="../IDE/bin/dev/GDCore.dll" imp_lib="$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).a" def_file="$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME)" prefix_auto="1" extension_auto="0" />
<Option object_output="obj/Dev/" />
<Option type="3" />
<Option compiler="gcc" />
<Option createDefFile="1" />
<Option createStaticLib="1" />
<Compiler>
<Add option="-O2" />
<Add option="-DGD_CORE_API=__declspec(dllexport)" />
<Add option="-DDEV" />
<Add option="-DWINDOWS" />
<Add option="-D__GNUWIN32__" />
<Add option="-D__WXMSW__" />
<Add option="-DwxUSE_UNICODE=1" />
<Add option="-DWXUSINGDLL" />
<Add option="-DBOOST_DISABLE_ASSERTS" />
<Add directory="../ExtLibs/wxwidgets/include" />
<Add directory="../ExtLibs/wxwidgets/lib/gcc_dll/mswu" />
</Compiler>
<Linker>
<Add option="-s" />
<Add option="-lmingw32" />
<Add option="-lopengl32" />
<Add option="-limm32" />
<Add option="-lcomctl32" />
<Add option="-lglu32" />
<Add option="-lws2_32" />
<Add option="-lgdi32" />
<Add option="-lwinmm" />
<Add option="-lwxmsw30u_xrc" />
<Add option="-lwxmsw30u_stc" />
<Add option="-lwxmsw30u_richtext" />
<Add option="-lwxmsw30u_ribbon" />
<Add option="-lwxmsw30u_propgrid" />
<Add option="-lwxmsw30u_aui" />
<Add option="-lwxmsw30u_adv" />
<Add option="-lwxmsw30u_html" />
<Add option="-lwxmsw30u_core" />
<Add option="-lwxbase30u_xml" />
<Add option="-lwxbase30u_net" />
<Add option="-lwxexpat" />
<Add option="-lwxbase30u" />
<Add option="-lwxpng" />
<Add option="-lwxjpeg" />
<Add option="-lwxzlib" />
<Add option="-lwxtiff" />
<Add option="-lsfml-audio" />
<Add option="-lsfml-graphics" />
<Add option="-lsfml-window" />
<Add option="-lsfml-network" />
<Add option="-lsfml-system" />
<Add directory="../ExtLibs/wxwidgets/lib/gcc_dll/mswu" />
<Add directory="../ExtLibs/wxwidgets/lib/gcc_dll" />
<Add directory="../ExtLibs/SFML/build-mingw-release/lib" />
</Linker>
</Target>
<Target title="Release - Edittime">
<Option output="../IDE/bin/release/GDCore.dll" imp_lib="$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).a" def_file="$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME)" prefix_auto="1" extension_auto="0" />
<Option object_output="obj/Release/" />
<Option type="3" />
<Option compiler="gcc" />
<Option createDefFile="1" />
<Option createStaticLib="1" />
<Compiler>
<Add option="-O2" />
<Add option="-DGD_CORE_API=__declspec(dllexport)" />
<Add option="-DRELEASE" />
<Add option="-DWINDOWS" />
<Add option="-D__GNUWIN32__" />
<Add option="-D__WXMSW__" />
<Add option="-DwxUSE_UNICODE=1" />
<Add option="-DWXUSINGDLL" />
<Add option="-DBOOST_DISABLE_ASSERTS" />
<Add directory="../ExtLibs/wxwidgets/include" />
<Add directory="../ExtLibs/wxwidgets/lib/gcc_dll/mswu" />
</Compiler>
<Linker>
<Add option="-s" />
<Add option="-lmingw32" />
<Add option="-lopengl32" />
<Add option="-limm32" />
<Add option="-lcomctl32" />
<Add option="-lglu32" />
<Add option="-lws2_32" />
<Add option="-lgdi32" />
<Add option="-lwinmm" />
<Add option="-lwxmsw30u_xrc" />
<Add option="-lwxmsw30u_stc" />
<Add option="-lwxmsw30u_richtext" />
<Add option="-lwxmsw30u_ribbon" />
<Add option="-lwxmsw30u_propgrid" />
<Add option="-lwxmsw30u_aui" />
<Add option="-lwxmsw30u_adv" />
<Add option="-lwxmsw30u_html" />
<Add option="-lwxmsw30u_core" />
<Add option="-lwxbase30u_xml" />
<Add option="-lwxbase30u_net" />
<Add option="-lwxexpat" />
<Add option="-lwxbase30u" />
<Add option="-lwxpng" />
<Add option="-lwxjpeg" />
<Add option="-lwxzlib" />
<Add option="-lwxtiff" />
<Add option="-lsfml-audio" />
<Add option="-lsfml-graphics" />
<Add option="-lsfml-window" />
<Add option="-lsfml-network" />
<Add option="-lsfml-system" />
<Add directory="../ExtLibs/wxwidgets/lib/gcc_dll/mswu" />
<Add directory="../ExtLibs/wxwidgets/lib/gcc_dll" />
<Add directory="../ExtLibs/SFML/build-mingw-release/lib" />
</Linker>
</Target>
<Target title="Linux - Release - Edittime">
<Option output="../IDE/bin/release/libGDCore.so" prefix_auto="0" extension_auto="0" />
<Option object_output="obj/Linux Release/" />
<Option type="3" />
<Option compiler="gcc" />
<Option createDefFile="1" />
<Option createStaticLib="1" />
<Compiler>
<Add option="-O2" />
<Add option="-m32" />
<Add option="`wx-config --cppflags`" />
<Add option="`pkg-config gtk+-2.0 --cflags`" />
<Add option='-DGD_CORE_API=&quot;&quot;' />
<Add option="-DRELEASE" />
<Add option="-DLINUX" />
<Add option="-DBOOST_DISABLE_ASSERTS" />
</Compiler>
<Linker>
<Add option="-s" />
<Add option="`wx-config --libs all`" />
<Add option="-lsfml-audio" />
<Add option="-lsfml-graphics" />
<Add option="-lsfml-window" />
<Add option="-lsfml-network" />
<Add option="-lsfml-system" />
<Add directory="../ExtLibs/SFML/build-linux/lib" />
</Linker>
</Target>
<Target title="Linux - Debug - Edittime">
<Option output="../IDE/bin/debug/libGDCore.so" prefix_auto="0" extension_auto="0" />
<Option object_output="obj/Linux Debug/" />
<Option type="3" />
<Option compiler="gcc" />
<Option createDefFile="1" />
<Option createStaticLib="1" />
<Compiler>
<Add option="-g" />
<Add option="-m32" />
<Add option="`wx-config --cppflags`" />
<Add option="`pkg-config gtk+-2.0 --cflags`" />
<Add option='-DGD_CORE_API=&quot;&quot;' />
<Add option="-DDEBUG" />
<Add option="-DLINUX" />
</Compiler>
<Linker>
<Add option="`wx-config --libs all`" />
<Add option="-lsfml-audio" />
<Add option="-lsfml-graphics" />
<Add option="-lsfml-window" />
<Add option="-lsfml-network" />
<Add option="-lsfml-system" />
<Add directory="../ExtLibs/SFML/build-linux/lib" />
</Linker>
</Target>
</Build>
<Compiler>
<Add option="-Wall" />
<Add option="-fexceptions" />
<Add option="-DGD_IDE_ONLY" />
<Add directory="../Core" />
<Add directory="../ExtLibs/boost" />
<Add directory="../ExtLibs/SFML/include" />
</Compiler>
<ResourceCompiler>
<Add directory="../Core" />
</ResourceCompiler>
<Unit filename="GDCore/CommonTools.cpp" />
<Unit filename="GDCore/CommonTools.h" />
<Unit filename="GDCore/DocMainPage.h" />
<Unit filename="GDCore/Extensions/Metadata/BehaviorMetadata.cpp" />
<Unit filename="GDCore/Extensions/Metadata/BehaviorMetadata.h" />
<Unit filename="GDCore/Events/Builtin/CommentEvent.cpp" />
<Unit filename="GDCore/Events/Builtin/CommentEvent.h" />
<Unit filename="GDCore/Events/Builtin/ForEachEvent.cpp" />
<Unit filename="GDCore/Events/Builtin/ForEachEvent.h" />
<Unit filename="GDCore/Events/Builtin/LinkEvent.cpp" />
<Unit filename="GDCore/Events/Builtin/LinkEvent.h" />
<Unit filename="GDCore/Events/Builtin/RepeatEvent.cpp" />
<Unit filename="GDCore/Events/Builtin/RepeatEvent.h" />
<Unit filename="GDCore/Events/Builtin/StandardEvent.cpp" />
<Unit filename="GDCore/Events/Builtin/StandardEvent.h" />
<Unit filename="GDCore/Events/Builtin/WhileEvent.cpp" />
<Unit filename="GDCore/Events/Builtin/WhileEvent.h" />
<Unit filename="GDCore/Events/Event.cpp" />
<Unit filename="GDCore/Events/Event.h" />
<Unit filename="GDCore/Extensions/Metadata/EventMetadata.cpp" />
<Unit filename="GDCore/Extensions/Metadata/EventMetadata.h" />
<Unit filename="GDCore/Events/CodeGeneration/EventsCodeGenerationContext.cpp" />
<Unit filename="GDCore/Events/CodeGeneration/EventsCodeGenerationContext.h" />
<Unit filename="GDCore/Events/CodeGeneration/EventsCodeGenerator.cpp" />
<Unit filename="GDCore/Events/CodeGeneration/EventsCodeGenerator.h" />
<Unit filename="GDCore/Events/Tools/EventsCodeNameMangler.cpp" />
<Unit filename="GDCore/Events/Tools/EventsCodeNameMangler.h" />
<Unit filename="GDCore/Events/Expression.h" />
<Unit filename="GDCore/Extensions/Metadata/ExpressionMetadata.cpp" />
<Unit filename="GDCore/Extensions/Metadata/ExpressionMetadata.h" />
<Unit filename="GDCore/Events/Parsers/ExpressionParser.cpp" />
<Unit filename="GDCore/Events/Parsers/ExpressionParser.h" />
<Unit filename="GDCore/Events/CodeGeneration/ExpressionsCodeGeneration.cpp" />
<Unit filename="GDCore/Events/CodeGeneration/ExpressionsCodeGeneration.h" />
<Unit filename="GDCore/Events/Instruction.cpp" />
<Unit filename="GDCore/Events/Instruction.h" />
<Unit filename="GDCore/Extensions/Metadata/InstructionMetadata.cpp" />
<Unit filename="GDCore/Extensions/Metadata/InstructionMetadata.h" />
<Unit filename="GDCore/Extensions/Metadata/ObjectMetadata.cpp" />
<Unit filename="GDCore/Extensions/Metadata/ObjectMetadata.h" />
<Unit filename="GDCore/Events/Serialization.cpp" />
<Unit filename="GDCore/Events/Serialization.h" />
<Unit filename="GDCore/IDE/ActionSentenceFormatter.cpp" />
<Unit filename="GDCore/IDE/ActionSentenceFormatter.h" />
<Unit filename="GDCore/IDE/Project/ArbitraryResourceWorker.cpp" />
<Unit filename="GDCore/IDE/Project/ArbitraryResourceWorker.h" />
<Unit filename="GDCore/IDE/Clipboard.cpp" />
<Unit filename="GDCore/IDE/Clipboard.h" />
<Unit filename="GDCore/IDE/CommonBitmapProvider.cpp" />
<Unit filename="GDCore/IDE/wxTools/CommonBitmapProvider.h" />
<Unit filename="GDCore/IDE/ConditionSentenceFormatter.cpp" />
<Unit filename="GDCore/IDE/ConditionSentenceFormatter.h" />
<Unit filename="GDCore/IDE/Dialogs/AdvancedEntryDialog.cpp" />
<Unit filename="GDCore/IDE/Dialogs/AdvancedEntryDialog.h" />
<Unit filename="GDCore/IDE/Dialogs/ChooseBehaviorDialog.cpp" />
<Unit filename="GDCore/IDE/Dialogs/ChooseBehaviorDialog.h" />
<Unit filename="GDCore/IDE/Dialogs/ChooseBehaviorTypeDialog.cpp" />
<Unit filename="GDCore/IDE/Dialogs/ChooseBehaviorTypeDialog.h" />
<Unit filename="GDCore/IDE/Dialogs/ChooseLayerDialog.cpp" />
<Unit filename="GDCore/IDE/Dialogs/ChooseLayerDialog.h" />
<Unit filename="GDCore/IDE/Dialogs/ChooseObjectDialog.cpp" />
<Unit filename="GDCore/IDE/Dialogs/ChooseObjectDialog.h" />
<Unit filename="GDCore/IDE/Dialogs/ChooseObjectTypeDialog.cpp" />
<Unit filename="GDCore/IDE/Dialogs/ChooseObjectTypeDialog.h" />
<Unit filename="GDCore/IDE/Dialogs/ChooseVariableDialog.cpp" />
<Unit filename="GDCore/IDE/Dialogs/ChooseVariableDialog.h" />
<Unit filename="GDCore/IDE/Dialogs/EditComment.cpp" />
<Unit filename="GDCore/IDE/Dialogs/EditComment.h" />
<Unit filename="GDCore/IDE/Dialogs/EditExpressionDialog.cpp" />
<Unit filename="GDCore/IDE/Dialogs/EditExpressionDialog.h" />
<Unit filename="GDCore/IDE/Dialogs/EditForEachEvent.cpp" />
<Unit filename="GDCore/IDE/Dialogs/EditForEachEvent.h" />
<Unit filename="GDCore/IDE/Dialogs/EditLayerDialog.cpp" />
<Unit filename="GDCore/IDE/Dialogs/EditLayerDialog.h" />
<Unit filename="GDCore/IDE/Dialogs/EditLink.cpp" />
<Unit filename="GDCore/IDE/Dialogs/EditLink.h" />
<Unit filename="GDCore/IDE/Dialogs/EditRepeatEvent.cpp" />
<Unit filename="GDCore/IDE/Dialogs/EditRepeatEvent.h" />
<Unit filename="GDCore/IDE/Dialogs/EditStrExpressionDialog.cpp" />
<Unit filename="GDCore/IDE/Dialogs/EditStrExpressionDialog.h" />
<Unit filename="GDCore/IDE/Dialogs/GridSetupDialog.cpp" />
<Unit filename="GDCore/IDE/Dialogs/GridSetupDialog.h" />
<Unit filename="GDCore/IDE/Dialogs/InitialInstancesPropgridHelper.cpp" />
<Unit filename="GDCore/IDE/Dialogs/InitialInstancesPropgridHelper.h" />
<Unit filename="GDCore/IDE/Dialogs/InstancesAdvancedPasteDialog.cpp" />
<Unit filename="GDCore/IDE/Dialogs/InstancesAdvancedPasteDialog.h" />
<Unit filename="GDCore/IDE/Dialogs/LayersEditorPanel.cpp" />
<Unit filename="GDCore/IDE/Dialogs/LayersEditorPanel.h" />
<Unit filename="GDCore/IDE/Dialogs/LayoutEditorCanvas/LayoutEditorCanvas.cpp" />
<Unit filename="GDCore/IDE/Dialogs/LayoutEditorCanvas/LayoutEditorCanvas.h" />
<Unit filename="GDCore/IDE/Dialogs/LayoutEditorCanvas/LayoutEditorCanvas2.cpp" />
<Unit filename="GDCore/IDE/Dialogs/LayoutEditorCanvas/LayoutEditorCanvasAssociatedEditor.cpp" />
<Unit filename="GDCore/IDE/Dialogs/LayoutEditorCanvas/LayoutEditorCanvasAssociatedEditor.h" />
<Unit filename="GDCore/IDE/Dialogs/LayoutEditorCanvas/LayoutEditorCanvasOptions.cpp" />
<Unit filename="GDCore/IDE/Dialogs/LayoutEditorCanvas/LayoutEditorCanvasOptions.h" />
<Unit filename="GDCore/IDE/Dialogs/LayoutEditorCanvas/LayoutEditorCanvasTextDnd.cpp" />
<Unit filename="GDCore/IDE/Dialogs/LayoutEditorCanvas/LayoutEditorCanvasTextDnd.h" />
<Unit filename="GDCore/IDE/Dialogs/MainFrameWrapper.cpp" />
<Unit filename="GDCore/IDE/Dialogs/MainFrameWrapper.h" />
<Unit filename="GDCore/IDE/Dialogs/ObjectListDialogsHelper.cpp" />
<Unit filename="GDCore/IDE/Dialogs/ObjectListDialogsHelper.h" />
<Unit filename="GDCore/IDE/Dialogs/ObjectsOnBadLayerDialog.cpp" />
<Unit filename="GDCore/IDE/Dialogs/ObjectsOnBadLayerDialog.h" />
<Unit filename="GDCore/IDE/Dialogs/ObjectsPropgridHelper.cpp" />
<Unit filename="GDCore/IDE/Dialogs/ObjectsPropgridHelper.h" />
<Unit filename="GDCore/IDE/Dialogs/ProjectExtensionsDialog.cpp" />
<Unit filename="GDCore/IDE/Dialogs/ProjectExtensionsDialog.h" />
<Unit filename="GDCore/IDE/Dialogs/ProjectUpdateDialog.cpp" />
<Unit filename="GDCore/IDE/Dialogs/ProjectUpdateDialog.h" />
<Unit filename="GDCore/IDE/Dialogs/ResourceLibraryDialog.cpp" />
<Unit filename="GDCore/IDE/Dialogs/ResourceLibraryDialog.h" />
<Unit filename="GDCore/IDE/EventsChangesNotifier.cpp" />
<Unit filename="GDCore/IDE/EventsChangesNotifier.h" />
<Unit filename="GDCore/IDE/Dialogs/EventsEditor/EventsEditorItemsAreas.cpp" />
<Unit filename="GDCore/IDE/Dialogs/EventsEditor/EventsEditorItemsAreas.h" />
<Unit filename="GDCore/IDE/Dialogs/EventsEditor/EventsEditorSelection.cpp" />
<Unit filename="GDCore/IDE/Dialogs/EventsEditor/EventsEditorSelection.h" />
<Unit filename="GDCore/IDE/Events/EventsRefactorer.cpp" />
<Unit filename="GDCore/IDE/Events/EventsRefactorer.h" />
<Unit filename="GDCore/IDE/Dialogs/EventsEditor/EventsRenderingHelper.cpp" />
<Unit filename="GDCore/IDE/Dialogs/EventsEditor/EventsRenderingHelper.h" />
<Unit filename="GDCore/IDE/Events/EventsVariablesFinder.cpp" />
<Unit filename="GDCore/IDE/Events/EventsVariablesFinder.h" />
<Unit filename="GDCore/IDE/Events/ExpressionsCorrectnessTesting.cpp" />
<Unit filename="GDCore/IDE/Events/ExpressionsCorrectnessTesting.h" />
<Unit filename="GDCore/IDE/ExtensionsLoader.cpp" />
<Unit filename="GDCore/IDE/ExtensionsLoader.h" />
<Unit filename="GDCore/IDE/Project/ResourcesInUseHelper.cpp" />
<Unit filename="GDCore/IDE/Project/ResourcesInUseHelper.h" />
<Unit filename="GDCore/Extensions/Metadata/MetadataProvider.cpp" />
<Unit filename="GDCore/Extensions/Metadata/MetadataProvider.h" />
<Unit filename="GDCore/IDE/PlatformLoader.cpp" />
<Unit filename="GDCore/IDE/PlatformLoader.h" />
<Unit filename="GDCore/IDE/PlatformManager.cpp" />
<Unit filename="GDCore/IDE/PlatformManager.h" />
<Unit filename="GDCore/IDE/ProjectExporter.cpp" />
<Unit filename="GDCore/IDE/ProjectExporter.h" />
<Unit filename="GDCore/IDE/Project/ProjectResourcesCopier.cpp" />
<Unit filename="GDCore/IDE/Project/ProjectResourcesCopier.h" />
<Unit filename="GDCore/IDE/Project/ResourcesAbsolutePathChecker.cpp" />
<Unit filename="GDCore/IDE/Project/ResourcesAbsolutePathChecker.h" />
<Unit filename="GDCore/IDE/Project/ResourcesMergingHelper.cpp" />
<Unit filename="GDCore/IDE/Project/ResourcesMergingHelper.h" />
<Unit filename="GDCore/IDE/ResourcesUnmergingHelper.cpp" />
<Unit filename="GDCore/IDE/ResourcesUnmergingHelper.h" />
<Unit filename="GDCore/IDE/SceneNameMangler.cpp" />
<Unit filename="GDCore/IDE/SceneNameMangler.h" />
<Unit filename="GDCore/IDE/Events/TextFormatting.h" />
<Unit filename="GDCore/IDE/wxTools/AuiTabArt.cpp" />
<Unit filename="GDCore/IDE/wxTools/AuiTabArt.h" />
<Unit filename="GDCore/IDE/wxTools/FileProperty.cpp" />
<Unit filename="GDCore/IDE/wxTools/FileProperty.h" />
<Unit filename="GDCore/IDE/wxTools/RecursiveMkDir.cpp" />
<Unit filename="GDCore/IDE/wxTools/RecursiveMkDir.h" />
<Unit filename="GDCore/IDE/wxTools/SkinHelper.cpp" />
<Unit filename="GDCore/IDE/wxTools/SkinHelper.h" />
<Unit filename="GDCore/IDE/wxTools/TreeItemStringData.h" />
<Unit filename="GDCore/Project/Behavior.cpp" />
<Unit filename="GDCore/Project/Behavior.h" />
<Unit filename="GDCore/Project/BehaviorsSharedData.cpp" />
<Unit filename="GDCore/Project/BehaviorsSharedData.h" />
<Unit filename="GDCore/Project/ChangesNotifier.cpp" />
<Unit filename="GDCore/Project/ChangesNotifier.h" />
<Unit filename="GDCore/Project/ObjectsContainer.cpp" />
<Unit filename="GDCore/Project/ObjectsContainer.h" />
<Unit filename="GDCore/Project/ExternalEvents.cpp" />
<Unit filename="GDCore/Project/ExternalEvents.h" />
<Unit filename="GDCore/Project/ExternalLayout.cpp" />
<Unit filename="GDCore/Project/ExternalLayout.h" />
<Unit filename="GDCore/Project/ImageManager.cpp" />
<Unit filename="GDCore/Project/ImageManager.h" />
<Unit filename="GDCore/Project/InitialInstance.cpp" />
<Unit filename="GDCore/Project/InitialInstance.h" />
<Unit filename="GDCore/Project/InitialInstancesContainer.cpp" />
<Unit filename="GDCore/Project/InitialInstancesContainer.h" />
<Unit filename="GDCore/Project/Layer.cpp" />
<Unit filename="GDCore/Project/Layer.h" />
<Unit filename="GDCore/Project/Layout.cpp" />
<Unit filename="GDCore/Project/Layout.h" />
<Unit filename="GDCore/Project/LayoutEditorPreviewer.cpp" />
<Unit filename="GDCore/Project/LayoutEditorPreviewer.h" />
<Unit filename="GDCore/Project/Object.cpp" />
<Unit filename="GDCore/Project/Object.h" />
<Unit filename="GDCore/Project/ObjectGroup.cpp" />
<Unit filename="GDCore/Project/ObjectGroup.h" />
<Unit filename="GDCore/Extensions/Platform.cpp" />
<Unit filename="GDCore/Extensions/Platform.h" />
<Unit filename="GDCore/Extensions/PlatformExtension.cpp" />
<Unit filename="GDCore/Extensions/PlatformExtension.h" />
<Unit filename="GDCore/Project/Project.cpp" />
<Unit filename="GDCore/Project/Project.h" />
<Unit filename="GDCore/Project/ResourcesManager.cpp" />
<Unit filename="GDCore/Project/ResourcesManager.h" />
<Unit filename="GDCore/Project/RessourcesLoader.cpp" />
<Unit filename="GDCore/Project/RessourcesLoader.h" />
<Unit filename="GDCore/Project/SourceFile.cpp" />
<Unit filename="GDCore/Project/SourceFile.h" />
<Unit filename="GDCore/Project/Variable.cpp" />
<Unit filename="GDCore/Project/Variable.h" />
<Unit filename="GDCore/Project/VariablesContainer.cpp" />
<Unit filename="GDCore/Project/VariablesContainer.h" />
<Unit filename="GDCore/TinyXml/tinystr.cpp" />
<Unit filename="GDCore/TinyXml/tinystr.h" />
<Unit filename="GDCore/TinyXml/tinyxml.cpp" />
<Unit filename="GDCore/TinyXml/tinyxml.h" />
<Unit filename="GDCore/TinyXml/tinyxmlerror.cpp" />
<Unit filename="GDCore/TinyXml/tinyxmlparser.cpp" />
<Unit filename="GDCore/Tools/DynamicLibrariesTools.cpp" />
<Unit filename="GDCore/Tools/DynamicLibrariesTools.h" />
<Unit filename="GDCore/Tools/HelpFileAccess.cpp" />
<Unit filename="GDCore/Tools/HelpFileAccess.h" />
<Unit filename="GDCore/Tools/Locale/LocaleManager.cpp" />
<Unit filename="GDCore/Tools/Locale/LocaleManager.h" />
<Unit filename="GDCore/Tools/Version.h" />
<Unit filename="GDCore/Tools/VersionWrapper.cpp" />
<Unit filename="GDCore/Tools/VersionWrapper.h" />
<Unit filename="wxsmith/AdvancedEntryDialog.wxs" />
<Unit filename="wxsmith/ChooseBehaviorDialog.wxs" />
<Unit filename="wxsmith/ChooseBehaviorTypeDialog.wxs" />
<Unit filename="wxsmith/ChooseLayerDialog.wxs" />
<Unit filename="wxsmith/ChooseObjectDialog.wxs" />
<Unit filename="wxsmith/ChooseObjectTypeDialog.wxs" />
<Unit filename="wxsmith/ChooseVariableDialog.wxs" />
<Unit filename="wxsmith/EditComment.wxs" />
<Unit filename="wxsmith/EditExpressionDialog.wxs" />
<Unit filename="wxsmith/EditForEachEvent.wxs" />
<Unit filename="wxsmith/EditLayerDialog.wxs" />
<Unit filename="wxsmith/EditLink.wxs" />
<Unit filename="wxsmith/EditRepeatEvent.wxs" />
<Unit filename="wxsmith/EditStrExpressionDialog.wxs" />
<Unit filename="wxsmith/GridSetupDialog.wxs" />
<Unit filename="wxsmith/InstancesAdvancedPasteDialog.wxs" />
<Unit filename="wxsmith/LayersEditorPanel.wxs" />
<Unit filename="wxsmith/LayoutEditorCanvas.wxs" />
<Unit filename="wxsmith/ObjectsOnBadLayerDialog.wxs" />
<Unit filename="wxsmith/ProjectExtensionsDialog.wxs" />
<Unit filename="wxsmith/ProjectUpdateDialog.wxs" />
<Unit filename="wxsmith/ResourceLibraryDialog.wxs" />
<Unit filename="wxsmith/SpriteObjectEditor.wxs" />
<Unit filename="wxsmith/ResourcesEditor.wxs" />
<Extensions>
<code_completion />
<envvars />
<debugger />
<wxsmith version="1">
<resources>
<wxDialog wxs="wxsmith/ChooseVariableDialog.wxs" src="GDCore/IDE/Dialogs/ChooseVariableDialog.cpp" hdr="GDCore/IDE/Dialogs/ChooseVariableDialog.h" fwddecl="0" i18n="1" name="ChooseVariableDialog" language="CPP" />
<wxDialog wxs="wxsmith/ResourceLibraryDialog.wxs" src="GDCore/IDE/Dialogs/ResourceLibraryDialog.cpp" hdr="GDCore/IDE/Dialogs/ResourceLibraryDialog.h" fwddecl="0" i18n="1" name="ResourceLibraryDialog" language="CPP" />
<wxDialog wxs="wxsmith/ProjectExtensionsDialog.wxs" src="GDCore/IDE/Dialogs/ProjectExtensionsDialog.cpp" hdr="GDCore/IDE/Dialogs/ProjectExtensionsDialog.h" fwddecl="0" i18n="1" name="ProjectExtensionsDialog" language="CPP" />
<wxDialog wxs="wxsmith/ChooseObjectDialog.wxs" src="GDCore/IDE/Dialogs/ChooseObjectDialog.cpp" hdr="GDCore/IDE/Dialogs/ChooseObjectDialog.h" fwddecl="0" i18n="1" name="ChooseObjectDialog" language="CPP" />
<wxDialog wxs="wxsmith/ChooseBehaviorDialog.wxs" src="GDCore/IDE/Dialogs/ChooseBehaviorDialog.cpp" hdr="GDCore/IDE/Dialogs/ChooseBehaviorDialog.h" fwddecl="0" i18n="1" name="ChooseBehaviorDialog" language="CPP" />
<wxDialog wxs="wxsmith/ChooseLayerDialog.wxs" src="GDCore/IDE/Dialogs/ChooseLayerDialog.cpp" hdr="GDCore/IDE/Dialogs/ChooseLayerDialog.h" fwddecl="0" i18n="1" name="ChooseLayerDialog" language="CPP" />
<wxDialog wxs="wxsmith/EditExpressionDialog.wxs" src="GDCore/IDE/Dialogs/EditExpressionDialog.cpp" hdr="GDCore/IDE/Dialogs/EditExpressionDialog.h" fwddecl="0" i18n="1" name="EditExpressionDialog" language="CPP" />
<wxDialog wxs="wxsmith/EditStrExpressionDialog.wxs" src="GDCore/IDE/Dialogs/EditStrExpressionDialog.cpp" hdr="GDCore/IDE/Dialogs/EditStrExpressionDialog.h" fwddecl="0" i18n="1" name="EditStrExpressionDialog" language="CPP" />
<wxDialog wxs="wxsmith/AdvancedEntryDialog.wxs" src="GDCore/IDE/Dialogs/AdvancedEntryDialog.cpp" hdr="GDCore/IDE/Dialogs/AdvancedEntryDialog.h" fwddecl="0" i18n="1" name="AdvancedEntryDialog" language="CPP" />
<wxDialog wxs="wxsmith/ChooseObjectTypeDialog.wxs" src="GDCore/IDE/Dialogs/ChooseObjectTypeDialog.cpp" hdr="GDCore/IDE/Dialogs/ChooseObjectTypeDialog.h" fwddecl="0" i18n="1" name="ChooseObjectTypeDialog" language="CPP" />
<wxPanel wxs="wxsmith/LayoutEditorCanvas.wxs" src="GDCore/IDE/Dialogs/LayoutEditorCanvas.cpp" hdr="GDCore/IDE/Dialogs/LayoutEditorCanvas.h" fwddecl="0" i18n="1" name="LayoutEditorCanvas" language="CPP" />
<wxDialog wxs="wxsmith/GridSetupDialog.wxs" src="GDCore/IDE/Dialogs/GridSetupDialog.cpp" hdr="GDCore/IDE/Dialogs/GridSetupDialog.h" fwddecl="0" i18n="1" name="GridSetupDialog" language="CPP" />
<wxPanel wxs="wxsmith/LayersEditorPanel.wxs" src="GDCore/IDE/Dialogs/LayersEditorPanel.cpp" hdr="GDCore/IDE/Dialogs/LayersEditorPanel.h" fwddecl="0" i18n="1" name="LayersEditorPanel" language="CPP" />
<wxDialog wxs="wxsmith/InstancesAdvancedPasteDialog.wxs" src="GDCore/IDE/Dialogs/InstancesAdvancedPasteDialog.cpp" hdr="GDCore/IDE/Dialogs/InstancesAdvancedPasteDialog.h" fwddecl="0" i18n="1" name="InstancesAdvancedPasteDialog" language="CPP" />
<wxDialog wxs="wxsmith/ChooseBehaviorTypeDialog.wxs" src="GDCore/IDE/Dialogs/ChooseBehaviorTypeDialog.cpp" hdr="GDCore/IDE/Dialogs/ChooseBehaviorTypeDialog.h" fwddecl="0" i18n="1" name="ChooseBehaviorTypeDialog" language="CPP" />
<wxDialog wxs="wxsmith/EditLayerDialog.wxs" src="GDCore/IDE/Dialogs/EditLayerDialog.cpp" hdr="GDCore/IDE/Dialogs/EditLayerDialog.h" fwddecl="0" i18n="1" name="EditLayerDialog" language="CPP" />
<wxDialog wxs="wxsmith/EditLink.wxs" src="GDCore/IDE/Dialogs/EditLink.cpp" hdr="GDCore/IDE/Dialogs/EditLink.h" fwddecl="0" i18n="1" name="EditLink" language="CPP" />
<wxDialog wxs="wxsmith/EditComment.wxs" src="GDCore/IDE/Dialogs/EditComment.cpp" hdr="GDCore/IDE/Dialogs/EditComment.h" fwddecl="0" i18n="1" name="EditComment" language="CPP" />
<wxDialog wxs="wxsmith/EditForEachEvent.wxs" src="GDCore/IDE/Dialogs/EditForEachEvent.cpp" hdr="GDCore/IDE/Dialogs/EditForEachEvent.h" fwddecl="0" i18n="1" name="EditForEachEvent" language="CPP" />
<wxDialog wxs="wxsmith/EditRepeatEvent.wxs" src="GDCore/IDE/Dialogs/EditRepeatEvent.cpp" hdr="GDCore/IDE/Dialogs/EditRepeatEvent.h" fwddecl="0" i18n="1" name="EditRepeatEvent" language="CPP" />
<wxDialog wxs="wxsmith/ProjectUpdateDialog.wxs" src="GDCore/IDE/Dialogs/ProjectUpdateDialog.cpp" hdr="GDCore/IDE/Dialogs/ProjectUpdateDialog.h" fwddecl="0" i18n="1" name="ProjectUpdateDialog" language="CPP" />
<wxDialog wxs="wxsmith/SpriteObjectEditor.wxs" src="GDCore/Extensions/Builtin/SpriteExtension/Dialogs/SpriteObjectEditor.cpp" hdr="GDCore/Extensions/Builtin/SpriteExtension/Dialogs/SpriteObjectEditor.h" fwddecl="0" i18n="1" name="SpriteObjectEditor" language="CPP" />
<wxPanel wxs="wxsmith/ResourcesEditor.wxs" src="GDCore/IDE/Dialogs/ResourcesEditor.cpp" hdr="GDCore/IDE/Dialogs/ResourcesEditor.h" fwddecl="0" i18n="1" name="ResourcesEditor" language="CPP" />
</resources>
</wxsmith>
</Extensions>
</Project>
</CodeBlocks_project_file>

View File

@@ -21,8 +21,6 @@
#define GD_DEPRECATED
#endif
class wxString;
namespace gd
{

View File

@@ -78,7 +78,6 @@
* The installation is fairly simple :<br>
* <br>
* - Launch the installer.<br>
* - Uncheck "Check for updated files on the TDM-GCC server" (otherwise you won't get TDM-GCC 4.9.2 but a more recent version that won't be compatible with wxWidgets pre-compiled binaries)
* - Choose Create.<br>
\image html compilerInstall1.png
@@ -157,9 +156,6 @@
* Binaries are created into *Binaries/Output/Release_{OS}* folder.
*
* To launch GDevelop in Windows, double click on **GDIDE**. For Linux, launch **StartGDevelop.sh**.
*
* If the build failed, check that you've properly installed wxWidgets and that you have installed any required
* development library.
*/
/**
@@ -192,18 +188,6 @@ sudo apt-get install curl
sudo apt-get install devscripts
\endcode
*
* \subsection wxWidgets Install wxWidgets development libraries
*
* Most distributions have wxWidgets 3 development libraries available: install them using your package manager. On Ubuntu:
\code
sudo apt-get install libwxgtk3.0-dev
\endcode
You should also have GTK+ development libraries installed. For GTK+2:
\code
sudo apt-get install libgtk2.0-dev
\endcode
*
* \subsection installcmake Install CMake
* You'll need CMake to build GDevelop: See more on \subpage installAndUseCMake.
@@ -222,7 +206,6 @@ sudo apt-get install libgtk2.0-dev
brew install cmake
brew install p7zip
brew install pkgconfig
brew install wxwidgets
brew install freetype
\endcode
* If you want to generate the documentation and translations, install Doxygen and Gettext:
@@ -248,44 +231,6 @@ make -j4
/**
* \page recommendedToolsAndConventions Recommended tools and advices to work with GD
*
* \section texteditor Text editor
*
* GDevelop is compiled thanks to CMake which can generate *Makefiles* or a project file for most popular IDE available.<br>
*
* [Sublime Text](http://www.sublimetext.com/) is a very nice text editor for programmers:
* *"You'll love the slick user interface, extraordinary features and amazing performance."*. <br>
* It has nice features like shortcut to search for a file at an amazing speed (just type a few letters of the file name you're searching for),
* multiple selection, plugins for better C++ and Javascript support.
*
* Take a look at it if you're unsure about which IDE to use. If you're more familiar with another IDE,
* ask CMake to generate a project file for it.
*
* ------
*
* \section designers Visual designers for IDE or GDCore dialogs
*
* \subsection newDesigner "New" dialogs created with wxCrafter
*
* New dialogs are designed using [wxCrafter](http://wxcrafter.codelite.org/). Download and launch it.
*
* All dialogs of GDCore, GDCpp, GDJS or the IDE created using wxCrafter are stored into a single .wxcp file in
* the wxsmith folder, next to files of dialogs created with wxSmith.<br>
* For example, open *GDJS/wxsmith/GDJS.wxcp*.
*
* You can edit and add new dialogs. Do not forget to click on "Generate code" if you made any change.
*
* wxCrafter creates base classes for dialog (their names start by *Base*), and any code must be inserted into
* a derived class. See examples in *GDJS*.
*
* \subsection oldDesigner "Old" dialogs created with wxSmith
* If you want to edit a dialog, first search if there is a file called *filename*.wxs in the folder *wxsmith* (in GDCore,
* GDCpp or IDE). If it is present, the dialog was made using the wxSmith visual designer integrated into the Code::Blocks IDE:
* - Download [Code::Blocks](http://www.codeblocks.org/) and launch it.
* - Open the .cbp in GDCore, GDCpp or IDE folder.
* - In the tab "Resources", locate the dialog to edit.
*
* ------
*
* \section git Git and GitHub
*
* Git is an amazing *version control system*. If you never used it before, take a look at some tutorials, there
@@ -413,8 +358,6 @@ double twopointfive = twopointfive.To<double>();
//twopointfive == 2.5
\endcode
*
* gd::String can also be implicitly constructed from a wxString or a sf::String, so that it is easy to use when you're dealing
* with wxWidgets GUI dialogs/editors or SFML objects.
*
* For more information, see the complete reference of the class. Tests cases have also been made for most functions.
*/

View File

@@ -4,15 +4,8 @@
* reserved. This project is released under the MIT License.
*/
#if !defined(GD_NO_WX_GUI)
#include <wx/dcmemory.h>
#endif
#include "CommentEvent.h"
#include "GDCore/CommonTools.h"
#include "GDCore/IDE/Dialogs/EditComment.h"
#include "GDCore/IDE/Dialogs/EventsEditor/EventsEditorItemsAreas.h"
#include "GDCore/IDE/Dialogs/EventsEditor/EventsEditorSelection.h"
#include "GDCore/IDE/Dialogs/EventsEditor/EventsRenderingHelper.h"
#include "GDCore/Serialization/SerializerElement.h"
using namespace std;
@@ -47,143 +40,4 @@ void CommentEvent::UnserializeFrom(gd::Project &project,
com2 = element.GetChild("comment2", 0, "Com2").GetValue().GetString();
}
gd::BaseEvent::EditEventReturnType CommentEvent::EditEvent(
wxWindow *parent_,
gd::Project &game_,
gd::Layout &scene_,
gd::MainFrameWrapper &mainFrameWrapper_) {
#if !defined(GD_NO_WX_GUI)
EditComment dialog(parent_, *this);
if (dialog.ShowModal() == 0) return Cancelled;
#endif
return ChangesMadeButNoNeedForEventsRecompilation;
}
/**
* Render the event
*/
void CommentEvent::Render(wxDC &dc,
int x,
int y,
unsigned int width,
gd::EventsEditorItemsAreas &areas,
gd::EventsEditorSelection &selection,
const gd::Platform &) {
#if !defined(GD_NO_WX_GUI)
x += 1; // Small border
gd::EventsRenderingHelper *renderingHelper = gd::EventsRenderingHelper::Get();
renderingHelper->GetHTMLRenderer().SetDC(&dc);
renderingHelper->GetHTMLRenderer().SetStandardFonts(
renderingHelper->GetNiceFont().GetPointSize());
// Prepare HTML texts
gd::String str1 =
"<FONT color=" +
wxColour(textR, textG, textB).GetAsString(wxC2S_HTML_SYNTAX) + ">" +
renderingHelper->GetHTMLText(com1) + "</FONT>";
gd::String str2 =
"<FONT color=" +
wxColour(textR, textG, textB).GetAsString(wxC2S_HTML_SYNTAX) + ">" +
renderingHelper->GetHTMLText(com2) + "</FONT>";
// Calculate space constraints
const int sideSeparation = 3; // Spacing between text and borders
unsigned int textWidth = com2.empty() ? width - sideSeparation * 2
: width / 2 - sideSeparation * 2;
renderingHelper->GetHTMLRenderer().SetSize(textWidth, 9999);
renderingHelper->GetHTMLRenderer().SetHtmlText(str1);
unsigned int text1Height =
renderingHelper->GetHTMLRenderer().GetTotalHeight();
renderingHelper->GetHTMLRenderer().SetHtmlText(str2);
unsigned int text2Height =
renderingHelper->GetHTMLRenderer().GetTotalHeight();
// Prepare background
dc.SetBrush(wxBrush(wxColour(r, v, b), wxBRUSHSTYLE_TRANSPARENT));
dc.SetPen(wxPen(wxColour(r / 2, v / 2, b / 2), 1));
// Draw the background
unsigned int height = std::max(text1Height, text2Height) + sideSeparation * 2;
height = std::max(height, (unsigned int)15);
wxRect rectangle(x, y, width - 2, height);
dc.GradientFillLinear(rectangle,
wxColour(r + 20 > 255 ? 255 : r + 20,
v + 20 > 255 ? 255 : v + 20,
b + 20 > 255 ? 255 : b + 20),
wxColour(r, v, b),
wxSOUTH);
dc.DrawRectangle(rectangle);
// Draw text
{
renderingHelper->GetHTMLRenderer().SetHtmlText(str1);
wxArrayInt neededArray;
renderingHelper->GetHTMLRenderer().Render(
x + sideSeparation, y + sideSeparation, neededArray);
}
if (!com2.empty()) // Optional text
{
renderingHelper->GetHTMLRenderer().SetHtmlText(str2);
wxArrayInt neededArray;
renderingHelper->GetHTMLRenderer().Render(
x + sideSeparation + textWidth + sideSeparation,
y + sideSeparation,
neededArray);
}
#endif
}
unsigned int CommentEvent::GetRenderedHeight(unsigned int width,
const gd::Platform &) const {
#if !defined(GD_NO_WX_GUI)
if (eventHeightNeedUpdate) {
gd::EventsRenderingHelper *renderingHelper =
gd::EventsRenderingHelper::Get();
wxMemoryDC dc;
wxBitmap fakeBmp(1, 1);
dc.SelectObject(fakeBmp);
renderingHelper->GetHTMLRenderer().SetDC(&dc);
renderingHelper->GetHTMLRenderer().SetStandardFonts(
renderingHelper->GetNiceFont().GetPointSize());
gd::String str1 =
"<FONT color=" +
wxColour(textR, textG, textB).GetAsString(wxC2S_HTML_SYNTAX) + ">" +
renderingHelper->GetHTMLText(com1) + "</FONT>";
gd::String str2 =
"<FONT color=" +
wxColour(textR, textG, textB).GetAsString(wxC2S_HTML_SYNTAX) + ">" +
renderingHelper->GetHTMLText(com2) + "</FONT>";
// Calculate space constraints
const int sideSeparation = 3; // Spacing between text and borders
unsigned int textWidth = com2.empty() ? width - sideSeparation * 2
: width / 2 - sideSeparation * 2;
renderingHelper->GetHTMLRenderer().SetSize(textWidth, 9999);
renderingHelper->GetHTMLRenderer().SetHtmlText(str1);
unsigned int text1Height =
renderingHelper->GetHTMLRenderer().GetTotalHeight();
renderingHelper->GetHTMLRenderer().SetHtmlText(str2);
unsigned int text2Height =
renderingHelper->GetHTMLRenderer().GetTotalHeight();
unsigned int height =
std::max(text1Height, text2Height) + sideSeparation * 2;
height = std::max(height, (unsigned int)15);
renderedHeight = height;
}
#endif
return renderedHeight + 2; // 2 : 2 small borders
}
} // namespace gd

View File

@@ -7,26 +7,10 @@
#define COMMENTEVENT_H
#include "GDCore/Events/Event.h"
class TiXmlElement;
namespace gd {
class Layout;
}
namespace gd {
class Project;
}
namespace gd {
class MainFrameWrapper;
}
namespace gd {
class Project;
}
class wxWindow;
namespace gd {
class EventsEditorItemsAreas;
}
namespace gd {
class EventsEditorSelection;
}
namespace gd {
@@ -75,29 +59,6 @@ class GD_CORE_API CommentEvent : public gd::BaseEvent {
gd::String com1; ///< Comment
gd::String com2; ///< Optional second column comment, deprecated
/**
* Called by event editor to draw the event.
*/
virtual void Render(wxDC& dc,
int x,
int y,
unsigned int width,
gd::EventsEditorItemsAreas& areas,
gd::EventsEditorSelection& selection,
const gd::Platform&);
/**
* Must return the height of the event when rendered
*/
virtual unsigned int GetRenderedHeight(unsigned int width,
const gd::Platform&) const;
virtual EditEventReturnType EditEvent(
wxWindow* parent_,
gd::Project& game_,
gd::Layout& scene_,
gd::MainFrameWrapper& mainFrameWrapper_);
};
} // namespace gd

View File

@@ -11,10 +11,6 @@
#include "GDCore/Events/CodeGeneration/ExpressionsCodeGeneration.h"
#include "GDCore/Events/Serialization.h"
#include "GDCore/Events/Tools/EventsCodeNameMangler.h"
#include "GDCore/IDE/Dialogs/EditForEachEvent.h"
#include "GDCore/IDE/Dialogs/EventsEditor/EventsEditorItemsAreas.h"
#include "GDCore/IDE/Dialogs/EventsEditor/EventsEditorSelection.h"
#include "GDCore/IDE/Dialogs/EventsEditor/EventsRenderingHelper.h"
#include "GDCore/Serialization/SerializerElement.h"
#include "GDCore/TinyXml/tinyxml.h"
@@ -89,110 +85,4 @@ void ForEachEvent::UnserializeFrom(gd::Project& project,
project, events, element.GetChild("events", 0, "Events"));
}
/**
* Render the event in the bitmap
*/
void ForEachEvent::Render(wxDC& dc,
int x,
int y,
unsigned int width,
gd::EventsEditorItemsAreas& areas,
gd::EventsEditorSelection& selection,
const gd::Platform& platform) {
#if !defined(GD_NO_WX_GUI)
gd::EventsRenderingHelper* renderingHelper = gd::EventsRenderingHelper::Get();
int border = renderingHelper->instructionsListBorder;
const int forEachTextHeight = 20;
// Draw header rectangle
wxRect headerRect(x, y, width, forEachTextHeight);
renderingHelper->DrawNiceRectangle(dc, headerRect);
// For Each text
dc.SetFont(renderingHelper->GetNiceFont().Bold());
if (!IsDisabled())
dc.SetTextForeground(wxColour(0, 0, 0));
else
dc.SetTextForeground(wxColour(160, 160, 160));
dc.DrawText(_("For each object") + " " + objectsToPick.GetPlainString() +
_(", repeat :"),
x + 4,
y + 3);
// Draw conditions rectangle
wxRect rect(x,
y + forEachTextHeight,
renderingHelper->GetConditionsColumnWidth() + border,
GetRenderedHeight(width, platform) - forEachTextHeight);
renderingHelper->DrawNiceRectangle(dc, rect);
// Draw actions and conditions
renderingHelper->DrawConditionsList(
conditions,
dc,
x + border,
y + forEachTextHeight + border,
renderingHelper->GetConditionsColumnWidth() - border,
this,
areas,
selection,
platform);
renderingHelper->DrawActionsList(
actions,
dc,
x + renderingHelper->GetConditionsColumnWidth() + border,
y + forEachTextHeight + border,
width - renderingHelper->GetConditionsColumnWidth() - border * 2,
this,
areas,
selection,
platform);
#endif
}
unsigned int ForEachEvent::GetRenderedHeight(
unsigned int width, const gd::Platform& platform) const {
#if !defined(GD_NO_WX_GUI)
if (eventHeightNeedUpdate) {
gd::EventsRenderingHelper* renderingHelper =
gd::EventsRenderingHelper::Get();
int border = renderingHelper->instructionsListBorder;
const int forEachTextHeight = 20;
// Get maximum height needed
int conditionsHeight = renderingHelper->GetRenderedConditionsListHeight(
conditions,
renderingHelper->GetConditionsColumnWidth() - border,
platform);
int actionsHeight = renderingHelper->GetRenderedActionsListHeight(
actions,
width - renderingHelper->GetConditionsColumnWidth() - border * 2,
platform);
renderedHeight =
((conditionsHeight > actionsHeight ? conditionsHeight : actionsHeight) +
forEachTextHeight) +
border * 2;
eventHeightNeedUpdate = false;
}
return renderedHeight;
#else
return 0;
#endif
}
gd::BaseEvent::EditEventReturnType ForEachEvent::EditEvent(
wxWindow* parent_,
gd::Project& game_,
gd::Layout& scene_,
gd::MainFrameWrapper& mainFrameWrapper_) {
#if !defined(GD_NO_WX_GUI)
EditForEachEvent dialog(parent_, *this, game_, scene_);
if (dialog.ShowModal() == 0) return Cancelled;
#endif
return ChangesMade;
}
} // namespace gd

View File

@@ -8,27 +8,11 @@
#define FOREACHEVENT_H
#include "GDCore/Events/Event.h"
#include "GDCore/Events/EventsList.h"
class RuntimeScene;
namespace gd {
class Instruction;
}
namespace gd {
class Project;
}
namespace gd {
class MainFrameWrapper;
}
class TiXmlElement;
namespace gd {
class EventsEditorItemsAreas;
}
namespace gd {
class EventsEditorSelection;
}
namespace gd {
class Layout;
}
class wxWindow;
namespace gd {
@@ -75,32 +59,6 @@ class GD_CORE_API ForEachEvent : public gd::BaseEvent {
virtual void UnserializeFrom(gd::Project& project,
const SerializerElement& element);
/**
* Called by event editor to draw the event.
*/
virtual void Render(wxDC& dc,
int x,
int y,
unsigned int width,
gd::EventsEditorItemsAreas& areas,
gd::EventsEditorSelection& selection,
const gd::Platform& platform);
/**
* Must return the height of the event when rendered
*/
virtual unsigned int GetRenderedHeight(unsigned int width,
const gd::Platform& platform) const;
/**
* Called when the user want to edit the event
*/
virtual EditEventReturnType EditEvent(
wxWindow* parent_,
gd::Project& game_,
gd::Layout& scene_,
gd::MainFrameWrapper& mainFrameWrapper_);
private:
gd::Expression objectsToPick;
gd::InstructionsList conditions;

View File

@@ -5,20 +5,10 @@
*/
#include "GroupEvent.h"
#if !defined(GD_NO_WX_GUI)
#include <wx/dcmemory.h>
#include <wx/renderer.h>
#include "GDCore/IDE/Dialogs/MainFrameWrapper.h"
#endif
#include "GDCore/CommonTools.h"
#include "GDCore/Events/CodeGeneration/EventsCodeGenerationContext.h"
#include "GDCore/Events/CodeGeneration/EventsCodeGenerator.h"
#include "GDCore/Events/Serialization.h"
#include "GDCore/IDE/Dialogs/EventStoreDialog.h"
#include "GDCore/IDE/Dialogs/EventsEditor/EventsEditorItemsAreas.h"
#include "GDCore/IDE/Dialogs/EventsEditor/EventsEditorSelection.h"
#include "GDCore/IDE/Dialogs/EventsEditor/EventsRenderingHelper.h"
#include "GDCore/IDE/Dialogs/GroupEventDialog.h"
#include "GDCore/Serialization/SerializerElement.h"
#include "GDCore/TinyXml/tinyxml.h"
@@ -63,39 +53,6 @@ void GroupEvent::UnserializeFrom(gd::Project& project,
parameters.push_back(parametersElement.GetChild(i).GetValue().GetString());
}
gd::BaseEvent::EditEventReturnType GroupEvent::EditEvent(
wxWindow* parent_,
gd::Project& project,
gd::Layout& scene,
gd::MainFrameWrapper& mainFrameWrapper) {
if (events.IsEmpty())
events.InsertNewEvent(project, "BuiltinCommonInstructions::Standard");
#if !defined(GD_NO_WX_GUI)
if (source.empty()) {
GroupEventDialog dialog(parent_, *this);
dialog.ShowModal();
return ChangesMadeButNoNeedForEventsRecompilation;
} else {
gd::EventStoreDialog dialog(parent_, project, scene);
size_t found = source.rfind("/");
if (found != gd::String::npos && found < source.size() - 1) {
gd::String sourceId = source.substr(found + 1, source.size());
dialog.RefreshWith(sourceId, parameters);
}
if (dialog.ShowModal() != 1) return Cancelled;
// Insert new events
*this = dialog.GetGroupEvent();
return ChangesMade;
}
#else
return Cancelled;
#endif
}
void GroupEvent::SetBackgroundColor(unsigned int colorR_,
unsigned int colorG_,
unsigned int colorB_) {
@@ -104,60 +61,5 @@ void GroupEvent::SetBackgroundColor(unsigned int colorR_,
colorB = colorB_;
}
/**
* Render the event in the bitmap
*/
void GroupEvent::Render(wxDC& dc,
int x,
int y,
unsigned int width,
gd::EventsEditorItemsAreas& areas,
gd::EventsEditorSelection& selection,
const gd::Platform& platform) {
#if !defined(GD_NO_WX_GUI)
wxString groupTitle = name.empty() ? _("Untitled group") : wxString(name);
wxColour backgroundColor = wxColour(colorR, colorG, colorB);
wxColour textColor = colorR + colorG + colorB > 200 * 3 ? *wxBLACK : *wxWHITE;
if (IsDisabled()) {
backgroundColor.MakeDisabled();
textColor = wxColour(160, 160, 160);
}
dc.SetBrush(wxBrush(backgroundColor));
dc.SetPen(wxPen(backgroundColor.ChangeLightness(70)));
wxRect rect(x + 1, y, width - 2, GetRenderedHeight(width, platform) - 2);
dc.DrawRectangle(rect);
dc.SetTextBackground(backgroundColor);
dc.SetTextForeground(textColor);
dc.SetFont(
wxFont(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD));
dc.DrawText(groupTitle, x + 5, y + 5);
#endif
}
unsigned int GroupEvent::GetRenderedHeight(unsigned int width,
const gd::Platform& platform) const {
#if !defined(GD_NO_WX_GUI)
if (eventHeightNeedUpdate) {
wxMemoryDC dc;
wxBitmap fakeBmp(1, 1);
dc.SelectObject(fakeBmp);
wxString groupTitle = name.empty() ? _("Untitled group") : wxString(name);
dc.SetFont(wxFont(
12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL));
wxRect text = dc.GetTextExtent(groupTitle);
renderedHeight = text.GetHeight() + 10;
eventHeightNeedUpdate = false;
}
return renderedHeight;
#else
return 0;
#endif
}
} // namespace gd

View File

@@ -12,19 +12,9 @@
#include "GDCore/Events/Instruction.h"
namespace gd {
class Instruction;
}
namespace gd {
class Project;
}
class RuntimeScene;
class TiXmlElement;
class EventsCodeGenerationContext;
namespace gd {
class EventsEditorItemsAreas;
}
namespace gd {
class EventsEditorSelection;
}
namespace gd {
@@ -120,29 +110,6 @@ class GD_CORE_API GroupEvent : public gd::BaseEvent {
virtual void UnserializeFrom(gd::Project& project,
const SerializerElement& element);
virtual gd::BaseEvent::EditEventReturnType EditEvent(
wxWindow* parent_,
gd::Project& project,
gd::Layout& scene,
gd::MainFrameWrapper& mainFrameWrapper);
/**
* Called by event editor to draw the event.
*/
virtual void Render(wxDC& dc,
int x,
int y,
unsigned int width,
gd::EventsEditorItemsAreas& areas,
gd::EventsEditorSelection& selection,
const gd::Platform& platform);
/**
* Must return the height of the event when rendered
*/
virtual unsigned int GetRenderedHeight(unsigned int width,
const gd::Platform& platform) const;
private:
EventsList events;

View File

@@ -5,18 +5,12 @@
*/
#include <fstream>
#include <iostream>
#if !defined(GD_NO_WX_GUI)
#include <wx/dcmemory.h>
#endif
#include "GDCore/CommonTools.h"
#include "GDCore/Events/Builtin/GroupEvent.h"
#include "GDCore/Events/Builtin/LinkEvent.h"
#include "GDCore/Events/CodeGeneration/EventsCodeGenerationContext.h"
#include "GDCore/Events/CodeGeneration/EventsCodeGenerator.h"
#include "GDCore/Events/Tools/EventsCodeNameMangler.h"
#include "GDCore/IDE/Dialogs/EventsEditor/EventsRenderingHelper.h"
#include "GDCore/IDE/Dialogs/LinkEventEditor.h"
#include "GDCore/IDE/wxTools/SkinHelper.h"
#include "GDCore/Project/ExternalEvents.h"
#include "GDCore/Project/Layout.h"
#include "GDCore/Project/Object.h"
@@ -161,90 +155,4 @@ void LinkEvent::UnserializeFrom(gd::Project& project,
}
}
gd::BaseEvent::EditEventReturnType LinkEvent::EditEvent(
wxWindow* parent_,
gd::Project& project,
gd::Layout& scene_,
gd::MainFrameWrapper& mainFrameWrapper_) {
#if !defined(GD_NO_WX_GUI)
LinkEventEditor dialog(parent_, *this, project);
if (dialog.ShowModal() == 0) return Cancelled;
#endif
return ChangesMade;
}
/**
* Render the event in the bitmap
*/
void LinkEvent::Render(wxDC& dc,
int x,
int y,
unsigned int width,
gd::EventsEditorItemsAreas& areas,
gd::EventsEditorSelection& selection,
const gd::Platform& platform) {
#if !defined(GD_NO_WX_GUI)
gd::EventsRenderingHelper* renderingHelper = gd::EventsRenderingHelper::Get();
dc.SetBrush(wxBrush(wxColour(255, 255, 255)));
dc.SetPen(wxPen(wxColour(0, 0, 0), 1));
wxRect rect(x + 1, y, width - 2, GetRenderedHeight(width, platform) - 2);
dc.DrawRectangle(rect);
dc.DrawBitmap(gd::SkinHelper::GetIcon("events", 24), x + 4, y + 1, true);
dc.SetTextBackground(wxColour(255, 255, 255));
if (!IsDisabled())
dc.SetTextForeground(wxColour(0, 0, 0));
else
dc.SetTextForeground(wxColour(160, 160, 160));
dc.SetFont(renderingHelper->GetNiceFont());
dc.DrawText(_("Link to ") + GetTarget(), x + 32, y + 3);
if (GetIncludeConfig() == INCLUDE_BY_INDEX) {
wxRect textRect = dc.GetTextExtent(_("Link to ") + GetTarget());
dc.DrawText(_("Include only events ") +
gd::String::From(GetIncludeStart() + 1) + _(" to ") +
gd::String::From(GetIncludeEnd() + 1),
x + textRect.GetWidth() + 32 + 10,
y + 5);
} else if (GetIncludeConfig() == INCLUDE_EVENTS_GROUP) {
wxRect textRect = dc.GetTextExtent(_("Link to ") + GetTarget());
dc.DrawText(_("Include only the events group named \"") +
gd::String::From(GetEventsGroupName()) + _("\""),
x + textRect.GetWidth() + 32 + 10,
y + 5);
}
#endif
}
/**
* Precompute height for the link
*/
unsigned int LinkEvent::GetRenderedHeight(unsigned int width,
const gd::Platform& platform) const {
#if !defined(GD_NO_WX_GUI)
if (eventHeightNeedUpdate) {
gd::EventsRenderingHelper* renderingHelper =
gd::EventsRenderingHelper::Get();
wxMemoryDC dc;
wxBitmap fakeBmp(1, 1);
dc.SelectObject(fakeBmp);
dc.SetFont(renderingHelper->GetNiceFont());
wxRect lien = dc.GetTextExtent(_("Link to "));
renderedHeight = lien.GetHeight() + 15;
eventHeightNeedUpdate = false;
}
return renderedHeight;
#else
return 0;
#endif
}
} // namespace gd

View File

@@ -109,29 +109,6 @@ class GD_CORE_API LinkEvent : public gd::BaseEvent {
virtual bool IsExecutable() const { return true; };
/**
* Called by event editor to draw the event.
*/
virtual void Render(wxDC& dc,
int x,
int y,
unsigned int width,
gd::EventsEditorItemsAreas& areas,
gd::EventsEditorSelection& selection,
const gd::Platform& platform);
/**
* Must return the height of the event when rendered
*/
virtual unsigned int GetRenderedHeight(unsigned int width,
const gd::Platform& platform) const;
virtual EditEventReturnType EditEvent(
wxWindow* parent_,
gd::Project& game_,
gd::Layout& scene_,
gd::MainFrameWrapper& mainFrameWrapper_);
virtual void SerializeTo(SerializerElement& element) const;
virtual void UnserializeFrom(gd::Project& project,
const SerializerElement& element);

View File

@@ -9,10 +9,6 @@
#include "GDCore/Events/CodeGeneration/EventsCodeGenerator.h"
#include "GDCore/Events/CodeGeneration/ExpressionsCodeGeneration.h"
#include "GDCore/Events/Serialization.h"
#include "GDCore/IDE/Dialogs/EditRepeatEvent.h"
#include "GDCore/IDE/Dialogs/EventsEditor/EventsEditorItemsAreas.h"
#include "GDCore/IDE/Dialogs/EventsEditor/EventsEditorSelection.h"
#include "GDCore/IDE/Dialogs/EventsEditor/EventsRenderingHelper.h"
#include "GDCore/Serialization/SerializerElement.h"
using namespace std;
@@ -92,109 +88,4 @@ void RepeatEvent::UnserializeFrom(gd::Project& project,
project, events, element.GetChild("events", 0, "Events"));
}
/**
* Render the event in the bitmap
*/
void RepeatEvent::Render(wxDC& dc,
int x,
int y,
unsigned int width,
gd::EventsEditorItemsAreas& areas,
gd::EventsEditorSelection& selection,
const gd::Platform& platform) {
#if !defined(GD_NO_WX_GUI)
gd::EventsRenderingHelper* renderingHelper = gd::EventsRenderingHelper::Get();
int border = renderingHelper->instructionsListBorder;
const int repeatTextHeight = 20;
// Draw header rectangle
wxRect headerRect(x, y, width, repeatTextHeight);
renderingHelper->DrawNiceRectangle(dc, headerRect);
// Repeat text
dc.SetFont(renderingHelper->GetNiceFont().Bold());
if (!IsDisabled())
dc.SetTextForeground(wxColour(0, 0, 0));
else
dc.SetTextForeground(wxColour(160, 160, 160));
dc.DrawText(_("Repeat") + " " + repeatNumberExpression.GetPlainString() +
" " + _("times :"),
x + 4,
y + 3);
// Draw conditions rectangle
wxRect rect(x,
y + repeatTextHeight,
renderingHelper->GetConditionsColumnWidth() + border,
GetRenderedHeight(width, platform) - repeatTextHeight);
renderingHelper->DrawNiceRectangle(dc, rect);
// Draw actions and conditions
renderingHelper->DrawConditionsList(
conditions,
dc,
x + border,
y + repeatTextHeight + border,
renderingHelper->GetConditionsColumnWidth() - border,
this,
areas,
selection,
platform);
renderingHelper->DrawActionsList(
actions,
dc,
x + renderingHelper->GetConditionsColumnWidth() + border,
y + repeatTextHeight + border,
width - renderingHelper->GetConditionsColumnWidth() - border * 2,
this,
areas,
selection,
platform);
#endif
}
unsigned int RepeatEvent::GetRenderedHeight(
unsigned int width, const gd::Platform& platform) const {
#if !defined(GD_NO_WX_GUI)
if (eventHeightNeedUpdate) {
gd::EventsRenderingHelper* renderingHelper =
gd::EventsRenderingHelper::Get();
int border = renderingHelper->instructionsListBorder;
const int repeatTextHeight = 20;
// Get maximum height needed
int conditionsHeight = renderingHelper->GetRenderedConditionsListHeight(
conditions,
renderingHelper->GetConditionsColumnWidth() - border,
platform);
int actionsHeight = renderingHelper->GetRenderedActionsListHeight(
actions,
width - renderingHelper->GetConditionsColumnWidth() - border * 2,
platform);
renderedHeight =
(conditionsHeight > actionsHeight ? conditionsHeight : actionsHeight) +
repeatTextHeight + border * 2;
eventHeightNeedUpdate = false;
}
return renderedHeight;
#else
return 0;
#endif
}
gd::BaseEvent::EditEventReturnType RepeatEvent::EditEvent(
wxWindow* parent_,
gd::Project& game_,
gd::Layout& scene_,
gd::MainFrameWrapper& mainFrameWrapper_) {
#if !defined(GD_NO_WX_GUI)
EditRepeatEvent dialog(parent_, *this, game_, scene_);
if (dialog.ShowModal() == 0) return Cancelled;
#endif
return ChangesMade;
}
} // namespace gd

View File

@@ -10,18 +10,8 @@
#include "GDCore/Events/EventsList.h"
namespace gd {
class Instruction;
}
namespace gd {
class Project;
}
class RuntimeScene;
class TiXmlElement;
namespace gd {
class EventsEditorItemsAreas;
}
namespace gd {
class EventsEditorSelection;
}
namespace gd {
@@ -65,32 +55,6 @@ class GD_CORE_API RepeatEvent : public gd::BaseEvent {
virtual void UnserializeFrom(gd::Project& project,
const SerializerElement& element);
/**
* Called by event editor to draw the event.
*/
virtual void Render(wxDC& dc,
int x,
int y,
unsigned int width,
gd::EventsEditorItemsAreas& areas,
gd::EventsEditorSelection& selection,
const gd::Platform& platform);
/**
* Must return the height of the event when rendered
*/
virtual unsigned int GetRenderedHeight(unsigned int width,
const gd::Platform& platform) const;
/**
* Called when the user want to edit the event
*/
virtual EditEventReturnType EditEvent(
wxWindow* parent_,
gd::Project& game_,
gd::Layout& scene_,
gd::MainFrameWrapper& mainFrameWrapper_);
private:
gd::Expression repeatNumberExpression;
gd::InstructionsList conditions;

View File

@@ -9,11 +9,7 @@
#include "GDCore/Events/CodeGeneration/EventsCodeGenerationContext.h"
#include "GDCore/Events/CodeGeneration/EventsCodeGenerator.h"
#include "GDCore/Events/Serialization.h"
#include "GDCore/IDE/Dialogs/EventsEditor/EventsEditorItemsAreas.h"
#include "GDCore/IDE/Dialogs/EventsEditor/EventsEditorSelection.h"
#include "GDCore/IDE/Dialogs/EventsEditor/EventsRenderingHelper.h"
#include "GDCore/Serialization/SerializerElement.h"
#include "GDCore/TinyXml/tinyxml.h"
using namespace std;
@@ -71,82 +67,4 @@ void StandardEvent::UnserializeFrom(gd::Project& project,
project, events, element.GetChild("events", 0, "Events"));
}
/**
* Render the event in the bitmap
*/
void StandardEvent::Render(wxDC& dc,
int x,
int y,
unsigned int width,
gd::EventsEditorItemsAreas& areas,
gd::EventsEditorSelection& selection,
const gd::Platform& platform) {
#if !defined(GD_NO_WX_GUI)
gd::EventsRenderingHelper* renderingHelper = gd::EventsRenderingHelper::Get();
int border = renderingHelper->instructionsListBorder;
// Draw event rectangle
wxRect rect(x,
y,
renderingHelper->GetConditionsColumnWidth() + border,
GetRenderedHeight(width, platform));
renderingHelper->DrawNiceRectangle(dc, rect);
renderingHelper->DrawConditionsList(
conditions,
dc,
x + border,
y + border,
renderingHelper->GetConditionsColumnWidth() - border,
this,
areas,
selection,
platform);
renderingHelper->DrawActionsList(
actions,
dc,
x + renderingHelper->GetConditionsColumnWidth() + border,
y + border,
width - renderingHelper->GetConditionsColumnWidth() - border * 2,
this,
areas,
selection,
platform);
// Make sure that Render is rendering an event with the same height as
// GetRenderedHeight : Use same values for border and similar calls to compute
// heights
#endif
}
unsigned int StandardEvent::GetRenderedHeight(
unsigned int width, const gd::Platform& platform) const {
#if !defined(GD_NO_WX_GUI)
if (eventHeightNeedUpdate) {
gd::EventsRenderingHelper* renderingHelper =
gd::EventsRenderingHelper::Get();
int border = renderingHelper->instructionsListBorder;
// Get maximum height needed
int conditionsHeight = renderingHelper->GetRenderedConditionsListHeight(
conditions,
renderingHelper->GetConditionsColumnWidth() - border * 2,
platform);
int actionsHeight = renderingHelper->GetRenderedActionsListHeight(
actions,
width - renderingHelper->GetConditionsColumnWidth() - border * 2,
platform);
renderedHeight =
(conditionsHeight > actionsHeight ? conditionsHeight : actionsHeight) +
border * 2;
eventHeightNeedUpdate = false;
}
return renderedHeight;
#else
return 0;
#endif
}
} // namespace gd

View File

@@ -13,19 +13,8 @@
#include "GDCore/Events/InstructionsList.h"
namespace gd {
class Instruction;
}
namespace gd {
class Project;
}
class RuntimeScene;
class TiXmlElement;
class EventsCodeGenerationContext;
namespace gd {
class EventsEditorItemsAreas;
}
namespace gd {
class EventsEditorSelection;
}
namespace gd {
@@ -60,23 +49,6 @@ class GD_CORE_API StandardEvent : public gd::BaseEvent {
virtual void UnserializeFrom(gd::Project& project,
const SerializerElement& element);
/**
* Called by event editor to draw the event.
*/
virtual void Render(wxDC& dc,
int x,
int y,
unsigned int width,
gd::EventsEditorItemsAreas& areas,
gd::EventsEditorSelection& selection,
const gd::Platform& platform);
/**
* Must return the height of the event when rendered
*/
virtual unsigned int GetRenderedHeight(unsigned int width,
const gd::Platform& platform) const;
private:
gd::InstructionsList conditions;
gd::InstructionsList actions;

View File

@@ -6,19 +6,11 @@
#if defined(GD_IDE_ONLY)
#include "WhileEvent.h"
#if !defined(GD_NO_WX_GUI)
#include <wx/msgdlg.h>
#include "GDCore/IDE/wxTools/CommonBitmapProvider.h"
#endif
#include "GDCore/Events/CodeGeneration/EventsCodeGenerationContext.h"
#include "GDCore/Events/CodeGeneration/EventsCodeGenerator.h"
#include "GDCore/Events/CodeGeneration/ExpressionsCodeGeneration.h"
#include "GDCore/Events/Serialization.h"
#include "GDCore/IDE/Dialogs/EventsEditor/EventsEditorItemsAreas.h"
#include "GDCore/IDE/Dialogs/EventsEditor/EventsEditorSelection.h"
#include "GDCore/IDE/Dialogs/EventsEditor/EventsRenderingHelper.h"
#include "GDCore/Serialization/SerializerElement.h"
#include "GDCore/TinyXml/tinyxml.h"
using namespace std;
@@ -83,165 +75,5 @@ void WhileEvent::UnserializeFrom(gd::Project& project,
project, events, element.GetChild("events", 0, "Events"));
}
/**
* Render the event in the bitmap
*/
void WhileEvent::Render(wxDC& dc,
int x,
int y,
unsigned int width,
gd::EventsEditorItemsAreas& areas,
gd::EventsEditorSelection& selection,
const gd::Platform& platform) {
#if !defined(GD_NO_WX_GUI)
gd::EventsRenderingHelper* renderingHelper = gd::EventsRenderingHelper::Get();
int border = renderingHelper->instructionsListBorder;
const int repeatHeight = 20;
// Draw header rectangle
int whileConditionsHeight =
renderingHelper->GetRenderedConditionsListHeight(
whileConditions, width - 80 - border * 2, platform) +
border * 2;
if (!infiniteLoopWarning && whileConditionsHeight < 32)
whileConditionsHeight = 32;
wxRect headerRect(x, y, width, whileConditionsHeight + repeatHeight);
renderingHelper->DrawNiceRectangle(dc, headerRect);
// While text
dc.SetFont(renderingHelper->GetNiceFont().Bold());
if (!IsDisabled())
dc.SetTextForeground(wxColour(0, 0, 0));
else
dc.SetTextForeground(wxColour(160, 160, 160));
dc.DrawText(_("While :"), x + 5, y + 5);
// Draw icon if infinite loop warning is deactivated.
if (!infiniteLoopWarning) {
if (gd::CommonBitmapProvider::Get()->noProtection.IsOk())
dc.DrawBitmap(gd::CommonBitmapProvider::Get()->noProtection,
wxPoint(x + 5, y + 5 + 18),
/*useMask=*/true);
}
// Draw "while conditions"
renderingHelper->DrawConditionsList(whileConditions,
dc,
x + 80 + border,
y + border,
width - 80 - border * 2,
this,
areas,
selection,
platform);
dc.SetFont(renderingHelper->GetNiceFont().Bold());
if (!IsDisabled())
dc.SetTextForeground(wxColour(0, 0, 0));
else
dc.SetTextForeground(wxColour(160, 160, 160));
dc.DrawText(_("Repeat :"), x + 4, y + whileConditionsHeight + 3);
whileConditionsHeight += repeatHeight;
// Draw conditions rectangle
wxRect rect(x,
y + whileConditionsHeight,
renderingHelper->GetConditionsColumnWidth() + border,
GetRenderedHeight(width, platform) - whileConditionsHeight);
renderingHelper->DrawNiceRectangle(dc, rect);
renderingHelper->DrawConditionsList(
conditions,
dc,
x + border,
y + whileConditionsHeight + border,
renderingHelper->GetConditionsColumnWidth() - border,
this,
areas,
selection,
platform);
renderingHelper->DrawActionsList(
actions,
dc,
x + renderingHelper->GetConditionsColumnWidth() + border,
y + whileConditionsHeight + border,
width - renderingHelper->GetConditionsColumnWidth() - border * 2,
this,
areas,
selection,
platform);
#endif
}
unsigned int WhileEvent::GetRenderedHeight(unsigned int width,
const gd::Platform& platform) const {
#if !defined(GD_NO_WX_GUI)
if (eventHeightNeedUpdate) {
gd::EventsRenderingHelper* renderingHelper =
gd::EventsRenderingHelper::Get();
int border = renderingHelper->instructionsListBorder;
const int repeatHeight = 20;
// Get maximum height needed
int whileConditionsHeight =
renderingHelper->GetRenderedConditionsListHeight(
whileConditions, width - 80 - border * 2, platform);
if (!infiniteLoopWarning && whileConditionsHeight < 32)
whileConditionsHeight = 32;
int conditionsHeight = renderingHelper->GetRenderedConditionsListHeight(
conditions,
renderingHelper->GetConditionsColumnWidth() - border,
platform);
int actionsHeight = renderingHelper->GetRenderedActionsListHeight(
actions,
width - renderingHelper->GetConditionsColumnWidth() - border * 2,
platform);
renderedHeight =
((conditionsHeight > actionsHeight ? conditionsHeight : actionsHeight) +
whileConditionsHeight + repeatHeight) +
border * 2 + border * 2;
eventHeightNeedUpdate = false;
}
return renderedHeight;
#else
return 0;
#endif
}
gd::BaseEvent::EditEventReturnType WhileEvent::EditEvent(
wxWindow* parent_,
gd::Project& game_,
gd::Layout& scene_,
gd::MainFrameWrapper& mainFrameWrapper_) {
#if !defined(GD_NO_WX_GUI)
if (!justCreatedByTheUser) {
wxMessageDialog dialog(
parent_,
_("Do you want to activate the display of a message if the event is "
"repeated 100000 times? This message prevent the software from being "
"frozen if you accidentally create an infinite loop ( by letting the "
"conditions empty for example )."),
_("Protection against infinite loops."),
wxYES_NO | wxCANCEL | wxICON_INFORMATION);
dialog.SetExtendedMessage(_(
"This message is activated by default for \"While\" events in the IDE, "
"and is deactivated when the game is compiled to an executable."));
dialog.SetYesNoCancelLabels(_("Activate"), _("Deactivate"), _("Cancel"));
int answer = dialog.ShowModal();
if (answer == wxID_YES)
infiniteLoopWarning = true;
else if (answer == wxID_NO)
infiniteLoopWarning = false;
}
justCreatedByTheUser = false; // Show Message dialog next time.
#endif
return ChangesMade;
}
} // namespace gd
#endif

View File

@@ -10,18 +10,8 @@
#include "GDCore/Events/EventsList.h"
namespace gd {
class Instruction;
}
namespace gd {
class Project;
}
class RuntimeScene;
class TiXmlElement;
namespace gd {
class EventsEditorItemsAreas;
}
namespace gd {
class EventsEditorSelection;
}
namespace gd {
@@ -71,32 +61,6 @@ class GD_CORE_API WhileEvent : public gd::BaseEvent {
virtual void UnserializeFrom(gd::Project& project,
const SerializerElement& element);
/**
* Called by event editor to draw the event.
*/
virtual void Render(wxDC& dc,
int x,
int y,
unsigned int width,
gd::EventsEditorItemsAreas& areas,
gd::EventsEditorSelection& selection,
const gd::Platform& platform);
/**
* Must return the height of the event when rendered
*/
virtual unsigned int GetRenderedHeight(unsigned int width,
const gd::Platform& platform) const;
/**
* Called when the user want to edit the event
*/
virtual EditEventReturnType EditEvent(
wxWindow* parent_,
gd::Project& game_,
gd::Layout& scene_,
gd::MainFrameWrapper& mainFrameWrapper_);
private:
gd::InstructionsList whileConditions;
gd::InstructionsList conditions;

View File

@@ -24,6 +24,10 @@ void EventsCodeGenerationContext::InheritsFrom(
parent_.objectsListsToBeDeclared.end(),
std::inserter(alreadyDeclaredObjectsLists,
alreadyDeclaredObjectsLists.begin()));
std::copy(parent_.objectsListsWithoutPickingToBeDeclared.begin(),
parent_.objectsListsWithoutPickingToBeDeclared.end(),
std::inserter(alreadyDeclaredObjectsLists,
alreadyDeclaredObjectsLists.begin()));
std::copy(parent_.emptyObjectsListsToBeDeclared.begin(),
parent_.emptyObjectsListsToBeDeclared.end(),
std::inserter(alreadyDeclaredObjectsLists,
@@ -47,16 +51,23 @@ void EventsCodeGenerationContext::Reuse(
void EventsCodeGenerationContext::ObjectsListNeeded(
const gd::String& objectName) {
if (emptyObjectsListsToBeDeclared.find(objectName) ==
emptyObjectsListsToBeDeclared.end())
if (!IsToBeDeclared(objectName))
objectsListsToBeDeclared.insert(objectName);
depthOfLastUse[objectName] = GetContextDepth();
}
void EventsCodeGenerationContext::ObjectsListWithoutPickingNeeded(
const gd::String& objectName) {
if (!IsToBeDeclared(objectName))
objectsListsWithoutPickingToBeDeclared.insert(objectName);
depthOfLastUse[objectName] = GetContextDepth();
}
void EventsCodeGenerationContext::EmptyObjectsListNeeded(
const gd::String& objectName) {
if (objectsListsToBeDeclared.find(objectName) ==
objectsListsToBeDeclared.end())
if (!IsToBeDeclared(objectName))
emptyObjectsListsToBeDeclared.insert(objectName);
depthOfLastUse[objectName] = GetContextDepth();
@@ -66,6 +77,8 @@ std::set<gd::String> EventsCodeGenerationContext::GetAllObjectsToBeDeclared()
const {
std::set<gd::String> allObjectListsToBeDeclared(
objectsListsToBeDeclared.begin(), objectsListsToBeDeclared.end());
allObjectListsToBeDeclared.insert(objectsListsWithoutPickingToBeDeclared.begin(),
objectsListsWithoutPickingToBeDeclared.end());
allObjectListsToBeDeclared.insert(emptyObjectsListsToBeDeclared.begin(),
emptyObjectsListsToBeDeclared.end());

View File

@@ -5,7 +5,6 @@
*/
#ifndef EVENTSCODEGENERATIONCONTEXT_H
#define EVENTSCODEGENERATIONCONTEXT_H
#include <map>
#include <memory>
#include <set>
@@ -21,7 +20,7 @@ namespace gd {
* - The "current object", i.e the object being used by an action or a
* condition.
* - If conditions are being generated, the context keeps track of the depth of
* the conditions ( see GetCurrentConditionDepth )
* the conditions (see GetCurrentConditionDepth)
* - You can also get the context depth of the last use of an object list.
*/
class GD_CORE_API EventsCodeGenerationContext {
@@ -106,19 +105,31 @@ class GD_CORE_API EventsCodeGenerationContext {
const gd::String& GetCurrentObject() const { return currentObject; };
/**
* \brief Call this when an instruction in the event need an object list.
* \brief Call this when an instruction in the event needs an objects list.
*
* The list will be filled with objects from the scene if it is the first time
* it is requested, unless there is already an object list with this name (
* i.e. ObjectAlreadyDeclared(objectName) returns true ).
* it is requested, unless there is already an object list with this name
* (i.e. `ObjectAlreadyDeclared(objectName)` returns true).
*/
void ObjectsListNeeded(const gd::String& objectName);
/**
* Call this when an instruction in the event need an object list.
* An empty event list will be declared, without filling it with objects from
* the scene. If there is already an object list with this name, no new list
* will be declared again.
* Call this when an instruction in the event needs an empty objects list
* or the one already declared, if any.
*
* An empty objects list will be declared, without filling it with objects
* from the scene. If there is already an objects list with this name, no new
* list will be declared again.
*/
void ObjectsListWithoutPickingNeeded(const gd::String& objectName);
/**
* Call this when an instruction in the event needs an empty object list,
* even if one is already declared.
*
* An empty objects list will be declared, without filling it with objects
* from the scene. If there is already an object list with this name, it won't
* be used to initialize the new list, which will remain empty.
*/
void EmptyObjectsListNeeded(const gd::String& objectName);
@@ -152,8 +163,18 @@ class GD_CORE_API EventsCodeGenerationContext {
};
/**
* Return the objects lists which will be declared, but no filled, by the
* current context
* Return the objects lists which will be will be declared, without filling
* them with objects from the scene.
*/
const std::set<gd::String>& GetObjectsListsToBeDeclaredWithoutPicking()
const {
return objectsListsWithoutPickingToBeDeclared;
};
/**
* Return the objects lists which will be will be declared empty, without
* filling them with objects from the scene and without copying any previously
* declared objects list.
*/
const std::set<gd::String>& GetObjectsListsToBeDeclaredEmpty() const {
return emptyObjectsListsToBeDeclared;
@@ -207,6 +228,21 @@ class GD_CORE_API EventsCodeGenerationContext {
size_t GetCurrentConditionDepth() const { return customConditionDepth; }
private:
/**
* \brief Returns true if the given object is already going to be declared
* (either as a traditional objects list, or one without picking, or one
* empty).
*
*/
bool IsToBeDeclared(const gd::String& objectName) {
return objectsListsToBeDeclared.find(objectName) !=
objectsListsToBeDeclared.end() ||
objectsListsWithoutPickingToBeDeclared.find(objectName) !=
objectsListsWithoutPickingToBeDeclared.end() ||
emptyObjectsListsToBeDeclared.find(objectName) !=
emptyObjectsListsToBeDeclared.end();
};
std::set<gd::String>
alreadyDeclaredObjectsLists; ///< Objects lists already needed in a
///< parent context.
@@ -214,9 +250,16 @@ class GD_CORE_API EventsCodeGenerationContext {
objectsListsToBeDeclared; ///< Objects lists that will be declared in
///< this context.
std::set<gd::String>
emptyObjectsListsToBeDeclared; ///< Objects lists that will be declared
///< in this context, but not filled with
///< scene's objects.
objectsListsWithoutPickingToBeDeclared; ///< Objects lists that will be
///< declared in this context,
///< but not filled with scene's
///< objects.
std::set<gd::String>
emptyObjectsListsToBeDeclared; ///< Objects lists that will be
///< declared in this context,
///< but not filled with scene's
///< objects and not filled with any
///< previously existing objects list.
std::map<gd::String, unsigned int>
depthOfLastUse; ///< The context depth when an object was last used.
gd::String

View File

@@ -3,6 +3,7 @@
#include <utility>
#include "GDCore/CommonTools.h"
#include "GDCore/Events/CodeGeneration/EventsCodeGenerationContext.h"
#include "GDCore/Events/CodeGeneration/ExpressionCodeGenerator.h"
#include "GDCore/Events/CodeGeneration/ExpressionsCodeGeneration.h"
#include "GDCore/Events/Parsers/ExpressionParser.h"
#include "GDCore/Events/Tools/EventsCodeNameMangler.h"
@@ -10,11 +11,12 @@
#include "GDCore/Extensions/Metadata/InstructionMetadata.h"
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
#include "GDCore/Extensions/Metadata/ObjectMetadata.h"
#include "GDCore/Extensions/Metadata/ParameterMetadataTools.h"
#include "GDCore/Extensions/Platform.h"
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/Project/Layout.h"
#include "GDCore/Project/Project.h"
#include "GDCore/Project/ObjectsContainer.h"
#include "GDCore/Project/Project.h"
using namespace std;
@@ -295,11 +297,14 @@ gd::String EventsCodeGenerator::GenerateConditionCode(
if (!GetObjectsAndGroups().HasObjectNamed(objectInParameter) &&
!GetGlobalObjectsAndGroups().HasObjectNamed(objectInParameter) &&
!GetObjectsAndGroups().GetObjectGroups().Has(objectInParameter) &&
!GetGlobalObjectsAndGroups().GetObjectGroups().Has(objectInParameter)) {
!GetGlobalObjectsAndGroups().GetObjectGroups().Has(
objectInParameter)) {
condition.SetParameter(pNb, gd::Expression(""));
condition.SetType("");
} else if (!instrInfos.parameters[pNb].supplementaryInformation.empty() &&
gd::GetTypeOfObject(GetGlobalObjectsAndGroups(), GetObjectsAndGroups(), objectInParameter) !=
gd::GetTypeOfObject(GetGlobalObjectsAndGroups(),
GetObjectsAndGroups(),
objectInParameter) !=
instrInfos.parameters[pNb].supplementaryInformation) {
condition.SetParameter(pNb, gd::Expression(""));
condition.SetType("");
@@ -328,7 +333,8 @@ gd::String EventsCodeGenerator::GenerateConditionCode(
gd::String objectName = condition.GetParameters().empty()
? ""
: condition.GetParameter(0).GetPlainString();
gd::String objectType = gd::GetTypeOfObject(GetGlobalObjectsAndGroups(), GetObjectsAndGroups(), objectName);
gd::String objectType = gd::GetTypeOfObject(
GetGlobalObjectsAndGroups(), GetObjectsAndGroups(), objectName);
if (!objectName.empty() &&
MetadataProvider::HasObjectCondition(
platform, objectType, condition.GetType()) &&
@@ -473,11 +479,14 @@ gd::String EventsCodeGenerator::GenerateActionCode(
if (!GetObjectsAndGroups().HasObjectNamed(objectInParameter) &&
!GetGlobalObjectsAndGroups().HasObjectNamed(objectInParameter) &&
!GetObjectsAndGroups().GetObjectGroups().Has(objectInParameter) &&
!GetGlobalObjectsAndGroups().GetObjectGroups().Has(objectInParameter)) {
!GetGlobalObjectsAndGroups().GetObjectGroups().Has(
objectInParameter)) {
action.SetParameter(pNb, gd::Expression(""));
action.SetType("");
} else if (!instrInfos.parameters[pNb].supplementaryInformation.empty() &&
gd::GetTypeOfObject(GetGlobalObjectsAndGroups(), GetObjectsAndGroups(), objectInParameter) !=
gd::GetTypeOfObject(GetGlobalObjectsAndGroups(),
GetObjectsAndGroups(),
objectInParameter) !=
instrInfos.parameters[pNb].supplementaryInformation) {
action.SetParameter(pNb, gd::Expression(""));
action.SetType("");
@@ -496,7 +505,8 @@ gd::String EventsCodeGenerator::GenerateActionCode(
gd::String objectName = action.GetParameters().empty()
? ""
: action.GetParameter(0).GetPlainString();
gd::String objectType = gd::GetTypeOfObject(GetGlobalObjectsAndGroups(), GetObjectsAndGroups(), objectName);
gd::String objectType = gd::GetTypeOfObject(
GetGlobalObjectsAndGroups(), GetObjectsAndGroups(), objectName);
if (MetadataProvider::HasObjectAction(
platform, objectType, action.GetType()) &&
!instrInfos.parameters.empty()) {
@@ -527,6 +537,7 @@ gd::String EventsCodeGenerator::GenerateActionCode(
action.GetParameters().size() < 2
? ""
: action.GetParameter(1).GetPlainString());
if (MetadataProvider::HasBehaviorAction(
platform, behaviorType, action.GetType()) &&
instrInfos.parameters.size() >= 2) {
@@ -582,34 +593,24 @@ gd::String EventsCodeGenerator::GenerateParameterCodes(
const gd::String& parameter,
const gd::ParameterMetadata& metadata,
gd::EventsCodeGenerationContext& context,
const gd::String& previousParameter,
const gd::String& lastObjectName,
std::vector<std::pair<gd::String, gd::String> >*
supplementaryParametersTypes) {
gd::String argOutput;
if (ParameterMetadata::IsExpression("number", metadata.type)) {
CallbacksForGeneratingExpressionCode callbacks(argOutput, *this, context);
gd::ExpressionParser parser(parameter);
if (!parser.ParseMathExpression(platform, GetGlobalObjectsAndGroups(), GetObjectsAndGroups(), callbacks)) {
cout << "Error :" << parser.GetFirstError() << " in: " << parameter
<< endl;
argOutput = "0";
}
if (argOutput.empty()) argOutput = "0";
argOutput = gd::ExpressionCodeGenerator::GenerateExpressionCode(
*this, context, "number", parameter);
} else if (ParameterMetadata::IsExpression("string", metadata.type)) {
CallbacksForGeneratingExpressionCode callbacks(argOutput, *this, context);
gd::ExpressionParser parser(parameter);
if (!parser.ParseStringExpression(platform, GetGlobalObjectsAndGroups(), GetObjectsAndGroups(), callbacks)) {
cout << "Error in text expression" << parser.GetFirstError() << endl;
argOutput = "\"\"";
}
if (argOutput.empty()) argOutput = "\"\"";
argOutput = gd::ExpressionCodeGenerator::GenerateExpressionCode(
*this, context, "string", parameter);
} else if (ParameterMetadata::IsExpression("variable", metadata.type)) {
argOutput = gd::ExpressionCodeGenerator::GenerateExpressionCode(
*this, context, metadata.type, parameter, lastObjectName);
} else if (ParameterMetadata::IsObject(metadata.type)) {
// It would be possible to run a gd::ExpressionCodeGenerator if later
// objects can have nested objects, or function returning objects.
argOutput = GenerateObject(parameter, metadata.type, context);
} else if (metadata.type == "relationalOperator") {
argOutput += parameter == "=" ? "==" : parameter;
if (argOutput != "==" && argOutput != "<" && argOutput != ">" &&
@@ -628,14 +629,12 @@ gd::String EventsCodeGenerator::GenerateParameterCodes(
}
argOutput = "\"" + argOutput + "\"";
} else if (metadata.type == "object" || metadata.type == "behavior") {
} else if (ParameterMetadata::IsBehavior(metadata.type)) {
argOutput = "\"" + ConvertToString(parameter) + "\"";
} else if (metadata.type == "key") {
argOutput = "\"" + ConvertToString(parameter) + "\"";
} else if (metadata.type == "objectvar" || metadata.type == "scenevar" ||
metadata.type == "globalvar" || metadata.type == "password" ||
metadata.type == "musicfile" || metadata.type == "soundfile" ||
metadata.type == "police") {
} else if (metadata.type == "password" || metadata.type == "musicfile" ||
metadata.type == "soundfile" || metadata.type == "police") {
argOutput = "\"" + ConvertToString(parameter) + "\"";
} else if (metadata.type == "mouse") {
argOutput = "\"" + ConvertToString(parameter) + "\"";
@@ -672,36 +671,37 @@ gd::String EventsCodeGenerator::GenerateParameterCodes(
}
vector<gd::String> EventsCodeGenerator::GenerateParametersCodes(
vector<gd::Expression> parameters,
const vector<gd::Expression>& parameters,
const vector<gd::ParameterMetadata>& parametersInfo,
EventsCodeGenerationContext& context,
std::vector<std::pair<gd::String, gd::String> >*
supplementaryParametersTypes) {
vector<gd::String> arguments;
while (parameters.size() < parametersInfo.size())
parameters.push_back(gd::Expression(""));
for (std::size_t pNb = 0;
pNb < parametersInfo.size() && pNb < parameters.size();
++pNb) {
if (parameters[pNb].GetPlainString().empty() &&
parametersInfo[pNb].optional)
parameters[pNb] = gd::Expression(parametersInfo[pNb].defaultValue);
gd::String argOutput = GenerateParameterCodes(
parameters[pNb].GetPlainString(),
parametersInfo[pNb],
context,
pNb == 0 ? "" : parameters[pNb - 1].GetPlainString(),
supplementaryParametersTypes);
arguments.push_back(argOutput);
}
gd::ParameterMetadataTools::IterateOverParameters(
parameters,
parametersInfo,
[this, &context, &supplementaryParametersTypes, &arguments](
const gd::ParameterMetadata& parameterMetadata,
const gd::String& parameterValue,
const gd::String& lastObjectName) {
gd::String argOutput =
GenerateParameterCodes(parameterValue,
parameterMetadata,
context,
lastObjectName,
supplementaryParametersTypes);
arguments.push_back(argOutput);
});
return arguments;
}
gd::String EventsCodeGenerator::GenerateGetBehaviorNameCode(
const gd::String& behaviorName) {
return ConvertToStringExplicit(behaviorName);
}
gd::String EventsCodeGenerator::GenerateObjectsDeclarationCode(
EventsCodeGenerationContext& context) {
auto declareObjectList = [this](gd::String object,
@@ -746,7 +746,7 @@ gd::String EventsCodeGenerator::GenerateObjectsDeclarationCode(
declarationsCode += objectListDeclaration + "\n";
}
for (auto object : context.GetObjectsListsToBeDeclaredEmpty()) {
for (auto object : context.GetObjectsListsToBeDeclaredWithoutPicking()) {
gd::String objectListDeclaration = "";
if (!context.ObjectAlreadyDeclared(object)) {
objectListDeclaration = "std::vector<RuntimeObject*> " +
@@ -757,6 +757,18 @@ gd::String EventsCodeGenerator::GenerateObjectsDeclarationCode(
declarationsCode += objectListDeclaration + "\n";
}
for (auto object : context.GetObjectsListsToBeDeclaredEmpty()) {
gd::String objectListDeclaration = "";
if (!context.ObjectAlreadyDeclared(object)) {
objectListDeclaration = "std::vector<RuntimeObject*> " +
GetObjectListName(object, context) + ";\n";
context.SetObjectDeclared(object);
} else
objectListDeclaration = "std::vector<RuntimeObject*> " +
GetObjectListName(object, context) + ";\n";
declarationsCode += objectListDeclaration + "\n";
}
return declarationsCode;
}
@@ -799,23 +811,10 @@ gd::String EventsCodeGenerator::GenerateEventsListCode(
}
gd::String EventsCodeGenerator::ConvertToString(gd::String plainString) {
for (size_t i = 0; i < plainString.length(); ++i) {
if (plainString[i] == '\\') {
if (i + 1 >= plainString.length() || plainString[i + 1] != '\"') {
if (i + 1 < plainString.length())
plainString.insert(i + 1, "\\");
else
plainString += ("\\");
++i;
}
} else if (plainString[i] == '"') {
plainString.insert(i, "\\");
++i;
}
}
plainString = plainString.FindAndReplace("\n", "\\n");
plainString = plainString.FindAndReplace("\\", "\\\\")
.FindAndReplace("\r", "\\r")
.FindAndReplace("\n", "\\n")
.FindAndReplace("\"", "\\\"");
return plainString;
}
@@ -831,10 +830,12 @@ std::vector<gd::String> EventsCodeGenerator::ExpandObjectsName(
// Note: this logic is duplicated in EventsContextAnalyzer::ExpandObjectsName
std::vector<gd::String> realObjects;
if (globalObjectsAndGroups.GetObjectGroups().Has(objectName))
realObjects =
globalObjectsAndGroups.GetObjectGroups().Get(objectName).GetAllObjectsNames();
realObjects = globalObjectsAndGroups.GetObjectGroups()
.Get(objectName)
.GetAllObjectsNames();
else if (objectsAndGroups.GetObjectGroups().Has(objectName))
realObjects = objectsAndGroups.GetObjectGroups().Get(objectName).GetAllObjectsNames();
realObjects =
objectsAndGroups.GetObjectGroups().Get(objectName).GetAllObjectsNames();
else
realObjects.push_back(objectName);
@@ -893,7 +894,9 @@ gd::String EventsCodeGenerator::GenerateObjectFunctionCall(
gd::String parametersStr,
gd::String defaultOutput,
gd::EventsCodeGenerationContext& context) {
return "TODO (GenerateObjectFunctionCall)";
// To be used for testing only.
return objectListName + "." + codeInfo.functionCallName + "(" +
parametersStr + ") ?? " + defaultOutput;
}
gd::String EventsCodeGenerator::GenerateObjectBehaviorFunctionCall(
@@ -904,7 +907,10 @@ gd::String EventsCodeGenerator::GenerateObjectBehaviorFunctionCall(
gd::String parametersStr,
gd::String defaultOutput,
gd::EventsCodeGenerationContext& context) {
return "TODO (GenerateObjectBehaviorFunctionCall)";
// To be used for testing only.
return objectListName + "::" + behaviorName + "." +
codeInfo.functionCallName + "(" + parametersStr + ") ?? " +
defaultOutput;
}
gd::String EventsCodeGenerator::GenerateFreeCondition(
@@ -1135,9 +1141,10 @@ EventsCodeGenerator::EventsCodeGenerator(gd::Project& project_,
maxCustomConditionsDepth(0),
maxConditionsListsSize(0){};
EventsCodeGenerator::EventsCodeGenerator(const gd::Platform& platform_,
gd::ObjectsContainer & globalObjectsAndGroups_,
const gd::ObjectsContainer & objectsAndGroups_)
EventsCodeGenerator::EventsCodeGenerator(
const gd::Platform& platform_,
gd::ObjectsContainer& globalObjectsAndGroups_,
const gd::ObjectsContainer& objectsAndGroups_)
: platform(platform_),
globalObjectsAndGroups(globalObjectsAndGroups_),
objectsAndGroups(objectsAndGroups_),

View File

@@ -1,3 +1,8 @@
/*
* GDevelop Core
* Copyright 2008-present Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef GDCORE_EVENTSCODEGENERATOR_H
#define GDCORE_EVENTSCODEGENERATOR_H
@@ -22,18 +27,19 @@ class EventsCodeGenerationContext;
class ExpressionCodeGenerationInformation;
class InstructionMetadata;
class Platform;
}
} // namespace gd
namespace gd {
/**
* \brief Internal class used to generate code from events
* \todo For now, this class generates only C++ code for GD C++ Platform.
*
* \see CallbacksForGeneratingExpressionCode
*/
class GD_CORE_API EventsCodeGenerator {
// Compatiblity with old ExpressionParser
friend class CallbacksForGeneratingExpressionCode;
friend class VariableCodeGenerationCallbacks;
// end of compatibility code
friend class ExpressionCodeGenerator;
public:
/**
@@ -53,9 +59,9 @@ class GD_CORE_API EventsCodeGenerator {
* \brief Construct a code generator for the specified
* objects/groups and platform
*/
EventsCodeGenerator(const gd::Platform& platform,
gd::ObjectsContainer & globalObjectsAndGroups_,
const gd::ObjectsContainer & objectsAndGroups_);
EventsCodeGenerator(const gd::Platform& platform,
gd::ObjectsContainer& globalObjectsAndGroups_,
const gd::ObjectsContainer& objectsAndGroups_);
virtual ~EventsCodeGenerator(){};
/**
@@ -121,7 +127,7 @@ class GD_CORE_API EventsCodeGenerator {
*
*/
std::vector<gd::String> GenerateParametersCodes(
std::vector<gd::Expression> parameters,
const std::vector<gd::Expression> & parameters,
const std::vector<gd::ParameterMetadata>& parametersInfo,
EventsCodeGenerationContext& context,
std::vector<std::pair<gd::String, gd::String> >*
@@ -182,9 +188,9 @@ class GD_CORE_API EventsCodeGenerator {
virtual gd::String ConvertToString(gd::String plainString);
/**
* \brief Convert a plain string ( with line feed, quotes ) to a string that
* \brief Convert a plain string (with line feed, quotes) to a string that
can be inserted into code.
* The string construction must be explicit : for example, quotes must be
* The string construction must be explicit: for example, quotes must be
added if the target language need quotes.
*
* Usage example :
@@ -233,11 +239,6 @@ class GD_CORE_API EventsCodeGenerator {
customCodeOutsideMain += code;
};
/**
* \brief Add some code before events in the main function.
*/
void AddCustomCodeInMain(gd::String code) { customCodeInMain += code; };
/** \brief Get the set containing the include files.
*/
const std::set<gd::String>& GetIncludeFiles() const { return includeFiles; }
@@ -248,10 +249,6 @@ class GD_CORE_API EventsCodeGenerator {
return customCodeOutsideMain;
}
/** \brief Get the custom code to be inserted inside main function.
*/
const gd::String& GetCustomCodeInMain() const { return customCodeInMain; }
/** \brief Get the custom declaration to be inserted after includes.
*/
const std::set<gd::String>& GetCustomGlobalDeclaration() const {
@@ -278,23 +275,31 @@ class GD_CORE_API EventsCodeGenerator {
void ReportError();
/**
* \brief Return true if an error has occurred during code generation ( in
* this case, generated code is not usable )
* \brief Return true if an error has occurred during code generation (in
* this case, generated code is not usable).
*
* \todo TODO: This is actually not used and should be moved to a more
* complete error reporting.
*/
bool ErrorOccurred() const { return errorOccurred; };
/**
* \brief Get the global objects/groups used for code generation.
*/
gd::ObjectsContainer& GetGlobalObjectsAndGroups() const { return globalObjectsAndGroups; }
gd::ObjectsContainer& GetGlobalObjectsAndGroups() const {
return globalObjectsAndGroups;
}
/**
* \brief Get the objects/groups used for code generation.
*/
const gd::ObjectsContainer& GetObjectsAndGroups() const { return objectsAndGroups; }
const gd::ObjectsContainer& GetObjectsAndGroups() const {
return objectsAndGroups;
}
/**
* \brief Return true if the code generation is done for a given project and layout.
* \brief Return true if the code generation is done for a given project and
* layout.
*/
bool HasProjectAndLayout() const { return hasProjectAndLayout; }
@@ -380,27 +385,36 @@ class GD_CORE_API EventsCodeGenerator {
* \brief Generate the code to notify the profiler of the beginning of a
* section.
*/
virtual gd::String GenerateProfilerSectionBegin(const gd::String& section) { return ""; };
virtual gd::String GenerateProfilerSectionBegin(const gd::String& section) {
return "";
};
/**
* \brief Generate the code to notify the profiler of the end of a section.
*/
virtual gd::String GenerateProfilerSectionEnd(const gd::String& section) { return ""; };
virtual gd::String GenerateProfilerSectionEnd(const gd::String& section) {
return "";
};
/**
* \brief Get the namespace to be used to store code generated objects/values/functions,
* with the extra "dot" at the end to be used to access to a property/member.
* \brief Get the namespace to be used to store code generated
* objects/values/functions, with the extra "dot" at the end to be used to
* access to a property/member.
*
* Example: "gdjs.something."
*/
virtual gd::String GetCodeNamespaceAccessor() { return ""; };
/**
* \brief Get the namespace to be used to store code generated objects/values/functions.
* \brief Get the namespace to be used to store code generated
* objects/values/functions.
*
* Example: "gdjs.something"
*/
virtual gd::String GetCodeNamespace() { return ""; };
enum VariableScope { LAYOUT_VARIABLE = 0, PROJECT_VARIABLE, OBJECT_VARIABLE };
protected:
/**
* \brief Generate the code for a single parameter.
@@ -452,10 +466,69 @@ class GD_CORE_API EventsCodeGenerator {
const gd::String& parameter,
const gd::ParameterMetadata& metadata,
gd::EventsCodeGenerationContext& context,
const gd::String& previousParameter,
const gd::String& lastObjectName,
std::vector<std::pair<gd::String, gd::String> >*
supplementaryParametersTypes);
/**
* \brief Generate the code to get a variable.
*/
virtual gd::String GenerateGetVariable(
const gd::String& variableName,
const VariableScope& scope,
gd::EventsCodeGenerationContext& context,
const gd::String& objectName) {
if (scope == LAYOUT_VARIABLE) {
return "getLayoutVariable(" + variableName + ")";
} else if (scope == PROJECT_VARIABLE) {
return "getProjectVariable(" + variableName + ")";
}
return "getVariableForObject(" + objectName + ", " + variableName + ")";
}
/**
* \brief Generate the code to get the child of a variable.
*/
virtual gd::String GenerateVariableAccessor(gd::String childName) {
return ".getChild(" + ConvertToStringExplicit(childName) + ")";
};
/**
* \brief Generate the code to get the child of a variable,
* using generated the expression.
*/
virtual gd::String GenerateVariableBracketAccessor(
gd::String expressionCode) {
return ".getChild(" + expressionCode + ")";
};
/**
* \brief Generate the code to reference a variable which is
* in an empty/null state.
*/
virtual gd::String GenerateBadVariable() { return "fakeBadVariable"; }
/**
* \brief Generate the code to reference an object.
* \param objectName the name of the object.
* \param type what is the expected type (object, objectPtr...) in which the
* object must be generated.
* \param context The context for code generation
*/
virtual gd::String GenerateObject(const gd::String& objectName,
const gd::String& type,
gd::EventsCodeGenerationContext& context) {
return "fakeObjectListOf_" + objectName;
}
/**
* \brief Generate the code to reference an object which is
* in an empty/null state.
*/
virtual gd::String GenerateBadObject() { return "fakeNullObject"; }
/**
* \brief Call a function of the current object.
* \note The current object is the object being manipulated by a condition or
@@ -613,31 +686,39 @@ class GD_CORE_API EventsCodeGenerator {
std::size_t startFromArgument = 0);
/**
* \brief Must return an expression whose value is true.
* \brief Return the "true" keyword in the target language.
*/
gd::String GenerateTrue() const { return "true"; };
/**
* \brief Must return an expression whose value is false.
* \brief Return the "false" keyword in the target language.
*/
gd::String GenerateFalse() const { return "false"; };
/**
* \brief Generate the list of comma-separated arguments to be used to call a
* function. \param arguments The code already generated for the arguments
* function.
*
* \param arguments The code already generated for the arguments
* \param startFrom Index of the first argument, the previous will be ignored.
*/
virtual gd::String GenerateArgumentsList(
const std::vector<gd::String>& arguments, size_t startFrom = 0);
const gd::Platform& platform; ///< The platform being used.
gd::ObjectsContainer & globalObjectsAndGroups;
const gd::ObjectsContainer & objectsAndGroups;
/**
* Generate the getter to get the name of the specified behavior.
*/
virtual gd::String GenerateGetBehaviorNameCode(const gd::String& behaviorName);
bool hasProjectAndLayout; ///< true only if project and layout are valid references. If false, they should not be used.
gd::Project* project; ///< The project being used.
const gd::Layout* scene; ///< The scene being generated.
const gd::Platform& platform; ///< The platform being used.
gd::ObjectsContainer& globalObjectsAndGroups;
const gd::ObjectsContainer& objectsAndGroups;
bool hasProjectAndLayout; ///< true only if project and layout are valid
///< references. If false, they should not be used.
gd::Project* project; ///< The project being used.
const gd::Layout* scene; ///< The scene being generated.
bool errorOccurred; ///< Must be set to true if an error occured.
bool compilationForRuntime; ///< Is set to true if the code generation is
@@ -649,10 +730,8 @@ class GD_CORE_API EventsCodeGenerator {
///< can share the same list.
gd::String customCodeOutsideMain; ///< Custom code inserted before events (
///< and not in events function )
gd::String customCodeInMain; ///< Custom code inserted before events ( in
///< main function )
std::set<gd::String>
customGlobalDeclarations; ///< Custom global C++ declarations inserted
customGlobalDeclarations; ///< Custom global C++ declarations inserted
///< after includes
size_t maxCustomConditionsDepth; ///< The maximum depth value for all the
///< custom conditions created.

View File

@@ -0,0 +1,465 @@
/*
* GDevelop Core
* Copyright 2008-present Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#include "ExpressionCodeGenerator.h"
#include <memory>
#include <vector>
#include "GDCore/CommonTools.h"
#include "GDCore/Events/CodeGeneration/EventsCodeGenerationContext.h"
#include "GDCore/Events/CodeGeneration/EventsCodeGenerator.h"
#include "GDCore/Events/Parsers/ExpressionParser2.h"
#include "GDCore/Events/Parsers/ExpressionParser2Node.h"
#include "GDCore/Events/Parsers/ExpressionParser2NodePrinter.h"
#include "GDCore/Events/Parsers/ExpressionParser2NodeWorker.h"
#include "GDCore/Events/Tools/EventsCodeNameMangler.h"
#include "GDCore/Extensions/Metadata/BehaviorMetadata.h"
#include "GDCore/Extensions/Metadata/ExpressionMetadata.h"
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
#include "GDCore/Extensions/Metadata/ObjectMetadata.h"
#include "GDCore/Extensions/Platform.h"
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/IDE/Events/ExpressionValidator.h"
#include "GDCore/Project/Layout.h"
#include "GDCore/Project/Project.h"
// Compatibility with old ExpressionParser
#include "GDCore/Events/CodeGeneration/ExpressionsCodeGeneration.h"
#include "GDCore/Events/CodeGeneration/VariableParserCallbacks.h"
#include "GDCore/Events/Parsers/ExpressionParser.h"
#include "GDCore/Events/Parsers/VariableParser.h"
// end of compatibility code
namespace gd {
bool ExpressionCodeGenerator::useOldExpressionParser = false;
gd::String ExpressionCodeGenerator::GenerateExpressionCode(
EventsCodeGenerator& codeGenerator,
EventsCodeGenerationContext& context,
const gd::String& type,
const gd::String& expression,
const gd::String& objectName) {
// Compatibility with old ExpressionParser
if (useOldExpressionParser) {
if (type == "number") {
gd::String code = "";
gd::CallbacksForGeneratingExpressionCode callbacks(
code, codeGenerator, context);
gd::ExpressionParser parser(expression);
if (!parser.ParseMathExpression(codeGenerator.GetPlatform(),
codeGenerator.GetGlobalObjectsAndGroups(),
codeGenerator.GetObjectsAndGroups(),
callbacks) ||
code.empty()) {
std::cout << "Error (old ExpressionParser): \""
<< parser.GetFirstError() << "\" in: \"" << expression
<< "\" (number)" << std::endl;
code = "0";
}
return code;
} else if (type == "string") {
gd::String code = "";
gd::CallbacksForGeneratingExpressionCode callbacks(
code, codeGenerator, context);
gd::ExpressionParser parser(expression);
if (!parser.ParseStringExpression(
codeGenerator.GetPlatform(),
codeGenerator.GetGlobalObjectsAndGroups(),
codeGenerator.GetObjectsAndGroups(),
callbacks) ||
code.empty()) {
std::cout << "Error (old ExpressionParser): \""
<< parser.GetFirstError() << "\" in: \"" << expression
<< "\" (string)" << std::endl;
code = "\"\"";
}
return code;
} else if (type == "scenevar") {
gd::String code = "";
gd::VariableCodeGenerationCallbacks callbacks(
code,
codeGenerator,
context,
gd::EventsCodeGenerator::LAYOUT_VARIABLE);
gd::VariableParser parser(expression);
if (!parser.Parse(callbacks)) {
std::cout << "Error (old VariableParser) :" << parser.GetFirstError()
<< " in: " << expression << std::endl;
code = codeGenerator.GenerateBadVariable();
}
return code;
} else if (type == "globalvar") {
gd::String code = "";
gd::VariableCodeGenerationCallbacks callbacks(
code,
codeGenerator,
context,
gd::EventsCodeGenerator::PROJECT_VARIABLE);
gd::VariableParser parser(expression);
if (!parser.Parse(callbacks)) {
std::cout << "Error (old VariableParser) :" << parser.GetFirstError()
<< " in: " << expression << std::endl;
code = codeGenerator.GenerateBadVariable();
}
return code;
} else if (type == "objectvar") {
gd::String code = "";
// Object is either the object of the previous parameter or, if it is
// empty, the object being picked by the instruction.
gd::String object =
objectName.empty() ? context.GetCurrentObject() : objectName;
gd::VariableCodeGenerationCallbacks callbacks(
code, codeGenerator, context, object);
gd::VariableParser parser(expression);
if (!parser.Parse(callbacks)) {
std::cout << "Error (old VariableParser) :" << parser.GetFirstError()
<< " in: " << expression << std::endl;
code = codeGenerator.GenerateBadVariable();
}
return code;
}
std::cout << "Type error (old ExpressionParser): type \"" << type
<< "\" is not supported" << std::endl;
return "/* Error during code generation: type " + type +
" is not supported for old ExpressionParser. */ 0";
}
// end of compatibility code
gd::ExpressionParser2 parser(codeGenerator.GetPlatform(),
codeGenerator.GetGlobalObjectsAndGroups(),
codeGenerator.GetObjectsAndGroups());
auto node = parser.ParseExpression(type, expression, objectName);
gd::ExpressionValidator validator;
node->Visit(validator);
ExpressionCodeGenerator generator(codeGenerator, context);
if (!validator.GetErrors().empty()) {
std::cout << "Error: \"" << validator.GetErrors()[0]->GetMessage()
<< "\" in: \"" << expression << "\" (" << type << ")"
<< std::endl;
return generator.GenerateDefaultValue(type);
}
node->Visit(generator);
return generator.GetOutput();
}
void ExpressionCodeGenerator::OnVisitOperatorNode(OperatorNode& node) {
node.leftHandSide->Visit(*this);
output += " ";
output.push_back(node.op);
output += " ";
node.rightHandSide->Visit(*this);
}
void ExpressionCodeGenerator::OnVisitUnaryOperatorNode(
UnaryOperatorNode& node) {
output.push_back(node.op);
output += "("; // Add extra parenthesis to ensure that things like --2 are
// properly outputted as -(-2) (GDevelop don't have -- or ++
// operators, but JavaScript and C++ have).
node.factor->Visit(*this);
output += ")";
}
void ExpressionCodeGenerator::OnVisitSubExpressionNode(
SubExpressionNode& node) {
output += "(";
node.expression->Visit(*this);
output += ")";
}
void ExpressionCodeGenerator::OnVisitNumberNode(NumberNode& node) {
output += node.number;
}
void ExpressionCodeGenerator::OnVisitTextNode(TextNode& node) {
output += codeGenerator.ConvertToStringExplicit(node.text);
}
void ExpressionCodeGenerator::OnVisitVariableNode(VariableNode& node) {
// This "translation" from the type to an enum could be avoided
// if all types were moved to an enum.
EventsCodeGenerator::VariableScope scope =
node.type == "globalvar"
? gd::EventsCodeGenerator::PROJECT_VARIABLE
: ((node.type == "scenevar")
? gd::EventsCodeGenerator::LAYOUT_VARIABLE
: gd::EventsCodeGenerator::OBJECT_VARIABLE);
output += codeGenerator.GenerateGetVariable(
node.name, scope, context, node.objectName);
if (node.child) node.child->Visit(*this);
}
void ExpressionCodeGenerator::OnVisitVariableAccessorNode(
VariableAccessorNode& node) {
output += codeGenerator.GenerateVariableAccessor(node.name);
if (node.child) node.child->Visit(*this);
}
void ExpressionCodeGenerator::OnVisitVariableBracketAccessorNode(
VariableBracketAccessorNode& node) {
ExpressionCodeGenerator generator(codeGenerator, context);
node.expression->Visit(generator);
output +=
codeGenerator.GenerateVariableBracketAccessor(generator.GetOutput());
if (node.child) node.child->Visit(*this);
}
void ExpressionCodeGenerator::OnVisitIdentifierNode(IdentifierNode& node) {
if (gd::ParameterMetadata::IsObject(node.type)) {
output +=
codeGenerator.GenerateObject(node.identifierName, node.type, context);
} else {
output += "/* Error during generation, unrecognized identifier type: " +
codeGenerator.ConvertToString(node.type) + " with value " +
codeGenerator.ConvertToString(node.identifierName) + " */ " +
codeGenerator.ConvertToStringExplicit(node.identifierName);
}
}
void ExpressionCodeGenerator::OnVisitFunctionNode(FunctionNode& node) {
if (gd::MetadataProvider::IsBadExpressionMetadata(node.expressionMetadata)) {
output += "/* Error during generation, function not found: " +
codeGenerator.ConvertToString(node.functionName) + " for type " +
node.type + " */ " + GenerateDefaultValue(node.type);
return;
}
if (!node.objectName.empty()) {
if (!node.behaviorName.empty()) {
output += GenerateBehaviorFunctionCode(node.type,
node.objectName,
node.behaviorName,
node.parameters,
node.expressionMetadata);
} else {
output += GenerateObjectFunctionCode(
node.type, node.objectName, node.parameters, node.expressionMetadata);
}
} else {
output +=
GenerateFreeFunctionCode(node.parameters, node.expressionMetadata);
}
}
gd::String ExpressionCodeGenerator::GenerateFreeFunctionCode(
const std::vector<std::unique_ptr<ExpressionNode>>& parameters,
const ExpressionMetadata& expressionMetadata) {
codeGenerator.AddIncludeFiles(
expressionMetadata.codeExtraInformation.GetIncludeFiles());
// Launch custom code generator if needed
if (expressionMetadata.codeExtraInformation.HasCustomCodeGenerator()) {
return expressionMetadata.codeExtraInformation.customCodeGenerator(
PrintParameters(parameters), codeGenerator, context);
}
gd::String parametersCode =
GenerateParametersCodes(parameters, expressionMetadata, 0);
return expressionMetadata.codeExtraInformation.functionCallName + "(" +
parametersCode + ")";
}
gd::String ExpressionCodeGenerator::GenerateObjectFunctionCode(
const gd::String& type,
const gd::String& objectName,
const std::vector<std::unique_ptr<ExpressionNode>>& parameters,
const ExpressionMetadata& expressionMetadata) {
const gd::ObjectsContainer& globalObjectsAndGroups =
codeGenerator.GetGlobalObjectsAndGroups();
const gd::ObjectsContainer& objectsAndGroups =
codeGenerator.GetObjectsAndGroups();
codeGenerator.AddIncludeFiles(
expressionMetadata.codeExtraInformation.GetIncludeFiles());
// Launch custom code generator if needed
if (expressionMetadata.codeExtraInformation.HasCustomCodeGenerator()) {
return expressionMetadata.codeExtraInformation.customCodeGenerator(
PrintParameters(parameters), codeGenerator, context);
}
// Prepare parameters
gd::String parametersCode = GenerateParametersCodes(
parameters,
expressionMetadata,
// By convention, the first parameter is the object
1);
gd::String functionOutput = GenerateDefaultValue(type);
// Get object(s) concerned by function call
std::vector<gd::String> realObjects =
codeGenerator.ExpandObjectsName(objectName, context);
for (std::size_t i = 0; i < realObjects.size(); ++i) {
context.ObjectsListNeeded(realObjects[i]);
gd::String objectType = gd::GetTypeOfObject(
globalObjectsAndGroups, objectsAndGroups, realObjects[i]);
const ObjectMetadata& objInfo = MetadataProvider::GetObjectMetadata(
codeGenerator.GetPlatform(), objectType);
codeGenerator.AddIncludeFiles(objInfo.includeFiles);
functionOutput = codeGenerator.GenerateObjectFunctionCall(
realObjects[i],
objInfo,
expressionMetadata.codeExtraInformation,
parametersCode,
functionOutput,
context);
}
return functionOutput;
}
gd::String ExpressionCodeGenerator::GenerateBehaviorFunctionCode(
const gd::String& type,
const gd::String& objectName,
const gd::String& behaviorName,
const std::vector<std::unique_ptr<ExpressionNode>>& parameters,
const ExpressionMetadata& expressionMetadata) {
const gd::ObjectsContainer& globalObjectsAndGroups =
codeGenerator.GetGlobalObjectsAndGroups();
const gd::ObjectsContainer& objectsAndGroups =
codeGenerator.GetObjectsAndGroups();
codeGenerator.AddIncludeFiles(
expressionMetadata.codeExtraInformation.GetIncludeFiles());
// Launch custom code generator if needed
if (expressionMetadata.codeExtraInformation.HasCustomCodeGenerator()) {
return expressionMetadata.codeExtraInformation.customCodeGenerator(
PrintParameters(parameters), codeGenerator, context);
}
// Prepare parameters
gd::String parametersCode = GenerateParametersCodes(
parameters,
expressionMetadata,
// By convention, the first parameters are the object and behavior
2);
// Get object(s) concerned by function call
std::vector<gd::String> realObjects =
codeGenerator.ExpandObjectsName(objectName, context);
gd::String functionOutput = GenerateDefaultValue(type);
gd::String behaviorType = gd::GetTypeOfBehavior(
globalObjectsAndGroups, objectsAndGroups, behaviorName);
const BehaviorMetadata& autoInfo = MetadataProvider::GetBehaviorMetadata(
codeGenerator.GetPlatform(), behaviorType);
for (std::size_t i = 0; i < realObjects.size(); ++i) {
context.ObjectsListNeeded(realObjects[i]);
codeGenerator.AddIncludeFiles(autoInfo.includeFiles);
functionOutput = codeGenerator.GenerateObjectBehaviorFunctionCall(
realObjects[i],
behaviorName,
autoInfo,
expressionMetadata.codeExtraInformation,
parametersCode,
functionOutput,
context);
}
return functionOutput;
}
gd::String ExpressionCodeGenerator::GenerateParametersCodes(
const std::vector<std::unique_ptr<ExpressionNode>>& parameters,
const ExpressionMetadata& expressionMetadata,
size_t initialParameterIndex) {
size_t nonCodeOnlyParameterIndex = 0;
gd::String parametersCode;
for (std::size_t i = initialParameterIndex;
i < expressionMetadata.parameters.size();
++i) {
if (i != initialParameterIndex) parametersCode += ", ";
auto& parameterMetadata = expressionMetadata.parameters[i];
if (!parameterMetadata.IsCodeOnly()) {
ExpressionCodeGenerator generator(codeGenerator, context);
if (nonCodeOnlyParameterIndex < parameters.size()) {
parameters[nonCodeOnlyParameterIndex]->Visit(generator);
parametersCode += generator.GetOutput();
} else if (parameterMetadata.IsOptional()) {
// Optional parameters default value were not parsed at the time of the
// expression parsing. Parse them now.
ExpressionParser2 parser(codeGenerator.GetPlatform(),
codeGenerator.GetGlobalObjectsAndGroups(),
codeGenerator.GetObjectsAndGroups());
auto node = parser.ParseExpression(parameterMetadata.GetType(),
parameterMetadata.GetDefaultValue());
node->Visit(generator);
parametersCode += generator.GetOutput();
} else {
parametersCode +=
"/* Error during generation, parameter not existing in the nodes "
"*/ " +
GenerateDefaultValue(parameterMetadata.GetType());
}
nonCodeOnlyParameterIndex++;
} else {
parametersCode +=
codeGenerator.GenerateParameterCodes(parameterMetadata.GetExtraInfo(),
parameterMetadata,
context,
"",
nullptr);
}
}
return parametersCode;
}
std::vector<gd::Expression> ExpressionCodeGenerator::PrintParameters(
const std::vector<std::unique_ptr<ExpressionNode>>& parameters) {
// Printing parameters is only useful because custom code generator of
// expression require to get the parameters of the expression as strings
// (gd::Expression). Once the old ExpressionParser is removed, custom
// code generator can be reworked to directly take the parsed nodes,
// avoiding an extra and useless printing/parsing of their parameters.
std::vector<gd::Expression> printedParameters;
for (auto& parameter : parameters) {
printedParameters.push_back(
gd::ExpressionParser2NodePrinter::PrintNode(*parameter));
}
return printedParameters;
}
gd::String ExpressionCodeGenerator::GenerateDefaultValue(
const gd::String& type) {
if (gd::ParameterMetadata::IsExpression("variable", type)) {
return codeGenerator.GenerateBadVariable();
}
if (gd::ParameterMetadata::IsObject(type)) {
return codeGenerator.GenerateBadObject();
}
return (type == "string") ? "\"\"" : "0";
}
void ExpressionCodeGenerator::OnVisitEmptyNode(EmptyNode& node) {
output += GenerateDefaultValue(node.type);
}
} // namespace gd

View File

@@ -0,0 +1,117 @@
/*
* GDevelop Core
* Copyright 2008-present Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#if defined(GD_IDE_ONLY)
#ifndef GDCORE_ExpressionCodeGenerator_H
#define GDCORE_ExpressionCodeGenerator_H
#include <memory>
#include <vector>
#include "GDCore/Events/Parsers/ExpressionParser2.h"
#include "GDCore/Events/Parsers/ExpressionParser2Node.h"
#include "GDCore/Events/Parsers/ExpressionParser2NodeWorker.h"
#include "GDCore/String.h"
namespace gd {
class Expression;
class ObjectsContainer;
class Platform;
class ParameterMetadata;
class ExpressionMetadata;
class EventsCodeGenerationContext;
class EventsCodeGenerator;
} // namespace gd
namespace gd {
/**
* \brief Generate code for a parsed expression.
*
* Almost all code generation is dedicated to the gd::EventsCodeGenerator,
* so that it can be adapted to the target.
*
* \see gd::ExpressionParser2
*/
class GD_CORE_API ExpressionCodeGenerator : public ExpressionParser2NodeWorker {
public:
ExpressionCodeGenerator(EventsCodeGenerator& codeGenerator_,
EventsCodeGenerationContext& context_)
: codeGenerator(codeGenerator_), context(context_){};
virtual ~ExpressionCodeGenerator(){};
/**
* Helper to generate the code for an expression.
* If expression is invalid, a default generated value is returned (0 for
* number expression, empty string for strings).
*
* \param codeGenerator The code generator to use to output code.
* \param context The context of the code generation.
* \param type The type of the expression (see gd::ExpressionParser2).
* \param expression The expression to parse and generate code for.
* \param object The object the expression refers too (only for "objectvar"
* type).
*
* \see see gd::ExpressionParser2
*/
static gd::String GenerateExpressionCode(EventsCodeGenerator& codeGenerator,
EventsCodeGenerationContext& context,
const gd::String& type,
const gd::String& expression,
const gd::String& objectName = "");
static void UseOldExpressionParser(bool enable) {
useOldExpressionParser = enable;
};
static bool IsUsingOldExpressionParser() { return useOldExpressionParser; };
const gd::String& GetOutput() { return output; };
protected:
void OnVisitSubExpressionNode(SubExpressionNode& node) override;
void OnVisitOperatorNode(OperatorNode& node) override;
void OnVisitUnaryOperatorNode(UnaryOperatorNode& node) override;
void OnVisitNumberNode(NumberNode& node) override;
void OnVisitTextNode(TextNode& node) override;
void OnVisitVariableNode(VariableNode& node) override;
void OnVisitVariableAccessorNode(VariableAccessorNode& node) override;
void OnVisitVariableBracketAccessorNode(
VariableBracketAccessorNode& node) override;
void OnVisitIdentifierNode(IdentifierNode& node) override;
void OnVisitFunctionNode(FunctionNode& node) override;
void OnVisitEmptyNode(EmptyNode& node) override;
private:
gd::String GenerateFreeFunctionCode(
const std::vector<std::unique_ptr<ExpressionNode>>& parameters,
const ExpressionMetadata& expressionMetadata);
gd::String GenerateObjectFunctionCode(
const gd::String& type,
const gd::String& objectName,
const std::vector<std::unique_ptr<ExpressionNode>>& parameters,
const ExpressionMetadata& expressionMetadata);
gd::String GenerateBehaviorFunctionCode(
const gd::String& type,
const gd::String& objectName,
const gd::String& behaviorName,
const std::vector<std::unique_ptr<ExpressionNode>>& parameters,
const ExpressionMetadata& expressionMetadata);
gd::String GenerateParametersCodes(
const std::vector<std::unique_ptr<ExpressionNode>>& parameters,
const ExpressionMetadata& expressionMetadata,
size_t initialParameterIndex);
gd::String GenerateDefaultValue(const gd::String& type);
static std::vector<gd::Expression> PrintParameters(
const std::vector<std::unique_ptr<ExpressionNode>>& parameters);
gd::String output;
EventsCodeGenerator& codeGenerator;
EventsCodeGenerationContext& context;
static bool useOldExpressionParser;
};
} // namespace gd
#endif // GDCORE_ExpressionCodeGenerator_H
#endif

View File

@@ -11,28 +11,18 @@
#include "GDCore/String.h"
namespace gd {
class ExpressionMetadata;
}
namespace gd {
class Expression;
}
namespace gd {
class Project;
}
namespace gd {
class Layout;
}
namespace gd {
class Layout;
}
namespace gd {
class EventsCodeGenerationContext;
}
namespace gd {
class EventsCodeGenerator;
}
namespace gd {
// TODO: Replace and remove (ExpressionCodeGenerator)
/**
* \brief Used to generate code from expressions.
*

View File

@@ -0,0 +1,68 @@
/*
* GDevelop C++ Platform
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#if defined(GD_IDE_ONLY)
#include "VariableParserCallbacks.h"
#include <string>
#include <vector>
#include "GDCore/Events/CodeGeneration/EventsCodeGenerationContext.h"
#include "GDCore/Events/CodeGeneration/EventsCodeGenerator.h"
#include "GDCore/Events/CodeGeneration/ExpressionCodeGenerator.h"
#include "GDCore/Events/Parsers/VariableParser.h"
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
#include "GDCore/Extensions/Metadata/ObjectMetadata.h"
#include "GDCore/Extensions/Platform.h"
#include "GDCore/Project/Layout.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Project/Project.h"
using namespace std;
namespace gd {
VariableCodeGenerationCallbacks::VariableCodeGenerationCallbacks(
gd::String& output_,
gd::EventsCodeGenerator& codeGenerator_,
gd::EventsCodeGenerationContext& context_,
const gd::EventsCodeGenerator::VariableScope& scope_)
: output(output_),
codeGenerator(codeGenerator_),
context(context_),
scope(scope_) {
if (scope == gd::EventsCodeGenerator::OBJECT_VARIABLE) {
std::cout << "ERROR: Initializing VariableCodeGenerationCallbacks with "
"OBJECT_VARIABLE without object.";
}
}
VariableCodeGenerationCallbacks::VariableCodeGenerationCallbacks(
gd::String& output_,
gd::EventsCodeGenerator& codeGenerator_,
gd::EventsCodeGenerationContext& context_,
const gd::String& object_)
: output(output_),
codeGenerator(codeGenerator_),
context(context_),
scope(gd::EventsCodeGenerator::OBJECT_VARIABLE),
object(object_) {}
void VariableCodeGenerationCallbacks::OnRootVariable(gd::String variableName) {
output += codeGenerator.GenerateGetVariable(variableName, scope, context, object);
}
void VariableCodeGenerationCallbacks::OnChildVariable(gd::String variableName) {
output += codeGenerator.GenerateVariableAccessor(variableName);
}
void VariableCodeGenerationCallbacks::OnChildSubscript(
gd::String stringExpression) {
gd::String argumentCode = gd::ExpressionCodeGenerator::GenerateExpressionCode(
codeGenerator, context, "string", stringExpression);
output += codeGenerator.GenerateVariableBracketAccessor(argumentCode);
}
}
#endif

View File

@@ -0,0 +1,97 @@
/*
* GDevelop C++ Platform
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#if defined(GD_IDE_ONLY)
#ifndef VARIABLEPARSERCALLBACKS_H
#define VARIABLEPARSERCALLBACKS_H
#include <string>
#include <vector>
#include "GDCore/Events/Parsers/VariableParser.h"
#include "GDCore/String.h"
#include "EventsCodeGenerator.h"
namespace gd {
class EventsCodeGenerationContext;
} // namespace gd
// TODO: Replace and remove (ExpressionCodeGenerator)
namespace gd {
/**
* \brief Callbacks called to generate the code for getting a variable.
*
* Usage example:
\code
VariableCodeGenerationCallbacks callbacks(output, eventsCodeGenerator,
context, VariableCodeGenerationCallbacks::LAYOUT_VARIABLE);
gd::VariableParser parser(parameter);
if ( !parser.Parse(callbacks) )
{
//Error during parsing the variable name:
output = "runtimeContext->GetSceneVariables().GetBadVariable()";
}
//"output" now contains the C++ code to return the variable.
\endcode
*/
class VariableCodeGenerationCallbacks : public gd::VariableParserCallbacks {
public:
/**
* \brief Default constructor for generating code for a layout/global
* variable. \param output The string in which the code will be generated.
* \param codeGenerator The code generator being used.
* \param context The current code generation context.
* \param scope The scope of the variable being accessed: LAYOUT_VARIABLE,
* PROJECT_VARIABLE.
*/
VariableCodeGenerationCallbacks(gd::String& output,
gd::EventsCodeGenerator& codeGenerator_,
gd::EventsCodeGenerationContext& context_,
const gd::EventsCodeGenerator::VariableScope& scope_);
/**
* \brief Default constructor for generating code for an object variable.
* \param output The string in which the code will be generated.
* \param codeGenerator The code generator being used.
* \param context The current code generation context.
* \param object The name of the object
*/
VariableCodeGenerationCallbacks(gd::String& output,
gd::EventsCodeGenerator& codeGenerator_,
gd::EventsCodeGenerationContext& context_,
const gd::String& object);
/**
* \brief Called when the first variable has been parsed.
* \param variableName The variable name.
*/
virtual void OnRootVariable(gd::String variableName);
/**
* \brief Called when accessing the child of a structure variable.
* \param variableName The child variable name.
*/
virtual void OnChildVariable(gd::String variableName);
/**
* \brief Called when accessing the child of a structure variable using a
* string expression in square brackets. \param variableName The expression
* used to access the child variable.
*/
virtual void OnChildSubscript(gd::String stringExpression);
private:
gd::String& output;
gd::EventsCodeGenerator& codeGenerator;
gd::EventsCodeGenerationContext& context;
gd::EventsCodeGenerator::VariableScope scope;
const gd::String object; ///< The object name, when scope == OBJECT_VARIABLE.
};
}
#endif // VARIABLEPARSERCALLBACKS_H
#endif

View File

@@ -17,8 +17,7 @@ std::vector<gd::String> BaseEvent::emptyDependencies;
gd::String BaseEvent::emptySourceFile;
BaseEvent::BaseEvent()
: eventHeightNeedUpdate(true),
totalTimeDuringLastSession(0),
: totalTimeDuringLastSession(0),
percentDuringLastSession(0),
disabled(false),
folded(false) {}

View File

@@ -21,13 +21,9 @@ class Layout;
class EventsCodeGenerator;
class EventsCodeGenerationContext;
class Platform;
class EventsEditorItemsAreas;
class EventsEditorSelection;
class SerializerElement;
class Instruction;
}
class wxWindow;
class wxDC;
namespace gd {
@@ -259,76 +255,6 @@ class GD_CORE_API BaseEvent {
///@}
/** \name Event rendering
* Method and members used to render the event
*/
///@{
/**
* Redefine this method to draw the event.
*
* \param dc The wxWidgets drawing context to be used.
* \param x The x position where the events must be drawn.
* \param y The y position where the events must be drawn.
* \param width The width available for drawing.
* \param areas Use this object to indicate the areas where items have been
* drawn \param selection Give access to the current selection(s), to draw for
* example hovering or selecting effects.
*
* \note The height of the drawing must be the same as the height returned by
* BaseEvent::GetRenderedHeight
*
* \see gd::EventsRenderingHelper
* \see EventsEditorSelection
* \see EventsEditorItemsAreas
*/
virtual void Render(wxDC& dc,
int x,
int y,
unsigned int width,
gd::EventsEditorItemsAreas& areas,
gd::EventsEditorSelection& selection,
const gd::Platform& platform) {
return;
}
/**
* Must return the height of the event when rendered.
*
* \note The height of the drawing must be the same as the height of the
* drawing made by BaseEvent::Render
*/
virtual unsigned int GetRenderedHeight(unsigned int width,
const gd::Platform& platform) const {
return 0;
};
/**
* Used by EditEvent to describe what sort of changes have been made to the
* event. \see BaseEvent::EditEvent
*/
enum EditEventReturnType {
ChangesMade,
Cancelled,
ChangesMadeButNoNeedForEventsRecompilation
};
/**
* Called when the user want to edit the event.
*/
virtual EditEventReturnType EditEvent(
wxWindow* parent_,
gd::Project& game_,
gd::Layout& scene_,
gd::MainFrameWrapper& mainFrameWrapper_) {
return ChangesMade;
};
///@}
mutable bool eventHeightNeedUpdate; ///< Automatically set to true/false by
///< the events editor
std::weak_ptr<gd::BaseEvent>
originalEvent; ///< Pointer only used for profiling events, so as to
///< remember the original event from which it has been
@@ -340,9 +266,6 @@ class GD_CORE_API BaseEvent {
float percentDuringLastSession; ///< Total time used by the event during the
///< last run. Used for profiling.
protected:
mutable unsigned int renderedHeight;
private:
bool folded; ///< True if the subevents should be hidden in the events editor
bool disabled; ///< True if the event is disabled and must not be executed

View File

@@ -16,22 +16,15 @@ namespace gd {
gd::Expression Instruction::badExpression("");
Instruction::Instruction(gd::String type_)
: renderedHeightNeedUpdate(true),
renderedHeight(0),
selected(false),
type(type_),
: type(type_),
inverted(false) {
// ctor
parameters.reserve(8);
}
Instruction::Instruction(gd::String type_,
const std::vector<gd::Expression>& parameters_,
bool inverted_)
: renderedHeightNeedUpdate(true),
renderedHeight(0),
selected(false),
type(type_),
: type(type_),
inverted(inverted_),
parameters(parameters_) {
parameters.reserve(8);

View File

@@ -17,7 +17,7 @@ namespace gd {
* action.
*
* An instruction has a type, which define what it does, and some parameters. It
* can also be set as inverted ( when the instruction is a condition ) and it
* can also be set as inverted (when the instruction is a condition) and it
* can have sub instructions. This class does nothing particular except storing
* these data.
*
@@ -131,20 +131,6 @@ class GD_CORE_API Instruction {
*/
inline gd::InstructionsList& GetSubInstructions() { return subInstructions; };
/** \name Rendering
* Members related to the instruction rendering in an event editor.
*/
///@{
mutable bool
renderedHeightNeedUpdate; ///< True if the instruction height may have
///< changed and must be computed again.
mutable unsigned int renderedHeight; ///< Height of the instruction rendered
///< in an event editor.
mutable bool selected; ///< True if selected in an event editor.
///@}
private:
gd::String type; ///< Instruction type
bool inverted; ///< True if the instruction if inverted. Only applicable for

View File

@@ -717,9 +717,6 @@ bool ExpressionParser::ParseStringExpression(const gd::Platform& platform,
firstErrorPos = functionNameEnd;
firstErrorStr = _("Incorrect number of parameters");
for (std::size_t i = 0; i < parameters.size(); ++i)
cout << "Param:" << parameters[i].GetPlainString() << endl;
return false;
}

View File

@@ -0,0 +1,220 @@
/*
* GDevelop Core
* Copyright 2008-present Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#include "GDCore/Events/Parsers/ExpressionParser2.h"
#include <algorithm>
#include <memory>
#include <vector>
#include "GDCore/CommonTools.h"
#include "GDCore/Events/Expression.h"
#include "GDCore/Extensions/Metadata/ExpressionMetadata.h"
#include "GDCore/Extensions/Metadata/InstructionMetadata.h"
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
#include "GDCore/Extensions/Platform.h"
#include "GDCore/Project/Layout.h"
#include "GDCore/Project/Project.h"
#include "GDCore/Tools/Localization.h"
#include "GDCore/Tools/MakeUnique.h"
using namespace std;
namespace gd {
gd::String ExpressionParser2::NUMBER_FIRST_CHAR = ".0123456789";
gd::String ExpressionParser2::DOT = ".";
gd::String ExpressionParser2::PARAMETERS_SEPARATOR = ",";
gd::String ExpressionParser2::QUOTE = "\"";
gd::String ExpressionParser2::BRACKETS = "()[]{}";
gd::String ExpressionParser2::EXPRESSION_OPERATORS = "+-<>?^=\\:!";
gd::String ExpressionParser2::TERM_OPERATORS = "/*";
gd::String ExpressionParser2::UNARY_OPERATORS = "+-";
gd::String ExpressionParser2::WHITESPACES = " \n\r";
gd::String ExpressionParser2::NAMESPACE_SEPARATOR = "::";
ExpressionParser2::ExpressionParser2(
const gd::Platform& platform_,
const gd::ObjectsContainer& globalObjectsContainer_,
const gd::ObjectsContainer& objectsContainer_)
: expression(""),
currentPosition(0),
platform(platform_),
globalObjectsContainer(globalObjectsContainer_),
objectsContainer(objectsContainer_) {}
namespace {
/**
* Return the minimum number of parameters, starting from a given parameter
* (by convention, 1 for object functions and 2 for behavior functions).
*/
size_t GetMinimumParametersNumber(
const std::vector<gd::ParameterMetadata>& parameters,
size_t initialParameterIndex) {
size_t nb = 0;
for (std::size_t i = initialParameterIndex; i < parameters.size(); ++i) {
if (!parameters[i].optional && !parameters[i].codeOnly) nb++;
}
return nb;
}
/**
* Return the maximum number of parameters, starting from a given parameter
* (by convention, 1 for object functions and 2 for behavior functions).
*/
size_t GetMaximumParametersNumber(
const std::vector<gd::ParameterMetadata>& parameters,
size_t initialParameterIndex) {
size_t nb = 0;
for (std::size_t i = initialParameterIndex; i < parameters.size(); ++i) {
if (!parameters[i].codeOnly) nb++;
}
return nb;
}
} // namespace
std::unique_ptr<ExpressionParserDiagnostic> ExpressionParser2::ValidateFunction(
const gd::FunctionNode& function, size_t functionStartPosition) {
if (gd::MetadataProvider::IsBadExpressionMetadata(
function.expressionMetadata)) {
return gd::make_unique<ExpressionParserError>(
"invalid_function_name",
_("Cannot find an expression with this name: ") +
function.functionName + "\n" +
_("Double check that you've not made any typo in the name."),
functionStartPosition,
GetCurrentPosition());
}
size_t minParametersCount = GetMinimumParametersNumber(
function.expressionMetadata.parameters,
WrittenParametersFirstIndex(function.objectName, function.behaviorName));
size_t maxParametersCount = GetMaximumParametersNumber(
function.expressionMetadata.parameters,
WrittenParametersFirstIndex(function.objectName, function.behaviorName));
if (function.parameters.size() < minParametersCount ||
function.parameters.size() > maxParametersCount) {
gd::String expectedCountMessage =
minParametersCount == maxParametersCount
? _("The number of parameters must be exactly ") +
gd::String::From(minParametersCount)
: _("The number of parameters must be: ") +
gd::String::From(minParametersCount) + "-" +
gd::String::From(maxParametersCount);
if (function.parameters.size() < minParametersCount) {
return gd::make_unique<ExpressionParserError>(
"too_few_parameters",
"You have not entered enough parameters for the expression. " +
expectedCountMessage,
functionStartPosition,
GetCurrentPosition());
}
}
return gd::make_unique<ExpressionParserDiagnostic>();
}
std::unique_ptr<TextNode> ExpressionParser2::ReadText() {
SkipWhitespace();
if (!IsAnyChar("\"")) {
auto text = gd::make_unique<TextNode>("");
text->diagnostic =
RaiseSyntaxError(_("A text must start with a double quote (\")."));
return text;
}
SkipChar();
gd::String parsedText = "";
bool textParsingHasEnded = false;
bool expectEscapedCharacter = false;
while (!IsEndReached() && !textParsingHasEnded) {
if (GetCurrentChar() == '"') {
if (expectEscapedCharacter) {
parsedText += '"';
expectEscapedCharacter = false;
} else {
textParsingHasEnded = true;
}
} else if (GetCurrentChar() == '\\') {
if (expectEscapedCharacter) {
parsedText += '\\';
expectEscapedCharacter = false;
} else {
expectEscapedCharacter = true;
}
} else {
if (expectEscapedCharacter) {
parsedText += '\\';
}
parsedText += GetCurrentChar();
}
currentPosition++;
}
auto text = gd::make_unique<TextNode>(parsedText);
if (!textParsingHasEnded) {
text->diagnostic =
RaiseSyntaxError(_("A text must end with a double quote (\"). Add a "
"double quote to terminate the text."));
}
return text;
}
std::unique_ptr<NumberNode> ExpressionParser2::ReadNumber() {
SkipWhitespace();
gd::String parsedNumber;
bool numberHasStarted = false;
bool digitFound = false;
bool dotFound = false;
while (!IsEndReached()) {
if (IsAnyChar("0")) {
numberHasStarted = true;
digitFound = true;
if (!parsedNumber.empty()) { // Ignore leading 0s.
parsedNumber += GetCurrentChar();
}
} else if (IsAnyChar("123456789")) {
numberHasStarted = true;
digitFound = true;
parsedNumber += GetCurrentChar();
} else if (IsAnyChar(".") && !dotFound) {
numberHasStarted = true;
dotFound = true;
if (parsedNumber == "") {
parsedNumber += "0."; //Normalize by adding a leading 0, only in this case.
} else {
parsedNumber += ".";
}
} else {
break;
}
currentPosition++;
}
// parsedNumber can be empty in the only case where we have only seen
// 0s (one or more), so normalize it to a single 0.
if (parsedNumber.empty()) {
parsedNumber = "0";
}
// Note that parsedNumber can finish by a dot (1., 2., 0.). This is
// valid in most languages so we allow this.
auto number = gd::make_unique<NumberNode>(parsedNumber);
if (!numberHasStarted || !digitFound) {
number->diagnostic = RaiseSyntaxError(
_("A number was expected. You must enter a number here."));
}
return number;
}
} // namespace gd

View File

@@ -0,0 +1,765 @@
/*
* GDevelop Core
* Copyright 2008-present Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef GDCORE_EXPRESSIONPARSER2_H
#define GDCORE_EXPRESSIONPARSER2_H
#include <memory>
#include <utility>
#include <vector>
#include "ExpressionParser2Node.h"
#include "GDCore/Extensions/Metadata/ExpressionMetadata.h"
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
#include "GDCore/Project/Layout.h" // For GetTypeOfObject and GetTypeOfBehavior
#include "GDCore/String.h"
#include "GDCore/Tools/Localization.h"
#include "GDCore/Tools/MakeUnique.h"
namespace gd {
class Expression;
class ObjectsContainer;
class Platform;
class ParameterMetadata;
class ExpressionMetadata;
} // namespace gd
namespace gd {
/** \brief Parse an expression, returning a tree of node corresponding
* to the parsed expression.
*
* This is a LL(1) parser. This could be extracted to a generic/reusable
* parser by refactoring out the dependency on gd::MetadataProvider (injecting
* instead functions to be called to query supported functions).
*
* \see gd::ExpressionParserDiagnostic
* \see gd::ExpressionNode
*/
class GD_CORE_API ExpressionParser2 {
public:
ExpressionParser2(const gd::Platform &platform_,
const gd::ObjectsContainer &globalObjectsContainer_,
const gd::ObjectsContainer &objectsContainer_);
virtual ~ExpressionParser2(){};
/**
* Parse the given expression with the specified type.
*
* \param type Type of the expression: "string", "number",
* type supported by gd::ParameterMetadata::IsObject, types supported by
* gd::ParameterMetadata::IsExpression or "unknown". \param expression The
* expression to parse \param objectName Specify the object name, only for the
* case of "objectvar" type.
*
* \return The node representing the expression as a parsed tree.
*/
std::unique_ptr<ExpressionNode> ParseExpression(
const gd::String &type,
const gd::String &expression_,
const gd::String &objectName = "") {
expression = expression_;
currentPosition = 0;
return Start(type, objectName);
}
private:
/** \name Grammar
* Each method is a part of the grammar.
*/
///@{
std::unique_ptr<ExpressionNode> Start(const gd::String &type,
const gd::String &objectName = "") {
auto expression = Expression(type, objectName);
// Check for extra characters at the end of the expression
if (!IsEndReached()) {
auto op = gd::make_unique<OperatorNode>();
op->op = ' ';
op->leftHandSide = std::move(expression);
op->rightHandSide = ReadUntilEnd("unknown");
op->rightHandSide->diagnostic = RaiseSyntaxError(
_("The expression has extra character at the end that should be "
"removed (or completed if your expression is not finished)."));
return std::move(op);
}
return expression;
}
std::unique_ptr<ExpressionNode> Expression(
const gd::String &type, const gd::String &objectName = "") {
SkipWhitespace();
size_t expressionStartPosition = GetCurrentPosition();
std::unique_ptr<ExpressionNode> leftHandSide = Term(type, objectName);
SkipWhitespace();
if (IsEndReached()) return leftHandSide;
if (IsAnyChar(",)]")) return leftHandSide;
if (IsAnyChar(EXPRESSION_OPERATORS)) {
auto op = gd::make_unique<OperatorNode>();
op->op = GetCurrentChar();
op->leftHandSide = std::move(leftHandSide);
op->diagnostic = ValidateOperator(type, GetCurrentChar());
SkipChar();
op->rightHandSide = Expression(type, objectName);
return std::move(op);
}
if (type == "string") {
leftHandSide->diagnostic = RaiseSyntaxError(
"You must add the operator + between texts or expressions. For "
"example: \"Your name: \" + VariableString(PlayerName).");
} else if (type == "number") {
leftHandSide->diagnostic = RaiseSyntaxError(
"No operator found. Did you forget to enter an operator (like +, -, "
"* or /) between numbers or expressions?");
} else {
leftHandSide->diagnostic = RaiseSyntaxError(
"More than one term was found. Verify that your expression is "
"properly written.");
}
auto op = gd::make_unique<OperatorNode>();
op->op = ' ';
op->leftHandSide = std::move(leftHandSide);
op->rightHandSide = Expression(type, objectName);
return std::move(op);
}
std::unique_ptr<ExpressionNode> Term(const gd::String &type,
const gd::String &objectName) {
SkipWhitespace();
std::unique_ptr<ExpressionNode> factor = Factor(type, objectName);
SkipWhitespace();
// This while loop is used instead of a recursion (like in Expression)
// to guarantee the proper operator precedence. (Expression could also
// be reworked to use a while loop).
while (IsAnyChar(TERM_OPERATORS)) {
auto op = gd::make_unique<OperatorNode>();
op->op = GetCurrentChar();
op->leftHandSide = std::move(factor);
op->diagnostic = ValidateOperator(type, GetCurrentChar());
SkipChar();
op->rightHandSide = Factor(type, objectName);
SkipWhitespace();
factor = std::move(op);
}
return factor;
};
std::unique_ptr<ExpressionNode> Factor(const gd::String &type,
const gd::String &objectName) {
SkipWhitespace();
size_t expressionStartPosition = GetCurrentPosition();
std::unique_ptr<ExpressionNode> factor;
if (IsAnyChar(QUOTE)) {
factor = ReadText();
if (type == "number")
factor->diagnostic =
RaiseTypeError(_("You entered a text, but a number was expected."),
expressionStartPosition);
else if (type != "string")
factor->diagnostic = RaiseTypeError(
_("You entered a text, but this type was expected:") + type,
expressionStartPosition);
} else if (IsAnyChar(UNARY_OPERATORS)) {
auto unaryOperator = gd::make_unique<UnaryOperatorNode>(GetCurrentChar());
unaryOperator->diagnostic = ValidateUnaryOperator(type, GetCurrentChar());
SkipChar();
unaryOperator->factor = Factor(type, objectName);
factor = std::move(unaryOperator);
} else if (IsAnyChar(NUMBER_FIRST_CHAR)) {
factor = ReadNumber();
if (type == "string")
factor->diagnostic = RaiseTypeError(
_("You entered a number, but a text was expected (in quotes)."),
expressionStartPosition);
else if (type != "number")
factor->diagnostic = RaiseTypeError(
_("You entered a number, but this type was expected:") + type,
expressionStartPosition);
} else if (IsAnyChar("(")) {
SkipChar();
factor = SubExpression(type, objectName);
if (!IsAnyChar(")")) {
factor->diagnostic =
RaiseSyntaxError(_("Missing a closing parenthesis. Add a closing "
"parenthesis for each opening parenthesis."));
}
SkipIfIsAnyChar(")");
} else if (IsIdentifierAllowedChar()) {
// This is a place where the grammar differs according to the
// type being expected.
if (gd::ParameterMetadata::IsExpression("variable", type)) {
factor = Variable(type, objectName);
} else {
factor = Identifier(type);
}
} else {
factor = ReadUntilWhitespace(type);
factor->diagnostic = RaiseEmptyError(type, expressionStartPosition);
}
return factor;
}
std::unique_ptr<SubExpressionNode> SubExpression(
const gd::String &type, const gd::String &objectName) {
return std::move(
gd::make_unique<SubExpressionNode>(Expression(type, objectName)));
};
std::unique_ptr<IdentifierOrFunctionOrEmptyNode> Identifier(
const gd::String &type) {
size_t identifierStartPosition = GetCurrentPosition();
gd::String name = ReadIdentifierName();
SkipWhitespace();
if (IsNamespaceSeparator()) {
SkipNamespaceSeparator();
name += NAMESPACE_SEPARATOR;
name += ReadIdentifierName();
}
if (IsAnyChar("(")) {
SkipChar();
return FreeFunction(type, name, identifierStartPosition);
} else if (IsAnyChar(DOT)) {
SkipChar();
return ObjectFunctionOrBehaviorFunction(
type, name, identifierStartPosition);
} else {
auto identifier = gd::make_unique<IdentifierNode>(name, type);
if (type == "string") {
identifier->diagnostic =
RaiseTypeError(_("You must wrap your text inside double quotes "
"(example: \"Hello world\")."),
identifierStartPosition);
} else if (type == "number") {
identifier->diagnostic = RaiseTypeError(_("You must enter a number."),
identifierStartPosition);
} else if (!gd::ParameterMetadata::IsObject(type)) {
identifier->diagnostic = RaiseTypeError(
_("You've entered a name, but this type was expected:") + type,
identifierStartPosition);
}
return std::move(identifier);
}
}
std::unique_ptr<VariableNode> Variable(const gd::String &type,
const gd::String &objectName) {
size_t identifierStartPosition = GetCurrentPosition();
gd::String name = ReadIdentifierName();
auto variable = gd::make_unique<VariableNode>(type, name, objectName);
variable->child = VariableAccessorOrVariableBracketAccessor();
return std::move(variable);
}
std::unique_ptr<VariableAccessorOrVariableBracketAccessorNode>
VariableAccessorOrVariableBracketAccessor() {
std::unique_ptr<VariableAccessorOrVariableBracketAccessorNode> child;
SkipWhitespace();
if (IsAnyChar("[")) {
SkipChar();
child =
gd::make_unique<VariableBracketAccessorNode>(Expression("string"));
if (!IsAnyChar("]")) {
child->diagnostic =
RaiseSyntaxError(_("Missing a closing bracket. Add a closing "
"bracket for each opening bracket."));
}
SkipIfIsAnyChar("]");
child->child = VariableAccessorOrVariableBracketAccessor();
} else if (IsAnyChar(DOT)) {
SkipChar();
SkipWhitespace();
child = gd::make_unique<VariableAccessorNode>(ReadIdentifierName());
child->child = VariableAccessorOrVariableBracketAccessor();
}
return child;
}
std::unique_ptr<FunctionNode> FreeFunction(const gd::String &type,
const gd::String &functionFullName,
size_t functionStartPosition) {
// TODO: error if trying to use function for type != "number" && != "string"
// + Test for it
// This could be improved to have the type passed to a single
// GetExpressionMetadata function.
const gd::ExpressionMetadata &metadata =
type == "number" ? MetadataProvider::GetExpressionMetadata(
platform, functionFullName)
: MetadataProvider::GetStrExpressionMetadata(
platform, functionFullName);
auto parametersAndError = Parameters(metadata.parameters);
auto function = gd::make_unique<FunctionNode>(
type, std::move(parametersAndError.first), metadata, functionFullName);
function->diagnostic = std::move(parametersAndError.second);
if (!function->diagnostic)
function->diagnostic = ValidateFunction(*function, functionStartPosition);
return std::move(function);
}
std::unique_ptr<FunctionOrEmptyNode> ObjectFunctionOrBehaviorFunction(
const gd::String &type,
const gd::String &objectName,
size_t functionStartPosition) {
gd::String objectFunctionOrBehaviorName = ReadIdentifierName();
SkipWhitespace();
if (IsNamespaceSeparator()) {
SkipNamespaceSeparator();
return BehaviorFunction(type,
objectName,
objectFunctionOrBehaviorName,
functionStartPosition);
} else if (IsAnyChar("(")) {
SkipChar();
gd::String objectType =
GetTypeOfObject(globalObjectsContainer, objectsContainer, objectName);
// This could be improved to have the type passed to a single
// GetExpressionMetadata function.
const gd::ExpressionMetadata &metadata =
type == "number"
? MetadataProvider::GetObjectExpressionMetadata(
platform, objectType, objectFunctionOrBehaviorName)
: MetadataProvider::GetObjectStrExpressionMetadata(
platform, objectType, objectFunctionOrBehaviorName);
auto parametersAndError = Parameters(metadata.parameters, objectName);
auto function =
gd::make_unique<FunctionNode>(type,
objectName,
std::move(parametersAndError.first),
metadata,
objectFunctionOrBehaviorName);
function->diagnostic = std::move(parametersAndError.second);
if (!function->diagnostic)
function->diagnostic =
ValidateFunction(*function, functionStartPosition);
return std::move(function);
}
auto node = gd::make_unique<EmptyNode>(type);
node->diagnostic = RaiseSyntaxError(
_("An opening parenthesis (for an object expression), or double colon "
"(::) was expected (for a behavior expression)."));
return std::move(node);
}
std::unique_ptr<FunctionOrEmptyNode> BehaviorFunction(
const gd::String &type,
const gd::String &objectName,
const gd::String &behaviorName,
size_t functionStartPosition) {
gd::String functionName = ReadIdentifierName();
SkipWhitespace();
if (IsAnyChar("(")) {
SkipChar();
gd::String behaviorType = GetTypeOfBehavior(
globalObjectsContainer, objectsContainer, behaviorName);
// This could be improved to have the type passed to a single
// GetExpressionMetadata function.
const gd::ExpressionMetadata &metadata =
type == "number" ? MetadataProvider::GetBehaviorExpressionMetadata(
platform, behaviorType, functionName)
: MetadataProvider::GetBehaviorStrExpressionMetadata(
platform, behaviorType, functionName);
auto parametersAndError =
Parameters(metadata.parameters, objectName, behaviorName);
auto function =
gd::make_unique<FunctionNode>(type,
objectName,
behaviorName,
std::move(parametersAndError.first),
metadata,
functionName);
function->diagnostic = std::move(parametersAndError.second);
if (!function->diagnostic)
function->diagnostic =
ValidateFunction(*function, functionStartPosition);
return std::move(function);
} else {
auto node = gd::make_unique<EmptyNode>(type);
node->diagnostic = RaiseSyntaxError(
_("An opening parenthesis was expected here to call a function."));
return std::move(node);
}
}
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 = "") {
std::vector<std::unique_ptr<ExpressionNode>> parameters;
// By convention, object is always the first parameter, and behavior the
// second one.
size_t parameterIndex =
WrittenParametersFirstIndex(objectName, behaviorName);
while (!IsEndReached()) {
SkipWhitespace();
if (IsAnyChar(")")) {
SkipChar();
return std::make_pair(std::move(parameters), nullptr);
} else {
if (parameterIndex < parameterMetadata.size()) {
const gd::String &type = parameterMetadata[parameterIndex].GetType();
if (parameterMetadata[parameterIndex].IsCodeOnly()) {
// Do nothing, code only parameters are not written in expressions.
} else if (gd::ParameterMetadata::IsExpression("number", type)) {
parameters.push_back(Expression("number"));
} else if (gd::ParameterMetadata::IsExpression("string", type)) {
parameters.push_back(Expression("string"));
} else if (gd::ParameterMetadata::IsExpression("variable", type)) {
parameters.push_back(Expression(type, objectName));
} else if (gd::ParameterMetadata::IsObject(type)) {
parameters.push_back(Expression(type));
} else if (gd::ParameterMetadata::IsBehavior(type)) {
parameters.push_back(ReadText()); // TODO
} else {
size_t parameterStartPosition = GetCurrentPosition();
parameters.push_back(Expression("unknown"));
parameters.back()->diagnostic =
gd::make_unique<ExpressionParserError>(
"unknown_parameter_type",
_("This function is improperly set up. Reach out to the "
"extension developer or a GDevelop maintainer to fix "
"this issue"),
parameterStartPosition,
GetCurrentPosition());
}
} else {
size_t parameterStartPosition = GetCurrentPosition();
parameters.push_back(Expression("unknown"));
parameters.back()
->diagnostic = gd::make_unique<ExpressionParserError>(
"extra_parameter",
_("This parameter was not expected by this expression. Remove it "
"or verify that you've entered the proper expression name."),
parameterStartPosition,
GetCurrentPosition());
}
SkipWhitespace();
SkipIfIsAnyChar(PARAMETERS_SEPARATOR);
parameterIndex++;
}
}
return std::make_pair(
std::move(parameters),
RaiseSyntaxError(_("The list of parameters is not terminated. Add a "
"closing parenthesis to end the parameters.")));
}
///@}
/** \name Validators
* Return a diagnostic if any error is found
*/
///@{
std::unique_ptr<ExpressionParserDiagnostic> ValidateFunction(
const gd::FunctionNode &function, size_t functionStartPosition);
std::unique_ptr<ExpressionParserDiagnostic> ValidateOperator(
const gd::String &type, gd::String::value_type operatorChar) {
if (type == "number") {
if (operatorChar == '+' || operatorChar == '-' || operatorChar == '/' ||
operatorChar == '*') {
return gd::make_unique<ExpressionParserDiagnostic>();
}
return gd::make_unique<ExpressionParserError>(
"invalid_operator",
_("You've used an operator that is not supported. Operator should be "
"either +, -, / or *."),
GetCurrentPosition());
} else if (type == "string") {
if (operatorChar == '+') {
return gd::make_unique<ExpressionParserDiagnostic>();
}
return gd::make_unique<ExpressionParserError>(
"invalid_operator",
_("You've used an operator that is not supported. Only + can be used "
"to concatenate texts."),
GetCurrentPosition());
} else if (gd::ParameterMetadata::IsObject(type)) {
return gd::make_unique<ExpressionParserError>(
"invalid_operator",
_("Operators (+, -, /, *) can't be used with an object name. Remove the operator."),
GetCurrentPosition());
} else if (gd::ParameterMetadata::IsExpression("variable", type)) {
return gd::make_unique<ExpressionParserError>(
"invalid_operator",
_("Operators (+, -, /, *) can't be used in variable names. Remove "
"the operator from the variable name."),
GetCurrentPosition());
}
return gd::make_unique<ExpressionParserDiagnostic>();
}
std::unique_ptr<ExpressionParserDiagnostic> ValidateUnaryOperator(
const gd::String &type, gd::String::value_type operatorChar) {
if (type == "number") {
if (operatorChar == '+' || operatorChar == '-') {
return gd::make_unique<ExpressionParserDiagnostic>();
}
return gd::make_unique<ExpressionParserError>(
"invalid_operator",
_("You've used an \"unary\" operator that is not supported. Operator "
"should be "
"either + or -."),
GetCurrentPosition());
} else if (type == "string") {
return gd::make_unique<ExpressionParserError>(
"invalid_operator",
_("You've used an operator that is not supported. Only + can be used "
"to concatenate texts, and must be placed between two texts (or "
"expressions)."),
GetCurrentPosition());
} else if (gd::ParameterMetadata::IsObject(type)) {
return gd::make_unique<ExpressionParserError>(
"invalid_operator",
_("Operators (+, -) can't be used with an object name. Remove the operator."),
GetCurrentPosition());
} else if (gd::ParameterMetadata::IsExpression("variable", type)) {
return gd::make_unique<ExpressionParserError>(
"invalid_operator",
_("Operators (+, -) can't be used in variable names. Remove "
"the operator from the variable name."),
GetCurrentPosition());
}
return gd::make_unique<ExpressionParserDiagnostic>();
}
///@}
/** \name Parsing tokens
* Read tokens or characters
*/
///@{
void SkipChar() { currentPosition++; }
void SkipWhitespace() {
while (currentPosition < expression.size() &&
WHITESPACES.find(expression[currentPosition]) != gd::String::npos) {
currentPosition++;
}
}
void SkipIfIsAnyChar(const gd::String &allowedCharacters) {
if (IsAnyChar(allowedCharacters)) {
currentPosition++;
}
}
void SkipNamespaceSeparator() {
// Namespace separator is a special kind of delimiter as it is 2 characters
// long
if (IsNamespaceSeparator()) {
currentPosition += NAMESPACE_SEPARATOR.size();
}
}
bool IsAnyChar(const gd::String &allowedCharacters) {
if (currentPosition < expression.size() &&
allowedCharacters.find(expression[currentPosition]) !=
gd::String::npos) {
return true;
}
return false;
}
bool IsIdentifierAllowedChar() {
if (currentPosition < expression.size() &&
PARAMETERS_SEPARATOR.find(expression[currentPosition]) ==
gd::String::npos &&
DOT.find(expression[currentPosition]) == gd::String::npos &&
QUOTE.find(expression[currentPosition]) == gd::String::npos &&
BRACKETS.find(expression[currentPosition]) == gd::String::npos &&
EXPRESSION_OPERATORS.find(expression[currentPosition]) ==
gd::String::npos &&
TERM_OPERATORS.find(expression[currentPosition]) == gd::String::npos) {
return true;
}
return false;
}
bool IsNamespaceSeparator() {
// Namespace separator is a special kind of delimiter as it is 2 characters
// long
return (currentPosition + NAMESPACE_SEPARATOR.size() <= expression.size() &&
expression.substr(currentPosition, NAMESPACE_SEPARATOR.size()) ==
NAMESPACE_SEPARATOR);
}
bool IsEndReached() { return currentPosition >= expression.size(); }
gd::String ReadIdentifierName() {
gd::String name;
while (currentPosition < expression.size() &&
(IsIdentifierAllowedChar()
// Allow whitespace in identifier name for compatibility
|| expression[currentPosition] == ' ')) {
name += expression[currentPosition];
currentPosition++;
}
// Trim whitespace at the end (we allow them for compatibility inside
// the name, but after the last character that is not whitespace, they
// should be ignore again).
size_t lastCharacterPos = name.find_last_not_of(WHITESPACES);
if (!name.empty() && (lastCharacterPos + 1) < name.size()) {
name.erase(lastCharacterPos + 1);
}
return name;
}
std::unique_ptr<TextNode> ReadText();
std::unique_ptr<NumberNode> ReadNumber();
std::unique_ptr<EmptyNode> ReadUntilWhitespace(gd::String type) {
gd::String text;
while (currentPosition < expression.size() &&
WHITESPACES.find(expression[currentPosition]) == gd::String::npos) {
text += expression[currentPosition];
currentPosition++;
}
return gd::make_unique<EmptyNode>(type, text);
}
std::unique_ptr<EmptyNode> ReadUntilEnd(gd::String type) {
gd::String text;
while (currentPosition < expression.size()) {
text += expression[currentPosition];
currentPosition++;
}
return gd::make_unique<EmptyNode>(type, text);
}
size_t GetCurrentPosition() { return currentPosition; }
gd::String::value_type GetCurrentChar() {
if (currentPosition < expression.size()) {
return expression[currentPosition];
}
return '\n'; // Should not arise, unless GetCurrentChar was called when
// IsEndReached() is true (which is a logical error).
}
///@}
/** \name Raising errors
* Helpers to attach errors to nodes
*/
///@{
std::unique_ptr<ExpressionParserError> RaiseSyntaxError(
const gd::String &message) {
return std::move(gd::make_unique<ExpressionParserError>(
"syntax_error", message, GetCurrentPosition()));
}
std::unique_ptr<ExpressionParserError> RaiseTypeError(
const gd::String &message, size_t beginningPosition) {
return std::move(gd::make_unique<ExpressionParserError>(
"type_error", message, beginningPosition, GetCurrentPosition()));
}
std::unique_ptr<ExpressionParserError> RaiseEmptyError(
const gd::String &type, size_t beginningPosition) {
gd::String message;
if (type == "number") {
message = _("You must enter a number or a valid expression call.");
} else if (type == "string") {
message = _(
"You must enter a text (between quotes) or a valid expression call.");
} else if (gd::ParameterMetadata::IsExpression("variable", type)) {
message = _("You must enter a variable name.");
} else if (gd::ParameterMetadata::IsObject(type)) {
message = _("You must enter a valid object name.");
} else {
message = _("You must enter a valid expression.");
}
return std::move(RaiseTypeError(message, beginningPosition));
}
///@}
static size_t WrittenParametersFirstIndex(const gd::String &objectName,
const gd::String &behaviorName) {
// By convention, object is always the first parameter, and behavior the
// second one.
return !behaviorName.empty() ? 2 : (!objectName.empty() ? 1 : 0);
}
gd::String expression;
std::size_t currentPosition;
const gd::Platform &platform;
const gd::ObjectsContainer &globalObjectsContainer;
const gd::ObjectsContainer &objectsContainer;
static gd::String NUMBER_FIRST_CHAR;
static gd::String DOT;
static gd::String PARAMETERS_SEPARATOR;
static gd::String QUOTE;
static gd::String BRACKETS;
static gd::String EXPRESSION_OPERATORS;
static gd::String TERM_OPERATORS;
static gd::String UNARY_OPERATORS;
static gd::String WHITESPACES;
static gd::String NAMESPACE_SEPARATOR;
};
} // namespace gd
#endif // GDCORE_EXPRESSIONPARSER2_H

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