mirror of
https://github.com/4ian/GDevelop.git
synced 2025-10-15 10:19:04 +00:00
Compare commits
151 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
681636a74a | ||
![]() |
d4e8a7a314 | ||
![]() |
56ed187eba | ||
![]() |
6c26d69a7b | ||
![]() |
b2d13077a8 | ||
![]() |
399d9c2c14 | ||
![]() |
1d5bb98233 | ||
![]() |
e6c0c23789 | ||
![]() |
33ce33215b | ||
![]() |
8f547c63b2 | ||
![]() |
4ac404ccfc | ||
![]() |
f04ebc0e19 | ||
![]() |
ebabcd0ddc | ||
![]() |
afc279dd8a | ||
![]() |
5bd8da0b75 | ||
![]() |
3195813a0b | ||
![]() |
de28cebb67 | ||
![]() |
d0038ce536 | ||
![]() |
60c0a0c1a8 | ||
![]() |
1df03601f8 | ||
![]() |
474b6b6d9d | ||
![]() |
c1fad4c123 | ||
![]() |
9690f1f195 | ||
![]() |
0eabd5aed3 | ||
![]() |
e0e7037dd8 | ||
![]() |
412dc0b4ea | ||
![]() |
111c6eb014 | ||
![]() |
1f0f62099b | ||
![]() |
ea10467062 | ||
![]() |
a6dac96db1 | ||
![]() |
b8de8d4f15 | ||
![]() |
d25cad5aaf | ||
![]() |
f0583df184 | ||
![]() |
8d25904462 | ||
![]() |
9e9db1fc4c | ||
![]() |
9047b5a4ec | ||
![]() |
4dbe90b9a2 | ||
![]() |
73b88b7d5e | ||
![]() |
e8bc3b7ee8 | ||
![]() |
baa3cad99a | ||
![]() |
f477af7c6b | ||
![]() |
f8cedfd357 | ||
![]() |
1021447b02 | ||
![]() |
7567584ecd | ||
![]() |
90f75fba42 | ||
![]() |
fcc35f4e3c | ||
![]() |
01a7c48864 | ||
![]() |
be6a7753cf | ||
![]() |
3b1e0a5750 | ||
![]() |
4d2fd4752f | ||
![]() |
8e00e9615e | ||
![]() |
68253017ee | ||
![]() |
35c91f6f99 | ||
![]() |
803559fad8 | ||
![]() |
e85229d38e | ||
![]() |
e7381a7229 | ||
![]() |
257ba78486 | ||
![]() |
fb3d821368 | ||
![]() |
a5068d8fcf | ||
![]() |
d20b3228cf | ||
![]() |
aae54ef331 | ||
![]() |
caa5105651 | ||
![]() |
5eccdde332 | ||
![]() |
c34d758ccf | ||
![]() |
4e57d6aee9 | ||
![]() |
74d208f736 | ||
![]() |
d88b76becf | ||
![]() |
4a0e2481e6 | ||
![]() |
612b041da4 | ||
![]() |
3df7cd8e80 | ||
![]() |
7ba96ed0ab | ||
![]() |
689cd14947 | ||
![]() |
de50dc7967 | ||
![]() |
1aa2afaf85 | ||
![]() |
9120a52a08 | ||
![]() |
b0ffaebe91 | ||
![]() |
64a4a0b3a1 | ||
![]() |
cdfd7a7ab1 | ||
![]() |
a944ac43db | ||
![]() |
b7a1a96e7b | ||
![]() |
29d71796cc | ||
![]() |
78a1361897 | ||
![]() |
e340784ad6 | ||
![]() |
511466f0b8 | ||
![]() |
3f4e372acb | ||
![]() |
a73a92d748 | ||
![]() |
6e131d8a17 | ||
![]() |
9ac4c021e0 | ||
![]() |
a1fbf91ac7 | ||
![]() |
3f8d01e25e | ||
![]() |
03b4170d74 | ||
![]() |
0146ad9c38 | ||
![]() |
fbb23f86cd | ||
![]() |
1fdaeea4f8 | ||
![]() |
32b97f2c40 | ||
![]() |
d61f8336a8 | ||
![]() |
3448cd57fe | ||
![]() |
b7333612aa | ||
![]() |
de82182b37 | ||
![]() |
a8177b0e6f | ||
![]() |
9716ff14ed | ||
![]() |
f0e1d7a6d9 | ||
![]() |
dd89562405 | ||
![]() |
f0e56c4513 | ||
![]() |
ad2ea0abb8 | ||
![]() |
7ff71ea11f | ||
![]() |
cd1d82f7ee | ||
![]() |
0724b7d113 | ||
![]() |
c58ea73631 | ||
![]() |
b1039c6146 | ||
![]() |
1b5acc9fa9 | ||
![]() |
54cf91f180 | ||
![]() |
a434e4d9a9 | ||
![]() |
2f339dd170 | ||
![]() |
e843ca67ad | ||
![]() |
e4286b2021 | ||
![]() |
4579568866 | ||
![]() |
4543a03530 | ||
![]() |
5aed25a02f | ||
![]() |
6fd9cfe4c3 | ||
![]() |
091324d93b | ||
![]() |
d802bd14b9 | ||
![]() |
f46a6dc421 | ||
![]() |
b09e783b06 | ||
![]() |
e2a050b717 | ||
![]() |
ae22d1b876 | ||
![]() |
9e6e7166ef | ||
![]() |
22c71a8aef | ||
![]() |
4908c84494 | ||
![]() |
e4f44f7899 | ||
![]() |
c441610123 | ||
![]() |
d724712aa4 | ||
![]() |
08fc7d3e9f | ||
![]() |
ba30665811 | ||
![]() |
c72658e2d6 | ||
![]() |
a3fc7585b4 | ||
![]() |
244bc7e274 | ||
![]() |
5a5bf60aac | ||
![]() |
33a69849d9 | ||
![]() |
131ee1534a | ||
![]() |
614c324a63 | ||
![]() |
ca4ff1fa6d | ||
![]() |
0e9ed86b4d | ||
![]() |
3961c2af4a | ||
![]() |
cc4d78b08a | ||
![]() |
8d13285c97 | ||
![]() |
7b7e13817c | ||
![]() |
129ebeb4e4 | ||
![]() |
808f2bc802 | ||
![]() |
c5935232f7 | ||
![]() |
35a8341964 |
8
.github/workflows/build-storybook.yml
vendored
8
.github/workflows/build-storybook.yml
vendored
@@ -17,6 +17,10 @@ jobs:
|
||||
build-storybook:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
|
||||
- name: Configure AWS Credentials
|
||||
uses: aws-actions/configure-aws-credentials@v1
|
||||
with:
|
||||
@@ -57,8 +61,8 @@ jobs:
|
||||
|
||||
- name: Log urls to the Storybook
|
||||
run: |
|
||||
echo "Find the latest Storybook for this branch on http://gdevelop-storybook.s3-website-us-east-1.amazonaws.com/$(git rev-parse --abbrev-ref HEAD)/latest/index.html"
|
||||
echo "Find the Storybook for this commit on http://gdevelop-storybook.s3-website-us-east-1.amazonaws.com/$(git rev-parse --abbrev-ref HEAD)/commit/$(git rev-parse HEAD)/index.html"
|
||||
echo "Find the latest Storybook for this branch on https://gdevelop-storybook.s3.amazonaws.com/$(git rev-parse --abbrev-ref HEAD)/latest/index.html"
|
||||
echo "Find the Storybook for this commit on https://gdevelop-storybook.s3.amazonaws.com/$(git rev-parse --abbrev-ref HEAD)/commit/$(git rev-parse HEAD)/index.html"
|
||||
|
||||
# Publish on Chromatic, only when manually launched (too costly to run on every commit).
|
||||
- name: Publish Storybook to Chromatic
|
||||
|
5
.github/workflows/extract-translations.yml
vendored
5
.github/workflows/extract-translations.yml
vendored
@@ -11,6 +11,9 @@ jobs:
|
||||
extract-translations:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
# Cache npm dependencies to speed up the workflow
|
||||
@@ -38,7 +41,7 @@ jobs:
|
||||
- name: Install Crowdin CLI
|
||||
if: github.ref == 'refs/heads/master'
|
||||
run: npm i -g @crowdin/cli
|
||||
|
||||
|
||||
- name: Upload translations to Crowdin
|
||||
run: crowdin upload sources
|
||||
if: github.ref == 'refs/heads/master'
|
||||
|
9
.github/workflows/update-translations.yml
vendored
9
.github/workflows/update-translations.yml
vendored
@@ -14,6 +14,9 @@ jobs:
|
||||
update-translations:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
# Cache npm dependencies to speed up the workflow
|
||||
@@ -44,7 +47,7 @@ jobs:
|
||||
# (Build and) download the most recent translations (PO files) from Crowdin.
|
||||
- name: Install Crowdin CLI
|
||||
run: npm i -g @crowdin/cli
|
||||
|
||||
|
||||
- name: Download new translations from Crowdin
|
||||
run: crowdin download
|
||||
env:
|
||||
@@ -66,8 +69,8 @@ jobs:
|
||||
commit-message: Update translations [skip ci]
|
||||
branch: chore/update-translations
|
||||
delete-branch: true
|
||||
title: '[Auto PR] Update translations'
|
||||
title: "[Auto PR] Update translations"
|
||||
body: |
|
||||
This updates the translations by downloading them from Crowdin and compiling them for usage by the app.
|
||||
|
||||
|
||||
Please double check the values in `newIDE/app/src/locales/LocalesMetadata.js` to ensure the changes are sensible.
|
||||
|
@@ -34,6 +34,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
|
||||
"res/function32.png")
|
||||
.SetHelpPath("/events/functions/return")
|
||||
.AddParameter("expression", "The number to be returned")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -48,6 +49,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
|
||||
"res/function32.png")
|
||||
.SetHelpPath("/events/functions/return")
|
||||
.AddParameter("string", "The text to be returned")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -61,6 +63,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
|
||||
"res/function32.png")
|
||||
.SetHelpPath("/events/functions/return")
|
||||
.AddParameter("trueorfalse", "Should the condition be true or false?")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -75,6 +78,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
|
||||
"res/function32.png",
|
||||
"res/function32.png")
|
||||
.AddParameter("functionParameterName", "Parameter name")
|
||||
.SetRelevantForFunctionEventsOnly()
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
@@ -84,7 +88,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
|
||||
_("Get function parameter (also called \"argument\") value."),
|
||||
"",
|
||||
"res/function16.png")
|
||||
.AddParameter("functionParameterName", "Parameter name");
|
||||
.AddParameter("functionParameterName", "Parameter name")
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddStrExpression(
|
||||
@@ -93,7 +98,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
|
||||
_("Get function parameter (also called \"argument\") text."),
|
||||
"",
|
||||
"res/function16.png")
|
||||
.AddParameter("functionParameterName", "Parameter name");
|
||||
.AddParameter("functionParameterName", "Parameter name")
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddCondition(
|
||||
@@ -106,7 +112,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
|
||||
"res/function16.png")
|
||||
.AddParameter("functionParameterName", "Parameter name")
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"number", gd::ParameterOptions::MakeNewOptions());
|
||||
"number", gd::ParameterOptions::MakeNewOptions())
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
|
||||
extension
|
||||
.AddCondition(
|
||||
@@ -119,7 +126,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
|
||||
"res/function16.png")
|
||||
.AddParameter("functionParameterName", "Parameter name")
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"string", gd::ParameterOptions::MakeNewOptions());
|
||||
"string", gd::ParameterOptions::MakeNewOptions())
|
||||
.SetRelevantForFunctionEventsOnly();
|
||||
}
|
||||
|
||||
} // namespace gd
|
||||
|
@@ -15,11 +15,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAsyncExtension(
|
||||
extension
|
||||
.SetExtensionInformation(
|
||||
"BuiltinAsync",
|
||||
_("Async functions"),
|
||||
_("Asynchronous functions"),
|
||||
_("Functions that defer the execution of the events after it."),
|
||||
"Arthur Pacaud (arthuro555)",
|
||||
"Open source (MIT License)")
|
||||
.SetCategory("Advanced");
|
||||
extension.AddInstructionOrExpressionGroupMetadata(_("Asynchronous functions"))
|
||||
.SetIcon("res/function32.png");
|
||||
|
||||
extension.AddEvent("Async",
|
||||
_("Async event"),
|
||||
@@ -27,6 +29,19 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAsyncExtension(
|
||||
"",
|
||||
"res/eventaddicon.png",
|
||||
std::make_shared<gd::AsyncEvent>());
|
||||
|
||||
extension
|
||||
.AddAction(
|
||||
"ResolveAsyncEventsFunction",
|
||||
_("End asynchronous function"),
|
||||
_("Mark an asynchronous function as finished. This will allow the "
|
||||
"actions and subevents following it to be run."),
|
||||
"Mark asynchronous function as ended",
|
||||
"",
|
||||
"res/actions/quit24.png",
|
||||
"res/actions/quit.png")
|
||||
.AddCodeOnlyParameter("eventsFunctionContext", "")
|
||||
.SetRelevantForAsynchronousFunctionEventsOnly();
|
||||
}
|
||||
|
||||
} // namespace gd
|
||||
|
@@ -27,6 +27,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.SetIcon("res/actions/create24.png");
|
||||
extension.AddInstructionOrExpressionGroupMetadata(_("Movement using forces"))
|
||||
.SetIcon("res/actions/force24.png");
|
||||
extension.AddInstructionOrExpressionGroupMetadata(_("Variables"))
|
||||
.SetIcon("res/conditions/var24.png");
|
||||
extension.AddInstructionOrExpressionGroupMetadata(_("Position"))
|
||||
.SetIcon("res/actions/position24_black.png");
|
||||
|
||||
gd::ObjectMetadata& obj = extension.AddObject<gd::ObjectConfiguration>(
|
||||
"", _("Base object"), _("Base object"), "res/objeticon24.png");
|
||||
@@ -406,8 +410,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddAction("ModVarObjet",
|
||||
_("Value of an object variable"),
|
||||
_("Change the value of an object variable."),
|
||||
_("Change number variable"),
|
||||
_("Modify the number value of an object variable."),
|
||||
_("the variable _PARAM1_"),
|
||||
_("Variables"),
|
||||
"res/actions/var24.png",
|
||||
@@ -419,8 +423,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
ParameterOptions::MakeNewOptions());
|
||||
|
||||
obj.AddAction("ModVarObjetTxt",
|
||||
_("Text of an object variable"),
|
||||
_("Change the text of an object variable."),
|
||||
_("Change text variable"),
|
||||
_("Modify the text of an object variable."),
|
||||
_("the text of variable _PARAM1_"),
|
||||
_("Variables"),
|
||||
"res/actions/var24.png",
|
||||
@@ -432,8 +436,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
ParameterOptions::MakeNewOptions());
|
||||
|
||||
obj.AddAction("SetObjectVariableAsBoolean",
|
||||
_("Boolean value of an object variable"),
|
||||
_("Change the boolean value of an object variable."),
|
||||
_("Change boolean variable"),
|
||||
_("Modify the boolean value of an object variable."),
|
||||
_("Set the boolean value of variable _PARAM1_ of "
|
||||
"_PARAM0_ to _PARAM2_"),
|
||||
_("Variables"),
|
||||
@@ -446,7 +450,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
|
||||
obj.AddAction(
|
||||
"ToggleObjectVariableAsBoolean",
|
||||
_("Toggle the boolean value of an object variable"),
|
||||
_("Toggle boolean variable"),
|
||||
_("Toggles the boolean value of an object variable.") + "\n" +
|
||||
_("If it was true, it will become false, and if it was false "
|
||||
"it will become true."),
|
||||
@@ -461,37 +465,39 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
|
||||
obj.AddCondition("ObjectVariableChildExists",
|
||||
_("Child existence"),
|
||||
_("Check if the specified child of the variable exists."),
|
||||
_("Check if the specified child of the object "
|
||||
"structure variable exists."),
|
||||
_("Child _PARAM2_ of variable _PARAM1_ of _PARAM0_ exists"),
|
||||
_("Variables/Collections/Structures"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
.AddParameter("objectvar", _("Structure variable"))
|
||||
.AddParameter("string", _("Name of the child"))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddAction("ObjectVariableRemoveChild",
|
||||
_("Remove a child"),
|
||||
_("Remove a child from an object variable."),
|
||||
_("Remove a child from an object structure variable."),
|
||||
_("Remove child _PARAM2_ from variable _PARAM1_ of _PARAM0_"),
|
||||
_("Variables/Collections/Structures"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
.AddParameter("objectvar", _("Structure variable"))
|
||||
.AddParameter("string", _("Child's name"))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddAction("ObjectVariableClearChildren",
|
||||
_("Clear variable"),
|
||||
_("Remove all the children from the object variable."),
|
||||
_("Clear children"),
|
||||
_("Remove all the children from the object array or structure "
|
||||
"variable."),
|
||||
_("Clear children from variable _PARAM1_ of _PARAM0_"),
|
||||
_("Variables/Collections"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
.AddParameter("objectvar", _("Array or structure variable"))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddAction("Cache",
|
||||
@@ -619,8 +625,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddCondition("VarObjet",
|
||||
_("Value of an object variable"),
|
||||
_("Compare the value of an object variable."),
|
||||
_("Number variable"),
|
||||
_("Compare the number value of an object variable."),
|
||||
_("the variable _PARAM1_"),
|
||||
_("Variables"),
|
||||
"res/conditions/var24.png",
|
||||
@@ -632,7 +638,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
"number", ParameterOptions::MakeNewOptions());
|
||||
|
||||
obj.AddCondition("VarObjetTxt",
|
||||
_("Text of an object variable"),
|
||||
_("Text variable"),
|
||||
_("Compare the text of an object variable."),
|
||||
_("the text of variable _PARAM1_"),
|
||||
_("Variables"),
|
||||
@@ -645,7 +651,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
"string", ParameterOptions::MakeNewOptions());
|
||||
|
||||
obj.AddCondition("ObjectVariableAsBoolean",
|
||||
_("Boolean value of an object variable"),
|
||||
_("Boolean variable"),
|
||||
_("Compare the boolean value of an object variable."),
|
||||
_("The boolean value of variable _PARAM1_ of object "
|
||||
"_PARAM0_ is _PARAM2_"),
|
||||
@@ -659,7 +665,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
|
||||
obj.AddCondition("VarObjetDef",
|
||||
"Variable defined",
|
||||
"Check if the variable is defined.",
|
||||
"Check if the object variable is defined.",
|
||||
"Variable _PARAM1 of _PARAM0_ is defined",
|
||||
_("Variables"),
|
||||
"res/conditions/var24.png",
|
||||
@@ -667,78 +673,131 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("string", _("Variable"))
|
||||
.SetHidden();
|
||||
.SetHidden(); // Deprecated.
|
||||
|
||||
obj.AddAction(
|
||||
"ObjectVariablePush",
|
||||
_("Append variable to an object array"),
|
||||
_("Appends a variable to the end of an object array variable."),
|
||||
_("Append variable _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
|
||||
_("Variables/Collections/Arrays"),
|
||||
_("Add existing variable"),
|
||||
_("Adds an existing variable to the end of an object array variable."),
|
||||
_("Add variable _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Array variable"))
|
||||
.AddParameter("scenevar", _("Scene variable with the content to append"))
|
||||
.SetParameterLongDescription(
|
||||
_("The content of the variable will *be copied* and appended at the "
|
||||
"end of the array."))
|
||||
.AddParameter("scenevar", _("Scene variable with the content to add"))
|
||||
.SetParameterLongDescription(_("The content of the object variable will "
|
||||
"*be copied* and added at the "
|
||||
"end of the array."))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddAction(
|
||||
"ObjectVariablePushString",
|
||||
_("Append a string to an object array"),
|
||||
_("Appends a string to the end of an object array variable."),
|
||||
_("Append string _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
|
||||
_("Variables/Collections/Arrays"),
|
||||
_("Add text variable"),
|
||||
_("Adds a text (string) to the end of an object array variable."),
|
||||
_("Add text _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Array variable"))
|
||||
.AddParameter("string", _("String to append"))
|
||||
.AddParameter("string", _("Text to add"))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddAction(
|
||||
"ObjectVariablePushNumber",
|
||||
_("Append a number to an object array"),
|
||||
_("Appends a number to the end of an object array variable."),
|
||||
_("Append number _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
|
||||
_("Variables/Collections/Arrays"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
obj.AddAction("ObjectVariablePushNumber",
|
||||
_("Add number variable"),
|
||||
_("Adds a number to the end of an object array variable."),
|
||||
_("Add number _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Array variable"))
|
||||
.AddParameter("expression", _("Number to append"))
|
||||
.AddParameter("expression", _("Number to add"))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddAction(
|
||||
"ObjectVariablePushBool",
|
||||
_("Append a boolean to an object array"),
|
||||
_("Appends a boolean to the end of an object array variable."),
|
||||
_("Append boolean _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
|
||||
_("Variables/Collections/Arrays"),
|
||||
_("Add boolean variable"),
|
||||
_("Adds a boolean to the end of an object array variable."),
|
||||
_("Add boolean _PARAM2_ to array variable _PARAM1_ of _PARAM0_"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Array variable"))
|
||||
.AddParameter("trueorfalse", _("Boolean to append"))
|
||||
.AddParameter("trueorfalse", _("Boolean to add"))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddAction(
|
||||
"ObjectVariableRemoveAt",
|
||||
_("Remove variable from an object array (by index)"),
|
||||
_("Remove variable by index"),
|
||||
_("Removes a variable at the specified index of an object array "
|
||||
"variable."),
|
||||
_("Remove variable at index _PARAM2_ from array variable _PARAM1_ of "
|
||||
"_PARAM0_"),
|
||||
_("Variables/Collections/Arrays"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
.AddParameter("objectvar", _("Array variable"))
|
||||
.AddParameter("expression", _("Index to remove"))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddCondition(
|
||||
"ObjectVariableChildCount",
|
||||
_("Number of children"),
|
||||
_("Compare the number of children in an object array variable."),
|
||||
_("The number of children in the array variable _PARAM1_"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"number", ParameterOptions::MakeNewOptions())
|
||||
.MarkAsAdvanced();
|
||||
|
||||
obj.AddStrExpression(
|
||||
"ArrayVariableFirstString",
|
||||
_("First text child"),
|
||||
_("Get the value of the first element of an object array variable, if "
|
||||
"it is a text (string) variable."),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Array variable"));
|
||||
|
||||
obj.AddExpression(
|
||||
"ArrayVariableFirstNumber",
|
||||
_("First number child"),
|
||||
_("Get the value of the first element of an object array variable, if "
|
||||
"it is a number variable."),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Array variable"));
|
||||
|
||||
obj.AddStrExpression(
|
||||
"ArrayVariableLastString",
|
||||
_("Last text child"),
|
||||
_("Get the value of the last element of an object array variable, if "
|
||||
"it is a text (string) variable."),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Array variable"));
|
||||
|
||||
obj.AddExpression(
|
||||
"ArrayVariableLastNumber",
|
||||
_("Last number child"),
|
||||
_("Get the value of the last element of an object array variable, if "
|
||||
"it is a number variable."),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Array variable"));
|
||||
|
||||
obj.AddCondition("BehaviorActivated",
|
||||
_("Behavior activated"),
|
||||
_("Check if the behavior is activated for the object."),
|
||||
@@ -1115,23 +1174,24 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.AddParameter("expression", _("Target Y position"));
|
||||
|
||||
obj.AddExpression("Variable",
|
||||
_("Value of an object variable"),
|
||||
_("Value of an object variable"),
|
||||
_("Number variable"),
|
||||
_("Number value of an object variable"),
|
||||
_("Variables"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Variable"));
|
||||
|
||||
obj.AddExpression("VariableChildCount",
|
||||
_("Number of children of an object variable"),
|
||||
_("Number of children of an object variable"),
|
||||
_("Variables"),
|
||||
"res/actions/var.png")
|
||||
obj.AddExpression(
|
||||
"VariableChildCount",
|
||||
_("Number of children"),
|
||||
_("Number of children in an object array or structure variable"),
|
||||
_("Variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Variable"));
|
||||
.AddParameter("objectvar", _("Array or structure variable"));
|
||||
|
||||
obj.AddStrExpression("VariableString",
|
||||
_("Text of an object variable"),
|
||||
_("Text variable"),
|
||||
_("Text of an object variable"),
|
||||
_("Variables"),
|
||||
"res/actions/var.png")
|
||||
@@ -1265,6 +1325,17 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.MarkAsSimple()
|
||||
.SetRequiresBaseObjectCapability("effect");
|
||||
|
||||
obj.AddAction("SetIncludedInParentCollisionMask",
|
||||
_("Include in parent collision mask"),
|
||||
_("Include or exclude a child from its parent collision mask."),
|
||||
_("Include _PARAM0_ in parent object collision mask: _PARAM1_"),
|
||||
_("Collision"),
|
||||
"res/function32.png",
|
||||
"res/function32.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("yesorno", "Include in parent collision mask")
|
||||
.SetRelevantForCustomObjectEventsOnly();
|
||||
|
||||
extension
|
||||
.AddAction("Create",
|
||||
_("Create an object"),
|
||||
@@ -1293,7 +1364,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
"res/actions/create24.png",
|
||||
"res/actions/create24.png")
|
||||
.AddCodeOnlyParameter("objectsContext", "")
|
||||
.AddParameter("objectListOrEmptyIfJustDeclared", _("Group of potential objects"))
|
||||
.AddParameter("objectListOrEmptyIfJustDeclared",
|
||||
_("Group of potential objects"))
|
||||
.SetParameterLongDescription(
|
||||
_("Group containing objects that can be created by the action."))
|
||||
.AddParameter("string", _("Name of the object to create"))
|
||||
|
@@ -197,14 +197,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
|
||||
extension.AddDuplicatedExpression("SourisY", "CursorY").SetHidden();
|
||||
|
||||
extension
|
||||
.AddExpressionAndCondition(
|
||||
"number",
|
||||
"MouseOnlyCursorX",
|
||||
_("Mouse cursor X position"),
|
||||
_("the X position of the mouse cursor"),
|
||||
_("the mouse cursor X position"),
|
||||
"",
|
||||
"res/conditions/mouse24.png")
|
||||
.AddExpressionAndCondition("number",
|
||||
"MouseOnlyCursorX",
|
||||
_("Mouse cursor X position"),
|
||||
_("the X position of the mouse cursor"),
|
||||
_("the mouse cursor X position"),
|
||||
"",
|
||||
"res/conditions/mouse24.png")
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
|
||||
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
|
||||
@@ -215,14 +214,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
|
||||
.SetHidden();
|
||||
|
||||
extension
|
||||
.AddExpressionAndCondition(
|
||||
"number",
|
||||
"MouseOnlyCursorY",
|
||||
_("Mouse cursor Y position"),
|
||||
_("the Y position of the mouse cursor"),
|
||||
_("the mouse cursor Y position"),
|
||||
"",
|
||||
"res/conditions/mouse24.png")
|
||||
.AddExpressionAndCondition("number",
|
||||
"MouseOnlyCursorY",
|
||||
_("Mouse cursor Y position"),
|
||||
_("the Y position of the mouse cursor"),
|
||||
_("the mouse cursor Y position"),
|
||||
"",
|
||||
"res/conditions/mouse24.png")
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
|
||||
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
|
||||
@@ -376,7 +374,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
|
||||
.AddCondition(
|
||||
"HasAnyTouchStarted",
|
||||
_("A new touch has started"),
|
||||
_("Check if a touch has just started on this frame. The touch identifiers can be "
|
||||
_("Check if a touch has just started on this frame. The touch "
|
||||
"identifiers can be "
|
||||
"accessed using StartedTouchId() and StartedTouchCount()."),
|
||||
_("A new touch has started"),
|
||||
_("Multitouch"),
|
||||
@@ -386,24 +385,24 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
|
||||
.SetHidden();
|
||||
|
||||
extension
|
||||
.AddExpression(
|
||||
"StartedTouchCount",
|
||||
_("Started touch count"),
|
||||
_("The number of touches that have just started on this frame. The touch identifiers can be "
|
||||
"accessed using StartedTouchId()."),
|
||||
_("Multitouch"),
|
||||
"res/conditions/touch.png")
|
||||
.AddExpression("StartedTouchCount",
|
||||
_("Started touch count"),
|
||||
_("The number of touches that have just started on this "
|
||||
"frame. The touch identifiers can be "
|
||||
"accessed using StartedTouchId()."),
|
||||
_("Multitouch"),
|
||||
"res/conditions/touch.png")
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.SetHidden();
|
||||
|
||||
extension
|
||||
.AddExpression(
|
||||
"StartedTouchId",
|
||||
_("Started touch identifier"),
|
||||
_("The identifier of the touch that has just started on this frame. The touch number of touches can be "
|
||||
"accessed using StartedTouchCount()."),
|
||||
_("Multitouch"),
|
||||
"res/conditions/touch.png")
|
||||
.AddExpression("StartedTouchId",
|
||||
_("Started touch identifier"),
|
||||
_("The identifier of the touch that has just started on "
|
||||
"this frame. The number of touches can be "
|
||||
"accessed using StartedTouchCount()."),
|
||||
_("Multitouch"),
|
||||
"res/conditions/touch.png")
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.AddParameter("expression", _("Touch index"))
|
||||
.SetHidden();
|
||||
@@ -414,7 +413,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
|
||||
_("A new touch has started"),
|
||||
_("Check if a touch has just started or the mouse left button has "
|
||||
"been pressed on this frame. The touch identifiers can be "
|
||||
"accessed using StartedTouchOrMouseId() and StartedTouchOrMouseCount()."),
|
||||
"accessed using StartedTouchOrMouseId() and "
|
||||
"StartedTouchOrMouseCount()."),
|
||||
_("A new touch has started"),
|
||||
_("Multitouch"),
|
||||
"res/conditions/touch24.png",
|
||||
@@ -427,7 +427,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
|
||||
_("Started touch count"),
|
||||
_("The number of touches (including the mouse) that have just "
|
||||
"started on this frame. The touch identifiers can be "
|
||||
"accessed using StartedTouchOrMouseCount()."),
|
||||
"accessed using StartedTouchOrMouseId()."),
|
||||
_("Multitouch"),
|
||||
"res/conditions/touch.png")
|
||||
.AddCodeOnlyParameter("currentScene", "");
|
||||
@@ -437,7 +437,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
|
||||
"StartedTouchOrMouseId",
|
||||
_("Started touch identifier"),
|
||||
_("The identifier of the touch or mouse that has just started on "
|
||||
"this frame. The touch number of touches can be "
|
||||
"this frame. The number of touches can be "
|
||||
"accessed using StartedTouchOrMouseCount()."),
|
||||
_("Multitouch"),
|
||||
"res/conditions/touch.png")
|
||||
@@ -445,14 +445,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
|
||||
.AddParameter("expression", _("Touch index"));
|
||||
|
||||
extension
|
||||
.AddCondition(
|
||||
"HasTouchEnded",
|
||||
_("A touch has ended"),
|
||||
_("Check if a touch has ended or a mouse left button has been released."),
|
||||
_("The touch with identifier _PARAM1_ has ended"),
|
||||
_("Multitouch"),
|
||||
"res/conditions/touch24.png",
|
||||
"res/conditions/touch.png")
|
||||
.AddCondition("HasTouchEnded",
|
||||
_("A touch has ended"),
|
||||
_("Check if a touch has ended or a mouse left button has "
|
||||
"been released."),
|
||||
_("The touch with identifier _PARAM1_ has ended"),
|
||||
_("Multitouch"),
|
||||
"res/conditions/touch24.png",
|
||||
"res/conditions/touch.png")
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.AddParameter("expression", _("Touch identifier"));
|
||||
|
||||
|
@@ -27,9 +27,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
|
||||
extension
|
||||
.AddCondition("VarScene",
|
||||
_("Value of a scene variable"),
|
||||
_("Compare the value of a scene variable."),
|
||||
_("the scene variable _PARAM0_"),
|
||||
_("Number variable"),
|
||||
_("Compare the number value of a scene variable."),
|
||||
_("The number of scene variable _PARAM0_"),
|
||||
_("Scene variables"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
@@ -39,9 +39,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
|
||||
extension
|
||||
.AddCondition("VarSceneTxt",
|
||||
_("Text of a scene variable"),
|
||||
_("Compare the text of a scene variable."),
|
||||
_("the text of scene variable _PARAM0_"),
|
||||
_("Text variable"),
|
||||
_("Compare the text (string) of a scene variable."),
|
||||
_("The text of scene variable _PARAM0_"),
|
||||
_("Scene variables"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
@@ -52,7 +52,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
extension
|
||||
.AddCondition(
|
||||
"SceneVariableAsBoolean",
|
||||
_("Boolean value of a scene variable"),
|
||||
_("Boolean variable"),
|
||||
_("Compare the boolean value of a scene variable."),
|
||||
_("The boolean value of scene variable _PARAM0_ is _PARAM1_"),
|
||||
_("Scene variables"),
|
||||
@@ -63,14 +63,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
.SetDefaultValue("true");
|
||||
|
||||
extension
|
||||
.AddCondition(
|
||||
"VariableChildExists",
|
||||
_("Child existence"),
|
||||
_("Check if the specified child of the scene variable exists."),
|
||||
_("Child _PARAM1_ of scene variable _PARAM0_ exists"),
|
||||
_("Scene variables/Collections/Structures"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddCondition("VariableChildExists",
|
||||
_("Child existence"),
|
||||
_("Check if the specified child of the scene structure "
|
||||
"variable exists."),
|
||||
_("Child _PARAM1_ of scene variable _PARAM0_ exists"),
|
||||
_("Scene variables/Arrays and structures"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("scenevar", _("Variable"))
|
||||
.AddParameter("string", _("Name of the child"))
|
||||
.MarkAsAdvanced();
|
||||
@@ -78,10 +78,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
extension
|
||||
.AddCondition("GlobalVariableChildExists",
|
||||
_("Child existence"),
|
||||
_("Check if the specified child of the global "
|
||||
_("Check if the specified child of the global structure "
|
||||
"variable exists."),
|
||||
_("Child _PARAM1_ of global variable _PARAM0_ exists"),
|
||||
_("Global variables/Collections/Structures"),
|
||||
_("Global variables/Arrays and structures"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("globalvar", _("Variable"))
|
||||
@@ -90,7 +90,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
|
||||
extension
|
||||
.AddCondition("VarSceneDef",
|
||||
"Test if a scene variable is defined",
|
||||
"Variable defined",
|
||||
"Test if the scene variable exists.",
|
||||
"Scene variable _PARAM0_ is defined",
|
||||
_("Scene variables"),
|
||||
@@ -98,12 +98,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
"res/conditions/var.png")
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.AddParameter("string", _("Variable"))
|
||||
.SetHidden();
|
||||
.SetHidden(); // Deprecated.
|
||||
|
||||
extension
|
||||
.AddCondition("VarGlobal",
|
||||
_("Value of a global variable"),
|
||||
_("Compare the value of a global variable."),
|
||||
_("Number variable"),
|
||||
_("Compare the number value of a global variable."),
|
||||
_("the global variable _PARAM0_"),
|
||||
_("Global variables"),
|
||||
"res/conditions/var24.png",
|
||||
@@ -115,8 +115,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
|
||||
extension
|
||||
.AddCondition("VarGlobalTxt",
|
||||
_("Text of a global variable"),
|
||||
_("Compare the text of a global variable."),
|
||||
_("Text variable"),
|
||||
_("Compare the text (string) of a global variable."),
|
||||
_("the text of the global variable _PARAM0_"),
|
||||
_("Global variables"),
|
||||
"res/conditions/var24.png",
|
||||
@@ -129,7 +129,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
extension
|
||||
.AddCondition(
|
||||
"GlobalVariableAsBoolean",
|
||||
_("Boolean value of a global variable"),
|
||||
_("Boolean variable"),
|
||||
_("Compare the boolean value of a global variable."),
|
||||
_("The boolean value of global variable _PARAM0_ is _PARAM1_"),
|
||||
_("Global variables"),
|
||||
@@ -141,8 +141,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
|
||||
extension
|
||||
.AddCondition("VarGlobalDef",
|
||||
"Test if a global variable is defined",
|
||||
"Test if a global variable exists",
|
||||
"Variable defined",
|
||||
"Test if a global variable exists.",
|
||||
"Global variable _PARAM0_ is defined",
|
||||
_("Global variables"),
|
||||
"res/conditions/var24.png",
|
||||
@@ -150,12 +150,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.AddParameter("string", _("Variable"))
|
||||
.MarkAsAdvanced()
|
||||
.SetHidden();
|
||||
.SetHidden(); // Deprecated.
|
||||
|
||||
extension
|
||||
.AddAction("ModVarScene",
|
||||
_("Value of a scene variable"),
|
||||
_("Change the value of a scene variable."),
|
||||
_("Change number variable"),
|
||||
_("Modify the number value of a scene variable."),
|
||||
_("the scene variable _PARAM0_"),
|
||||
_("Scene variables"),
|
||||
"res/actions/var24.png",
|
||||
@@ -166,8 +166,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
|
||||
extension
|
||||
.AddAction("ModVarSceneTxt",
|
||||
_("String of a scene variable"),
|
||||
_("Modify the text of a scene variable."),
|
||||
_("Change text variable"),
|
||||
_("Modify the text (string) of a scene variable."),
|
||||
_("the text of scene variable _PARAM0_"),
|
||||
_("Scene variables"),
|
||||
"res/actions/var24.png",
|
||||
@@ -179,7 +179,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
extension
|
||||
.AddAction(
|
||||
"SetSceneVariableAsBoolean",
|
||||
_("Boolean value of a scene variable"),
|
||||
_("Change boolean variable"),
|
||||
_("Modify the boolean value of a scene variable."),
|
||||
_("Set the boolean value of scene variable _PARAM0_ to _PARAM1_"),
|
||||
_("Scene variables"),
|
||||
@@ -190,7 +190,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
|
||||
extension
|
||||
.AddAction("ToggleSceneVariableAsBoolean",
|
||||
_("Toggle boolean value of a scene variable"),
|
||||
_("Toggle boolean variable"),
|
||||
_("Toggle the boolean value of a scene variable.") + "\n" +
|
||||
_("If it was true, it will become false, and if it was "
|
||||
"false it will become true."),
|
||||
@@ -202,8 +202,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
|
||||
extension
|
||||
.AddAction("ModVarGlobal",
|
||||
_("Value of a global variable"),
|
||||
_("Change the value of a global variable"),
|
||||
_("Change number variable"),
|
||||
_("Modify the number value of a global variable."),
|
||||
_("the global variable _PARAM0_"),
|
||||
_("Global variables"),
|
||||
"res/actions/var24.png",
|
||||
@@ -215,8 +215,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
|
||||
extension
|
||||
.AddAction("ModVarGlobalTxt",
|
||||
_("String of a global variable"),
|
||||
_("Modify the text of a global variable."),
|
||||
_("Change text variable"),
|
||||
_("Modify the text (string) of a global variable."),
|
||||
_("the text of global variable _PARAM0_"),
|
||||
_("Global variables"),
|
||||
"res/actions/var24.png",
|
||||
@@ -229,7 +229,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
extension
|
||||
.AddAction(
|
||||
"SetGlobalVariableAsBoolean",
|
||||
_("Boolean value of a global variable"),
|
||||
_("Change boolean variable"),
|
||||
_("Modify the boolean value of a global variable."),
|
||||
_("Set the boolean value of global variable _PARAM0_ to _PARAM1_"),
|
||||
_("Global variables"),
|
||||
@@ -240,7 +240,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
|
||||
extension
|
||||
.AddAction("ToggleGlobalVariableAsBoolean",
|
||||
_("Toggle boolean value of a global variable"),
|
||||
_("Toggle boolean variable"),
|
||||
_("Toggle the boolean value of a global variable.") + "\n" +
|
||||
_("If it was true, it will become false, and if it was "
|
||||
"false it will become true."),
|
||||
@@ -251,202 +251,324 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
.AddParameter("globalvar", _("Variable"));
|
||||
|
||||
extension
|
||||
.AddAction("VariableRemoveChild",
|
||||
_("Remove a child"),
|
||||
_("Remove a child from a scene variable."),
|
||||
_("Remove child _PARAM1_ from scene variable _PARAM0_"),
|
||||
_("Scene variables/Collections/Structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Variable"))
|
||||
.AddAction(
|
||||
"VariableRemoveChild",
|
||||
_("Remove a child"),
|
||||
_("Remove a child from a scene structure variable."),
|
||||
_("Remove child _PARAM1_ from scene structure variable _PARAM0_"),
|
||||
_("Scene variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Structure variable"))
|
||||
.AddParameter("string", _("Child's name"))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddAction("GlobalVariableRemoveChild",
|
||||
_("Remove a child"),
|
||||
_("Remove a child from a global variable."),
|
||||
_("Remove child _PARAM1_ from global variable _PARAM0_"),
|
||||
_("Global variables/Collections/Structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Variable"))
|
||||
.AddAction(
|
||||
"GlobalVariableRemoveChild",
|
||||
_("Remove a child"),
|
||||
_("Remove a child from a global structure variable."),
|
||||
_("Remove child _PARAM1_ from global structure variable _PARAM0_"),
|
||||
_("Global variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Structure variable"))
|
||||
.AddParameter("string", _("Child's name"))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddAction("VariableClearChildren",
|
||||
_("Clear scene variable"),
|
||||
_("Remove all the children from the scene variable."),
|
||||
_("Clear children"),
|
||||
_("Remove all the children from the scene structure or array "
|
||||
"variable."),
|
||||
_("Clear children from scene variable _PARAM0_"),
|
||||
_("Scene variables/Collections"),
|
||||
_("Scene variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Variable"))
|
||||
.AddParameter("scenevar", _("Structure or array variable"))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddAction("GlobalVariableClearChildren",
|
||||
_("Clear global variable"),
|
||||
_("Remove all the children from the global variable."),
|
||||
_("Clear children"),
|
||||
_("Remove all the children from the global structure or array "
|
||||
"variable."),
|
||||
_("Clear children from global variable _PARAM0_"),
|
||||
_("Global variables/Collections"),
|
||||
_("Global variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Variable"))
|
||||
.AddParameter("globalvar", _("Structure or array variable"))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddAction("SceneVariablePush",
|
||||
_("Append variable to a scene array"),
|
||||
_("Appends a variable at the end of a scene array variable."),
|
||||
_("Append variable _PARAM1_ to array variable _PARAM0_"),
|
||||
_("Scene variables/Collections/Arrays"),
|
||||
_("Add existing variable"),
|
||||
_("Adds an existing variable at the end of a scene array "
|
||||
"variable."),
|
||||
_("Add variable _PARAM1_ to array variable _PARAM0_"),
|
||||
_("Scene variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Array variable"))
|
||||
.AddParameter("scenevar", _("Scene variable with the content to append"))
|
||||
.SetParameterLongDescription(_("The content of the variable will *be copied* and appended at the end of the array."))
|
||||
.AddParameter("scenevar", _("Scene variable with the content to add"))
|
||||
.SetParameterLongDescription(
|
||||
_("The content of the variable will *be copied* and added at the "
|
||||
"end of the array."))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddAction("SceneVariablePushString",
|
||||
_("Append a string to a scene array"),
|
||||
_("Appends a string at the end of a scene array variable."),
|
||||
_("Append string _PARAM1_ to array variable _PARAM0_"),
|
||||
_("Scene variables/Collections/Arrays"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddAction(
|
||||
"SceneVariablePushString",
|
||||
_("Add text variable"),
|
||||
_("Adds a text (string) at the end of a scene array variable."),
|
||||
_("Add text _PARAM1_ to array variable _PARAM0_"),
|
||||
_("Scene variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Array variable"))
|
||||
.AddParameter("string", _("String to append"))
|
||||
.AddParameter("string", _("Text to add"))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddAction("SceneVariablePushNumber",
|
||||
_("Append a number to a scene array"),
|
||||
_("Appends a number at the end of a scene array variable."),
|
||||
_("Append number _PARAM1_ to array variable _PARAM0_"),
|
||||
_("Scene variables/Collections/Arrays"),
|
||||
_("Add number variable"),
|
||||
_("Adds a number at the end of a scene array variable."),
|
||||
_("Add number _PARAM1_ to array variable _PARAM0_"),
|
||||
_("Scene variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Array variable"))
|
||||
.AddParameter("expression", _("Number to append"))
|
||||
.AddParameter("expression", _("Number to add"))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddAction("SceneVariablePushBool",
|
||||
_("Append a boolean to a scene array"),
|
||||
_("Appends a boolean at the end of a scene array variable."),
|
||||
_("Append boolean _PARAM1_ to array variable _PARAM0_"),
|
||||
_("Scene variables/Collections/Arrays"),
|
||||
_("Add boolean variable"),
|
||||
_("Adds a boolean at the end of a scene array variable."),
|
||||
_("Add boolean _PARAM1_ to array variable _PARAM0_"),
|
||||
_("Scene variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Array variable"))
|
||||
.AddParameter("trueorfalse", _("Boolean to append"))
|
||||
.AddParameter("trueorfalse", _("Boolean to add"))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddAction(
|
||||
"SceneVariableRemoveAt",
|
||||
_("Remove variable from a scene array (by index)"),
|
||||
_("Removes a variable at the specified index of a scene array variable."),
|
||||
_("Remove variable at index _PARAM1_ from scene array variable _PARAM0_"),
|
||||
_("Scene variables/Collections/Arrays"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Variable"))
|
||||
.AddAction("SceneVariableRemoveAt",
|
||||
_("Remove variable by index"),
|
||||
_("Removes a variable at the specified index of a scene array "
|
||||
"variable."),
|
||||
_("Remove variable at index _PARAM1_ from scene array "
|
||||
"variable _PARAM0_"),
|
||||
_("Scene variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Array variable"))
|
||||
.AddParameter("expression", _("Index to remove"))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddAction("GlobalVariablePush",
|
||||
_("Append variable to a global array"),
|
||||
_("Appends a variable at the end of a global array variable."),
|
||||
_("Append variable _PARAM1_ to array variable _PARAM0_"),
|
||||
_("Global variables/Collections/Arrays"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Array variable"))
|
||||
.AddParameter("scenevar", _("Scene variable with the content to append"))
|
||||
.SetParameterLongDescription(_("The content of the variable will *be copied* and appended at the end of the array."))
|
||||
.AddCondition(
|
||||
"SceneVariableChildCount",
|
||||
_("Number of children"),
|
||||
_("Compare the number of children in a scene array variable."),
|
||||
_("The number of children in the array variable _PARAM0_"),
|
||||
_("Scene variables/Arrays and structures"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("scenevar", _("Array variable"))
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"number", ParameterOptions::MakeNewOptions())
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddStrExpression(
|
||||
"SceneVariableFirstString",
|
||||
_("First text child"),
|
||||
_("Get the value of the first element of a scene array variable, if "
|
||||
"it is a text (string)."),
|
||||
_("Scene variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Array variable"));
|
||||
|
||||
extension
|
||||
.AddExpression(
|
||||
"SceneVariableFirstNumber",
|
||||
_("First number child"),
|
||||
_("Get the value of the first element of a scene array variable, if "
|
||||
"it is a number."),
|
||||
_("Scene variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Array variable"));
|
||||
|
||||
extension
|
||||
.AddStrExpression(
|
||||
"SceneVariableLastString",
|
||||
_("Last text child"),
|
||||
_("Get the value of the last element of a scene array variable, if "
|
||||
"it is a text (string)."),
|
||||
_("Scene variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Array variable"));
|
||||
|
||||
extension
|
||||
.AddExpression(
|
||||
"SceneVariableLastNumber",
|
||||
_("Last number child"),
|
||||
_("Get the value of the last element of a scene array variable, if "
|
||||
"it is a number."),
|
||||
_("Scene variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Array variable"));
|
||||
|
||||
extension
|
||||
.AddAction(
|
||||
"GlobalVariableRemoveAt",
|
||||
_("Remove variable from a global array (by index)"),
|
||||
_("Removes a variable at the specified index of a global array variable."),
|
||||
_("Remove variable at index _PARAM1_ from global array variable _PARAM0_"),
|
||||
_("Global variables/Collections/Arrays"),
|
||||
"GlobalVariablePush",
|
||||
_("Add existing variable"),
|
||||
_("Adds an existing variable at the end of a global array variable."),
|
||||
_("Add variable _PARAM1_ to array variable _PARAM0_"),
|
||||
_("Global variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Variable"))
|
||||
.AddParameter("globalvar", _("Array variable"))
|
||||
.AddParameter("scenevar", _("Scene variable with the content to add"))
|
||||
.SetParameterLongDescription(
|
||||
_("The content of the variable will *be copied* and added at the "
|
||||
"end of the array."))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddAction("GlobalVariableRemoveAt",
|
||||
_("Remove variable by index"),
|
||||
_("Removes a variable at the specified index of a global "
|
||||
"array variable."),
|
||||
_("Remove variable at index _PARAM1_ from global array "
|
||||
"variable _PARAM0_"),
|
||||
_("Global variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Array variable"))
|
||||
.AddParameter("expression", _("Index to remove"))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddAction("GlobalVariablePushString",
|
||||
_("Append a string to a global array"),
|
||||
_("Appends a string at the end of a global array variable."),
|
||||
_("Append string _PARAM1_ to array variable _PARAM0_"),
|
||||
_("Global variables/Collections/Arrays"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddAction(
|
||||
"GlobalVariablePushString",
|
||||
_("Add text variable"),
|
||||
_("Adds a text (string) at the end of a global array variable."),
|
||||
_("Add text _PARAM1_ to array variable _PARAM0_"),
|
||||
_("Global variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Array variable"))
|
||||
.AddParameter("string", _("String to append"))
|
||||
.AddParameter("string", _("Text to add"))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddAction("GlobalVariablePushNumber",
|
||||
_("Append a number to a global array"),
|
||||
_("Appends a number at the end of a global array variable."),
|
||||
_("Append number _PARAM1_ to array variable _PARAM0_"),
|
||||
_("Global variables/Collections/Arrays"),
|
||||
_("Add number variable"),
|
||||
_("Adds a number at the end of a global array variable."),
|
||||
_("Add number _PARAM1_ to array variable _PARAM0_"),
|
||||
_("Global variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Array variable"))
|
||||
.AddParameter("expression", _("Number to append"))
|
||||
.AddParameter("expression", _("Number to add"))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddAction("GlobalVariablePushBool",
|
||||
_("Append a boolean to a global array"),
|
||||
_("Appends a boolean at the end of a global array variable."),
|
||||
_("Append boolean _PARAM1_ to array variable _PARAM0_"),
|
||||
_("Global variables/Collections/Arrays"),
|
||||
_("Add boolean variable"),
|
||||
_("Adds a boolean at the end of a global array variable."),
|
||||
_("Add boolean _PARAM1_ to array variable _PARAM0_"),
|
||||
_("Global variables/Arrays and structures"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Array variable"))
|
||||
.AddParameter("trueorfalse", _("Boolean to append"))
|
||||
.AddParameter("trueorfalse", _("Boolean to add"))
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddExpression("GlobalVariableChildCount",
|
||||
_("Number of children of a global variable"),
|
||||
_("Number of children of a global variable"),
|
||||
_("Global variables"),
|
||||
.AddCondition(
|
||||
"GlobalVariableChildCount",
|
||||
_("Number of children"),
|
||||
_("Compare the number of children in a global array variable."),
|
||||
_("The number of children of the array variable _PARAM0_"),
|
||||
_("Global variables/Arrays and structures"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
.AddParameter("globalvar", _("Array variable"))
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"number", ParameterOptions::MakeNewOptions())
|
||||
.MarkAsAdvanced();
|
||||
|
||||
extension
|
||||
.AddStrExpression("GlobalVariableFirstString",
|
||||
_("First text child"),
|
||||
_("Value of the first element of a global array "
|
||||
"variable, if it is a text (string) variable."),
|
||||
_("Global variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Array variable"));
|
||||
|
||||
extension
|
||||
.AddExpression("GlobalVariableFirstNumber",
|
||||
_("First number child"),
|
||||
_("Value of the first element of a global array "
|
||||
"variable, if it is a number variable"),
|
||||
_("Global variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Variable"));
|
||||
.AddParameter("globalvar", _("Array variable"));
|
||||
|
||||
extension
|
||||
.AddStrExpression(
|
||||
"GlobalVariableLastString",
|
||||
_("Last text child"),
|
||||
_("Value of the last element of a global array variable, if "
|
||||
"it is a text (string) variable."),
|
||||
_("Global variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Array variable"));
|
||||
|
||||
extension
|
||||
.AddExpression(
|
||||
"GlobalVariableLastNumber",
|
||||
_("Last number child"),
|
||||
_("Value of the last element of a global array variable, if "
|
||||
"it is a number variable"),
|
||||
_("Global variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Array variable"));
|
||||
|
||||
extension
|
||||
.AddExpression("GlobalVariableChildCount",
|
||||
_("Number of children"),
|
||||
_("Number of children in a global array or "
|
||||
"structure variable"),
|
||||
_("Global variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Array or structure variable"));
|
||||
|
||||
extension
|
||||
.AddExpression("VariableChildCount",
|
||||
_("Number of children of a scene variable"),
|
||||
_("Number of children of a scene variable"),
|
||||
_("Scene variables"),
|
||||
_("Number of children"),
|
||||
_("Number of children in a scene array or "
|
||||
"structure variable"),
|
||||
_("Scene variables/Arrays and structures"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Variable"));
|
||||
.AddParameter("scenevar", _("Array or structure variable"));
|
||||
|
||||
extension
|
||||
.AddExpression("Variable",
|
||||
_("Value of a scene variable"),
|
||||
_("Value of a scene variable"),
|
||||
_("Number variable"),
|
||||
_("Number value of a scene variable"),
|
||||
_("Scene variables"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("scenevar", _("Variable"));
|
||||
|
||||
extension
|
||||
.AddStrExpression("VariableString",
|
||||
_("Text of a scene variable"),
|
||||
_("Text variable"),
|
||||
_("Text of a scene variable"),
|
||||
_("Scene variables"),
|
||||
"res/actions/var.png")
|
||||
@@ -454,15 +576,15 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
|
||||
|
||||
extension
|
||||
.AddExpression("GlobalVariable",
|
||||
_("Value of a global variable"),
|
||||
_("Value of a global variable"),
|
||||
_("Number variable"),
|
||||
_("Number value of a global variable"),
|
||||
_("Global variables"),
|
||||
"res/actions/var.png")
|
||||
.AddParameter("globalvar", _("Name of the global variable"));
|
||||
|
||||
extension
|
||||
.AddStrExpression("GlobalVariableString",
|
||||
_("Text of a global variable"),
|
||||
_("Text variable"),
|
||||
_("Text of a global variable"),
|
||||
_("Global variables"),
|
||||
"res/actions/var.png")
|
||||
|
@@ -23,7 +23,8 @@ ExpressionMetadata::ExpressionMetadata(const gd::String& returnType_,
|
||||
shown(true),
|
||||
smallIconFilename(smallicon_),
|
||||
extensionNamespace(extensionNamespace_),
|
||||
isPrivate(false) {
|
||||
isPrivate(false),
|
||||
relevantContext("Any") {
|
||||
}
|
||||
|
||||
ExpressionMetadata& ExpressionMetadata::SetHidden() {
|
||||
|
@@ -137,7 +137,7 @@ class GD_CORE_API ExpressionMetadata {
|
||||
* to fulfill std::map requirements.
|
||||
*/
|
||||
ExpressionMetadata()
|
||||
: returnType("unknown"), shown(false), isPrivate(false){};
|
||||
: returnType("unknown"), shown(false), isPrivate(false), relevantContext("Any"){};
|
||||
|
||||
virtual ~ExpressionMetadata(){};
|
||||
|
||||
@@ -184,6 +184,67 @@ class GD_CORE_API ExpressionMetadata {
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the instruction can be used in layouts or external events.
|
||||
*/
|
||||
bool IsRelevantForLayoutEvents() const {
|
||||
return relevantContext == "Any" || relevantContext == "Layout";
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the instruction can be used in function events.
|
||||
*/
|
||||
bool IsRelevantForFunctionEvents() const {
|
||||
return relevantContext == "Any" || relevantContext == "Function";
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the instruction can be used in asynchronous function events.
|
||||
*/
|
||||
bool IsRelevantForAsynchronousFunctionEvents() const {
|
||||
return relevantContext == "Any" || relevantContext == "Function" ||
|
||||
relevantContext == "AsynchronousFunction";
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the instruction can be used in custom object events.
|
||||
*/
|
||||
bool IsRelevantForCustomObjectEvents() const {
|
||||
return relevantContext == "Any" || relevantContext == "Object";
|
||||
}
|
||||
|
||||
/**
|
||||
* Set that the instruction can be used in layouts or external events.
|
||||
*/
|
||||
ExpressionMetadata &SetRelevantForLayoutEventsOnly() {
|
||||
relevantContext = "Layout";
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set that the instruction can be used in function events.
|
||||
*/
|
||||
ExpressionMetadata &SetRelevantForFunctionEventsOnly() {
|
||||
relevantContext = "Function";
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set that the instruction can be used in asynchronous function events.
|
||||
*/
|
||||
ExpressionMetadata &SetRelevantForAsynchronousFunctionEventsOnly() {
|
||||
relevantContext = "AsynchronousFunction";
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set that the instruction can be used in custom object events.
|
||||
*/
|
||||
ExpressionMetadata &SetRelevantForCustomObjectEventsOnly() {
|
||||
relevantContext = "Object";
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \see gd::InstructionMetadata::AddParameter
|
||||
*/
|
||||
@@ -326,6 +387,7 @@ class GD_CORE_API ExpressionMetadata {
|
||||
gd::String extensionNamespace;
|
||||
bool isPrivate;
|
||||
gd::String requiredBaseObjectCapability;
|
||||
gd::String relevantContext;
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
|
@@ -47,7 +47,8 @@ InstructionMetadata::InstructionMetadata(const gd::String& extensionNamespace_,
|
||||
usageComplexity(5),
|
||||
isPrivate(false),
|
||||
isObjectInstruction(false),
|
||||
isBehaviorInstruction(false) {}
|
||||
isBehaviorInstruction(false),
|
||||
relevantContext("Any") {}
|
||||
|
||||
InstructionMetadata& InstructionMetadata::AddParameter(
|
||||
const gd::String& type,
|
||||
|
@@ -101,6 +101,67 @@ class GD_CORE_API InstructionMetadata {
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the instruction can be used in layouts or external events.
|
||||
*/
|
||||
bool IsRelevantForLayoutEvents() const {
|
||||
return relevantContext == "Any" || relevantContext == "Layout";
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the instruction can be used in function events.
|
||||
*/
|
||||
bool IsRelevantForFunctionEvents() const {
|
||||
return relevantContext == "Any" || relevantContext == "Function";
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the instruction can be used in asynchronous function events.
|
||||
*/
|
||||
bool IsRelevantForAsynchronousFunctionEvents() const {
|
||||
return relevantContext == "Any" || relevantContext == "Function" ||
|
||||
relevantContext == "AsynchronousFunction";
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the instruction can be used in custom object events.
|
||||
*/
|
||||
bool IsRelevantForCustomObjectEvents() const {
|
||||
return relevantContext == "Any" || relevantContext == "Object";
|
||||
}
|
||||
|
||||
/**
|
||||
* Set that the instruction can be used in layouts or external events.
|
||||
*/
|
||||
InstructionMetadata &SetRelevantForLayoutEventsOnly() {
|
||||
relevantContext = "Layout";
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set that the instruction can be used in function events.
|
||||
*/
|
||||
InstructionMetadata &SetRelevantForFunctionEventsOnly() {
|
||||
relevantContext = "Function";
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set that the instruction can be used in asynchronous function events.
|
||||
*/
|
||||
InstructionMetadata &SetRelevantForAsynchronousFunctionEventsOnly() {
|
||||
relevantContext = "AsynchronousFunction";
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set that the instruction can be used in custom object events.
|
||||
*/
|
||||
InstructionMetadata &SetRelevantForCustomObjectEventsOnly() {
|
||||
relevantContext = "Object";
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the instruction is asynchronous - it will be running in the
|
||||
* background, executing the instructions following it before the frame after
|
||||
@@ -539,6 +600,7 @@ class GD_CORE_API InstructionMetadata {
|
||||
bool isObjectInstruction;
|
||||
bool isBehaviorInstruction;
|
||||
gd::String requiredBaseObjectCapability;
|
||||
gd::String relevantContext;
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
|
@@ -46,7 +46,7 @@ class GD_CORE_API ObjectMetadata {
|
||||
std::shared_ptr<gd::ObjectConfiguration> blueprintObject_);
|
||||
/**
|
||||
* \brief Construct an object metadata, without "blueprint" object
|
||||
*
|
||||
*
|
||||
* \note This is used by events based objects.
|
||||
*/
|
||||
ObjectMetadata(const gd::String& extensionNamespace_,
|
||||
@@ -295,6 +295,22 @@ class GD_CORE_API ObjectMetadata {
|
||||
*/
|
||||
std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressions() { return strExpressionsInfos; };
|
||||
|
||||
/**
|
||||
* \brief Set the object to be hidden in the IDE.
|
||||
*
|
||||
* Used mainly when an object is deprecated.
|
||||
*/
|
||||
ObjectMetadata &SetHidden() {
|
||||
hidden = true;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* \brief Return true if the instruction must be hidden in the IDE.
|
||||
*/
|
||||
bool IsHidden() const { return hidden; }
|
||||
|
||||
std::map<gd::String, gd::InstructionMetadata> conditionsInfos;
|
||||
std::map<gd::String, gd::InstructionMetadata> actionsInfos;
|
||||
std::map<gd::String, gd::ExpressionMetadata> expressionsInfos;
|
||||
@@ -314,6 +330,7 @@ class GD_CORE_API ObjectMetadata {
|
||||
gd::String iconFilename;
|
||||
gd::String categoryFullName;
|
||||
std::set<gd::String> unsupportedBaseObjectCapabilities;
|
||||
bool hidden = false;
|
||||
|
||||
std::shared_ptr<gd::ObjectConfiguration>
|
||||
blueprintObject; ///< The "blueprint" object to be copied when a new
|
||||
|
49
Core/GDCore/IDE/EventBasedBehaviorBrowser.cpp
Normal file
49
Core/GDCore/IDE/EventBasedBehaviorBrowser.cpp
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#include "EventBasedBehaviorBrowser.h"
|
||||
|
||||
#include "GDCore/IDE/Events/ArbitraryEventsWorker.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryEventBasedBehaviorsWorker.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryEventsFunctionsWorker.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryObjectsWorker.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryBehaviorSharedDataWorker.h"
|
||||
#include "GDCore/IDE/ProjectBrowserHelper.h"
|
||||
#include "GDCore/Project/EventsBasedBehavior.h"
|
||||
#include "GDCore/Project/Project.h"
|
||||
#include "GDCore/String.h"
|
||||
|
||||
namespace gd {
|
||||
|
||||
void EventBasedBehaviorBrowser::ExposeEvents(
|
||||
gd::Project &project, gd::ArbitraryEventsWorker &worker) const {
|
||||
gd::ProjectBrowserHelper::ExposeEventsBasedBehaviorEvents(
|
||||
project, eventsBasedBehavior, worker);
|
||||
}
|
||||
|
||||
void EventBasedBehaviorBrowser::ExposeEvents(
|
||||
gd::Project &project, gd::ArbitraryEventsWorkerWithContext &worker) const {
|
||||
gd::ProjectBrowserHelper::ExposeEventsBasedBehaviorEvents(
|
||||
project, eventsBasedBehavior, worker);
|
||||
}
|
||||
|
||||
void EventBasedBehaviorBrowser::ExposeObjects(
|
||||
gd::Project &project, gd::ArbitraryObjectsWorker &worker) const {}
|
||||
|
||||
void EventBasedBehaviorBrowser::ExposeFunctions(
|
||||
gd::Project &project, gd::ArbitraryEventsFunctionsWorker &worker) const {
|
||||
worker.Launch(eventsBasedBehavior.GetEventsFunctions());
|
||||
}
|
||||
|
||||
void EventBasedBehaviorBrowser::ExposeEventBasedBehaviors(
|
||||
gd::Project &project,
|
||||
gd::ArbitraryEventBasedBehaviorsWorker &worker) const {
|
||||
worker.Launch(eventsBasedBehavior);
|
||||
}
|
||||
|
||||
void EventBasedBehaviorBrowser::ExposeBehaviorSharedDatas(
|
||||
gd::Project &project, gd::ArbitraryBehaviorSharedDataWorker &worker) const {}
|
||||
|
||||
} // namespace gd
|
86
Core/GDCore/IDE/EventBasedBehaviorBrowser.h
Normal file
86
Core/GDCore/IDE/EventBasedBehaviorBrowser.h
Normal file
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "GDCore/IDE/ProjectBrowser.h"
|
||||
|
||||
namespace gd {
|
||||
class Project;
|
||||
class String;
|
||||
class EventsFunctionsExtension;
|
||||
class EventsFunction;
|
||||
class EventsBasedBehavior;
|
||||
class EventsBasedObject;
|
||||
class ArbitraryEventsWorker;
|
||||
class ArbitraryEventsWorkerWithContext;
|
||||
class ArbitraryEventsFunctionsWorker;
|
||||
class ArbitraryObjectsWorker;
|
||||
class ArbitraryEventBasedBehaviorsWorker;
|
||||
class ArbitraryBehaviorSharedDataWorker;
|
||||
} // namespace gd
|
||||
|
||||
namespace gd {
|
||||
|
||||
/**
|
||||
* \brief Expose event-based behavior contents to workers.
|
||||
*/
|
||||
class GD_CORE_API EventBasedBehaviorBrowser : public ProjectBrowser {
|
||||
public:
|
||||
EventBasedBehaviorBrowser(gd::EventsBasedBehavior &eventsBasedBehavior_)
|
||||
: eventsBasedBehavior(eventsBasedBehavior_) {}
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all events of the event-based
|
||||
* behavior.
|
||||
*
|
||||
* This should be the preferred way to traverse all the events of an event-based behavior.
|
||||
*/
|
||||
void ExposeEvents(gd::Project &project,
|
||||
gd::ArbitraryEventsWorker &worker) const override;
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all events of the event-based
|
||||
* behavior.
|
||||
*
|
||||
* This should be the preferred way to traverse all the events of an event-based behavior.
|
||||
*/
|
||||
void
|
||||
ExposeEvents(gd::Project &project,
|
||||
gd::ArbitraryEventsWorkerWithContext &worker) const override;
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all functions of the event-based behavior
|
||||
*
|
||||
* This should be the preferred way to traverse all the function signatures
|
||||
* of an event-based behavior.
|
||||
*/
|
||||
void ExposeFunctions(gd::Project &project,
|
||||
gd::ArbitraryEventsFunctionsWorker &worker) const override;
|
||||
|
||||
/**
|
||||
* \brief Do nothing.
|
||||
*/
|
||||
void ExposeObjects(gd::Project &project,
|
||||
gd::ArbitraryObjectsWorker &worker) const override;
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on the event-based behavior.
|
||||
*/
|
||||
void ExposeEventBasedBehaviors(
|
||||
gd::Project &project,
|
||||
gd::ArbitraryEventBasedBehaviorsWorker &worker) const override;
|
||||
|
||||
/**
|
||||
* \brief Do nothing.
|
||||
*/
|
||||
void ExposeBehaviorSharedDatas(gd::Project &project,
|
||||
gd::ArbitraryBehaviorSharedDataWorker &worker) const override;
|
||||
|
||||
private:
|
||||
gd::EventsBasedBehavior &eventsBasedBehavior;
|
||||
};
|
||||
|
||||
} // namespace gd
|
@@ -8,13 +8,10 @@
|
||||
#define GDCORE_BEHAVIORTYPERENAMER_H
|
||||
#include <set>
|
||||
|
||||
#include "GDCore/Events/Parsers/ExpressionParser2NodeWorker.h"
|
||||
#include "GDCore/IDE/Events/ArbitraryEventsWorker.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryObjectsWorker.h"
|
||||
#include "GDCore/String.h"
|
||||
|
||||
namespace gd {
|
||||
class Project;
|
||||
class Object;
|
||||
class Behavior;
|
||||
} // namespace gd
|
||||
@@ -23,17 +20,15 @@ namespace gd {
|
||||
|
||||
class GD_CORE_API BehaviorTypeRenamer : public ArbitraryObjectsWorker {
|
||||
public:
|
||||
BehaviorTypeRenamer(const gd::Project& project_,
|
||||
const gd::String& oldType_,
|
||||
const gd::String& newType_)
|
||||
: project(project_), oldType(oldType_), newType(newType_){};
|
||||
BehaviorTypeRenamer(const gd::String& oldType_,
|
||||
const gd::String& newType_)
|
||||
: oldType(oldType_), newType(newType_){};
|
||||
virtual ~BehaviorTypeRenamer();
|
||||
|
||||
private:
|
||||
void DoVisitObject(gd::Object& object) override;
|
||||
void DoVisitBehavior(gd::Behavior& behavior) override;
|
||||
|
||||
const gd::Project& project;
|
||||
gd::String oldType;
|
||||
gd::String newType;
|
||||
};
|
||||
|
@@ -8,13 +8,10 @@
|
||||
#define GDCORE_CUSTOMOBJECTTYPERENAMER_H
|
||||
#include <set>
|
||||
|
||||
#include "GDCore/Events/Parsers/ExpressionParser2NodeWorker.h"
|
||||
#include "GDCore/IDE/Events/ArbitraryEventsWorker.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryObjectsWorker.h"
|
||||
#include "GDCore/String.h"
|
||||
|
||||
namespace gd {
|
||||
class Project;
|
||||
class Object;
|
||||
class Behavior;
|
||||
} // namespace gd
|
||||
@@ -23,17 +20,15 @@ namespace gd {
|
||||
|
||||
class GD_CORE_API CustomObjectTypeRenamer : public ArbitraryObjectsWorker {
|
||||
public:
|
||||
CustomObjectTypeRenamer(const gd::Project& project_,
|
||||
const gd::String& oldType_,
|
||||
CustomObjectTypeRenamer(const gd::String& oldType_,
|
||||
const gd::String& newType_)
|
||||
: project(project_), oldType(oldType_), newType(newType_){};
|
||||
: oldType(oldType_), newType(newType_){};
|
||||
virtual ~CustomObjectTypeRenamer();
|
||||
|
||||
private:
|
||||
void DoVisitObject(gd::Object& object) override;
|
||||
void DoVisitBehavior(gd::Behavior& behavior) override;
|
||||
|
||||
const gd::Project& project;
|
||||
gd::String oldType;
|
||||
gd::String newType;
|
||||
};
|
||||
|
@@ -202,7 +202,7 @@ std::set<gd::String> EventsIdentifiersFinder::FindAllIdentifierExpressions(
|
||||
std::set<gd::String> results;
|
||||
|
||||
const bool isObjectIdentifier = identifierType.find("object") == 0;
|
||||
// The object from the context is only relevent for object identifiers.
|
||||
// The object from the context is only relevant for object identifiers.
|
||||
auto& actualObjectName = isObjectIdentifier ? contextObjectName : "";
|
||||
|
||||
FindArgumentsInEventsAndDependencies(
|
||||
|
@@ -22,7 +22,7 @@ class EventsList;
|
||||
namespace gd {
|
||||
|
||||
/**
|
||||
* \brief List the values of the parameters of events and their type.
|
||||
* \brief Allow to safely remove a bunch of events.
|
||||
*
|
||||
* \ingroup IDE
|
||||
*/
|
||||
|
24
Core/GDCore/IDE/Events/InstructionsCountEvaluator.cpp
Normal file
24
Core/GDCore/IDE/Events/InstructionsCountEvaluator.cpp
Normal file
@@ -0,0 +1,24 @@
|
||||
#include "InstructionsCountEvaluator.h"
|
||||
|
||||
#include "GDCore/Events/Instruction.h"
|
||||
#include "GDCore/Extensions/PlatformExtension.h"
|
||||
#include "GDCore/IDE/ProjectBrowserHelper.h"
|
||||
|
||||
namespace gd {
|
||||
|
||||
const int InstructionsCountEvaluator::ScanProject(gd::Project &project) {
|
||||
InstructionsCountEvaluator worker(project);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEventsWithoutExtensions(project,
|
||||
worker);
|
||||
return worker.instructionCount;
|
||||
};
|
||||
|
||||
// Instructions scanner
|
||||
|
||||
bool InstructionsCountEvaluator::DoVisitInstruction(
|
||||
gd::Instruction &instruction, bool isCondition) {
|
||||
instructionCount++;
|
||||
return false;
|
||||
}
|
||||
|
||||
} // namespace gd
|
50
Core/GDCore/IDE/Events/InstructionsCountEvaluator.h
Normal file
50
Core/GDCore/IDE/Events/InstructionsCountEvaluator.h
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
|
||||
#ifndef GDCORE_INSTRUCTIONS_COUNT_EVALUATOR_H
|
||||
#define GDCORE_INSTRUCTIONS_COUNT_EVALUATOR_H
|
||||
#include <set>
|
||||
|
||||
#include "GDCore/Events/Parsers/ExpressionParser2NodeWorker.h"
|
||||
#include "GDCore/IDE/Events/ArbitraryEventsWorker.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryObjectsWorker.h"
|
||||
#include "GDCore/String.h"
|
||||
|
||||
namespace gd {
|
||||
class Project;
|
||||
class Object;
|
||||
class Behavior;
|
||||
} // namespace gd
|
||||
|
||||
namespace gd {
|
||||
|
||||
/**
|
||||
* @brief Count the number of instructions in a project excluding extensions.
|
||||
*
|
||||
* This is used by the examples repository to evaluate examples size.
|
||||
*
|
||||
*/
|
||||
class GD_CORE_API InstructionsCountEvaluator : public ArbitraryEventsWorker {
|
||||
public:
|
||||
/**
|
||||
* Return the number of instructions in the project excluding extensions.
|
||||
*/
|
||||
static const int ScanProject(gd::Project &project);
|
||||
|
||||
private:
|
||||
InstructionsCountEvaluator(gd::Project &project_)
|
||||
: project(project_), instructionCount(0){};
|
||||
gd::Project &project;
|
||||
int instructionCount;
|
||||
|
||||
// Instructions Visitor
|
||||
bool DoVisitInstruction(gd::Instruction &instruction,
|
||||
bool isCondition) override;
|
||||
};
|
||||
|
||||
}; // namespace gd
|
||||
|
||||
#endif
|
@@ -4,6 +4,7 @@
|
||||
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
|
||||
#include "GDCore/Extensions/Metadata/ParameterMetadataTools.h"
|
||||
#include "GDCore/Extensions/PlatformExtension.h"
|
||||
#include "GDCore/IDE/ProjectBrowserHelper.h"
|
||||
#include "GDCore/IDE/WholeProjectRefactorer.h"
|
||||
#include "GDCore/IDE/Events/ExpressionTypeFinder.h"
|
||||
#include "GDCore/Project/Behavior.h"
|
||||
@@ -14,8 +15,8 @@ namespace gd {
|
||||
|
||||
const UsedExtensionsResult UsedExtensionsFinder::ScanProject(gd::Project& project) {
|
||||
UsedExtensionsFinder worker(project);
|
||||
gd::WholeProjectRefactorer::ExposeProjectObjects(project, worker);
|
||||
gd::WholeProjectRefactorer::ExposeProjectEvents(project, worker);
|
||||
gd::ProjectBrowserHelper::ExposeProjectObjects(project, worker);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, worker);
|
||||
return worker.result;
|
||||
};
|
||||
|
||||
|
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#include "ArbitraryBehaviorSharedDataWorker.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include "GDCore/Project/BehaviorsSharedData.h"
|
||||
#include "GDCore/String.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace gd {
|
||||
|
||||
ArbitraryBehaviorSharedDataWorker::~ArbitraryBehaviorSharedDataWorker() {}
|
||||
|
||||
void ArbitraryBehaviorSharedDataWorker::VisitSharedDatas(
|
||||
const std::map<gd::String, std::unique_ptr<gd::BehaviorsSharedData>>
|
||||
&sharedDatas) {
|
||||
DoVisitSharedDatas(sharedDatas);
|
||||
|
||||
for (auto &behaviorSharedDataContent : sharedDatas) {
|
||||
VisitSharedData(*behaviorSharedDataContent.second);
|
||||
}
|
||||
}
|
||||
|
||||
void ArbitraryBehaviorSharedDataWorker::VisitSharedData(
|
||||
gd::BehaviorsSharedData &sharedData) {
|
||||
DoVisitSharedData(sharedData);
|
||||
}
|
||||
|
||||
} // namespace gd
|
55
Core/GDCore/IDE/Project/ArbitraryBehaviorSharedDataWorker.h
Normal file
55
Core/GDCore/IDE/Project/ArbitraryBehaviorSharedDataWorker.h
Normal file
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include "GDCore/String.h"
|
||||
#include "GDCore/Tools/SerializableWithNameList.h"
|
||||
|
||||
namespace gd {
|
||||
class BehaviorsSharedData;
|
||||
} // namespace gd
|
||||
|
||||
namespace gd {
|
||||
|
||||
/**
|
||||
* \brief ArbitraryBehaviorSharedDataWorker is an abstract class used to browse
|
||||
* shared data and do some work on them. It can be used to implement
|
||||
* refactoring for example.
|
||||
*
|
||||
* \ingroup IDE
|
||||
*/
|
||||
class GD_CORE_API ArbitraryBehaviorSharedDataWorker {
|
||||
public:
|
||||
ArbitraryBehaviorSharedDataWorker(){};
|
||||
virtual ~ArbitraryBehaviorSharedDataWorker();
|
||||
|
||||
/**
|
||||
* \brief Launch the worker on the specified shared data.
|
||||
*/
|
||||
void Launch(const std::map<gd::String, std::unique_ptr<gd::BehaviorsSharedData>>& sharedDatas) { VisitSharedDatas(sharedDatas); };
|
||||
|
||||
private:
|
||||
void VisitSharedDatas(const std::map<gd::String, std::unique_ptr<gd::BehaviorsSharedData>>& sharedDatas);
|
||||
void VisitSharedData(gd::BehaviorsSharedData& behavior);
|
||||
|
||||
/**
|
||||
* Called to do some work on shared data.
|
||||
*/
|
||||
virtual void DoVisitSharedDatas(const std::map<gd::String, std::unique_ptr<gd::BehaviorsSharedData>>& sharedDatas){};
|
||||
|
||||
/**
|
||||
* Called to do some work on a shared data.
|
||||
*/
|
||||
virtual void DoVisitSharedData(gd::BehaviorsSharedData& sharedData){};
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
|
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#include "ArbitraryEventBasedBehaviorsWorker.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include "GDCore/Project/EventsBasedBehavior.h"
|
||||
#include "GDCore/String.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace gd {
|
||||
|
||||
ArbitraryEventBasedBehaviorsWorker::~ArbitraryEventBasedBehaviorsWorker() {}
|
||||
|
||||
void ArbitraryEventBasedBehaviorsWorker::VisitEventBasedBehaviors(gd::SerializableWithNameList<gd::EventsBasedBehavior>& behaviors) {
|
||||
DoVisitEventBasedBehaviors(behaviors);
|
||||
|
||||
for (auto&& eventsBasedBehavior : behaviors.GetInternalVector()) {
|
||||
VisitEventBasedBehavior(*eventsBasedBehavior);
|
||||
}
|
||||
}
|
||||
|
||||
void ArbitraryEventBasedBehaviorsWorker::VisitEventBasedBehavior(gd::EventsBasedBehavior& behavior) {
|
||||
DoVisitEventBasedBehavior(behavior);
|
||||
}
|
||||
|
||||
} // namespace gd
|
59
Core/GDCore/IDE/Project/ArbitraryEventBasedBehaviorsWorker.h
Normal file
59
Core/GDCore/IDE/Project/ArbitraryEventBasedBehaviorsWorker.h
Normal file
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include "GDCore/String.h"
|
||||
#include "GDCore/Tools/SerializableWithNameList.h"
|
||||
|
||||
namespace gd {
|
||||
class EventsBasedBehavior;
|
||||
} // namespace gd
|
||||
|
||||
namespace gd {
|
||||
|
||||
/**
|
||||
* \brief ArbitraryEventsFunctionsWorker is an abstract class used to browse
|
||||
* event-based behaviors and do some work on them. It can be used to implement
|
||||
* refactoring for example.
|
||||
*
|
||||
* \ingroup IDE
|
||||
*/
|
||||
class GD_CORE_API ArbitraryEventBasedBehaviorsWorker {
|
||||
public:
|
||||
ArbitraryEventBasedBehaviorsWorker(){};
|
||||
virtual ~ArbitraryEventBasedBehaviorsWorker();
|
||||
|
||||
/**
|
||||
* \brief Launch the worker on the specified event-based behaviors.
|
||||
*/
|
||||
void Launch(gd::SerializableWithNameList<gd::EventsBasedBehavior>& behaviors) { VisitEventBasedBehaviors(behaviors); };
|
||||
|
||||
/**
|
||||
* \brief Launch the worker on the specified event-based behavior.
|
||||
*/
|
||||
void Launch(EventsBasedBehavior& behavior) { VisitEventBasedBehavior(behavior); };
|
||||
|
||||
private:
|
||||
void VisitEventBasedBehaviors(gd::SerializableWithNameList<gd::EventsBasedBehavior>& behaviors);
|
||||
void VisitEventBasedBehavior(gd::EventsBasedBehavior& behavior);
|
||||
|
||||
/**
|
||||
* Called to do some work on event-based behaviors.
|
||||
*/
|
||||
virtual void DoVisitEventBasedBehaviors(gd::SerializableWithNameList<gd::EventsBasedBehavior>& behaviors){};
|
||||
|
||||
/**
|
||||
* Called to do some work on an event-based behavior.
|
||||
*/
|
||||
virtual void DoVisitEventBasedBehavior(gd::EventsBasedBehavior& behavior){};
|
||||
};
|
||||
|
||||
} // namespace gd
|
37
Core/GDCore/IDE/Project/ArbitraryEventsFunctionsWorker.cpp
Normal file
37
Core/GDCore/IDE/Project/ArbitraryEventsFunctionsWorker.cpp
Normal file
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#include "ArbitraryEventsFunctionsWorker.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include "GDCore/Project/EventsFunction.h"
|
||||
#include "GDCore/Project/EventsFunctionsContainer.h"
|
||||
#include "GDCore/Extensions/Metadata/ParameterMetadata.h"
|
||||
#include "GDCore/String.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace gd {
|
||||
|
||||
ArbitraryEventsFunctionsWorker::~ArbitraryEventsFunctionsWorker() {}
|
||||
|
||||
void ArbitraryEventsFunctionsWorker::VisitEventsFunctionContainer(
|
||||
gd::EventsFunctionsContainer& functions) {
|
||||
DoVisitEventsFunctionsContainer(functions);
|
||||
|
||||
for (auto&& function : functions.GetInternalVector()) {
|
||||
VisitEventsFunction(*function);
|
||||
}
|
||||
}
|
||||
|
||||
void ArbitraryEventsFunctionsWorker::VisitEventsFunction(gd::EventsFunction& eventsFunction) {
|
||||
DoVisitEventsFunction(eventsFunction);
|
||||
}
|
||||
|
||||
} // namespace gd
|
55
Core/GDCore/IDE/Project/ArbitraryEventsFunctionsWorker.h
Normal file
55
Core/GDCore/IDE/Project/ArbitraryEventsFunctionsWorker.h
Normal file
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include "GDCore/String.h"
|
||||
|
||||
namespace gd {
|
||||
class EventsFunction;
|
||||
class EventsFunctionsContainer;
|
||||
class ParameterMetadata;
|
||||
} // namespace gd
|
||||
|
||||
namespace gd {
|
||||
|
||||
/**
|
||||
* \brief ArbitraryEventsFunctionsWorker is an abstract class used to browse
|
||||
* functions signatures and do some work on them. It can be used to implement
|
||||
* refactoring for example.
|
||||
*
|
||||
* \ingroup IDE
|
||||
*/
|
||||
class GD_CORE_API ArbitraryEventsFunctionsWorker {
|
||||
public:
|
||||
ArbitraryEventsFunctionsWorker(){};
|
||||
virtual ~ArbitraryEventsFunctionsWorker();
|
||||
|
||||
/**
|
||||
* \brief Launch the worker on the specified function container.
|
||||
*/
|
||||
void Launch(gd::EventsFunctionsContainer& functions) { VisitEventsFunctionContainer(functions); };
|
||||
|
||||
private:
|
||||
void VisitEventsFunctionContainer(gd::EventsFunctionsContainer& functions);
|
||||
void VisitEventsFunction(gd::EventsFunction& eventsFunction);
|
||||
|
||||
/**
|
||||
* Called to do some work on an function container.
|
||||
*/
|
||||
virtual void DoVisitEventsFunctionsContainer(gd::EventsFunctionsContainer& functions){};
|
||||
|
||||
/**
|
||||
* Called to do some work on a function.
|
||||
*/
|
||||
virtual void DoVisitEventsFunction(gd::EventsFunction& eventsFunction){};
|
||||
};
|
||||
|
||||
} // namespace gd
|
@@ -33,7 +33,7 @@ class GD_CORE_API ArbitraryObjectsWorker {
|
||||
virtual ~ArbitraryObjectsWorker();
|
||||
|
||||
/**
|
||||
* \brief Launch the worker on the specified events list.
|
||||
* \brief Launch the worker on the specified object container.
|
||||
*/
|
||||
void Launch(gd::ObjectsContainer& objects) { VisitObjectContainer(objects); };
|
||||
|
||||
|
25
Core/GDCore/IDE/Project/BehaviorObjectTypeRenamer.cpp
Normal file
25
Core/GDCore/IDE/Project/BehaviorObjectTypeRenamer.cpp
Normal file
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#include "BehaviorObjectTypeRenamer.h"
|
||||
|
||||
#include "GDCore/Project/EventsBasedBehavior.h"
|
||||
#include "GDCore/String.h"
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
namespace gd {
|
||||
|
||||
void BehaviorObjectTypeRenamer::DoVisitEventBasedBehavior(
|
||||
gd::EventsBasedBehavior &eventsBasedBehavior) {
|
||||
if (eventsBasedBehavior.GetObjectType() == oldObjectType) {
|
||||
eventsBasedBehavior.SetObjectType(newObjectType);
|
||||
}
|
||||
}
|
||||
|
||||
BehaviorObjectTypeRenamer::~BehaviorObjectTypeRenamer() {}
|
||||
|
||||
} // namespace gd
|
45
Core/GDCore/IDE/Project/BehaviorObjectTypeRenamer.h
Normal file
45
Core/GDCore/IDE/Project/BehaviorObjectTypeRenamer.h
Normal file
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#ifndef GDCORE_BEHAVIOROBJECTTYPERENAMER_H
|
||||
#define GDCORE_BEHAVIOROBJECTTYPERENAMER_H
|
||||
|
||||
#include "GDCore/IDE/Project/ArbitraryEventBasedBehaviorsWorker.h"
|
||||
|
||||
#include "GDCore/String.h"
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
namespace gd {
|
||||
class BaseEvent;
|
||||
class Project;
|
||||
class EventsList;
|
||||
} // namespace gd
|
||||
|
||||
namespace gd {
|
||||
|
||||
/**
|
||||
* \brief Rename the object type in event-based behaviors.
|
||||
*
|
||||
* \ingroup IDE
|
||||
*/
|
||||
class GD_CORE_API BehaviorObjectTypeRenamer
|
||||
: public ArbitraryEventBasedBehaviorsWorker {
|
||||
public:
|
||||
BehaviorObjectTypeRenamer(const gd::String &oldObjectType_,
|
||||
const gd::String &newObjectType_)
|
||||
: oldObjectType(oldObjectType_), newObjectType(newObjectType_){};
|
||||
virtual ~BehaviorObjectTypeRenamer();
|
||||
|
||||
private:
|
||||
void DoVisitEventBasedBehavior(gd::EventsBasedBehavior &behavior) override;
|
||||
|
||||
gd::String oldObjectType;
|
||||
gd::String newObjectType;
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
|
||||
#endif // GDCORE_BEHAVIOROBJECTTYPERENAMER_H
|
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#include "GDCore/IDE/Project/BehaviorsSharedDataBehaviorTypeRenamer.h"
|
||||
#include "GDCore/Project/BehaviorsSharedData.h"
|
||||
#include "GDCore/String.h"
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
namespace gd {
|
||||
|
||||
void BehaviorsSharedDataBehaviorTypeRenamer::DoVisitSharedData(
|
||||
gd::BehaviorsSharedData &sharedData) {
|
||||
if (sharedData.GetTypeName() == oldBehaviorType) {
|
||||
sharedData.SetTypeName(newBehaviorType);
|
||||
}
|
||||
}
|
||||
|
||||
BehaviorsSharedDataBehaviorTypeRenamer::~BehaviorsSharedDataBehaviorTypeRenamer() {}
|
||||
|
||||
} // namespace gd
|
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include "GDCore/IDE/Project/ArbitraryBehaviorSharedDataWorker.h"
|
||||
#include "GDCore/String.h"
|
||||
|
||||
namespace gd {
|
||||
class BaseEvent;
|
||||
class Project;
|
||||
class EventsList;
|
||||
} // namespace gd
|
||||
|
||||
namespace gd {
|
||||
|
||||
/**
|
||||
* \brief Rename the behavior type of shared data.
|
||||
*
|
||||
* \ingroup IDE
|
||||
*/
|
||||
class GD_CORE_API BehaviorsSharedDataBehaviorTypeRenamer : public ArbitraryBehaviorSharedDataWorker {
|
||||
public:
|
||||
BehaviorsSharedDataBehaviorTypeRenamer(const gd::String& oldBehaviorType_,
|
||||
const gd::String& newBehaviorType_)
|
||||
: oldBehaviorType(oldBehaviorType_), newBehaviorType(newBehaviorType_){};
|
||||
virtual ~BehaviorsSharedDataBehaviorTypeRenamer();
|
||||
|
||||
private:
|
||||
void DoVisitSharedData(gd::BehaviorsSharedData& behavior) override;
|
||||
|
||||
gd::String oldBehaviorType;
|
||||
gd::String newBehaviorType;
|
||||
};
|
||||
|
||||
} // namespace gd
|
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#include "FunctionParameterBehaviorTypeRenamer.h"
|
||||
|
||||
#include "GDCore/Project/EventsFunction.h"
|
||||
#include "GDCore/String.h"
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
namespace gd {
|
||||
|
||||
void FunctionParameterBehaviorTypeRenamer::DoVisitEventsFunction(
|
||||
gd::EventsFunction &eventsFunction) {
|
||||
for (auto &¶meter : eventsFunction.GetParameters()) {
|
||||
if (gd::ParameterMetadata::IsBehavior(parameter.GetType()) &&
|
||||
parameter.GetExtraInfo() == oldBehaviorType) {
|
||||
parameter.SetExtraInfo(newBehaviorType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FunctionParameterBehaviorTypeRenamer::~FunctionParameterBehaviorTypeRenamer() {}
|
||||
|
||||
} // namespace gd
|
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "GDCore/IDE/Project/ArbitraryEventsFunctionsWorker.h"
|
||||
#include "GDCore/String.h"
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
namespace gd {
|
||||
class BaseEvent;
|
||||
class Project;
|
||||
class EventsList;
|
||||
} // namespace gd
|
||||
|
||||
namespace gd {
|
||||
|
||||
/**
|
||||
* \brief Rename the type of behavior parameters in functions.
|
||||
*
|
||||
* \ingroup IDE
|
||||
*/
|
||||
class GD_CORE_API FunctionParameterBehaviorTypeRenamer
|
||||
: public ArbitraryEventsFunctionsWorker {
|
||||
public:
|
||||
FunctionParameterBehaviorTypeRenamer(const gd::String &oldBehaviorType_,
|
||||
const gd::String &newBehaviorType_)
|
||||
: oldBehaviorType(oldBehaviorType_), newBehaviorType(newBehaviorType_){};
|
||||
virtual ~FunctionParameterBehaviorTypeRenamer();
|
||||
|
||||
private:
|
||||
virtual void DoVisitEventsFunction(gd::EventsFunction &eventsFunction) override;
|
||||
|
||||
gd::String oldBehaviorType;
|
||||
gd::String newBehaviorType;
|
||||
};
|
||||
|
||||
} // namespace gd
|
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#include "FunctionParameterObjectTypeRenamer.h"
|
||||
|
||||
#include "GDCore/Project/EventsFunction.h"
|
||||
#include "GDCore/String.h"
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
namespace gd {
|
||||
|
||||
void FunctionParameterObjectTypeRenamer::DoVisitEventsFunction(
|
||||
gd::EventsFunction &eventsFunction) {
|
||||
for (auto &¶meter : eventsFunction.GetParameters()) {
|
||||
if (gd::ParameterMetadata::IsObject(parameter.GetType()) &&
|
||||
parameter.GetExtraInfo() == oldObjectType) {
|
||||
parameter.SetExtraInfo(newObjectType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FunctionParameterObjectTypeRenamer::~FunctionParameterObjectTypeRenamer() {}
|
||||
|
||||
} // namespace gd
|
42
Core/GDCore/IDE/Project/FunctionParameterObjectTypeRenamer.h
Normal file
42
Core/GDCore/IDE/Project/FunctionParameterObjectTypeRenamer.h
Normal file
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "GDCore/IDE/Project/ArbitraryEventsFunctionsWorker.h"
|
||||
#include "GDCore/String.h"
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
namespace gd {
|
||||
class BaseEvent;
|
||||
class Project;
|
||||
class EventsList;
|
||||
} // namespace gd
|
||||
|
||||
namespace gd {
|
||||
|
||||
/**
|
||||
* \brief Rename the type of object parameters in functions.
|
||||
*
|
||||
* \ingroup IDE
|
||||
*/
|
||||
class GD_CORE_API FunctionParameterObjectTypeRenamer
|
||||
: public ArbitraryEventsFunctionsWorker {
|
||||
public:
|
||||
FunctionParameterObjectTypeRenamer(const gd::String &oldObjectType_,
|
||||
const gd::String &newObjectType_)
|
||||
: oldObjectType(oldObjectType_), newObjectType(newObjectType_){};
|
||||
virtual ~FunctionParameterObjectTypeRenamer();
|
||||
|
||||
private:
|
||||
virtual void DoVisitEventsFunction(gd::EventsFunction &eventsFunction) override;
|
||||
|
||||
gd::String oldObjectType;
|
||||
gd::String newObjectType;
|
||||
};
|
||||
|
||||
} // namespace gd
|
35
Core/GDCore/IDE/Project/RequiredBehaviorRenamer.cpp
Normal file
35
Core/GDCore/IDE/Project/RequiredBehaviorRenamer.cpp
Normal file
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#include "GDCore/IDE/Project/RequiredBehaviorRenamer.h"
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include "GDCore/Project/EventsBasedBehavior.h"
|
||||
#include "GDCore/String.h"
|
||||
|
||||
namespace gd {
|
||||
|
||||
void RequiredBehaviorRenamer::DoVisitEventBasedBehavior(gd::EventsBasedBehavior& eventsBasedBehavior) {
|
||||
for (size_t i = 0;
|
||||
i < eventsBasedBehavior.GetPropertyDescriptors().GetCount();
|
||||
i++) {
|
||||
NamedPropertyDescriptor& propertyDescriptor =
|
||||
eventsBasedBehavior.GetPropertyDescriptors().Get(i);
|
||||
|
||||
std::vector<gd::String>& extraInfo = propertyDescriptor.GetExtraInfo();
|
||||
if (propertyDescriptor.GetType() == "Behavior" &&
|
||||
extraInfo.size() > 0) {
|
||||
const gd::String& requiredBehaviorType = extraInfo[0];
|
||||
if (requiredBehaviorType == oldBehaviorType) {
|
||||
extraInfo[0] = newBehaviorType;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RequiredBehaviorRenamer::~RequiredBehaviorRenamer() {}
|
||||
|
||||
} // namespace gd
|
42
Core/GDCore/IDE/Project/RequiredBehaviorRenamer.h
Normal file
42
Core/GDCore/IDE/Project/RequiredBehaviorRenamer.h
Normal file
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#ifndef GDCORE_REQUIREDBEHAVIORRENAMER_H
|
||||
#define GDCORE_REQUIREDBEHAVIORRENAMER_H
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include "GDCore/IDE/Project/ArbitraryEventBasedBehaviorsWorker.h"
|
||||
#include "GDCore/String.h"
|
||||
namespace gd {
|
||||
class BaseEvent;
|
||||
class Project;
|
||||
class EventsList;
|
||||
} // namespace gd
|
||||
|
||||
namespace gd {
|
||||
|
||||
/**
|
||||
* \brief Rename the type of required behavior in event-based behaviors.
|
||||
*
|
||||
* \ingroup IDE
|
||||
*/
|
||||
class GD_CORE_API RequiredBehaviorRenamer : public ArbitraryEventBasedBehaviorsWorker {
|
||||
public:
|
||||
RequiredBehaviorRenamer(const gd::String& oldBehaviorType_,
|
||||
const gd::String& newBehaviorType_)
|
||||
: oldBehaviorType(oldBehaviorType_), newBehaviorType(newBehaviorType_){};
|
||||
virtual ~RequiredBehaviorRenamer();
|
||||
|
||||
private:
|
||||
void DoVisitEventBasedBehavior(gd::EventsBasedBehavior& behavior) override;
|
||||
|
||||
gd::String oldBehaviorType;
|
||||
gd::String newBehaviorType;
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
|
||||
#endif // GDCORE_REQUIREDBEHAVIORRENAMER_H
|
@@ -4,9 +4,7 @@
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
|
||||
#if defined(GD_IDE_ONLY)
|
||||
#ifndef GDCORE_RESOURCESRENAMER_H
|
||||
#define GDCORE_RESOURCESRENAMER_H
|
||||
#pragma once
|
||||
|
||||
#include <set>
|
||||
#include <vector>
|
||||
@@ -72,6 +70,3 @@ class ResourcesRenamer : public gd::ArbitraryResourceWorker {
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
|
||||
#endif // GDCORE_RESOURCESRENAMER_H
|
||||
#endif
|
||||
|
89
Core/GDCore/IDE/ProjectBrowser.h
Normal file
89
Core/GDCore/IDE/ProjectBrowser.h
Normal file
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
namespace gd {
|
||||
class Project;
|
||||
class String;
|
||||
class EventsFunctionsExtension;
|
||||
class EventsFunction;
|
||||
class EventsBasedBehavior;
|
||||
class EventsBasedObject;
|
||||
class ArbitraryEventsWorker;
|
||||
class ArbitraryEventsWorkerWithContext;
|
||||
class ArbitraryEventsFunctionsWorker;
|
||||
class ArbitraryObjectsWorker;
|
||||
class ArbitraryEventBasedBehaviorsWorker;
|
||||
class ArbitraryBehaviorSharedDataWorker;
|
||||
} // namespace gd
|
||||
|
||||
namespace gd {
|
||||
|
||||
/**
|
||||
* \brief Expose a subset of the project to workers.
|
||||
*/
|
||||
class GD_CORE_API ProjectBrowser {
|
||||
public:
|
||||
/**
|
||||
* \brief Call the specified worker on all events of a project subset.
|
||||
*
|
||||
* This should be the preferred way to traverse events of a project.
|
||||
*/
|
||||
virtual void ExposeEvents(gd::Project &project,
|
||||
gd::ArbitraryEventsWorker &worker) const = 0;
|
||||
/**
|
||||
* \brief Call the specified worker on all events of a project subset.
|
||||
*
|
||||
* This should be the preferred way to traverse events of a project.
|
||||
*/
|
||||
virtual void
|
||||
ExposeEvents(gd::Project &project,
|
||||
gd::ArbitraryEventsWorkerWithContext &worker) const = 0;
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all ObjectContainer of a project subset
|
||||
*
|
||||
* This should be the preferred way to traverse all the objects of a project.
|
||||
*/
|
||||
virtual void ExposeObjects(gd::Project &project,
|
||||
gd::ArbitraryObjectsWorker &worker) const = 0;
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all FunctionsContainer of a project
|
||||
* subset.
|
||||
*
|
||||
* This should be the preferred way to traverse all the function signatures
|
||||
* of a project.
|
||||
*/
|
||||
virtual void ExposeFunctions(gd::Project &project,
|
||||
gd::ArbitraryEventsFunctionsWorker &worker) const = 0;
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all EventBasedBehavior of a project
|
||||
* subset.
|
||||
*
|
||||
* This should be the preferred way to traverse all the event-based behavior
|
||||
* of a project.
|
||||
*/
|
||||
virtual void ExposeEventBasedBehaviors(
|
||||
gd::Project &project,
|
||||
gd::ArbitraryEventBasedBehaviorsWorker &worker) const = 0;
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all SharedData of a project subset.
|
||||
*
|
||||
* This should be the preferred way to traverse all the shared data
|
||||
* of a project.
|
||||
*/
|
||||
virtual void
|
||||
ExposeBehaviorSharedDatas(gd::Project &project,
|
||||
gd::ArbitraryBehaviorSharedDataWorker &worker) const = 0;
|
||||
|
||||
virtual ~ProjectBrowser(){};
|
||||
};
|
||||
|
||||
} // namespace gd
|
224
Core/GDCore/IDE/ProjectBrowserHelper.cpp
Normal file
224
Core/GDCore/IDE/ProjectBrowserHelper.cpp
Normal file
@@ -0,0 +1,224 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#include "ProjectBrowserHelper.h"
|
||||
|
||||
#include "GDCore/IDE/Events/ArbitraryEventsWorker.h"
|
||||
#include "GDCore/IDE/EventsFunctionTools.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryEventBasedBehaviorsWorker.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryEventsFunctionsWorker.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryObjectsWorker.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryBehaviorSharedDataWorker.h"
|
||||
#include "GDCore/Project/EventsBasedBehavior.h"
|
||||
#include "GDCore/Project/EventsBasedObject.h"
|
||||
#include "GDCore/Project/EventsFunctionsExtension.h"
|
||||
#include "GDCore/Project/ExternalEvents.h"
|
||||
#include "GDCore/Project/Layout.h"
|
||||
#include "GDCore/Project/Project.h"
|
||||
#include "GDCore/String.h"
|
||||
|
||||
namespace gd {
|
||||
|
||||
void ProjectBrowserHelper::ExposeProjectEvents(
|
||||
gd::Project &project, gd::ArbitraryEventsWorker &worker) {
|
||||
// See also gd::Project::ExposeResources for a method that traverses the whole
|
||||
// project (this time for resources).
|
||||
|
||||
ExposeProjectEventsWithoutExtensions(project, worker);
|
||||
|
||||
// Add events based extensions
|
||||
for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount();
|
||||
e++) {
|
||||
// Add (free) events functions
|
||||
auto &eventsFunctionsExtension = project.GetEventsFunctionsExtension(e);
|
||||
for (auto &&eventsFunction : eventsFunctionsExtension.GetInternalVector()) {
|
||||
worker.Launch(eventsFunction->GetEvents());
|
||||
}
|
||||
|
||||
// Add (behavior) events functions
|
||||
for (auto &&eventsBasedBehavior :
|
||||
eventsFunctionsExtension.GetEventsBasedBehaviors()
|
||||
.GetInternalVector()) {
|
||||
ExposeEventsBasedBehaviorEvents(project, *eventsBasedBehavior, worker);
|
||||
}
|
||||
|
||||
// Add (object) events functions
|
||||
for (auto &&eventsBasedObject :
|
||||
eventsFunctionsExtension.GetEventsBasedObjects().GetInternalVector()) {
|
||||
auto &objectEventsFunctions = eventsBasedObject->GetEventsFunctions();
|
||||
for (auto &&eventsFunction : objectEventsFunctions.GetInternalVector()) {
|
||||
worker.Launch(eventsFunction->GetEvents());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectBrowserHelper::ExposeProjectEventsWithoutExtensions(
|
||||
gd::Project& project, gd::ArbitraryEventsWorker& worker) {
|
||||
// Add layouts events
|
||||
for (std::size_t s = 0; s < project.GetLayoutsCount(); s++) {
|
||||
worker.Launch(project.GetLayout(s).GetEvents());
|
||||
}
|
||||
// Add external events events
|
||||
for (std::size_t s = 0; s < project.GetExternalEventsCount(); s++) {
|
||||
worker.Launch(project.GetExternalEvents(s).GetEvents());
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectBrowserHelper::ExposeProjectEvents(
|
||||
gd::Project &project, gd::ArbitraryEventsWorkerWithContext &worker) {
|
||||
// See also gd::Project::ExposeResources for a method that traverse the whole
|
||||
// project (this time for resources) and ExposeProjectEffects (this time for
|
||||
// effects).
|
||||
|
||||
// Add layouts events
|
||||
for (std::size_t s = 0; s < project.GetLayoutsCount(); s++) {
|
||||
auto &layout = project.GetLayout(s);
|
||||
worker.Launch(layout.GetEvents(), project, layout);
|
||||
}
|
||||
// Add external events events
|
||||
for (std::size_t s = 0; s < project.GetExternalEventsCount(); s++) {
|
||||
const auto &externalEvents = project.GetExternalEvents(s);
|
||||
const gd::String &associatedLayout = externalEvents.GetAssociatedLayout();
|
||||
if (project.HasLayoutNamed(associatedLayout)) {
|
||||
worker.Launch(project.GetExternalEvents(s).GetEvents(), project,
|
||||
project.GetLayout(associatedLayout));
|
||||
}
|
||||
}
|
||||
// Add events based extensions
|
||||
for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount();
|
||||
e++) {
|
||||
// Add (free) events functions
|
||||
auto &eventsFunctionsExtension = project.GetEventsFunctionsExtension(e);
|
||||
for (auto &&eventsFunction : eventsFunctionsExtension.GetInternalVector()) {
|
||||
gd::ObjectsContainer globalObjectsAndGroups;
|
||||
gd::ObjectsContainer objectsAndGroups;
|
||||
gd::EventsFunctionTools::FreeEventsFunctionToObjectsContainer(
|
||||
project, eventsFunctionsExtension, *eventsFunction,
|
||||
globalObjectsAndGroups, objectsAndGroups);
|
||||
|
||||
worker.Launch(eventsFunction->GetEvents(), globalObjectsAndGroups,
|
||||
objectsAndGroups);
|
||||
}
|
||||
|
||||
// Add (behavior) events functions
|
||||
for (auto &&eventsBasedBehavior :
|
||||
eventsFunctionsExtension.GetEventsBasedBehaviors()
|
||||
.GetInternalVector()) {
|
||||
ExposeEventsBasedBehaviorEvents(project, *eventsBasedBehavior, worker);
|
||||
}
|
||||
|
||||
// Add (object) events functions
|
||||
for (auto &&eventsBasedObject :
|
||||
eventsFunctionsExtension.GetEventsBasedObjects().GetInternalVector()) {
|
||||
ExposeEventsBasedObjectEvents(project, *eventsBasedObject, worker);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectBrowserHelper::ExposeEventsBasedBehaviorEvents(
|
||||
gd::Project &project, const gd::EventsBasedBehavior &eventsBasedBehavior,
|
||||
gd::ArbitraryEventsWorker &worker) {
|
||||
auto &behaviorEventsFunctions = eventsBasedBehavior.GetEventsFunctions();
|
||||
for (auto &&eventsFunction : behaviorEventsFunctions.GetInternalVector()) {
|
||||
worker.Launch(eventsFunction->GetEvents());
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectBrowserHelper::ExposeEventsBasedBehaviorEvents(
|
||||
gd::Project &project, const gd::EventsBasedBehavior &eventsBasedBehavior,
|
||||
gd::ArbitraryEventsWorkerWithContext &worker) {
|
||||
auto &behaviorEventsFunctions = eventsBasedBehavior.GetEventsFunctions();
|
||||
for (auto &&eventsFunction : behaviorEventsFunctions.GetInternalVector()) {
|
||||
gd::ObjectsContainer globalObjectsAndGroups;
|
||||
gd::ObjectsContainer objectsAndGroups;
|
||||
gd::EventsFunctionTools::BehaviorEventsFunctionToObjectsContainer(
|
||||
project, eventsBasedBehavior, *eventsFunction, globalObjectsAndGroups,
|
||||
objectsAndGroups);
|
||||
|
||||
worker.Launch(eventsFunction->GetEvents(), globalObjectsAndGroups,
|
||||
objectsAndGroups);
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectBrowserHelper::ExposeEventsBasedObjectEvents(
|
||||
gd::Project &project, const gd::EventsBasedObject &eventsBasedObject,
|
||||
gd::ArbitraryEventsWorkerWithContext &worker) {
|
||||
auto &objectEventsFunctions = eventsBasedObject.GetEventsFunctions();
|
||||
for (auto &&eventsFunction : objectEventsFunctions.GetInternalVector()) {
|
||||
gd::ObjectsContainer globalObjectsAndGroups;
|
||||
gd::ObjectsContainer objectsAndGroups;
|
||||
gd::EventsFunctionTools::ObjectEventsFunctionToObjectsContainer(
|
||||
project, eventsBasedObject, *eventsFunction, globalObjectsAndGroups,
|
||||
objectsAndGroups);
|
||||
|
||||
worker.Launch(eventsFunction->GetEvents(), globalObjectsAndGroups,
|
||||
objectsAndGroups);
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectBrowserHelper::ExposeProjectObjects(
|
||||
gd::Project &project, gd::ArbitraryObjectsWorker &worker) {
|
||||
|
||||
// Global objects
|
||||
worker.Launch(project);
|
||||
|
||||
// Layers objects
|
||||
for (size_t i = 0; i < project.GetLayoutsCount(); i++) {
|
||||
worker.Launch(project.GetLayout(i));
|
||||
}
|
||||
|
||||
// Event based objects children
|
||||
for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount();
|
||||
e++) {
|
||||
auto &eventsFunctionsExtension = project.GetEventsFunctionsExtension(e);
|
||||
|
||||
for (auto &&eventsBasedObjectUniquePtr :
|
||||
eventsFunctionsExtension.GetEventsBasedObjects().GetInternalVector()) {
|
||||
auto eventsBasedObject = eventsBasedObjectUniquePtr.get();
|
||||
worker.Launch(*eventsBasedObject);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void ProjectBrowserHelper::ExposeProjectFunctions(
|
||||
gd::Project &project, gd::ArbitraryEventsFunctionsWorker &worker) {
|
||||
|
||||
for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount();
|
||||
e++) {
|
||||
auto &eventsFunctionsExtension = project.GetEventsFunctionsExtension(e);
|
||||
worker.Launch(eventsFunctionsExtension);
|
||||
|
||||
for (auto &&eventsBasedBehavior :
|
||||
eventsFunctionsExtension.GetEventsBasedBehaviors()
|
||||
.GetInternalVector()) {
|
||||
worker.Launch(eventsBasedBehavior->GetEventsFunctions());
|
||||
}
|
||||
|
||||
for (auto &&eventsBasedObject :
|
||||
eventsFunctionsExtension.GetEventsBasedObjects().GetInternalVector()) {
|
||||
worker.Launch(eventsBasedObject->GetEventsFunctions());
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void ProjectBrowserHelper::ExposeProjectEventBasedBehaviors(
|
||||
gd::Project &project, gd::ArbitraryEventBasedBehaviorsWorker &worker) {
|
||||
for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount();
|
||||
e++) {
|
||||
auto &eventsFunctionsExtension = project.GetEventsFunctionsExtension(e);
|
||||
worker.Launch(eventsFunctionsExtension.GetEventsBasedBehaviors());
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectBrowserHelper::ExposeProjectSharedDatas(
|
||||
gd::Project &project, gd::ArbitraryBehaviorSharedDataWorker &worker) {
|
||||
for (std::size_t i = 0; i < project.GetLayoutsCount(); ++i) {
|
||||
gd::Layout &layout = project.GetLayout(i);
|
||||
worker.Launch(layout.GetAllBehaviorSharedData());
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace gd
|
130
Core/GDCore/IDE/ProjectBrowserHelper.h
Normal file
130
Core/GDCore/IDE/ProjectBrowserHelper.h
Normal file
@@ -0,0 +1,130 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
namespace gd {
|
||||
class Project;
|
||||
class String;
|
||||
class EventsFunctionsExtension;
|
||||
class EventsFunction;
|
||||
class EventsBasedBehavior;
|
||||
class EventsBasedObject;
|
||||
class ArbitraryEventsWorker;
|
||||
class ArbitraryEventsWorkerWithContext;
|
||||
class ArbitraryEventsFunctionsWorker;
|
||||
class ArbitraryObjectsWorker;
|
||||
class ArbitraryEventBasedBehaviorsWorker;
|
||||
class ArbitraryBehaviorSharedDataWorker;
|
||||
} // namespace gd
|
||||
|
||||
namespace gd {
|
||||
|
||||
/**
|
||||
* \brief Expose a subset of the project to workers.
|
||||
*/
|
||||
class GD_CORE_API ProjectBrowserHelper {
|
||||
public:
|
||||
/**
|
||||
* \brief Call the specified worker on all events of the project (layout,
|
||||
* external events, events functions...)
|
||||
*
|
||||
* This should be the preferred way to traverse all the events of a project.
|
||||
*/
|
||||
static void ExposeProjectEvents(gd::Project &project,
|
||||
gd::ArbitraryEventsWorker &worker);
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all events of the project (layout,
|
||||
* external events, events functions...)
|
||||
*
|
||||
* This should be the preferred way to traverse all the events of a project.
|
||||
*/
|
||||
static void ExposeProjectEvents(gd::Project &project,
|
||||
gd::ArbitraryEventsWorkerWithContext &worker);
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all events of the project (layout and
|
||||
* external events) but not events from extensions.
|
||||
*
|
||||
* Only use this for stats.
|
||||
*/
|
||||
static void
|
||||
ExposeProjectEventsWithoutExtensions(gd::Project &project,
|
||||
gd::ArbitraryEventsWorker &worker);
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all events of the event-based
|
||||
* behavior
|
||||
*
|
||||
* This should be the preferred way to traverse all the events of an events
|
||||
* based behavior.
|
||||
*/
|
||||
static void ExposeEventsBasedBehaviorEvents(
|
||||
gd::Project &project, const gd::EventsBasedBehavior &eventsBasedBehavior,
|
||||
gd::ArbitraryEventsWorker &worker);
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all events of the event-based
|
||||
* behavior.
|
||||
*
|
||||
* This should be the preferred way to traverse all the events of an
|
||||
* event-based behavior.
|
||||
*/
|
||||
static void ExposeEventsBasedBehaviorEvents(
|
||||
gd::Project &project, const gd::EventsBasedBehavior &eventsBasedBehavior,
|
||||
gd::ArbitraryEventsWorkerWithContext &worker);
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all events of the event-based
|
||||
* behavior.
|
||||
*
|
||||
* This should be the preferred way to traverse all the events of an
|
||||
* event-based behavior.
|
||||
*/
|
||||
static void
|
||||
ExposeEventsBasedObjectEvents(gd::Project &project,
|
||||
const gd::EventsBasedObject &eventsBasedObject,
|
||||
gd::ArbitraryEventsWorkerWithContext &worker);
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all ObjectContainers of the project
|
||||
* (global, layouts...)
|
||||
*
|
||||
* This should be the preferred way to traverse all the objects of a project.
|
||||
*/
|
||||
static void ExposeProjectObjects(gd::Project &project,
|
||||
gd::ArbitraryObjectsWorker &worker);
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all FunctionsContainers of the project
|
||||
* (global, layouts...)
|
||||
*
|
||||
* This should be the preferred way to traverse all the function signatures
|
||||
* of a project.
|
||||
*/
|
||||
static void ExposeProjectFunctions(gd::Project &project,
|
||||
gd::ArbitraryEventsFunctionsWorker &worker);
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all EventBasedBehavior of a project.
|
||||
*
|
||||
* This should be the preferred way to traverse all the event-based behavior
|
||||
* of a project.
|
||||
*/
|
||||
static void ExposeProjectEventBasedBehaviors(
|
||||
gd::Project &project, gd::ArbitraryEventBasedBehaviorsWorker &worker);
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all SharedData of a project.
|
||||
*
|
||||
* This should be the preferred way to traverse all the shared data
|
||||
* of a project.
|
||||
*/
|
||||
static void ExposeProjectSharedDatas(gd::Project &project,
|
||||
gd::ArbitraryBehaviorSharedDataWorker &worker);
|
||||
};
|
||||
|
||||
} // namespace gd
|
49
Core/GDCore/IDE/WholeProjectBrowser.cpp
Normal file
49
Core/GDCore/IDE/WholeProjectBrowser.cpp
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#include "WholeProjectBrowser.h"
|
||||
|
||||
#include "GDCore/IDE/Events/ArbitraryEventsWorker.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryEventBasedBehaviorsWorker.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryEventsFunctionsWorker.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryObjectsWorker.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryBehaviorSharedDataWorker.h"
|
||||
#include "GDCore/IDE/ProjectBrowserHelper.h"
|
||||
#include "GDCore/Project/Project.h"
|
||||
#include "GDCore/String.h"
|
||||
|
||||
namespace gd {
|
||||
|
||||
void WholeProjectBrowser::ExposeEvents(
|
||||
gd::Project &project, gd::ArbitraryEventsWorker &worker) const {
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, worker);
|
||||
}
|
||||
|
||||
void WholeProjectBrowser::ExposeEvents(
|
||||
gd::Project &project, gd::ArbitraryEventsWorkerWithContext &worker) const {
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, worker);
|
||||
}
|
||||
|
||||
void WholeProjectBrowser::ExposeObjects(
|
||||
gd::Project &project, gd::ArbitraryObjectsWorker &worker) const {
|
||||
gd::ProjectBrowserHelper::ExposeProjectObjects(project, worker);
|
||||
}
|
||||
|
||||
void WholeProjectBrowser::ExposeFunctions(
|
||||
gd::Project &project, gd::ArbitraryEventsFunctionsWorker &worker) const {
|
||||
gd::ProjectBrowserHelper::ExposeProjectFunctions(project, worker);
|
||||
}
|
||||
|
||||
void WholeProjectBrowser::ExposeEventBasedBehaviors(
|
||||
gd::Project &project,
|
||||
gd::ArbitraryEventBasedBehaviorsWorker &worker) const {
|
||||
gd::ProjectBrowserHelper::ExposeProjectEventBasedBehaviors(project, worker);
|
||||
}
|
||||
|
||||
void WholeProjectBrowser::ExposeBehaviorSharedDatas(
|
||||
gd::Project &project, gd::ArbitraryBehaviorSharedDataWorker &worker) const {
|
||||
gd::ProjectBrowserHelper::ExposeProjectSharedDatas(project, worker);
|
||||
}
|
||||
} // namespace gd
|
90
Core/GDCore/IDE/WholeProjectBrowser.h
Normal file
90
Core/GDCore/IDE/WholeProjectBrowser.h
Normal file
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "GDCore/IDE/ProjectBrowser.h"
|
||||
|
||||
namespace gd {
|
||||
class Project;
|
||||
class String;
|
||||
class EventsFunctionsExtension;
|
||||
class EventsFunction;
|
||||
class EventsBasedBehavior;
|
||||
class EventsBasedObject;
|
||||
class ArbitraryEventsWorker;
|
||||
class ArbitraryEventsWorkerWithContext;
|
||||
class ArbitraryEventsFunctionsWorker;
|
||||
class ArbitraryObjectsWorker;
|
||||
class ArbitraryEventBasedBehaviorsWorker;
|
||||
class ArbitraryBehaviorSharedDataWorker;
|
||||
} // namespace gd
|
||||
|
||||
namespace gd {
|
||||
|
||||
/**
|
||||
* \brief Expose the whole project to workers.
|
||||
*/
|
||||
class GD_CORE_API WholeProjectBrowser : public ProjectBrowser {
|
||||
public:
|
||||
/**
|
||||
* \brief Call the specified worker on all events of the project (layout,
|
||||
* external events, events functions...)
|
||||
*
|
||||
* This should be the preferred way to traverse all the events of a project.
|
||||
*/
|
||||
void ExposeEvents(gd::Project &project,
|
||||
gd::ArbitraryEventsWorker &worker) const override;
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all events of the project (layout,
|
||||
* external events, events functions...)
|
||||
*
|
||||
* This should be the preferred way to traverse all the events of a project.
|
||||
*/
|
||||
void
|
||||
ExposeEvents(gd::Project &project,
|
||||
gd::ArbitraryEventsWorkerWithContext &worker) const override;
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all ObjectContainers of the project
|
||||
* (global, layouts...)
|
||||
*
|
||||
* This should be the preferred way to traverse all the objects of a project.
|
||||
*/
|
||||
void ExposeObjects(gd::Project &project,
|
||||
gd::ArbitraryObjectsWorker &worker) const override;
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all FunctionsContainers of the project
|
||||
* (global, layouts...)
|
||||
*
|
||||
* This should be the preferred way to traverse all the function signatures
|
||||
* of a project.
|
||||
*/
|
||||
void ExposeFunctions(gd::Project &project,
|
||||
gd::ArbitraryEventsFunctionsWorker &worker) const override;
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all EventBasedBehavior of a project.
|
||||
*
|
||||
* This should be the preferred way to traverse all the event-based behavior
|
||||
* of a project.
|
||||
*/
|
||||
void ExposeEventBasedBehaviors(
|
||||
gd::Project &project,
|
||||
gd::ArbitraryEventBasedBehaviorsWorker &worker) const override;
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all SharedData of a project.
|
||||
*
|
||||
* This should be the preferred way to traverse all the shared data
|
||||
* of a project.
|
||||
*/
|
||||
void ExposeBehaviorSharedDatas(gd::Project &project,
|
||||
gd::ArbitraryBehaviorSharedDataWorker &worker) const override;
|
||||
};
|
||||
|
||||
} // namespace gd
|
@@ -18,8 +18,20 @@
|
||||
#include "GDCore/IDE/Events/ExpressionsRenamer.h"
|
||||
#include "GDCore/IDE/Events/InstructionsParameterMover.h"
|
||||
#include "GDCore/IDE/Events/InstructionsTypeRenamer.h"
|
||||
#include "GDCore/IDE/ProjectBrowser.h"
|
||||
#include "GDCore/IDE/ProjectBrowserHelper.h"
|
||||
#include "GDCore/IDE/WholeProjectBrowser.h"
|
||||
#include "GDCore/IDE/EventBasedBehaviorBrowser.h"
|
||||
#include "GDCore/IDE/EventsFunctionTools.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryObjectsWorker.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryEventsFunctionsWorker.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryEventBasedBehaviorsWorker.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryBehaviorSharedDataWorker.h"
|
||||
#include "GDCore/IDE/Project/RequiredBehaviorRenamer.h"
|
||||
#include "GDCore/IDE/Project/BehaviorObjectTypeRenamer.h"
|
||||
#include "GDCore/IDE/Project/BehaviorsSharedDataBehaviorTypeRenamer.h"
|
||||
#include "GDCore/IDE/Project/FunctionParameterBehaviorTypeRenamer.h"
|
||||
#include "GDCore/IDE/Project/FunctionParameterObjectTypeRenamer.h"
|
||||
#include "GDCore/IDE/UnfilledRequiredBehaviorPropertyProblem.h"
|
||||
#include "GDCore/Project/Behavior.h"
|
||||
#include "GDCore/Project/BehaviorConfigurationContainer.h"
|
||||
@@ -44,174 +56,6 @@ const gd::String WholeProjectRefactorer::behaviorObjectParameterName = "Object";
|
||||
// always called "Object".
|
||||
const gd::String WholeProjectRefactorer::parentObjectParameterName = "Object";
|
||||
|
||||
void WholeProjectRefactorer::ExposeProjectEvents(
|
||||
gd::Project& project, gd::ArbitraryEventsWorker& worker) {
|
||||
// See also gd::Project::ExposeResources for a method that traverse the whole
|
||||
// project (this time for resources).
|
||||
|
||||
// Add layouts events
|
||||
for (std::size_t s = 0; s < project.GetLayoutsCount(); s++) {
|
||||
worker.Launch(project.GetLayout(s).GetEvents());
|
||||
}
|
||||
// Add external events events
|
||||
for (std::size_t s = 0; s < project.GetExternalEventsCount(); s++) {
|
||||
worker.Launch(project.GetExternalEvents(s).GetEvents());
|
||||
}
|
||||
// Add events based extensions
|
||||
for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount();
|
||||
e++) {
|
||||
// Add (free) events functions
|
||||
auto& eventsFunctionsExtension = project.GetEventsFunctionsExtension(e);
|
||||
for (auto&& eventsFunction : eventsFunctionsExtension.GetInternalVector()) {
|
||||
worker.Launch(eventsFunction->GetEvents());
|
||||
}
|
||||
|
||||
// Add (behavior) events functions
|
||||
for (auto&& eventsBasedBehavior :
|
||||
eventsFunctionsExtension.GetEventsBasedBehaviors()
|
||||
.GetInternalVector()) {
|
||||
auto& behaviorEventsFunctions = eventsBasedBehavior->GetEventsFunctions();
|
||||
for (auto&& eventsFunction :
|
||||
behaviorEventsFunctions.GetInternalVector()) {
|
||||
worker.Launch(eventsFunction->GetEvents());
|
||||
}
|
||||
}
|
||||
|
||||
// Add (object) events functions
|
||||
for (auto&& eventsBasedObject :
|
||||
eventsFunctionsExtension.GetEventsBasedObjects()
|
||||
.GetInternalVector()) {
|
||||
auto& objectEventsFunctions = eventsBasedObject->GetEventsFunctions();
|
||||
for (auto&& eventsFunction :
|
||||
objectEventsFunctions.GetInternalVector()) {
|
||||
worker.Launch(eventsFunction->GetEvents());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WholeProjectRefactorer::ExposeProjectEvents(
|
||||
gd::Project& project, gd::ArbitraryEventsWorkerWithContext& worker) {
|
||||
// See also gd::Project::ExposeResources for a method that traverse the whole
|
||||
// project (this time for resources) and ExposeProjectEffects (this time for
|
||||
// effects).
|
||||
|
||||
// Add layouts events
|
||||
for (std::size_t s = 0; s < project.GetLayoutsCount(); s++) {
|
||||
auto& layout = project.GetLayout(s);
|
||||
worker.Launch(layout.GetEvents(), project, layout);
|
||||
}
|
||||
// Add external events events
|
||||
for (std::size_t s = 0; s < project.GetExternalEventsCount(); s++) {
|
||||
const auto& externalEvents = project.GetExternalEvents(s);
|
||||
const gd::String& associatedLayout = externalEvents.GetAssociatedLayout();
|
||||
if (project.HasLayoutNamed(associatedLayout)) {
|
||||
worker.Launch(project.GetExternalEvents(s).GetEvents(),
|
||||
project,
|
||||
project.GetLayout(associatedLayout));
|
||||
}
|
||||
}
|
||||
// Add events based extensions
|
||||
for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount();
|
||||
e++) {
|
||||
// Add (free) events functions
|
||||
auto& eventsFunctionsExtension = project.GetEventsFunctionsExtension(e);
|
||||
for (auto&& eventsFunction : eventsFunctionsExtension.GetInternalVector()) {
|
||||
gd::ObjectsContainer globalObjectsAndGroups;
|
||||
gd::ObjectsContainer objectsAndGroups;
|
||||
gd::EventsFunctionTools::FreeEventsFunctionToObjectsContainer(
|
||||
project,
|
||||
eventsFunctionsExtension,
|
||||
*eventsFunction,
|
||||
globalObjectsAndGroups,
|
||||
objectsAndGroups);
|
||||
|
||||
worker.Launch(eventsFunction->GetEvents(),
|
||||
globalObjectsAndGroups,
|
||||
objectsAndGroups);
|
||||
}
|
||||
|
||||
// Add (behavior) events functions
|
||||
for (auto&& eventsBasedBehavior :
|
||||
eventsFunctionsExtension.GetEventsBasedBehaviors()
|
||||
.GetInternalVector()) {
|
||||
ExposeEventsBasedBehaviorEvents(project, *eventsBasedBehavior, worker);
|
||||
}
|
||||
|
||||
// Add (object) events functions
|
||||
for (auto&& eventsBasedObject :
|
||||
eventsFunctionsExtension.GetEventsBasedObjects()
|
||||
.GetInternalVector()) {
|
||||
ExposeEventsBasedObjectEvents(project, *eventsBasedObject, worker);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WholeProjectRefactorer::ExposeEventsBasedBehaviorEvents(
|
||||
gd::Project& project,
|
||||
const gd::EventsBasedBehavior& eventsBasedBehavior,
|
||||
gd::ArbitraryEventsWorkerWithContext& worker) {
|
||||
auto& behaviorEventsFunctions = eventsBasedBehavior.GetEventsFunctions();
|
||||
for (auto&& eventsFunction : behaviorEventsFunctions.GetInternalVector()) {
|
||||
gd::ObjectsContainer globalObjectsAndGroups;
|
||||
gd::ObjectsContainer objectsAndGroups;
|
||||
gd::EventsFunctionTools::BehaviorEventsFunctionToObjectsContainer(
|
||||
project,
|
||||
eventsBasedBehavior,
|
||||
*eventsFunction,
|
||||
globalObjectsAndGroups,
|
||||
objectsAndGroups);
|
||||
|
||||
worker.Launch(
|
||||
eventsFunction->GetEvents(), globalObjectsAndGroups, objectsAndGroups);
|
||||
}
|
||||
}
|
||||
|
||||
void WholeProjectRefactorer::ExposeEventsBasedObjectEvents(
|
||||
gd::Project& project,
|
||||
const gd::EventsBasedObject& eventsBasedObject,
|
||||
gd::ArbitraryEventsWorkerWithContext& worker) {
|
||||
auto& objectEventsFunctions = eventsBasedObject.GetEventsFunctions();
|
||||
for (auto&& eventsFunction : objectEventsFunctions.GetInternalVector()) {
|
||||
gd::ObjectsContainer globalObjectsAndGroups;
|
||||
gd::ObjectsContainer objectsAndGroups;
|
||||
gd::EventsFunctionTools::ObjectEventsFunctionToObjectsContainer(
|
||||
project,
|
||||
eventsBasedObject,
|
||||
*eventsFunction,
|
||||
globalObjectsAndGroups,
|
||||
objectsAndGroups);
|
||||
|
||||
worker.Launch(
|
||||
eventsFunction->GetEvents(), globalObjectsAndGroups, objectsAndGroups);
|
||||
}
|
||||
}
|
||||
|
||||
void WholeProjectRefactorer::ExposeProjectObjects(
|
||||
gd::Project& project, gd::ArbitraryObjectsWorker& worker) {
|
||||
|
||||
// Global objects
|
||||
worker.Launch(project);
|
||||
|
||||
// Layers objects
|
||||
for (size_t i = 0; i < project.GetLayoutsCount(); i++) {
|
||||
worker.Launch(project.GetLayout(i));
|
||||
}
|
||||
|
||||
// Event based objects children
|
||||
for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount();
|
||||
e++) {
|
||||
auto& eventsFunctionsExtension = project.GetEventsFunctionsExtension(e);
|
||||
|
||||
for (auto&& eventsBasedObjectUniquePtr :
|
||||
eventsFunctionsExtension.GetEventsBasedObjects()
|
||||
.GetInternalVector()) {
|
||||
auto eventsBasedObject = eventsBasedObjectUniquePtr.get();
|
||||
worker.Launch(*eventsBasedObject);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
std::set<gd::String>
|
||||
WholeProjectRefactorer::GetAllObjectTypesUsingEventsBasedBehavior(
|
||||
const gd::Project& project,
|
||||
@@ -286,22 +130,48 @@ void WholeProjectRefactorer::EnsureObjectEventsFunctionsProperParameters(
|
||||
}
|
||||
}
|
||||
|
||||
void WholeProjectRefactorer::UpdateExtensionNameInEventsBasedBehavior(
|
||||
gd::Project& project,
|
||||
const gd::EventsFunctionsExtension& eventsFunctionsExtension,
|
||||
gd::EventsBasedBehavior& eventsBasedBehavior,
|
||||
const gd::String& sourceExtensionName) {
|
||||
const EventBasedBehaviorBrowser eventBasedBehaviorExposer(eventsBasedBehavior);
|
||||
WholeProjectRefactorer::RenameEventsFunctionsExtension(
|
||||
project,
|
||||
eventsFunctionsExtension,
|
||||
sourceExtensionName,
|
||||
eventsFunctionsExtension.GetName(),
|
||||
eventBasedBehaviorExposer);
|
||||
}
|
||||
|
||||
void WholeProjectRefactorer::RenameEventsFunctionsExtension(
|
||||
gd::Project &project,
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::String &oldName, const gd::String &newName) {
|
||||
const WholeProjectBrowser wholeProjectExposer;
|
||||
RenameEventsFunctionsExtension(project, eventsFunctionsExtension, oldName,
|
||||
newName, wholeProjectExposer);
|
||||
}
|
||||
|
||||
void WholeProjectRefactorer::RenameEventsFunctionsExtension(
|
||||
gd::Project& project,
|
||||
const gd::EventsFunctionsExtension& eventsFunctionsExtension,
|
||||
const gd::String& oldName,
|
||||
const gd::String& newName) {
|
||||
const gd::String& newName,
|
||||
const gd::ProjectBrowser& projectBrowser
|
||||
) {
|
||||
auto renameEventsFunction =
|
||||
[&project, &oldName, &newName](const gd::EventsFunction& eventsFunction) {
|
||||
[&project, &oldName, &newName, &projectBrowser](const gd::EventsFunction& eventsFunction) {
|
||||
DoRenameEventsFunction(
|
||||
project,
|
||||
eventsFunction,
|
||||
gd::PlatformExtension::GetEventsFunctionFullType(oldName, eventsFunction.GetName()),
|
||||
gd::PlatformExtension::GetEventsFunctionFullType(newName, eventsFunction.GetName()));
|
||||
gd::PlatformExtension::GetEventsFunctionFullType(newName, eventsFunction.GetName()),
|
||||
projectBrowser);
|
||||
};
|
||||
|
||||
auto renameBehaviorEventsFunction =
|
||||
[&project, &oldName, &newName](
|
||||
[&project, &oldName, &newName, &projectBrowser](
|
||||
const gd::EventsBasedBehavior& eventsBasedBehavior,
|
||||
const gd::EventsFunction& eventsFunction) {
|
||||
if (eventsFunction.IsExpression()) {
|
||||
@@ -316,12 +186,12 @@ void WholeProjectRefactorer::RenameEventsFunctionsExtension(
|
||||
gd::PlatformExtension::GetBehaviorEventsFunctionFullType(newName,
|
||||
eventsBasedBehavior.GetName(),
|
||||
eventsFunction.GetName()));
|
||||
ExposeProjectEvents(project, renamer);
|
||||
projectBrowser.ExposeEvents(project, renamer);
|
||||
}
|
||||
};
|
||||
|
||||
auto renameBehaviorPropertyFunctions =
|
||||
[&project, &oldName, &newName](
|
||||
[&project, &oldName, &newName, &projectBrowser](
|
||||
const gd::EventsBasedBehavior& eventsBasedBehavior,
|
||||
const gd::NamedPropertyDescriptor& property) {
|
||||
gd::InstructionsTypeRenamer actionRenamer = gd::InstructionsTypeRenamer(
|
||||
@@ -336,7 +206,7 @@ void WholeProjectRefactorer::RenameEventsFunctionsExtension(
|
||||
eventsBasedBehavior.GetName(),
|
||||
gd::EventsBasedBehavior::GetPropertyActionName(
|
||||
property.GetName())));
|
||||
ExposeProjectEvents(project, actionRenamer);
|
||||
projectBrowser.ExposeEvents(project, actionRenamer);
|
||||
|
||||
gd::InstructionsTypeRenamer conditionRenamer =
|
||||
gd::InstructionsTypeRenamer(
|
||||
@@ -351,14 +221,14 @@ void WholeProjectRefactorer::RenameEventsFunctionsExtension(
|
||||
eventsBasedBehavior.GetName(),
|
||||
gd::EventsBasedBehavior::GetPropertyConditionName(
|
||||
property.GetName())));
|
||||
ExposeProjectEvents(project, conditionRenamer);
|
||||
projectBrowser.ExposeEvents(project, conditionRenamer);
|
||||
|
||||
// Nothing to do for expressions, expressions are not including the
|
||||
// extension name
|
||||
};
|
||||
|
||||
auto renameBehaviorSharedPropertyFunctions =
|
||||
[&project, &oldName, &newName](
|
||||
[&project, &oldName, &newName, &projectBrowser](
|
||||
const gd::EventsBasedBehavior& eventsBasedBehavior,
|
||||
const gd::NamedPropertyDescriptor& property) {
|
||||
gd::InstructionsTypeRenamer actionRenamer = gd::InstructionsTypeRenamer(
|
||||
@@ -373,7 +243,7 @@ void WholeProjectRefactorer::RenameEventsFunctionsExtension(
|
||||
eventsBasedBehavior.GetName(),
|
||||
gd::EventsBasedBehavior::GetSharedPropertyActionName(
|
||||
property.GetName())));
|
||||
ExposeProjectEvents(project, actionRenamer);
|
||||
projectBrowser.ExposeEvents(project, actionRenamer);
|
||||
|
||||
gd::InstructionsTypeRenamer conditionRenamer =
|
||||
gd::InstructionsTypeRenamer(
|
||||
@@ -388,14 +258,14 @@ void WholeProjectRefactorer::RenameEventsFunctionsExtension(
|
||||
eventsBasedBehavior.GetName(),
|
||||
gd::EventsBasedBehavior::GetSharedPropertyConditionName(
|
||||
property.GetName())));
|
||||
ExposeProjectEvents(project, conditionRenamer);
|
||||
projectBrowser.ExposeEvents(project, conditionRenamer);
|
||||
|
||||
// Nothing to do for expressions, expressions are not including the
|
||||
// extension name
|
||||
};
|
||||
|
||||
auto renameObjectEventsFunction =
|
||||
[&project, &oldName, &newName](
|
||||
[&project, &oldName, &newName, &projectBrowser](
|
||||
const gd::EventsBasedObject& eventsBasedObject,
|
||||
const gd::EventsFunction& eventsFunction) {
|
||||
if (eventsFunction.IsExpression()) {
|
||||
@@ -410,12 +280,12 @@ void WholeProjectRefactorer::RenameEventsFunctionsExtension(
|
||||
gd::PlatformExtension::GetObjectEventsFunctionFullType(newName,
|
||||
eventsBasedObject.GetName(),
|
||||
eventsFunction.GetName()));
|
||||
ExposeProjectEvents(project, renamer);
|
||||
projectBrowser.ExposeEvents(project, renamer);
|
||||
}
|
||||
};
|
||||
|
||||
auto renameObjectPropertyFunctions =
|
||||
[&project, &oldName, &newName](
|
||||
[&project, &oldName, &newName, &projectBrowser](
|
||||
const gd::EventsBasedObject& eventsBasedObject,
|
||||
const gd::NamedPropertyDescriptor& property) {
|
||||
gd::InstructionsTypeRenamer actionRenamer = gd::InstructionsTypeRenamer(
|
||||
@@ -430,7 +300,7 @@ void WholeProjectRefactorer::RenameEventsFunctionsExtension(
|
||||
eventsBasedObject.GetName(),
|
||||
gd::EventsBasedObject::GetPropertyActionName(
|
||||
property.GetName())));
|
||||
ExposeProjectEvents(project, actionRenamer);
|
||||
projectBrowser.ExposeEvents(project, actionRenamer);
|
||||
|
||||
gd::InstructionsTypeRenamer conditionRenamer =
|
||||
gd::InstructionsTypeRenamer(
|
||||
@@ -445,7 +315,7 @@ void WholeProjectRefactorer::RenameEventsFunctionsExtension(
|
||||
eventsBasedObject.GetName(),
|
||||
gd::EventsBasedObject::GetPropertyConditionName(
|
||||
property.GetName())));
|
||||
ExposeProjectEvents(project, conditionRenamer);
|
||||
projectBrowser.ExposeEvents(project, conditionRenamer);
|
||||
|
||||
// Nothing to do for expressions, expressions are not including the
|
||||
// extension name
|
||||
@@ -533,7 +403,8 @@ void WholeProjectRefactorer::RenameEventsFunctionsExtension(
|
||||
DoRenameBehavior(
|
||||
project,
|
||||
gd::PlatformExtension::GetBehaviorFullType(oldName, eventsBasedBehavior->GetName()),
|
||||
gd::PlatformExtension::GetBehaviorFullType(newName, eventsBasedBehavior->GetName()));
|
||||
gd::PlatformExtension::GetBehaviorFullType(newName, eventsBasedBehavior->GetName()),
|
||||
projectBrowser);
|
||||
}
|
||||
|
||||
// Finally, rename custom objects type
|
||||
@@ -542,7 +413,8 @@ void WholeProjectRefactorer::RenameEventsFunctionsExtension(
|
||||
DoRenameObject(
|
||||
project,
|
||||
gd::PlatformExtension::GetObjectFullType(oldName, eventsBasedObject->GetName()),
|
||||
gd::PlatformExtension::GetObjectFullType(newName, eventsBasedObject->GetName()));
|
||||
gd::PlatformExtension::GetObjectFullType(newName, eventsBasedObject->GetName()),
|
||||
projectBrowser);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -556,13 +428,15 @@ void WholeProjectRefactorer::RenameEventsFunction(
|
||||
const gd::EventsFunction& eventsFunction =
|
||||
eventsFunctionsExtension.GetEventsFunction(oldFunctionName);
|
||||
|
||||
const WholeProjectBrowser wholeProjectExposer;
|
||||
DoRenameEventsFunction(
|
||||
project,
|
||||
eventsFunction,
|
||||
gd::PlatformExtension::GetEventsFunctionFullType(eventsFunctionsExtension.GetName(),
|
||||
oldFunctionName),
|
||||
gd::PlatformExtension::GetEventsFunctionFullType(eventsFunctionsExtension.GetName(),
|
||||
newFunctionName));
|
||||
newFunctionName),
|
||||
wholeProjectExposer);
|
||||
|
||||
if (eventsFunction.GetFunctionType() == gd::EventsFunction::ExpressionAndCondition) {
|
||||
for (auto&& otherFunction : eventsFunctionsExtension.GetInternalVector())
|
||||
@@ -598,7 +472,7 @@ void WholeProjectRefactorer::RenameBehaviorEventsFunction(
|
||||
eventsBasedBehavior.GetName()),
|
||||
oldFunctionName,
|
||||
newFunctionName);
|
||||
ExposeProjectEvents(project, renamer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, renamer);
|
||||
}
|
||||
if (eventsFunction.IsAction() || eventsFunction.IsCondition()) {
|
||||
gd::InstructionsTypeRenamer renamer = gd::InstructionsTypeRenamer(
|
||||
@@ -609,7 +483,7 @@ void WholeProjectRefactorer::RenameBehaviorEventsFunction(
|
||||
gd::PlatformExtension::GetBehaviorEventsFunctionFullType(eventsFunctionsExtension.GetName(),
|
||||
eventsBasedBehavior.GetName(),
|
||||
newFunctionName));
|
||||
ExposeProjectEvents(project, renamer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, renamer);
|
||||
}
|
||||
if (eventsFunction.GetFunctionType() == gd::EventsFunction::ExpressionAndCondition) {
|
||||
for (auto&& otherFunction : eventsBasedBehavior.GetEventsFunctions().GetInternalVector())
|
||||
@@ -642,7 +516,7 @@ void WholeProjectRefactorer::RenameObjectEventsFunction(
|
||||
eventsBasedObject.GetName()),
|
||||
oldFunctionName,
|
||||
newFunctionName);
|
||||
ExposeProjectEvents(project, renamer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, renamer);
|
||||
}
|
||||
if (eventsFunction.IsAction() || eventsFunction.IsCondition()) {
|
||||
gd::InstructionsTypeRenamer renamer = gd::InstructionsTypeRenamer(
|
||||
@@ -653,7 +527,7 @@ void WholeProjectRefactorer::RenameObjectEventsFunction(
|
||||
gd::PlatformExtension::GetObjectEventsFunctionFullType(eventsFunctionsExtension.GetName(),
|
||||
eventsBasedObject.GetName(),
|
||||
newFunctionName));
|
||||
ExposeProjectEvents(project, renamer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, renamer);
|
||||
}
|
||||
if (eventsFunction.GetFunctionType() == gd::EventsFunction::ExpressionAndCondition) {
|
||||
for (auto&& otherFunction : eventsBasedObject.GetEventsFunctions().GetInternalVector())
|
||||
@@ -685,7 +559,7 @@ void WholeProjectRefactorer::MoveEventsFunctionParameter(
|
||||
gd::ExpressionsParameterMover(project.GetCurrentPlatform());
|
||||
mover.SetFreeExpressionMovedParameter(
|
||||
eventsFunctionType, oldIndex, newIndex);
|
||||
ExposeProjectEvents(project, mover);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, mover);
|
||||
}
|
||||
if (eventsFunction.IsAction() || eventsFunction.IsCondition()) {
|
||||
const int operatorIndexOffset = eventsFunction.IsExpression() ? 2 : 0;
|
||||
@@ -694,7 +568,7 @@ void WholeProjectRefactorer::MoveEventsFunctionParameter(
|
||||
eventsFunctionType,
|
||||
oldIndex + operatorIndexOffset,
|
||||
newIndex + operatorIndexOffset);
|
||||
ExposeProjectEvents(project, mover);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, mover);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -725,7 +599,7 @@ void WholeProjectRefactorer::MoveBehaviorEventsFunctionParameter(
|
||||
functionName,
|
||||
oldIndex,
|
||||
newIndex);
|
||||
ExposeProjectEvents(project, mover);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, mover);
|
||||
}
|
||||
if (eventsFunction.IsAction() || eventsFunction.IsCondition()) {
|
||||
const int operatorIndexOffset = eventsFunction.IsExpression() ? 2 : 0;
|
||||
@@ -734,7 +608,7 @@ void WholeProjectRefactorer::MoveBehaviorEventsFunctionParameter(
|
||||
eventsFunctionType,
|
||||
oldIndex + operatorIndexOffset,
|
||||
newIndex + operatorIndexOffset);
|
||||
ExposeProjectEvents(project, mover);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, mover);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -765,7 +639,7 @@ void WholeProjectRefactorer::MoveObjectEventsFunctionParameter(
|
||||
functionName,
|
||||
oldIndex,
|
||||
newIndex);
|
||||
ExposeProjectEvents(project, mover);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, mover);
|
||||
}
|
||||
if (eventsFunction.IsAction() || eventsFunction.IsCondition()) {
|
||||
const int operatorIndexOffset = eventsFunction.IsExpression() ? 2 : 0;
|
||||
@@ -774,7 +648,7 @@ void WholeProjectRefactorer::MoveObjectEventsFunctionParameter(
|
||||
eventsFunctionType,
|
||||
oldIndex + operatorIndexOffset,
|
||||
newIndex + operatorIndexOffset);
|
||||
ExposeProjectEvents(project, mover);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, mover);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -800,7 +674,7 @@ void WholeProjectRefactorer::RenameEventsBasedBehaviorProperty(
|
||||
oldPropertyName,
|
||||
newPropertyName);
|
||||
|
||||
ExposeEventsBasedBehaviorEvents(
|
||||
gd::ProjectBrowserHelper::ExposeEventsBasedBehaviorEvents(
|
||||
project, eventsBasedBehavior, behaviorRenamer);
|
||||
} else {
|
||||
// Properties that represent primitive values will be used through
|
||||
@@ -816,7 +690,7 @@ void WholeProjectRefactorer::RenameEventsBasedBehaviorProperty(
|
||||
eventsBasedBehavior.GetName()),
|
||||
EventsBasedBehavior::GetPropertyExpressionName(oldPropertyName),
|
||||
EventsBasedBehavior::GetPropertyExpressionName(newPropertyName));
|
||||
ExposeProjectEvents(project, expressionRenamer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, expressionRenamer);
|
||||
|
||||
gd::InstructionsTypeRenamer actionRenamer = gd::InstructionsTypeRenamer(
|
||||
project,
|
||||
@@ -828,7 +702,7 @@ void WholeProjectRefactorer::RenameEventsBasedBehaviorProperty(
|
||||
eventsFunctionsExtension.GetName(),
|
||||
eventsBasedBehavior.GetName(),
|
||||
EventsBasedBehavior::GetPropertyActionName(newPropertyName)));
|
||||
ExposeProjectEvents(project, actionRenamer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, actionRenamer);
|
||||
|
||||
gd::InstructionsTypeRenamer conditionRenamer = gd::InstructionsTypeRenamer(
|
||||
project,
|
||||
@@ -840,7 +714,7 @@ void WholeProjectRefactorer::RenameEventsBasedBehaviorProperty(
|
||||
eventsFunctionsExtension.GetName(),
|
||||
eventsBasedBehavior.GetName(),
|
||||
EventsBasedBehavior::GetPropertyConditionName(newPropertyName)));
|
||||
ExposeProjectEvents(project, conditionRenamer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, conditionRenamer);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -866,7 +740,7 @@ void WholeProjectRefactorer::RenameEventsBasedBehaviorSharedProperty(
|
||||
oldPropertyName,
|
||||
newPropertyName);
|
||||
|
||||
ExposeEventsBasedBehaviorEvents(
|
||||
gd::ProjectBrowserHelper::ExposeEventsBasedBehaviorEvents(
|
||||
project, eventsBasedBehavior, behaviorRenamer);
|
||||
} else {
|
||||
// Properties that represent primitive values will be used through
|
||||
@@ -882,7 +756,7 @@ void WholeProjectRefactorer::RenameEventsBasedBehaviorSharedProperty(
|
||||
eventsBasedBehavior.GetName()),
|
||||
EventsBasedBehavior::GetSharedPropertyExpressionName(oldPropertyName),
|
||||
EventsBasedBehavior::GetSharedPropertyExpressionName(newPropertyName));
|
||||
ExposeProjectEvents(project, expressionRenamer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, expressionRenamer);
|
||||
|
||||
gd::InstructionsTypeRenamer actionRenamer = gd::InstructionsTypeRenamer(
|
||||
project,
|
||||
@@ -894,7 +768,7 @@ void WholeProjectRefactorer::RenameEventsBasedBehaviorSharedProperty(
|
||||
eventsFunctionsExtension.GetName(),
|
||||
eventsBasedBehavior.GetName(),
|
||||
EventsBasedBehavior::GetSharedPropertyActionName(newPropertyName)));
|
||||
ExposeProjectEvents(project, actionRenamer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, actionRenamer);
|
||||
|
||||
gd::InstructionsTypeRenamer conditionRenamer = gd::InstructionsTypeRenamer(
|
||||
project,
|
||||
@@ -906,7 +780,7 @@ void WholeProjectRefactorer::RenameEventsBasedBehaviorSharedProperty(
|
||||
eventsFunctionsExtension.GetName(),
|
||||
eventsBasedBehavior.GetName(),
|
||||
EventsBasedBehavior::GetSharedPropertyConditionName(newPropertyName)));
|
||||
ExposeProjectEvents(project, conditionRenamer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, conditionRenamer);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -932,7 +806,7 @@ void WholeProjectRefactorer::RenameEventsBasedObjectProperty(
|
||||
eventsBasedObject.GetName()),
|
||||
EventsBasedObject::GetPropertyExpressionName(oldPropertyName),
|
||||
EventsBasedObject::GetPropertyExpressionName(newPropertyName));
|
||||
ExposeProjectEvents(project, expressionRenamer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, expressionRenamer);
|
||||
|
||||
gd::InstructionsTypeRenamer actionRenamer = gd::InstructionsTypeRenamer(
|
||||
project,
|
||||
@@ -944,7 +818,7 @@ void WholeProjectRefactorer::RenameEventsBasedObjectProperty(
|
||||
eventsFunctionsExtension.GetName(),
|
||||
eventsBasedObject.GetName(),
|
||||
EventsBasedObject::GetPropertyActionName(newPropertyName)));
|
||||
ExposeProjectEvents(project, actionRenamer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, actionRenamer);
|
||||
|
||||
gd::InstructionsTypeRenamer conditionRenamer = gd::InstructionsTypeRenamer(
|
||||
project,
|
||||
@@ -956,7 +830,7 @@ void WholeProjectRefactorer::RenameEventsBasedObjectProperty(
|
||||
eventsFunctionsExtension.GetName(),
|
||||
eventsBasedObject.GetName(),
|
||||
EventsBasedObject::GetPropertyConditionName(newPropertyName)));
|
||||
ExposeProjectEvents(project, conditionRenamer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, conditionRenamer);
|
||||
}
|
||||
|
||||
void WholeProjectRefactorer::AddBehaviorAndRequiredBehaviors(
|
||||
@@ -1197,7 +1071,7 @@ void WholeProjectRefactorer::RenameEventsBasedBehavior(
|
||||
eventsFunctionsExtension.GetName(),
|
||||
newBehaviorName,
|
||||
eventsFunction.GetName()));
|
||||
ExposeProjectEvents(project, renamer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, renamer);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1217,7 +1091,7 @@ void WholeProjectRefactorer::RenameEventsBasedBehavior(
|
||||
eventsFunctionsExtension.GetName(),
|
||||
newBehaviorName,
|
||||
EventsBasedBehavior::GetPropertyActionName(property.GetName())));
|
||||
ExposeProjectEvents(project, actionRenamer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, actionRenamer);
|
||||
|
||||
gd::InstructionsTypeRenamer conditionRenamer = gd::InstructionsTypeRenamer(
|
||||
project,
|
||||
@@ -1229,7 +1103,7 @@ void WholeProjectRefactorer::RenameEventsBasedBehavior(
|
||||
eventsFunctionsExtension.GetName(),
|
||||
newBehaviorName,
|
||||
EventsBasedBehavior::GetPropertyConditionName(property.GetName())));
|
||||
ExposeProjectEvents(project, conditionRenamer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, conditionRenamer);
|
||||
|
||||
// Nothing to do for expression, expressions are not including the name of
|
||||
// the behavior
|
||||
@@ -1251,7 +1125,7 @@ void WholeProjectRefactorer::RenameEventsBasedBehavior(
|
||||
eventsFunctionsExtension.GetName(),
|
||||
newBehaviorName,
|
||||
EventsBasedBehavior::GetSharedPropertyActionName(property.GetName())));
|
||||
ExposeProjectEvents(project, actionRenamer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, actionRenamer);
|
||||
|
||||
gd::InstructionsTypeRenamer conditionRenamer = gd::InstructionsTypeRenamer(
|
||||
project,
|
||||
@@ -1263,7 +1137,7 @@ void WholeProjectRefactorer::RenameEventsBasedBehavior(
|
||||
eventsFunctionsExtension.GetName(),
|
||||
newBehaviorName,
|
||||
EventsBasedBehavior::GetSharedPropertyConditionName(property.GetName())));
|
||||
ExposeProjectEvents(project, conditionRenamer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, conditionRenamer);
|
||||
|
||||
// Nothing to do for expression, expressions are not including the name of
|
||||
// the behavior
|
||||
@@ -1296,10 +1170,12 @@ void WholeProjectRefactorer::RenameEventsBasedBehavior(
|
||||
renameBehaviorSharedProperty(*property);
|
||||
}
|
||||
|
||||
const WholeProjectBrowser wholeProjectExposer;
|
||||
DoRenameBehavior(
|
||||
project,
|
||||
gd::PlatformExtension::GetBehaviorFullType(eventsFunctionsExtension.GetName(), oldBehaviorName),
|
||||
gd::PlatformExtension::GetBehaviorFullType(eventsFunctionsExtension.GetName(), newBehaviorName));
|
||||
gd::PlatformExtension::GetBehaviorFullType(eventsFunctionsExtension.GetName(), newBehaviorName),
|
||||
wholeProjectExposer);
|
||||
}
|
||||
|
||||
void WholeProjectRefactorer::RenameEventsBasedObject(
|
||||
@@ -1336,7 +1212,7 @@ void WholeProjectRefactorer::RenameEventsBasedObject(
|
||||
eventsFunctionsExtension.GetName(),
|
||||
newObjectName,
|
||||
eventsFunction.GetName()));
|
||||
ExposeProjectEvents(project, renamer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, renamer);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1356,7 +1232,7 @@ void WholeProjectRefactorer::RenameEventsBasedObject(
|
||||
eventsFunctionsExtension.GetName(),
|
||||
newObjectName,
|
||||
EventsBasedObject::GetPropertyActionName(property.GetName())));
|
||||
ExposeProjectEvents(project, actionRenamer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, actionRenamer);
|
||||
|
||||
gd::InstructionsTypeRenamer conditionRenamer = gd::InstructionsTypeRenamer(
|
||||
project,
|
||||
@@ -1368,7 +1244,7 @@ void WholeProjectRefactorer::RenameEventsBasedObject(
|
||||
eventsFunctionsExtension.GetName(),
|
||||
newObjectName,
|
||||
EventsBasedObject::GetPropertyConditionName(property.GetName())));
|
||||
ExposeProjectEvents(project, conditionRenamer);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, conditionRenamer);
|
||||
|
||||
// Nothing to do for expression, expressions are not including the name of
|
||||
// the object
|
||||
@@ -1399,17 +1275,20 @@ void WholeProjectRefactorer::RenameEventsBasedObject(
|
||||
renameObjectProperty(*property);
|
||||
}
|
||||
|
||||
const WholeProjectBrowser wholeProjectExposer;
|
||||
DoRenameObject(
|
||||
project,
|
||||
gd::PlatformExtension::GetObjectFullType(eventsFunctionsExtension.GetName(), oldObjectName),
|
||||
gd::PlatformExtension::GetObjectFullType(eventsFunctionsExtension.GetName(), newObjectName));
|
||||
gd::PlatformExtension::GetObjectFullType(eventsFunctionsExtension.GetName(), newObjectName),
|
||||
wholeProjectExposer);
|
||||
}
|
||||
|
||||
void WholeProjectRefactorer::DoRenameEventsFunction(
|
||||
gd::Project& project,
|
||||
const gd::EventsFunction& eventsFunction,
|
||||
const gd::String& oldFullType,
|
||||
const gd::String& newFullType) {
|
||||
const gd::String& newFullType,
|
||||
const gd::ProjectBrowser& projectBrowser) {
|
||||
// Order is important: we first rename the expressions then the instructions,
|
||||
// to avoid being unable to fetch the metadata (the types of parameters) of
|
||||
// instructions after they are renamed.
|
||||
@@ -1417,165 +1296,61 @@ void WholeProjectRefactorer::DoRenameEventsFunction(
|
||||
gd::ExpressionsRenamer renamer =
|
||||
gd::ExpressionsRenamer(project.GetCurrentPlatform());
|
||||
renamer.SetReplacedFreeExpression(oldFullType, newFullType);
|
||||
ExposeProjectEvents(project, renamer);
|
||||
projectBrowser.ExposeEvents(project, renamer);
|
||||
}
|
||||
if (eventsFunction.IsAction() || eventsFunction.IsCondition()) {
|
||||
gd::InstructionsTypeRenamer renamer =
|
||||
gd::InstructionsTypeRenamer(project, oldFullType, newFullType);
|
||||
ExposeProjectEvents(project, renamer);
|
||||
projectBrowser.ExposeEvents(project, renamer);
|
||||
}
|
||||
}
|
||||
|
||||
void WholeProjectRefactorer::DoRenameBehavior(
|
||||
gd::Project& project,
|
||||
const gd::String& oldBehaviorType,
|
||||
const gd::String& newBehaviorType) {
|
||||
auto renameBehaviorTypeInBehaviorContent =
|
||||
[&oldBehaviorType,
|
||||
&newBehaviorType](gd::BehaviorConfigurationContainer& behavior) {
|
||||
if (behavior.GetTypeName() == oldBehaviorType) {
|
||||
behavior.SetTypeName(newBehaviorType);
|
||||
}
|
||||
};
|
||||
auto renameBehaviorTypeInParameters =
|
||||
[&oldBehaviorType, &newBehaviorType](gd::EventsFunction& eventsFunction) {
|
||||
for (auto& parameter : eventsFunction.GetParameters()) {
|
||||
if (gd::ParameterMetadata::IsBehavior(parameter.GetType()) &&
|
||||
parameter.GetExtraInfo() == oldBehaviorType) {
|
||||
parameter.SetExtraInfo(newBehaviorType);
|
||||
}
|
||||
}
|
||||
};
|
||||
gd::Project &project, const gd::String &oldBehaviorType,
|
||||
const gd::String &newBehaviorType,
|
||||
const gd::ProjectBrowser &projectBrowser) {
|
||||
|
||||
// Rename behavior in required behavior properties
|
||||
for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount();
|
||||
e++) {
|
||||
auto& eventsFunctionsExtension = project.GetEventsFunctionsExtension(e);
|
||||
auto requiredBehaviorRenamer =
|
||||
gd::RequiredBehaviorRenamer(oldBehaviorType, newBehaviorType);
|
||||
projectBrowser.ExposeEventBasedBehaviors(project, requiredBehaviorRenamer);
|
||||
|
||||
for (auto&& eventsBasedBehavior :
|
||||
eventsFunctionsExtension.GetEventsBasedBehaviors()
|
||||
.GetInternalVector()) {
|
||||
for (size_t i = 0;
|
||||
i < eventsBasedBehavior->GetPropertyDescriptors().GetCount();
|
||||
i++) {
|
||||
NamedPropertyDescriptor& propertyDescriptor =
|
||||
eventsBasedBehavior->GetPropertyDescriptors().Get(i);
|
||||
std::vector<gd::String>& extraInfo = propertyDescriptor.GetExtraInfo();
|
||||
if (propertyDescriptor.GetType() == "Behavior" &&
|
||||
extraInfo.size() > 0) {
|
||||
const gd::String& requiredBehaviorType = extraInfo[0];
|
||||
if (requiredBehaviorType == oldBehaviorType) {
|
||||
extraInfo[0] = newBehaviorType;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Rename behavior in objects lists.
|
||||
auto behaviorTypeRenamer = gd::BehaviorTypeRenamer(
|
||||
project,
|
||||
oldBehaviorType,
|
||||
newBehaviorType);
|
||||
ExposeProjectObjects(project, behaviorTypeRenamer);
|
||||
auto behaviorTypeRenamer =
|
||||
gd::BehaviorTypeRenamer(oldBehaviorType, newBehaviorType);
|
||||
projectBrowser.ExposeObjects(project, behaviorTypeRenamer);
|
||||
|
||||
// Rename behavior in layout behavior shared data.
|
||||
for (std::size_t i = 0; i < project.GetLayoutsCount(); ++i) {
|
||||
gd::Layout& layout = project.GetLayout(i);
|
||||
|
||||
for (auto& behaviorSharedDataContent : layout.GetAllBehaviorSharedData()) {
|
||||
renameBehaviorTypeInBehaviorContent(*behaviorSharedDataContent.second);
|
||||
}
|
||||
}
|
||||
auto sharedDataBehaviorTypeRenamer =
|
||||
gd::BehaviorsSharedDataBehaviorTypeRenamer(oldBehaviorType, newBehaviorType);
|
||||
projectBrowser.ExposeBehaviorSharedDatas(project, sharedDataBehaviorTypeRenamer);
|
||||
|
||||
// Rename in parameters of (free/behavior) events function
|
||||
for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount();
|
||||
e++) {
|
||||
auto& eventsFunctionsExtension = project.GetEventsFunctionsExtension(e);
|
||||
for (auto&& eventsFunction : eventsFunctionsExtension.GetInternalVector()) {
|
||||
renameBehaviorTypeInParameters(*eventsFunction);
|
||||
}
|
||||
|
||||
for (auto&& eventsBasedBehavior :
|
||||
eventsFunctionsExtension.GetEventsBasedBehaviors()
|
||||
.GetInternalVector()) {
|
||||
auto& behaviorEventsFunctions = eventsBasedBehavior->GetEventsFunctions();
|
||||
for (auto&& eventsFunction :
|
||||
behaviorEventsFunctions.GetInternalVector()) {
|
||||
renameBehaviorTypeInParameters(*eventsFunction);
|
||||
}
|
||||
}
|
||||
|
||||
for (auto&& eventsBasedObject :
|
||||
eventsFunctionsExtension.GetEventsBasedObjects()
|
||||
.GetInternalVector()) {
|
||||
auto& behaviorEventsFunctions = eventsBasedObject->GetEventsFunctions();
|
||||
for (auto&& eventsFunction :
|
||||
behaviorEventsFunctions.GetInternalVector()) {
|
||||
renameBehaviorTypeInParameters(*eventsFunction);
|
||||
}
|
||||
}
|
||||
}
|
||||
auto behaviorParameterRenamer = gd::FunctionParameterBehaviorTypeRenamer(
|
||||
oldBehaviorType, newBehaviorType);
|
||||
projectBrowser.ExposeFunctions(project, behaviorParameterRenamer);
|
||||
}
|
||||
|
||||
void WholeProjectRefactorer::DoRenameObject(
|
||||
gd::Project& project,
|
||||
const gd::String& oldObjectType,
|
||||
const gd::String& newObjectType) {
|
||||
const gd::String& newObjectType,
|
||||
const gd::ProjectBrowser& projectBrowser) {
|
||||
|
||||
auto customObjectTypeRenamer = gd::CustomObjectTypeRenamer(
|
||||
project,
|
||||
oldObjectType,
|
||||
newObjectType);
|
||||
ExposeProjectObjects(project, customObjectTypeRenamer);
|
||||
// Rename object type in objects lists.
|
||||
auto customObjectTypeRenamer =
|
||||
gd::CustomObjectTypeRenamer(oldObjectType, newObjectType);
|
||||
projectBrowser.ExposeObjects(project, customObjectTypeRenamer);
|
||||
|
||||
auto renameObjectTypeInParameters =
|
||||
[&oldObjectType, &newObjectType](gd::EventsFunction& eventsFunction) {
|
||||
for (auto& parameter : eventsFunction.GetParameters()) {
|
||||
if (gd::ParameterMetadata::IsObject(parameter.GetType()) &&
|
||||
parameter.GetExtraInfo() == oldObjectType) {
|
||||
parameter.SetExtraInfo(newObjectType);
|
||||
}
|
||||
}
|
||||
};
|
||||
// Rename in behaviors object type.
|
||||
auto behaviorObjectTypeRenamer =
|
||||
gd::BehaviorObjectTypeRenamer(oldObjectType, newObjectType);
|
||||
projectBrowser.ExposeEventBasedBehaviors(project, behaviorObjectTypeRenamer);
|
||||
|
||||
// Rename in parameters of (free/behavior) events function
|
||||
for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount();
|
||||
e++) {
|
||||
auto& eventsFunctionsExtension = project.GetEventsFunctionsExtension(e);
|
||||
|
||||
// Behavior object types
|
||||
for (auto&& eventsBasedBehavior :
|
||||
eventsFunctionsExtension.GetEventsBasedBehaviors().GetInternalVector()) {
|
||||
if (eventsBasedBehavior->GetObjectType() == oldObjectType) {
|
||||
eventsBasedBehavior->SetObjectType(newObjectType);
|
||||
}
|
||||
}
|
||||
|
||||
for (auto&& eventsFunction : eventsFunctionsExtension.GetInternalVector()) {
|
||||
renameObjectTypeInParameters(*eventsFunction);
|
||||
}
|
||||
|
||||
for (auto&& eventsBasedBehavior :
|
||||
eventsFunctionsExtension.GetEventsBasedBehaviors()
|
||||
.GetInternalVector()) {
|
||||
auto& behaviorEventsFunctions = eventsBasedBehavior->GetEventsFunctions();
|
||||
for (auto&& eventsFunction :
|
||||
behaviorEventsFunctions.GetInternalVector()) {
|
||||
renameObjectTypeInParameters(*eventsFunction);
|
||||
}
|
||||
}
|
||||
|
||||
for (auto&& eventsBasedObject :
|
||||
eventsFunctionsExtension.GetEventsBasedObjects()
|
||||
.GetInternalVector()) {
|
||||
auto& behaviorEventsFunctions = eventsBasedObject->GetEventsFunctions();
|
||||
for (auto&& eventsFunction :
|
||||
behaviorEventsFunctions.GetInternalVector()) {
|
||||
renameObjectTypeInParameters(*eventsFunction);
|
||||
}
|
||||
}
|
||||
}
|
||||
auto objectParameterRenamer =
|
||||
gd::FunctionParameterObjectTypeRenamer(oldObjectType, newObjectType);
|
||||
projectBrowser.ExposeFunctions(project, objectParameterRenamer);
|
||||
}
|
||||
|
||||
void WholeProjectRefactorer::ObjectOrGroupRemovedInLayout(
|
||||
|
@@ -3,8 +3,8 @@
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#ifndef GDCORE_WHOLEPROJECTREFACTORER_H
|
||||
#define GDCORE_WHOLEPROJECTREFACTORER_H
|
||||
#pragma once
|
||||
|
||||
#include <set>
|
||||
#include <unordered_set>
|
||||
#include <vector>
|
||||
@@ -21,10 +21,14 @@ class EventsBasedBehavior;
|
||||
class EventsBasedObject;
|
||||
class ArbitraryEventsWorker;
|
||||
class ArbitraryObjectsWorker;
|
||||
class ArbitraryEventsFunctionsWorker;
|
||||
class ArbitraryEventsWorkerWithContext;
|
||||
class ArbitraryEventBasedBehaviorsWorker;
|
||||
class ArbitraryBehaviorSharedDataWorker;
|
||||
class Behavior;
|
||||
class BehaviorMetadata;
|
||||
class UnfilledRequiredBehaviorPropertyProblem;
|
||||
class ProjectBrowser;
|
||||
} // namespace gd
|
||||
|
||||
namespace gd {
|
||||
@@ -39,54 +43,6 @@ namespace gd {
|
||||
*/
|
||||
class GD_CORE_API WholeProjectRefactorer {
|
||||
public:
|
||||
/**
|
||||
* \brief Call the specified worker on all events of the project (layout,
|
||||
* external events, events functions...)
|
||||
*
|
||||
* This should be the preferred way to traverse all the events of a project.
|
||||
*/
|
||||
static void ExposeProjectEvents(gd::Project& project,
|
||||
gd::ArbitraryEventsWorker& worker);
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all events of the project (layout,
|
||||
* external events, events functions...)
|
||||
*
|
||||
* This should be the preferred way to traverse all the events of a project.
|
||||
*/
|
||||
static void ExposeProjectEvents(gd::Project& project,
|
||||
gd::ArbitraryEventsWorkerWithContext& worker);
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all events of the events based behavior
|
||||
*
|
||||
* This should be the preferred way to traverse all the events of an events
|
||||
* based behavior.
|
||||
*/
|
||||
static void ExposeEventsBasedBehaviorEvents(
|
||||
gd::Project& project,
|
||||
const gd::EventsBasedBehavior& eventsBasedBehavior,
|
||||
gd::ArbitraryEventsWorkerWithContext& worker);
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all events of the events based object
|
||||
*
|
||||
* This should be the preferred way to traverse all the events of an events
|
||||
* based object.
|
||||
*/
|
||||
static void ExposeEventsBasedObjectEvents(
|
||||
gd::Project& project,
|
||||
const gd::EventsBasedObject& eventsBasedObject,
|
||||
gd::ArbitraryEventsWorkerWithContext& worker);
|
||||
|
||||
/**
|
||||
* \brief Call the specified worker on all ObjectContainers of the project
|
||||
* (global, layouts...)
|
||||
*
|
||||
* This should be the preferred way to traverse all the objects of a project.
|
||||
*/
|
||||
static void ExposeProjectObjects(gd::Project& project,
|
||||
gd::ArbitraryObjectsWorker& worker);
|
||||
|
||||
/**
|
||||
* \brief Refactor the project **before** an events function extension is
|
||||
@@ -102,6 +58,16 @@ class GD_CORE_API WholeProjectRefactorer {
|
||||
const gd::String& oldName,
|
||||
const gd::String& newName);
|
||||
|
||||
/**
|
||||
* \brief Refactor behavior events after the extension was placed in a new
|
||||
* extension.
|
||||
*/
|
||||
static void UpdateExtensionNameInEventsBasedBehavior(
|
||||
gd::Project& project,
|
||||
const gd::EventsFunctionsExtension& eventsFunctionsExtension,
|
||||
gd::EventsBasedBehavior& eventsBasedBehavior,
|
||||
const gd::String& sourceExtensionName);
|
||||
|
||||
/**
|
||||
* \brief Refactor the project **before** an events function is renamed.
|
||||
*
|
||||
@@ -439,15 +405,33 @@ class GD_CORE_API WholeProjectRefactorer {
|
||||
static void DoRenameEventsFunction(gd::Project& project,
|
||||
const gd::EventsFunction& eventsFunction,
|
||||
const gd::String& oldFullType,
|
||||
const gd::String& newFullType);
|
||||
const gd::String& newFullType,
|
||||
const gd::ProjectBrowser& projectBrowser);
|
||||
|
||||
static void DoRenameBehavior(gd::Project& project,
|
||||
const gd::String& oldBehaviorType,
|
||||
const gd::String& newBehaviorType);
|
||||
const gd::String& newBehaviorType,
|
||||
const gd::ProjectBrowser& projectBrowser);
|
||||
|
||||
static void DoRenameObject(gd::Project& project,
|
||||
const gd::String& oldObjectType,
|
||||
const gd::String& newObjectType);
|
||||
const gd::String& newObjectType,
|
||||
const gd::ProjectBrowser& projectBrowser);
|
||||
|
||||
/**
|
||||
* \brief Refactor the project **before** an events function extension is
|
||||
* renamed.
|
||||
*
|
||||
* \warning Do the renaming of the specified extension after calling this.
|
||||
* This is because the extension is expected to have its old name for the
|
||||
* refactoring.
|
||||
*/
|
||||
static void RenameEventsFunctionsExtension(
|
||||
gd::Project& project,
|
||||
const gd::EventsFunctionsExtension& eventsFunctionsExtension,
|
||||
const gd::String& oldName,
|
||||
const gd::String& newName,
|
||||
const gd::ProjectBrowser& projectBrowser);
|
||||
|
||||
static void FindDependentBehaviorNames(
|
||||
const gd::Project& project,
|
||||
@@ -462,5 +446,3 @@ class GD_CORE_API WholeProjectRefactorer {
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
|
||||
#endif // GDCORE_WHOLEPROJECTREFACTORER_H
|
||||
|
@@ -151,6 +151,7 @@ class GD_CORE_API AbstractEventsBasedEntity {
|
||||
gd::String description;
|
||||
gd::EventsFunctionsContainer eventsFunctionsContainer;
|
||||
SerializableWithNameList<NamedPropertyDescriptor> propertyDescriptors;
|
||||
gd::String extensionName;
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
|
@@ -43,18 +43,10 @@ std::map<gd::String, gd::PropertyDescriptor> CustomConfigurationHelper::GetPrope
|
||||
const auto &propertyName = property->GetName();
|
||||
const auto &propertyType = property->GetType();
|
||||
|
||||
// TODO Move this into a PropertyDescriptor copy method.
|
||||
auto &newProperty = behaviorProperties[propertyName]
|
||||
.SetType(property->GetType())
|
||||
.SetDescription(property->GetDescription())
|
||||
.SetGroup(property->GetGroup())
|
||||
.SetLabel(property->GetLabel())
|
||||
.SetValue(property->GetValue())
|
||||
.SetHidden(property->IsHidden());
|
||||
// Copy the property
|
||||
behaviorProperties[propertyName] = *property;
|
||||
|
||||
for (auto &extraInfo : property->GetExtraInfo()) {
|
||||
newProperty.AddExtraInfo(extraInfo);
|
||||
}
|
||||
auto &newProperty = behaviorProperties[propertyName];
|
||||
|
||||
if (configurationContent.HasChild(propertyName)) {
|
||||
if (propertyType == "String" || propertyType == "Choice" ||
|
||||
|
@@ -72,6 +72,9 @@ void EventsFunction::SerializeTo(SerializerElement& element) const {
|
||||
if (isPrivate) {
|
||||
element.SetBoolAttribute("private", isPrivate);
|
||||
}
|
||||
if (isAsync) {
|
||||
element.SetBoolAttribute("async", isAsync);
|
||||
}
|
||||
events.SerializeTo(element.AddChild("events"));
|
||||
|
||||
gd::String functionTypeStr = "Action";
|
||||
@@ -115,6 +118,7 @@ void EventsFunction::UnserializeFrom(gd::Project& project,
|
||||
group = element.GetStringAttribute("group");
|
||||
getterName = element.GetStringAttribute("getterName");
|
||||
isPrivate = element.GetBoolAttribute("private");
|
||||
isAsync = element.GetBoolAttribute("async");
|
||||
events.UnserializeFrom(project, element.GetChild("events"));
|
||||
|
||||
gd::String functionTypeStr = element.GetStringAttribute("functionType");
|
||||
|
@@ -211,6 +211,19 @@ class GD_CORE_API EventsFunction {
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Returns true if the function is async.
|
||||
*/
|
||||
bool IsAsync() const { return isAsync; }
|
||||
|
||||
/**
|
||||
* \brief Sets the asycronity of the function.
|
||||
*/
|
||||
EventsFunction& SetAsync(bool _isAsync) {
|
||||
isAsync = _isAsync;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Return the events.
|
||||
*/
|
||||
@@ -291,6 +304,7 @@ class GD_CORE_API EventsFunction {
|
||||
mutable std::vector<gd::ParameterMetadata> actionWithOperationParameters;
|
||||
gd::ObjectGroupsContainer objectGroups;
|
||||
bool isPrivate = false;
|
||||
bool isAsync = false;
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
|
@@ -11,7 +11,7 @@
|
||||
namespace gd {
|
||||
|
||||
LoadingScreen::LoadingScreen()
|
||||
: showGDevelopSplash(true),
|
||||
: showGDevelopLogoDuringLoadingScreen(true),
|
||||
gdevelopLogoStyle("light"),
|
||||
backgroundImageResourceName(""),
|
||||
backgroundColor(0),
|
||||
@@ -27,16 +27,18 @@ LoadingScreen::LoadingScreen()
|
||||
progressBarColor(0xFFFFFF){};
|
||||
|
||||
void LoadingScreen::SerializeTo(SerializerElement& element) const {
|
||||
element.SetAttribute("showGDevelopSplash", showGDevelopSplash);
|
||||
element.SetAttribute("gdevelopLogoStyle",
|
||||
gdevelopLogoStyle);
|
||||
element.SetAttribute("showGDevelopSplash",
|
||||
showGDevelopLogoDuringLoadingScreen);
|
||||
element.SetAttribute("gdevelopLogoStyle", gdevelopLogoStyle);
|
||||
element.SetAttribute("backgroundImageResourceName",
|
||||
backgroundImageResourceName);
|
||||
element.SetAttribute("backgroundColor", backgroundColor);
|
||||
element.SetAttribute("backgroundFadeInDuration", backgroundFadeInDuration);
|
||||
element.SetAttribute("minDuration", minDuration);
|
||||
element.SetAttribute("logoAndProgressFadeInDuration", logoAndProgressFadeInDuration);
|
||||
element.SetAttribute("logoAndProgressLogoFadeInDelay", logoAndProgressLogoFadeInDelay);
|
||||
element.SetAttribute("logoAndProgressFadeInDuration",
|
||||
logoAndProgressFadeInDuration);
|
||||
element.SetAttribute("logoAndProgressLogoFadeInDelay",
|
||||
logoAndProgressLogoFadeInDelay);
|
||||
element.SetAttribute("showProgressBar", showProgressBar);
|
||||
element.SetAttribute("progressBarMinWidth", progressBarMinWidth);
|
||||
element.SetAttribute("progressBarMaxWidth", progressBarMaxWidth);
|
||||
@@ -46,21 +48,24 @@ void LoadingScreen::SerializeTo(SerializerElement& element) const {
|
||||
}
|
||||
|
||||
void LoadingScreen::UnserializeFrom(const SerializerElement& element) {
|
||||
showGDevelopSplash = element.GetBoolAttribute("showGDevelopSplash", true);
|
||||
gdevelopLogoStyle =
|
||||
element.GetStringAttribute("gdevelopLogoStyle", "light");
|
||||
showGDevelopLogoDuringLoadingScreen =
|
||||
element.GetBoolAttribute("showGDevelopSplash", true);
|
||||
gdevelopLogoStyle = element.GetStringAttribute("gdevelopLogoStyle", "light");
|
||||
backgroundImageResourceName =
|
||||
element.GetStringAttribute("backgroundImageResourceName");
|
||||
backgroundColor = element.GetIntAttribute("backgroundColor", 0);
|
||||
backgroundFadeInDuration =
|
||||
element.GetDoubleAttribute("backgroundFadeInDuration", 0.2);
|
||||
minDuration = element.GetDoubleAttribute("minDuration", 1.5);
|
||||
logoAndProgressFadeInDuration = element.GetDoubleAttribute("logoAndProgressFadeInDuration", 0.2);
|
||||
logoAndProgressLogoFadeInDelay = element.GetDoubleAttribute("logoAndProgressLogoFadeInDelay", 0.2);
|
||||
logoAndProgressFadeInDuration =
|
||||
element.GetDoubleAttribute("logoAndProgressFadeInDuration", 0.2);
|
||||
logoAndProgressLogoFadeInDelay =
|
||||
element.GetDoubleAttribute("logoAndProgressLogoFadeInDelay", 0.2);
|
||||
showProgressBar = element.GetBoolAttribute("showProgressBar", true);
|
||||
progressBarMinWidth = element.GetDoubleAttribute("progressBarMinWidth", 40);
|
||||
progressBarMaxWidth = element.GetDoubleAttribute("progressBarMaxWidth", 200);
|
||||
progressBarWidthPercent = element.GetDoubleAttribute("progressBarWidthPercent", 30);
|
||||
progressBarWidthPercent =
|
||||
element.GetDoubleAttribute("progressBarWidthPercent", 30);
|
||||
progressBarHeight = element.GetDoubleAttribute("progressBarHeight", 20);
|
||||
progressBarColor = element.GetIntAttribute("progressBarColor", 0xFFFFFF);
|
||||
}
|
||||
|
@@ -29,13 +29,13 @@ class GD_CORE_API LoadingScreen {
|
||||
* \brief Return true if the GDevelop logo should be shown while loading
|
||||
* assets.
|
||||
*/
|
||||
bool IsGDevelopSplashShown() const { return showGDevelopSplash; };
|
||||
bool IsGDevelopLogoShownDuringLoadingScreen() const { return showGDevelopLogoDuringLoadingScreen; };
|
||||
|
||||
/**
|
||||
* \brief Set if the GDevelop logo should be shown while loading assets.
|
||||
*/
|
||||
LoadingScreen& ShowGDevelopSplash(bool show) {
|
||||
showGDevelopSplash = show;
|
||||
LoadingScreen& ShowGDevelopLogoDuringLoadingScreen(bool show) {
|
||||
showGDevelopLogoDuringLoadingScreen = show;
|
||||
return *this;
|
||||
};
|
||||
|
||||
@@ -157,7 +157,7 @@ class GD_CORE_API LoadingScreen {
|
||||
///@}
|
||||
|
||||
private:
|
||||
bool showGDevelopSplash;
|
||||
bool showGDevelopLogoDuringLoadingScreen;
|
||||
gd::String gdevelopLogoStyle;
|
||||
gd::String backgroundImageResourceName;
|
||||
int backgroundColor;
|
||||
|
@@ -7,6 +7,7 @@
|
||||
#include "GDCore/Serialization/SerializerElement.h"
|
||||
#include "GDCore/String.h"
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
||||
namespace gd {
|
||||
|
||||
@@ -22,6 +23,49 @@ gd::MeasurementUnit MeasurementUnit::pixelAcceleration =
|
||||
CreatePixelAcceleration();
|
||||
gd::MeasurementUnit MeasurementUnit::newton = CreateNewton();
|
||||
gd::MeasurementUnit MeasurementUnit::angularSpeed = CreateAngularSpeed();
|
||||
std::vector<const gd::MeasurementUnit*> MeasurementUnit::defaultMeasurementUnits;
|
||||
|
||||
const std::vector<const gd::MeasurementUnit*> &
|
||||
MeasurementUnit::GetDefaultMeasurementUnits() {
|
||||
if (defaultMeasurementUnits.size() == 0) {
|
||||
defaultMeasurementUnits.push_back(&undefined);
|
||||
defaultMeasurementUnits.push_back(&dimensionless);
|
||||
defaultMeasurementUnits.push_back(°reeAngle);
|
||||
defaultMeasurementUnits.push_back(&second);
|
||||
defaultMeasurementUnits.push_back(&pixel);
|
||||
defaultMeasurementUnits.push_back(&pixelSpeed);
|
||||
defaultMeasurementUnits.push_back(&pixelAcceleration);
|
||||
defaultMeasurementUnits.push_back(&angularSpeed);
|
||||
defaultMeasurementUnits.push_back(&newton);
|
||||
}
|
||||
return defaultMeasurementUnits;
|
||||
}
|
||||
|
||||
std::size_t MeasurementUnit::GetDefaultMeasurementUnitsCount() {
|
||||
return GetDefaultMeasurementUnits().size();
|
||||
}
|
||||
|
||||
const gd::MeasurementUnit &
|
||||
MeasurementUnit::GetDefaultMeasurementUnitAtIndex(std::size_t index) {
|
||||
return *GetDefaultMeasurementUnits().at(index);
|
||||
}
|
||||
|
||||
bool MeasurementUnit::HasDefaultMeasurementUnitNamed(const gd::String &name) {
|
||||
auto units = GetDefaultMeasurementUnits();
|
||||
return std::find_if(units.begin(), units.end(),
|
||||
[name](const gd::MeasurementUnit *unit) -> bool {
|
||||
return unit->GetName() == name;
|
||||
}) != units.end();
|
||||
}
|
||||
|
||||
const gd::MeasurementUnit &
|
||||
MeasurementUnit::GetDefaultMeasurementUnitByName(const gd::String &name) {
|
||||
auto units = GetDefaultMeasurementUnits();
|
||||
return **std::find_if(units.begin(), units.end(),
|
||||
[name](const gd::MeasurementUnit *unit) -> bool {
|
||||
return unit->GetName() == name;
|
||||
});
|
||||
}
|
||||
|
||||
void MeasurementUnit::ApplyTranslation() {
|
||||
undefined = CreateUndefined();
|
||||
@@ -33,6 +77,7 @@ void MeasurementUnit::ApplyTranslation() {
|
||||
pixelAcceleration = CreatePixelAcceleration();
|
||||
newton = CreateNewton();
|
||||
angularSpeed = CreateAngularSpeed();
|
||||
defaultMeasurementUnits.clear();
|
||||
}
|
||||
|
||||
} // namespace gd
|
||||
|
@@ -74,31 +74,40 @@ public:
|
||||
return elements.at(elementIndex).GetBaseUnit();
|
||||
}
|
||||
|
||||
bool IsUndefined() const { return this == &gd::MeasurementUnit::undefined; }
|
||||
bool IsUndefined() const {
|
||||
return this == &gd::MeasurementUnit::undefined || name == "Undefined";
|
||||
}
|
||||
|
||||
static void ApplyTranslation();
|
||||
|
||||
static gd::MeasurementUnit &GetUndefined() { return undefined; }
|
||||
static const gd::MeasurementUnit &GetUndefined() { return undefined; }
|
||||
|
||||
static gd::MeasurementUnit &GetDimensionless() { return dimensionless; }
|
||||
static const gd::MeasurementUnit &GetDimensionless() { return dimensionless; }
|
||||
|
||||
static gd::MeasurementUnit &GetDegreeAngle() { return degreeAngle; }
|
||||
static const gd::MeasurementUnit &GetDegreeAngle() { return degreeAngle; }
|
||||
|
||||
static gd::MeasurementUnit &GetSecond() { return second; }
|
||||
static const gd::MeasurementUnit &GetSecond() { return second; }
|
||||
|
||||
static gd::MeasurementUnit &GetPixel() { return pixel; }
|
||||
static const gd::MeasurementUnit &GetPixel() { return pixel; }
|
||||
|
||||
static gd::MeasurementUnit &GetPixelSpeed() { return pixelSpeed; }
|
||||
static const gd::MeasurementUnit &GetPixelSpeed() { return pixelSpeed; }
|
||||
|
||||
static gd::MeasurementUnit &GetPixelAcceleration() {
|
||||
static const gd::MeasurementUnit &GetPixelAcceleration() {
|
||||
return pixelAcceleration;
|
||||
}
|
||||
|
||||
static gd::MeasurementUnit &GetAngularSpeed() { return angularSpeed; }
|
||||
static const gd::MeasurementUnit &GetAngularSpeed() { return angularSpeed; }
|
||||
|
||||
static gd::MeasurementUnit &GetNewton() { return newton; }
|
||||
static const gd::MeasurementUnit &GetNewton() { return newton; }
|
||||
|
||||
static const std::vector<const gd::MeasurementUnit*> &GetDefaultMeasurementUnits();
|
||||
static std::size_t GetDefaultMeasurementUnitsCount();
|
||||
static const gd::MeasurementUnit &GetDefaultMeasurementUnitAtIndex(std::size_t index);
|
||||
static bool HasDefaultMeasurementUnitNamed(const gd::String &name);
|
||||
static const gd::MeasurementUnit &GetDefaultMeasurementUnitByName(const gd::String &name);
|
||||
|
||||
private:
|
||||
static std::vector<const gd::MeasurementUnit*> defaultMeasurementUnits;
|
||||
static gd::MeasurementUnit undefined;
|
||||
static gd::MeasurementUnit dimensionless;
|
||||
static gd::MeasurementUnit degreeAngle;
|
||||
|
@@ -636,6 +636,7 @@ void Project::UnserializeFrom(const SerializerElement& element) {
|
||||
platformSpecificAssets.UnserializeFrom(
|
||||
propElement.GetChild("platformSpecificAssets"));
|
||||
loadingScreen.UnserializeFrom(propElement.GetChild("loadingScreen"));
|
||||
watermark.UnserializeFrom(propElement.GetChild("watermark"));
|
||||
|
||||
useExternalSourceFiles =
|
||||
propElement.GetBoolAttribute("useExternalSourceFiles");
|
||||
@@ -646,6 +647,13 @@ void Project::UnserializeFrom(const SerializerElement& element) {
|
||||
for (std::size_t i = 0; i < authorIdsElement.GetChildrenCount(); ++i) {
|
||||
authorIds.push_back(authorIdsElement.GetChild(i).GetStringValue());
|
||||
}
|
||||
authorUsernames.clear();
|
||||
auto& authorUsernamesElement = propElement.GetChild("authorUsernames");
|
||||
authorUsernamesElement.ConsiderAsArray();
|
||||
for (std::size_t i = 0; i < authorUsernamesElement.GetChildrenCount(); ++i) {
|
||||
authorUsernames.push_back(
|
||||
authorUsernamesElement.GetChild(i).GetStringValue());
|
||||
}
|
||||
|
||||
categories.clear();
|
||||
auto& categoriesElement = propElement.GetChild("categories");
|
||||
@@ -875,6 +883,7 @@ void Project::SerializeTo(SerializerElement& element) const {
|
||||
platformSpecificAssets.SerializeTo(
|
||||
propElement.AddChild("platformSpecificAssets"));
|
||||
loadingScreen.SerializeTo(propElement.AddChild("loadingScreen"));
|
||||
watermark.SerializeTo(propElement.AddChild("watermark"));
|
||||
propElement.SetAttribute("useExternalSourceFiles", useExternalSourceFiles);
|
||||
|
||||
auto& authorIdsElement = propElement.AddChild("authorIds");
|
||||
@@ -882,6 +891,11 @@ void Project::SerializeTo(SerializerElement& element) const {
|
||||
for (const auto& authorId : authorIds) {
|
||||
authorIdsElement.AddChild("").SetStringValue(authorId);
|
||||
}
|
||||
auto& authorUsernamesElement = propElement.AddChild("authorUsernames");
|
||||
authorUsernamesElement.ConsiderAsArray();
|
||||
for (const auto& authorUsername : authorUsernames) {
|
||||
authorUsernamesElement.AddChild("").SetStringValue(authorUsername);
|
||||
}
|
||||
|
||||
auto& categoriesElement = propElement.AddChild("categories");
|
||||
categoriesElement.ConsiderAsArray();
|
||||
@@ -977,7 +991,7 @@ bool Project::ValidateName(const gd::String& name) {
|
||||
}
|
||||
|
||||
void Project::ExposeResources(gd::ArbitraryResourceWorker& worker) {
|
||||
// See also gd::WholeProjectRefactorer::ExposeProjectEvents for a method that
|
||||
// See also gd::ProjectBrowserHelper::ExposeProjectEvents for a method that
|
||||
// traverse the whole project (this time for events) and ExposeProjectEffects
|
||||
// (this time for effects). Ideally, this method could be moved outside of
|
||||
// gd::Project.
|
||||
@@ -1097,6 +1111,7 @@ void Project::Init(const gd::Project& game) {
|
||||
|
||||
author = game.author;
|
||||
authorIds = game.authorIds;
|
||||
authorUsernames = game.authorUsernames;
|
||||
isPlayableWithKeyboard = game.isPlayableWithKeyboard;
|
||||
isPlayableWithGamepad = game.isPlayableWithGamepad;
|
||||
isPlayableWithMobile = game.isPlayableWithMobile;
|
||||
@@ -1107,6 +1122,7 @@ void Project::Init(const gd::Project& game) {
|
||||
latestCompilationDirectory = game.latestCompilationDirectory;
|
||||
platformSpecificAssets = game.platformSpecificAssets;
|
||||
loadingScreen = game.loadingScreen;
|
||||
watermark = game.watermark;
|
||||
objectGroups = game.objectGroups;
|
||||
|
||||
extensionProperties = game.extensionProperties;
|
||||
|
@@ -11,6 +11,7 @@
|
||||
|
||||
#include "GDCore/Project/ExtensionProperties.h"
|
||||
#include "GDCore/Project/LoadingScreen.h"
|
||||
#include "GDCore/Project/Watermark.h"
|
||||
#include "GDCore/Project/ObjectGroupsContainer.h"
|
||||
#include "GDCore/Project/ObjectsContainer.h"
|
||||
#include "GDCore/Project/PlatformSpecificAssets.h"
|
||||
@@ -120,6 +121,16 @@ class GD_CORE_API Project : public ObjectsContainer {
|
||||
*/
|
||||
std::vector<gd::String>& GetAuthorIds() { return authorIds; };
|
||||
|
||||
/**
|
||||
* \brief Get the author usernames of the project.
|
||||
*/
|
||||
const std::vector<gd::String>& GetAuthorUsernames() const { return authorUsernames; };
|
||||
|
||||
/**
|
||||
* \brief Get the author usernames of the project, to modify them (non-const).
|
||||
*/
|
||||
std::vector<gd::String>& GetAuthorUsernames() { return authorUsernames; };
|
||||
|
||||
/**
|
||||
* Define the project as playable with a keyboard.
|
||||
* \param enable True to define the project as playable with a keyboard.
|
||||
@@ -256,6 +267,16 @@ class GD_CORE_API Project : public ObjectsContainer {
|
||||
*/
|
||||
const gd::LoadingScreen& GetLoadingScreen() const { return loadingScreen; }
|
||||
|
||||
/**
|
||||
* \brief Return a reference to watermark setup for the project
|
||||
*/
|
||||
gd::Watermark& GetWatermark() { return watermark; }
|
||||
|
||||
/**
|
||||
* \brief Return a reference to watermark setup for the project
|
||||
*/
|
||||
const gd::Watermark& GetWatermark() const { return watermark; }
|
||||
|
||||
/**
|
||||
* Change game's main window default width.
|
||||
*
|
||||
@@ -1043,6 +1064,8 @@ class GD_CORE_API Project : public ObjectsContainer {
|
||||
gd::String author; ///< Game author name, for publishing purpose.
|
||||
std::vector<gd::String>
|
||||
authorIds; ///< Game author ids, from GDevelop users DB.
|
||||
std::vector<gd::String>
|
||||
authorUsernames; ///< Game author usernames, from GDevelop users DB.
|
||||
std::vector<gd::String>
|
||||
categories; ///< Game categories
|
||||
bool isPlayableWithKeyboard; ///< The project is playable with a keyboard.
|
||||
@@ -1062,6 +1085,7 @@ class GD_CORE_API Project : public ObjectsContainer {
|
||||
currentPlatform; ///< The platform being used to edit the project.
|
||||
gd::PlatformSpecificAssets platformSpecificAssets;
|
||||
gd::LoadingScreen loadingScreen;
|
||||
gd::Watermark watermark;
|
||||
std::vector<std::unique_ptr<gd::ExternalEvents> >
|
||||
externalEvents; ///< List of all externals events
|
||||
ExtensionProperties
|
||||
|
@@ -17,6 +17,9 @@ PropertyDescriptor::~PropertyDescriptor() {}
|
||||
void PropertyDescriptor::SerializeTo(SerializerElement& element) const {
|
||||
element.AddChild("value").SetStringValue(currentValue);
|
||||
element.AddChild("type").SetStringValue(type);
|
||||
if (type == "Number" && !measurementUnit.IsUndefined()) {
|
||||
element.AddChild("unit").SetStringValue(measurementUnit.GetName());
|
||||
}
|
||||
element.AddChild("label").SetStringValue(label);
|
||||
element.AddChild("description").SetStringValue(description);
|
||||
element.AddChild("group").SetStringValue(group);
|
||||
@@ -32,6 +35,14 @@ void PropertyDescriptor::SerializeTo(SerializerElement& element) const {
|
||||
void PropertyDescriptor::UnserializeFrom(const SerializerElement& element) {
|
||||
currentValue = element.GetChild("value").GetStringValue();
|
||||
type = element.GetChild("type").GetStringValue();
|
||||
if (type == "Number") {
|
||||
gd::String unitName = element.GetChild("unit").GetStringValue();
|
||||
measurementUnit =
|
||||
gd::MeasurementUnit::HasDefaultMeasurementUnitNamed(unitName)
|
||||
? measurementUnit =
|
||||
gd::MeasurementUnit::GetDefaultMeasurementUnitByName(unitName)
|
||||
: gd::MeasurementUnit::GetUndefined();
|
||||
}
|
||||
label = element.GetChild("label").GetStringValue();
|
||||
description = element.GetChild("description").GetStringValue();
|
||||
group = element.GetChild("group").GetStringValue();
|
||||
|
24
Core/GDCore/Project/Watermark.cpp
Normal file
24
Core/GDCore/Project/Watermark.cpp
Normal file
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2018 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
|
||||
#include "Watermark.h"
|
||||
|
||||
#include "GDCore/Serialization/SerializerElement.h"
|
||||
|
||||
namespace gd {
|
||||
|
||||
Watermark::Watermark() : showWatermark(true), placement("bottom-left"){};
|
||||
|
||||
void Watermark::SerializeTo(SerializerElement& element) const {
|
||||
element.SetAttribute("showWatermark", showWatermark);
|
||||
element.SetAttribute("placement", placement);
|
||||
}
|
||||
|
||||
void Watermark::UnserializeFrom(const SerializerElement& element) {
|
||||
showWatermark = element.GetBoolAttribute("showWatermark", true);
|
||||
placement = element.GetStringAttribute("placement", "bottom-left");
|
||||
}
|
||||
} // namespace gd
|
70
Core/GDCore/Project/Watermark.h
Normal file
70
Core/GDCore/Project/Watermark.h
Normal file
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2018 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
|
||||
#ifndef GDCORE_WATERMARK_H
|
||||
#define GDCORE_WATERMARK_H
|
||||
#include "GDCore/String.h"
|
||||
namespace gd {
|
||||
class SerializerElement;
|
||||
}
|
||||
|
||||
namespace gd {
|
||||
|
||||
/**
|
||||
* \brief Describe the content and set up of the watermark
|
||||
*
|
||||
* \see gd::Watermark
|
||||
*
|
||||
* \ingroup PlatformDefinition
|
||||
*/
|
||||
class GD_CORE_API Watermark {
|
||||
public:
|
||||
Watermark();
|
||||
virtual ~Watermark(){};
|
||||
|
||||
/**
|
||||
* \brief Return true if the GDevelop watermark should be shown after
|
||||
* the game has loaded its assets.
|
||||
*/
|
||||
bool IsGDevelopWatermarkShown() const { return showWatermark; };
|
||||
|
||||
/**
|
||||
* \brief Set if the GDevelop watermark should be shown after the game
|
||||
* has loaded its assets.
|
||||
*/
|
||||
Watermark& ShowGDevelopWatermark(bool show) {
|
||||
showWatermark = show;
|
||||
return *this;
|
||||
};
|
||||
|
||||
const gd::String& GetPlacement() const { return placement; };
|
||||
|
||||
Watermark& SetPlacement(const gd::String& value) {
|
||||
placement = value;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/** \name Saving and loading
|
||||
*/
|
||||
///@{
|
||||
/**
|
||||
* \brief Serialize the watermark setup.
|
||||
*/
|
||||
void SerializeTo(SerializerElement& element) const;
|
||||
|
||||
/**
|
||||
* \brief Unserialize the watermark setup.
|
||||
*/
|
||||
void UnserializeFrom(const SerializerElement& element);
|
||||
///@}
|
||||
|
||||
private:
|
||||
bool showWatermark;
|
||||
gd::String placement;
|
||||
};
|
||||
} // namespace gd
|
||||
|
||||
#endif // GDCORE_WATERMARK_H
|
40
Core/tests/InstructionCountEvaluator.cpp
Normal file
40
Core/tests/InstructionCountEvaluator.cpp
Normal file
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#include "GDCore/IDE/Events/InstructionsCountEvaluator.h"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include "DummyPlatform.h"
|
||||
#include "GDCore/Events/Builtin/StandardEvent.h"
|
||||
#include "GDCore/Events/Event.h"
|
||||
#include "GDCore/Extensions/Platform.h"
|
||||
#include "GDCore/Project/Layout.h"
|
||||
#include "GDCore/Project/Project.h"
|
||||
#include "catch.hpp"
|
||||
|
||||
namespace {
|
||||
|
||||
TEST_CASE("InstructionsCountEvaluator", "[events]") {
|
||||
|
||||
SECTION("Can count 1 action in a layout") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
SetupProjectWithDummyPlatform(project, platform);
|
||||
auto &layout1 = project.InsertNewLayout("Layout1", 0);
|
||||
|
||||
// Add an event with an action.
|
||||
gd::StandardEvent event;
|
||||
gd::Instruction instruction;
|
||||
instruction.SetType("MyExtension::DoSomething");
|
||||
instruction.SetParametersCount(1);
|
||||
event.GetActions().Insert(instruction);
|
||||
layout1.GetEvents().InsertEvent(event);
|
||||
|
||||
REQUIRE(gd::InstructionsCountEvaluator::ScanProject(project) == 1);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace
|
@@ -15,6 +15,7 @@
|
||||
#include "GDCore/Events/Builtin/StandardEvent.h"
|
||||
#include "GDCore/Extensions/Builtin/SpriteExtension/SpriteObject.h"
|
||||
#include "GDCore/Extensions/Platform.h"
|
||||
#include "GDCore/IDE/ProjectBrowserHelper.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryResourceWorker.h"
|
||||
#include "GDCore/IDE/Project/ProjectResourcesAdder.h"
|
||||
#include "GDCore/IDE/WholeProjectRefactorer.h"
|
||||
@@ -51,7 +52,7 @@ TEST_CASE("InstructionsParameterMover", "[common][events]") {
|
||||
gd::InstructionsParameterMover mover(
|
||||
project, "MyExtension::DoSomething", 0, 2);
|
||||
|
||||
gd::WholeProjectRefactorer::ExposeProjectEvents(project, mover);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, mover);
|
||||
REQUIRE(insertedInstruction.GetParameter(0).GetPlainString() == "Param2");
|
||||
REQUIRE(insertedInstruction.GetParameter(1).GetPlainString() == "Param3");
|
||||
REQUIRE(insertedInstruction.GetParameter(2).GetPlainString() == "Param1");
|
||||
@@ -60,7 +61,7 @@ TEST_CASE("InstructionsParameterMover", "[common][events]") {
|
||||
gd::InstructionsParameterMover mover(
|
||||
project, "MyExtension::DoSomething", 0, 99);
|
||||
|
||||
gd::WholeProjectRefactorer::ExposeProjectEvents(project, mover);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, mover);
|
||||
REQUIRE(insertedInstruction.GetParameter(0).GetPlainString() == "Param2");
|
||||
REQUIRE(insertedInstruction.GetParameter(1).GetPlainString() == "Param3");
|
||||
REQUIRE(insertedInstruction.GetParameter(2).GetPlainString() == "Param1");
|
||||
@@ -69,7 +70,7 @@ TEST_CASE("InstructionsParameterMover", "[common][events]") {
|
||||
gd::InstructionsParameterMover mover(
|
||||
project, "MyExtension::DoSomething", 99, 2);
|
||||
|
||||
gd::WholeProjectRefactorer::ExposeProjectEvents(project, mover);
|
||||
gd::ProjectBrowserHelper::ExposeProjectEvents(project, mover);
|
||||
REQUIRE(insertedInstruction.GetParameter(0).GetPlainString() == "Param1");
|
||||
REQUIRE(insertedInstruction.GetParameter(1).GetPlainString() == "Param2");
|
||||
REQUIRE(insertedInstruction.GetParameter(2).GetPlainString() == "Param3");
|
||||
|
@@ -30,6 +30,9 @@
|
||||
#include "GDCore/Project/Variable.h"
|
||||
#include "catch.hpp"
|
||||
|
||||
// TODO Extract test data in another file to allow to read them side by side
|
||||
// with the test cases more easily.
|
||||
|
||||
// TODO EBO Add a test where a child is removed form the EventsBasedObject
|
||||
// and check the configuration still gives access to other child configuration.
|
||||
namespace {
|
||||
@@ -109,16 +112,27 @@ const std::vector<const gd::EventsList *> GetEventsLists(gd::Project &project) {
|
||||
auto &scene = project.GetLayout("Scene").GetEvents();
|
||||
auto &externalEvents =
|
||||
project.GetExternalEvents("ExternalEvents").GetEvents();
|
||||
auto &eventsExtension = project.GetEventsFunctionsExtension("MyEventsExtension");
|
||||
auto &objectFunctionEvents =
|
||||
project.GetEventsFunctionsExtension("MyEventsExtension")
|
||||
eventsExtension
|
||||
.GetEventsBasedObjects()
|
||||
.Get("MyOtherEventsBasedObject")
|
||||
.GetEventsFunctions()
|
||||
.GetEventsFunction("MyObjectEventsFunction")
|
||||
.GetEvents();
|
||||
auto &behaviorFunctionEvents =
|
||||
eventsExtension.GetEventsBasedBehaviors()
|
||||
.Get("MyOtherEventsBasedBehavior")
|
||||
.GetEventsFunctions()
|
||||
.GetEventsFunction("MyBehaviorEventsFunction")
|
||||
.GetEvents();
|
||||
auto &freeFunctionEvents =
|
||||
eventsExtension.GetEventsFunction("MyOtherEventsFunction").GetEvents();
|
||||
eventLists.push_back(&scene);
|
||||
eventLists.push_back(&externalEvents);
|
||||
eventLists.push_back(&objectFunctionEvents);
|
||||
eventLists.push_back(&behaviorFunctionEvents);
|
||||
eventLists.push_back(&freeFunctionEvents);
|
||||
return eventLists;
|
||||
}
|
||||
|
||||
@@ -930,6 +944,48 @@ SetupProjectWithEventsFunctionExtension(gd::Project &project) {
|
||||
.SetType("Number");
|
||||
}
|
||||
|
||||
// Add another events based behavior that uses previously defined events based
|
||||
// object and behavior.
|
||||
{
|
||||
auto &eventsBasedBehavior =
|
||||
eventsExtension.GetEventsBasedBehaviors().InsertNew(
|
||||
"MyOtherEventsBasedBehavior", 0);
|
||||
eventsBasedBehavior.SetFullName("My events based behavior");
|
||||
eventsBasedBehavior.SetDescription("An events based behavior for test");
|
||||
eventsBasedBehavior.SetObjectType("MyEventsExtension::MyEventsBasedObject");
|
||||
|
||||
// Add functions, and parameters that should be there by convention.
|
||||
auto &behaviorEventsFunctions = eventsBasedBehavior.GetEventsFunctions();
|
||||
auto &behaviorAction = behaviorEventsFunctions.InsertNewEventsFunction(
|
||||
"MyBehaviorEventsFunction", 0);
|
||||
behaviorAction.GetParameters().push_back(
|
||||
gd::ParameterMetadata()
|
||||
.SetName("Object")
|
||||
.SetType("object")
|
||||
.SetExtraInfo("MyEventsExtension::MyEventsBasedObject"));
|
||||
behaviorAction.GetParameters().push_back(
|
||||
gd::ParameterMetadata()
|
||||
.SetName("Behavior")
|
||||
.SetType("behavior")
|
||||
.SetExtraInfo("MyEventsExtension::MyEventsBasedBehavior"));
|
||||
// Define the same objects as in the layout to be consistent with events.
|
||||
behaviorAction.GetParameters().push_back(
|
||||
gd::ParameterMetadata()
|
||||
.SetName("ObjectWithMyBehavior")
|
||||
.SetType("object")
|
||||
.SetExtraInfo("MyExtension::Sprite"));
|
||||
behaviorAction.GetParameters().push_back(
|
||||
gd::ParameterMetadata()
|
||||
.SetName("MyBehavior")
|
||||
.SetType("behavior")
|
||||
.SetExtraInfo("MyEventsExtension::MyEventsBasedBehavior"));
|
||||
behaviorAction.GetParameters().push_back(
|
||||
gd::ParameterMetadata()
|
||||
.SetName("MyCustomObject")
|
||||
.SetType("object")
|
||||
.SetExtraInfo("MyEventsExtension::MyEventsBasedObject"));
|
||||
}
|
||||
|
||||
// Add an other events based object that uses previously defined events based
|
||||
// object and behavior.
|
||||
{
|
||||
@@ -1001,6 +1057,30 @@ SetupProjectWithEventsFunctionExtension(gd::Project &project) {
|
||||
.SetGetterName("MyEventsFunctionExpressionAndCondition");
|
||||
}
|
||||
|
||||
// Add another free function that uses previously defined events based
|
||||
// object and behavior.
|
||||
{
|
||||
// Add functions, and parameters that should be there by convention.
|
||||
auto &action =
|
||||
eventsExtension.InsertNewEventsFunction("MyOtherEventsFunction", 0);
|
||||
// Define the same objects as in the layout to be consistent with events.
|
||||
action.GetParameters().push_back(
|
||||
gd::ParameterMetadata()
|
||||
.SetName("ObjectWithMyBehavior")
|
||||
.SetType("object")
|
||||
.SetExtraInfo("MyExtension::Sprite"));
|
||||
action.GetParameters().push_back(
|
||||
gd::ParameterMetadata()
|
||||
.SetName("MyBehavior")
|
||||
.SetType("behavior")
|
||||
.SetExtraInfo("MyEventsExtension::MyEventsBasedBehavior"));
|
||||
action.GetParameters().push_back(
|
||||
gd::ParameterMetadata()
|
||||
.SetName("MyCustomObject")
|
||||
.SetType("object")
|
||||
.SetExtraInfo("MyEventsExtension::MyEventsBasedObject"));
|
||||
}
|
||||
|
||||
// Add some usages in events
|
||||
{
|
||||
auto &layout = project.InsertNewLayout("Scene", 0);
|
||||
@@ -1030,6 +1110,13 @@ SetupProjectWithEventsFunctionExtension(gd::Project &project) {
|
||||
.GetEventsFunctions()
|
||||
.GetEventsFunction("MyObjectEventsFunction")
|
||||
.GetEvents());
|
||||
SetupEvents(eventsExtension.GetEventsBasedBehaviors()
|
||||
.Get("MyOtherEventsBasedBehavior")
|
||||
.GetEventsFunctions()
|
||||
.GetEventsFunction("MyBehaviorEventsFunction")
|
||||
.GetEvents());
|
||||
SetupEvents(eventsExtension.GetEventsFunction("MyOtherEventsFunction")
|
||||
.GetEvents());
|
||||
}
|
||||
|
||||
return eventsExtension;
|
||||
@@ -1556,6 +1643,50 @@ TEST_CASE("WholeProjectRefactorer", "[common]") {
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Events extension renamed in instructions scoped to one behavior") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
SetupProjectWithDummyPlatform(project, platform);
|
||||
auto &eventsExtension = SetupProjectWithEventsFunctionExtension(project);
|
||||
|
||||
// A behavior is copied from one extension to another.
|
||||
|
||||
auto &destinationExtension =
|
||||
project.InsertNewEventsFunctionsExtension("DestinationExtension", 0);
|
||||
// Add the function used by the instruction that is checked in this test.
|
||||
// When the function doesn't exist the destination extension, the
|
||||
// instruction keeps pointing to the old extension.
|
||||
destinationExtension.InsertNewEventsFunction("MyEventsFunction", 0);
|
||||
|
||||
auto &copiedBehavior =
|
||||
destinationExtension.GetEventsBasedBehaviors().InsertNew(
|
||||
"MyOtherEventsBasedBehavior", 0);
|
||||
copiedBehavior.SetFullName("My events based behavior");
|
||||
copiedBehavior.SetDescription("An events based behavior for test");
|
||||
copiedBehavior.SetObjectType("MyEventsExtension::MyEventsBasedObject");
|
||||
|
||||
// Add the copied events.
|
||||
auto &behaviorEventsFunctions = copiedBehavior.GetEventsFunctions();
|
||||
auto &behaviorAction = behaviorEventsFunctions.InsertNewEventsFunction(
|
||||
"MyBehaviorEventsFunction", 0);
|
||||
SetupEvents(behaviorAction.GetEvents());
|
||||
|
||||
gd::WholeProjectRefactorer::UpdateExtensionNameInEventsBasedBehavior(
|
||||
project, destinationExtension, copiedBehavior, "MyEventsExtension");
|
||||
|
||||
// Check that events function calls in instructions have been renamed
|
||||
REQUIRE(GetEventFirstActionType(behaviorAction.GetEvents().GetEvent(
|
||||
FreeFunctionAction)) == "DestinationExtension::MyEventsFunction");
|
||||
|
||||
for (auto *eventsList : GetEventsLists(project)) {
|
||||
// Check that events function calls in instructions have NOT been renamed
|
||||
// outside of the copied behavior.
|
||||
REQUIRE(
|
||||
GetEventFirstActionType(eventsList->GetEvent(FreeFunctionAction)) ==
|
||||
"MyEventsExtension::MyEventsFunction");
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Events extension renamed in parameters") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
|
@@ -30,7 +30,7 @@ module.exports = {
|
||||
'AdMob',
|
||||
_('AdMob'),
|
||||
_(
|
||||
'Allow to display AdMob banners, interstitials and reward video ads.'
|
||||
'Allow to display AdMob banners, app open, interstitials, rewarded interstitials and rewarded video ads.'
|
||||
),
|
||||
'Florian Rival',
|
||||
'MIT'
|
||||
@@ -57,8 +57,8 @@ module.exports = {
|
||||
.addDependency()
|
||||
.setName('AdMob Cordova plugin')
|
||||
.setDependencyType('cordova')
|
||||
.setExportName('gdevelop-cordova-admob-plus')
|
||||
.setVersion('0.45.0')
|
||||
.setExportName('admob-plus-cordova')
|
||||
.setVersion('1.28.0')
|
||||
.setExtraSetting(
|
||||
'APP_ID_ANDROID',
|
||||
new gd.PropertyDescriptor('AdMobAppIdAndroid').setType(
|
||||
@@ -100,23 +100,120 @@ module.exports = {
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.setTestMode');
|
||||
|
||||
// Banner
|
||||
// App Open
|
||||
extension
|
||||
.addCondition(
|
||||
'BannerLoading',
|
||||
_('Banner loading'),
|
||||
_(
|
||||
'Check if a banner is currently loading. It will be shown automatically when loaded.'
|
||||
),
|
||||
_('Banner is loading'),
|
||||
'AppOpenLoading',
|
||||
_('App open loading'),
|
||||
_('Check if an app open is currently loading.'),
|
||||
_('App open is loading'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.isBannerLoading');
|
||||
.setFunctionName('gdjs.adMob.isAppOpenLoading');
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'AppOpenReady',
|
||||
_('App open ready'),
|
||||
_('Check if an app open is ready to be displayed.'),
|
||||
_('App open is ready'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.isAppOpenReady');
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'AppOpenShowing',
|
||||
_('App open showing'),
|
||||
_('Check if there is an app open being displayed.'),
|
||||
_('App open is showing'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.isAppOpenShowing');
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'AppOpenErrored',
|
||||
_('App open errored'),
|
||||
_('Check if there was a error while loading the app open.'),
|
||||
_('App open had an error'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.isAppOpenErrored');
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
'LoadAppOpen',
|
||||
_('Load app open'),
|
||||
_(
|
||||
'Start loading an app open (that can be displayed automatically when the loading is finished).\nIf test mode is set, a test app open will be displayed.'
|
||||
),
|
||||
_(
|
||||
'Load app open with Android ad unit ID: _PARAM0_, iOS ad unit ID: _PARAM1_ (landscape: _PARAM2_, display automatically when loaded: _PARAM3_)'
|
||||
),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.addParameter('string', _('Android app open ID'), '', false)
|
||||
.setParameterLongDescription(
|
||||
'Get it from your AdMob account. You can use `"ca-app-pub-3940256099942544/3419835294"` for loading a test app open.'
|
||||
)
|
||||
.addParameter('string', _('iOS app open ID'), '', false)
|
||||
.setParameterLongDescription(
|
||||
'Get it from your AdMob account. You can use `"ca-app-pub-3940256099942544/5662855259"` for loading a test app open.'
|
||||
)
|
||||
.addParameter(
|
||||
'yesorno',
|
||||
_('Display in landscape? (portait otherwise)'),
|
||||
'',
|
||||
false
|
||||
)
|
||||
.setDefaultValue('false')
|
||||
.addParameter(
|
||||
'yesorno',
|
||||
_('Displayed automatically when loading is finished?'),
|
||||
'',
|
||||
false
|
||||
)
|
||||
.setDefaultValue('true')
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.loadAppOpen');
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
'ShowAppOpen',
|
||||
_('Show app open'),
|
||||
_(
|
||||
'Show the app open that was loaded. Will work only when the app open is fully loaded.'
|
||||
),
|
||||
_('Show the loaded app open'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.showAppOpen');
|
||||
|
||||
// Banner
|
||||
extension
|
||||
.addCondition(
|
||||
'BannerShowing',
|
||||
@@ -131,6 +228,34 @@ module.exports = {
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.isBannerShowing');
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'BannerConfigured',
|
||||
_('Banner configured'),
|
||||
_('Check if there is a banner correctly configured ready to be shown.'),
|
||||
_('Banner is configured'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.isBannerConfigured');
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'BannerLoaded',
|
||||
_('Banner loaded'),
|
||||
_('Check if there is a banner correctly loaded ready to be shown.'),
|
||||
_('Banner is loaded'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.isBannerLoaded');
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'BannerErrored',
|
||||
@@ -149,6 +274,9 @@ module.exports = {
|
||||
extension
|
||||
.addDuplicatedCondition('BannerReady', 'BannerShowing')
|
||||
.setHidden();
|
||||
extension
|
||||
.addDuplicatedCondition('Bannerloading', 'BannerShowing')
|
||||
.setHidden();
|
||||
extension
|
||||
.addDuplicatedCondition('BannerExists', 'BannerShowing')
|
||||
.setHidden();
|
||||
@@ -158,7 +286,7 @@ module.exports = {
|
||||
'SetupBanner',
|
||||
_('Configure the banner'),
|
||||
_(
|
||||
"Configure a banner, which can then be displayed.\nIf test mode is set, a test banner will be displayed.\n\nOnce a banner is positioned (at the top or bottom of the game), it can't be moved anymore."
|
||||
"Configure a banner, which can then be displayed.\nIf a banner is already displayed, it will be removed\nIf test mode is set, a test banner will be displayed.\n\nOnce a banner is positioned (at the top or bottom of the game), it can't be moved anymore."
|
||||
),
|
||||
_(
|
||||
'Configure the banner with Android ad unit ID: _PARAM0_, iOS ad unit ID: _PARAM1_, display at top: _PARAM2_'
|
||||
@@ -173,7 +301,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('string', _('iOS banner ID'), '', false)
|
||||
.setParameterLongDescription(
|
||||
'Get it from your AdMob account. You can use `"ca-app-pub-3940256099942544/6300978111"` for showing a test banner.'
|
||||
'Get it from your AdMob account. You can use `"ca-app-pub-3940256099942544/2934735716"` for showing a test banner.'
|
||||
)
|
||||
.addParameter(
|
||||
'yesorno',
|
||||
@@ -298,7 +426,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('string', _('iOS interstitial ID'), '', false)
|
||||
.setParameterLongDescription(
|
||||
'Get it from your AdMob account. You can use `"ca-app-pub-3940256099942544/1033173712"` for loading a test interstitial.'
|
||||
'Get it from your AdMob account. You can use `"ca-app-pub-3940256099942544/4411468910"` for loading a test interstitial.'
|
||||
)
|
||||
.addParameter(
|
||||
'yesorno',
|
||||
@@ -327,90 +455,266 @@ module.exports = {
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.showInterstitial');
|
||||
|
||||
// Reward video
|
||||
// Rewarded Interstitial
|
||||
extension
|
||||
.addCondition(
|
||||
'VideoLoading',
|
||||
_('Video loading'),
|
||||
_('Check if a reward video is currently loading.'),
|
||||
_('Reward video is loading'),
|
||||
'RewardedInterstitialLoading',
|
||||
_('Rewarded interstitial loading'),
|
||||
_('Check if a rewarded interstitial is currently loading.'),
|
||||
_('Rewarded interstitial is loading'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.isVideoLoading');
|
||||
.setFunctionName('gdjs.adMob.isRewardedInterstitialLoading');
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'VideoReady',
|
||||
_('Video ready'),
|
||||
_('Check if a reward video is ready to be displayed.'),
|
||||
_('Reward video is ready'),
|
||||
'RewardedInterstitialReady',
|
||||
_('Rewarded interstitial ready'),
|
||||
_('Check if a rewarded interstitial is ready to be displayed.'),
|
||||
_('Rewarded interstitial is ready'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.isVideoReady');
|
||||
.setFunctionName('gdjs.adMob.isRewardedInterstitialReady');
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'VideoShowing',
|
||||
_('Video showing'),
|
||||
_('Check if there is a reward video being displayed.'),
|
||||
_('Reward video is showing'),
|
||||
'RewardedInterstitialShowing',
|
||||
_('Rewarded interstitial showing'),
|
||||
_('Check if there is a rewarded interstitial being displayed.'),
|
||||
_('Rewarded interstitial is showing'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.isVideoShowing');
|
||||
.setFunctionName('gdjs.adMob.isRewardedInterstitialShowing');
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'VideoErrored',
|
||||
_('Video had an error'),
|
||||
_('Check if there was a error while loading the rewarded video.'),
|
||||
_('Video ad had an error'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.isVideoErrored');
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'VideoReward',
|
||||
_('Video reward received'),
|
||||
'RewardedInterstitialErrored',
|
||||
_('Rewarded interstitial had an error'),
|
||||
_(
|
||||
'Check if the reward of the video was given to the user.\nYou can mark this reward as cleared, so that the condition will be false and you can show later another reward video.'
|
||||
'Check if there was a error while loading the rewarded interstitial.'
|
||||
),
|
||||
_('Rewarded Interstitial had an error'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.isRewardedInterstitialErrored');
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'RewardedInterstitialRewardReceived',
|
||||
_('Rewarded Interstitial reward received'),
|
||||
_(
|
||||
'Check if the reward of the rewarded interstitial was given to the user.\nYou can mark this reward as cleared, so that the condition will be false and you can show later another rewarded interstitial.'
|
||||
),
|
||||
_(
|
||||
'User got the reward of the rewarded interstitial (and clear this reward: _PARAM0_)'
|
||||
),
|
||||
_('User got the reward of the video (and clear this reward: _PARAM0_)'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.addParameter(
|
||||
'yesorno',
|
||||
_('Clear the reward (needed to show another video)'),
|
||||
_('Clear the reward (needed to show another rewarded interstitial)'),
|
||||
'',
|
||||
false
|
||||
)
|
||||
.setDefaultValue('true')
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.wasVideoRewardReceived');
|
||||
.setFunctionName('gdjs.adMob.wasRewardedInterstitialRewardReceived');
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
'LoadVideo',
|
||||
_('Load video'),
|
||||
'LoadRewardedInterstitial',
|
||||
_('Load rewarded interstitial'),
|
||||
_(
|
||||
'Start loading a rewarded interstitial (that can be displayed automatically when the loading is finished).\nIf test mode is set, a test rewarded interstitial will be displayed.\nThis is similar to a rewarded video, but can be displayed at any time, and the user can close it.'
|
||||
),
|
||||
_(
|
||||
'Load rewarded interstitial with Android ad unit ID: _PARAM0_, iOS ad unit ID: _PARAM1_ (display automatically when loaded: _PARAM2_)'
|
||||
),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.addParameter('string', _('Android rewarded interstitial ID'), '', false)
|
||||
.setParameterLongDescription(
|
||||
'Get it from your AdMob account. You can use `"ca-app-pub-3940256099942544/5354046379"` for loading a test rewarded interstitial.'
|
||||
)
|
||||
.addParameter('string', _('iOS interstitial ID'), '', false)
|
||||
.setParameterLongDescription(
|
||||
'Get it from your AdMob account. You can use `"ca-app-pub-3940256099942544/6978759866"` for loading a test rewarded interstitial.'
|
||||
)
|
||||
.addParameter(
|
||||
'yesorno',
|
||||
_('Displayed automatically when loading is finished?'),
|
||||
'',
|
||||
false
|
||||
)
|
||||
.setDefaultValue('true')
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.loadRewardedInterstitial');
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
'ShowRewardedInterstitial',
|
||||
_('Show rewarded interstitial'),
|
||||
_(
|
||||
'Show the rewarded interstitial that was loaded. Will work only when the rewarded interstitial is fully loaded.'
|
||||
),
|
||||
_('Show the loaded rewarded interstitial'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.showRewardedInterstitial');
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
'ClaimRewardedInterstitialReward',
|
||||
_('Mark the reward of the rewarded interstitial as claimed'),
|
||||
_(
|
||||
'Mark the rewarded interstitial reward as claimed. Useful if you used the condition to check if the reward was given to the user without clearing the reward.'
|
||||
),
|
||||
_('Mark the reward of the rewarded interstitial as claimed'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.markRewardedInterstitialRewardAsClaimed');
|
||||
|
||||
// Rewarded video
|
||||
extension
|
||||
.addCondition(
|
||||
'RewardedVideoLoading',
|
||||
_('Rewarded video loading'),
|
||||
_('Check if a rewarded video is currently loading.'),
|
||||
_('Rewarded video is loading'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.isRewardedVideoLoading');
|
||||
|
||||
// Deprecated condition (was renamed):
|
||||
extension
|
||||
.addDuplicatedCondition('VideoLoading', 'RewardedVideoLoading')
|
||||
.setHidden();
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'RewardedVideoReady',
|
||||
_('Rewarded video ready'),
|
||||
_('Check if a rewarded video is ready to be displayed.'),
|
||||
_('Rewarded video is ready'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.isRewardedVideoReady');
|
||||
|
||||
// Deprecated condition (was renamed):
|
||||
extension
|
||||
.addDuplicatedCondition('VideoReady', 'RewardedVideoReady')
|
||||
.setHidden();
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'RewardedVideoShowing',
|
||||
_('Rewarded video showing'),
|
||||
_('Check if there is a rewarded video being displayed.'),
|
||||
_('Rewarded video is showing'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.isRewardedVideoShowing');
|
||||
|
||||
// Deprecated condition (was renamed):
|
||||
extension
|
||||
.addDuplicatedCondition('VideoShowing', 'RewardedVideoShowing')
|
||||
.setHidden();
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'RewardedVideoErrored',
|
||||
_('Rewarded video had an error'),
|
||||
_('Check if there was a error while loading the rewarded video.'),
|
||||
_('Rewarded video ad had an error'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.isRewardedVideoErrored');
|
||||
|
||||
// Deprecated condition (was renamed):
|
||||
extension
|
||||
.addDuplicatedCondition('VideoErrored', 'RewardedVideoErrored')
|
||||
.setHidden();
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'RewardedVideoRewardReceived',
|
||||
_('Rewarded Video reward received'),
|
||||
_(
|
||||
'Check if the reward of the rewarded video was given to the user.\nYou can mark this reward as cleared, so that the condition will be false and you can show later another rewarded video.'
|
||||
),
|
||||
_(
|
||||
'User got the reward of the rewarded video (and clear this reward: _PARAM0_)'
|
||||
),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.addParameter(
|
||||
'yesorno',
|
||||
_('Clear the reward (needed to show another rewarded video)'),
|
||||
'',
|
||||
false
|
||||
)
|
||||
.setDefaultValue('true')
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.wasRewardedVideoRewardReceived');
|
||||
|
||||
// Deprecated condition (was renamed):
|
||||
extension
|
||||
.addDuplicatedCondition('VideoReward', 'RewardedVideoRewardReceived')
|
||||
.setHidden();
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
'LoadRewardedVideo',
|
||||
_('Load rewarded video'),
|
||||
_(
|
||||
'Start loading a reward video (that can be displayed automatically when the loading is finished).\nIf test mode is set, a test video will be displayed.'
|
||||
),
|
||||
@@ -427,7 +731,7 @@ module.exports = {
|
||||
)
|
||||
.addParameter('string', _('iOS reward video ID'), '', false)
|
||||
.setParameterLongDescription(
|
||||
'Get it from your AdMob account. You can use `"ca-app-pub-3940256099942544/5224354917"` for loading a test rewarded video.'
|
||||
'Get it from your AdMob account. You can use `"ca-app-pub-3940256099942544/1712485313"` for loading a test rewarded video.'
|
||||
)
|
||||
.addParameter(
|
||||
'yesorno',
|
||||
@@ -438,12 +742,15 @@ module.exports = {
|
||||
.setDefaultValue('true')
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.loadVideo');
|
||||
.setFunctionName('gdjs.adMob.loadRewardedVideo');
|
||||
|
||||
// Deprecated action (was renamed):
|
||||
extension.addDuplicatedAction('LoadVideo', 'LoadRewardedVideo').setHidden();
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
'ShowVideo',
|
||||
_('Show video'),
|
||||
'ShowRewardedVideo',
|
||||
_('Show rewarded video'),
|
||||
_(
|
||||
'Show the reward video that was loaded. Will work only when the video is fully loaded.'
|
||||
),
|
||||
@@ -454,23 +761,31 @@ module.exports = {
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.showVideo');
|
||||
.setFunctionName('gdjs.adMob.showRewardedVideo');
|
||||
|
||||
// Deprecated action (was renamed):
|
||||
extension.addDuplicatedAction('ShowVideo', 'ShowRewardedVideo').setHidden();
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
'ClaimReward',
|
||||
_('Mark the reward of the video as claimed'),
|
||||
'ClaimRewardedVideoReward',
|
||||
_('Mark the reward of the rewarded video as claimed'),
|
||||
_(
|
||||
'Mark the video reward as claimed. Useful if you used the condition to check if the reward was given to the user without clearing the reward.'
|
||||
'Mark the rewarded video reward as claimed. Useful if you used the condition to check if the reward was given to the user without clearing the reward.'
|
||||
),
|
||||
_('Mark the reward of the video as claimed'),
|
||||
_('Mark the reward of the rewarded video as claimed'),
|
||||
'',
|
||||
'JsPlatform/Extensions/admobicon24.png',
|
||||
'JsPlatform/Extensions/admobicon16.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
||||
.setFunctionName('gdjs.adMob.markVideoRewardAsClaimed');
|
||||
.setFunctionName('gdjs.adMob.markRewardedVideoRewardAsClaimed');
|
||||
|
||||
// Deprecated action (was renamed):
|
||||
extension
|
||||
.addDuplicatedAction('ClaimReward', 'ClaimRewardedVideoReward')
|
||||
.setHidden();
|
||||
|
||||
return extension;
|
||||
},
|
||||
|
@@ -1,10 +1,46 @@
|
||||
namespace gdjs {
|
||||
declare var admob: any;
|
||||
declare var cordova: any;
|
||||
|
||||
export namespace adMob {
|
||||
const logger = new gdjs.Logger('AdMob');
|
||||
|
||||
export enum AdSizeType {
|
||||
const testAdIds = {
|
||||
appOpen: {
|
||||
android: 'ca-app-pub-3940256099942544/3419835294',
|
||||
ios: 'ca-app-pub-3940256099942544/5662855259',
|
||||
},
|
||||
banner: {
|
||||
android: 'ca-app-pub-3940256099942544/6300978111',
|
||||
ios: 'ca-app-pub-3940256099942544/2934735716',
|
||||
},
|
||||
interstitial: {
|
||||
android: 'ca-app-pub-3940256099942544/1033173712',
|
||||
ios: 'ca-app-pub-3940256099942544/4411468910',
|
||||
},
|
||||
interstitialVideo: {
|
||||
android: 'ca-app-pub-3940256099942544/8691691433',
|
||||
ios: 'ca-app-pub-3940256099942544/5135589807',
|
||||
},
|
||||
rewarded: {
|
||||
android: 'ca-app-pub-3940256099942544/5224354917',
|
||||
ios: 'ca-app-pub-3940256099942544/1712485313',
|
||||
},
|
||||
rewardedInterstitial: {
|
||||
android: 'ca-app-pub-3940256099942544/5354046379',
|
||||
ios: 'ca-app-pub-3940256099942544/6978759866',
|
||||
},
|
||||
native: {
|
||||
android: 'ca-app-pub-3940256099942544/2247696110',
|
||||
ios: 'ca-app-pub-3940256099942544/3986624511',
|
||||
},
|
||||
nativeVideo: {
|
||||
android: 'ca-app-pub-3940256099942544/1044960115',
|
||||
ios: 'ca-app-pub-3940256099942544/2521693316',
|
||||
},
|
||||
};
|
||||
|
||||
enum AdSizeType {
|
||||
BANNER,
|
||||
LARGE_BANNER,
|
||||
MEDIUM_RECTANGLE,
|
||||
@@ -13,31 +49,113 @@ namespace gdjs {
|
||||
SMART_BANNER,
|
||||
}
|
||||
|
||||
// Banner
|
||||
let bannerAndroidId = '';
|
||||
let bannerIosId = '';
|
||||
let bannerPosition: 'top' | 'bottom' = 'top';
|
||||
let bannerRequestedAdSizeType: AdSizeType = AdSizeType.SMART_BANNER;
|
||||
const adSizeTypes = {
|
||||
BANNER: AdSizeType.BANNER,
|
||||
LARGE_BANNER: AdSizeType.LARGE_BANNER,
|
||||
MEDIUM_RECTANGLE: AdSizeType.MEDIUM_RECTANGLE,
|
||||
FULL_BANNER: AdSizeType.FULL_BANNER,
|
||||
LEADERBOARD: AdSizeType.LEADERBOARD,
|
||||
SMART_BANNER: AdSizeType.SMART_BANNER,
|
||||
};
|
||||
|
||||
let bannerLoading = false;
|
||||
let bannerErrored = false;
|
||||
let bannerShowing = false;
|
||||
enum AppOpenAdOrientation {
|
||||
Portrait = 1,
|
||||
PortraitUpsideDown = 2,
|
||||
LandscapeRight = 3,
|
||||
LandscapeLeft = 4,
|
||||
}
|
||||
|
||||
// Admob does not initialize automatically, so we store a flag to know if it's initialized.
|
||||
let admobStarted = false;
|
||||
let isUsingTestAds = false;
|
||||
|
||||
// Banner
|
||||
let banner;
|
||||
let bannerRequestedAdSizeType: AdSizeType = AdSizeType.SMART_BANNER;
|
||||
let bannerConfigured = false; // Becomes true when the user configures the ad id and the position of the banner.
|
||||
let bannerLoaded = false; // Becomes true when the banner is loaded by loaded.
|
||||
let bannerShowing = false; // Becomes true when loaded or when the user shows/hides the banner.
|
||||
let bannerErrored = false; // Becomes true when the banner fails to load.
|
||||
|
||||
// Interstitial
|
||||
let interstitialLoading = false;
|
||||
let interstitialReady = false;
|
||||
let interstitialErrored = false;
|
||||
let interstitialShowing = false;
|
||||
let interstitial;
|
||||
let interstitialLoading = false; // Becomes true when the interstitial is loading.
|
||||
let interstitialReady = false; // Becomes true when the interstitial is loaded and ready to be shown.
|
||||
let interstitialShowing = false; // Becomes true when the interstitial is showing.
|
||||
let interstitialErrored = false; // Becomes true when the interstitial fails to load.
|
||||
|
||||
// Reward video
|
||||
let videoLoading = false;
|
||||
let videoReady = false;
|
||||
let videoErrored = false;
|
||||
let videoShowing = false;
|
||||
let videoRewardReceived = false;
|
||||
// App Open
|
||||
let appOpen;
|
||||
let appOpenLoading = false; // Becomes true when the appOpen is loading.
|
||||
let appOpenReady = false; // Becomes true when the appOpen is loaded and ready to be shown.
|
||||
let appOpenShowing = false; // Becomes true when the appOpen is showing.
|
||||
let appOpenErrored = false; // Becomes true when the appOpen fails to load.
|
||||
|
||||
// Rewarded interstitial
|
||||
let rewardedInterstitial;
|
||||
let rewardedInterstitialLoading = false; // Becomes true when the interstitial is loading.
|
||||
let rewardedInterstitialReady = false; // Becomes true when the interstitial is loaded and ready to be shown.
|
||||
let rewardedInterstitialShowing = false; // Becomes true when the interstitial is showing.
|
||||
let rewardedInterstitialRewardReceived = false; // Becomes true when the interstitial is closed and the reward is received.
|
||||
let rewardedInterstitialErrored = false; // Becomes true when the interstitial fails to load.
|
||||
|
||||
// Rewarded video
|
||||
let rewardedVideo;
|
||||
let rewardedVideoLoading = false; // Becomes true when the video is loading.
|
||||
let rewardedVideoReady = false; // Becomes true when the video is loaded and ready to be shown.
|
||||
let rewardedVideoShowing = false; // Becomes true when the video is showing.
|
||||
let rewardedVideoRewardReceived = false; // Becomes true when the video is closed and the reward is received.
|
||||
let rewardedVideoErrored = false; // Becomes true when the video fails to load.
|
||||
|
||||
let npaValue = '0'; // TODO: expose an API to change this and also an automatic way using the consent SDK.
|
||||
|
||||
// Admob initialization listener
|
||||
document.addEventListener(
|
||||
'deviceready',
|
||||
async () => {
|
||||
// Obtain user consent ?
|
||||
|
||||
await admob.start();
|
||||
|
||||
logger.info('AdMob succesfully started.');
|
||||
admobStarted = true;
|
||||
},
|
||||
false
|
||||
);
|
||||
|
||||
/**
|
||||
* Helper to know if we are on mobile and admob is correctly initialized.
|
||||
*/
|
||||
const checkIfAdMobIsAvailable = () => {
|
||||
if (typeof cordova === 'undefined') {
|
||||
logger.warn('We are not on mobile, AdMob will not be available.');
|
||||
return false;
|
||||
}
|
||||
if (typeof admob === 'undefined' || !admobStarted) {
|
||||
logger.warn('AdMob has not been configured or started properly.');
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
/**
|
||||
* Helper to get the correct ad id depending on the platform. Android and iOS use different ids.
|
||||
*/
|
||||
const getAdUnitId = (androidAdUnitId, iosAdUnitId, type) => {
|
||||
if (typeof cordova === 'undefined') {
|
||||
logger.warn('Cordova is not available.');
|
||||
return;
|
||||
}
|
||||
if (cordova.platformId === 'android') {
|
||||
return isUsingTestAds ? testAdIds[type].android : androidAdUnitId;
|
||||
} else if (cordova.platformId === 'ios') {
|
||||
return isUsingTestAds ? testAdIds[type].ios : iosAdUnitId;
|
||||
}
|
||||
|
||||
logger.error('Unsupported platform: ', cordova.platformId);
|
||||
return null;
|
||||
};
|
||||
|
||||
/**
|
||||
* Activate or deactivate the test mode ("development" mode).
|
||||
* When activated, tests ads will be served instead of real ones.
|
||||
@@ -47,43 +165,116 @@ namespace gdjs {
|
||||
* account being flagged for invalid activity.
|
||||
*/
|
||||
export const setTestMode = (enable: boolean) => {
|
||||
if (typeof admob === 'undefined') {
|
||||
if (!checkIfAdMobIsAvailable()) return;
|
||||
|
||||
isUsingTestAds = enable;
|
||||
};
|
||||
|
||||
// -------------------
|
||||
// ---- App Open -----
|
||||
// -------------------
|
||||
export const isAppOpenLoading = () => appOpenLoading;
|
||||
export const isAppOpenReady = () => appOpenReady;
|
||||
export const isAppOpenShowing = () => appOpenShowing;
|
||||
export const isAppOpenErrored = () => appOpenErrored;
|
||||
|
||||
/** Load an AppOpen. */
|
||||
export const loadAppOpen = async (
|
||||
androidAdUnitId,
|
||||
iosAdUnitId,
|
||||
displayLandscape,
|
||||
displayWhenLoaded
|
||||
) => {
|
||||
if (!checkIfAdMobIsAvailable()) return;
|
||||
// If an appOpen is already loading or showing, we don't stop it.
|
||||
if (appOpenLoading || appOpenShowing) {
|
||||
return;
|
||||
}
|
||||
|
||||
admob.setDevMode(enable);
|
||||
const adUnitId = getAdUnitId(androidAdUnitId, iosAdUnitId, 'appOpen');
|
||||
if (!adUnitId) return;
|
||||
|
||||
appOpenLoading = true;
|
||||
appOpenReady = false;
|
||||
appOpenErrored = false;
|
||||
|
||||
appOpen = new admob.AppOpenAd({
|
||||
adUnitId,
|
||||
orientation: displayLandscape
|
||||
? AppOpenAdOrientation.LandscapeLeft
|
||||
: AppOpenAdOrientation.Portrait,
|
||||
});
|
||||
|
||||
appOpen.on('load', () => {
|
||||
appOpenReady = true;
|
||||
appOpenLoading = false;
|
||||
});
|
||||
appOpen.on('loadfail', () => {
|
||||
appOpenLoading = false;
|
||||
appOpenErrored = true;
|
||||
});
|
||||
appOpen.on('show', () => {
|
||||
appOpenShowing = true;
|
||||
appOpenReady = false;
|
||||
});
|
||||
appOpen.on('showfail', () => {
|
||||
appOpenShowing = false;
|
||||
appOpenErrored = true;
|
||||
});
|
||||
appOpen.on('dismiss', () => {
|
||||
appOpenShowing = false;
|
||||
});
|
||||
|
||||
try {
|
||||
logger.info('Loading Admob App Open.');
|
||||
await appOpen.load();
|
||||
logger.info('AdMob App Open successfully loaded.');
|
||||
appOpenLoading = false;
|
||||
appOpenReady = true;
|
||||
if (displayWhenLoaded) showAppOpen();
|
||||
} catch (error) {
|
||||
logger.error('Error while loading an App Open:', error);
|
||||
appOpenLoading = false;
|
||||
appOpenReady = false;
|
||||
appOpenErrored = true;
|
||||
}
|
||||
};
|
||||
|
||||
// Banner
|
||||
/** Check if a banner is loading. */
|
||||
export const isBannerLoading = () => {
|
||||
return bannerLoading;
|
||||
};
|
||||
/** Check if a banner is being shown on screen. */
|
||||
export const isBannerShowing = () => {
|
||||
return bannerShowing;
|
||||
};
|
||||
/** Check if the banner had an error while loading it. */
|
||||
export const isBannerErrored = () => {
|
||||
return bannerErrored;
|
||||
};
|
||||
/** Show the loaded appOpen. */
|
||||
export const showAppOpen = async () => {
|
||||
if (!checkIfAdMobIsAvailable()) return;
|
||||
|
||||
/**
|
||||
* Set up a banner that can then be displayed by calling `showBanner`.
|
||||
*/
|
||||
export const setupBanner = function (androidID, iosID, atTop) {
|
||||
if (typeof admob === 'undefined') {
|
||||
if (!appOpen) {
|
||||
logger.warn('App Open has not been set up, call loadAppOpen first.');
|
||||
return;
|
||||
}
|
||||
if (!appOpenReady) {
|
||||
logger.info('App Open not loaded yet, cannot display it.');
|
||||
return;
|
||||
}
|
||||
appOpenErrored = false;
|
||||
|
||||
bannerAndroidId = androidID;
|
||||
bannerIosId = iosID;
|
||||
bannerPosition = atTop ? 'top' : 'bottom';
|
||||
try {
|
||||
logger.info('Showing AdMob App Open.');
|
||||
await appOpen.show();
|
||||
// AppOpen will be shown and
|
||||
// `appOpenShowing` will be updated thanks to events
|
||||
// (but it's too early to change it now).
|
||||
} catch (error) {
|
||||
logger.error('Error while showing an AdMob App Open:', error);
|
||||
appOpenShowing = false;
|
||||
appOpenErrored = true;
|
||||
}
|
||||
};
|
||||
/**
|
||||
* Set the size of the banner to be shown when `showBanner` is called.
|
||||
* @param bannerAdSizeType The type of the banner to displayed
|
||||
*/
|
||||
|
||||
// -----------------
|
||||
// ---- Banner -----
|
||||
// -----------------
|
||||
export const isBannerConfigured = () => bannerConfigured;
|
||||
export const isBannerLoaded = () => bannerLoaded;
|
||||
export const isBannerShowing = () => bannerShowing;
|
||||
export const isBannerErrored = () => bannerErrored;
|
||||
|
||||
export const setBannerAdSizeType = (
|
||||
bannerAdSizeType:
|
||||
| 'BANNER'
|
||||
@@ -93,288 +284,421 @@ namespace gdjs {
|
||||
| 'LEADERBOARD'
|
||||
| 'SMART_BANNER'
|
||||
) => {
|
||||
const adSizeTypes = {
|
||||
BANNER: AdSizeType.BANNER,
|
||||
LARGE_BANNER: AdSizeType.LARGE_BANNER,
|
||||
MEDIUM_RECTANGLE: AdSizeType.MEDIUM_RECTANGLE,
|
||||
FULL_BANNER: AdSizeType.FULL_BANNER,
|
||||
LEADERBOARD: AdSizeType.LEADERBOARD,
|
||||
SMART_BANNER: AdSizeType.SMART_BANNER,
|
||||
};
|
||||
|
||||
bannerRequestedAdSizeType =
|
||||
adSizeTypes[bannerAdSizeType] || AdSizeType.SMART_BANNER;
|
||||
};
|
||||
|
||||
/**
|
||||
* Display the banner that was set up with `loadBanner` (and `setBannerAdSizeType`).
|
||||
* Set up a banner that can then be displayed by calling `showBanner`.
|
||||
* If a banner is already set up, it will be hidden and replaced by the new one.
|
||||
*/
|
||||
export const showBanner = () => {
|
||||
if (typeof admob === 'undefined') {
|
||||
return;
|
||||
export const setupBanner = async (androidAdUnitId, iosAdUnitId, atTop) => {
|
||||
if (!checkIfAdMobIsAvailable()) return;
|
||||
const adUnitId = getAdUnitId(androidAdUnitId, iosAdUnitId, 'banner');
|
||||
if (!adUnitId) return;
|
||||
|
||||
if (banner && bannerShowing) {
|
||||
logger.info('Banner already visible, hiding it to display new one.');
|
||||
await hideBanner();
|
||||
}
|
||||
|
||||
bannerLoading = true;
|
||||
bannerShowing = false;
|
||||
bannerErrored = false;
|
||||
admob.banner
|
||||
.show({
|
||||
id: {
|
||||
android: bannerAndroidId,
|
||||
ios: bannerIosId,
|
||||
},
|
||||
position: bannerPosition,
|
||||
size: bannerRequestedAdSizeType,
|
||||
})
|
||||
.then(
|
||||
() => {
|
||||
bannerShowing = true;
|
||||
bannerLoading = false;
|
||||
logger.info('AdMob banner successfully shown.');
|
||||
},
|
||||
(error) => {
|
||||
bannerShowing = false;
|
||||
bannerLoading = false;
|
||||
bannerErrored = true;
|
||||
logger.error('Error while showing an AdMob banner:', error);
|
||||
}
|
||||
);
|
||||
};
|
||||
/** Hide the banner shown on screen. */
|
||||
export const hideBanner = () => {
|
||||
if (typeof admob === 'undefined') {
|
||||
return;
|
||||
}
|
||||
bannerConfigured = false;
|
||||
bannerLoaded = false;
|
||||
|
||||
bannerShowing = false;
|
||||
admob.banner.hide({
|
||||
android: bannerAndroidId,
|
||||
ios: bannerIosId,
|
||||
banner = new admob.BannerAd({
|
||||
adUnitId,
|
||||
position: atTop ? 'top' : 'bottom',
|
||||
size: bannerRequestedAdSizeType,
|
||||
});
|
||||
|
||||
banner.on('load', () => {
|
||||
bannerShowing = true;
|
||||
bannerLoaded = true;
|
||||
});
|
||||
banner.on('loadfail', () => {
|
||||
bannerShowing = false;
|
||||
bannerLoaded = false;
|
||||
bannerErrored = true;
|
||||
});
|
||||
|
||||
bannerConfigured = true;
|
||||
};
|
||||
|
||||
// Interstitial
|
||||
/** Check if the interstitial is loading. */
|
||||
export const isInterstitialLoading = () => {
|
||||
return interstitialLoading;
|
||||
/**
|
||||
* Display a banner that was set up with `setupBanner` (and `setBannerAdSizeType`).
|
||||
*/
|
||||
export const showBanner = async () => {
|
||||
if (!banner) {
|
||||
logger.info('Banner not configured, use setupBanner first.');
|
||||
return;
|
||||
}
|
||||
if (bannerShowing) {
|
||||
logger.info('Banner already visible. Ignoring.');
|
||||
return;
|
||||
}
|
||||
bannerErrored = false;
|
||||
|
||||
try {
|
||||
logger.info('Showing AdMob banner.');
|
||||
await banner.show();
|
||||
if (bannerLoaded) {
|
||||
// Banner is already loaded, so it will be shown immediately.
|
||||
bannerShowing = true;
|
||||
}
|
||||
} catch (error) {
|
||||
bannerShowing = false;
|
||||
bannerErrored = true;
|
||||
logger.error('Error while showing an AdMob banner:', error);
|
||||
}
|
||||
};
|
||||
/** Check if the interstitial is ready to display. */
|
||||
export const isInterstitialReady = () => {
|
||||
return interstitialReady;
|
||||
};
|
||||
/** Check if the interstitial is shown on screen. */
|
||||
export const isInterstitialShowing = () => {
|
||||
return interstitialShowing;
|
||||
};
|
||||
/** Check if the interstitial had an error while loading it. */
|
||||
export const isInterstitialErrored = () => {
|
||||
return interstitialErrored;
|
||||
|
||||
/** Hide the banner shown on screen. */
|
||||
export const hideBanner = async () => {
|
||||
if (!checkIfAdMobIsAvailable()) return;
|
||||
|
||||
if (!banner || !bannerShowing) {
|
||||
logger.warn('No banner is being shown.');
|
||||
return;
|
||||
}
|
||||
|
||||
await banner.hide();
|
||||
bannerShowing = false;
|
||||
// Note that the banner is still loaded, which is why bannerLoaded is not set to false.
|
||||
// We hide the banner, but keep it configured to display it again if needed.
|
||||
};
|
||||
|
||||
// -----------------------
|
||||
// ---- Interstitial -----
|
||||
// -----------------------
|
||||
export const isInterstitialLoading = () => interstitialLoading;
|
||||
export const isInterstitialReady = () => interstitialReady;
|
||||
export const isInterstitialShowing = () => interstitialShowing;
|
||||
export const isInterstitialErrored = () => interstitialErrored;
|
||||
|
||||
/** Load an interstitial. */
|
||||
export const loadInterstitial = (androidID, iosID, displayWhenLoaded) => {
|
||||
if (typeof admob === 'undefined') {
|
||||
return;
|
||||
}
|
||||
if (interstitialLoading || interstitialReady || interstitialShowing) {
|
||||
export const loadInterstitial = async (
|
||||
androidAdUnitId,
|
||||
iosAdUnitId,
|
||||
displayWhenLoaded
|
||||
) => {
|
||||
if (!checkIfAdMobIsAvailable()) return;
|
||||
// If an interstitial is already loading or showing, we don't stop it.
|
||||
if (interstitialLoading || interstitialShowing) {
|
||||
return;
|
||||
}
|
||||
|
||||
const adUnitId = getAdUnitId(
|
||||
androidAdUnitId,
|
||||
iosAdUnitId,
|
||||
'interstitial'
|
||||
);
|
||||
if (!adUnitId) return;
|
||||
|
||||
interstitialLoading = true;
|
||||
interstitialReady = false;
|
||||
interstitialErrored = false;
|
||||
admob.interstitial
|
||||
.load({
|
||||
id: {
|
||||
android: androidID,
|
||||
ios: iosID,
|
||||
},
|
||||
npa: npaValue,
|
||||
})
|
||||
.then(
|
||||
() => {
|
||||
logger.info('AdMob interstitial successfully loaded.');
|
||||
if (displayWhenLoaded) showInterstitial();
|
||||
},
|
||||
(error) => {
|
||||
interstitialLoading = false;
|
||||
interstitialReady = false;
|
||||
interstitialErrored = true;
|
||||
logger.error('Error while loading a interstitial:', error);
|
||||
}
|
||||
);
|
||||
|
||||
interstitial = new admob.InterstitialAd({
|
||||
adUnitId,
|
||||
npa: npaValue,
|
||||
});
|
||||
|
||||
interstitial.on('load', () => {
|
||||
interstitialReady = true;
|
||||
interstitialLoading = false;
|
||||
});
|
||||
interstitial.on('loadfail', () => {
|
||||
interstitialLoading = false;
|
||||
interstitialErrored = true;
|
||||
});
|
||||
interstitial.on('show', () => {
|
||||
interstitialShowing = true;
|
||||
interstitialReady = false;
|
||||
});
|
||||
interstitial.on('showfail', () => {
|
||||
interstitialShowing = false;
|
||||
interstitialErrored = true;
|
||||
});
|
||||
interstitial.on('dismiss', () => {
|
||||
interstitialShowing = false;
|
||||
});
|
||||
|
||||
try {
|
||||
logger.info('Loading Admob interstitial.');
|
||||
await interstitial.load();
|
||||
logger.info('AdMob interstitial successfully loaded.');
|
||||
interstitialLoading = false;
|
||||
interstitialReady = true;
|
||||
if (displayWhenLoaded) showInterstitial();
|
||||
} catch (error) {
|
||||
logger.error('Error while loading a interstitial:', error);
|
||||
interstitialLoading = false;
|
||||
interstitialReady = false;
|
||||
interstitialErrored = true;
|
||||
}
|
||||
};
|
||||
|
||||
/** Show the loaded interstitial. */
|
||||
export const showInterstitial = () => {
|
||||
if (typeof admob === 'undefined') {
|
||||
export const showInterstitial = async () => {
|
||||
if (!checkIfAdMobIsAvailable()) return;
|
||||
|
||||
if (!interstitial) {
|
||||
logger.warn(
|
||||
'Interstitial has not been set up, call loadInterstitial first.'
|
||||
);
|
||||
return;
|
||||
}
|
||||
admob.interstitial.show().then(
|
||||
() => {
|
||||
// Interstitial will be shown and
|
||||
// `interstitialShowing` will be updated thanks to events
|
||||
// (but it's too early to change it now).
|
||||
},
|
||||
(error) => {
|
||||
interstitialShowing = false;
|
||||
interstitialErrored = true;
|
||||
logger.error('Error while trying to show an interstitial:', error);
|
||||
}
|
||||
);
|
||||
if (!interstitialReady) {
|
||||
logger.info('Interstitial not loaded yet, cannot display it.');
|
||||
return;
|
||||
}
|
||||
interstitialErrored = false;
|
||||
|
||||
try {
|
||||
logger.info('Showing AdMob interstitial.');
|
||||
await interstitial.show();
|
||||
// Interstitial will be shown and
|
||||
// `interstitialShowing` will be updated thanks to events
|
||||
// (but it's too early to change it now).
|
||||
} catch (error) {
|
||||
logger.error('Error while showing an AdMob interstitial:', error);
|
||||
interstitialShowing = false;
|
||||
interstitialErrored = true;
|
||||
}
|
||||
};
|
||||
|
||||
// Reward video
|
||||
/** Check if the video is loading. */
|
||||
export const isVideoLoading = () => {
|
||||
return videoLoading;
|
||||
};
|
||||
/** Check if the video is ready to display. */
|
||||
export const isVideoReady = () => {
|
||||
return videoReady;
|
||||
};
|
||||
/** Check if the video is shown on screen. */
|
||||
export const isVideoShowing = () => {
|
||||
return videoShowing;
|
||||
};
|
||||
/** Check if the video had an error while loading it. */
|
||||
export const isVideoErrored = () => {
|
||||
return videoErrored;
|
||||
};
|
||||
// --------------------------------
|
||||
// ---- Rewarded Interstitial -----
|
||||
// --------------------------------
|
||||
export const isRewardedInterstitialLoading = () =>
|
||||
rewardedInterstitialLoading;
|
||||
export const isRewardedInterstitialReady = () => rewardedInterstitialReady;
|
||||
export const isRewardedInterstitialShowing = () =>
|
||||
rewardedInterstitialShowing;
|
||||
export const isRewardedInterstitialErrored = () =>
|
||||
rewardedInterstitialErrored;
|
||||
|
||||
/** Check if the reward of the video was received. */
|
||||
export const wasVideoRewardReceived = function (markAsClaimed) {
|
||||
const reward = videoRewardReceived;
|
||||
/** Check if the reward of the rewarded interstitial was received. */
|
||||
export const wasRewardedInterstitialRewardReceived = function (
|
||||
markAsClaimed
|
||||
) {
|
||||
const reward = rewardedInterstitialRewardReceived;
|
||||
if (markAsClaimed) {
|
||||
videoRewardReceived = false;
|
||||
rewardedInterstitialRewardReceived = false;
|
||||
}
|
||||
return reward;
|
||||
};
|
||||
|
||||
/** Load a reward video. */
|
||||
export const loadVideo = function (androidID, iosID, displayWhenLoaded) {
|
||||
if (typeof admob === 'undefined') {
|
||||
return;
|
||||
}
|
||||
if (videoLoading || videoReady || videoShowing) {
|
||||
/** Load a rewarded interstitial. */
|
||||
export const loadRewardedInterstitial = async (
|
||||
androidAdUnitID,
|
||||
iosAdUnitID,
|
||||
displayWhenLoaded
|
||||
) => {
|
||||
if (!checkIfAdMobIsAvailable()) return;
|
||||
if (rewardedInterstitialLoading || rewardedInterstitialShowing) {
|
||||
return;
|
||||
}
|
||||
|
||||
videoLoading = true;
|
||||
videoReady = false;
|
||||
videoErrored = false;
|
||||
admob.rewardVideo
|
||||
.load({
|
||||
id: {
|
||||
android: androidID,
|
||||
ios: iosID,
|
||||
},
|
||||
npa: npaValue,
|
||||
})
|
||||
.then(
|
||||
() => {
|
||||
logger.info('AdMob reward video successfully loaded.');
|
||||
const adUnitId = getAdUnitId(
|
||||
androidAdUnitID,
|
||||
iosAdUnitID,
|
||||
'rewardedInterstitial'
|
||||
);
|
||||
if (!adUnitId) return;
|
||||
|
||||
if (displayWhenLoaded) showVideo();
|
||||
},
|
||||
(error) => {
|
||||
videoLoading = false;
|
||||
videoReady = false;
|
||||
videoErrored = true;
|
||||
logger.error('Error while loading a reward video:', error);
|
||||
}
|
||||
rewardedInterstitialLoading = true;
|
||||
rewardedInterstitialReady = false;
|
||||
rewardedInterstitialErrored = false;
|
||||
|
||||
rewardedInterstitial = new admob.RewardedInterstitialAd({
|
||||
adUnitId,
|
||||
npa: npaValue,
|
||||
});
|
||||
|
||||
// Rewarded video event listeners
|
||||
rewardedInterstitial.on('load', () => {
|
||||
rewardedInterstitialReady = true;
|
||||
rewardedInterstitialLoading = false;
|
||||
});
|
||||
rewardedInterstitial.on('loadfail', () => {
|
||||
rewardedInterstitialLoading = false;
|
||||
rewardedInterstitialErrored = true;
|
||||
});
|
||||
rewardedInterstitial.on('show', () => {
|
||||
rewardedInterstitialShowing = true;
|
||||
rewardedInterstitialReady = false;
|
||||
});
|
||||
rewardedInterstitial.on('showfail', () => {
|
||||
rewardedInterstitialShowing = false;
|
||||
rewardedInterstitialErrored = true;
|
||||
});
|
||||
rewardedInterstitial.on('dismiss', () => {
|
||||
rewardedInterstitialShowing = false;
|
||||
});
|
||||
rewardedInterstitial.on('reward', () => {
|
||||
rewardedInterstitialRewardReceived = true;
|
||||
});
|
||||
|
||||
try {
|
||||
logger.info('Loading AdMob rewarded interstitial.');
|
||||
await rewardedInterstitial.load();
|
||||
logger.info('AdMob rewarded interstitial successfully loaded.');
|
||||
rewardedInterstitialLoading = false;
|
||||
rewardedInterstitialReady = true;
|
||||
if (displayWhenLoaded) showRewardedInterstitial();
|
||||
} catch (error) {
|
||||
rewardedInterstitialLoading = false;
|
||||
rewardedInterstitialReady = false;
|
||||
rewardedInterstitialErrored = true;
|
||||
logger.error('Error while loading a rewarded interstitial:', error);
|
||||
}
|
||||
};
|
||||
|
||||
/** Show the loaded reward interstitial. */
|
||||
export const showRewardedInterstitial = async () => {
|
||||
if (!checkIfAdMobIsAvailable()) return;
|
||||
|
||||
if (!rewardedInterstitial) {
|
||||
logger.warn(
|
||||
'interstitial has not been set up, call loadRewardedInterstitial first.'
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (!rewardedInterstitialReady) {
|
||||
logger.info('Rewarded interstitial not loaded yet, cannot display it.');
|
||||
}
|
||||
rewardedInterstitialErrored = false;
|
||||
|
||||
try {
|
||||
logger.info('Showing AdMob rewarded interstitial.');
|
||||
await rewardedInterstitial.show();
|
||||
// Rewarded interstitial will be shown and
|
||||
// `rewardedInterstitialShowing` will be updated thanks to events
|
||||
// (but it's too early to change it now).
|
||||
} catch (error) {
|
||||
logger.error(
|
||||
'Error while showing an AdMob rewarded interstitial:',
|
||||
error
|
||||
);
|
||||
rewardedInterstitialShowing = false;
|
||||
rewardedInterstitialErrored = true;
|
||||
}
|
||||
};
|
||||
|
||||
/** Mark the reward of the interstitial as claimed. */
|
||||
export const markRewardedInterstitialRewardAsClaimed = () => {
|
||||
rewardedInterstitialRewardReceived = false;
|
||||
};
|
||||
|
||||
// -------------------------
|
||||
// ---- Rewarded Video -----
|
||||
// -------------------------
|
||||
export const isRewardedVideoLoading = () => rewardedVideoLoading;
|
||||
export const isRewardedVideoReady = () => rewardedVideoReady;
|
||||
export const isRewardedVideoShowing = () => rewardedVideoShowing;
|
||||
export const isRewardedVideoErrored = () => rewardedVideoErrored;
|
||||
|
||||
/** Check if the reward of the rewarded video was received. */
|
||||
export const wasRewardedVideoRewardReceived = function (markAsClaimed) {
|
||||
const reward = rewardedVideoRewardReceived;
|
||||
if (markAsClaimed) {
|
||||
rewardedVideoRewardReceived = false;
|
||||
}
|
||||
return reward;
|
||||
};
|
||||
|
||||
/** Load a rewarded video. */
|
||||
export const loadRewardedVideo = async (
|
||||
androidAdUnitID,
|
||||
iosAdUnitID,
|
||||
displayWhenLoaded
|
||||
) => {
|
||||
if (!checkIfAdMobIsAvailable()) return;
|
||||
if (rewardedVideoLoading || rewardedVideoShowing) {
|
||||
return;
|
||||
}
|
||||
|
||||
const adUnitId = getAdUnitId(androidAdUnitID, iosAdUnitID, 'rewarded');
|
||||
if (!adUnitId) return;
|
||||
|
||||
rewardedVideoLoading = true;
|
||||
rewardedVideoReady = false;
|
||||
rewardedVideoErrored = false;
|
||||
|
||||
rewardedVideo = new admob.RewardedAd({
|
||||
adUnitId,
|
||||
npa: npaValue,
|
||||
});
|
||||
|
||||
// Rewarded video event listeners
|
||||
rewardedVideo.on('load', () => {
|
||||
rewardedVideoReady = true;
|
||||
rewardedVideoLoading = false;
|
||||
});
|
||||
rewardedVideo.on('loadfail', () => {
|
||||
rewardedVideoLoading = false;
|
||||
rewardedVideoErrored = true;
|
||||
});
|
||||
rewardedVideo.on('show', () => {
|
||||
rewardedVideoShowing = true;
|
||||
rewardedVideoReady = false;
|
||||
});
|
||||
rewardedVideo.on('showfail', () => {
|
||||
rewardedVideoShowing = false;
|
||||
rewardedVideoErrored = true;
|
||||
});
|
||||
rewardedVideo.on('dismiss', () => {
|
||||
rewardedVideoShowing = false;
|
||||
});
|
||||
rewardedVideo.on('reward', () => {
|
||||
rewardedVideoRewardReceived = true;
|
||||
});
|
||||
|
||||
try {
|
||||
logger.info('Loading AdMob rewarded video.');
|
||||
await rewardedVideo.load();
|
||||
logger.info('AdMob rewarded video successfully loaded.');
|
||||
rewardedVideoLoading = false;
|
||||
rewardedVideoReady = true;
|
||||
if (displayWhenLoaded) showRewardedVideo();
|
||||
} catch (error) {
|
||||
rewardedVideoLoading = false;
|
||||
rewardedVideoReady = false;
|
||||
rewardedVideoErrored = true;
|
||||
logger.error('Error while loading a rewarded video:', error);
|
||||
}
|
||||
};
|
||||
|
||||
/** Show the loaded reward video. */
|
||||
export const showVideo = () => {
|
||||
if (typeof admob === 'undefined') {
|
||||
export const showRewardedVideo = async () => {
|
||||
if (!checkIfAdMobIsAvailable()) return;
|
||||
|
||||
if (!rewardedVideo) {
|
||||
logger.warn('Video has not been set up, call loadRewardedVideo first.');
|
||||
return;
|
||||
}
|
||||
if (!rewardedVideoReady) {
|
||||
logger.info('Rewarded video not loaded yet, cannot display it.');
|
||||
}
|
||||
rewardedVideoErrored = false;
|
||||
|
||||
admob.rewardVideo.show().then(
|
||||
() => {
|
||||
// Video will be shown and
|
||||
// `videoShowing` will be updated thanks to events
|
||||
// (but it's too early to change it now).
|
||||
},
|
||||
(error) => {
|
||||
videoShowing = false;
|
||||
videoErrored = true;
|
||||
logger.error('Error while trying to show a reward video:', error);
|
||||
}
|
||||
);
|
||||
try {
|
||||
logger.info('Showing AdMob rewarded video.');
|
||||
await rewardedVideo.show();
|
||||
// Rewarded video will be shown and
|
||||
// `rewardedVideoShowing` will be updated thanks to events
|
||||
// (but it's too early to change it now).
|
||||
} catch (error) {
|
||||
logger.error('Error while showing an AdMob rewarded video:', error);
|
||||
rewardedVideoShowing = false;
|
||||
rewardedVideoErrored = true;
|
||||
}
|
||||
};
|
||||
|
||||
/** Mark the reward of the video as claimed. */
|
||||
export const markVideoRewardAsClaimed = () => {
|
||||
videoRewardReceived = false;
|
||||
export const markRewardedVideoRewardAsClaimed = () => {
|
||||
rewardedVideoRewardReceived = false;
|
||||
};
|
||||
|
||||
// Banner event listeners:
|
||||
document.addEventListener('admob.banner.load', () => {
|
||||
bannerShowing = true;
|
||||
bannerLoading = false;
|
||||
});
|
||||
document.addEventListener('admob.banner.load_fail', () => {
|
||||
bannerLoading = false;
|
||||
});
|
||||
|
||||
document.addEventListener('admob.banner.open', () => {
|
||||
// Not implemented.
|
||||
});
|
||||
|
||||
document.addEventListener('admob.banner.exit_app', () => {
|
||||
// Not implemented.
|
||||
});
|
||||
document.addEventListener('admob.banner.close', () => {
|
||||
// Not implemented.
|
||||
});
|
||||
|
||||
// Interstitial event listeners
|
||||
document.addEventListener('admob.interstitial.load', () => {
|
||||
interstitialReady = true;
|
||||
interstitialLoading = false;
|
||||
});
|
||||
document.addEventListener('admob.interstitial.load_fail', () => {
|
||||
interstitialLoading = false;
|
||||
});
|
||||
document.addEventListener('admob.interstitial.open', () => {
|
||||
interstitialShowing = true;
|
||||
interstitialReady = false;
|
||||
});
|
||||
document.addEventListener('admob.interstitial.close', () => {
|
||||
interstitialShowing = false;
|
||||
});
|
||||
document.addEventListener('admob.interstitial.exit_app', () => {
|
||||
// Not implemented.
|
||||
});
|
||||
|
||||
// Reward video event listeners
|
||||
document.addEventListener('admob.reward_video.load', () => {
|
||||
videoReady = true;
|
||||
videoLoading = false;
|
||||
});
|
||||
document.addEventListener('admob.reward_video.load_fail', () => {
|
||||
videoLoading = false;
|
||||
});
|
||||
document.addEventListener('admob.reward_video.open', () => {
|
||||
videoShowing = true;
|
||||
videoReady = false;
|
||||
});
|
||||
document.addEventListener('admob.reward_video.close', () => {
|
||||
videoShowing = false;
|
||||
});
|
||||
document.addEventListener('admob.reward_video.start', () => {
|
||||
// Not implemented.
|
||||
});
|
||||
document.addEventListener('admob.reward_video.complete', () => {
|
||||
// Not implemented.
|
||||
});
|
||||
document.addEventListener('admob.reward_video.reward', () => {
|
||||
videoRewardReceived = true;
|
||||
});
|
||||
document.addEventListener('admob.reward_video.exit_app', () => {
|
||||
// Not implemented.
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@@ -1,10 +1,7 @@
|
||||
// @ts-check
|
||||
describe('gdjs.AnchorRuntimeBehavior', function () {
|
||||
const runtimeGame = new gdjs.RuntimeGame({
|
||||
variables: [],
|
||||
resources: { resources: [] },
|
||||
// @ts-ignore
|
||||
properties: { windowWidth: 1000, windowHeight: 1000 },
|
||||
const runtimeGame = gdjs.getPixiRuntimeGame({
|
||||
propertiesOverrides: { windowHeight: 1000, windowWidth: 1000 },
|
||||
});
|
||||
const anchorBehaviorName = 'Anchor';
|
||||
const runtimeScene = new gdjs.RuntimeScene(runtimeGame);
|
||||
|
@@ -36,7 +36,7 @@ module.exports = {
|
||||
'Open source (MIT License)'
|
||||
)
|
||||
.setExtensionHelpPath('/objects/bbtext')
|
||||
.setCategory('User interface');
|
||||
.setCategory('Text');
|
||||
extension
|
||||
.addInstructionOrExpressionGroupMetadata(_('BBCode Text Object'))
|
||||
.setIcon('JsPlatform/Extensions/bbcode32.png');
|
||||
@@ -174,7 +174,7 @@ module.exports = {
|
||||
.addIncludeFile(
|
||||
'Extensions/BBText/pixi-multistyle-text/dist/pixi-multistyle-text.umd.js'
|
||||
)
|
||||
.setCategoryFullName(_('User interface'));
|
||||
.setCategoryFullName(_('Text'));
|
||||
|
||||
/**
|
||||
* Utility function to add both a setter and a getter to a property from a list.
|
||||
|
@@ -36,9 +36,10 @@ module.exports = {
|
||||
'Open source (MIT License)'
|
||||
)
|
||||
.setExtensionHelpPath('/objects/bitmap_text')
|
||||
.setCategory('User interface');
|
||||
extension.addInstructionOrExpressionGroupMetadata(_("Bitmap Text"))
|
||||
.setIcon("JsPlatform/Extensions/bitmapfont32.png");
|
||||
.setCategory('Text');
|
||||
extension
|
||||
.addInstructionOrExpressionGroupMetadata(_('Bitmap Text'))
|
||||
.setIcon('JsPlatform/Extensions/bitmapfont32.png');
|
||||
|
||||
const bitmapTextObject = new gd.ObjectJsImplementation();
|
||||
// $FlowExpectedError
|
||||
@@ -91,7 +92,7 @@ module.exports = {
|
||||
.setType('resource')
|
||||
.addExtraInfo('bitmapFont') //fnt or xml files
|
||||
.setLabel(_('Bitmap Font'))
|
||||
.setGroup(_("Font"));
|
||||
.setGroup(_('Font'));
|
||||
|
||||
objectProperties
|
||||
.getOrCreate('textureAtlasResourceName')
|
||||
@@ -99,7 +100,7 @@ module.exports = {
|
||||
.setType('resource')
|
||||
.addExtraInfo('image')
|
||||
.setLabel(_('Bitmap atlas image'))
|
||||
.setGroup(_("Font"));
|
||||
.setGroup(_('Font'));
|
||||
|
||||
objectProperties
|
||||
.getOrCreate('scale')
|
||||
@@ -113,7 +114,7 @@ module.exports = {
|
||||
.setValue(objectContent.tint)
|
||||
.setType('color')
|
||||
.setLabel(_('Font tint'))
|
||||
.setGroup(_("Font"));
|
||||
.setGroup(_('Font'));
|
||||
|
||||
objectProperties
|
||||
.getOrCreate('wordWrap')
|
||||
@@ -174,7 +175,7 @@ module.exports = {
|
||||
.addIncludeFile(
|
||||
'Extensions/BitmapText/bitmaptextruntimeobject-pixi-renderer.js'
|
||||
)
|
||||
.setCategoryFullName(_('User interface'));
|
||||
.setCategoryFullName(_('Text'));
|
||||
|
||||
object
|
||||
.addExpressionAndConditionAndAction(
|
||||
@@ -652,8 +653,7 @@ module.exports = {
|
||||
|
||||
// This is called to update the PIXI object on the scene editor
|
||||
RenderedBitmapTextInstance.prototype.update = function () {
|
||||
const properties = this._associatedObjectConfiguration
|
||||
.getProperties();
|
||||
const properties = this._associatedObjectConfiguration.getProperties();
|
||||
|
||||
// Update the rendered text properties (note: Pixi is only
|
||||
// applying changes if there were changed).
|
||||
|
@@ -1,11 +1,6 @@
|
||||
// @ts-check
|
||||
describe('gdjs.DraggableRuntimeBehavior', function () {
|
||||
var runtimeGame = new gdjs.RuntimeGame({
|
||||
variables: [],
|
||||
resources: { resources: [] },
|
||||
// @ts-ignore
|
||||
properties: { windowWidth: 800, windowHeight: 600 },
|
||||
});
|
||||
const runtimeGame = gdjs.getPixiRuntimeGame();
|
||||
var runtimeScene = new gdjs.RuntimeScene(runtimeGame);
|
||||
runtimeScene.loadFromScene({
|
||||
layers: [
|
||||
|
@@ -176,12 +176,12 @@ module.exports = {
|
||||
.setType('number');
|
||||
bevelProperties
|
||||
.getOrCreate('lightColor')
|
||||
.setValue('#ffffff')
|
||||
.setValue('255;255;255')
|
||||
.setLabel(_('Light color (color of the outline)'))
|
||||
.setType('color');
|
||||
bevelProperties
|
||||
.getOrCreate('shadowColor')
|
||||
.setValue('#000000')
|
||||
.setValue('0;0;0')
|
||||
.setLabel(_('Shadow color (color of the outline)'))
|
||||
.setType('color');
|
||||
bevelProperties
|
||||
@@ -333,13 +333,13 @@ module.exports = {
|
||||
const colorReplaceProperties = colorReplaceEffect.getProperties();
|
||||
colorReplaceProperties
|
||||
.getOrCreate('originalColor')
|
||||
.setValue('#ff0000')
|
||||
.setValue('252;3;65')
|
||||
.setLabel(_('Original Color'))
|
||||
.setType('color')
|
||||
.setDescription('The color that will be changed');
|
||||
colorReplaceProperties
|
||||
.getOrCreate('newColor')
|
||||
.setValue('#000000')
|
||||
.setValue('255;255;255')
|
||||
.setLabel(_('New Color'))
|
||||
.setType('color')
|
||||
.setDescription('The new color');
|
||||
@@ -517,7 +517,7 @@ module.exports = {
|
||||
.setType('number');
|
||||
dropShadowProperties
|
||||
.getOrCreate('color')
|
||||
.setValue('#000000')
|
||||
.setValue('255;255;255')
|
||||
.setLabel(_('Color of the shadow'))
|
||||
.setType('color');
|
||||
dropShadowProperties
|
||||
@@ -646,7 +646,7 @@ module.exports = {
|
||||
.setType('number');
|
||||
glowProperties
|
||||
.getOrCreate('color')
|
||||
.setValue('#ffffff')
|
||||
.setValue('255;255;255')
|
||||
.setLabel(_('Color (color of the outline)'))
|
||||
.setType('color');
|
||||
|
||||
@@ -868,7 +868,7 @@ module.exports = {
|
||||
.setType('number');
|
||||
outlineProperties
|
||||
.getOrCreate('color')
|
||||
.setValue('1')
|
||||
.setValue('255;255;255')
|
||||
.setLabel(_('Color of the outline'))
|
||||
.setType('color');
|
||||
outlineProperties
|
||||
|
@@ -89,7 +89,7 @@ module.exports = {
|
||||
.addExtraInfo('image');
|
||||
dummyEffectProperties
|
||||
.getOrCreate('someColor')
|
||||
.setValue('#0022FF')
|
||||
.setValue('255;3;62')
|
||||
.setLabel(_("Color (won't be used, just for demonstration purpose)"))
|
||||
.setType('color')
|
||||
.setDescription(_('Another optional description.'));
|
||||
|
@@ -75,7 +75,8 @@ module.exports = {
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
|
||||
.setFunctionName('gdjs.fileSystem.makeDirectory');
|
||||
.setFunctionName('gdjs.fileSystem.makeDirectory')
|
||||
.setAsyncFunctionName('gdjs.fileSystem.makeDirectoryAsync');
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
@@ -127,7 +128,8 @@ module.exports = {
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
|
||||
.setFunctionName('gdjs.fileSystem.saveStringToFileAsync');
|
||||
.setFunctionName('gdjs.fileSystem.saveStringToFileAsync')
|
||||
.setAsyncFunctionName('gdjs.fileSystem.saveStringToFileAsyncTask');
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
@@ -179,7 +181,8 @@ module.exports = {
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
|
||||
.setFunctionName('gdjs.fileSystem.saveVariableToJSONFileAsync');
|
||||
.setFunctionName('gdjs.fileSystem.saveVariableToJSONFileAsync')
|
||||
.setAsyncFunctionName('gdjs.fileSystem.saveVariableToJSONFileAsyncTask');
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
@@ -217,7 +220,8 @@ module.exports = {
|
||||
.setDefaultValue('yes')
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
|
||||
.setFunctionName('gdjs.fileSystem.loadStringFromFileAsync');
|
||||
.setFunctionName('gdjs.fileSystem.loadStringFromFileAsync')
|
||||
.setAsyncFunctionName('gdjs.fileSystem.loadStringFromFileAsyncTask');
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
@@ -331,7 +335,10 @@ module.exports = {
|
||||
.setDefaultValue('yes')
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
|
||||
.setFunctionName('gdjs.fileSystem.loadVariableFromJSONFileAsync');
|
||||
.setFunctionName('gdjs.fileSystem.loadVariableFromJSONFileAsync')
|
||||
.setAsyncFunctionName(
|
||||
'gdjs.fileSystem.loadVariableFromJSONFileAsyncTask'
|
||||
);
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
@@ -379,7 +386,8 @@ module.exports = {
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
|
||||
.setFunctionName('gdjs.fileSystem.deleteFileAsync');
|
||||
.setFunctionName('gdjs.fileSystem.deleteFileAsync')
|
||||
.setAsyncFunctionName('gdjs.fileSystem.deleteFileAsyncTask');
|
||||
|
||||
extension
|
||||
.addStrExpression(
|
||||
|
@@ -2,28 +2,20 @@ namespace gdjs {
|
||||
const logger = new gdjs.Logger('Filesystem');
|
||||
export namespace fileSystem {
|
||||
// The Node.js path module, or null if it can't be loaded.
|
||||
export let _path: any = null;
|
||||
const path: typeof import('path') | null =
|
||||
typeof require !== 'undefined' ? require('path') : null;
|
||||
// The Node.js fs module, or null if it can't be loaded.
|
||||
export let _fs: any = null;
|
||||
const fs: typeof import('fs') | null =
|
||||
typeof require !== 'undefined' ? require('fs') : null;
|
||||
const asyncFs: typeof import('fs/promises') | null =
|
||||
typeof require !== 'undefined' ? require('fs/promises') : null;
|
||||
|
||||
/** Get the Node.js path module, or null if it can't be loaded */
|
||||
export const _getPath = function () {
|
||||
if (!_path) {
|
||||
_path = typeof require !== 'undefined' ? require('path') : null;
|
||||
}
|
||||
return _path;
|
||||
};
|
||||
|
||||
/** Get the Node.js fs module, or null if it can't be loaded */
|
||||
export const _getFs = function () {
|
||||
if (!_fs) {
|
||||
_fs = typeof require !== 'undefined' ? require('fs') : null;
|
||||
}
|
||||
return _fs;
|
||||
};
|
||||
if (!fs)
|
||||
logger.warn(
|
||||
'Filesystem is not supported on this platform! Only PC builds support filesystem access.'
|
||||
);
|
||||
|
||||
export const getDirectoryName = function (fileOrFolderPath: string) {
|
||||
const path = gdjs.fileSystem._getPath();
|
||||
if (!path) {
|
||||
return '';
|
||||
}
|
||||
@@ -31,7 +23,6 @@ namespace gdjs {
|
||||
};
|
||||
|
||||
export const getFileName = function (filePath: string) {
|
||||
const path = gdjs.fileSystem._getPath();
|
||||
if (!path) {
|
||||
return '';
|
||||
}
|
||||
@@ -39,7 +30,6 @@ namespace gdjs {
|
||||
};
|
||||
|
||||
export const getExtensionName = function (filePath: string) {
|
||||
const path = gdjs.fileSystem._getPath();
|
||||
if (!path) {
|
||||
return '';
|
||||
}
|
||||
@@ -134,10 +124,7 @@ namespace gdjs {
|
||||
export const getExecutableFolderPath = function (
|
||||
instanceContainer: gdjs.RuntimeInstanceContainer
|
||||
): string {
|
||||
const path = gdjs.fileSystem._getPath();
|
||||
const executablePath = gdjs.fileSystem.getExecutablePath(
|
||||
instanceContainer
|
||||
);
|
||||
const executablePath = getExecutablePath(instanceContainer);
|
||||
if (!path) {
|
||||
return '';
|
||||
}
|
||||
@@ -208,7 +195,6 @@ namespace gdjs {
|
||||
* @return The path delimiter
|
||||
*/
|
||||
export const getPathDelimiter = function (): string {
|
||||
const path = gdjs.fileSystem._getPath();
|
||||
if (path) {
|
||||
return path.sep || '/';
|
||||
} else {
|
||||
@@ -225,11 +211,10 @@ namespace gdjs {
|
||||
directory: string,
|
||||
resultVar: gdjs.Variable
|
||||
) {
|
||||
const fileSystem = gdjs.fileSystem._getFs();
|
||||
let result = 'error';
|
||||
if (fileSystem) {
|
||||
if (fs) {
|
||||
try {
|
||||
fileSystem.mkdirSync(directory);
|
||||
fs.mkdirSync(directory);
|
||||
result = 'ok';
|
||||
} catch (err) {
|
||||
logger.error(
|
||||
@@ -241,6 +226,27 @@ namespace gdjs {
|
||||
resultVar.setString(result);
|
||||
};
|
||||
|
||||
export const makeDirectoryAsync = (
|
||||
directory: string,
|
||||
resultVar: gdjs.Variable
|
||||
) =>
|
||||
asyncFs
|
||||
? new gdjs.PromiseTask(
|
||||
asyncFs
|
||||
.mkdir(directory, { recursive: true })
|
||||
.then(() => {
|
||||
resultVar.setString('ok');
|
||||
})
|
||||
.catch((err) => {
|
||||
resultVar.setString('error');
|
||||
logger.error(
|
||||
"Unable to create directory at: '" + directory + "': ",
|
||||
err
|
||||
);
|
||||
})
|
||||
)
|
||||
: (resultVar.setString('error'), new gdjs.ResolveTask());
|
||||
|
||||
/**
|
||||
* Save a string into a file, asynchronously.
|
||||
* @param text The string to be saved
|
||||
@@ -252,9 +258,8 @@ namespace gdjs {
|
||||
savePath: string,
|
||||
resultVar: gdjs.Variable
|
||||
) {
|
||||
const fileSystem = gdjs.fileSystem._getFs();
|
||||
if (fileSystem) {
|
||||
fileSystem.writeFile(savePath, text, 'utf8', (err) => {
|
||||
if (fs) {
|
||||
fs.writeFile(savePath, text, 'utf8', (err) => {
|
||||
resultVar.setString('ok');
|
||||
if (err) {
|
||||
logger.error(
|
||||
@@ -267,6 +272,28 @@ namespace gdjs {
|
||||
}
|
||||
};
|
||||
|
||||
export const saveStringToFileAsyncTask = (
|
||||
text: string,
|
||||
savePath: string,
|
||||
resultVar: gdjs.Variable
|
||||
) =>
|
||||
asyncFs
|
||||
? new gdjs.PromiseTask(
|
||||
asyncFs
|
||||
.writeFile(savePath, text, { encoding: 'utf8' })
|
||||
.then(() => {
|
||||
resultVar.setString('ok');
|
||||
})
|
||||
.catch((err) => {
|
||||
resultVar.setString('error');
|
||||
logger.error(
|
||||
"Unable to save the text to path: '" + savePath + "': ",
|
||||
err
|
||||
);
|
||||
})
|
||||
)
|
||||
: (resultVar.setString('error'), new gdjs.ResolveTask());
|
||||
|
||||
/**
|
||||
* Save a string into a file.
|
||||
* @param text The string to be saved
|
||||
@@ -278,11 +305,10 @@ namespace gdjs {
|
||||
savePath: string,
|
||||
resultVar: gdjs.Variable
|
||||
) {
|
||||
const fileSystem = gdjs.fileSystem._getFs();
|
||||
let result = 'error';
|
||||
if (fileSystem) {
|
||||
if (fs) {
|
||||
try {
|
||||
fileSystem.writeFileSync(savePath, text, 'utf8');
|
||||
fs.writeFileSync(savePath, text, 'utf8');
|
||||
result = 'ok';
|
||||
} catch (err) {
|
||||
logger.error(
|
||||
@@ -305,11 +331,10 @@ namespace gdjs {
|
||||
savePath: string,
|
||||
resultVar: gdjs.Variable
|
||||
) {
|
||||
const fileSystem = gdjs.fileSystem._getFs();
|
||||
let result = 'error';
|
||||
if (fileSystem) {
|
||||
if (fs) {
|
||||
try {
|
||||
fileSystem.writeFileSync(
|
||||
fs.writeFileSync(
|
||||
savePath,
|
||||
JSON.stringify(variable.toJSObject()),
|
||||
'utf8'
|
||||
@@ -336,9 +361,8 @@ namespace gdjs {
|
||||
savePath: string,
|
||||
resultVar: gdjs.Variable
|
||||
) {
|
||||
const fileSystem = gdjs.fileSystem._getFs();
|
||||
if (fileSystem) {
|
||||
fileSystem.writeFile(
|
||||
if (fs) {
|
||||
fs.writeFile(
|
||||
savePath,
|
||||
JSON.stringify(variable.toJSObject()),
|
||||
'utf8',
|
||||
@@ -356,6 +380,30 @@ namespace gdjs {
|
||||
}
|
||||
};
|
||||
|
||||
export const saveVariableToJSONFileAsyncTask = (
|
||||
variable: gdjs.Variable,
|
||||
savePath: string,
|
||||
resultVar: gdjs.Variable
|
||||
) =>
|
||||
asyncFs
|
||||
? new gdjs.PromiseTask(
|
||||
asyncFs
|
||||
.writeFile(savePath, JSON.stringify(variable.toJSObject()), {
|
||||
encoding: 'utf8',
|
||||
})
|
||||
.then(() => {
|
||||
resultVar.setString('ok');
|
||||
})
|
||||
.catch((err) => {
|
||||
resultVar.setString('error');
|
||||
logger.error(
|
||||
"Unable to save the text to path: '" + savePath + "': ",
|
||||
err
|
||||
);
|
||||
})
|
||||
)
|
||||
: (resultVar.setString('error'), new gdjs.ResolveTask());
|
||||
|
||||
/**
|
||||
* Load a string from a file into a scene variable.
|
||||
* @param stringVar Variable where to store the content
|
||||
@@ -369,11 +417,10 @@ namespace gdjs {
|
||||
resultVar: gdjs.Variable,
|
||||
removeCRCharacters: boolean
|
||||
) {
|
||||
const fileSystem = gdjs.fileSystem._getFs();
|
||||
let result = 'error';
|
||||
if (fileSystem) {
|
||||
if (fs) {
|
||||
try {
|
||||
const data = fileSystem.readFileSync(loadPath, 'utf8');
|
||||
const data = fs.readFileSync(loadPath, 'utf8');
|
||||
if (data) {
|
||||
stringVar.setString(
|
||||
removeCRCharacters ? data.replace(/\r/g, '') : data
|
||||
@@ -403,11 +450,10 @@ namespace gdjs {
|
||||
resultVar: gdjs.Variable,
|
||||
removeCRCharacters: boolean
|
||||
) {
|
||||
const fileSystem = gdjs.fileSystem._getFs();
|
||||
let result = 'error';
|
||||
if (fileSystem) {
|
||||
if (fs) {
|
||||
try {
|
||||
const data = fileSystem.readFileSync(loadPath, 'utf8');
|
||||
const data = fs.readFileSync(loadPath, 'utf8');
|
||||
if (data) {
|
||||
variable.fromJSON(
|
||||
removeCRCharacters ? data.replace(/\r/g, '') : data
|
||||
@@ -439,9 +485,8 @@ namespace gdjs {
|
||||
resultVar: gdjs.Variable,
|
||||
removeCRCharacters: boolean
|
||||
) {
|
||||
const fileSystem = gdjs.fileSystem._getFs();
|
||||
if (fileSystem) {
|
||||
fileSystem.readFile(loadPath, 'utf8', (err, data) => {
|
||||
if (fs) {
|
||||
fs.readFile(loadPath, 'utf8', (err, data) => {
|
||||
if (data) {
|
||||
variable.fromJSON(
|
||||
removeCRCharacters ? data.replace(/\r/g, '') : data
|
||||
@@ -461,6 +506,35 @@ namespace gdjs {
|
||||
}
|
||||
};
|
||||
|
||||
export const loadVariableFromJSONFileAsyncTask = (
|
||||
variable: gdjs.Variable,
|
||||
loadPath: string,
|
||||
resultVar: gdjs.Variable,
|
||||
removeCRCharacters: boolean
|
||||
) =>
|
||||
asyncFs
|
||||
? new gdjs.PromiseTask(
|
||||
asyncFs
|
||||
.readFile(loadPath, { encoding: 'utf8' })
|
||||
.then((data) => {
|
||||
if (data)
|
||||
variable.fromJSON(
|
||||
removeCRCharacters ? data.replace(/\r/g, '') : data
|
||||
);
|
||||
resultVar.setString('ok');
|
||||
})
|
||||
.catch((err) => {
|
||||
resultVar.setString('error');
|
||||
logger.error(
|
||||
"Unable to load the JSON file from path: '" +
|
||||
loadPath +
|
||||
"': ",
|
||||
err
|
||||
);
|
||||
})
|
||||
)
|
||||
: (resultVar.setString('error'), new gdjs.ResolveTask());
|
||||
|
||||
/**
|
||||
* Load a string from a file into a scene variable, asynchronously.
|
||||
* @param stringVar Variable where to store the content
|
||||
@@ -474,9 +548,8 @@ namespace gdjs {
|
||||
resultVar: gdjs.Variable,
|
||||
removeCRCharacters: boolean
|
||||
) {
|
||||
const fileSystem = gdjs.fileSystem._getFs();
|
||||
if (fileSystem) {
|
||||
fileSystem.readFile(loadPath, 'utf8', (err, data) => {
|
||||
if (fs) {
|
||||
fs.readFile(loadPath, 'utf8', (err, data) => {
|
||||
if (data) {
|
||||
stringVar.setString(
|
||||
removeCRCharacters ? data.replace(/\r/g, '') : data
|
||||
@@ -494,6 +567,35 @@ namespace gdjs {
|
||||
}
|
||||
};
|
||||
|
||||
export const loadStringFromFileAsyncTask = (
|
||||
variable: gdjs.Variable,
|
||||
loadPath: string,
|
||||
resultVar: gdjs.Variable,
|
||||
removeCRCharacters: boolean
|
||||
) =>
|
||||
asyncFs
|
||||
? new gdjs.PromiseTask(
|
||||
asyncFs
|
||||
.readFile(loadPath, { encoding: 'utf8' })
|
||||
.then((data) => {
|
||||
if (data)
|
||||
variable.setString(
|
||||
removeCRCharacters ? data.replace(/\r/g, '') : data
|
||||
);
|
||||
resultVar.setString('ok');
|
||||
})
|
||||
.catch((err) => {
|
||||
resultVar.setString('error');
|
||||
logger.error(
|
||||
"Unable to load the text file from path: '" +
|
||||
loadPath +
|
||||
"': ",
|
||||
err
|
||||
);
|
||||
})
|
||||
)
|
||||
: (resultVar.setString('error'), new gdjs.ResolveTask());
|
||||
|
||||
/**
|
||||
* Delete a file from the filesystem.
|
||||
* @param filePath Path to the file
|
||||
@@ -503,11 +605,10 @@ namespace gdjs {
|
||||
filePath: string,
|
||||
resultVar: gdjs.Variable
|
||||
) {
|
||||
const fileSystem = gdjs.fileSystem._getFs();
|
||||
let result = 'error';
|
||||
if (fileSystem) {
|
||||
if (fs) {
|
||||
try {
|
||||
fileSystem.unlinkSync(filePath);
|
||||
fs.unlinkSync(filePath);
|
||||
result = 'ok';
|
||||
} catch (err) {
|
||||
logger.error("Unable to delete the file: '" + filePath + "': ", err);
|
||||
@@ -526,9 +627,8 @@ namespace gdjs {
|
||||
filePath: string,
|
||||
resultVar: gdjs.Variable
|
||||
) {
|
||||
const fileSystem = gdjs.fileSystem._getFs();
|
||||
if (fileSystem) {
|
||||
fileSystem.unlink(filePath, (err) => {
|
||||
if (fs) {
|
||||
fs.unlink(filePath, (err) => {
|
||||
resultVar.setString('ok');
|
||||
if (err) {
|
||||
logger.error(
|
||||
@@ -541,15 +641,35 @@ namespace gdjs {
|
||||
}
|
||||
};
|
||||
|
||||
export const deleteFileAsyncTask = (
|
||||
filePath: string,
|
||||
resultVar: gdjs.Variable
|
||||
) =>
|
||||
asyncFs
|
||||
? new gdjs.PromiseTask(
|
||||
asyncFs
|
||||
.rm(filePath, { recursive: true })
|
||||
.then(() => {
|
||||
resultVar.setString('ok');
|
||||
})
|
||||
.catch((err) => {
|
||||
resultVar.setString('error');
|
||||
logger.error(
|
||||
"Unable to delete the file: '" + filePath + "': ",
|
||||
err
|
||||
);
|
||||
})
|
||||
)
|
||||
: (resultVar.setString('error'), new gdjs.ResolveTask());
|
||||
|
||||
/**
|
||||
* Check if the file or directory exists.
|
||||
* @param filePath The path to the file or directory
|
||||
* @return true if fhe file or directory exists
|
||||
*/
|
||||
export const pathExists = function (filePath: string): boolean {
|
||||
const fileSystem = gdjs.fileSystem._getFs();
|
||||
if (fileSystem) {
|
||||
return fileSystem.existsSync(filePath);
|
||||
if (fs) {
|
||||
return fs.existsSync(filePath);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
@@ -1,17 +1,3 @@
|
||||
/**
|
||||
* A firebase configuaration of a project made only for those tests.
|
||||
*/
|
||||
const firebaseConfig = {
|
||||
apiKey: 'AIzaSyBwPnGpfEBXDjwQrWfU0wqgp4m9qEt7YM8',
|
||||
authDomain: 'gdtest-e11a5.firebaseapp.com',
|
||||
databaseURL: 'https://gdtest-e11a5.firebaseio.com',
|
||||
projectId: 'gdtest-e11a5',
|
||||
storageBucket: 'gdtest-e11a5.appspot.com',
|
||||
messagingSenderId: '254035412678',
|
||||
appId: '1:254035412678:web:2ddd6b83019b7f259b79c7',
|
||||
measurementId: 'G-4REML26L59',
|
||||
};
|
||||
|
||||
/**
|
||||
* Turns a callback variable into a promise.
|
||||
* @param {(callbackVariable: {setString: (result: "ok" | string) => void}, result: gdjs.Variable) => any} executor
|
||||
@@ -38,6 +24,20 @@ const variable = new gdjs.Variable().fromJSObject({
|
||||
it: ['is', true],
|
||||
});
|
||||
|
||||
/**
|
||||
* A firebase configuration of a project made only for those tests.
|
||||
*/
|
||||
const firebaseConfig = {
|
||||
apiKey: 'AIzaSyBwPnGpfEBXDjwQrWfU0wqgp4m9qEt7YM8',
|
||||
authDomain: 'gdtest-e11a5.firebaseapp.com',
|
||||
databaseURL: 'https://gdtest-e11a5.firebaseio.com',
|
||||
projectId: 'gdtest-e11a5',
|
||||
storageBucket: 'gdtest-e11a5.appspot.com',
|
||||
messagingSenderId: '254035412678',
|
||||
appId: '1:254035412678:web:2ddd6b83019b7f259b79c7',
|
||||
measurementId: 'G-4REML26L59',
|
||||
};
|
||||
|
||||
// The tests require an internet connection, as a real Firebase instance is used.
|
||||
const describeIfOnline = navigator.onLine ? describe : describe.skip;
|
||||
describeIfOnline('Firebase extension end-to-end tests', function () {
|
||||
@@ -48,8 +48,8 @@ describeIfOnline('Firebase extension end-to-end tests', function () {
|
||||
.toString()
|
||||
.replace('.', '-')}-${Date.now()}`;
|
||||
|
||||
before(function setupFirebase() {
|
||||
gdjs.evtTools.firebaseTools._setupFirebase({
|
||||
before(async function setupFirebase() {
|
||||
await gdjs.evtTools.firebaseTools._setupFirebase({
|
||||
getGame: () => ({
|
||||
getExtensionProperty: () => JSON.stringify(firebaseConfig),
|
||||
}),
|
||||
|
@@ -1,10 +1,6 @@
|
||||
describe('Inventory', function () {
|
||||
it('Inventories can be serialized then unserialized with no data loss', () => {
|
||||
var runtimeGame = new gdjs.RuntimeGame({
|
||||
variables: [],
|
||||
properties: { windowWidth: 800, windowHeight: 600 },
|
||||
resources: { resources: [] },
|
||||
});
|
||||
const runtimeGame = gdjs.getPixiRuntimeGame();
|
||||
var runtimeScene = new gdjs.RuntimeScene(runtimeGame);
|
||||
|
||||
gdjs.evtTools.inventory.add(runtimeScene, 'MyInventory', 'sword');
|
||||
|
@@ -154,6 +154,21 @@ module.exports = {
|
||||
.setIncludeFile('Extensions/Leaderboards/leaderboardstools.js')
|
||||
.setFunctionName('gdjs.evtTools.leaderboards.isSaving');
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'HasPlayerJustClosedLeaderboardView',
|
||||
_('Closed by player'),
|
||||
_('Check if the player has just closed the leaderboard view.'),
|
||||
_('Player has just closed the leaderboard view'),
|
||||
_('Display leaderboard'),
|
||||
'JsPlatform/Extensions/leaderboard.svg',
|
||||
'JsPlatform/Extensions/leaderboard.svg'
|
||||
)
|
||||
.setHelpPath('/all-features/leaderboards')
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/Leaderboards/leaderboardstools.js')
|
||||
.setFunctionName('gdjs.evtTools.leaderboards.hasPlayerJustClosedLeaderboardView');
|
||||
|
||||
extension
|
||||
.addStrExpression(
|
||||
'LastSaveError',
|
||||
|
@@ -5,6 +5,19 @@ namespace gdjs {
|
||||
const logger = new gdjs.Logger('Leaderboards');
|
||||
export namespace evtTools {
|
||||
export namespace leaderboards {
|
||||
let _hasPlayerJustClosedLeaderboardView = false;
|
||||
|
||||
gdjs.registerRuntimeScenePostEventsCallback(() => {
|
||||
// Set it back to false for the next frame.
|
||||
_hasPlayerJustClosedLeaderboardView = false;
|
||||
});
|
||||
|
||||
/**
|
||||
* Returns true if the player has just closed the leaderboard view.
|
||||
*/
|
||||
export const hasPlayerJustClosedLeaderboardView = () =>
|
||||
_hasPlayerJustClosedLeaderboardView;
|
||||
|
||||
const computeDigest = (payload: string): string => {
|
||||
const shaObj = new jsSHA('SHA-256', 'TEXT', { encoding: 'UTF8' });
|
||||
shaObj.update(payload);
|
||||
@@ -521,6 +534,7 @@ namespace gdjs {
|
||||
) {
|
||||
switch (event.data) {
|
||||
case 'closeLeaderboardView':
|
||||
_hasPlayerJustClosedLeaderboardView = true;
|
||||
closeLeaderboardView(runtimeScene);
|
||||
break;
|
||||
case 'leaderboardViewLoaded':
|
||||
@@ -672,7 +686,7 @@ namespace gdjs {
|
||||
const isDev = runtimeScene
|
||||
.getGame()
|
||||
.isUsingGDevelopDevelopmentEnvironment();
|
||||
const targetUrl = `https://liluo.io/games/${gameId}/leaderboard/${leaderboardId}?inGameEmbedded=true${
|
||||
const targetUrl = `https://gd.games/games/${gameId}/leaderboard/${leaderboardId}?inGameEmbedded=true${
|
||||
isDev ? '&dev=true' : ''
|
||||
}`;
|
||||
checkLeaderboardAvailability(targetUrl).then(
|
||||
|
@@ -56,13 +56,7 @@ const addLightObstacle = (runtimeScene, width, height) => {
|
||||
|
||||
describe('gdjs.LightRuntimeObject', function () {
|
||||
PIXI.settings.FAIL_IF_MAJOR_PERFORMANCE_CAVEAT = false;
|
||||
const runtimeGame = new gdjs.RuntimeGame({
|
||||
variables: [],
|
||||
resources: {
|
||||
resources: [],
|
||||
},
|
||||
properties: { windowWidth: 800, windowHeight: 600 },
|
||||
});
|
||||
const runtimeGame = gdjs.getPixiRuntimeGame();
|
||||
const runtimeScene = new gdjs.RuntimeScene(runtimeGame);
|
||||
runtimeScene.loadFromScene({
|
||||
layers: [{ name: '', visibility: true, effects: [] }],
|
||||
@@ -96,13 +90,7 @@ describe('gdjs.LightRuntimeObject', function () {
|
||||
|
||||
describe('Light with obstacles around it', function () {
|
||||
PIXI.settings.FAIL_IF_MAJOR_PERFORMANCE_CAVEAT = false;
|
||||
const runtimeGame = new gdjs.RuntimeGame({
|
||||
variables: [],
|
||||
resources: {
|
||||
resources: [],
|
||||
},
|
||||
properties: { windowWidth: 800, windowHeight: 600 },
|
||||
});
|
||||
const runtimeGame = gdjs.getPixiRuntimeGame();
|
||||
const runtimeScene = new gdjs.RuntimeScene(runtimeGame);
|
||||
runtimeScene.loadFromScene({
|
||||
layers: [{ name: '', visibility: true, effects: [] }],
|
||||
|
@@ -6,12 +6,7 @@ describe('gdjs.LinksManager', function () {
|
||||
object3Names,
|
||||
eventsFunctionContext
|
||||
) => {
|
||||
const runtimeGame = new gdjs.RuntimeGame({
|
||||
variables: [],
|
||||
// @ts-ignore - missing properties.
|
||||
properties: { windowWidth: 800, windowHeight: 600 },
|
||||
resources: { resources: [] },
|
||||
});
|
||||
const runtimeGame = gdjs.getPixiRuntimeGame();
|
||||
const runtimeScene = new gdjs.RuntimeScene(runtimeGame);
|
||||
runtimeScene.loadFromScene({
|
||||
layers: [
|
||||
|
@@ -372,4 +372,15 @@ void ExtensionSubDeclaration3(gd::ObjectMetadata& obj) {
|
||||
_("Setup"),
|
||||
"CppPlatform/Extensions/particleSystemicon16.png")
|
||||
.AddParameter("object", _("Object"), "ParticleEmitter", false);
|
||||
|
||||
obj.AddAction("JumpEmitterForwardInTime",
|
||||
_("Jump emitter forward in time"),
|
||||
_("Simulate the passage of time for an emitter, "
|
||||
"including creating and moving particles"),
|
||||
_("Jump _PARAM0_ forward in time by _PARAM1_ seconds"),
|
||||
_("Advanced"),
|
||||
"CppPlatform/Extensions/particleSystemicon24.png",
|
||||
"CppPlatform/Extensions/particleSystemicon16.png")
|
||||
.AddParameter("object", _("Object"), "ParticleEmitter")
|
||||
.AddParameter("number", _("Seconds of time"));
|
||||
}
|
||||
|
@@ -178,6 +178,8 @@ class ParticleSystemJsExtension : public gd::PlatformExtension {
|
||||
.SetFunctionName("setTexture")
|
||||
.SetGetter("getTexture");
|
||||
conditions["ParticleSystem::Texture"].SetFunctionName("getTexture");
|
||||
actions["ParticleSystem::JumpEmitterForwardInTime"].SetFunctionName(
|
||||
"jumpEmitterForwardInTime");
|
||||
|
||||
strExpressions["Texture"].SetFunctionName("getTexture");
|
||||
expressions["CurrentParticleCount"].SetFunctionName("getParticleCount");
|
||||
|
@@ -849,6 +849,10 @@ namespace gdjs {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
jumpEmitterForwardInTime(timeSkipped: number): void {
|
||||
this._renderer.update(timeSkipped);
|
||||
}
|
||||
}
|
||||
gdjs.registerObject(
|
||||
'ParticleSystem::ParticleEmitter',
|
||||
|
@@ -6,12 +6,7 @@ describe('gdjs.PathfindingRuntimeBehavior', function () {
|
||||
const pathFindingName = 'auto1';
|
||||
|
||||
const createScene = (framePerSecond = 60) => {
|
||||
const runtimeGame = new gdjs.RuntimeGame({
|
||||
variables: [],
|
||||
// @ts-ignore - missing properties.
|
||||
properties: { windowWidth: 800, windowHeight: 600 },
|
||||
resources: { resources: [] },
|
||||
});
|
||||
const runtimeGame = gdjs.getPixiRuntimeGame();
|
||||
const runtimeScene = new gdjs.RuntimeScene(runtimeGame);
|
||||
runtimeScene.loadFromScene({
|
||||
layers: [
|
||||
|
@@ -9,12 +9,7 @@ describe('gdjs.PathfindingRuntimeBehavior', function () {
|
||||
const pathFindingName = 'auto1';
|
||||
|
||||
const createScene = (framePerSecond = 60) => {
|
||||
const runtimeGame = new gdjs.RuntimeGame({
|
||||
variables: [],
|
||||
// @ts-ignore - missing properties.
|
||||
properties: { windowWidth: 800, windowHeight: 600 },
|
||||
resources: { resources: [] },
|
||||
});
|
||||
const runtimeGame = gdjs.getPixiRuntimeGame();
|
||||
const runtimeScene = new gdjs.RuntimeScene(runtimeGame);
|
||||
runtimeScene.loadFromScene({
|
||||
layers: [
|
||||
|
@@ -11,12 +11,7 @@ describe('gdjs.PathfindingRuntimeBehavior', function () {
|
||||
const pathFindingName = 'auto1';
|
||||
|
||||
let createScene = () => {
|
||||
const runtimeGame = new gdjs.RuntimeGame({
|
||||
variables: [],
|
||||
// @ts-ignore - missing properties.
|
||||
properties: { windowWidth: 800, windowHeight: 600 },
|
||||
resources: { resources: [] },
|
||||
});
|
||||
const runtimeGame = gdjs.getPixiRuntimeGame();
|
||||
const runtimeScene = new gdjs.RuntimeScene(runtimeGame);
|
||||
runtimeScene.loadFromScene({
|
||||
layers: [
|
||||
|
@@ -59,11 +59,7 @@ describe('Physics2RuntimeBehavior', () => {
|
||||
}
|
||||
|
||||
function createGameWithSceneWithPhysics2SharedData() {
|
||||
const runtimeGame = new gdjs.RuntimeGame({
|
||||
variables: [],
|
||||
resources: { resources: [] },
|
||||
properties: { windowWidth: 1000, windowHeight: 1000 },
|
||||
});
|
||||
const runtimeGame = gdjs.getPixiRuntimeGame();
|
||||
const runtimeScene = new gdjs.TestRuntimeScene(runtimeGame);
|
||||
runtimeScene.loadFromScene({
|
||||
layers: [
|
||||
|
@@ -1,12 +1,6 @@
|
||||
|
||||
const makePlatformerTestRuntimeScene = (timeDelta = 1000 / 60) => {
|
||||
const runtimeGame = new gdjs.RuntimeGame({
|
||||
variables: [],
|
||||
resources: {
|
||||
resources: [],
|
||||
},
|
||||
properties: { windowWidth: 800, windowHeight: 600 },
|
||||
});
|
||||
const runtimeGame = gdjs.getPixiRuntimeGame();
|
||||
const runtimeScene = new gdjs.TestRuntimeScene(runtimeGame);
|
||||
runtimeScene.loadFromScene({
|
||||
layers: [{ name: '', visibility: true, effects: [] }],
|
||||
|
@@ -1,12 +1,6 @@
|
||||
describe(`gdjs.PlatformerObjectRuntimeBehavior.findHighestFloorAndMoveOnTop`, function () {
|
||||
const makeTestRuntimeScene = () => {
|
||||
const runtimeGame = new gdjs.RuntimeGame({
|
||||
variables: [],
|
||||
resources: {
|
||||
resources: [],
|
||||
},
|
||||
properties: { windowWidth: 800, windowHeight: 600 },
|
||||
});
|
||||
const runtimeGame = gdjs.getPixiRuntimeGame();
|
||||
const runtimeScene = new gdjs.RuntimeScene(runtimeGame);
|
||||
runtimeScene.loadFromScene({
|
||||
layers: [{ name: '', visibility: true, effects: [] }],
|
||||
|
@@ -68,6 +68,29 @@ module.exports = {
|
||||
)
|
||||
.setFunctionName('gdjs.playerAuthentication.displayAuthenticationBanner');
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
'HideAuthenticationBanner',
|
||||
_('Hide authentication banner'),
|
||||
_(
|
||||
'Hide the authentication banner from the top of the game screen.'
|
||||
),
|
||||
_('Hide the authentication banner'),
|
||||
'',
|
||||
'JsPlatform/Extensions/authentication.svg',
|
||||
'JsPlatform/Extensions/authentication.svg'
|
||||
)
|
||||
.addCodeOnlyParameter('currentScene', '')
|
||||
.setHelpPath('/all-features/player-authentication')
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile(
|
||||
'Extensions/PlayerAuthentication/playerauthenticationcomponents.js'
|
||||
)
|
||||
.addIncludeFile(
|
||||
'Extensions/PlayerAuthentication/playerauthenticationtools.js'
|
||||
)
|
||||
.setFunctionName('gdjs.playerAuthentication.removeAuthenticationBanner');
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
'OpenAuthenticationWindow',
|
||||
|
@@ -34,6 +34,7 @@ namespace gdjs {
|
||||
): {
|
||||
rootContainer: HTMLDivElement;
|
||||
loaderContainer: HTMLDivElement;
|
||||
iframeContainer: HTMLDivElement;
|
||||
} {
|
||||
const rootContainer = document.createElement('div');
|
||||
rootContainer.id = 'authentication-root-container';
|
||||
@@ -45,17 +46,17 @@ namespace gdjs {
|
||||
rootContainer.style.zIndex = '2';
|
||||
rootContainer.style.pointerEvents = 'all';
|
||||
|
||||
const subContainer = document.createElement('div');
|
||||
subContainer.id = 'authentication-sub-container';
|
||||
subContainer.style.backgroundColor = '#FFFFFF';
|
||||
subContainer.style.position = 'absolute';
|
||||
subContainer.style.top = '16px';
|
||||
subContainer.style.bottom = '16px';
|
||||
subContainer.style.left = '16px';
|
||||
subContainer.style.right = '16px';
|
||||
subContainer.style.borderRadius = '8px';
|
||||
subContainer.style.boxShadow = '0px 4px 4px rgba(0, 0, 0, 0.25)';
|
||||
subContainer.style.padding = '16px';
|
||||
const frameContainer = document.createElement('div');
|
||||
frameContainer.id = 'authentication-frame-container';
|
||||
frameContainer.style.backgroundColor = '#FFFFFF';
|
||||
frameContainer.style.position = 'absolute';
|
||||
frameContainer.style.top = '16px';
|
||||
frameContainer.style.bottom = '16px';
|
||||
frameContainer.style.left = '16px';
|
||||
frameContainer.style.right = '16px';
|
||||
frameContainer.style.borderRadius = '8px';
|
||||
frameContainer.style.boxShadow = '0px 4px 4px rgba(0, 0, 0, 0.25)';
|
||||
frameContainer.style.padding = '16px';
|
||||
|
||||
const _closeContainer: HTMLDivElement = document.createElement('div');
|
||||
_closeContainer.style.cursor = 'pointer';
|
||||
@@ -106,11 +107,57 @@ namespace gdjs {
|
||||
|
||||
loaderContainer.appendChild(_loader);
|
||||
|
||||
subContainer.appendChild(_closeContainer);
|
||||
subContainer.appendChild(loaderContainer);
|
||||
rootContainer.appendChild(subContainer);
|
||||
const iframeContainer: HTMLDivElement = document.createElement('div');
|
||||
iframeContainer.style.display = 'flex';
|
||||
iframeContainer.style.flexDirection = 'column';
|
||||
iframeContainer.style.height = '100%';
|
||||
iframeContainer.style.width = '100%';
|
||||
iframeContainer.style.justifyContent = 'stretch';
|
||||
iframeContainer.style.alignItems = 'stretch';
|
||||
iframeContainer.style.display = 'none';
|
||||
|
||||
return { rootContainer, loaderContainer };
|
||||
frameContainer.appendChild(_closeContainer);
|
||||
frameContainer.appendChild(loaderContainer);
|
||||
frameContainer.appendChild(iframeContainer);
|
||||
rootContainer.appendChild(frameContainer);
|
||||
|
||||
return { rootContainer, loaderContainer, iframeContainer };
|
||||
};
|
||||
|
||||
export const displayIframeInsideAuthenticationContainer = (
|
||||
iframeContainer: HTMLDivElement,
|
||||
loaderContainer: HTMLDivElement,
|
||||
textContainer: HTMLDivElement,
|
||||
url: string
|
||||
) => {
|
||||
const iframe = document.createElement('iframe');
|
||||
iframe.setAttribute(
|
||||
'sandbox',
|
||||
'allow-forms allow-modals allow-orientation-lock allow-popups allow-same-origin allow-scripts'
|
||||
);
|
||||
iframe.addEventListener('load', () => {
|
||||
iframeContainer.style.display = 'flex';
|
||||
loaderContainer.style.display = 'none';
|
||||
});
|
||||
iframe.addEventListener('loaderror', () => {
|
||||
addAuthenticationUrlToTextsContainer(() => {
|
||||
// Try again.
|
||||
iframeContainer.removeChild(iframe);
|
||||
iframeContainer.style.display = 'none';
|
||||
loaderContainer.style.display = 'flex';
|
||||
displayIframeInsideAuthenticationContainer(
|
||||
iframeContainer,
|
||||
loaderContainer,
|
||||
textContainer,
|
||||
url
|
||||
);
|
||||
}, textContainer);
|
||||
});
|
||||
iframe.src = url;
|
||||
iframe.style.flex = '1';
|
||||
iframe.style.border = '0';
|
||||
|
||||
iframeContainer.appendChild(iframe);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -445,7 +492,7 @@ namespace gdjs {
|
||||
* Helper to add event listeners on a pressable/clickable element
|
||||
* to work on both desktop and mobile.
|
||||
*/
|
||||
export const addTouchAndClickEventListeners = function (
|
||||
const addTouchAndClickEventListeners = function (
|
||||
element: HTMLElement,
|
||||
action: () => void
|
||||
) {
|
||||
|
@@ -18,6 +18,7 @@ namespace gdjs {
|
||||
let _authenticationInAppWindow: Window | null = null; // For Cordova.
|
||||
let _authenticationRootContainer: HTMLDivElement | null = null;
|
||||
let _authenticationLoaderContainer: HTMLDivElement | null = null;
|
||||
let _authenticationIframeContainer: HTMLDivElement | null = null;
|
||||
let _authenticationTextContainer: HTMLDivElement | null = null;
|
||||
let _authenticationBanner: HTMLDivElement | null = null;
|
||||
let _initialAuthenticationTimeoutId: NodeJS.Timeout | null = null;
|
||||
@@ -38,12 +39,12 @@ namespace gdjs {
|
||||
});
|
||||
|
||||
// If the extension is used, register an eventlistener to know if the user is
|
||||
// logged in while playing the game on Liluo.io.
|
||||
// logged in while playing the game on GDevelop games platform.
|
||||
// Then send a message to the parent iframe to say that the player auth is ready.
|
||||
gdjs.registerFirstRuntimeSceneLoadedCallback(
|
||||
(runtimeScene: RuntimeScene) => {
|
||||
if (getPlatform(runtimeScene) !== 'web') {
|
||||
// Automatic authentication is only valid when the game is hosted in Liluo.io.
|
||||
// Automatic authentication is only valid when the game is hosted on GDevelop games platform.
|
||||
return;
|
||||
}
|
||||
removeAuthenticationCallbacks(); // Remove any callback that could have been registered before.
|
||||
@@ -64,9 +65,9 @@ namespace gdjs {
|
||||
{
|
||||
id: 'playerAuthReady',
|
||||
},
|
||||
'*' // We could restrict to liluo.io but it's not necessary as the message is not sensitive, and it allows easy debugging.
|
||||
'*' // We could restrict to GDevelop games platform but it's not necessary as the message is not sensitive, and it allows easy debugging.
|
||||
);
|
||||
// If no answer after 3 seconds, assume that the game is not embedded in Liluo.io, and remove the listener.
|
||||
// If no answer after 3 seconds, assume that the game is not embedded in GDevelop games platform, and remove the listener.
|
||||
_initialAuthenticationTimeoutId = setTimeout(() => {
|
||||
logger.info('Removing initial authentication listener.');
|
||||
removeAuthenticationCallbacks();
|
||||
@@ -85,12 +86,16 @@ namespace gdjs {
|
||||
runtimeGame: gdjs.RuntimeGame;
|
||||
gameId: string;
|
||||
connectionId?: string;
|
||||
}) =>
|
||||
`https://liluo.io/auth?gameId=${gameId}${
|
||||
}) => {
|
||||
// Uncomment to test the case of a failing loading:
|
||||
// return 'https://gd.games.wronglink';
|
||||
|
||||
return `https://gd.games/auth?gameId=${gameId}${
|
||||
connectionId ? `&connectionId=${connectionId}` : ''
|
||||
}${
|
||||
runtimeGame.isUsingGDevelopDevelopmentEnvironment() ? '&dev=true' : ''
|
||||
}`;
|
||||
};
|
||||
|
||||
/**
|
||||
* Helper returning the platform.
|
||||
@@ -98,14 +103,31 @@ namespace gdjs {
|
||||
const getPlatform = (
|
||||
runtimeScene: RuntimeScene
|
||||
): 'electron' | 'cordova' | 'web' => {
|
||||
const electron = runtimeScene.getGame().getRenderer().getElectron();
|
||||
const runtimeGame = runtimeScene.getGame();
|
||||
const electron = runtimeGame.getRenderer().getElectron();
|
||||
if (electron) {
|
||||
return 'electron';
|
||||
}
|
||||
if (typeof cordova !== 'undefined') return 'cordova';
|
||||
|
||||
return 'web';
|
||||
};
|
||||
|
||||
/**
|
||||
* Check if, in some exceptional cases, we allow authentication
|
||||
* to be done through a iframe.
|
||||
* This is usually discouraged as the user can't verify that the authentication
|
||||
* window is a genuine one. It's only to be used in trusted contexts.
|
||||
*/
|
||||
const shouldAuthenticationUseIframe = (runtimeScene: RuntimeScene) => {
|
||||
const runtimeGameOptions = runtimeScene.getGame().getAdditionalOptions();
|
||||
return (
|
||||
runtimeGameOptions &&
|
||||
runtimeGameOptions.isPreview &&
|
||||
runtimeGameOptions.allowAuthenticationUsingIframeForPreview
|
||||
);
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns true if a user token is present in the local storage.
|
||||
*/
|
||||
@@ -509,7 +531,7 @@ namespace gdjs {
|
||||
|
||||
/**
|
||||
* Helper to recompute the authentication banner.
|
||||
* This is useful if the user is already logged in on Liluo.io
|
||||
* This is useful if the user is already logged on GDevelop games platform
|
||||
* and we want to display the banner with the username.
|
||||
*/
|
||||
const refreshAuthenticationBannerIfAny = function (
|
||||
@@ -685,6 +707,47 @@ namespace gdjs {
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Helper to handle authentication iframe on web.
|
||||
* We open an iframe, and listen to messages posted back to the game window.
|
||||
*/
|
||||
const openAuthenticationIframeForWeb = (
|
||||
runtimeScene: gdjs.RuntimeScene,
|
||||
gameId: string
|
||||
) => {
|
||||
if (
|
||||
!_authenticationIframeContainer ||
|
||||
!_authenticationLoaderContainer ||
|
||||
!_authenticationTextContainer
|
||||
) {
|
||||
console.error(
|
||||
"Can't open an authentication iframe - no iframe container, loader container or text container was opened for it."
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const targetUrl = getAuthWindowUrl({
|
||||
runtimeGame: runtimeScene.getGame(),
|
||||
gameId,
|
||||
});
|
||||
|
||||
// Listen to messages posted by the authentication window, so that we can
|
||||
// know when the user is authenticated.
|
||||
_authenticationMessageCallback = (event: MessageEvent) => {
|
||||
receiveAuthenticationMessage(runtimeScene, event, {
|
||||
checkOrigin: true,
|
||||
});
|
||||
};
|
||||
window.addEventListener('message', _authenticationMessageCallback, true);
|
||||
|
||||
authComponents.displayIframeInsideAuthenticationContainer(
|
||||
_authenticationIframeContainer,
|
||||
_authenticationLoaderContainer,
|
||||
_authenticationTextContainer,
|
||||
targetUrl
|
||||
);
|
||||
};
|
||||
|
||||
/**
|
||||
* Action to display the authentication window to the user.
|
||||
*/
|
||||
@@ -725,11 +788,13 @@ namespace gdjs {
|
||||
const {
|
||||
rootContainer,
|
||||
loaderContainer,
|
||||
iframeContainer,
|
||||
} = authComponents.computeAuthenticationContainer(
|
||||
onAuthenticationContainerDismissed
|
||||
);
|
||||
_authenticationRootContainer = rootContainer;
|
||||
_authenticationLoaderContainer = loaderContainer;
|
||||
_authenticationIframeContainer = iframeContainer;
|
||||
|
||||
// Display the authentication window right away, to show a loader
|
||||
// while the call for game registration is happening.
|
||||
@@ -769,7 +834,11 @@ namespace gdjs {
|
||||
break;
|
||||
case 'web':
|
||||
default:
|
||||
openAuthenticationWindowForWeb(runtimeScene, _gameId);
|
||||
if (shouldAuthenticationUseIframe(runtimeScene)) {
|
||||
openAuthenticationIframeForWeb(runtimeScene, _gameId);
|
||||
} else {
|
||||
openAuthenticationWindowForWeb(runtimeScene, _gameId);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -815,6 +884,7 @@ namespace gdjs {
|
||||
|
||||
_authenticationRootContainer = null;
|
||||
_authenticationLoaderContainer = null;
|
||||
_authenticationIframeContainer = null;
|
||||
_authenticationTextContainer = null;
|
||||
};
|
||||
|
||||
@@ -838,7 +908,7 @@ namespace gdjs {
|
||||
/**
|
||||
* Remove the banner displaying the authentication status.
|
||||
*/
|
||||
const removeAuthenticationBanner = function (
|
||||
export const removeAuthenticationBanner = function (
|
||||
runtimeScene: gdjs.RuntimeScene
|
||||
) {
|
||||
if (!_authenticationBanner) {
|
||||
|
@@ -28,9 +28,9 @@ void DeclarePrimitiveDrawingExtension(gd::PlatformExtension& extension) {
|
||||
.AddObject<ShapePainterObject>(
|
||||
"Drawer", //"Drawer" is kept for compatibility with GD<=3.6.76
|
||||
_("Shape painter"),
|
||||
_("Allows you to draw simple shapes on the screen"),
|
||||
_("Allows you to draw simple shapes on the screen using the events."),
|
||||
"CppPlatform/Extensions/primitivedrawingicon.png")
|
||||
.SetCategoryFullName(_("General"));
|
||||
.SetCategoryFullName(_("Advanced"));
|
||||
|
||||
#if defined(GD_IDE_ONLY)
|
||||
obj.AddAction(
|
||||
@@ -722,7 +722,7 @@ void DeclarePrimitiveDrawingExtension(gd::PlatformExtension& extension) {
|
||||
_("Center of rotation"),
|
||||
_("Change the center of rotation of an object relatively to the "
|
||||
"object origin."),
|
||||
_("Change the center of rotation of _PARAM0_: _PARAM1_; _PARAM2_"),
|
||||
_("Change the center of rotation of _PARAM0_ to _PARAM1_, _PARAM2_"),
|
||||
_("Angle"),
|
||||
"res/actions/position24_black.png",
|
||||
"res/actions/position_black.png")
|
||||
|
@@ -474,7 +474,7 @@ namespace gdjs {
|
||||
/**
|
||||
* The center of rotation is defined relatively
|
||||
* to the drawing origin (the object position).
|
||||
* This avoid the center to move on the drawing
|
||||
* This avoids the center to move on the drawing
|
||||
* when new shapes push the bounds.
|
||||
*
|
||||
* When no custom center is defined, it will move
|
||||
|
@@ -9,13 +9,14 @@ This project is released under the MIT License.
|
||||
#include "GDCore/Tools/Localization.h"
|
||||
#include "TextEntryObject.h"
|
||||
|
||||
// Deprecated extension - so no translation markers and the object is hidden in the editor.
|
||||
void DeclareTextEntryObjectExtension(gd::PlatformExtension& extension) {
|
||||
extension
|
||||
.SetExtensionInformation(
|
||||
"TextEntryObject",
|
||||
_("Text entry object"),
|
||||
_("An object that can be used to capture the text "
|
||||
"entered with a keyboard by a player."),
|
||||
"Text entry object",
|
||||
"Deprecated object that can be used to capture the text "
|
||||
"entered with a keyboard by a player.",
|
||||
"Florian Rival",
|
||||
"Open source (MIT License)")
|
||||
.SetCategory("User interface")
|
||||
@@ -24,71 +25,72 @@ void DeclareTextEntryObjectExtension(gd::PlatformExtension& extension) {
|
||||
gd::ObjectMetadata& obj =
|
||||
extension
|
||||
.AddObject<TextEntryObject>("TextEntry",
|
||||
_("Text entry"),
|
||||
_("Invisible object used to get the text "
|
||||
"entered with the keyboard."),
|
||||
"Text entry",
|
||||
"Invisible object used to get the text "
|
||||
"entered with the keyboard.",
|
||||
"CppPlatform/Extensions/textentry.png")
|
||||
.SetCategoryFullName(_("User interface"));
|
||||
.SetCategoryFullName("User interface")
|
||||
.SetHidden(); // Deprecated
|
||||
|
||||
obj.AddAction("String",
|
||||
_("Text in memory"),
|
||||
_("Modify text in memory of the object"),
|
||||
_("the text in memory"),
|
||||
"Text in memory",
|
||||
"Modify text in memory of the object",
|
||||
"the text in memory",
|
||||
"",
|
||||
"CppPlatform/Extensions/textentry24.png",
|
||||
"CppPlatform/Extensions/textentryicon.png")
|
||||
|
||||
.AddParameter("object", _("Object"), "TextEntry")
|
||||
.AddParameter("object", "Object", "TextEntry")
|
||||
.UseStandardOperatorParameters(
|
||||
"string",
|
||||
gd::ParameterOptions::MakeNewOptions().SetDescription(_("Text")))
|
||||
gd::ParameterOptions::MakeNewOptions().SetDescription("Text"))
|
||||
.SetFunctionName("SetString")
|
||||
.SetGetter("GetString");
|
||||
|
||||
obj.AddCondition("String",
|
||||
_("Text in memory"),
|
||||
_("Test the text of a Text Entry object."),
|
||||
_("the text"),
|
||||
"Text in memory",
|
||||
"Test the text of a Text Entry object.",
|
||||
"the text",
|
||||
"",
|
||||
"CppPlatform/Extensions/textentry24.png",
|
||||
"CppPlatform/Extensions/textentryicon.png")
|
||||
|
||||
.AddParameter("object", _("Object"), "TextEntry")
|
||||
.AddParameter("object", "Object", "TextEntry")
|
||||
.UseStandardRelationalOperatorParameters(
|
||||
"string",
|
||||
gd::ParameterOptions::MakeNewOptions().SetDescription(_("Text to compare to")))
|
||||
gd::ParameterOptions::MakeNewOptions().SetDescription("Text to compare to"))
|
||||
.SetFunctionName("GetString");
|
||||
|
||||
obj.AddAction(
|
||||
"Activate",
|
||||
_("De/activate capturing text input"),
|
||||
_("Activate or deactivate the capture of text entered with keyboard."),
|
||||
_("Activate capture by _PARAM0_ of the text entered with keyboard: "
|
||||
"_PARAM1_"),
|
||||
_("Setup"),
|
||||
"De/activate capturing text input",
|
||||
"Activate or deactivate the capture of text entered with keyboard.",
|
||||
"Activate capture by _PARAM0_ of the text entered with keyboard: "
|
||||
"_PARAM1_",
|
||||
"Setup",
|
||||
"CppPlatform/Extensions/textentry24.png",
|
||||
"CppPlatform/Extensions/textentryicon.png")
|
||||
|
||||
.AddParameter("object", _("Object"), "TextEntry")
|
||||
.AddParameter("yesorno", _("Activate"))
|
||||
.AddParameter("object", "Object", "TextEntry")
|
||||
.AddParameter("yesorno", "Activate")
|
||||
.SetFunctionName("Activate");
|
||||
|
||||
obj.AddCondition("Activated",
|
||||
_("Text input"),
|
||||
_("Test if the object captured text entered with keyboard."),
|
||||
_("_PARAM0_ capture the text entered with keyboard"),
|
||||
_("Setup"),
|
||||
"Text input",
|
||||
"Test if the object captured text entered with keyboard.",
|
||||
"_PARAM0_ capture the text entered with keyboard",
|
||||
"Setup",
|
||||
"CppPlatform/Extensions/textentry24.png",
|
||||
"CppPlatform/Extensions/textentryicon.png")
|
||||
|
||||
.AddParameter("object", _("Object"), "TextEntry")
|
||||
.AddParameter("object", "Object", "TextEntry")
|
||||
.SetFunctionName("IsActivated");
|
||||
|
||||
obj.AddStrExpression("String",
|
||||
_("Text entered with keyboard"),
|
||||
_("Text entered with keyboard"),
|
||||
_("Text entered with keyboard"),
|
||||
"Text entered with keyboard",
|
||||
"Text entered with keyboard",
|
||||
"Text entered with keyboard",
|
||||
"res/texteicon.png")
|
||||
.AddParameter("object", _("Object"), "TextEntry")
|
||||
.AddParameter("object", "Object", "TextEntry")
|
||||
.SetFunctionName("GetString");
|
||||
}
|
||||
|
@@ -23,7 +23,7 @@ void DeclareTextObjectExtension(gd::PlatformExtension& extension) {
|
||||
"some indicators, menu buttons, dialogues..."),
|
||||
"Florian Rival and Victor Levasseur",
|
||||
"Open source (MIT License)")
|
||||
.SetCategory("User interface")
|
||||
.SetCategory("Text")
|
||||
.SetExtensionHelpPath("/objects/text");
|
||||
extension.AddInstructionOrExpressionGroupMetadata(_("Text object"))
|
||||
.SetIcon("CppPlatform/Extensions/texticon.png");
|
||||
@@ -34,7 +34,7 @@ void DeclareTextObjectExtension(gd::PlatformExtension& extension) {
|
||||
_("Text"),
|
||||
_("Displays a text on the screen."),
|
||||
"CppPlatform/Extensions/texticon.png")
|
||||
.SetCategoryFullName(_("User interface"));
|
||||
.SetCategoryFullName(_("Text"));
|
||||
|
||||
obj.AddAction("String",
|
||||
_("Modify the text"),
|
||||
|
@@ -1294,9 +1294,8 @@ module.exports = {
|
||||
tilemapJsonFile,
|
||||
tilesetJsonFile
|
||||
) {
|
||||
let tileMapJsonData = null;
|
||||
try {
|
||||
tileMapJsonData = await this._pixiResourcesLoader.getResourceJsonData(
|
||||
const tileMapJsonData = await this._pixiResourcesLoader.getResourceJsonData(
|
||||
this._project,
|
||||
tilemapJsonFile
|
||||
);
|
||||
@@ -1320,6 +1319,7 @@ module.exports = {
|
||||
} catch (err) {
|
||||
console.error('Unable to load a Tilemap JSON data: ', err);
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -1540,34 +1540,38 @@ module.exports = {
|
||||
// GDJS doesn't use Promise to avoid allocation.
|
||||
RenderedCollisionMaskInstance.prototype._loadTiledMapWithCallback =
|
||||
function (tilemapJsonFile, tilesetJsonFile, callback) {
|
||||
this._loadTiledMap(tilemapJsonFile, tilesetJsonFile).then(callback);
|
||||
this._loadTileMap(tilemapJsonFile, tilesetJsonFile).then(callback);
|
||||
};
|
||||
|
||||
RenderedCollisionMaskInstance.prototype._loadTiledMap = async function (
|
||||
RenderedCollisionMaskInstance.prototype._loadTileMap = async function (
|
||||
tilemapJsonFile,
|
||||
tilesetJsonFile
|
||||
) {
|
||||
let tileMapJsonData = null;
|
||||
try {
|
||||
tileMapJsonData = await this._pixiResourcesLoader.getResourceJsonData(
|
||||
const tileMapJsonData = await this._pixiResourcesLoader.getResourceJsonData(
|
||||
this._project,
|
||||
tilemapJsonFile
|
||||
);
|
||||
|
||||
const tilesetJsonData = tilesetJsonFile
|
||||
? await this._pixiResourcesLoader.getResourceJsonData(
|
||||
this._project,
|
||||
tilesetJsonFile
|
||||
)
|
||||
: null;
|
||||
const tileMap = TilemapHelper.TileMapManager.identify(tileMapJsonData);
|
||||
|
||||
if (tilesetJsonData) {
|
||||
tileMapJsonData.tilesets = [tilesetJsonData];
|
||||
if (tileMap.kind === 'tiled') {
|
||||
const tilesetJsonData = tilesetJsonFile
|
||||
? await this._pixiResourcesLoader.getResourceJsonData(
|
||||
this._project,
|
||||
tilesetJsonFile
|
||||
)
|
||||
: null;
|
||||
|
||||
if (tilesetJsonData) {
|
||||
tileMapJsonData.tilesets = [tilesetJsonData];
|
||||
}
|
||||
}
|
||||
return tileMap;
|
||||
} catch (err) {
|
||||
console.error('Unable to load a Tilemap JSON data: ', err);
|
||||
}
|
||||
return tileMapJsonData;
|
||||
return null;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -67,7 +67,9 @@ namespace gdjs {
|
||||
tileMapJsonResourceName: string,
|
||||
tileSetJsonResourceName: string,
|
||||
levelIndex: number,
|
||||
callback: (tileMap: TileMapHelper.EditableTileMap | null) => void
|
||||
callback: (
|
||||
tileMapFileContent: TileMapHelper.EditableTileMap | null
|
||||
) => void
|
||||
): void {
|
||||
this._manager.getOrLoadTileMap(
|
||||
this._loadTileMap.bind(this),
|
||||
@@ -113,7 +115,9 @@ namespace gdjs {
|
||||
private _loadTileMap(
|
||||
tileMapJsonResourceName: string,
|
||||
tileSetJsonResourceName: string,
|
||||
callback: (tileMap: TileMapHelper.TileMap | null) => void
|
||||
callback: (
|
||||
tileMapFileContent: TileMapHelper.TileMapFileContent | null
|
||||
) => void
|
||||
): void {
|
||||
this._instanceContainer
|
||||
.getGame()
|
||||
@@ -127,14 +131,17 @@ namespace gdjs {
|
||||
callback(null);
|
||||
return;
|
||||
}
|
||||
const tileMap = TileMapHelper.TileMapManager.identify(
|
||||
const tileMapFileContent = TileMapHelper.TileMapManager.identify(
|
||||
tileMapJsonData
|
||||
);
|
||||
if (!tileMap) {
|
||||
if (!tileMapFileContent) {
|
||||
callback(null);
|
||||
return;
|
||||
}
|
||||
if (tileMap.kind === 'tiled' && tileSetJsonResourceName) {
|
||||
if (
|
||||
tileMapFileContent.kind === 'tiled' &&
|
||||
tileSetJsonResourceName
|
||||
) {
|
||||
this._instanceContainer
|
||||
.getGame()
|
||||
.getJsonManager()
|
||||
@@ -147,14 +154,14 @@ namespace gdjs {
|
||||
callback(null);
|
||||
return;
|
||||
}
|
||||
const tiledMap = tileMap.data;
|
||||
const tiledMap = tileMapFileContent.data;
|
||||
const tileSet = tileSetJsonData as TileMapHelper.TiledTileset;
|
||||
tileSet.firstgid = tiledMap.tilesets[0].firstgid;
|
||||
tiledMap.tilesets = [tileSet];
|
||||
callback(tileMap);
|
||||
callback(tileMapFileContent);
|
||||
});
|
||||
} else {
|
||||
callback(tileMap);
|
||||
callback(tileMapFileContent);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
4
Extensions/TileMap/helper/TileMapHelper.d.ts
vendored
4
Extensions/TileMap/helper/TileMapHelper.d.ts
vendored
@@ -3,7 +3,7 @@ import {
|
||||
EditableTileMapLayer,
|
||||
PixiTileMapHelper,
|
||||
TileDefinition,
|
||||
TileMap,
|
||||
TileMapFileContent,
|
||||
TileMapManager,
|
||||
TileTextureCache,
|
||||
TiledTileset,
|
||||
@@ -16,7 +16,7 @@ declare global {
|
||||
EditableTileMapLayer,
|
||||
PixiTileMapHelper,
|
||||
TileDefinition,
|
||||
TileMap,
|
||||
TileMapFileContent,
|
||||
TileMapManager,
|
||||
TileTextureCache,
|
||||
TiledTileset,
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user