Compare commits

...

21 Commits

Author SHA1 Message Date
Clément Pasteau
959988d147 Allow managing Game from the Projects list in the Build section 2022-12-20 17:27:39 +01:00
AlexandreS
53828a6b61 Add possibility to drag n drop items in the project manager (scenes, external layouts, external events, extensions) (#4720) 2022-12-20 16:54:58 +01:00
github-actions[bot]
eb797281cf Update translations [skip ci] (#4696)
Co-authored-by: D8H <D8H@users.noreply.github.com>
2022-12-20 14:54:38 +01:00
Florian Rival
80f5a9a0d6 Add the asset store on the homepage (#4692)
* You can now browse free and premium asset packs from the home page, under the tab "Shop".
* When you have found great assets for your game, it's easy to add them in your game in a click. You can choose them to add them to a specific scene or to the whole project as global objects.
* If you're interested to sell your assets on the GDevelop asset store, check our wiki page to find how it works and the form to send us your assets: https://wiki.gdevelop.io/gdevelop5/community/sell-asset-pack-store
2022-12-20 14:49:54 +01:00
D8H
07ab4c938b Fix event-based objects properties that were changing for all instances at once (#4717)
* It was only affecting properties defined in the event-based objects not the one from child-object configurations.
2022-12-20 14:20:19 +01:00
AlexandreS
41fa153ddf Add description to a certain amount of parameters in actions and conditions (#4716) 2022-12-20 13:59:10 +01:00
Clément Pasteau
4cdac65944 Put beginner courses on top of Learn section (#4715) 2022-12-19 15:18:25 +01:00
AlexandreS
7b5036286f Fix scene background color setting via the textfield (#4713) 2022-12-19 12:42:27 +01:00
AlexandreS
fd4dd62f9b Allow text selection on game feedback cards (#4712) 2022-12-19 10:55:11 +01:00
Clément Pasteau
6701a52a88 Update shortcut to close project and quit app to match other app standards (#4711) 2022-12-19 10:51:42 +01:00
AlexandreS
0b61bb5053 Fix: Close all the dialogs at the same time when creating a project from an example (#4710) 2022-12-19 10:34:49 +01:00
AlexandreS
259e35d941 Use a constant zoom speed on the scene editor and on image preview, regardless of zoom factor (#4674) 2022-12-19 09:02:49 +01:00
Clément Pasteau
b9ac22208b Replace most float with double for better precision (#4689)
Do not show in changelog
2022-12-16 14:50:11 +01:00
Clément Pasteau
a991283bb5 Correctly display asset authors coming from premium asset packs (#4688) 2022-12-16 11:21:46 +01:00
Clément Pasteau
bf3ecceb06 Update service worker to put translations in cache (#4693)
* This should prevent unwanted {0} appearing on the web for each update
2022-12-16 09:24:32 +01:00
github-actions[bot]
b3bc1dd21b Update translations [skip ci] (#4685)
Co-authored-by: ClementPasteau <ClementPasteau@users.noreply.github.com>
2022-12-15 12:34:23 +01:00
Clément Pasteau
d63b83b606 Improve instance number properties by hiding unnecessary decimals (#4557)
* "resize", "drag" or "rotate" of an instance in the editor will now round the properties to the nearest integer for ease of use.
  * This does not prevent entering digits in the instance properties directly
* The fields do not update the instance with "0" when a user is still typing (ex: "19," does not update the field)
* The "width/height/x/y/angle" properties can now correctly accept precise float numbers, avoiding excessive and inaccurate digits
2022-12-15 12:16:12 +01:00
AlexandreS
05e222c92d Bump newIDE version (#4684) 2022-12-14 14:56:53 +01:00
github-actions[bot]
d843a9e607 Update translations [skip ci] (#4670)
Co-authored-by: D8H <D8H@users.noreply.github.com>
2022-12-14 14:51:53 +01:00
AlexandreS
5d3f1a502c Fix release 152 issues (#4683)
Do not show in changelog
2022-12-14 14:47:56 +01:00
AlexandreS
fbcc63a0d0 Add message in build section when unable to fetch cloud projects (#4681)
Don't show in changelog
2022-12-13 16:59:37 +01:00
195 changed files with 5185 additions and 2444 deletions

View File

@@ -105,7 +105,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
"res/function32.png",
"res/function16.png")
.AddParameter("functionParameterName", "Parameter name")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions());
extension
.AddCondition(
@@ -117,7 +118,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
"res/function32.png",
"res/function16.png")
.AddParameter("functionParameterName", "Parameter name")
.UseStandardRelationalOperatorParameters("string");
.UseStandardRelationalOperatorParameters(
"string", gd::ParameterOptions::MakeNewOptions());
}
} // namespace gd

View File

@@ -146,69 +146,83 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
.AddAction("ModVolumeSoundCanal",
_("Volume of the sound on a channel"),
_("This action modifies the volume of the sound on the "
"specified channel. The volume is between 0 and 100."),
"specified channel."),
_("the volume of the sound on channel _PARAM1_"),
_("Sounds on channels"),
"res/actions/sonVolume24.png",
"res/actions/sonVolume.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Volume (0-100)")))
.MarkAsAdvanced();
extension
.AddAction("ModVolumeMusicCanal",
_("Volume of the music on a channel"),
_("This action modifies the volume of the music on the "
"specified channel. The volume is between 0 and 100."),
"specified channel."),
_("the volume of the music on channel _PARAM1_"),
_("Music on channels"),
"res/actions/musicVolume24.png",
"res/actions/musicVolume.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Volume (0-100)")))
.MarkAsAdvanced();
extension
.AddAction("ModGlobalVolume",
_("Game global volume"),
_("This action modifies the global volume of the game. The "
"volume is between 0 and 100."),
_("This action modifies the global volume of the game."),
_("the global sound level"),
"",
"res/actions/volume24.png",
"res/actions/volume.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Volume (0-100)")))
.MarkAsSimple();
extension
.AddAction("ModPitchSoundChannel",
_("Pitch of the sound of a channel"),
_("This action modifies the pitch (speed) of the sound on a "
"channel.\n1 is the default pitch."),
"channel."),
_("the pitch of the sound on channel _PARAM1_"),
_("Sounds on channels"),
"res/actions/son24.png",
"res/actions/son.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Pitch (1 by default)")))
.MarkAsAdvanced();
extension
.AddAction("ModPitchMusicChannel",
_("Pitch of the music on a channel"),
_("This action modifies the pitch of the music on the "
"specified channel. 1 is the default pitch"),
"specified channel."),
_("the pitch of the music on channel _PARAM1_"),
_("Music on channels"),
"res/actions/music24.png",
"res/actions/music.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Pitch (1 by default)")))
.MarkAsAdvanced();
extension
@@ -222,7 +236,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
"res/actions/son.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Position (in seconds)")))
.MarkAsAdvanced();
extension
@@ -236,7 +253,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
"res/actions/music.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Position (in seconds)")))
.MarkAsAdvanced();
extension
@@ -448,15 +468,17 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
.AddCondition(
"SoundCanalVolume",
_("Volume of the sound on a channel"),
_("Test the volume of the sound on the specified channel. The volume "
"is between 0 and 100."),
_("Test the volume of the sound on the specified channel."),
_("the volume of the sound on channel _PARAM1_"),
_("Sounds on channels"),
"res/conditions/sonVolume24.png",
"res/conditions/sonVolume.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Volume to compare to (0-100)")))
.MarkAsAdvanced();
extension
@@ -471,7 +493,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
"res/conditions/musicVolume.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Volume to compare to (0-100)")))
.MarkAsAdvanced();
extension
@@ -484,7 +509,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
"res/conditions/volume24.png",
"res/conditions/volume.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Volume to compare to (0-100)")));
extension
.AddCondition(
@@ -498,22 +526,27 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
"res/conditions/sonVolume.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Pitch to compare to (1 by default)")))
.MarkAsAdvanced();
extension
.AddCondition(
"MusicChannelPitch",
_("Pitch of the music on a channel"),
_("Test the pitch (speed) of the music on a specified channel. 1 is "
"the default pitch."),
_("Test the pitch (speed) of the music on a specified channel."),
_("the pitch of the music on channel _PARAM1_"),
_("Music on channels"),
"res/conditions/musicVolume24.png",
"res/conditions/musicVolume.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Pitch to compare to (1 by default)")))
.MarkAsAdvanced();
extension
@@ -527,7 +560,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
"res/conditions/sonVolume.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Position to compare to (in seconds)")))
.MarkAsAdvanced();
extension
@@ -541,7 +577,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAudioExtension(
"res/conditions/musicVolume.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Channel identifier"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Position to compare to (in seconds)")))
.MarkAsAdvanced();
extension

View File

@@ -40,7 +40,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/conditions/position_black.png")
.AddParameter("object", _("Object"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsSimple();
obj.AddAction("MettreX",
@@ -52,7 +53,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/actions/position_black.png")
.AddParameter("object", _("Object"))
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions())
.MarkAsSimple();
obj.AddCondition("PosY",
@@ -64,7 +66,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/conditions/position_black.png")
.AddParameter("object", _("Object"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsSimple();
obj.AddAction("MettreY",
@@ -76,7 +79,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/actions/position_black.png")
.AddParameter("object", _("Object"))
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions())
.MarkAsSimple();
obj.AddAction("MettreXY",
@@ -120,7 +124,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Position/Center"),
"res/actions/position24_black.png")
.AddParameter("object", _("Object"))
.UseStandardParameters("number");
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
obj.AddExpressionAndConditionAndAction(
"number",
@@ -131,7 +135,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Position/Center"),
"res/actions/position24_black.png")
.AddParameter("object", _("Object"))
.UseStandardParameters("number");
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
obj.AddExpressionAndCondition("number",
"BoundingBoxLeft",
@@ -142,7 +146,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Position/Bounding Box"),
"res/conditions/bounding-box-left_black.svg")
.AddParameter("object", _("Object"))
.UseStandardParameters("number");
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
obj.AddExpressionAndCondition(
"number",
@@ -153,7 +157,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Position/Bounding Box"),
"res/conditions/bounding-box-top_black.svg")
.AddParameter("object", _("Object"))
.UseStandardParameters("number");
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
obj.AddExpressionAndCondition("number",
"BoundingBoxRight",
@@ -164,7 +168,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Position/Bounding Box"),
"res/conditions/bounding-box-right_black.svg")
.AddParameter("object", _("Object"))
.UseStandardParameters("number");
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
obj.AddExpressionAndCondition("number",
"BoundingBoxBottom",
@@ -175,7 +179,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Position/Bounding Box"),
"res/conditions/bounding-box-bottom_black.svg")
.AddParameter("object", _("Object"))
.UseStandardParameters("number");
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
obj.AddExpressionAndCondition("number",
"BoundingBoxCenterX",
@@ -186,7 +190,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Position/Bounding Box"),
"res/conditions/bounding-box-center_black.svg")
.AddParameter("object", _("Object"))
.UseStandardParameters("number");
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
obj.AddExpressionAndCondition("number",
"BoundingBoxCenterY",
@@ -197,7 +201,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Position/Bounding Box"),
"res/conditions/bounding-box-center_black.svg")
.AddParameter("object", _("Object"))
.UseStandardParameters("number");
.UseStandardParameters("number", ParameterOptions::MakeNewOptions());
obj.AddAction("MettreAutourPos",
_("Put around a position"),
@@ -226,7 +230,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/actions/direction_black.png")
.AddParameter("object", _("Object"))
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Angle (in degrees)")));
obj.AddAction("Rotate",
_("Rotate"),
@@ -382,7 +389,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/actions/planicon.png")
.AddParameter("object", _("Object"))
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions());
obj.AddAction("ChangeLayer",
_("Layer"),
@@ -407,7 +415,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Variable"))
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions());
obj.AddAction("ModVarObjetTxt",
_("Text of an object variable"),
@@ -419,7 +428,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Variable"))
.UseStandardOperatorParameters("string");
.UseStandardOperatorParameters("string",
ParameterOptions::MakeNewOptions());
obj.AddAction("SetObjectVariableAsBoolean",
_("Boolean value of an object variable"),
@@ -516,7 +526,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/conditions/direction_black.png")
.AddParameter("object", _("Object"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Angle to compare to (in degrees)")))
.MarkAsAdvanced();
obj.AddCondition("Plan",
@@ -528,7 +541,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/conditions/planicon.png")
.AddParameter("object", _("Object"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddCondition("Layer",
@@ -585,7 +599,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/conditions/vitesse.png")
.AddParameter("object", _("Object"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddCondition("AngleOfDisplacement",
@@ -613,7 +628,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Variable"))
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions());
obj.AddCondition("VarObjetTxt",
_("Text of an object variable"),
@@ -625,7 +641,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Variable"))
.UseStandardRelationalOperatorParameters("string");
.UseStandardRelationalOperatorParameters(
"string", ParameterOptions::MakeNewOptions());
obj.AddCondition("ObjectVariableAsBoolean",
_("Boolean value of an object variable"),
@@ -1423,34 +1440,39 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"res/conditions/nbObjet24.png",
"res/conditions/nbObjet.png")
.AddParameter("objectList", _("Object"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsSimple()
.SetHidden();
extension.AddExpressionAndCondition(
"number",
"SceneInstancesCount",
_("Number of object instances on the scene"),
_("the number of instances of the specified objects living on the scene"),
_("the number of _PARAM1_ living on the scene"),
_("Objects"),
"res/conditions/nbObjet24.png")
.AddCodeOnlyParameter("objectsContext", "")
.AddParameter("objectListOrEmptyWithoutPicking", _("Object"))
.UseStandardParameters("number")
.MarkAsSimple();
extension
.AddExpressionAndCondition(
"number",
"SceneInstancesCount",
_("Number of object instances on the scene"),
_("the number of instances of the specified objects living on the "
"scene"),
_("the number of _PARAM1_ living on the scene"),
_("Objects"),
"res/conditions/nbObjet24.png")
.AddCodeOnlyParameter("objectsContext", "")
.AddParameter("objectListOrEmptyWithoutPicking", _("Object"))
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.MarkAsSimple();
extension.AddExpressionAndCondition(
"number",
"PickedInstancesCount",
_("Number of object instances currently picked"),
_("the number of instances picked by the previous conditions (or actions)"),
_("the number of _PARAM0_ currently picked"),
_("Objects"),
"res/conditions/nbObjet24.png")
.AddParameter("objectListOrEmptyWithoutPicking", _("Object"))
.UseStandardParameters("number")
.MarkAsSimple();
extension
.AddExpressionAndCondition(
"number",
"PickedInstancesCount",
_("Number of object instances currently picked"),
_("the number of instances picked by the previous conditions (or "
"actions)"),
_("the number of _PARAM0_ currently picked"),
_("Objects"),
"res/conditions/nbObjet24.png")
.AddParameter("objectListOrEmptyWithoutPicking", _("Object"))
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.MarkAsSimple();
extension
.AddCondition(
@@ -1559,7 +1581,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"",
"res/conditions/nbObjet.png")
.AddParameter("objectList", _("Object"))
.SetHidden(); // Deprecated
.SetHidden(); // Deprecated
obj.AddStrExpression("ObjectName",
_("Object name"),

View File

@@ -37,7 +37,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"",
"res/conditions/camera24.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardParameters("number")
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
@@ -69,7 +69,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"",
"res/conditions/camera24.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardParameters("number")
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
@@ -104,7 +104,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number"), "", true)
.UseStandardParameters("number")
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
@@ -120,7 +120,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number"), "", true)
.UseStandardParameters("number")
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
@@ -137,7 +137,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number"), "", true)
.UseStandardParameters("number")
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
@@ -154,7 +154,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number"), "", true)
.UseStandardParameters("number")
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
@@ -171,7 +171,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number"), "", true)
.UseStandardParameters("number")
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
@@ -188,7 +188,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number"), "", true)
.UseStandardParameters("number")
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
@@ -201,7 +201,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"",
"res/conditions/camera24.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardParameters("number")
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
@@ -542,7 +542,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Time scale (1 by default)")))
.MarkAsAdvanced();
extension
@@ -572,7 +575,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension

View File

@@ -160,7 +160,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
"",
"res/conditions/mouse24.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardParameters("number")
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
@@ -180,7 +180,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
"",
"res/conditions/mouse24.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardParameters("number")
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
@@ -276,7 +276,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
"res/conditions/touch24.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Touch identifier"))
.UseStandardParameters("number")
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)
@@ -292,7 +292,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
"res/conditions/touch24.png")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("expression", _("Touch identifier"))
.UseStandardParameters("number")
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.AddParameter("layer", _("Layer (base layer if empty)"), "", true)
.SetDefaultValue("\"\"")
.AddParameter("expression", _("Camera number (default : 0)"), "", true)

View File

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

View File

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

View File

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

View File

@@ -44,7 +44,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/actions/opacity.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Opacity (0-255)")))
.MarkAsSimple();
obj.AddAction("ChangeAnimation",
@@ -57,7 +60,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/actions/animation.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions())
.MarkAsSimple();
obj.AddAction("SetAnimationName",
@@ -86,7 +90,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
.SetHidden() // Hide as 8 direction is not supported officially in the
// interface.
.AddParameter("object", _("Object"), "Sprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddAction("ChangeSprite",
@@ -98,7 +103,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/actions/sprite.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddAction("PauseAnimation",
@@ -134,7 +140,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/actions/animation.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(_("Speed scale")))
.MarkAsSimple();
obj.AddAction("TourneVersPos",
@@ -162,7 +170,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/actions/scale_black.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Scale (1 by default)")))
.MarkAsAdvanced();
obj.AddAction("ChangeScaleWidth",
@@ -174,7 +185,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/actions/scaleWidth_black.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Scale (1 by default)")))
.MarkAsAdvanced();
obj.AddAction("ChangeScaleHeight",
@@ -186,7 +200,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/actions/scaleHeight_black.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Scale (1 by default)")))
.MarkAsAdvanced();
obj.AddAction("ChangeWidth",
@@ -198,7 +215,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/actions/scaleWidth_black.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddCondition("Width",
@@ -210,7 +228,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/conditions/scaleWidth_black.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddAction("ChangeHeight",
@@ -222,7 +241,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/actions/scaleHeight_black.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddCondition("Height",
@@ -234,7 +254,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/conditions/scaleHeight_black.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddAction("SetSize",
@@ -260,7 +281,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/conditions/animation.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddCondition("AnimationName",
@@ -288,7 +310,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
.SetHidden() // Hide as 8 direction is not supported officially in the
// interface.
.AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions());
obj.AddCondition("Sprite",
_("Current frame"),
@@ -301,7 +324,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/conditions/sprite.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddCondition("AnimStopped",
@@ -349,7 +373,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/conditions/scaleWidth_black.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Scale (1 by default)")))
.MarkAsAdvanced();
obj.AddCondition("ScaleHeight",
@@ -361,7 +388,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/conditions/scaleHeight_black.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Scale (1 by default)")))
.MarkAsAdvanced();
obj.AddCondition("Opacity",
@@ -374,7 +404,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/conditions/opacity.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
ParameterOptions::MakeNewOptions().SetDescription(
_("Opacity to compare to (0-255)")))
.MarkAsSimple();
obj.AddCondition(
@@ -387,7 +420,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
"res/conditions/opacity.png")
.AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddAction("ChangeColor",

View File

@@ -65,7 +65,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTimeExtension(
"res/conditions/time24.png",
"res/conditions/time.png")
.AddCodeOnlyParameter("currentScene", "")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Time scale (1 by default)")))
.MarkAsAdvanced();
extension

View File

@@ -34,7 +34,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("scenevar", _("Variable"))
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions());
extension
.AddCondition("VarSceneTxt",
@@ -45,7 +46,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("scenevar", _("Variable"))
.UseStandardRelationalOperatorParameters("string");
.UseStandardRelationalOperatorParameters(
"string", ParameterOptions::MakeNewOptions());
extension
.AddCondition(
@@ -107,7 +109,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("globalvar", _("Variable"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
@@ -119,7 +122,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
"res/conditions/var24.png",
"res/conditions/var.png")
.AddParameter("globalvar", _("Variable"))
.UseStandardRelationalOperatorParameters("string")
.UseStandardRelationalOperatorParameters(
"string", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
@@ -157,7 +161,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Variable"))
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions());
extension
.AddAction("ModVarSceneTxt",
@@ -168,7 +173,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("scenevar", _("Variable"))
.UseStandardOperatorParameters("string");
.UseStandardOperatorParameters("string",
ParameterOptions::MakeNewOptions());
extension
.AddAction(
@@ -203,7 +209,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Variable"))
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
@@ -215,7 +222,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(
"res/actions/var24.png",
"res/actions/var.png")
.AddParameter("globalvar", _("Variable"))
.UseStandardOperatorParameters("string")
.UseStandardOperatorParameters("string",
ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension

View File

@@ -94,13 +94,15 @@ InstructionMetadata& InstructionMetadata::AddCodeOnlyParameter(
}
InstructionMetadata& InstructionMetadata::UseStandardOperatorParameters(
const gd::String& type, const gd::String& typeExtraInfo) {
const gd::String& type, const ParameterOptions &options) {
const gd::String& expressionValueType =
gd::ValueTypeMetadata::GetPrimitiveValueType(type);
SetManipulatedType(expressionValueType);
if (type == "boolean") {
AddParameter("yesorno", _("New value"));
AddParameter(
"yesorno",
options.description.empty() ? _("New value") : options.description);
size_t valueParamIndex = parameters.size() - 1;
if (isObjectInstruction || isBehaviorInstruction) {
@@ -122,7 +124,9 @@ InstructionMetadata& InstructionMetadata::UseStandardOperatorParameters(
}
} else {
AddParameter("operator", _("Modification's sign"), expressionValueType);
AddParameter(type, _("Value"), typeExtraInfo);
AddParameter(type,
options.description.empty() ? _("Value") : options.description,
options.typeExtraInfo);
size_t operatorParamIndex = parameters.size() - 2;
size_t valueParamIndex = parameters.size() - 1;
@@ -155,7 +159,7 @@ InstructionMetadata& InstructionMetadata::UseStandardOperatorParameters(
InstructionMetadata&
InstructionMetadata::UseStandardRelationalOperatorParameters(
const gd::String& type, const gd::String& typeExtraInfo) {
const gd::String& type, const ParameterOptions &options) {
const gd::String& expressionValueType =
gd::ValueTypeMetadata::GetPrimitiveValueType(type);
SetManipulatedType(expressionValueType);
@@ -175,7 +179,9 @@ InstructionMetadata::UseStandardRelationalOperatorParameters(
}
} else {
AddParameter("relationalOperator", _("Sign of the test"), expressionValueType);
AddParameter(type, _("Value to compare"), typeExtraInfo);
AddParameter(type,
options.description.empty() ? _("Value to compare") : options.description,
options.typeExtraInfo);
size_t operatorParamIndex = parameters.size() - 2;
size_t valueParamIndex = parameters.size() - 1;

View File

@@ -14,6 +14,8 @@
#include "GDCore/Events/Instruction.h"
#include "GDCore/String.h"
#include "ParameterMetadata.h"
#include "ParameterOptions.h"
namespace gd {
class Project;
class Layout;
@@ -109,8 +111,8 @@ class GD_CORE_API InstructionMetadata {
}
/**
* Check if the instruction asynchronicity is optional. If it is, it can either
* be used synchronously or asynchronously, with one function for each.
* Check if the instruction asynchronicity is optional. If it is, it can
* either be used synchronously or asynchronously, with one function for each.
*/
bool IsOptionallyAsync() const {
return IsAsync() && !codeExtraInformation.functionCallName.empty();
@@ -223,21 +225,22 @@ class GD_CORE_API InstructionMetadata {
/**
* \brief Add the default parameters for an instruction manipulating the
* specified type ("string", "number") with the default operators.
*
*
* \note The type "string" can be declined in several subtypes.
* \see ParameterMetadata
*/
InstructionMetadata &UseStandardOperatorParameters(const gd::String &type, const gd::String& typeExtraInfo = "");
InstructionMetadata &UseStandardOperatorParameters(
const gd::String &type, const ParameterOptions &options);
/**
* \brief Add the default parameters for an instruction comparing the
* specified type ("string", "number") with the default relational operators.
*
*
* \note The type "string" can be declined in several subtypes.
* \see ParameterMetadata
*/
InstructionMetadata &UseStandardRelationalOperatorParameters(
const gd::String &type, const gd::String& typeExtraInfo = "");
const gd::String &type, const ParameterOptions &options);
/**
* \brief Mark the instruction as an object instruction. Automatically called
@@ -334,11 +337,12 @@ class GD_CORE_API InstructionMetadata {
}
/**
* Set the name of the function, doing asynchronous work, which will be called in
* the generated code. This function should return an asynchronous task
* (i.e: `gdjs.AsyncTask` in the JavaScript runtime).
* Set the name of the function, doing asynchronous work, which will be
* called in the generated code. This function should return an asynchronous
* task (i.e: `gdjs.AsyncTask` in the JavaScript runtime).
*
* \param functionName the name of the function doing asynchronous work to call.
* \param functionName the name of the function doing asynchronous work to
* call.
*/
ExtraInformation &SetAsyncFunctionName(const gd::String &functionName_) {
asyncFunctionCallName = functionName_;
@@ -482,12 +486,12 @@ class GD_CORE_API InstructionMetadata {
}
/**
* Set the name of the function, doing asynchronous work, which will be called in
* the generated code. This function should return an asynchronous task
* Set the name of the function, doing asynchronous work, which will be called
* in the generated code. This function should return an asynchronous task
* (i.e: `gdjs.AsyncTask` in the JavaScript runtime).
*
* \param functionName the name of the function doing asynchronous work to call.
* \note Shortcut for `codeExtraInformation.SetAsyncFunctionName`.
* \param functionName the name of the function doing asynchronous work to
* call. \note Shortcut for `codeExtraInformation.SetAsyncFunctionName`.
*/
ExtraInformation &SetAsyncFunctionName(const gd::String &functionName) {
return codeExtraInformation.SetAsyncFunctionName(functionName);
@@ -512,7 +516,7 @@ class GD_CORE_API InstructionMetadata {
/**
* \brief Get the files that must be included to use the instruction.
*/
const std::vector<gd::String>& GetIncludeFiles() const {
const std::vector<gd::String> &GetIncludeFiles() const {
return codeExtraInformation.GetIncludeFiles();
};

View File

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

View File

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

View File

@@ -7,13 +7,14 @@
#ifndef GDCORE_INITIALINSTANCE_H
#define GDCORE_INITIALINSTANCE_H
#include <map>
#include "GDCore/Project/VariablesContainer.h"
#include "GDCore/String.h"
namespace gd {
class PropertyDescriptor;
class Project;
class Layout;
}
} // namespace gd
namespace gd {
@@ -127,7 +128,8 @@ class GD_CORE_API InitialInstance {
void SetCustomHeight(double height_) { height = height_; }
/**
* \brief Return true if the instance is locked and cannot be moved in the IDE.
* \brief Return true if the instance is locked and cannot be moved in the
* IDE.
*/
bool IsLocked() const { return locked; };
@@ -240,7 +242,7 @@ class GD_CORE_API InitialInstance {
* \brief Set the value of a string property stored in the instance.
*/
void SetRawStringProperty(const gd::String& name, const gd::String& value);
///@}
///@}
/** \name Saving and loading
* Members functions related to serialization.
@@ -272,18 +274,19 @@ class GD_CORE_API InitialInstance {
stringProperties; ///< More data which can be used by the object
gd::String objectName; ///< Object name
double x; ///< Object initial X position
double y; ///< Object initial Y position
double angle; ///< Object initial angle
double x; ///< Object initial X position
double y; ///< Object initial Y position
double angle; ///< Object initial angle
int zOrder; ///< Object initial Z order
gd::String layer; ///< Object initial layer
bool personalizedSize; ///< True if object has a custom size
double width; ///< Object custom width
double height; ///< Object custom height
double width; ///< Object custom width
double height; ///< Object custom height
gd::VariablesContainer initialVariables; ///< Instance specific variables
bool locked; ///< True if the instance is locked
bool sealed; ///< True if the instance is sealed
mutable gd::String persistentUuid; ///< A persistent random version 4 UUID, useful for hot reloading.
mutable gd::String persistentUuid; ///< A persistent random version 4 UUID,
///< useful for hot reloading.
static gd::String*
badStringProperyValue; ///< Empty string returned by GetRawStringProperty

View File

@@ -22,8 +22,8 @@
#include "GDCore/IDE/Events/UsedExtensionsFinder.h"
#include "GDCore/IDE/PlatformManager.h"
#include "GDCore/IDE/Project/ArbitraryResourceWorker.h"
#include "GDCore/Project/EventsFunctionsExtension.h"
#include "GDCore/Project/CustomObjectConfiguration.h"
#include "GDCore/Project/EventsFunctionsExtension.h"
#include "GDCore/Project/ExternalEvents.h"
#include "GDCore/Project/ExternalLayout.h"
#include "GDCore/Project/Layout.h"
@@ -347,6 +347,49 @@ void Project::RemoveExternalEvents(const gd::String& name) {
externalEvents.erase(events);
}
void Project::MoveLayout(std::size_t oldIndex, std::size_t newIndex) {
if (oldIndex >= scenes.size() || newIndex >= scenes.size()) return;
std::unique_ptr<gd::Layout> scene = std::move(scenes[oldIndex]);
scenes.erase(scenes.begin() + oldIndex);
scenes.insert(scenes.begin() + newIndex, std::move(scene));
};
void Project::MoveExternalEvents(std::size_t oldIndex, std::size_t newIndex) {
if (oldIndex >= externalEvents.size() || newIndex >= externalEvents.size())
return;
std::unique_ptr<gd::ExternalEvents> externalEventsItem =
std::move(externalEvents[oldIndex]);
externalEvents.erase(externalEvents.begin() + oldIndex);
externalEvents.insert(externalEvents.begin() + newIndex,
std::move(externalEventsItem));
};
void Project::MoveExternalLayout(std::size_t oldIndex, std::size_t newIndex) {
if (oldIndex >= externalLayouts.size() || newIndex >= externalLayouts.size())
return;
std::unique_ptr<gd::ExternalLayout> externalLayout =
std::move(externalLayouts[oldIndex]);
externalLayouts.erase(externalLayouts.begin() + oldIndex);
externalLayouts.insert(externalLayouts.begin() + newIndex,
std::move(externalLayout));
};
void Project::MoveEventsFunctionsExtension(std::size_t oldIndex,
std::size_t newIndex) {
if (oldIndex >= eventsFunctionsExtensions.size() ||
newIndex >= eventsFunctionsExtensions.size())
return;
std::unique_ptr<gd::EventsFunctionsExtension> eventsFunctionsExtension =
std::move(eventsFunctionsExtensions[oldIndex]);
eventsFunctionsExtensions.erase(eventsFunctionsExtensions.begin() + oldIndex);
eventsFunctionsExtensions.insert(eventsFunctionsExtensions.begin() + newIndex,
std::move(eventsFunctionsExtension));
};
void Project::SwapExternalEvents(std::size_t first, std::size_t second) {
if (first >= externalEvents.size() || second >= externalEvents.size()) return;

View File

@@ -165,7 +165,7 @@ class GD_CORE_API Project : public ObjectsContainer {
*/
const gd::String& GetPackageName() const { return packageName; }
/**
/**
* \brief Change the slug of the template from which the project is created.
*/
void SetTemplateSlug(const gd::String& templateSlug_) {
@@ -458,7 +458,7 @@ class GD_CORE_API Project : public ObjectsContainer {
/**
* Create an object of the given type with the specified name.
*
*
* \param type The type of the object
* \param name The name of the object
*/
@@ -467,7 +467,7 @@ class GD_CORE_API Project : public ObjectsContainer {
/**
* Create an object configuration of the given type.
*
*
* \param type The type of the object
*/
std::unique_ptr<gd::ObjectConfiguration> CreateObjectConfiguration(
@@ -525,6 +525,11 @@ class GD_CORE_API Project : public ObjectsContainer {
*/
std::size_t GetLayoutPosition(const gd::String& name) const;
/**
* Change the position of the specified layout.
*/
void MoveLayout(std::size_t oldIndex, std::size_t newIndex);
/**
* \brief Swap the specified layouts.
*
@@ -628,6 +633,11 @@ class GD_CORE_API Project : public ObjectsContainer {
*/
std::size_t GetExternalEventsPosition(const gd::String& name) const;
/**
* Change the position of the specified external events.
*/
void MoveExternalEvents(std::size_t oldIndex, std::size_t newIndex);
/**
* \brief Swap the specified external events.
*
@@ -702,6 +712,11 @@ class GD_CORE_API Project : public ObjectsContainer {
*/
std::size_t GetExternalLayoutPosition(const gd::String& name) const;
/**
* Change the position of the specified external layout.
*/
void MoveExternalLayout(std::size_t oldIndex, std::size_t newIndex);
/**
* \brief Swap the specified external layouts.
*
@@ -791,6 +806,11 @@ class GD_CORE_API Project : public ObjectsContainer {
*/
std::size_t GetEventsFunctionsExtensionPosition(const gd::String& name) const;
/**
* Change the position of the specified events function extension.
*/
void MoveEventsFunctionsExtension(std::size_t oldIndex, std::size_t newIndex);
/**
* \brief Swap the specified events functions extensions.
*

View File

@@ -3,8 +3,7 @@
#ifndef GDCORE_VECTOR2_H
#define GDCORE_VECTOR2_H
namespace gd
{
namespace gd {
////////////////////////////////////////////////////////////
//
@@ -12,11 +11,12 @@ namespace gd
// Copyright (C) 2007-2016 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
// In no event will the authors be held liable for any damages arising from the
// use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it freely,
// subject to the following restrictions:
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented;
// you must not claim that you wrote the original software.

View File

@@ -19,6 +19,8 @@
import { type ObjectsRenderingService, type ObjectsEditorService } from '../JsExtensionTypes.flow.js'
*/
const stringifyOptions = (options) => '["' + options.join('","') + '"]';
module.exports = {
createExtension: function (
_ /*: (string) => string */,
@@ -35,8 +37,9 @@ module.exports = {
)
.setExtensionHelpPath('/objects/bbtext')
.setCategory('User interface');
extension.addInstructionOrExpressionGroupMetadata(_("BBCode Text Object"))
.setIcon("JsPlatform/Extensions/bbcode32.png");
extension
.addInstructionOrExpressionGroupMetadata(_('BBCode Text Object'))
.setIcon('JsPlatform/Extensions/bbcode32.png');
var objectBBText = new gd.ObjectJsImplementation();
// $FlowExpectedError
@@ -195,7 +198,10 @@ module.exports = {
.addParameter('object', objectName, objectName, false)
.getCodeExtraInformation()
.setFunctionName(`get${property.functionName}`);
} else if (parameterType === 'string') {
} else if (
parameterType === 'string' ||
parameterType === 'stringWithSelector'
) {
gdObject
.addStrExpression(
`Get${property.functionName}`,
@@ -210,13 +216,24 @@ module.exports = {
}
// Add the action
if (parameterType === 'number' || parameterType === 'string') {
const expressionType =
parameterType === 'number' ? 'expression' : 'string';
if (
parameterType === 'number' ||
parameterType === 'string' ||
parameterType === 'stringWithSelector'
) {
const parameterOptions =
gd.ParameterOptions.makeNewOptions().setDescription(
property.paramLabel
);
if (property.options) {
parameterOptions.setTypeExtraInfo(
stringifyOptions(property.options)
);
}
gdObject
.addAction(
`Set${property.functionName}`,
property.paramLabel,
property.instructionLabel,
property.actionDescription,
property.actionSentence,
'',
@@ -224,7 +241,7 @@ module.exports = {
property.iconPath
)
.addParameter('object', objectName, objectName, false)
.useStandardOperatorParameters(parameterType)
.useStandardOperatorParameters(parameterType, parameterOptions)
.getCodeExtraInformation()
.setFunctionName(`set${property.functionName}`)
.setGetter(`get${property.functionName}`);
@@ -232,7 +249,7 @@ module.exports = {
gdObject
.addAction(
`Set${property.functionName}`,
property.paramLabel,
property.instructionLabel,
property.actionDescription,
property.actionSentence,
'',
@@ -243,9 +260,7 @@ module.exports = {
.addParameter(
parameterType,
property.paramLabel,
property.options
? '["' + property.options.join('", "') + '"]'
: '',
'', // There should not be options for the property if it's not a stringWithSelector
false
)
.getCodeExtraInformation()
@@ -254,13 +269,24 @@ module.exports = {
}
// Add condition
if (parameterType === 'string' || parameterType === 'number') {
const propExpressionType =
parameterType === 'string' ? 'string' : 'expression';
if (
parameterType === 'string' ||
parameterType === 'number' ||
parameterType === 'stringWithSelector'
) {
const parameterOptions =
gd.ParameterOptions.makeNewOptions().setDescription(
property.paramLabel
);
if (property.options) {
parameterOptions.setTypeExtraInfo(
stringifyOptions(property.options)
);
}
gdObject
.addCondition(
`Is${property.functionName}`,
property.paramLabel,
property.instructionLabel,
property.conditionDescription,
property.conditionSentence,
'',
@@ -268,14 +294,17 @@ module.exports = {
property.iconPath
)
.addParameter('object', objectName, objectName, false)
.useStandardRelationalOperatorParameters(parameterType)
.useStandardRelationalOperatorParameters(
parameterType,
parameterOptions
)
.getCodeExtraInformation()
.setFunctionName(`get${property.functionName}`);
} else if (parameterType === 'yesorno') {
gdObject
.addCondition(
`Is${property.functionName}`,
property.paramLabel,
property.instructionLabel,
property.conditionDescription,
property.conditionSentence,
'',
@@ -294,7 +323,8 @@ module.exports = {
functionName: 'BBText',
iconPath: 'res/actions/text24_black.png',
type: 'string',
paramLabel: _('BBCode text'),
instructionLabel: _('BBCode text'),
paramLabel: _('Text'),
conditionDescription: _('Compare the value of the BBCode text.'),
conditionSentence: _('the BBCode text'),
actionDescription: _('Set BBCode text'),
@@ -306,7 +336,8 @@ module.exports = {
functionName: 'Color',
iconPath: 'res/actions/color24.png',
type: 'color',
paramLabel: _('Color'),
instructionLabel: _('Color'),
paramLabel: _('Color (R;G;B)'),
conditionDescription: '', // No conditions for a "color" property
conditionSentence: '', // No conditions for a "color" property
actionDescription: _('Set base color'),
@@ -318,7 +349,8 @@ module.exports = {
functionName: 'Opacity',
iconPath: 'res/actions/opacity24.png',
type: 'number',
paramLabel: _('Opacity'),
instructionLabel: _('Opacity'),
paramLabel: _('Opacity (0-255)'),
conditionDescription: _(
'Compare the value of the base opacity of the text.'
),
@@ -332,6 +364,7 @@ module.exports = {
functionName: 'FontSize',
iconPath: 'res/actions/characterSize24.png',
type: 'number',
instructionLabel: _('Font size'),
paramLabel: _('Font size'),
conditionDescription: _('Compare the base font size of the text.'),
conditionSentence: _('the base font size'),
@@ -344,6 +377,7 @@ module.exports = {
functionName: 'FontFamily',
iconPath: 'res/actions/font24.png',
type: 'string',
instructionLabel: _('Font family'),
paramLabel: _('Font family'),
conditionDescription: _('Compare the value of font family'),
conditionSentence: _('the base font family'),
@@ -356,6 +390,7 @@ module.exports = {
functionName: 'Alignment',
iconPath: 'res/actions/textAlign24.png',
type: 'stringWithSelector',
instructionLabel: _('Alignment'),
paramLabel: _('Alignment'),
options: ['left', 'right', 'center'],
conditionDescription: _('Check the current text alignment.'),
@@ -369,6 +404,7 @@ module.exports = {
functionName: 'WordWrap',
iconPath: 'res/actions/scaleWidth24_black.png',
type: 'boolean',
instructionLabel: _('Word wrap'),
paramLabel: _('Word wrap'),
conditionDescription: _('Check if word wrap is enabled.'),
conditionSentence: _('Word wrap is enabled'),
@@ -381,6 +417,7 @@ module.exports = {
functionName: 'WrappingWidth',
iconPath: 'res/actions/scaleWidth24_black.png',
type: 'number',
instructionLabel: _('Wrapping width'),
paramLabel: _('Wrapping width'),
conditionDescription: _(
'Compare the width, in pixels, after which the text is wrapped on next line.'
@@ -510,8 +547,7 @@ module.exports = {
* This is called to update the PIXI object on the scene editor
*/
RenderedBBTextInstance.prototype.update = function () {
const properties = this._associatedObjectConfiguration
.getProperties();
const properties = this._associatedObjectConfiguration.getProperties();
const rawText = properties.get('text').getValue();
if (rawText !== this._pixiObject.text) {

View File

@@ -187,7 +187,7 @@ module.exports = {
'res/conditions/text24_black.png'
)
.addParameter('object', _('Bitmap text'), 'BitmapTextObject', false)
.useStandardParameters('string')
.useStandardParameters('string', gd.ParameterOptions.makeNewOptions())
.setFunctionName('setText')
.setGetter('getText');
@@ -202,7 +202,12 @@ module.exports = {
'res/conditions/opacity24.png'
)
.addParameter('object', _('Bitmap text'), 'BitmapTextObject', false)
.useStandardParameters('number')
.useStandardParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Opacity (0-255)')
)
)
.setFunctionName('setOpacity')
.setGetter('getOpacity');
@@ -217,7 +222,7 @@ module.exports = {
'res/conditions/characterSize24.png'
)
.addParameter('object', _('Bitmap text'), 'BitmapTextObject', false)
.useStandardParameters('number')
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
.setFunctionName('getFontSize');
object
@@ -231,7 +236,12 @@ module.exports = {
'res/actions/scale24_black.png'
)
.addParameter('object', _('Bitmap text'), 'BitmapTextObject', false)
.useStandardParameters('number')
.useStandardParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Scale (1 by default)')
)
)
.setFunctionName('setScale')
.setGetter('getScale');
@@ -246,7 +256,7 @@ module.exports = {
'res/conditions/font24.png'
)
.addParameter('object', _('Bitmap text'), 'BitmapTextObject', false)
.useStandardParameters('string')
.useStandardParameters('string', gd.ParameterOptions.makeNewOptions())
.setFunctionName('getFontName');
object
@@ -304,7 +314,12 @@ module.exports = {
'res/actions/textAlign24.png'
)
.addParameter('object', _('Bitmap text'), 'BitmapTextObject', false)
.useStandardParameters('string')
.useStandardParameters(
'string',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Alignment ("left", "right" or "center")')
)
)
.setFunctionName('getAlignment');
object
@@ -367,7 +382,7 @@ module.exports = {
'res/actions/scaleWidth24_black.png'
)
.addParameter('object', _('Bitmap text'), 'BitmapTextObject', false)
.useStandardParameters('number')
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
.setFunctionName('setWrappingWidth')
.setGetter('getWrappingWidth');

View File

@@ -45,7 +45,8 @@ void DeclareDestroyOutsideBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/destroyoutsideicon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "DestroyOutside")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.MarkAsAdvanced()
.SetFunctionName("GetExtraBorder");
@@ -59,7 +60,8 @@ void DeclareDestroyOutsideBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/destroyoutsideicon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "DestroyOutside")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions())
.MarkAsAdvanced()
.SetFunctionName("SetExtraBorder")
.SetGetter("GetExtraBorder");

View File

@@ -64,7 +64,8 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) {
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("string", _("Inventory name"))
.AddParameter("string", _("Item name"))
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.SetFunctionName("InventoryTools::Count");
extension

View File

@@ -24,7 +24,9 @@ void DeclarePanelSpriteObjectExtension(gd::PlatformExtension& extension) {
"Victor Levasseur and Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/objects/panel_sprite");
extension.AddInstructionOrExpressionGroupMetadata(_("Panel Sprite (9-patch) Object"))
extension
.AddInstructionOrExpressionGroupMetadata(
_("Panel Sprite (9-patch) Object"))
.SetIcon("CppPlatform/Extensions/PanelSpriteIcon.png");
gd::ObjectMetadata& obj =
@@ -48,7 +50,10 @@ void DeclarePanelSpriteObjectExtension(gd::PlatformExtension& extension) {
"res/conditions/opacity.png")
.AddParameter("object", _("Object"), "PanelSprite")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Opacity to compare to (0-255)")));
obj.AddAction(
"SetOpacity",
@@ -61,7 +66,10 @@ void DeclarePanelSpriteObjectExtension(gd::PlatformExtension& extension) {
"res/actions/opacity.png")
.AddParameter("object", _("Object"), "PanelSprite")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Opacity (0-255)")));
obj.AddExpression("Opacity",
_("Opacity"),
@@ -91,7 +99,8 @@ void DeclarePanelSpriteObjectExtension(gd::PlatformExtension& extension) {
"res/actions/scaleWidth_black.png")
.AddParameter("object", _("Object"), "PanelSprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions())
.SetFunctionName("SetWidth")
.SetGetter("GetWidth");
@@ -104,7 +113,8 @@ void DeclarePanelSpriteObjectExtension(gd::PlatformExtension& extension) {
"res/conditions/scaleWidth_black.png")
.AddParameter("object", _("Object"), "PanelSprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.SetFunctionName("GetWidth");
obj.AddAction("Height",
@@ -116,7 +126,8 @@ void DeclarePanelSpriteObjectExtension(gd::PlatformExtension& extension) {
"res/actions/scaleHeight_black.png")
.AddParameter("object", _("Object"), "PanelSprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions())
.SetFunctionName("SetHeight")
.SetGetter("GetHeight");
@@ -129,7 +140,8 @@ void DeclarePanelSpriteObjectExtension(gd::PlatformExtension& extension) {
"res/conditions/scaleHeight_black.png")
.AddParameter("object", _("Object"), "PanelSprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.SetFunctionName("SetHeight")
.SetGetter("GetHeight");
@@ -143,7 +155,10 @@ void DeclarePanelSpriteObjectExtension(gd::PlatformExtension& extension) {
.SetHidden() // Deprecated
.AddParameter("object", _("Object"), "PanelSprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Angle (in degrees)")))
.SetFunctionName("SetAngle")
.SetGetter("GetAngle");
@@ -157,7 +172,10 @@ void DeclarePanelSpriteObjectExtension(gd::PlatformExtension& extension) {
.SetHidden() // Deprecated
.AddParameter("object", _("Object"), "PanelSprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Angle to compare to (in degrees)")))
.SetFunctionName("SetAngle")
.SetGetter("GetAngle");

View File

@@ -8,12 +8,13 @@ This project is released under the MIT License.
#ifndef PANELSPRITEOBJECT_H
#define PANELSPRITEOBJECT_H
#include <memory>
#include "GDCore/Project/Object.h"
namespace gd {
class ObjectConfiguration;
class InitialInstance;
class Project;
}
} // namespace gd
/**
* PanelSprite Object
@@ -23,37 +24,38 @@ class GD_EXTENSION_API PanelSpriteObject : public gd::ObjectConfiguration {
PanelSpriteObject();
virtual ~PanelSpriteObject();
virtual std::unique_ptr<gd::ObjectConfiguration> Clone() const {
return std::unique_ptr<gd::ObjectConfiguration>(new PanelSpriteObject(*this));
return std::unique_ptr<gd::ObjectConfiguration>(
new PanelSpriteObject(*this));
}
#if defined(GD_IDE_ONLY)
virtual void ExposeResources(gd::ArbitraryResourceWorker &worker);
#endif
float GetWidth() const { return width; };
float GetHeight() const { return height; };
double GetWidth() const { return width; };
double GetHeight() const { return height; };
void SetWidth(float newWidth) {
void SetWidth(double newWidth) {
width = newWidth >= (leftMargin + rightMargin) ? newWidth
: (leftMargin + rightMargin);
};
void SetHeight(float newHeight) {
void SetHeight(double newHeight) {
height = newHeight >= (topMargin + bottomMargin)
? newHeight
: (topMargin + bottomMargin);
};
float GetLeftMargin() const { return leftMargin; };
void SetLeftMargin(float newMargin) { leftMargin = newMargin; };
double GetLeftMargin() const { return leftMargin; };
void SetLeftMargin(double newMargin) { leftMargin = newMargin; };
float GetTopMargin() const { return topMargin; };
void SetTopMargin(float newMargin) { topMargin = newMargin; };
double GetTopMargin() const { return topMargin; };
void SetTopMargin(double newMargin) { topMargin = newMargin; };
float GetRightMargin() const { return rightMargin; };
void SetRightMargin(float newMargin) { rightMargin = newMargin; };
double GetRightMargin() const { return rightMargin; };
void SetRightMargin(double newMargin) { rightMargin = newMargin; };
float GetBottomMargin() const { return bottomMargin; };
void SetBottomMargin(float newMargin) { bottomMargin = newMargin; };
double GetBottomMargin() const { return bottomMargin; };
void SetBottomMargin(double newMargin) { bottomMargin = newMargin; };
bool IsTiled() const { return tiled; };
void SetTiled(bool enable = true) { tiled = enable; };
@@ -72,13 +74,13 @@ class GD_EXTENSION_API PanelSpriteObject : public gd::ObjectConfiguration {
virtual void DoSerializeTo(gd::SerializerElement &element) const;
#endif
float width;
float height;
double width;
double height;
float leftMargin;
float topMargin;
float rightMargin;
float bottomMargin;
double leftMargin;
double topMargin;
double rightMargin;
double bottomMargin;
bool tiled;
};

View File

@@ -5,10 +5,9 @@ Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com)
This project is released under the MIT License.
*/
#include "Extension.h"
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/Tools/Localization.h"
#include "Extension.h"
#include "ParticleEmitterObject.h"
/**
@@ -23,7 +22,8 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions());
obj.AddAction("EmitterForceMax",
_("Emission maximal force"),
@@ -33,7 +33,8 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions());
obj.AddAction("EmitterAngle",
_("Emission angle"),
@@ -43,7 +44,10 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Angle (in degrees)")));
obj.AddCondition("EmitterAngle",
_("Emission angle"),
@@ -53,7 +57,10 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Angle to compare to (in degrees)")));
obj.AddAction("EmitterAngleA",
_("Emission angle 1"),
@@ -63,8 +70,9 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number")
.SetHidden(); // Angle A is not used.
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions())
.SetHidden(); // Angle A is not used.
obj.AddCondition("EmitterAngleA",
_("Emission angle 1"),
@@ -74,8 +82,9 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number")
.SetHidden(); // Angle A is not used.
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.SetHidden(); // Angle A is not used.
obj.AddAction("EmitterAngleB",
_("Emission angle 2"),
@@ -85,8 +94,9 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number")
.SetHidden(); // Angle B is the same as cone spray angle
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions())
.SetHidden(); // Angle B is the same as cone spray angle
obj.AddCondition("EmitterAngleB",
_("Emission angle 2"),
@@ -96,8 +106,9 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number")
.SetHidden(); // Angle B is the same as cone spray angle
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.SetHidden(); // Angle B is the same as cone spray angle
obj.AddAction(
"ConeSprayAngle",
@@ -108,7 +119,10 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Angle (in degrees)")));
obj.AddCondition("ConeSprayAngle",
_("Angle of the spray cone"),
@@ -118,7 +132,10 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Angle to compare to (in degrees)")));
obj.AddAction("ZoneRadius",
_("Creation radius"),
@@ -129,7 +146,8 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions());
obj.AddCondition("ZoneRadius",
_("Creation radius"),
@@ -139,19 +157,23 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions());
obj.AddAction(
"ParticleLifeTimeMin",
_("Minimum lifetime"),
_("Modify particles minimum lifetime.Particles have to be recreated "
_("Modify particles minimum lifetime. Particles have to be recreated "
"in order to take changes in account."),
_("the minimum lifetime of particles"),
_("Common"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Duration (in seconds)")));
obj.AddCondition(
"ParticleLifeTimeMin",
@@ -162,7 +184,10 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Duration to compare to (in seconds)")));
obj.AddAction(
"ParticleLifeTimeMax",
@@ -174,7 +199,10 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Duration (in seconds)")));
obj.AddCondition(
"ParticleLifeTimeMax",
@@ -185,7 +213,10 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Duration to compare to (in seconds)")));
obj.AddAction("ParticleGravityX",
_("Gravity value on X axis"),
@@ -195,7 +226,8 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions());
obj.AddCondition(
"ParticleGravityX",
@@ -206,7 +238,8 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions());
obj.AddAction("ParticleGravityY",
_("Gravity value on Y axis"),
@@ -216,7 +249,8 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions());
obj.AddCondition(
"ParticleGravityY",
@@ -227,7 +261,8 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions());
obj.AddAction("ParticleGravityAngle",
_("Gravity angle"),
@@ -237,7 +272,10 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Angle (in degrees)")));
obj.AddCondition("ParticleGravityAngle",
_("Gravity angle"),
@@ -247,7 +285,10 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Angle to compare to (in degrees)")));
obj.AddAction("ParticleGravityLength",
_("Gravity"),
@@ -257,7 +298,8 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions());
obj.AddCondition("ParticleGravityLength",
_("Gravity"),
@@ -267,11 +309,13 @@ void ExtensionSubDeclaration1(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions());
obj.AddAction("StartEmission",
_("Start emission"),
_("Refill tank (if not infinite) and start emission of the particles."),
_("Refill tank (if not infinite) and start emission of the "
"particles."),
_("Start emission of _PARAM0_"),
_("Common"),
"CppPlatform/Extensions/particleSystemicon24.png",

View File

@@ -5,11 +5,10 @@ Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com)
This project is released under the MIT License.
*/
#include "Extension.h"
#include "GDCore/Extensions/Metadata/MultipleInstructionMetadata.h"
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/Tools/Localization.h"
#include "GDCore/Extensions/Metadata/MultipleInstructionMetadata.h"
#include "Extension.h"
#include "ParticleEmitterObject.h"
/**
@@ -36,137 +35,161 @@ void ExtensionSubDeclaration2(gd::ObjectMetadata& obj) {
.AddParameter("object", _("Object"), "ParticleEmitter")
.AddParameter("color", _("End color"));
obj.AddAction(
"ParticleRed1",
_("Start color red component"),
_("Modify the start color red component."),
_("the start color red component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
obj.AddAction("ParticleRed1",
_("Start color red component"),
_("Modify the start color red component."),
_("the start color red component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Value (0-255)")));
obj.AddCondition(
"ParticleRed1",
_("Start color red component"),
_("Compare the start color red component."),
_("the start color red component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
obj.AddCondition("ParticleRed1",
_("Start color red component"),
_("Compare the start color red component."),
_("the start color red component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Value to compare to (0-255)")));
obj.AddAction(
"ParticleRed2",
_("End color red component"),
_("Modify the end color red component."),
_("the end color red component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
obj.AddAction("ParticleRed2",
_("End color red component"),
_("Modify the end color red component."),
_("the end color red component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Value (0-255)")));
obj.AddCondition(
"ParticleRed2",
_("End color red component"),
_("Compare the end color red component."),
_("the end color red component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
obj.AddCondition("ParticleRed2",
_("End color red component"),
_("Compare the end color red component."),
_("the end color red component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Value to compare to (0-255)")));
obj.AddAction(
"ParticleBlue1",
_("Start color blue component"),
_("Modify the start color blue component."),
_("the start color blue component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
obj.AddAction("ParticleBlue1",
_("Start color blue component"),
_("Modify the start color blue component."),
_("the start color blue component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Value (0-255)")));
obj.AddCondition(
"ParticleBlue1",
_("Start color blue component"),
_("Compare the start color blue component."),
_("the start color blue component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
obj.AddCondition("ParticleBlue1",
_("Start color blue component"),
_("Compare the start color blue component."),
_("the start color blue component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Value to compare to (0-255)")));
obj.AddAction(
"ParticleBlue2",
_("End color blue component"),
_("Modify the end color blue component."),
_("the end color blue component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
obj.AddAction("ParticleBlue2",
_("End color blue component"),
_("Modify the end color blue component."),
_("the end color blue component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Value (0-255)")));
obj.AddCondition(
"ParticleBlue2",
_("End color blue component"),
_("Compare the end color blue component."),
_("the end color blue component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
obj.AddCondition("ParticleBlue2",
_("End color blue component"),
_("Compare the end color blue component."),
_("the end color blue component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Value to compare to (0-255)")));
obj.AddAction(
"ParticleGreen1",
_("Start color green component"),
_("Modify the start color green component."),
_("the start color green component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
obj.AddAction("ParticleGreen1",
_("Start color green component"),
_("Modify the start color green component."),
_("the start color green component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Value (0-255)")));
obj.AddCondition(
"ParticleGreen1",
_("Start color green component"),
_("Compare the start color green component."),
_("the start color green component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
obj.AddCondition("ParticleGreen1",
_("Start color green component"),
_("Compare the start color green component."),
_("the start color green component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Value to compare to (0-255)")));
obj.AddAction(
"ParticleGreen2",
_("End color green component"),
_("Modify the end color green component."),
_("the end color green component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
obj.AddAction("ParticleGreen2",
_("End color green component"),
_("Modify the end color green component."),
_("the end color green component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Value (0-255)")));
obj.AddCondition(
"ParticleGreen2",
_("End color green component"),
_("Compare the end color green component."),
_("the end color green component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
obj.AddCondition("ParticleGreen2",
_("End color green component"),
_("Compare the end color green component."),
_("the end color green component"),
_("Advanced"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Value to compare to (0-255)")));
obj.AddAction("ParticleSize1",
_("Start size"),
@@ -176,7 +199,8 @@ void ExtensionSubDeclaration2(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions());
obj.AddCondition("ParticleSize1",
_("Start size"),
@@ -186,7 +210,8 @@ void ExtensionSubDeclaration2(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions());
obj.AddAction("ParticleSize2",
_("End size"),
@@ -196,7 +221,8 @@ void ExtensionSubDeclaration2(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions());
obj.AddCondition("ParticleSize2",
_("End size"),
@@ -206,7 +232,8 @@ void ExtensionSubDeclaration2(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions());
obj.AddAction("ParticleAlpha1",
_("Start opacity"),
@@ -216,18 +243,23 @@ void ExtensionSubDeclaration2(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Value (0-255)")));
obj.AddCondition(
"ParticleAlpha1",
_("Start opacity"),
_("Compare the start opacity of particles."),
_("the start opacity"),
_("Common"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
obj.AddCondition("ParticleAlpha1",
_("Start opacity"),
_("Compare the start opacity of particles."),
_("the start opacity"),
_("Common"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Value to compare to (0-255)")));
obj.AddAction("ParticleAlpha2",
_("End opacity"),
@@ -237,18 +269,23 @@ void ExtensionSubDeclaration2(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Value (0-255)")));
obj.AddCondition(
"ParticleAlpha2",
_("End opacity"),
_("Compare the end opacity of particles."),
_("the end opacity"),
_("Common"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
obj.AddCondition("ParticleAlpha2",
_("End opacity"),
_("Compare the end opacity of particles."),
_("the end opacity"),
_("Common"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Value to compare to (0-255)")));
obj.AddCondition("NoMoreParticles",
_("No more particles"),
@@ -261,58 +298,63 @@ void ExtensionSubDeclaration2(gd::ObjectMetadata& obj) {
.AddParameter("object", _("Object"), "ParticleEmitter");
obj.AddExpressionAndConditionAndAction(
"number",
"ParticleRotationMinSpeed",
_("Particle rotation min speed"),
_("the minimum rotation speed of the particles"),
_("the particles minimum rotation speed"),
_("Common"),
"CppPlatform/Extensions/particleSystemicon24.png")
"number",
"ParticleRotationMinSpeed",
_("Particle rotation min speed"),
_("the minimum rotation speed of the particles"),
_("the particles minimum rotation speed"),
_("Common"),
"CppPlatform/Extensions/particleSystemicon24.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardParameters("number")
.UseStandardParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Angular speed (in degrees per second)")))
.MarkAsAdvanced()
.SetFunctionName("setParticleRotationMinSpeed")
.SetGetter("getParticleRotationMinSpeed");
obj.AddExpressionAndConditionAndAction(
"number",
"ParticleRotationMaxSpeed",
_("Particle rotation max speed"),
_("the maximum rotation speed of the particles"),
_("the particles maximum rotation speed"),
_("Common"),
"CppPlatform/Extensions/particleSystemicon24.png")
"number",
"ParticleRotationMaxSpeed",
_("Particle rotation max speed"),
_("the maximum rotation speed of the particles"),
_("the particles maximum rotation speed"),
_("Common"),
"CppPlatform/Extensions/particleSystemicon24.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardParameters("number")
.UseStandardParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Angular speed (in degrees per second)")))
.MarkAsAdvanced()
.SetFunctionName("setParticleRotationMaxSpeed")
.SetGetter("getParticleRotationMaxSpeed");
obj.AddExpressionAndConditionAndAction(
"number",
"MaxParticlesCount",
_("Number of displayed particles"),
_("the maximum number of displayed particles"),
_("the maximum number of displayed particles"),
_("Common"),
"CppPlatform/Extensions/particleSystemicon24.png")
"number",
"MaxParticlesCount",
_("Number of displayed particles"),
_("the maximum number of displayed particles"),
_("the maximum number of displayed particles"),
_("Common"),
"CppPlatform/Extensions/particleSystemicon24.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardParameters("number")
.UseStandardParameters("number", gd::ParameterOptions::MakeNewOptions())
.SetFunctionName("setMaxParticlesCount")
.SetGetter("getMaxParticlesCount");
obj.AddExpressionAndConditionAndAction(
"boolean",
"AdditiveRendering",
_("Activate particles additive rendering"),
_("the particles additive rendering is activated"),
_("displaying particles with additive rendering activated"),
_("Common"),
"CppPlatform/Extensions/particleSystemicon24.png")
"boolean",
"AdditiveRendering",
_("Activate particles additive rendering"),
_("the particles additive rendering is activated"),
_("displaying particles with additive rendering activated"),
_("Common"),
"CppPlatform/Extensions/particleSystemicon24.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardParameters("boolean")
.UseStandardParameters("boolean", gd::ParameterOptions::MakeNewOptions())
.MarkAsAdvanced()
.SetFunctionName("setAdditiveRendering")
.SetGetter("getAdditiveRendering");
}

View File

@@ -34,19 +34,20 @@ void ExtensionSubDeclaration3(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions());
obj.AddCondition(
"RendererParam1",
_("Rendering first parameter"),
_("Test the first parameter of rendering (Size/Length)."),
_("the 1st rendering parameter"),
_("Setup"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
obj.AddCondition("RendererParam1",
_("Rendering first parameter"),
_("Test the first parameter of rendering (Size/Length)."),
_("the 1st rendering parameter"),
_("Setup"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions());
obj.AddAction("RendererParam2",
_("Rendering second parameter"),
@@ -58,18 +59,19 @@ void ExtensionSubDeclaration3(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions());
obj.AddCondition(
"RendererParam2",
_("Rendering second parameter"),
_("Test the second parameter of rendering (Size/Length)."),
_("the 2nd rendering parameter"),
_("Setup"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
obj.AddCondition("RendererParam2",
_("Rendering second parameter"),
_("Test the second parameter of rendering (Size/Length)."),
_("the 2nd rendering parameter"),
_("Setup"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions());
obj.AddAction("Tank",
_("Capacity"),
@@ -79,8 +81,9 @@ void ExtensionSubDeclaration3(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.SetHidden() // DEPRECATED - Use SetTank instead
.UseStandardOperatorParameters("number");
.SetHidden() // DEPRECATED - Use SetTank instead
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions());
obj.AddAction("SetTank",
_("Capacity"),
@@ -90,7 +93,9 @@ void ExtensionSubDeclaration3(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(_("Capacity")));
obj.AddCondition("Tank",
_("Capacity"),
@@ -100,7 +105,10 @@ void ExtensionSubDeclaration3(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Capacity to compare to")));
obj.AddAction("Flow",
_("Flow"),
@@ -110,8 +118,9 @@ void ExtensionSubDeclaration3(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.SetHidden() // DEPRECATED - Use SetFlow instead
.UseStandardOperatorParameters("number");
.SetHidden() // DEPRECATED - Use SetFlow instead
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions());
obj.AddAction("SetFlow",
_("Flow"),
@@ -121,7 +130,10 @@ void ExtensionSubDeclaration3(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Flow (in particles per second)")));
obj.AddCondition("Flow",
_("Flow"),
@@ -131,7 +143,10 @@ void ExtensionSubDeclaration3(gd::ObjectMetadata& obj) {
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Flow to compare to (in particles per second)")));
obj.AddAction("Texture",
_("Particle image (using an expression)"),
@@ -154,16 +169,16 @@ void ExtensionSubDeclaration3(gd::ObjectMetadata& obj) {
.AddParameter("object", _("Object"), "ParticleEmitter")
.AddParameter("imageResource", _("Image file (or image resource name)"));
obj.AddCondition(
"Texture",
_("Image"),
_("Test the name of the image displayed by particles."),
_("the image displayed by particles"),
_("Common"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
obj.AddCondition("Texture",
_("Image"),
_("Test the name of the image displayed by particles."),
_("the image displayed by particles"),
_("Common"),
"CppPlatform/Extensions/particleSystemicon24.png",
"CppPlatform/Extensions/particleSystemicon16.png")
.AddParameter("object", _("Object"), "ParticleEmitter")
.UseStandardRelationalOperatorParameters("string");
.UseStandardRelationalOperatorParameters(
"string", gd::ParameterOptions::MakeNewOptions());
obj.AddStrExpression("Texture",
_("Particles image"),
@@ -177,7 +192,7 @@ void ExtensionSubDeclaration3(gd::ObjectMetadata& obj) {
_("Particles number"),
_("Particles"),
"CppPlatform/Extensions/particleSystemicon16.png")
.SetHidden() // DEPRECATED - Use CurrentParticleCount instead
.SetHidden() // DEPRECATED - Use CurrentParticleCount instead
.AddParameter("object", _("Object"), "ParticleEmitter", false);
obj.AddExpression("CurrentParticleCount",

View File

@@ -5,16 +5,15 @@ Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com)
This project is released under the MIT License.
*/
#include "GDCore/Tools/Localization.h"
#include "ParticleEmitterObject.h"
#include "GDCore/CommonTools.h"
#include "GDCore/IDE/Project/ArbitraryResourceWorker.h"
#include "GDCore/Project/InitialInstance.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Project/Project.h"
#include "GDCore/Serialization/SerializerElement.h"
#include "ParticleEmitterObject.h"
#include "GDCore/IDE/Project/ArbitraryResourceWorker.h"
#include "GDCore/CommonTools.h"
#include "GDCore/Tools/Localization.h"
using namespace std;
@@ -178,53 +177,49 @@ void ParticleEmitterObject::ExposeResources(
SetParticleTexture(texture);
}
void ParticleEmitterBase::SetTank(float newValue) {
tank = newValue;
}
void ParticleEmitterBase::SetFlow(float newValue) {
flow = newValue;
}
void ParticleEmitterBase::SetEmitterForceMin(float newValue) {
void ParticleEmitterBase::SetTank(double newValue) { tank = newValue; }
void ParticleEmitterBase::SetFlow(double newValue) { flow = newValue; }
void ParticleEmitterBase::SetEmitterForceMin(double newValue) {
emitterForceMin = newValue;
}
void ParticleEmitterBase::SetEmitterForceMax(float newValue) {
void ParticleEmitterBase::SetEmitterForceMax(double newValue) {
emitterForceMax = newValue;
}
void ParticleEmitterBase::SetParticleGravityX(float newValue) {
void ParticleEmitterBase::SetParticleGravityX(double newValue) {
particleGravityX = newValue;
}
void ParticleEmitterBase::SetParticleGravityY(float newValue) {
void ParticleEmitterBase::SetParticleGravityY(double newValue) {
particleGravityY = newValue;
}
void ParticleEmitterBase::SetEmitterAngleA(float newValue) {
void ParticleEmitterBase::SetEmitterAngleA(double newValue) {
emitterAngleA = newValue;
}
void ParticleEmitterBase::SetEmitterAngleB(float newValue) {
void ParticleEmitterBase::SetEmitterAngleB(double newValue) {
emitterAngleB = newValue;
}
void ParticleEmitterBase::SetZoneRadius(float newValue) {
void ParticleEmitterBase::SetZoneRadius(double newValue) {
zoneRadius = newValue;
}
void ParticleEmitterBase::SetParticleGravityAngle(float newAngleInDegree) {
float length = sqrt(GetParticleGravityY() * GetParticleGravityY() +
GetParticleGravityX() * GetParticleGravityX());
void ParticleEmitterBase::SetParticleGravityAngle(double newAngleInDegree) {
double length = sqrt(GetParticleGravityY() * GetParticleGravityY() +
GetParticleGravityX() * GetParticleGravityX());
SetParticleGravityX(cos(newAngleInDegree / 180.0f * 3.14159f) * length);
SetParticleGravityY(sin(newAngleInDegree / 180.0f * 3.14159f) * length);
}
void ParticleEmitterBase::SetParticleGravityLength(float length) {
float angle = atan2(GetParticleGravityY(), GetParticleGravityX());
void ParticleEmitterBase::SetParticleGravityLength(double length) {
double angle = atan2(GetParticleGravityY(), GetParticleGravityX());
SetParticleGravityX(cos(angle) * length);
SetParticleGravityY(sin(angle) * length);
}
float ParticleEmitterBase::GetParticleGravityAngle() const {
double ParticleEmitterBase::GetParticleGravityAngle() const {
return atan2(GetParticleGravityY(), GetParticleGravityX()) * 180.0f /
3.14159f;
}
float ParticleEmitterBase::GetParticleGravityLength() const {
double ParticleEmitterBase::GetParticleGravityLength() const {
return sqrt(GetParticleGravityY() * GetParticleGravityY() +
GetParticleGravityX() * GetParticleGravityX());
}

View File

@@ -12,7 +12,7 @@ This project is released under the MIT License.
namespace gd {
class InitialInstance;
class Project;
}
} // namespace gd
/**
* \brief Base class containing the parameters of an emitter as well as the
@@ -22,95 +22,69 @@ class GD_EXTENSION_API ParticleEmitterBase {
public:
ParticleEmitterBase();
virtual ~ParticleEmitterBase();
ParticleEmitterBase(const ParticleEmitterBase& other) {
Init(other);
};
ParticleEmitterBase(const ParticleEmitterBase& other) { Init(other); };
ParticleEmitterBase& operator=(const ParticleEmitterBase& other) {
if (&other != this) Init(other);
return *this;
}
void SetParticleTexture(const gd::String & imageName) {
void SetParticleTexture(const gd::String& imageName) {
textureParticleName = imageName;
};
const gd::String & GetParticleTexture() const { return textureParticleName; };
const gd::String& GetParticleTexture() const { return textureParticleName; };
void SetRendererParam1(float newValue) { rendererParam1 = newValue; };
void SetRendererParam2(float newValue) { rendererParam2 = newValue; };
void SetTank(float newValue);
void SetFlow(float newValue);
void SetEmitterForceMin(float newValue);
void SetEmitterForceMax(float newValue);
void SetEmitterAngleA(float newValue);
void SetEmitterAngleB(float newValue);
void SetConeSprayAngle(float newValue) { SetEmitterAngleB(newValue); };
void SetZoneRadius(float newValue);
void SetParticleGravityX(float newValue);
void SetParticleGravityY(float newValue);
void SetParticleGravityAngle(float newAngleInDegree);
void SetParticleGravityLength(float newLength);
void SetRendererParam1(double newValue) { rendererParam1 = newValue; };
void SetRendererParam2(double newValue) { rendererParam2 = newValue; };
void SetTank(double newValue);
void SetFlow(double newValue);
void SetEmitterForceMin(double newValue);
void SetEmitterForceMax(double newValue);
void SetEmitterAngleA(double newValue);
void SetEmitterAngleB(double newValue);
void SetConeSprayAngle(double newValue) { SetEmitterAngleB(newValue); };
void SetZoneRadius(double newValue);
void SetParticleGravityX(double newValue);
void SetParticleGravityY(double newValue);
void SetParticleGravityAngle(double newAngleInDegree);
void SetParticleGravityLength(double newLength);
void SetParticleColor1(const gd::String& color);
void SetParticleColor2(const gd::String& color);
void SetParticleRed1(float newValue) {
particleRed1 = newValue;
};
void SetParticleRed2(float newValue) {
particleRed2 = newValue;
};
void SetParticleGreen1(float newValue) {
particleGreen1 = newValue;
};
void SetParticleGreen2(float newValue) {
particleGreen2 = newValue;
};
void SetParticleBlue1(float newValue) {
particleBlue1 = newValue;
};
void SetParticleBlue2(float newValue) {
particleBlue2 = newValue;
};
void SetParticleAlpha1(float newValue) {
particleAlpha1 = newValue;
};
void SetParticleAlpha2(float newValue) {
particleAlpha2 = newValue;
};
void SetParticleSize1(float newValue) {
particleSize1 = newValue;
};
void SetParticleSize2(float newValue) {
particleSize2 = newValue;
};
void SetParticleAngle1(float newValue) {
particleAngle1 = newValue;
};
void SetParticleAngle2(float newValue) {
particleAngle2 = newValue;
};
void SetParticleAlphaRandomness1(float newValue) {
void SetParticleRed1(double newValue) { particleRed1 = newValue; };
void SetParticleRed2(double newValue) { particleRed2 = newValue; };
void SetParticleGreen1(double newValue) { particleGreen1 = newValue; };
void SetParticleGreen2(double newValue) { particleGreen2 = newValue; };
void SetParticleBlue1(double newValue) { particleBlue1 = newValue; };
void SetParticleBlue2(double newValue) { particleBlue2 = newValue; };
void SetParticleAlpha1(double newValue) { particleAlpha1 = newValue; };
void SetParticleAlpha2(double newValue) { particleAlpha2 = newValue; };
void SetParticleSize1(double newValue) { particleSize1 = newValue; };
void SetParticleSize2(double newValue) { particleSize2 = newValue; };
void SetParticleAngle1(double newValue) { particleAngle1 = newValue; };
void SetParticleAngle2(double newValue) { particleAngle2 = newValue; };
void SetParticleAlphaRandomness1(double newValue) {
particleAlphaRandomness1 = newValue;
};
void SetParticleAlphaRandomness2(float newValue) {
void SetParticleAlphaRandomness2(double newValue) {
particleAlphaRandomness2 = newValue;
};
void SetParticleSizeRandomness1(float newValue) {
void SetParticleSizeRandomness1(double newValue) {
particleSizeRandomness1 = newValue;
};
void SetParticleSizeRandomness2(float newValue) {
void SetParticleSizeRandomness2(double newValue) {
particleSizeRandomness2 = newValue;
};
void SetParticleAngleRandomness1(float newValue) {
void SetParticleAngleRandomness1(double newValue) {
particleAngleRandomness1 = newValue;
};
void SetParticleAngleRandomness2(float newValue) {
void SetParticleAngleRandomness2(double newValue) {
particleAngleRandomness2 = newValue;
};
void SetParticleLifeTimeMin(float newValue) {
void SetParticleLifeTimeMin(double newValue) {
particleLifeTimeMin = newValue;
};
void SetParticleLifeTimeMax(float newValue) {
void SetParticleLifeTimeMax(double newValue) {
particleLifeTimeMax = newValue;
};
void SetMaxParticleNb(std::size_t newValue) { maxParticleNb = newValue; };
@@ -118,50 +92,49 @@ class GD_EXTENSION_API ParticleEmitterBase {
destroyWhenNoParticles = enable;
};
float GetRendererParam1() const { return rendererParam1; };
float GetRendererParam2() const { return rendererParam2; };
float GetTank() const { return tank; };
float GetFlow() const { return flow; };
float GetEmitterForceMin() const { return emitterForceMin; };
float GetEmitterForceMax() const { return emitterForceMax; };
float GetEmitterAngleA() const { return emitterAngleA; };
float GetEmitterAngleB() const { return emitterAngleB; };
float GetConeSprayAngle() const { return GetEmitterAngleB(); };
float GetZoneRadius() const { return zoneRadius; };
float GetParticleGravityX() const { return particleGravityX; };
float GetParticleGravityY() const { return particleGravityY; };
float GetParticleGravityAngle() const;
float GetParticleGravityLength() const;
float GetParticleLifeTimeMin() const { return particleLifeTimeMin; };
float GetParticleLifeTimeMax() const { return particleLifeTimeMax; };
double GetRendererParam1() const { return rendererParam1; };
double GetRendererParam2() const { return rendererParam2; };
double GetTank() const { return tank; };
double GetFlow() const { return flow; };
double GetEmitterForceMin() const { return emitterForceMin; };
double GetEmitterForceMax() const { return emitterForceMax; };
double GetEmitterAngleA() const { return emitterAngleA; };
double GetEmitterAngleB() const { return emitterAngleB; };
double GetConeSprayAngle() const { return GetEmitterAngleB(); };
double GetZoneRadius() const { return zoneRadius; };
double GetParticleGravityX() const { return particleGravityX; };
double GetParticleGravityY() const { return particleGravityY; };
double GetParticleGravityAngle() const;
double GetParticleGravityLength() const;
double GetParticleLifeTimeMin() const { return particleLifeTimeMin; };
double GetParticleLifeTimeMax() const { return particleLifeTimeMax; };
std::size_t GetMaxParticleNb() const { return maxParticleNb; };
bool GetDestroyWhenNoParticles() const { return destroyWhenNoParticles; };
float GetParticleRed1() const { return particleRed1; };
float GetParticleRed2() const { return particleRed2; };
float GetParticleGreen1() const { return particleGreen1; };
float GetParticleGreen2() const { return particleGreen2; };
float GetParticleBlue1() const { return particleBlue1; };
float GetParticleBlue2() const { return particleBlue2; };
float GetParticleAlpha1() const { return particleAlpha1; };
float GetParticleAlpha2() const { return particleAlpha2; };
float GetParticleSize1() const { return particleSize1; };
float GetParticleSize2() const { return particleSize2; };
float GetParticleAngle1() const { return particleAngle1; };
float GetParticleAngle2() const { return particleAngle2; };
float GetParticleAlphaRandomness1() const {
double GetParticleRed1() const { return particleRed1; };
double GetParticleRed2() const { return particleRed2; };
double GetParticleGreen1() const { return particleGreen1; };
double GetParticleGreen2() const { return particleGreen2; };
double GetParticleBlue1() const { return particleBlue1; };
double GetParticleBlue2() const { return particleBlue2; };
double GetParticleAlpha1() const { return particleAlpha1; };
double GetParticleAlpha2() const { return particleAlpha2; };
double GetParticleSize1() const { return particleSize1; };
double GetParticleSize2() const { return particleSize2; };
double GetParticleAngle1() const { return particleAngle1; };
double GetParticleAngle2() const { return particleAngle2; };
double GetParticleAlphaRandomness1() const {
return particleAlphaRandomness1;
};
float GetParticleAlphaRandomness2() const {
double GetParticleAlphaRandomness2() const {
return particleAlphaRandomness2;
};
float GetParticleSizeRandomness1() const { return particleSizeRandomness1; };
float GetParticleSizeRandomness2() const { return particleSizeRandomness2; };
float GetParticleAngleRandomness1() const {
double GetParticleSizeRandomness1() const { return particleSizeRandomness1; };
double GetParticleSizeRandomness2() const { return particleSizeRandomness2; };
double GetParticleAngleRandomness1() const {
return particleAngleRandomness1;
};
float GetParticleAngleRandomness2() const {
double GetParticleAngleRandomness2() const {
return particleAngleRandomness2;
};
@@ -184,23 +157,23 @@ class GD_EXTENSION_API ParticleEmitterBase {
gd::String textureParticleName;
RendererType rendererType;
float rendererParam1;
float rendererParam2;
double rendererParam1;
double rendererParam2;
bool additive;
float tank;
float flow;
float emitterForceMin;
float emitterForceMax;
float emitterAngleA;
float emitterAngleB;
float zoneRadius;
float particleGravityX, particleGravityY;
float particleLifeTimeMin, particleLifeTimeMax;
float particleRed1, particleRed2, particleGreen1, particleGreen2,
double tank;
double flow;
double emitterForceMin;
double emitterForceMax;
double emitterAngleA;
double emitterAngleB;
double zoneRadius;
double particleGravityX, particleGravityY;
double particleLifeTimeMin, particleLifeTimeMax;
double particleRed1, particleRed2, particleGreen1, particleGreen2,
particleBlue1, particleBlue2, particleAlpha1, particleAlpha2;
float particleSize1, particleSize2, particleAngle1, particleAngle2;
float particleAlphaRandomness1, particleAlphaRandomness2;
float particleSizeRandomness1, particleSizeRandomness2,
double particleSize1, particleSize2, particleAngle1, particleAngle2;
double particleAlphaRandomness1, particleAlphaRandomness2;
double particleSizeRandomness1, particleSizeRandomness2,
particleAngleRandomness1, particleAngleRandomness2;
std::size_t maxParticleNb;
bool destroyWhenNoParticles; ///< If set to true, the object will removed

View File

@@ -5,10 +5,10 @@ Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com)
This project is released under the MIT License.
*/
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/Extensions/Metadata/MultipleInstructionMetadata.h"
#include "GDCore/Tools/Localization.h"
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/Project/BehaviorsSharedData.h"
#include "GDCore/Tools/Localization.h"
#include "PathfindingBehavior.h"
#include "PathfindingObstacleBehavior.h"
@@ -89,7 +89,8 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions())
.SetFunctionName("SetCellWidth")
.SetGetter("GetCellWidth");
@@ -103,7 +104,8 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.SetFunctionName("GetCellWidth");
aut.AddAction("CellHeight",
@@ -116,7 +118,8 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions())
.SetFunctionName("SetCellHeight")
.SetGetter("GetCellHeight");
@@ -130,7 +133,8 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.SetFunctionName("GetCellHeight");
aut.AddAction("Acceleration",
@@ -143,7 +147,8 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions())
.SetFunctionName("SetAcceleration")
.SetGetter("GetAcceleration");
@@ -157,7 +162,8 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.SetFunctionName("GetAcceleration");
aut.AddAction("MaxSpeed",
@@ -170,7 +176,10 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Max speed (in pixels per second)")))
.SetFunctionName("SetMaxSpeed")
.SetGetter("GetMaxSpeed");
@@ -184,7 +193,10 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Max speed to compare to (in pixels per second)")))
.SetFunctionName("GetMaxSpeed");
aut.AddAction("Speed",
@@ -197,7 +209,10 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Speed (in pixels per second)")))
.SetFunctionName("SetSpeed")
.SetGetter("GetSpeed");
@@ -211,17 +226,21 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Speed to compare to (in pixels per second)")))
.SetFunctionName("GetSpeed");
aut.AddScopedCondition("MovementAngleIsAround",
_("Angle of movement on its path"),
_("Compare the angle of movement of an object on its path."),
_("Angle of movement of _PARAM0_ is _PARAM2_ (tolerance"
": _PARAM3_ degrees)"),
_("Movement on the path"),
"CppPlatform/Extensions/AStaricon24.png",
"CppPlatform/Extensions/AStaricon16.png")
aut.AddScopedCondition(
"MovementAngleIsAround",
_("Angle of movement on its path"),
_("Compare the angle of movement of an object on its path."),
_("Angle of movement of _PARAM0_ is _PARAM2_ (tolerance"
": _PARAM3_ degrees)"),
_("Movement on the path"),
"CppPlatform/Extensions/AStaricon24.png",
"CppPlatform/Extensions/AStaricon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
@@ -238,7 +257,10 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Max angular speed (in degrees per second)")))
.SetFunctionName("SetAngularMaxSpeed")
.SetGetter("GetAngularMaxSpeed");
@@ -253,7 +275,10 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Max angular speed to compare to (in degrees per second)")))
.SetFunctionName("GetAngularMaxSpeed");
aut.AddAction(
@@ -267,7 +292,10 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Angle (in degrees)")))
.SetFunctionName("SetAngleOffset")
.SetGetter("GetAngleOffset");
@@ -281,7 +309,10 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Angle to compare to (in degrees)")))
.SetFunctionName("GetAngleOffset");
aut.AddAction(
@@ -296,7 +327,8 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions())
.SetFunctionName("SetExtraBorder")
.SetGetter("GetExtraBorder");
@@ -311,7 +343,8 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.SetFunctionName("GetExtraBorder");
aut.AddAction(
@@ -548,7 +581,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/AStaricon24.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardParameters("number");
.UseStandardParameters("number", gd::ParameterOptions::MakeNewOptions());
aut.AddExpressionAndConditionAndAction("number",
"GridOffsetY",
@@ -559,7 +592,7 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/AStaricon24.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingBehavior")
.UseStandardParameters("number");
.UseStandardParameters("number", gd::ParameterOptions::MakeNewOptions());
}
{
@@ -584,7 +617,8 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingObstacleBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions())
.SetFunctionName("SetCost")
.SetGetter("GetCost");
@@ -598,7 +632,8 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PathfindingObstacleBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.SetFunctionName("GetCost");
aut.AddAction("SetImpassable",

View File

@@ -8,6 +8,7 @@ This project is released under the MIT License.
#ifndef PATHFINDINGOBSTACLEBEHAVIOR_H
#define PATHFINDINGOBSTACLEBEHAVIOR_H
#include <map>
#include "GDCore/Project/Behavior.h"
namespace gd {
class SerializerElement;
@@ -28,13 +29,11 @@ class GD_EXTENSION_API PathfindingObstacleBehavior : public gd::Behavior {
return new PathfindingObstacleBehavior(*this);
}
#if defined(GD_IDE_ONLY)
virtual std::map<gd::String, gd::PropertyDescriptor> GetProperties(
const gd::SerializerElement& behaviorContent) const override;
virtual bool UpdateProperty(gd::SerializerElement& behaviorContent,
const gd::String& name,
const gd::String& value) override;
#endif
virtual void InitializeContent(
gd::SerializerElement& behaviorContent) override;

View File

@@ -441,7 +441,12 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Gravity to compare to (in pixels per second per second)')
)
)
.getCodeExtraInformation()
.setFunctionName('getGravityX');
@@ -470,7 +475,12 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Gravity to compare to (in pixels per second per second)')
)
)
.getCodeExtraInformation()
.setFunctionName('getGravityY');
@@ -520,7 +530,12 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Time scale to compare to (1 by default)')
)
)
.getCodeExtraInformation()
.setFunctionName('getTimeScale');
@@ -541,7 +556,7 @@ module.exports = {
)
.addParameter('objectList', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Value'))
.addParameter('expression', _('Time scale (1 by default)'))
.getCodeExtraInformation()
.setIncludeFile('Extensions/Physics2Behavior/physics2tools.js')
.setFunctionName('gdjs.physics2.setTimeScale');
@@ -788,7 +803,12 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Scale (1 by default)')
)
)
.getCodeExtraInformation()
.setFunctionName('setShapeScale')
.setGetter('getShapeScale');
@@ -805,7 +825,10 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('getDensity');
@@ -823,7 +846,10 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setDensity')
.setGetter('getDensity');
@@ -853,7 +879,10 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('getFriction');
@@ -871,7 +900,10 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setFriction')
.setGetter('getFriction');
@@ -901,7 +933,10 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('getRestitution');
@@ -919,7 +954,10 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setRestitution')
.setGetter('getRestitution');
@@ -949,7 +987,10 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('getLinearDamping');
@@ -967,7 +1008,10 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setLinearDamping')
.setGetter('getLinearDamping');
@@ -997,7 +1041,10 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('getAngularDamping');
@@ -1015,7 +1062,10 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setAngularDamping')
.setGetter('getAngularDamping');
@@ -1045,7 +1095,12 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Scale to compare to (1 by default)')
)
)
.getCodeExtraInformation()
.setFunctionName('getGravityScale');
@@ -1063,7 +1118,12 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Scale (1 by default)')
)
)
.getCodeExtraInformation()
.setFunctionName('setGravityScale')
.setGetter('getGravityScale');
@@ -1167,7 +1227,12 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Speed to compare to (in pixels per second)')
)
)
.getCodeExtraInformation()
.setFunctionName('getLinearVelocityX');
@@ -1183,7 +1248,12 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Speed (in pixels per second)')
)
)
.getCodeExtraInformation()
.setFunctionName('setLinearVelocityX')
.setGetter('getLinearVelocityX');
@@ -1213,7 +1283,12 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Speed to compare to (in pixels per second)')
)
)
.getCodeExtraInformation()
.setFunctionName('getLinearVelocityY');
@@ -1229,7 +1304,12 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Speed (in pixels per second)')
)
)
.getCodeExtraInformation()
.setFunctionName('setLinearVelocityY')
.setGetter('getLinearVelocityY');
@@ -1259,7 +1339,12 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Speed to compare to (in pixels per second)')
)
)
.getCodeExtraInformation()
.setFunctionName('getLinearVelocityLength');
@@ -1288,7 +1373,12 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Angular speed to compare to (in degrees per second)')
)
)
.getCodeExtraInformation()
.setFunctionName('getAngularVelocity');
@@ -1304,7 +1394,12 @@ module.exports = {
)
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Angular speed (in degrees per second)')
)
)
.getCodeExtraInformation()
.setFunctionName('setAngularVelocity')
.setGetter('getAngularVelocity');
@@ -1493,7 +1588,7 @@ module.exports = {
.getCodeExtraInformation()
.setFunctionName('applyAngularImpulse');
aut
aut
.addExpression(
'Mass',
_('Mass'),
@@ -1647,7 +1742,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('getJointReactionForce');
@@ -1678,7 +1776,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('getJointReactionTorque');
@@ -1782,7 +1883,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setDistanceJointLength')
.setGetter('getDistanceJointLength');
@@ -1814,7 +1918,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setDistanceJointFrequency')
.setGetter('getDistanceJointFrequency');
@@ -1846,7 +1953,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setDistanceJointDampingRatio')
.setGetter('getDistanceJointDampingRatio');
@@ -2141,7 +2251,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setRevoluteJointMotorSpeed')
.setGetter('getRevoluteJointMotorSpeed');
@@ -2173,7 +2286,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setRevoluteJointMaxMotorTorque')
.setGetter('getRevoluteJointMaxMotorTorque');
@@ -2453,7 +2569,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setPrismaticJointMotorSpeed')
.setGetter('getPrismaticJointMotorSpeed');
@@ -2485,7 +2604,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setPrismaticJointMaxMotorForce')
.setGetter('getPrismaticJointMaxMotorForce');
@@ -2755,7 +2877,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setGearJointRatio')
.setGetter('getGearJointRatio');
@@ -2882,7 +3007,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setMouseJointMaxForce')
.setGetter('getMouseJointMaxForce');
@@ -2914,7 +3042,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setMouseJointFrequency')
.setGetter('getMouseJointFrequency');
@@ -2946,7 +3077,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setMouseJointDampingRatio')
.setGetter('getMouseJointDampingRatio');
@@ -3115,7 +3249,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setWheelJointMotorSpeed')
.setGetter('getWheelJointMotorSpeed');
@@ -3147,7 +3284,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setWheelJointMaxMotorTorque')
.setGetter('getWheelJointMaxMotorTorque');
@@ -3193,7 +3333,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setWheelJointFrequency')
.setGetter('getWheelJointFrequency');
@@ -3225,7 +3368,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setWheelJointDampingRatio')
.setGetter('getWheelJointDampingRatio');
@@ -3321,7 +3467,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setWeldJointFrequency')
.setGetter('getWeldJointFrequency');
@@ -3353,7 +3502,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setWeldJointDampingRatio')
.setGetter('getWeldJointDampingRatio');
@@ -3428,7 +3580,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setRopeJointMaxLength')
.setGetter('getRopeJointMaxLength');
@@ -3496,7 +3651,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setFrictionJointMaxForce')
.setGetter('getFrictionJointMaxForce');
@@ -3528,7 +3686,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setFrictionJointMaxTorque')
.setGetter('getFrictionJointMaxTorque');
@@ -3645,7 +3806,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setMotorJointAngularOffset')
.setGetter('getMotorJointAngularOffset');
@@ -3677,7 +3841,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setMotorJointMaxForce')
.setGetter('getMotorJointMaxForce');
@@ -3709,7 +3876,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setMotorJointMaxTorque')
.setGetter('getMotorJointMaxTorque');
@@ -3741,7 +3911,10 @@ module.exports = {
.addParameter('object', _('Object'), '', false)
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
.addParameter('expression', _('Joint ID'))
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setMotorJointCorrectionFactor')
.setGetter('getMotorJointCorrectionFactor');
@@ -3767,7 +3940,7 @@ module.exports = {
_('Collision'),
_('Check if two objects collide.'),
_('_PARAM0_ is colliding with _PARAM2_'),
'',
'',
'res/physics32.png',
'res/physics32.png'
)

View File

@@ -337,7 +337,8 @@ void DeclarePhysicsBehaviorExtension(gd::PlatformExtension& extension) {
"res/physics16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PhysicsBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.AddCodeOnlyParameter("currentScene", "")
.SetFunctionName("GetLinearVelocityX");
@@ -351,7 +352,8 @@ void DeclarePhysicsBehaviorExtension(gd::PlatformExtension& extension) {
"res/physics16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PhysicsBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.AddCodeOnlyParameter("currentScene", "")
.SetFunctionName("GetLinearVelocityY");
@@ -364,7 +366,8 @@ void DeclarePhysicsBehaviorExtension(gd::PlatformExtension& extension) {
"res/physics16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PhysicsBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.AddCodeOnlyParameter("currentScene", "")
.SetFunctionName("GetLinearVelocity");
@@ -390,7 +393,8 @@ void DeclarePhysicsBehaviorExtension(gd::PlatformExtension& extension) {
"res/physics16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PhysicsBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.AddCodeOnlyParameter("currentScene", "")
.SetFunctionName("GetAngularVelocity");
@@ -403,7 +407,8 @@ void DeclarePhysicsBehaviorExtension(gd::PlatformExtension& extension) {
"res/physics16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PhysicsBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.AddCodeOnlyParameter("currentScene", "")
.SetFunctionName("GetLinearDamping");
@@ -445,7 +450,8 @@ void DeclarePhysicsBehaviorExtension(gd::PlatformExtension& extension) {
"res/physics16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PhysicsBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.AddCodeOnlyParameter("currentScene", "")
.SetFunctionName("GetAngularDamping");
@@ -516,7 +522,8 @@ void DeclarePhysicsBehaviorExtension(gd::PlatformExtension& extension) {
"res/physics16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PhysicsBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.AddCodeOnlyParameter("currentScene", "")
.SetFunctionName("GetPolygonScaleX");
@@ -530,7 +537,8 @@ void DeclarePhysicsBehaviorExtension(gd::PlatformExtension& extension) {
"res/physics16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PhysicsBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.AddCodeOnlyParameter("currentScene", "")
.SetFunctionName("GetPolygonScaleY");

View File

@@ -5,11 +5,10 @@ Copyright (c) 2014-2016 Florian Rival (Florian.Rival@gmail.com)
This project is released under the MIT License.
*/
#include "PlatformBehavior.h"
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/Tools/Localization.h"
#include "GDCore/Project/BehaviorsSharedData.h"
#include "GDCore/Tools/Localization.h"
#include "PlatformBehavior.h"
#include "PlatformerObjectBehavior.h"
void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
@@ -134,61 +133,71 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
aut.AddCondition("Gravity",
_("Gravity"),
_("Compare the gravity applied on the object (in pixels "
"per second per second)."),
_("Compare the gravity applied on the object."),
_("the gravity"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Gravity to compare to (in pixels per "
"second per second)")))
.MarkAsAdvanced()
.SetFunctionName("GetGravity");
aut.AddAction("Gravity",
_("Gravity"),
_("Change the gravity applied on an object (in pixels per "
"second per second)."),
_("Change the gravity applied on an object."),
_("the gravity"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Gravity (in pixels per "
"second per second)")))
.MarkAsAdvanced()
.SetFunctionName("SetGravity")
.SetGetter("GetGravity");
aut.AddCondition(
"MaxFallingSpeed",
_("Maximum falling speed"),
_("Compare the maximum falling speed of the object (in pixels per "
"second)."),
_("the maximum falling speed"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
aut.AddCondition("MaxFallingSpeed",
_("Maximum falling speed"),
_("Compare the maximum falling speed of the object."),
_("the maximum falling speed"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Max speed to compare to (in pixels per second)")))
.MarkAsAdvanced()
.SetFunctionName("GetMaxFallingSpeed");
aut.AddAction(
"MaxFallingSpeed",
_("Maximum falling speed"),
_("Change the maximum falling speed of an object (in pixels per "
"second)."),
_("the maximum falling speed"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
aut.AddAction("MaxFallingSpeed",
_("Maximum falling speed"),
_("Change the maximum falling speed of an object."),
_("the maximum falling speed"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardOperatorParameters("number")
.AddParameter("yesorno", _("If jumping, try to preserve the current speed in the air"))
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Max speed (in pixels per second)")))
.AddParameter(
"yesorno",
_("If jumping, try to preserve the current speed in the air"))
.MarkAsAdvanced()
.SetFunctionName("SetMaxFallingSpeed")
.SetGetter("GetMaxFallingSpeed");
@@ -203,145 +212,170 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Speed to compare to (in pixels per second)")))
.MarkAsAdvanced()
.SetFunctionName("GetLadderClimbingSpeed");
aut.AddAction("LadderClimbingSpeed",
_("Ladder climbing speed"),
_("Change the ladder climbing speed (in pixels per "
"second)."),
_("Change the ladder climbing speed."),
_("the ladder climbing speed"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Speed (in pixels per second)")))
.MarkAsAdvanced()
.SetFunctionName("SetLadderClimbingSpeed")
.SetGetter("GetLadderClimbingSpeed");
aut.AddCondition("Acceleration",
_("Acceleration"),
_("Compare the horizontal acceleration of the object (in pixels per "
"second per second)."),
_("Compare the horizontal acceleration of the object."),
_("the horizontal acceleration"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Acceleration to compare to (in pixels per "
"second per second)")))
.MarkAsAdvanced()
.SetFunctionName("GetAcceleration");
aut.AddAction("Acceleration",
_("Acceleration"),
_("Change the horizontal acceleration of an object (in pixels per "
"second per second)."),
_("Change the horizontal acceleration of an object."),
_("the horizontal acceleration"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Acceleration (in pixels per "
"second per second)")))
.MarkAsAdvanced()
.SetFunctionName("SetAcceleration")
.SetGetter("GetAcceleration");
aut.AddCondition("Deceleration",
_("Deceleration"),
_("Compare the horizontal deceleration of the object (in pixels per "
"second per second)."),
_("Compare the horizontal deceleration of the object."),
_("the horizontal deceleration"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Deceleration to compare to (in pixels per "
"second per second)")))
.MarkAsAdvanced()
.SetFunctionName("GetDeceleration");
aut.AddAction("Deceleration",
_("Deceleration"),
_("Change the horizontal deceleration of an object (in pixels per "
"second per second)."),
_("Change the horizontal deceleration of an object."),
_("the horizontal deceleration"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Deceleration (in pixels per "
"second per second)")))
.MarkAsAdvanced()
.SetFunctionName("SetDeceleration")
.SetGetter("GetDeceleration");
aut.AddCondition(
"MaxSpeed",
_("Maximum horizontal speed"),
_("Compare the maximum horizontal speed of the object (in pixels per second)."),
_("the maximum horizontal speed"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
aut.AddCondition("MaxSpeed",
_("Maximum horizontal speed"),
_("Compare the maximum horizontal speed of the object."),
_("the maximum horizontal speed"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Max speed to compare to (in pixels per second)")))
.SetFunctionName("GetMaxSpeed");
aut.AddAction(
"MaxSpeed",
_("Maximum horizontal speed"),
_("Change the maximum horizontal speed of an object (in pixels per second)."),
_("the maximum horizontal speed"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
aut.AddAction("MaxSpeed",
_("Maximum horizontal speed"),
_("Change the maximum horizontal speed of an object."),
_("the maximum horizontal speed"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Max speed (in pixels per second)")))
.MarkAsAdvanced()
.SetFunctionName("SetMaxSpeed")
.SetGetter("GetMaxSpeed");
aut.AddCondition(
"JumpSpeed",
_("Jump speed"),
_("Compare the jump speed of the object (in pixels per second)."
"Its value is always positive."),
_("the jump speed"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
aut.AddCondition("JumpSpeed",
_("Jump speed"),
_("Compare the jump speed of the object."
"Its value is always positive."),
_("the jump speed"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Speed to compare to (in pixels per second)")))
.MarkAsAdvanced()
.SetFunctionName("GetJumpSpeed");
aut.AddAction(
"JumpSpeed",
_("Jump speed"),
_("Change the jump speed of an object (in pixels per second). "
"Its value is always positive."),
_("the jump speed"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
aut.AddAction("JumpSpeed",
_("Jump speed"),
_("Change the jump speed of an object. "
"Its value is always positive."),
_("the jump speed"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Speed (in pixels per second)")))
.SetFunctionName("SetJumpSpeed")
.SetGetter("GetJumpSpeed");
aut.AddCondition(
"JumpSustainTime",
_("Jump sustain time"),
_("Compare the jump sustain time of the object (in seconds)."
_("Compare the jump sustain time of the object."
"This is the time during which keeping the jump button held "
"allow the initial jump speed to be maintained."),
_("the jump sustain time"),
@@ -350,21 +384,28 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Duration to compare to (in seconds)")))
.MarkAsAdvanced();
aut.AddAction("JumpSustainTime",
_("Jump sustain time"),
_("Change the jump sustain time of an object (in seconds). "
"This is the time during which keeping the jump button held "
"allow the initial jump speed to be maintained."),
_("the jump sustain time"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
aut.AddAction(
"JumpSustainTime",
_("Jump sustain time"),
_("Change the jump sustain time of an object."
"This is the time during which keeping the jump button held "
"allow the initial jump speed to be maintained."),
_("the jump sustain time"),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Duration (in seconds)")));
aut.AddAction(
"SetCanJump",
@@ -400,7 +441,8 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"AbortJump",
_("Abort jump"),
_("Abort the current jump and stop the object vertically. "
"This action doesn't have any effect when the character is not jumping."),
"This action doesn't have any effect when the character is not "
"jumping."),
_("Abort the current jump of _PARAM0_"),
_(""),
"CppPlatform/Extensions/platformerobjecticon.png",
@@ -589,11 +631,28 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
.MarkAsSimple()
.SetFunctionName("canGrabPlatforms");
aut.AddCondition("CurrentFallSpeed",
_("Current falling speed"),
_("Compare the current falling speed of the object. Its "
"value is always positive."),
_("the current falling speed"),
_(""),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Speed to compare to (in pixels per second)")))
.MarkAsAdvanced()
.SetFunctionName("GetCurrentFallSpeed");
aut.AddScopedAction(
"SetCurrentFallSpeed",
_("Current falling speed"),
_("Change the current falling speed of the object (in pixels per "
"second). This action doesn't have any effect when the character "
_("Change the current falling speed of the object. This action "
"doesn't have any effect when the character "
"is not falling or is in the first phase of a jump."),
_("the current falling speed"),
_(""),
@@ -601,72 +660,70 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Speed (in pixels per second)")))
.MarkAsAdvanced();
aut.AddCondition(
"CurrentFallSpeed",
_("Current falling speed"),
_("Compare the current falling speed of the object (in pixels per "
"second). Its value is always positive."),
_("the current falling speed"),
_(""),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
aut.AddCondition("CurrentJumpSpeed",
_("Current jump speed"),
_("Compare the current jump speed of the object. Its "
"value is always positive."),
_("the current jump speed"),
_(""),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
.MarkAsAdvanced()
.SetFunctionName("GetCurrentFallSpeed");
aut.AddCondition(
"CurrentJumpSpeed",
_("Current jump speed"),
_("Compare the current jump speed of the object (in pixels per "
"second). Its value is always positive."),
_("the current jump speed"),
_(""),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Speed to compare to (in pixels per second)")))
.MarkAsAdvanced()
.SetFunctionName("GetCurrentJumpSpeed");
aut.AddScopedAction("SetCurrentSpeed",
_("Current horizontal speed"),
_("Change the current horizontal speed of the object "
"(in pixels per second). The object moves to the left "
"with negative values and to the right with positive ones"),
_("the current horizontal speed"),
_(""),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
aut.AddScopedAction(
"SetCurrentSpeed",
_("Current horizontal speed"),
_("Change the current horizontal speed of the object. The object "
"moves to the left with negative values and to the right with "
"positive ones"),
_("the current horizontal speed"),
_(""),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Speed (in pixels per second)")))
.MarkAsAdvanced();
aut.AddCondition("CurrentSpeed",
_("Current horizontal speed"),
_("Compare the current horizontal speed of the object "
"(in pixels per second). The object moves to the left "
"with negative values and to the right with positive ones"),
_("the current horizontal speed"),
_(""),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
aut.AddCondition(
"CurrentSpeed",
_("Current horizontal speed"),
_("Compare the current horizontal speed of the object. The object "
"moves to the left "
"with negative values and to the right with positive ones"),
_("the current horizontal speed"),
_(""),
"CppPlatform/Extensions/platformerobjecticon.png",
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Speed to compare to (in pixels per second)")))
.MarkAsAdvanced()
.SetFunctionName("GetCurrentSpeed");
aut.AddExpression("Gravity",
_("Gravity"),
_("Return the gravity applied on the object "
"(in pixels per second per second)."),
"(in pixels per second per second)."),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
@@ -696,7 +753,7 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
aut.AddExpression("Acceleration",
_("Acceleration"),
_("Return the horizontal acceleration of the object "
"(in pixels per second per second)."),
"(in pixels per second per second)."),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
@@ -706,7 +763,7 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
aut.AddExpression("Deceleration",
_("Deceleration"),
_("Return the horizontal deceleration of the object "
"(in pixels per second per second)."),
"(in pixels per second per second)."),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
@@ -723,12 +780,13 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.SetFunctionName("GetMaxSpeed");
aut.AddExpression("JumpSpeed",
_("Jump speed"),
_("Return the jump speed of the object "
"(in pixels per second). Its value is always positive."),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png")
aut.AddExpression(
"JumpSpeed",
_("Jump speed"),
_("Return the jump speed of the object "
"(in pixels per second). Its value is always positive."),
_("Options"),
"CppPlatform/Extensions/platformerobjecticon.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
.SetFunctionName("GetJumpSpeed");

View File

@@ -480,7 +480,8 @@ void DeclarePrimitiveDrawingExtension(gd::PlatformExtension& extension) {
"res/actions/outlineSize_black.png")
.AddParameter("object", _("Shape Painter object"), "Drawer")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions())
.SetFunctionName("SetOutlineSize")
.SetGetter("GetOutlineSize");
@@ -493,7 +494,8 @@ void DeclarePrimitiveDrawingExtension(gd::PlatformExtension& extension) {
"res/conditions/outlineSize_black.png")
.AddParameter("object", _("Shape Painter object"), "Drawer")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.SetFunctionName("GetOutlineSize");
obj.AddExpression("OutlineSize",
@@ -514,7 +516,10 @@ void DeclarePrimitiveDrawingExtension(gd::PlatformExtension& extension) {
"res/actions/opacity.png")
.AddParameter("object", _("Shape Painter object"), "Drawer")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Opacity (0-255)")))
.SetFunctionName("SetFillOpacity")
.SetGetter("GetFillOpacity");
@@ -527,7 +532,10 @@ void DeclarePrimitiveDrawingExtension(gd::PlatformExtension& extension) {
"res/conditions/opacity.png")
.AddParameter("object", _("Shape Painter object"), "Drawer")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Opacity to compare to (0-255)")))
.SetFunctionName("GetFillOpacity");
obj.AddExpression("FillOpacity",
@@ -547,7 +555,10 @@ void DeclarePrimitiveDrawingExtension(gd::PlatformExtension& extension) {
"res/actions/opacity.png")
.AddParameter("object", _("Shape Painter object"), "Drawer")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Opacity (0-255)")))
.SetFunctionName("SetOutlineOpacity")
.SetGetter("GetOutlineOpacity");
@@ -560,7 +571,10 @@ void DeclarePrimitiveDrawingExtension(gd::PlatformExtension& extension) {
"res/conditions/opacity.png")
.AddParameter("object", _("Shape Painter object"), "Drawer")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Opacity to compare to (0-255)")))
.SetFunctionName("GetOutlineOpacity");
obj.AddExpression("OutlineOpacity",
@@ -605,7 +619,10 @@ void DeclarePrimitiveDrawingExtension(gd::PlatformExtension& extension) {
"res/actions/scale24_black.png",
"res/actions/scale_black.png")
.AddParameter("object", _("Object"), "Drawer")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Scale (1 by default)")))
.MarkAsAdvanced();
obj.AddExpressionAndConditionAndAction("number",
@@ -616,7 +633,10 @@ void DeclarePrimitiveDrawingExtension(gd::PlatformExtension& extension) {
_("Size"),
"res/actions/scaleWidth24_black.png")
.AddParameter("object", _("Object"), "Drawer")
.UseStandardParameters("number")
.UseStandardParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Scale (1 by default)")))
.MarkAsAdvanced();
obj.AddExpressionAndConditionAndAction("number",
@@ -627,7 +647,10 @@ void DeclarePrimitiveDrawingExtension(gd::PlatformExtension& extension) {
_("Size"),
"res/actions/scaleHeight24_black.png")
.AddParameter("object", _("Object"), "Drawer")
.UseStandardParameters("number")
.UseStandardParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Scale (1 by default)")))
.MarkAsAdvanced();
obj.AddAction("FlipX",
@@ -678,7 +701,8 @@ void DeclarePrimitiveDrawingExtension(gd::PlatformExtension& extension) {
"res/actions/scaleWidth24_black.png",
"res/actions/scaleWidth_black.png")
.AddParameter("object", _("Object"), "Drawer")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddAction("Height",
@@ -689,7 +713,8 @@ void DeclarePrimitiveDrawingExtension(gd::PlatformExtension& extension) {
"res/actions/scaleHeight24_black.png",
"res/actions/scaleHeight_black.png")
.AddParameter("object", _("Object"), "Drawer")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
obj.AddAction(

View File

@@ -108,7 +108,7 @@ void ShapePainterObjectBase::SetFillColor(unsigned int r,
fillColorB = b;
}
void ShapePainterObjectBase::SetFillOpacity(float val) {
void ShapePainterObjectBase::SetFillOpacity(double val) {
if (val > 255)
val = 255;
else if (val < 0)
@@ -128,7 +128,7 @@ void ShapePainterObjectBase::SetOutlineColor(unsigned int r,
outlineColorB = b;
}
void ShapePainterObjectBase::SetOutlineOpacity(float val) {
void ShapePainterObjectBase::SetOutlineOpacity(double val) {
if (val > 255)
val = 255;
else if (val < 0)

View File

@@ -26,11 +26,11 @@ class GD_EXTENSION_API ShapePainterObjectBase {
ShapePainterObjectBase();
virtual ~ShapePainterObjectBase(){};
inline void SetOutlineSize(float size) { outlineSize = size; };
inline float GetOutlineSize() const { return outlineSize; };
inline void SetOutlineSize(double size) { outlineSize = size; };
inline double GetOutlineSize() const { return outlineSize; };
void SetOutlineOpacity(float val);
inline float GetOutlineOpacity() const { return outlineOpacity; };
void SetOutlineOpacity(double val);
inline double GetOutlineOpacity() const { return outlineOpacity; };
void SetOutlineColor(unsigned int r, unsigned int v, unsigned int b);
inline unsigned int GetOutlineColorR() const { return outlineColorR; };
@@ -41,8 +41,8 @@ class GD_EXTENSION_API ShapePainterObjectBase {
*/
void SetOutlineColor(const gd::String& color);
void SetFillOpacity(float val);
inline float GetFillOpacity() const { return fillOpacity; };
void SetFillOpacity(double val);
inline double GetFillOpacity() const { return fillOpacity; };
void SetFillColor(unsigned int r, unsigned int v, unsigned int b);
inline unsigned int GetFillColorR() const { return fillColorR; };

View File

@@ -39,7 +39,9 @@ void DeclareTextEntryObjectExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/textentryicon.png")
.AddParameter("object", _("Object"), "TextEntry")
.UseStandardOperatorParameters("string")
.UseStandardOperatorParameters(
"string",
gd::ParameterOptions::MakeNewOptions().SetDescription(_("Text")))
.SetFunctionName("SetString")
.SetGetter("GetString");
@@ -52,7 +54,9 @@ void DeclareTextEntryObjectExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/textentryicon.png")
.AddParameter("object", _("Object"), "TextEntry")
.UseStandardRelationalOperatorParameters("string")
.UseStandardRelationalOperatorParameters(
"string",
gd::ParameterOptions::MakeNewOptions().SetDescription(_("Text to compare to")))
.SetFunctionName("GetString");
obj.AddAction(

View File

@@ -299,7 +299,10 @@ module.exports = {
'res/conditions/text24_black.png'
)
.addParameter('object', _('Text input'), 'TextInputObject', false)
.useStandardParameters('string')
.useStandardParameters(
'string',
gd.ParameterOptions.makeNewOptions().setDescription(_('Text'))
)
.setFunctionName('setString')
.setGetter('getString');
@@ -314,7 +317,10 @@ module.exports = {
'res/conditions/text24_black.png'
)
.addParameter('object', _('Text input'), 'TextInputObject', false)
.useStandardParameters('string')
.useStandardParameters(
'string',
gd.ParameterOptions.makeNewOptions().setDescription(_('Text'))
)
.setFunctionName('setPlaceholder')
.setGetter('getPlaceholder');
@@ -329,7 +335,7 @@ module.exports = {
'res/conditions/opacity24.png'
)
.addParameter('object', _('Text input'), 'TextInputObject', false)
.useStandardParameters('number')
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
.setFunctionName('setFontSize')
.setGetter('getFontSize');
@@ -344,7 +350,7 @@ module.exports = {
'res/conditions/font24.png'
)
.addParameter('object', _('Text input'), 'TextInputObject', false)
.useStandardParameters('string')
.useStandardParameters('string', gd.ParameterOptions.makeNewOptions())
.setFunctionName('getFontResourceName');
// TODO: could this be merged with the previous expression and condition?
@@ -374,7 +380,10 @@ module.exports = {
'res/conditions/text24_black.png'
)
.addParameter('object', _('Text input'), 'TextInputObject', false)
.useStandardParameters('string') // TODO: stringWithSelector?
.useStandardParameters(
'string',
gd.ParameterOptions.makeNewOptions().setDescription(_('Input type'))
) // TODO: stringWithSelector?
.setFunctionName('setInputType')
.setGetter('getInputType');
@@ -419,7 +428,12 @@ module.exports = {
'res/conditions/opacity24.png'
)
.addParameter('object', _('Text input'), 'TextInputObject', false)
.useStandardParameters('number')
.useStandardParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Opacity (0-255)')
)
)
.setFunctionName('setFillOpacity')
.setGetter('getFillOpacity');
@@ -449,7 +463,12 @@ module.exports = {
'res/conditions/opacity24.png'
)
.addParameter('object', _('Text input'), 'TextInputObject', false)
.useStandardParameters('number')
.useStandardParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Opacity (0-255)')
)
)
.setFunctionName('setBorderOpacity')
.setGetter('getBorderOpacity');
@@ -464,7 +483,7 @@ module.exports = {
'res/conditions/outlineSize24_black.png'
)
.addParameter('object', _('Text input'), 'TextInputObject', false)
.useStandardParameters('number')
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
.setFunctionName('setBorderWidth')
.setGetter('getBorderWidth');
@@ -481,7 +500,7 @@ module.exports = {
'res/conditions/text24_black.png'
)
.addParameter('object', _('Text input'), 'TextInputObject', false)
.useStandardParameters('boolean')
.useStandardParameters('boolean', gd.ParameterOptions.makeNewOptions())
.setFunctionName('setReadOnly')
.setGetter('isReadOnly');
@@ -496,7 +515,7 @@ module.exports = {
'res/conditions/text24_black.png'
)
.addParameter('object', _('Text input'), 'TextInputObject', false)
.useStandardParameters('boolean')
.useStandardParameters('boolean', gd.ParameterOptions.makeNewOptions())
.setFunctionName('setDisabled')
.setGetter('isDisabled');
@@ -512,7 +531,12 @@ module.exports = {
'res/conditions/opacity24.png'
)
.addParameter('object', _('Text input'), 'TextInputObject', false)
.useStandardParameters('number')
.useStandardParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Opacity (0-255)')
)
)
.setFunctionName('setOpacity')
.setGetter('getOpacity');

View File

@@ -45,7 +45,9 @@ void DeclareTextObjectExtension(gd::PlatformExtension& extension) {
"res/actions/text_black.png")
.AddParameter("object", _("Object"), "Text")
.UseStandardOperatorParameters("string")
.UseStandardOperatorParameters(
"string",
gd::ParameterOptions::MakeNewOptions().SetDescription(_("Text")))
.SetFunctionName("SetString")
.SetGetter("GetString");
@@ -58,7 +60,10 @@ void DeclareTextObjectExtension(gd::PlatformExtension& extension) {
"res/conditions/text_black.png")
.AddParameter("object", _("Object"), "Text")
.UseStandardRelationalOperatorParameters("string")
.UseStandardRelationalOperatorParameters(
"string",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Text to compare to")))
.SetFunctionName("GetString");
obj.AddAction("Font",
@@ -82,7 +87,10 @@ void DeclareTextObjectExtension(gd::PlatformExtension& extension) {
"res/conditions/scaleWidth_black.png")
.AddParameter("object", _("Object"), "Text")
.UseStandardRelationalOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Scale to compare to (1 by default)")))
.SetFunctionName("GetScaleX");
obj.AddAction(
@@ -95,7 +103,10 @@ void DeclareTextObjectExtension(gd::PlatformExtension& extension) {
"res/actions/scaleWidth_black.png")
.AddParameter("object", _("Object"), "Text")
.UseStandardOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Scale (1 by default)")))
.SetFunctionName("SetScaleX");
obj.AddCondition("ScaleY",
@@ -107,7 +118,10 @@ void DeclareTextObjectExtension(gd::PlatformExtension& extension) {
"res/conditions/scaleHeight_black.png")
.AddParameter("object", _("Object"), "Text")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Scale to compare to (1 by default)")))
.SetFunctionName("GetScaleY");
obj.AddAction(
@@ -120,7 +134,10 @@ void DeclareTextObjectExtension(gd::PlatformExtension& extension) {
"res/actions/scaleHeight_black.png")
.AddParameter("object", _("Object"), "Text")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Scale (1 by default)")))
.SetFunctionName("SetScaleY");
obj.AddAction(
@@ -133,7 +150,10 @@ void DeclareTextObjectExtension(gd::PlatformExtension& extension) {
"res/actions/scale_black.png")
.AddParameter("object", _("Object"), "Text")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Scale (1 by default)")))
.SetFunctionName("SetScale");
obj.AddAction(
@@ -218,7 +238,10 @@ void DeclareTextObjectExtension(gd::PlatformExtension& extension) {
"res/actions/opacity.png")
.AddParameter("object", _("Object"), "Text")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Opacity (0-255)")))
.SetFunctionName("SetOpacity")
.SetGetter("GetOpacity");
@@ -232,7 +255,10 @@ void DeclareTextObjectExtension(gd::PlatformExtension& extension) {
"res/conditions/opacity.png")
.AddParameter("object", _("Object"), "Text")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Opacity to compare to (0-255)")))
.SetFunctionName("GetOpacity");
obj.AddAction("SetSmooth",
@@ -336,7 +362,10 @@ void DeclareTextObjectExtension(gd::PlatformExtension& extension) {
"res/actions/rotate_black.png")
.AddParameter("object", _("Object"), "Text")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Angle (in degrees)")))
.SetFunctionName("SetAngle")
.SetGetter("GetAngle");
@@ -349,7 +378,10 @@ void DeclareTextObjectExtension(gd::PlatformExtension& extension) {
"res/conditions/rotate_black.png")
.AddParameter("object", _("Object"), "Text")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Angle to compare to (in degrees)")))
.SetFunctionName("GetAngle");
obj.AddCondition("Padding",
@@ -363,7 +395,8 @@ void DeclareTextObjectExtension(gd::PlatformExtension& extension) {
"res/conditions/textPadding_black.png")
.AddParameter("object", _("Object"), "Text")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions());
obj.AddAction("SetPadding",
_("Padding"),
@@ -376,7 +409,8 @@ void DeclareTextObjectExtension(gd::PlatformExtension& extension) {
"res/actions/textPadding_black.png")
.AddParameter("object", _("Object"), "Text")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions());
obj.AddAction("SetTextAlignment",
_("Alignment"),
@@ -403,7 +437,11 @@ void DeclareTextObjectExtension(gd::PlatformExtension& extension) {
"res/conditions/textAlign.png")
.AddParameter("object", _("Object"), "Text")
.UseStandardRelationalOperatorParameters("string");
.UseStandardRelationalOperatorParameters(
"stringWithSelector",
gd::ParameterOptions::MakeNewOptions()
.SetDescription(_("Alignment"))
.SetTypeExtraInfo("[\"left\", \"center\", \"right\"]"));
obj.AddAction(
"SetWrapping",
@@ -437,7 +475,8 @@ void DeclareTextObjectExtension(gd::PlatformExtension& extension) {
"res/actions/wordWrap_black.png")
.AddParameter("object", _("Object"), "Text")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions());
obj.AddCondition("WrappingWidth",
_("Wrapping width"),
@@ -448,7 +487,8 @@ void DeclareTextObjectExtension(gd::PlatformExtension& extension) {
"res/conditions/wordWrap_black.png")
.AddParameter("object", _("Object"), "Text")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions());
obj.AddExpression("Padding",
_("Padding"),
@@ -497,7 +537,7 @@ void DeclareTextObjectExtension(gd::PlatformExtension& extension) {
"",
"res/conditions/characterSize24.png")
.AddParameter("object", _("Object"), "Text")
.UseStandardParameters("number");
.UseStandardParameters("number", gd::ParameterOptions::MakeNewOptions());
// Support for deprecated "Size" actions/conditions:
obj.AddDuplicatedAction("Size", "Text::SetFontSize").SetHidden();

View File

@@ -12,7 +12,7 @@ namespace gd {
class Project;
class Object;
class InitialInstance;
}
} // namespace gd
/**
* Text Object
@@ -39,11 +39,11 @@ class GD_EXTENSION_API TextObject : public gd::ObjectConfiguration {
/** \brief Change the character size.
*/
inline void SetCharacterSize(float size) { characterSize = size; };
inline void SetCharacterSize(double size) { characterSize = size; };
/** \brief Get the character size.
*/
inline float GetCharacterSize() const { return characterSize; };
inline double GetCharacterSize() const { return characterSize; };
/** \brief Return the name of the font resource used for the text.
*/
@@ -54,7 +54,9 @@ class GD_EXTENSION_API TextObject : public gd::ObjectConfiguration {
void SetFontName(const gd::String& resourceName) { fontName = resourceName; };
inline const gd::String& GetTextAlignment() const { return textAlignment; };
void SetTextAlignment(const gd::String& textAlignment_) { textAlignment = textAlignment_; };
void SetTextAlignment(const gd::String& textAlignment_) {
textAlignment = textAlignment_;
};
bool IsBold() const { return bold; };
void SetBold(bool enable) { bold = enable; };
@@ -83,7 +85,7 @@ class GD_EXTENSION_API TextObject : public gd::ObjectConfiguration {
#endif
gd::String text;
float characterSize;
double characterSize;
gd::String fontName;
bool smoothed;
bool bold, italic, underlined;

View File

@@ -311,7 +311,10 @@ const defineTileMap = function (
'JsPlatform/Extensions/tile_map.svg'
)
.addParameter('object', _('Tile map'), 'TileMap', false)
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('getLayerIndex');
@@ -326,7 +329,10 @@ const defineTileMap = function (
'JsPlatform/Extensions/tile_map.svg'
)
.addParameter('object', _('Tile map'), 'TileMap', false)
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.getCodeExtraInformation()
.setFunctionName('setLayerIndex')
.setGetter('getLayerIndex');
@@ -354,7 +360,12 @@ const defineTileMap = function (
'JsPlatform/Extensions/tile_map.svg'
)
.addParameter('object', _('Tile map'), 'TileMap', false)
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Speed scale to compare to (1 by default)')
)
)
.getCodeExtraInformation()
.setFunctionName('getAnimationSpeedScale');
@@ -362,14 +373,19 @@ const defineTileMap = function (
.addAction(
'SetAnimationSpeedScale',
_('Animation speed scale'),
_('Set the animation speed scale of the Tilemap (1 by default).'),
_('Set the animation speed scale of the Tilemap.'),
_('the animation speed scale'),
'',
'JsPlatform/Extensions/tile_map.svg',
'JsPlatform/Extensions/tile_map.svg'
)
.addParameter('object', _('Tile map'), 'TileMap', false)
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Speed scale (1 by default)')
)
)
.getCodeExtraInformation()
.setFunctionName('setAnimationSpeedScale')
.setGetter('getAnimationSpeedScale');
@@ -390,14 +406,19 @@ const defineTileMap = function (
.addCondition(
'AnimationFps',
_('Animation speed (FPS)'),
_('Compare the animation speed (in frames per second).'),
_('Compare the animation speed.'),
_('the animation speed (FPS)'),
'',
'JsPlatform/Extensions/tile_map.svg',
'JsPlatform/Extensions/tile_map.svg'
)
.addParameter('object', _('Tile map'), 'TileMap', false)
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Animation speed to compare to (in frames per second)')
)
)
.getCodeExtraInformation()
.setFunctionName('getAnimationFps');
@@ -405,14 +426,19 @@ const defineTileMap = function (
.addAction(
'SetAnimationFps',
_('Animation speed (FPS)'),
_('Set the animation speed (in frames per second) of the Tilemap.'),
_('Set the animation speed of the Tilemap.'),
_('the animation speed (FPS)'),
'',
'JsPlatform/Extensions/tile_map.svg',
'JsPlatform/Extensions/tile_map.svg'
)
.addParameter('object', _('Tile map'), 'TileMap', false)
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Animation speed (in frames per second)')
)
)
.getCodeExtraInformation()
.setFunctionName('setAnimationFps')
.setGetter('getAnimationFps');
@@ -429,52 +455,65 @@ const defineTileMap = function (
.getCodeExtraInformation()
.setFunctionName('getAnimationFps');
object.addAction(
"Scale",
_("Scale"),
_("Modify the scale of the specified object."),
_("the scale"),
_("Size"),
"res/actions/scale24_black.png",
"res/actions/scale_black.png"
)
.addParameter('object', _('Tile map'), 'TileMap', false)
.useStandardOperatorParameters("number")
.markAsAdvanced()
.getCodeExtraInformation()
.setFunctionName('setScale');
object
.addAction(
'Scale',
_('Scale'),
_('Modify the scale of the specified object.'),
_('the scale'),
_('Size'),
'res/actions/scale24_black.png',
'res/actions/scale_black.png'
)
.addParameter('object', _('Tile map'), 'TileMap', false)
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Scale (1 by default)')
)
)
.markAsAdvanced()
.getCodeExtraInformation()
.setFunctionName('setScale');
object
.addExpressionAndConditionAndAction(
"number",
"ScaleX",
_("Scale on X axis"),
_("the width's scale of an object"),
_("the width's scale"),
_("Size"),
"res/actions/scaleWidth24_black.png"
)
.addParameter('object', _('Tile map'), 'TileMap', false)
.useStandardParameters("number")
.markAsAdvanced()
.setFunctionName('setScaleX')
.setGetter('getScaleX');
object
.addExpressionAndConditionAndAction(
'number',
'ScaleX',
_('Scale on X axis'),
_("the width's scale of an object"),
_("the width's scale"),
_('Size'),
'res/actions/scaleWidth24_black.png'
)
.addParameter('object', _('Tile map'), 'TileMap', false)
.useStandardParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Scale (1 by default)')
)
)
.markAsAdvanced()
.setFunctionName('setScaleX')
.setGetter('getScaleX');
object
.addExpressionAndConditionAndAction(
"number",
"ScaleY",
_("Scale on Y axis"),
_("the height's scale of an object"),
_("the height's scale"),
_("Size"),
"res/actions/scaleHeight24_black.png"
)
.addParameter('object', _('Tile map'), 'TileMap', false)
.useStandardParameters("number")
.markAsAdvanced()
.setFunctionName('setScaleY')
.setGetter('getScaleY');
object
.addExpressionAndConditionAndAction(
'number',
'ScaleY',
_('Scale on Y axis'),
_("the height's scale of an object"),
_("the height's scale"),
_('Size'),
'res/actions/scaleHeight24_black.png'
)
.addParameter('object', _('Tile map'), 'TileMap', false)
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions().setDescription(
_('Scale (1 by default)')
))
.markAsAdvanced()
.setFunctionName('setScaleY')
.setGetter('getScaleY');
object
.addAction(
@@ -487,7 +526,10 @@ object
"res/actions/scaleWidth_black.png"
)
.addParameter('object', _('Tile map'), 'TileMap', false)
.useStandardOperatorParameters("number")
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.markAsAdvanced()
.getCodeExtraInformation()
.setFunctionName('setWidth');
@@ -503,11 +545,13 @@ object
"res/actions/scaleHeight_black.png"
)
.addParameter('object', _('Tile map'), 'TileMap', false)
.useStandardOperatorParameters("number")
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.markAsAdvanced()
.getCodeExtraInformation()
.setFunctionName('setHeight');
};
const defineCollisionMask = function (
@@ -604,9 +648,7 @@ const defineCollisionMask = function (
.setType('boolean')
.setLabel(_('Debug mode'))
.setDescription(
_(
'When activated, it displays the hitboxes in the given color.'
)
_('When activated, it displays the hitboxes in the given color.')
)
);
objectProperties.set(
@@ -682,9 +724,7 @@ const defineCollisionMask = function (
.addObject(
'CollisionMask',
_('Tilemap collision mask (experimental)'),
_(
'Invisible object handling collisions with parts of a tilemap.'
),
_('Invisible object handling collisions with parts of a tilemap.'),
'JsPlatform/Extensions/tile_map_collision_mask32.svg',
collisionMaskObject
)
@@ -762,89 +802,134 @@ const defineCollisionMask = function (
.getCodeExtraInformation()
.setFunctionName('setTilesetJsonFile');
object.addAction(
"Scale",
_("Scale"),
_("Modify the scale of the specified object."),
_("the scale"),
_("Size"),
"res/actions/scale24_black.png",
"res/actions/scale_black.png"
object
.addAction(
'Scale',
_('Scale'),
_('Modify the scale of the specified object.'),
_('the scale'),
_('Size'),
'res/actions/scale24_black.png',
'res/actions/scale_black.png'
)
.addParameter(
'object',
_('Tile map collision mask'),
'CollisionMask',
false
)
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Scale (1 by default)')
)
)
.addParameter('object', _('Tile map collision mask'), 'CollisionMask', false)
.useStandardOperatorParameters("number")
.markAsAdvanced()
.getCodeExtraInformation()
.setFunctionName('setScale');
object
.addExpressionAndConditionAndAction(
"number",
"ScaleX",
_("Scale on X axis"),
'number',
'ScaleX',
_('Scale on X axis'),
_("the width's scale of an object"),
_("the width's scale"),
_("Size"),
"res/actions/scaleWidth24_black.png"
_('Size'),
'res/actions/scaleWidth24_black.png'
)
.addParameter(
'object',
_('Tile map collision mask'),
'CollisionMask',
false
)
.useStandardParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Scale (1 by default)')
)
)
.addParameter('object', _('Tile map collision mask'), 'CollisionMask', false)
.useStandardParameters("number")
.markAsAdvanced()
.setFunctionName('setScaleX')
.setGetter('getScaleX');
object
.addExpressionAndConditionAndAction(
"number",
"ScaleY",
_("Scale on Y axis"),
'number',
'ScaleY',
_('Scale on Y axis'),
_("the height's scale of an object"),
_("the height's scale"),
_("Size"),
"res/actions/scaleHeight24_black.png"
_('Size'),
'res/actions/scaleHeight24_black.png'
)
.addParameter(
'object',
_('Tile map collision mask'),
'CollisionMask',
false
)
.useStandardParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Scale (1 by default)')
)
)
.addParameter('object', _('Tile map collision mask'), 'CollisionMask', false)
.useStandardParameters("number")
.markAsAdvanced()
.setFunctionName('setScaleY')
.setGetter('getScaleY');
object
.addAction(
"Width",
_("Width"),
_("Change the width of an object."),
_("the width"),
_("Size"),
"res/actions/scaleWidth24_black.png",
"res/actions/scaleWidth_black.png"
)
.addParameter('object', _('Tile map collision mask'), 'CollisionMask', false)
.useStandardOperatorParameters("number")
.markAsAdvanced()
.getCodeExtraInformation()
.setFunctionName('setWidth');
object
.addAction(
"Height",
_("Height"),
_("Change the height of an object."),
_("the height"),
_("Size"),
"res/actions/scaleHeight24_black.png",
"res/actions/scaleHeight_black.png"
)
.addParameter('object', _('Tile map collision mask'), 'CollisionMask', false)
.useStandardOperatorParameters("number")
.markAsAdvanced()
.getCodeExtraInformation()
.setFunctionName('setHeight');
object
.addAction(
'Width',
_('Width'),
_('Change the width of an object.'),
_('the width'),
_('Size'),
'res/actions/scaleWidth24_black.png',
'res/actions/scaleWidth_black.png'
)
.addParameter(
'object',
_('Tile map collision mask'),
'CollisionMask',
false
)
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.markAsAdvanced()
.getCodeExtraInformation()
.setFunctionName('setWidth');
object
.addAction(
'Height',
_('Height'),
_('Change the height of an object.'),
_('the height'),
_('Size'),
'res/actions/scaleHeight24_black.png',
'res/actions/scaleHeight_black.png'
)
.addParameter(
'object',
_('Tile map collision mask'),
'CollisionMask',
false
)
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.markAsAdvanced()
.getCodeExtraInformation()
.setFunctionName('setHeight');
};
module.exports = {
createExtension: function (
_ /*: (string) => string */,
gd /*: libGDevelop */

View File

@@ -46,7 +46,10 @@ void DeclareTiledSpriteObjectExtension(gd::PlatformExtension& extension) {
"res/conditions/opacity.png")
.AddParameter("object", _("Object"), "TiledSprite")
.UseStandardRelationalOperatorParameters("number");
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Opacity to compare to (0-255)")));
obj.AddAction(
"SetOpacity",
@@ -59,7 +62,10 @@ void DeclareTiledSpriteObjectExtension(gd::PlatformExtension& extension) {
"res/actions/opacity.png")
.AddParameter("object", _("Object"), "TiledSprite")
.UseStandardOperatorParameters("number");
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Opacity (0-255)")));
obj.AddExpression("Opacity",
_("Opacity"),
@@ -89,7 +95,8 @@ void DeclareTiledSpriteObjectExtension(gd::PlatformExtension& extension) {
"res/actions/scaleWidth_black.png")
.AddParameter("object", _("Object"), "TiledSprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions())
.SetFunctionName("SetWidth")
.SetGetter("GetWidth");
@@ -101,7 +108,8 @@ void DeclareTiledSpriteObjectExtension(gd::PlatformExtension& extension) {
"res/conditions/scaleWidth24_black.png",
"res/conditions/scaleWidth_black.png")
.AddParameter("object", _("Object"), "TiledSprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.MarkAsAdvanced()
.SetFunctionName("GetWidth");
@@ -114,7 +122,8 @@ void DeclareTiledSpriteObjectExtension(gd::PlatformExtension& extension) {
"res/actions/scaleHeight_black.png")
.AddParameter("object", _("Object"), "TiledSprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions())
.SetFunctionName("SetHeight")
.SetGetter("GetHeight");
@@ -126,7 +135,8 @@ void DeclareTiledSpriteObjectExtension(gd::PlatformExtension& extension) {
"res/conditions/scaleHeight24_black.png",
"res/conditions/scaleHeight_black.png")
.AddParameter("object", _("Object"), "TiledSprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.MarkAsAdvanced()
.SetFunctionName("GetHeight");
@@ -153,7 +163,8 @@ void DeclareTiledSpriteObjectExtension(gd::PlatformExtension& extension) {
"res/actions/rotate_black.png")
.AddParameter("object", _("Object"), "TiledSprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions())
.SetHidden();
// Deprecated: now available for all objects.
@@ -166,7 +177,8 @@ void DeclareTiledSpriteObjectExtension(gd::PlatformExtension& extension) {
"res/conditions/rotate_black.png")
.AddParameter("object", _("Object"), "TiledSprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.SetHidden();
obj.AddAction(
@@ -178,7 +190,8 @@ void DeclareTiledSpriteObjectExtension(gd::PlatformExtension& extension) {
"res/conditions/scaleWidth24_black.png",
"res/conditions/scaleWidth_black.png")
.AddParameter("object", _("Object"), "TiledSprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions())
.MarkAsAdvanced()
.SetFunctionName("SetXOffset")
.SetGetter("GetXOffset");
@@ -192,7 +205,8 @@ void DeclareTiledSpriteObjectExtension(gd::PlatformExtension& extension) {
"res/conditions/scaleWidth24_black.png",
"res/conditions/scaleWidth_black.png")
.AddParameter("object", _("Object"), "TiledSprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.MarkAsAdvanced()
.SetFunctionName("GetXOffset");
@@ -205,7 +219,8 @@ void DeclareTiledSpriteObjectExtension(gd::PlatformExtension& extension) {
"res/conditions/scaleHeight24_black.png",
"res/conditions/scaleHeight_black.png")
.AddParameter("object", _("Object"), "TiledSprite")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters("number",
gd::ParameterOptions::MakeNewOptions())
.MarkAsAdvanced()
.SetFunctionName("SetYOffset")
.SetGetter("GetYOffset");
@@ -219,7 +234,8 @@ void DeclareTiledSpriteObjectExtension(gd::PlatformExtension& extension) {
"res/conditions/scaleHeight24_black.png",
"res/conditions/scaleHeight_black.png")
.AddParameter("object", _("Object"), "TiledSprite")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number", gd::ParameterOptions::MakeNewOptions())
.MarkAsAdvanced()
.SetFunctionName("GetYOffset");
}

View File

@@ -8,11 +8,12 @@ This project is released under the MIT License.
#ifndef TILEDSPRITEOBJECT_H
#define TILEDSPRITEOBJECT_H
#include <memory>
#include "GDCore/Project/ObjectConfiguration.h"
namespace gd {
class InitialInstance;
class Project;
}
} // namespace gd
/**
* TiledSprite Object
@@ -29,11 +30,11 @@ class GD_EXTENSION_API TiledSpriteObject : public gd::ObjectConfiguration {
virtual void ExposeResources(gd::ArbitraryResourceWorker &worker);
#endif
virtual float GetWidth() const { return width; };
virtual float GetHeight() const { return height; };
virtual double GetWidth() const { return width; };
virtual double GetHeight() const { return height; };
virtual void SetWidth(float newWidth) { width = newWidth; };
virtual void SetHeight(float newHeight) { height = newHeight; };
virtual void SetWidth(double newWidth) { width = newWidth; };
virtual void SetHeight(double newHeight) { height = newHeight; };
void SetTexture(const gd::String &newTextureName) {
textureName = newTextureName;
@@ -49,8 +50,8 @@ class GD_EXTENSION_API TiledSpriteObject : public gd::ObjectConfiguration {
virtual void DoSerializeTo(gd::SerializerElement &element) const;
#endif
float width;
float height;
double width;
double height;
bool smooth;
};

View File

@@ -5,10 +5,10 @@ Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com)
This project is released under the MIT License.
*/
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/Extensions/Metadata/MultipleInstructionMetadata.h"
#include "GDCore/Tools/Localization.h"
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/Project/BehaviorsSharedData.h"
#include "GDCore/Tools/Localization.h"
#include "TopDownMovementBehavior.h"
void DeclareTopDownMovementBehaviorExtension(gd::PlatformExtension& extension) {
@@ -172,7 +172,10 @@ void DeclareTopDownMovementBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/topdownmovementicon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "TopDownMovementBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Acceleration (in pixels per second per second)")))
.MarkAsAdvanced()
.SetFunctionName("SetAcceleration")
.SetGetter("GetAcceleration");
@@ -186,7 +189,10 @@ void DeclareTopDownMovementBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/topdownmovementicon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "TopDownMovementBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(_(
"Acceleration to compare to (in pixels per second per second)")))
.MarkAsAdvanced()
.SetFunctionName("GetAcceleration");
@@ -199,7 +205,10 @@ void DeclareTopDownMovementBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/topdownmovementicon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "TopDownMovementBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Deceleration (in pixels per second per second)")))
.MarkAsAdvanced()
.SetFunctionName("SetDeceleration")
.SetGetter("GetDeceleration");
@@ -213,7 +222,10 @@ void DeclareTopDownMovementBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/topdownmovementicon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "TopDownMovementBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(_(
"Deceleration to compare to (in pixels per second per second)")))
.MarkAsAdvanced()
.SetFunctionName("GetDeceleration");
@@ -226,7 +238,10 @@ void DeclareTopDownMovementBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/topdownmovementicon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "TopDownMovementBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Max speed (in pixels per second)")))
.SetFunctionName("SetMaxSpeed")
.SetGetter("GetMaxSpeed");
@@ -239,7 +254,10 @@ void DeclareTopDownMovementBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/topdownmovementicon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "TopDownMovementBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Max speed to compare to (in pixels per second)")))
.MarkAsAdvanced()
.SetFunctionName("GetMaxSpeed");
@@ -252,7 +270,10 @@ void DeclareTopDownMovementBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/topdownmovementicon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "TopDownMovementBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Speed to compare to (in pixels per second)")))
.SetFunctionName("GetSpeed");
aut.AddAction("AngularMaxSpeed",
@@ -264,7 +285,10 @@ void DeclareTopDownMovementBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/topdownmovementicon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "TopDownMovementBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Max angular speed (in degrees per second)")))
.MarkAsAdvanced()
.SetFunctionName("SetAngularMaxSpeed")
.SetGetter("GetAngularMaxSpeed");
@@ -278,7 +302,10 @@ void DeclareTopDownMovementBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/topdownmovementicon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "TopDownMovementBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Max angular speed to compare to (in degrees per second)")))
.MarkAsAdvanced()
.SetFunctionName("GetAngularMaxSpeed");
@@ -291,7 +318,10 @@ void DeclareTopDownMovementBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/topdownmovementicon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "TopDownMovementBehavior")
.UseStandardOperatorParameters("number")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Angle (in degrees)")))
.MarkAsAdvanced()
.SetFunctionName("SetAngleOffset")
.SetGetter("GetAngleOffset");
@@ -306,7 +336,10 @@ void DeclareTopDownMovementBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/topdownmovementicon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "TopDownMovementBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Angle to compare to (in degrees)")))
.MarkAsAdvanced()
.SetFunctionName("GetAngleOffset");
@@ -320,7 +353,10 @@ void DeclareTopDownMovementBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/topdownmovementicon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "TopDownMovementBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Angle to compare to (in degrees)")))
.MarkAsAdvanced()
.SetFunctionName("GetAngle");
@@ -334,10 +370,28 @@ void DeclareTopDownMovementBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/topdownmovementicon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "TopDownMovementBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Speed to compare to (in pixels per second)")))
.MarkAsAdvanced()
.SetFunctionName("GetXVelocity");
aut.AddScopedAction("SetVelocityX",
_("Speed on the X axis"),
_("Change the speed on the X axis of the movement"),
_("the speed on the X axis of the movement"),
_("Movement"),
"CppPlatform/Extensions/topdownmovementicon24.png",
"CppPlatform/Extensions/topdownmovementicon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "TopDownMovementBehavior")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Speed (in pixels per second)")))
.MarkAsAdvanced();
aut.AddCondition("YVelocity",
_("Speed on Y axis"),
_("Compare the velocity of the top-down movement of the "
@@ -348,10 +402,28 @@ void DeclareTopDownMovementBehaviorExtension(gd::PlatformExtension& extension) {
"CppPlatform/Extensions/topdownmovementicon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "TopDownMovementBehavior")
.UseStandardRelationalOperatorParameters("number")
.UseStandardRelationalOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Speed to compare to (in pixels per second)")))
.MarkAsAdvanced()
.SetFunctionName("GetYVelocity");
aut.AddScopedAction("SetVelocityY",
_("Speed on the Y axis"),
_("Change the speed on the Y axis of the movement"),
_("the speed on the Y axis of the movement"),
_("Movement"),
"CppPlatform/Extensions/topdownmovementicon24.png",
"CppPlatform/Extensions/topdownmovementicon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "TopDownMovementBehavior")
.UseStandardOperatorParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Speed (in pixels per second)")))
.MarkAsAdvanced();
aut.AddAction("AllowDiagonals",
_("Diagonal movement"),
_("Allow or restrict diagonal movemment"),
@@ -483,39 +555,19 @@ void DeclareTopDownMovementBehaviorExtension(gd::PlatformExtension& extension) {
.AddParameter("behavior", _("Behavior"), "TopDownMovementBehavior")
.SetFunctionName("GetYVelocity");
aut.AddScopedAction("SetVelocityX",
_("Speed on the X axis"),
_("Change the speed on the X axis of the movement"),
_("the speed on the X axis of the movement"),
_("Movement"),
"CppPlatform/Extensions/topdownmovementicon24.png",
"CppPlatform/Extensions/topdownmovementicon16.png")
aut.AddExpressionAndConditionAndAction(
"number",
"MovementAngleOffset",
_("Movement angle offset"),
_("the movement angle offset"),
_("the movement angle offset"),
_("Movement"),
"CppPlatform/Extensions/topdownmovementicon24.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "TopDownMovementBehavior")
.UseStandardOperatorParameters("number")
.MarkAsAdvanced();
aut.AddScopedAction("SetVelocityY",
_("Speed on the Y axis"),
_("Change the speed on the Y axis of the movement"),
_("the speed on the Y axis of the movement"),
_("Movement"),
"CppPlatform/Extensions/topdownmovementicon24.png",
"CppPlatform/Extensions/topdownmovementicon16.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "TopDownMovementBehavior")
.UseStandardOperatorParameters("number")
.MarkAsAdvanced();
aut.AddExpressionAndConditionAndAction("number",
"MovementAngleOffset",
_("Movement angle offset"),
_("the movement angle offset"),
_("the movement angle offset"),
_("Movement"),
"CppPlatform/Extensions/topdownmovementicon24.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "TopDownMovementBehavior")
.UseStandardParameters("number");
.UseStandardParameters(
"number",
gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Angle (in degrees)")));
#endif
}

View File

@@ -202,14 +202,19 @@ module.exports = {
.addAction(
'SetTime',
_('Set time'),
_('Set the time of the video object in seconds'),
_('Set the time of the video'),
_('the time'),
'',
'JsPlatform/Extensions/videoicon24.png',
'JsPlatform/Extensions/videoicon16.png'
)
.addParameter('object', _('Video object'), 'VideoObject', false)
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Position (in seconds)')
)
)
.getCodeExtraInformation()
.setFunctionName('setCurrentTime')
.setGetter('getCurrentTime');
@@ -218,16 +223,17 @@ module.exports = {
.addAction(
'SetVolume',
_('Set volume'),
_(
'Set the volume of the video object, between 0 (muted) and 100 (maximum).'
),
_('Set the volume of the video object.'),
_('the volume'),
'',
'JsPlatform/Extensions/videoicon24.png',
'JsPlatform/Extensions/videoicon16.png'
)
.addParameter('object', _('Video object'), 'VideoObject', false)
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(_('Volume (0-100)'))
)
.getCodeExtraInformation()
.setFunctionName('setVolume')
.setGetter('getVolume');
@@ -299,7 +305,12 @@ module.exports = {
'JsPlatform/Extensions/videoicon16.png'
)
.addParameter('object', _('Video object'), 'VideoObject', false)
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Volume to compare to (0-100)')
)
)
.getCodeExtraInformation()
.setFunctionName('getVolume');
@@ -352,7 +363,12 @@ module.exports = {
'JsPlatform/Extensions/videoicon16.png'
)
.addParameter('object', _('Video object'), 'VideoObject', false)
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Duration to compare to (in seconds)')
)
)
.getCodeExtraInformation()
.setFunctionName('getDuration');
@@ -367,7 +383,12 @@ module.exports = {
'JsPlatform/Extensions/videoicon16.png'
)
.addParameter('object', _('Video object'), 'VideoObject', false)
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Time to compare to (in seconds)')
)
)
.getCodeExtraInformation()
.setFunctionName('getCurrentTime');
@@ -389,16 +410,19 @@ module.exports = {
.addAction(
'SetOpacity',
_('Set opacity'),
_(
'Set opacity of the specified video object, between 0 (fully transparent) and 255 (opaque).'
),
_('Set opacity of the specified video object.'),
_('the opacity'),
'',
'JsPlatform/Extensions/videoicon24.png',
'JsPlatform/Extensions/videoicon16.png'
)
.addParameter('object', _('Video object'), 'VideoObject', false)
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Opacity (0-255)')
)
)
.getCodeExtraInformation()
.setFunctionName('setOpacity')
.setGetter('getOpacity');
@@ -414,7 +438,12 @@ module.exports = {
'JsPlatform/Extensions/videoicon16.png'
)
.addParameter('object', _('Video object'), 'VideoObject', false)
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Opacity to compare to (0-255)')
)
)
.getCodeExtraInformation()
.setFunctionName('getOpacity');
@@ -443,7 +472,12 @@ module.exports = {
'JsPlatform/Extensions/videoicon16.png'
)
.addParameter('object', _('Video object'), 'VideoObject', false)
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Playback speed (1 by default)')
)
)
.getCodeExtraInformation()
.setFunctionName('setPlaybackSpeed')
.setGetter('getPlaybackSpeed');
@@ -459,7 +493,12 @@ module.exports = {
'JsPlatform/Extensions/videoicon16.png'
)
.addParameter('object', _('Video object'), 'VideoObject', false)
.useStandardRelationalOperatorParameters('number')
.useStandardRelationalOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
_('Playback speed (1 by default)')
)
)
.getCodeExtraInformation()
.setFunctionName('getPlaybackSpeed');

View File

@@ -127,20 +127,23 @@ CODE_NAMESPACE = CODE_NAMESPACE || {};
* Object generated from OBJECT_FULL_NAME
*/
CODE_NAMESPACE.RUNTIME_OBJECT_CLASSNAME = class RUNTIME_OBJECT_CLASSNAME extends gdjs.CustomRuntimeObject {
constructor(runtimeScene, objectData) {
super(runtimeScene, objectData);
this._runtimeScene = runtimeScene;
constructor(parentInstanceContainer, objectData) {
super(parentInstanceContainer, objectData);
this._parentInstanceContainer = parentInstanceContainer;
this._onceTriggers = new gdjs.OnceTriggers();
this._behaviorData = {};
this._objectData = {};
INITIALIZE_PROPERTIES_CODE
// It calls the onCreated super implementation at the end.
this.onCreated();
}
// Hot-reload:
updateFromObjectData(oldObjectData, newObjectData) {
UPDATE_FROM_OBJECT_DATA_CODE
this.onHotReloading(this.getInstanceContainer());
this.onHotReloading(this._parentInstanceContainer);
return true;
}
@@ -170,7 +173,7 @@ gdjs.registerObject("EXTENSION_NAME::OBJECT_NAME", CODE_NAMESPACE.RUNTIME_OBJECT
gd::String ObjectCodeGenerator::GenerateInitializePropertyFromDataCode(
const gd::NamedPropertyDescriptor& property) {
return gd::String(R"jscode_template(
this._objectData.content.PROPERTY_NAME = objectData.content.PROPERTY_NAME !== undefined ? objectData.content.PROPERTY_NAME : DEFAULT_VALUE;)jscode_template")
this._objectData.PROPERTY_NAME = objectData.content.PROPERTY_NAME !== undefined ? objectData.content.PROPERTY_NAME : DEFAULT_VALUE;)jscode_template")
.FindAndReplace("PROPERTY_NAME", property.GetName())
.FindAndReplace("DEFAULT_VALUE", GeneratePropertyValueCode(property));
}
@@ -178,7 +181,7 @@ gd::String
ObjectCodeGenerator::GenerateInitializePropertyFromDefaultValueCode(
const gd::NamedPropertyDescriptor& property) {
return gd::String(R"jscode_template(
this._objectData.content.PROPERTY_NAME = DEFAULT_VALUE;)jscode_template")
this._objectData.PROPERTY_NAME = DEFAULT_VALUE;)jscode_template")
.FindAndReplace("PROPERTY_NAME", property.GetName())
.FindAndReplace("DEFAULT_VALUE", GeneratePropertyValueCode(property));
}
@@ -188,10 +191,10 @@ gd::String ObjectCodeGenerator::GenerateRuntimeObjectPropertyTemplateCode(
const gd::NamedPropertyDescriptor& property) {
return gd::String(R"jscode_template(
GETTER_NAME() {
return this._objectData.content.PROPERTY_NAME !== undefined ? this._objectData.content.PROPERTY_NAME : DEFAULT_VALUE;
return this._objectData.PROPERTY_NAME !== undefined ? this._objectData.PROPERTY_NAME : DEFAULT_VALUE;
}
SETTER_NAME(newValue) {
this._objectData.content.PROPERTY_NAME = newValue;
this._objectData.PROPERTY_NAME = newValue;
})jscode_template")
.FindAndReplace("PROPERTY_NAME", property.GetName())
.FindAndReplace("GETTER_NAME",
@@ -208,7 +211,7 @@ gd::String ObjectCodeGenerator::GenerateUpdatePropertyFromObjectDataCode(
const gd::NamedPropertyDescriptor& property) {
return gd::String(R"jscode_template(
if (oldObjectData.content.PROPERTY_NAME !== newObjectData.content.PROPERTY_NAME)
this._objectData.content.PROPERTY_NAME = newObjectData.content.PROPERTY_NAME;)jscode_template")
this._objectData.PROPERTY_NAME = newObjectData.content.PROPERTY_NAME;)jscode_template")
.FindAndReplace("PROPERTY_NAME", property.GetName());
}

View File

@@ -32,7 +32,6 @@ namespace gdjs {
_flippedX: boolean = false;
_flippedY: boolean = false;
opacity: float = 255;
_objectData: ObjectData & CustomObjectConfiguration;
/**
* @param parent The container the object belongs to
@@ -47,13 +46,12 @@ namespace gdjs {
parent,
this
);
this._objectData = objectData;
this._instanceContainer.loadFrom(objectData);
this.getRenderer().reinitialize(this, parent);
// The generated code calls the onCreated super implementation at the end.
this.onCreated();
// The generated code calls onCreated at the constructor end
// and onCreated calls its super implementation at its end.
}
reinitialize(objectData: ObjectData & CustomObjectConfiguration) {
@@ -80,28 +78,28 @@ namespace gdjs {
}
}
onDestroyFromScene(instanceContainer: gdjs.RuntimeInstanceContainer): void {
onDestroyFromScene(parent: gdjs.RuntimeInstanceContainer): void {
// Let subclasses do something before the object is destroyed.
this.onDestroy(instanceContainer);
this.onDestroy(parent);
// Let behaviors do something before the object is destroyed.
super.onDestroyFromScene(instanceContainer);
super.onDestroyFromScene(parent);
// Destroy the children.
this._instanceContainer.onDestroyFromScene(instanceContainer);
this._instanceContainer.onDestroyFromScene(parent);
}
update(instanceContainer: gdjs.RuntimeInstanceContainer): void {
update(parent: gdjs.RuntimeInstanceContainer): void {
this._instanceContainer._updateObjectsPreEvents();
this.doStepPreEvents(instanceContainer);
this.doStepPreEvents(parent);
const profiler = this.getRuntimeScene().getProfiler();
if (profiler) {
profiler.begin(this._objectData.type);
profiler.begin(this.type);
}
// This is a bit like the "scene" events for custom objects.
this.doStepPostEvents(instanceContainer);
this.doStepPostEvents(parent);
if (profiler) {
profiler.end(this._objectData.type);
profiler.end(this.type);
}
this._instanceContainer._updateObjectsPostEvents();
@@ -110,24 +108,24 @@ namespace gdjs {
/**
* This method is called when the preview is being hot-reloaded.
*/
onHotReloading(instanceContainer: gdjs.RuntimeInstanceContainer) {}
onHotReloading(parent: gdjs.RuntimeInstanceContainer) {}
// This is only to handle trigger once.
doStepPreEvents(instanceContainer: gdjs.RuntimeInstanceContainer) {}
doStepPreEvents(parent: gdjs.RuntimeInstanceContainer) {}
/**
* This method is called each tick after events are done.
* @param instanceContainer The instanceContainer owning the object
* @param parent The instanceContainer owning the object
*/
doStepPostEvents(instanceContainer: gdjs.RuntimeInstanceContainer) {}
doStepPostEvents(parent: gdjs.RuntimeInstanceContainer) {}
/**
* This method is called when the object is being removed from its parent
* container and is about to be destroyed/reused later.
*/
onDestroy(instanceContainer: gdjs.RuntimeInstanceContainer) {}
onDestroy(parent: gdjs.RuntimeInstanceContainer) {}
updatePreRender(instanceContainer: gdjs.RuntimeInstanceContainer): void {
updatePreRender(parent: gdjs.RuntimeInstanceContainer): void {
this._instanceContainer._updateObjectsPreRender();
this.getRenderer().ensureUpToDate();
}

View File

@@ -382,7 +382,7 @@ namespace gdjs {
x: float
): float {
return (
angle1 + gdjs.evtTools.common.angleDifference(angle1, angle2) * x
angle1 + gdjs.evtTools.common.angleDifference(angle2, angle1) * x
);
};
}

View File

@@ -435,6 +435,7 @@ interface Project {
boolean HasLayoutNamed([Const] DOMString name);
[Ref] Layout GetLayout([Const] DOMString name);
[Ref] Layout GetLayoutAt(unsigned long index);
void MoveLayout(unsigned long oldIndex, unsigned long newIndex);
void SwapLayouts(unsigned long first, unsigned long second);
unsigned long GetLayoutsCount();
[Ref] Layout InsertNewLayout([Const] DOMString name, unsigned long position);
@@ -445,6 +446,7 @@ interface Project {
boolean HasExternalEventsNamed([Const] DOMString name);
[Ref] ExternalEvents GetExternalEvents([Const] DOMString name);
[Ref] ExternalEvents GetExternalEventsAt(unsigned long index);
void MoveExternalEvents(unsigned long oldIndex, unsigned long newIndex);
void SwapExternalEvents(unsigned long first, unsigned long second);
unsigned long GetExternalEventsCount();
[Ref] ExternalEvents InsertNewExternalEvents([Const] DOMString name, unsigned long position);
@@ -453,6 +455,7 @@ interface Project {
boolean HasExternalLayoutNamed([Const] DOMString name);
[Ref] ExternalLayout GetExternalLayout([Const] DOMString name);
[Ref] ExternalLayout GetExternalLayoutAt(unsigned long index);
void MoveExternalLayout(unsigned long oldIndex, unsigned long newIndex);
void SwapExternalLayouts(unsigned long first, unsigned long second);
unsigned long GetExternalLayoutsCount();
[Ref] ExternalLayout InsertNewExternalLayout([Const] DOMString name, unsigned long position);
@@ -461,6 +464,7 @@ interface Project {
boolean HasEventsFunctionsExtensionNamed([Const] DOMString name);
[Ref] EventsFunctionsExtension GetEventsFunctionsExtension([Const] DOMString name);
[Ref] EventsFunctionsExtension GetEventsFunctionsExtensionAt(unsigned long index);
void MoveEventsFunctionsExtension(unsigned long oldIndex, unsigned long newIndex);
void SwapEventsFunctionsExtensions(unsigned long first, unsigned long second);
unsigned long GetEventsFunctionsExtensionsCount();
[Ref] EventsFunctionsExtension InsertNewEventsFunctionsExtension([Const] DOMString name, unsigned long position);
@@ -835,7 +839,7 @@ interface MeasurementUnit {
[Const, Ref] DOMString GetLabel();
[Const, Ref] DOMString GetDescription();
[Const, Ref] DOMString GetElementsWithWords();
long GetElementsCount();
long GetElementPower(long elementIndex);
[Const, Ref] MeasurementBaseUnit GetElementBaseUnit(long elementIndex);
@@ -978,12 +982,12 @@ interface InitialInstance {
void SetObjectName([Const] DOMString name);
[Const, Ref] DOMString GetObjectName();
float GetX();
void SetX(float x);
float GetY();
void SetY(float y);
float GetAngle();
void SetAngle(float angle);
double GetX();
void SetX(double x);
double GetY();
void SetY(double y);
double GetAngle();
void SetAngle(double angle);
boolean IsLocked();
void SetLocked(boolean lock);
boolean IsSealed();
@@ -996,18 +1000,18 @@ interface InitialInstance {
void SetHasCustomSize(boolean enable);
boolean HasCustomSize();
void SetCustomWidth(float width);
float GetCustomWidth();
void SetCustomHeight(float height);
float GetCustomHeight();
void SetCustomWidth(double width);
double GetCustomWidth();
void SetCustomHeight(double height);
double GetCustomHeight();
[Ref] InitialInstance ResetPersistentUuid();
void UpdateCustomProperty([Const] DOMString name, [Const] DOMString value, [Ref] Project project, [Ref] Layout layout);
[Value] MapStringPropertyDescriptor GetCustomProperties([Ref] Project project, [Ref] Layout layout);
float GetRawDoubleProperty([Const] DOMString name);
double GetRawDoubleProperty([Const] DOMString name);
[Const, Ref] DOMString GetRawStringProperty([Const] DOMString name);
void SetRawDoubleProperty([Const] DOMString name, float value);
void SetRawDoubleProperty([Const] DOMString name, double value);
void SetRawStringProperty([Const] DOMString name, [Const] DOMString value);
[Ref] VariablesContainer GetVariables();
@@ -1062,7 +1066,7 @@ interface SerializerValue {
boolean GetBool();
[Const, Value] DOMString GetString();
long GetInt();
float GetDouble();
double GetDouble();
[Const, Value] DOMString GetRawString();
@@ -1201,6 +1205,13 @@ interface ExpressionCodeGenerationInformation {
[Const, Ref] VectorString GetIncludeFiles();
};
interface ParameterOptions {
[Ref] ParameterOptions SetDescription([Const] DOMString description);
[Ref] ParameterOptions SetTypeExtraInfo([Const] DOMString typeExtraInfo);
[Value] ParameterOptions STATIC_MakeNewOptions();
};
interface InstructionMetadata {
void InstructionMetadata(); // For tests only.
@@ -1235,8 +1246,8 @@ interface InstructionMetadata {
[Ref] InstructionMetadata SetParameterLongDescription([Const] DOMString longDescription);
[Ref] InstructionMetadata SetParameterExtraInfo([Const] DOMString extraInfo);
[Ref] InstructionMetadata UseStandardOperatorParameters([Const] DOMString type, [Const] optional DOMString typeExtraInfo = "");
[Ref] InstructionMetadata UseStandardRelationalOperatorParameters([Const] DOMString type, [Const] optional DOMString typeExtraInfo = "");
[Ref] InstructionMetadata UseStandardOperatorParameters([Const] DOMString type, [Const, Ref] ParameterOptions options);
[Ref] InstructionMetadata UseStandardRelationalOperatorParameters([Const] DOMString type, [Const, Ref] ParameterOptions options);
[Ref] InstructionMetadata SetRequiresBaseObjectCapability([Const] DOMString capability);
[Const, Ref] DOMString GetRequiredBaseObjectCapability();
@@ -1312,7 +1323,7 @@ interface MultipleInstructionMetadata {
[Ref] MultipleInstructionMetadata SetParameterLongDescription([Const] DOMString longDescription);
[Ref] MultipleInstructionMetadata SetParameterExtraInfo([Const] DOMString extraInfo);
[Ref] MultipleInstructionMetadata UseStandardParameters([Const] DOMString type, [Const] optional DOMString typeExtraInfo = "");
[Ref] MultipleInstructionMetadata UseStandardParameters([Const] DOMString type, [Const, Ref] ParameterOptions options);
[Ref] MultipleInstructionMetadata SetHidden();
@@ -1615,7 +1626,7 @@ interface BehaviorMetadata {
[Ref] BehaviorMetadata SetObjectType([Const] DOMString objectType);
[Const, Ref] DOMString GetObjectType();
boolean IsPrivate();
[Ref] BehaviorMetadata SetPrivate();
@@ -2713,11 +2724,11 @@ interface Point {
void SetName([Const] DOMString name);
[Const, Ref] DOMString GetName();
void SetXY(float x, float y);
float GetX();
void SetX(float x);
float GetY();
void SetY(float y);
void SetXY(double x, double y);
double GetX();
void SetX(double x);
double GetY();
void SetY(double y);
};
interface VectorPoint {
@@ -2734,12 +2745,12 @@ interface Polygon2d {
void Polygon2d();
[Ref] VectorVector2f GetVertices();
void Move(float x, float y);
void Rotate(float angle);
void Move(double x, double y);
void Rotate(double angle);
boolean IsConvex();
[Value] Vector2f ComputeCenter();
[Value] Polygon2d STATIC_CreateRectangle(float width, float height);
[Value] Polygon2d STATIC_CreateRectangle(double width, double height);
};
interface VectorPolygon2d {
@@ -2788,9 +2799,9 @@ interface Direction {
void RemoveAllSprites();
boolean IsLooping();
void SetLoop(boolean enable);
float GetTimeBetweenFrames();
double GetTimeBetweenFrames();
[Const, Ref] VectorString GetSpriteNames();
void SetTimeBetweenFrames(float time);
void SetTimeBetweenFrames(double time);
void SwapSprites(unsigned long first, unsigned long second);
void MoveSprite(unsigned long oldIndex, unsigned long newIndex);
@@ -2857,8 +2868,8 @@ interface TextObject {
void SetString([Const] DOMString string);
[Const, Ref] DOMString GetString();
void SetCharacterSize(float size);
float GetCharacterSize();
void SetCharacterSize(double size);
double GetCharacterSize();
void SetFontName([Const] DOMString string);
[Const, Ref] DOMString GetFontName();
boolean IsBold();
@@ -2881,27 +2892,27 @@ interface TiledSpriteObject {
void SetTexture([Const] DOMString texture);
[Const, Ref] DOMString GetTexture();
void SetWidth(float width);
float GetWidth();
void SetHeight(float height);
float GetHeight();
void SetWidth(double width);
double GetWidth();
void SetHeight(double height);
double GetHeight();
};
TiledSpriteObject implements ObjectConfiguration;
interface PanelSpriteObject {
void PanelSpriteObject();
float GetLeftMargin();
void SetLeftMargin(float newMargin);
double GetLeftMargin();
void SetLeftMargin(double newMargin);
float GetTopMargin();
void SetTopMargin(float newMargin);
double GetTopMargin();
void SetTopMargin(double newMargin);
float GetRightMargin();
void SetRightMargin(float newMargin);
double GetRightMargin();
void SetRightMargin(double newMargin);
float GetBottomMargin();
void SetBottomMargin(float newMargin);
double GetBottomMargin();
void SetBottomMargin(double newMargin);
boolean IsTiled();
void SetTiled(boolean enable);
@@ -2909,10 +2920,10 @@ interface PanelSpriteObject {
void SetTexture([Const] DOMString texture);
[Const, Ref] DOMString GetTexture();
void SetWidth(float width);
float GetWidth();
void SetHeight(float height);
float GetHeight();
void SetWidth(double width);
double GetWidth();
void SetHeight(double height);
double GetHeight();
};
PanelSpriteObject implements ObjectConfiguration;
@@ -2926,19 +2937,19 @@ interface ShapePainterObject {
void SetClearBetweenFrames(boolean value);
boolean IsClearedBetweenFrames();
void SetOutlineSize(float size);
float GetOutlineSize();
void SetOutlineSize(double size);
double GetOutlineSize();
void SetOutlineOpacity(float val);
float GetOutlineOpacity();
void SetOutlineOpacity(double val);
double GetOutlineOpacity();
void SetOutlineColor(unsigned long r, unsigned long g, unsigned long b);
unsigned long GetOutlineColorR();
unsigned long GetOutlineColorG();
unsigned long GetOutlineColorB();
void SetFillOpacity(float val);
float GetFillOpacity();
void SetFillOpacity(double val);
double GetFillOpacity();
void SetFillColor(unsigned long r,unsigned long g, unsigned long b);
unsigned long GetFillColorR();
@@ -2966,85 +2977,85 @@ interface ParticleEmitterObject {
void SetParticleTexture([Const] DOMString resourceName);
[Const, Ref] DOMString GetParticleTexture();
void SetRendererParam1(float newValue);
float GetRendererParam1();
void SetRendererParam2(float newValue);
float GetRendererParam2();
void SetRendererParam1(double newValue);
double GetRendererParam1();
void SetRendererParam2(double newValue);
double GetRendererParam2();
boolean IsRenderingAdditive();
void SetRenderingAdditive();
void SetRenderingAlpha();
void SetMaxParticleNb(float newValue);
float GetMaxParticleNb();
void SetTank(float newValue);
float GetTank();
void SetFlow(float newValue);
float GetFlow();
void SetMaxParticleNb(double newValue);
double GetMaxParticleNb();
void SetTank(double newValue);
double GetTank();
void SetFlow(double newValue);
double GetFlow();
void SetDestroyWhenNoParticles(boolean enable);
boolean GetDestroyWhenNoParticles();
void SetEmitterForceMin(float newValue);
float GetEmitterForceMin();
void SetEmitterForceMax(float newValue);
float GetEmitterForceMax();
void SetEmitterForceMin(double newValue);
double GetEmitterForceMin();
void SetEmitterForceMax(double newValue);
double GetEmitterForceMax();
void SetConeSprayAngle(float newValue);
float GetConeSprayAngle();
void SetConeSprayAngle(double newValue);
double GetConeSprayAngle();
void SetZoneRadius(float newValue);
float GetZoneRadius();
void SetZoneRadius(double newValue);
double GetZoneRadius();
void SetParticleGravityX(float newValue);
float GetParticleGravityX();
void SetParticleGravityY(float newValue);
float GetParticleGravityY();
void SetParticleGravityAngle(float newValue);
float GetParticleGravityAngle();
void SetParticleGravityLength(float newValue);
float GetParticleGravityLength();
void SetParticleGravityX(double newValue);
double GetParticleGravityX();
void SetParticleGravityY(double newValue);
double GetParticleGravityY();
void SetParticleGravityAngle(double newValue);
double GetParticleGravityAngle();
void SetParticleGravityLength(double newValue);
double GetParticleGravityLength();
void SetParticleLifeTimeMin(float newValue);
float GetParticleLifeTimeMin();
void SetParticleLifeTimeMax(float newValue);
float GetParticleLifeTimeMax();
void SetParticleLifeTimeMin(double newValue);
double GetParticleLifeTimeMin();
void SetParticleLifeTimeMax(double newValue);
double GetParticleLifeTimeMax();
void SetParticleRed1(float newValue);
float GetParticleRed1();
void SetParticleRed2(float newValue);
float GetParticleRed2();
void SetParticleGreen1(float newValue);
float GetParticleGreen1();
void SetParticleGreen2(float newValue);
float GetParticleGreen2();
void SetParticleBlue1(float newValue);
float GetParticleBlue1();
void SetParticleBlue2(float newValue);
float GetParticleBlue2();
void SetParticleAlpha1(float newValue);
float GetParticleAlpha1();
void SetParticleAlpha2(float newValue);
float GetParticleAlpha2();
void SetParticleSize1(float newValue);
float GetParticleSize1();
void SetParticleSize2(float newValue);
float GetParticleSize2();
void SetParticleAngle1(float newValue);
float GetParticleAngle1();
void SetParticleAngle2(float newValue);
float GetParticleAngle2();
void SetParticleAlphaRandomness1(float newValue);
float GetParticleAlphaRandomness1();
void SetParticleAlphaRandomness2(float newValue);
float GetParticleAlphaRandomness2();
void SetParticleSizeRandomness1(float newValue);
float GetParticleSizeRandomness1();
void SetParticleSizeRandomness2(float newValue);
float GetParticleSizeRandomness2();
void SetParticleAngleRandomness1(float newValue);
float GetParticleAngleRandomness1();
void SetParticleAngleRandomness2(float newValue);
float GetParticleAngleRandomness2();
void SetParticleRed1(double newValue);
double GetParticleRed1();
void SetParticleRed2(double newValue);
double GetParticleRed2();
void SetParticleGreen1(double newValue);
double GetParticleGreen1();
void SetParticleGreen2(double newValue);
double GetParticleGreen2();
void SetParticleBlue1(double newValue);
double GetParticleBlue1();
void SetParticleBlue2(double newValue);
double GetParticleBlue2();
void SetParticleAlpha1(double newValue);
double GetParticleAlpha1();
void SetParticleAlpha2(double newValue);
double GetParticleAlpha2();
void SetParticleSize1(double newValue);
double GetParticleSize1();
void SetParticleSize2(double newValue);
double GetParticleSize2();
void SetParticleAngle1(double newValue);
double GetParticleAngle1();
void SetParticleAngle2(double newValue);
double GetParticleAngle2();
void SetParticleAlphaRandomness1(double newValue);
double GetParticleAlphaRandomness1();
void SetParticleAlphaRandomness2(double newValue);
double GetParticleAlphaRandomness2();
void SetParticleSizeRandomness1(double newValue);
double GetParticleSizeRandomness1();
void SetParticleSizeRandomness2(double newValue);
double GetParticleSizeRandomness2();
void SetParticleAngleRandomness1(double newValue);
double GetParticleAngleRandomness1();
void SetParticleAngleRandomness2(double newValue);
double GetParticleAngleRandomness2();
};
ParticleEmitterObject implements ObjectConfiguration;

View File

@@ -17,6 +17,7 @@
#include <GDCore/Extensions/Metadata/EffectMetadata.h>
#include <GDCore/Extensions/Metadata/MetadataProvider.h>
#include <GDCore/Extensions/Metadata/MultipleInstructionMetadata.h>
#include <GDCore/Extensions/Metadata/ParameterOptions.h>
#include <GDCore/Extensions/Metadata/ParameterMetadataTools.h>
#include <GDCore/Extensions/Platform.h>
#include <GDCore/IDE/AbstractFileSystem.h>
@@ -555,6 +556,7 @@ typedef ExtensionAndMetadata<ExpressionMetadata> ExtensionAndExpressionMetadata;
#define STATIC_GetEffectMetadata GetEffectMetadata
#define STATIC_GetActionMetadata GetActionMetadata
#define STATIC_GetConditionMetadata GetConditionMetadata
#define STATIC_MakeNewOptions MakeNewOptions
#define STATIC_GetExpressionMetadata GetExpressionMetadata
#define STATIC_GetObjectExpressionMetadata GetObjectExpressionMetadata
#define STATIC_GetBehaviorExpressionMetadata GetBehaviorExpressionMetadata

View File

@@ -2819,7 +2819,10 @@ describe('libGD.js', function () {
'Disable.png'
)
.addParameter('object', 'My object', 'MyObject', false)
.useStandardParameters('boolean')
.useStandardParameters(
'boolean',
gd.ParameterOptions.makeNewOptions()
)
.setFunctionName('setDisabled')
.setGetter('isDisabled');
@@ -2896,7 +2899,10 @@ describe('libGD.js', function () {
'Disable.png'
)
.addParameter('object', 'My object', '', false)
.useStandardParameters('boolean')
.useStandardParameters(
'boolean',
gd.ParameterOptions.makeNewOptions()
)
.setFunctionName('setDisabled')
.setGetter('isDisabled');
@@ -3726,7 +3732,7 @@ describe('libGD.js', function () {
.addParameter('string', 'Some stuff', '', false)
.setParameterLongDescription('Blabla')
.setFunctionName('some.method.to.getPlayerHealth')
.useStandardParameters('number');
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions());
expect(
extension.getAllConditions().has('TestExtensionName::PlayerHealth')
@@ -3760,7 +3766,7 @@ describe('libGD.js', function () {
.addParameter('string', 'Some stuff', '', false)
.setParameterLongDescription('Blabla')
.setFunctionName('some.method.to.getPlayerHealth')
.useStandardParameters('number');
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions());
expect(
extension.getAllConditions().has('TestExtensionName::PlayerHealth')
@@ -3799,7 +3805,7 @@ describe('libGD.js', function () {
'Disable.png'
)
.addParameter('object', 'My object', 'MyObject', false)
.useStandardParameters('boolean')
.useStandardParameters('boolean', gd.ParameterOptions.makeNewOptions())
.setFunctionName('setDisabled')
.setGetter('isDisabled');

View File

@@ -26,8 +26,8 @@ declare class gdInstructionMetadata {
setDefaultValue(defaultValue: string): gdInstructionMetadata;
setParameterLongDescription(longDescription: string): gdInstructionMetadata;
setParameterExtraInfo(extraInfo: string): gdInstructionMetadata;
useStandardOperatorParameters(type: string, typeExtraInfo?: string): gdInstructionMetadata;
useStandardRelationalOperatorParameters(type: string, typeExtraInfo?: string): gdInstructionMetadata;
useStandardOperatorParameters(type: string, options: gdParameterOptions): gdInstructionMetadata;
useStandardRelationalOperatorParameters(type: string, options: gdParameterOptions): gdInstructionMetadata;
setRequiresBaseObjectCapability(capability: string): gdInstructionMetadata;
getRequiredBaseObjectCapability(): string;
markAsSimple(): gdInstructionMetadata;

View File

@@ -5,7 +5,7 @@ declare class gdMultipleInstructionMetadata {
setDefaultValue(defaultValue: string): gdMultipleInstructionMetadata;
setParameterLongDescription(longDescription: string): gdMultipleInstructionMetadata;
setParameterExtraInfo(extraInfo: string): gdMultipleInstructionMetadata;
useStandardParameters(type: string, typeExtraInfo?: string): gdMultipleInstructionMetadata;
useStandardParameters(type: string, options: gdParameterOptions): gdMultipleInstructionMetadata;
setHidden(): gdMultipleInstructionMetadata;
setFunctionName(functionName: string): gdMultipleInstructionMetadata;
setGetter(getter: string): gdMultipleInstructionMetadata;

View File

@@ -0,0 +1,8 @@
// Automatically generated by GDevelop.js/scripts/generate-types.js
declare class gdParameterOptions {
setDescription(description: string): gdParameterOptions;
setTypeExtraInfo(typeExtraInfo: string): gdParameterOptions;
static makeNewOptions(): gdParameterOptions;
delete(): void;
ptr: number;
};

View File

@@ -57,6 +57,7 @@ declare class gdProject extends gdObjectsContainer {
hasLayoutNamed(name: string): boolean;
getLayout(name: string): gdLayout;
getLayoutAt(index: number): gdLayout;
moveLayout(oldIndex: number, newIndex: number): void;
swapLayouts(first: number, second: number): void;
getLayoutsCount(): number;
insertNewLayout(name: string, position: number): gdLayout;
@@ -66,6 +67,7 @@ declare class gdProject extends gdObjectsContainer {
hasExternalEventsNamed(name: string): boolean;
getExternalEvents(name: string): gdExternalEvents;
getExternalEventsAt(index: number): gdExternalEvents;
moveExternalEvents(oldIndex: number, newIndex: number): void;
swapExternalEvents(first: number, second: number): void;
getExternalEventsCount(): number;
insertNewExternalEvents(name: string, position: number): gdExternalEvents;
@@ -73,6 +75,7 @@ declare class gdProject extends gdObjectsContainer {
hasExternalLayoutNamed(name: string): boolean;
getExternalLayout(name: string): gdExternalLayout;
getExternalLayoutAt(index: number): gdExternalLayout;
moveExternalLayout(oldIndex: number, newIndex: number): void;
swapExternalLayouts(first: number, second: number): void;
getExternalLayoutsCount(): number;
insertNewExternalLayout(name: string, position: number): gdExternalLayout;
@@ -80,6 +83,7 @@ declare class gdProject extends gdObjectsContainer {
hasEventsFunctionsExtensionNamed(name: string): boolean;
getEventsFunctionsExtension(name: string): gdEventsFunctionsExtension;
getEventsFunctionsExtensionAt(index: number): gdEventsFunctionsExtension;
moveEventsFunctionsExtension(oldIndex: number, newIndex: number): void;
swapEventsFunctionsExtensions(first: number, second: number): void;
getEventsFunctionsExtensionsCount(): number;
insertNewEventsFunctionsExtension(name: string, position: number): gdEventsFunctionsExtension;

View File

@@ -116,6 +116,7 @@ declare class libGDevelop {
InstructionSentenceFormatter: Class<gdInstructionSentenceFormatter>;
ExtraInformation: Class<gdExtraInformation>;
ExpressionCodeGenerationInformation: Class<gdExpressionCodeGenerationInformation>;
ParameterOptions: Class<gdParameterOptions>;
InstructionMetadata: Class<gdInstructionMetadata>;
ExpressionMetadata: Class<gdExpressionMetadata>;
MultipleInstructionMetadata: Class<gdMultipleInstructionMetadata>;

View File

@@ -50,10 +50,11 @@ const buildSW = () => {
globDirectory: buildPath,
globPatterns: [
// Application:
'!(libGD)*.{js,css,html,png}', // Root files...
'!(libGD)*.{js,css,html,png}', // Root files.
'static/css/*.css',
'static/media/*',
'static/js/!(locales-|local-app)*.js',
'static/js/locales-*.js', // Locales.
'static/js/!local-app*.js', // Exclude electron app.
// ...But not libGD.js/wasm (there are cached with their URL
// query string that depends on the VersionMetadata, see below).

View File

@@ -15,7 +15,7 @@ import {
} from '../Utils/GDevelopServices/Asset';
import PlaceholderLoader from '../UI/PlaceholderLoader';
import PlaceholderError from '../UI/PlaceholderError';
import { ResponsiveLineStackLayout } from '../UI/Layout';
import { LineStackLayout, ResponsiveLineStackLayout } from '../UI/Layout';
import { CorsAwareImage } from '../UI/CorsAwareImage';
import { AssetStoreContext } from './AssetStoreContext';
import Window from '../Utils/Window';
@@ -35,6 +35,11 @@ import PrivateAssetsAuthorizationContext from './PrivateAssets/PrivateAssetsAuth
import AuthorizedAssetImage from './PrivateAssets/AuthorizedAssetImage';
import { MarkdownText } from '../UI/MarkdownText';
import Paper from '../UI/Paper';
import PublicProfileContext from '../Profile/PublicProfileContext';
import {
getUserPublicProfilesByIds,
type UserPublicProfile,
} from '../Utils/GDevelopServices/User';
const FIXED_HEIGHT = 250;
const FIXED_WIDTH = 300;
@@ -78,7 +83,6 @@ const makeFirstLetterUppercase = (str: string) =>
str.charAt(0).toUpperCase() + str.slice(1);
type Props = {|
project: gdProject,
onTagSelection: (tag: string) => void,
assetShortHeader: AssetShortHeader,
onOpenDetails: (assetShortHeader: AssetShortHeader) => void,
@@ -104,13 +108,7 @@ export type AssetDetailsInterface = {|
export const AssetDetails = React.forwardRef<Props, AssetDetailsInterface>(
(
{
project,
onTagSelection,
assetShortHeader,
onOpenDetails,
onAssetLoaded,
}: Props,
{ onTagSelection, assetShortHeader, onOpenDetails, onAssetLoaded }: Props,
ref
) => {
const {
@@ -131,6 +129,10 @@ export const AssetDetails = React.forwardRef<Props, AssetDetailsInterface>(
const { fetchPrivateAsset } = React.useContext(
PrivateAssetsAuthorizationContext
);
const { openUserPublicProfile } = React.useContext(PublicProfileContext);
const [authorPublicProfiles, setAuthorPublicProfiles] = React.useState<
UserPublicProfile[]
>([]);
const scrollView = React.useRef<?ScrollViewInterface>(null);
React.useImperativeHandle(ref, () => ({
@@ -204,6 +206,33 @@ export const AssetDetails = React.forwardRef<Props, AssetDetailsInterface>(
[loadAsset]
);
const loadAuthorPublicProfiles = React.useCallback(
async () => {
try {
const authorIds: Array<string> = (asset && asset.authorIds) || [];
if (authorIds.length === 0) return;
const userPublicProfileByIds = await getUserPublicProfilesByIds(
authorIds
);
const userPublicProfiles = Object.keys(userPublicProfileByIds).map(
id => userPublicProfileByIds[id]
);
setAuthorPublicProfiles(userPublicProfiles);
} catch (error) {
// Catch error, but don't display it to the user.
console.error('Error while loading author public profiles:', error);
}
},
[asset]
);
React.useEffect(
() => {
loadAuthorPublicProfiles();
},
[loadAuthorPublicProfiles]
);
const assetAuthors: ?Array<Author> =
asset && authors
? asset.authors
@@ -212,6 +241,13 @@ export const AssetDetails = React.forwardRef<Props, AssetDetailsInterface>(
})
.filter(Boolean)
: [];
const areAuthorsLoading =
!asset || // Asset not loaded.
(asset.authors.length > 0 && !authors) || // Authors not loaded.
(asset.authorIds && // User public profiles not loaded.
authorPublicProfiles.length > 0 &&
authorPublicProfiles.length === 0);
const assetLicense =
asset && licenses
? licenses.find(({ name }) => name === asset.license)
@@ -246,17 +282,18 @@ export const AssetDetails = React.forwardRef<Props, AssetDetailsInterface>(
<Column expand noMargin>
<Line justifyContent="space-between" noMargin>
<Column>
<Line alignItems="baseline" noMargin>
<LineStackLayout alignItems="baseline" noMargin>
<Text size="block-title" displayInlineAsSpan>
{assetShortHeader.name}
</Text>
<Spacer />
{asset && (
<Text size="body">
<Trans>by</Trans>{' '}
{!areAuthorsLoading && (
<LineStackLayout noMargin>
<Text size="body">
<Trans>by</Trans>
</Text>
{!!assetAuthors &&
assetAuthors.map(author => {
return (
assetAuthors.map(author => (
<Text size="body">
<Link
key={author.name}
href={author.website}
@@ -266,11 +303,29 @@ export const AssetDetails = React.forwardRef<Props, AssetDetailsInterface>(
>
{author.name}
</Link>
</Text>
))}
{!!authorPublicProfiles.length &&
authorPublicProfiles.map(userPublicProfile => {
const username =
userPublicProfile.username || 'GDevelop user';
return (
<Text size="body">
<Link
key={userPublicProfile.id}
href="#"
onClick={() =>
openUserPublicProfile(userPublicProfile.id)
}
>
{username}
</Link>
</Text>
);
})}
</Text>
</LineStackLayout>
)}
</Line>
</LineStackLayout>
<Line alignItems="center">
<div style={{ flexWrap: 'wrap' }}>
{assetShortHeader.tags.slice(0, 5).map((tag, index) => (
@@ -322,7 +377,6 @@ export const AssetDetails = React.forwardRef<Props, AssetDetailsInterface>(
return resource ? resource.file : '';
}}
isImageResourceSmooth={() => isImageResourceSmooth}
project={project}
timeBetweenFrames={direction.timeBetweenFrames}
isLooping // Always loop in the asset store.
hideCheckeredBackground
@@ -463,6 +517,7 @@ export const AssetDetails = React.forwardRef<Props, AssetDetailsInterface>(
</ResponsiveLineStackLayout>
{asset && (
<Column expand>
<Spacer />
<Line noMargin>
<Text size="block-title" displayInlineAsSpan>
<Trans>You might like</Trans>

View File

@@ -20,17 +20,26 @@ import LinearProgress from '../UI/LinearProgress';
import { AssetStoreContext } from './AssetStoreContext';
import PrivateAssetsAuthorizationContext from './PrivateAssets/PrivateAssetsAuthorizationContext';
import { type ResourceManagementProps } from '../ResourcesList/ResourceSource';
import PromisePool from '@supercharge/promise-pool';
import { ColumnStackLayout } from '../UI/Layout';
import Radio from '@material-ui/core/Radio';
import RadioGroup from '@material-ui/core/RadioGroup';
import { mapFor } from '../Utils/MapFor';
import FormControlLabel from '@material-ui/core/FormControlLabel';
import AlertMessage from '../UI/AlertMessage';
import { type InstallAssetOutput } from './InstallAsset';
type Props = {|
assetPack: PublicAssetPack | PrivateAssetPack,
assetPack: PublicAssetPack | PrivateAssetPack | null,
assetShortHeaders: Array<AssetShortHeader>,
addedAssetIds: Array<string>,
addedAssetIds: Set<string>,
onClose: () => void,
onAssetsAdded: () => void,
project: gdProject,
objectsContainer: gdObjectsContainer,
objectsContainer: ?gdObjectsContainer,
onObjectAddedFromAsset: (object: gdObject) => void,
resourceManagementProps: ResourceManagementProps,
canInstallPrivateAsset: () => boolean,
|};
const AssetPackInstallDialog = ({
@@ -42,10 +51,11 @@ const AssetPackInstallDialog = ({
project,
objectsContainer,
onObjectAddedFromAsset,
canInstallPrivateAsset,
resourceManagementProps,
}: Props) => {
const missingAssetShortHeaders = assetShortHeaders.filter(
assetShortHeader => !addedAssetIds.includes(assetShortHeader.id)
assetShortHeader => !addedAssetIds.has(assetShortHeader.id)
);
const allAssetsInstalled = missingAssetShortHeaders.length === 0;
const noAssetsInstalled =
@@ -56,6 +66,17 @@ const AssetPackInstallDialog = ({
areAssetsBeingInstalled,
setAreAssetsBeingInstalled,
] = React.useState<boolean>(false);
const hasPrivateAssets = React.useMemo(
() =>
assetShortHeaders.some(assetShortHeader =>
isPrivateAsset(assetShortHeader)
),
[assetShortHeaders]
);
const canUserInstallPrivateAsset = React.useMemo(
() => canInstallPrivateAsset(),
[canInstallPrivateAsset]
);
const eventsFunctionsExtensionsState = React.useContext(
EventsFunctionsExtensionsContext
@@ -66,26 +87,71 @@ const AssetPackInstallDialog = ({
const { environment } = React.useContext(AssetStoreContext);
const [selectedLayoutName, setSelectedLayoutName] = React.useState<string>(
''
);
const layoutNames = mapFor(0, project.getLayoutsCount(), i => {
return project.getLayoutAt(i).getName();
});
const sceneChooser = objectsContainer ? null : ( // The objects container where to add assets objects is already given.
// Give the choice to the user to choose where to add assets objects.
<ColumnStackLayout noMargin>
<Text>
<Trans>Choose where to add the assets:</Trans>
</Text>
<RadioGroup
aria-label="Associated scene"
name="associated-layout"
value={selectedLayoutName}
onChange={event => setSelectedLayoutName(event.target.value)}
>
<FormControlLabel
value={''}
control={<Radio color="secondary" />}
label={<Trans>Global objects in the project</Trans>}
disabled={areAssetsBeingInstalled}
/>
{layoutNames.map(name => (
<FormControlLabel
key={name}
value={name}
control={<Radio color="secondary" />}
label={name}
disabled={areAssetsBeingInstalled}
/>
))}
</RadioGroup>
</ColumnStackLayout>
);
const targetObjectsContainer: gdObjectsContainer =
objectsContainer ||
(project.hasLayoutNamed(selectedLayoutName)
? project.getLayout(selectedLayoutName)
: project);
const onInstallAssets = React.useCallback(
async (assetShortHeaders: Array<AssetShortHeader>) => {
if (!assetShortHeaders || !assetShortHeaders.length) return;
setAreAssetsBeingInstalled(true);
try {
const installOutputs = await Promise.all(
assetShortHeaders.map(async assetShortHeader => {
// Use a pool to avoid installing an unbounded amount of assets at the same time.
const { results, errors } = await PromisePool.withConcurrency(6)
.for(assetShortHeaders)
.process<InstallAssetOutput>(async assetShortHeader => {
const installOutput = isPrivateAsset(assetShortHeader)
? await installPrivateAsset({
assetShortHeader,
eventsFunctionsExtensionsState,
project,
objectsContainer,
objectsContainer: targetObjectsContainer,
environment,
})
: await installPublicAsset({
assetShortHeader,
eventsFunctionsExtensionsState,
project,
objectsContainer,
objectsContainer: targetObjectsContainer,
environment,
});
@@ -94,10 +160,16 @@ const AssetPackInstallDialog = ({
}
return installOutput;
})
);
});
installOutputs.forEach(installOutput => {
if (errors.length) {
throw new Error(
'Error(s) while installing assets. The first error is: ' +
errors[0].message
);
}
results.forEach(installOutput => {
installOutput.createdObjects.forEach(object => {
onObjectAddedFromAsset(object);
});
@@ -121,7 +193,7 @@ const AssetPackInstallDialog = ({
[
eventsFunctionsExtensionsState,
project,
objectsContainer,
targetObjectsContainer,
onObjectAddedFromAsset,
onAssetsAdded,
environment,
@@ -130,100 +202,124 @@ const AssetPackInstallDialog = ({
]
);
const dialogContent = areAssetsBeingInstalled
? {
actionButton: (
<TextButton
key="loading"
label={<Trans>Please wait...</Trans>}
disabled
onClick={() => {}}
/>
),
onApply: () => {},
content: (
<>
const dialogContent =
hasPrivateAssets && !canUserInstallPrivateAsset
? {
actionButton: (
<RaisedButton
key="continue"
label={<Trans>Add the assets</Trans>}
primary
disabled
onClick={() => {}}
/>
),
onApply: () => {},
content: (
<AlertMessage kind="warning">
<Text>
<Trans>
You need to save this project as a cloud project to install
premium assets. Please save your project and try again.
</Trans>
</Text>
</AlertMessage>
),
}
: areAssetsBeingInstalled
? {
actionButton: (
<TextButton
key="loading"
label={<Trans>Please wait...</Trans>}
disabled
onClick={() => {}}
/>
),
onApply: () => {},
content: (
<>
<Text>
<Trans>Installing assets...</Trans>
</Text>
<Line expand>
<LinearProgress />
</Line>
</>
),
}
: allAssetsInstalled
? {
actionButton: (
<RaisedButton
key="install-again"
label={<Trans>Install again</Trans>}
primary={false}
onClick={() => onInstallAssets(assetShortHeaders)}
/>
),
onApply: () => onInstallAssets(assetShortHeaders),
content: (
<Text>
<Trans>Installing assets...</Trans>
<Trans>
You already have these {assetShortHeaders.length} assets
installed, do you want to add them again?
</Trans>
</Text>
<Line expand>
<LinearProgress />
</Line>
</>
),
}
: allAssetsInstalled
? {
actionButton: (
<RaisedButton
key="install-again"
label={<Trans>Install again</Trans>}
primary={false}
onClick={() => onInstallAssets(assetShortHeaders)}
/>
),
onApply: () => onInstallAssets(assetShortHeaders),
content: (
<Text>
<Trans>
You already have these {assetShortHeaders.length} assets
installed, do you want to add them again?
</Trans>
</Text>
),
}
: noAssetsInstalled
? {
actionButton: (
<RaisedButton
key="continue"
label={<Trans>Continue</Trans>}
primary
onClick={() => onInstallAssets(assetShortHeaders)}
/>
),
onApply: () => onInstallAssets(assetShortHeaders),
content: (
<Text>
<Trans>
You're about to add {assetShortHeaders.length} assets. Continue?
</Trans>
</Text>
),
}
: {
actionButton: (
<RaisedButtonWithSplitMenu
label={<Trans>Install the missing assets</Trans>}
key="install-missing"
primary
onClick={() => {
onInstallAssets(missingAssetShortHeaders);
}}
buildMenuTemplate={i18n => [
{
label: i18n._(t`Install all the assets`),
click: () => onInstallAssets(assetShortHeaders),
},
]}
/>
),
onApply: () => onInstallAssets(missingAssetShortHeaders),
content: (
<Text>
<Trans>
You already have{' '}
{assetShortHeaders.length - missingAssetShortHeaders.length}{' '}
asset(s) in your scene. Do you want to add the remaining{' '}
{missingAssetShortHeaders.length} one(s)?
</Trans>
</Text>
),
};
),
}
: noAssetsInstalled
? {
actionButton: (
<RaisedButton
key="continue"
label={<Trans>Add the assets</Trans>}
primary
onClick={() => onInstallAssets(assetShortHeaders)}
/>
),
onApply: () => onInstallAssets(assetShortHeaders),
content: (
<Text>
<Trans>
You're about to add {assetShortHeaders.length} assets.
</Trans>
</Text>
),
}
: {
actionButton: (
<RaisedButtonWithSplitMenu
label={<Trans>Install the missing assets</Trans>}
key="install-missing"
primary
onClick={() => {
onInstallAssets(missingAssetShortHeaders);
}}
buildMenuTemplate={i18n => [
{
label: i18n._(t`Install all the assets`),
click: () => onInstallAssets(assetShortHeaders),
},
]}
/>
),
onApply: () => onInstallAssets(missingAssetShortHeaders),
content: (
<Text>
<Trans>
You already have{' '}
{assetShortHeaders.length - missingAssetShortHeaders.length}{' '}
asset(s) in your scene. Do you want to add the remaining{' '}
{missingAssetShortHeaders.length} one(s)?
</Trans>
</Text>
),
};
return (
<Dialog
title={assetPack.name}
title={assetPack ? assetPack.name : <Trans>Assets</Trans>}
maxWidth="sm"
open
onRequestClose={() => {
@@ -243,7 +339,10 @@ const AssetPackInstallDialog = ({
]}
onApply={dialogContent.onApply}
>
<Column noMargin>{dialogContent.content}</Column>
<Column noMargin>
{dialogContent.content}
{sceneChooser}
</Column>
</Dialog>
);
};

View File

@@ -33,6 +33,11 @@ import {
import { type ChosenCategory } from '../UI/Search/FiltersChooser';
import shuffle from 'lodash/shuffle';
import AuthenticatedUserContext from '../Profile/AuthenticatedUserContext';
import {
getAssetPackFromUserFriendlySlug,
getPrivateAssetPackListingData,
} from './AssetStoreUtils';
import useAlertDialog from '../UI/Alert/useAlertDialog';
const defaultSearchText = '';
@@ -74,6 +79,7 @@ type AssetStoreState = {|
chosenFilters: ?Set<string>,
searchFilters: Array<SearchFilter<AssetShortHeader>>
) => ?Array<AssetShortHeader>,
setInitialPackUserFriendlySlug: (initialPackUserFriendlySlug: string) => void,
|};
export const AssetStoreContext = React.createContext<AssetStoreState>({
@@ -105,20 +111,21 @@ export const AssetStoreContext = React.createContext<AssetStoreState>({
setLicenseFilter: filter => {},
},
navigationState: {
previousPages: [assetStoreHomePageState],
getCurrentPage: () => assetStoreHomePageState,
backToPreviousPage: () => {},
openHome: () => {},
clearHistory: () => {},
openSearchIfNeeded: () => {},
activateTextualSearch: () => {},
openTagPage: string => {},
openPackPage: AssetPack => {},
openDetailPage: stAssetShortHeaderring => {},
openTagPage: tag => {},
openPackPage: assetPack => {},
openDetailPage: assetShortHeader => {},
openPrivateAssetPackInformationPage: privateAssetPackListingData => {},
},
currentPage: assetStoreHomePageState,
useSearchItem: (searchText, chosenCategory, chosenFilters, searchFilters) =>
null,
setInitialPackUserFriendlySlug: (initialPackUserFriendlySlug: string) => {},
});
type AssetStoreStateProviderProps = {|
@@ -151,7 +158,7 @@ export const AssetStoreStateProvider = ({
publicAssetShortHeaders,
setPublicAssetShortHeaders,
] = React.useState<?Array<AssetShortHeader>>(null);
const { receivedAssetShortHeaders } = React.useContext(
const { receivedAssetShortHeaders, receivedAssetPacks } = React.useContext(
AuthenticatedUserContext
);
const [filters, setFilters] = React.useState<?Filters>(null);
@@ -171,6 +178,9 @@ export const AssetStoreStateProvider = ({
const [licenses, setLicenses] = React.useState<?Array<License>>(null);
const [environment, setEnvironment] = React.useState<Environment>('live');
const [error, setError] = React.useState<?Error>(null);
const initialPackUserFriendlySlug = React.useRef<?string>(null);
const initialPackOpened = React.useRef<boolean>(false);
const { showAlert } = useAlertDialog();
const [searchText, setSearchText] = React.useState(defaultSearchText);
const navigationState = useNavigation();
@@ -292,6 +302,63 @@ export const AssetStoreStateProvider = ({
[publicAssetShortHeaders, receivedAssetShortHeaders]
);
// When the asset packs (public and received private packs) are loaded,
// open the asset pack with the slug that was asked to be initially loaded.
React.useEffect(
() => {
if (initialPackOpened.current) {
// The pack was already opened, don't re-open it again even
// if the effect run again.
return;
}
const userFriendlySlug = initialPackUserFriendlySlug.current;
if (
publicAssetPacks &&
receivedAssetPacks &&
privateAssetPacks &&
userFriendlySlug
) {
initialPackOpened.current = true;
// Try to first find a public or received asset pack.
const assetPack = getAssetPackFromUserFriendlySlug({
publicAssetPacks,
receivedAssetPacks,
userFriendlySlug,
});
if (assetPack) {
navigationState.openPackPage(assetPack);
return;
}
// Otherwise, try to open the information page of a pack not yet bought.
const privateAssetPack = getPrivateAssetPackListingData({
privateAssetPacks,
userFriendlySlug,
});
if (privateAssetPack) {
navigationState.openPrivateAssetPackInformationPage(privateAssetPack);
return;
}
showAlert({
title: `Asset pack not found`,
message: `The link to the asset pack you've followed seems outdated. Why not take a look at the other packs in the asset store?`,
});
}
},
[
publicAssetPacks,
receivedAssetPacks,
privateAssetPacks,
navigationState,
showAlert,
]
);
React.useEffect(
() => {
// the callback fetchAssetsAndFilters depends on the environment,
@@ -331,6 +398,13 @@ export const AssetStoreStateProvider = ({
searchFilters
);
const setInitialPackUserFriendlySlug = React.useCallback(
(newInitialPackUserFriendlySlug: string) => {
initialPackUserFriendlySlug.current = newInitialPackUserFriendlySlug;
},
[]
);
const assetStoreState = React.useMemo(
() => ({
searchResults,
@@ -376,6 +450,7 @@ export const AssetStoreStateProvider = ({
chosenFilters,
searchFilters
),
setInitialPackUserFriendlySlug,
}),
[
searchResults,
@@ -400,6 +475,7 @@ export const AssetStoreStateProvider = ({
licenseFilter,
setLicenseFilter,
assetShortHeadersById,
setInitialPackUserFriendlySlug,
]
);

View File

@@ -6,18 +6,19 @@ import {
type PublicAssetPack,
type PrivateAssetPack,
} from '../Utils/GDevelopServices/Asset';
import { type PrivateAssetPackListingData } from '../Utils/GDevelopServices/Shop';
export type AssetStorePageState = {|
isOnHomePage: boolean,
openedAssetPack: PublicAssetPack | PrivateAssetPack | null,
openedAssetShortHeader: ?AssetShortHeader,
openedPrivateAssetPackListingData: ?PrivateAssetPackListingData,
filtersState: FiltersState,
ignoreTextualSearch: boolean,
scrollPosition?: ?number,
|};
export type NavigationState = {|
previousPages: Array<AssetStorePageState>,
getCurrentPage: () => AssetStorePageState,
backToPreviousPage: () => void,
openHome: () => void,
@@ -26,6 +27,7 @@ export type NavigationState = {|
activateTextualSearch: () => void,
openTagPage: string => void,
openPackPage: (PublicAssetPack | PrivateAssetPack) => void,
openPrivateAssetPackInformationPage: PrivateAssetPackListingData => void,
openDetailPage: AssetShortHeader => void,
|};
@@ -41,6 +43,7 @@ export const assetStoreHomePageState: AssetStorePageState = {
isOnHomePage: true,
openedAssetShortHeader: null,
openedAssetPack: null,
openedPrivateAssetPackListingData: null,
filtersState: noFilter,
ignoreTextualSearch: false,
};
@@ -49,6 +52,7 @@ const searchPageState: AssetStorePageState = {
isOnHomePage: false,
openedAssetShortHeader: null,
openedAssetPack: null,
openedPrivateAssetPackListingData: null,
filtersState: noFilter,
ignoreTextualSearch: false,
};
@@ -63,91 +67,123 @@ export const useNavigation = (): NavigationState => {
});
const previousPages = history.previousPages;
return {
previousPages,
getCurrentPage: () => previousPages[previousPages.length - 1],
backToPreviousPage: () => {
if (previousPages.length > 1) {
previousPages.pop();
setHistory({ previousPages });
}
},
openHome: () => {
previousPages.length = 0;
previousPages.push(assetStoreHomePageState);
setHistory({ previousPages });
},
clearHistory: () => {
const currentPage = previousPages[previousPages.length - 1];
previousPages.length = 0;
previousPages.push(assetStoreHomePageState);
previousPages.push(currentPage);
setHistory({ previousPages });
},
openSearchIfNeeded: () => {
const currentPage = previousPages[previousPages.length - 1];
if (currentPage.isOnHomePage || currentPage.openedAssetShortHeader) {
previousPages.push(searchPageState);
setHistory({ previousPages });
}
},
activateTextualSearch: () => {
const currentPage = previousPages[previousPages.length - 1];
if (currentPage.isOnHomePage || currentPage.openedAssetShortHeader) {
previousPages.push(searchPageState);
setHistory({ previousPages });
} else if (currentPage.ignoreTextualSearch) {
currentPage.ignoreTextualSearch = false;
setHistory({ previousPages });
}
},
openTagPage: (tag: string) => {
previousPages.push({
isOnHomePage: false,
openedAssetShortHeader: null,
openedAssetPack: null,
filtersState: {
chosenCategory: {
node: { name: tag, allChildrenTags: [], children: [] },
parentNodes: [],
},
chosenFilters: new Set(),
addFilter: () => {},
removeFilter: () => {},
setChosenCategory: () => {},
},
ignoreTextualSearch: true,
});
setHistory({ previousPages });
},
openPackPage: (assetPack: PublicAssetPack | PrivateAssetPack) => {
previousPages.push({
isOnHomePage: false,
openedAssetShortHeader: null,
openedAssetPack: assetPack,
filtersState: {
chosenCategory: {
node: { name: assetPack.tag, allChildrenTags: [], children: [] },
parentNodes: [],
},
chosenFilters: new Set(),
addFilter: () => {},
removeFilter: () => {},
setChosenCategory: () => {},
},
ignoreTextualSearch: true,
});
setHistory({ previousPages });
},
openDetailPage: (assetShortHeader: AssetShortHeader) => {
previousPages.push({
isOnHomePage: false,
openedAssetShortHeader: assetShortHeader,
openedAssetPack: null,
filtersState: noFilter,
ignoreTextualSearch: true,
});
setHistory({ previousPages });
},
};
return React.useMemo(
() => ({
getCurrentPage: () => previousPages[previousPages.length - 1],
backToPreviousPage: () => {
if (previousPages.length > 1) {
setHistory({
previousPages: previousPages.slice(0, previousPages.length - 1),
});
}
},
openHome: () => {
setHistory({ previousPages: [assetStoreHomePageState] });
},
clearHistory: () => {
const currentPage = previousPages[previousPages.length - 1];
setHistory({ previousPages: [assetStoreHomePageState, currentPage] });
},
openSearchIfNeeded: () => {
const currentPage = previousPages[previousPages.length - 1];
if (currentPage.isOnHomePage || currentPage.openedAssetShortHeader) {
setHistory({ previousPages: [...previousPages, searchPageState] });
}
},
activateTextualSearch: () => {
const currentPage = previousPages[previousPages.length - 1];
if (currentPage.isOnHomePage || currentPage.openedAssetShortHeader) {
setHistory({ previousPages: [...previousPages, searchPageState] });
} else if (currentPage.ignoreTextualSearch) {
currentPage.ignoreTextualSearch = false;
setHistory({ previousPages: [...previousPages] });
}
},
openTagPage: (tag: string) => {
setHistory({
previousPages: [
...previousPages,
{
isOnHomePage: false,
openedAssetShortHeader: null,
openedAssetPack: null,
openedPrivateAssetPackListingData: null,
filtersState: {
chosenCategory: {
node: { name: tag, allChildrenTags: [], children: [] },
parentNodes: [],
},
chosenFilters: new Set(),
addFilter: () => {},
removeFilter: () => {},
setChosenCategory: () => {},
},
ignoreTextualSearch: true,
},
],
});
},
openPackPage: (assetPack: PublicAssetPack | PrivateAssetPack) => {
setHistory({
previousPages: [
...previousPages,
{
isOnHomePage: false,
openedAssetShortHeader: null,
openedAssetPack: assetPack,
openedPrivateAssetPackListingData: null,
filtersState: {
chosenCategory: {
node: {
name: assetPack.tag,
allChildrenTags: [],
children: [],
},
parentNodes: [],
},
chosenFilters: new Set(),
addFilter: () => {},
removeFilter: () => {},
setChosenCategory: () => {},
},
ignoreTextualSearch: true,
},
],
});
},
openPrivateAssetPackInformationPage: (
assetPack: PrivateAssetPackListingData
) => {
setHistory({
previousPages: [
...previousPages,
{
isOnHomePage: false,
openedAssetShortHeader: null,
openedAssetPack: null,
openedPrivateAssetPackListingData: assetPack,
filtersState: noFilter,
ignoreTextualSearch: true,
},
],
});
},
openDetailPage: (assetShortHeader: AssetShortHeader) => {
setHistory({
previousPages: [
...previousPages,
{
isOnHomePage: false,
openedAssetShortHeader: assetShortHeader,
openedAssetPack: null,
openedPrivateAssetPackListingData: null,
filtersState: noFilter,
ignoreTextualSearch: true,
},
],
});
},
}),
[previousPages]
);
};

View File

@@ -0,0 +1,100 @@
// @flow
import {
type PublicAssetPacks,
type PrivateAssetPack,
type PublicAssetPack,
} from '../Utils/GDevelopServices/Asset';
import { type PrivateAssetPackListingData } from '../Utils/GDevelopServices/Shop';
/**
* A simple slug generator that allows to link to asset packs on
* the app and on the website.
*
* The website has a similar implementation (which is at least retro-compatible),
* so that asset packs can be opened from an URL containing their slug.
*/
const slugify = (incString: string): string => {
const p = ['.', '=', '-'];
const s = '-';
return incString
.toLowerCase()
.replace(/ü/g, 'ue')
.replace(/ä/g, 'ae')
.replace(/ö/g, 'oe')
.replace(/ß/g, 'ss')
.replace(new RegExp('[' + p.join('') + ']', 'g'), ' ') // replace preserved characters with spaces
.replace(/-{2,}/g, ' ') // remove duplicate spaces
.replace(/^\s\s*/, '')
.replace(/\s\s*$/, '') // trim both sides of string
.replace(/[^\w ]/gi, '') // replaces all non-alphanumeric with empty string
.replace(/[ ]/gi, s); // Convert spaces to dashes
};
const getPublicAssetPackUserFriendlySlug = (
publicAssetPack: PublicAssetPack
) => {
return `${slugify(publicAssetPack.name)}-${slugify(publicAssetPack.tag)}`;
};
const getIdFromPrivateAssetPackUserFriendlySlug = (slug: string) =>
slug.slice(-36);
const findPublicAssetPackWithUserFriendlySlug = (
publisAssetPacks: PublicAssetPacks,
userFriendlySlug: string
): PublicAssetPack | null => {
for (const publicAssetPack of publisAssetPacks.starterPacks) {
const publicAssetPackUserFriendlySlug = getPublicAssetPackUserFriendlySlug(
publicAssetPack
);
if (publicAssetPackUserFriendlySlug === userFriendlySlug)
return publicAssetPack;
}
return null;
};
export const getAssetPackFromUserFriendlySlug = ({
receivedAssetPacks,
publicAssetPacks,
userFriendlySlug,
}: {|
receivedAssetPacks: Array<PrivateAssetPack>,
publicAssetPacks: PublicAssetPacks,
userFriendlySlug: string,
|}): PublicAssetPack | PrivateAssetPack | null => {
const receivedAssetPackId = getIdFromPrivateAssetPackUserFriendlySlug(
userFriendlySlug
);
const receivedAssetPack = receivedAssetPacks.find(
privateAssetPack => receivedAssetPackId === privateAssetPack.id
);
if (receivedAssetPack) return receivedAssetPack;
const publicAssetPack = findPublicAssetPackWithUserFriendlySlug(
publicAssetPacks,
userFriendlySlug
);
if (publicAssetPack) return publicAssetPack;
return null;
};
export const getPrivateAssetPackListingData = ({
privateAssetPacks,
userFriendlySlug,
}: {|
privateAssetPacks: Array<PrivateAssetPackListingData>,
userFriendlySlug: string,
|}): ?PrivateAssetPackListingData => {
const privateAssetPackId = getIdFromPrivateAssetPackUserFriendlySlug(
userFriendlySlug
);
const privateAssetPack = privateAssetPacks.find(
privateAssetPack => privateAssetPackId === privateAssetPack.id
);
if (privateAssetPack) return privateAssetPack;
return null;
};

View File

@@ -0,0 +1,46 @@
// @flow
import { mapFor } from '../Utils/MapFor';
const enumerateObjectsContainerAssetStoreIds = (
objectsContainer: gdObjectsContainer
): Set<string> => {
const assetStoreIds = new Set<string>();
mapFor(0, objectsContainer.getObjectsCount(), i => {
const assetStoreId = objectsContainer.getObjectAt(i).getAssetStoreId();
if (assetStoreId) assetStoreIds.add(assetStoreId);
});
return assetStoreIds;
};
export const enumerateAssetStoreIds = (
project: gdProject,
objectsContainer: ?gdObjectsContainer
): Set<string> => {
// Add asset store ids of global objects.
let allAssetStoreIds = enumerateObjectsContainerAssetStoreIds(project);
if (objectsContainer) {
// Add either the asset store ids of the specified objects container (i.e: a single scene)...
const objectsContainerAssetStoreIds = enumerateObjectsContainerAssetStoreIds(
objectsContainer
);
allAssetStoreIds = new Set([
...allAssetStoreIds,
...objectsContainerAssetStoreIds,
]);
} else {
// Or the asset store ids of all the objects of all the scenes of the project.
mapFor(0, project.getLayoutsCount(), i => {
const scene = project.getLayoutAt(i);
allAssetStoreIds = new Set([
...allAssetStoreIds,
...enumerateObjectsContainerAssetStoreIds(scene),
]);
});
}
return allAssetStoreIds;
};

View File

@@ -0,0 +1,67 @@
// @flow
import { enumerateAssetStoreIds } from './EnumerateAssetStoreIds';
const gd: libGDevelop = global.gd;
describe('enumerateAssetStoreIds', () => {
const makeNewTestProject = (): {|
project: gdProject,
scene1: gdLayout,
scene2: gdLayout,
|} => {
const project = gd.ProjectHelper.createNewGDJSProject();
const globalObject1 = project.insertNewObject(
project,
'Sprite',
'MyGlobalObject',
0
);
globalObject1.setAssetStoreId('1234');
project.insertNewObject(project, 'Sprite', 'MyGlobalObject2', 1);
const globalObject3 = project.insertNewObject(
project,
'Sprite',
'MyGlobalObject3',
2
);
globalObject3.setAssetStoreId('56-78');
const scene1 = project.insertNewLayout('Scene 1', 0);
scene1
.insertNewObject(project, 'Sprite', 'Scene1Object1', 0)
.setAssetStoreId('abcd');
scene1.insertNewObject(project, 'Sprite', 'Scene1Object2', 0);
const scene2 = project.insertNewLayout('Scene 2', 0);
scene2
.insertNewObject(project, 'Sprite', 'Scene2Object1', 0)
.setAssetStoreId('efgh');
scene2.insertNewObject(project, 'Sprite', 'Scene2Object2', 0);
return { project, scene1, scene2 };
};
test('enumerate asset store ids for a full project', () => {
const { project } = makeNewTestProject();
expect([...enumerateAssetStoreIds(project, null)].sort()).toEqual(
['1234', '56-78', 'abcd', 'efgh'].sort()
);
project.delete();
});
test('enumerate asset store ids for a specific scene', () => {
const { project, scene1, scene2 } = makeNewTestProject();
const scene1AssetStoreIds = [
...enumerateAssetStoreIds(project, scene1),
].sort();
expect(scene1AssetStoreIds).toEqual(['1234', '56-78', 'abcd'].sort());
const scene2AssetStoreIds = [
...enumerateAssetStoreIds(project, scene2),
].sort();
expect(scene2AssetStoreIds).toEqual(['1234', '56-78', 'efgh'].sort());
project.delete();
});
});

View File

@@ -8,7 +8,6 @@ import ListIcon from '../UI/ListIcon';
import Subheader from '../UI/Subheader';
import { List, ListItem } from '../UI/List';
import {
enumerateObjects,
enumerateObjectTypes,
type EnumeratedObjectMetadata,
} from '../ObjectsList/EnumerateObjects';
@@ -36,6 +35,7 @@ import { isPrivateAsset } from '../Utils/GDevelopServices/Asset';
import useAlertDialog from '../UI/Alert/useAlertDialog';
import { translateExtensionCategory } from '../Utils/Extension/ExtensionCategories';
import { useResponsiveWindowWidth } from '../UI/Reponsive/ResponsiveWindowMeasurer';
import { enumerateAssetStoreIds } from './EnumerateAssetStoreIds';
const isDev = Window.isDev();
const ObjectListItem = ({
@@ -148,10 +148,10 @@ export default function NewObjectDialog({
isAssetPackDialogInstallOpen,
setIsAssetPackDialogInstallOpen,
] = React.useState(false);
const { containerObjectsList } = enumerateObjects(project, objectsContainer);
const addedAssetIds = containerObjectsList
.map(({ object }) => object.getAssetStoreId())
.filter(Boolean);
const existingAssetStoreIds = React.useMemo(
() => enumerateAssetStoreIds(project, objectsContainer),
[project, objectsContainer]
);
const [
isAssetBeingInstalled,
setIsAssetBeingInstalled,
@@ -160,7 +160,8 @@ export default function NewObjectDialog({
EventsFunctionsExtensionsContext
);
const isAssetAddedToScene =
openedAssetShortHeader && addedAssetIds.includes(openedAssetShortHeader.id);
openedAssetShortHeader &&
existingAssetStoreIds.has(openedAssetShortHeader.id);
const { installPrivateAsset } = React.useContext(
PrivateAssetsAuthorizationContext
);
@@ -177,8 +178,8 @@ export default function NewObjectDialog({
const canUserInstallPrivateAsset = await canInstallPrivateAsset();
if (!canUserInstallPrivateAsset) {
await showAlert({
title: t`No cloud project`,
message: t`You need to save this project as a cloud project to install this asset. Save your project and try again!`,
title: t`Save your project`,
message: t`You need to save this project as a cloud project to install this asset. Please save your project and try again.`,
});
setIsAssetBeingInstalled(false);
return;
@@ -347,9 +348,7 @@ export default function NewObjectDialog({
/>
}
>
{currentTab === 'asset-store' && (
<AssetStore ref={assetStore} project={project} />
)}
{currentTab === 'asset-store' && <AssetStore ref={assetStore} />}
{currentTab === 'new-object' && (
<ScrollView>
{DismissableTutorialMessage && (
@@ -388,7 +387,7 @@ export default function NewObjectDialog({
<AssetPackInstallDialog
assetPack={openedAssetPack}
assetShortHeaders={searchResults}
addedAssetIds={addedAssetIds}
addedAssetIds={existingAssetStoreIds}
onClose={() => setIsAssetPackDialogInstallOpen(false)}
onAssetsAdded={() => {
setIsAssetPackDialogInstallOpen(false);
@@ -396,6 +395,7 @@ export default function NewObjectDialog({
project={project}
objectsContainer={objectsContainer}
onObjectAddedFromAsset={onObjectAddedFromAsset}
canInstallPrivateAsset={canInstallPrivateAsset}
resourceManagementProps={resourceManagementProps}
/>
)}

View File

@@ -8,9 +8,7 @@ import {
} from '../../Utils/GDevelopServices/Asset';
import Text from '../../UI/Text';
import { t, Trans } from '@lingui/macro';
import Dialog from '../../UI/Dialog';
import PriceTag, { formatPrice } from '../../UI/PriceTag';
import FlatButton from '../../UI/FlatButton';
import { formatPrice } from '../../UI/PriceTag';
import AlertMessage from '../../UI/AlertMessage';
import PlaceholderLoader from '../../UI/PlaceholderLoader';
import { ResponsiveLineStackLayout, LineStackLayout } from '../../UI/Layout';
@@ -30,6 +28,7 @@ import { sendAssetPackBuyClicked } from '../../Utils/Analytics/EventSender';
import { MarkdownText } from '../../UI/MarkdownText';
import Paper from '../../UI/Paper';
import Window from '../../Utils/Window';
import ScrollView from '../../UI/ScrollView';
const sortedContentType = [
'sprite',
@@ -57,14 +56,12 @@ const styles = {
type Props = {|
privateAssetPackListingData: PrivateAssetPackListingData,
onClose: () => void,
onOpenPurchaseDialog: () => void,
isPurchaseDialogOpen: boolean,
|};
const PrivateAssetPackDialog = ({
const PrivateAssetPackInformationPage = ({
privateAssetPackListingData,
onClose,
onOpenPurchaseDialog,
isPurchaseDialogOpen,
}: Props) => {
@@ -151,34 +148,19 @@ const PrivateAssetPackDialog = ({
<I18n>
{({ i18n }) => (
<>
<Dialog
title={name}
maxWidth="lg"
open
onRequestClose={onClose}
actions={[
<FlatButton
key="cancel"
label={<Trans>Cancel</Trans>}
onClick={onClose}
/>,
getBuyButton(i18n),
]}
onApply={onClickBuy}
flexColumnBody
>
{errorText ? (
<Line alignItems="center" justifyContent="center" expand>
<AlertMessage kind="error">{errorText}</AlertMessage>
</Line>
) : isFetching ? (
<Column expand>
<PlaceholderLoader />
</Column>
) : assetPack && sellerPublicProfile ? (
<>
<Column noMargin>
<Text size="body2">
{errorText ? (
<Line alignItems="center" justifyContent="center" expand>
<AlertMessage kind="error">{errorText}</AlertMessage>
</Line>
) : isFetching ? (
<Column expand>
<PlaceholderLoader />
</Column>
) : assetPack && sellerPublicProfile ? (
<Column noOverflowParent expand noMargin>
<ScrollView autoHideScrollbar>
<Column noMargin alignItems="flex-end">
<Text displayInlineAsSpan size="sub-title">
<Trans>by</Trans>{' '}
<Link
onClick={() => setOpenSellerPublicProfileDialog(true)}
@@ -189,12 +171,7 @@ const PrivateAssetPackDialog = ({
</Text>
</Column>
<ResponsiveLineStackLayout noColumnMargin noMargin>
<Column
useFullHeight
expand={windowWidth !== 'small'}
noMargin
noOverflowParent
>
<Column useFullHeight expand noMargin noOverflowParent>
<ResponsiveImagesGallery
imagesUrls={assetPack.previewImageUrls}
altTextTemplate={`Asset pack ${name} preview image {imageIndex}`}
@@ -214,7 +191,9 @@ const PrivateAssetPackDialog = ({
justifyContent="space-between"
alignItems="center"
>
<PriceTag value={prices[0].value} />
<Text noMargin size="block-title">
{formatPrice(i18n, prices[0].value)}
</Text>
{getBuyButton(i18n)}
</Line>
<Text size="body2" displayInlineAsSpan>
@@ -299,9 +278,9 @@ const PrivateAssetPackDialog = ({
</Paper>
</Column>
</ResponsiveLineStackLayout>
</>
) : null}
</Dialog>
</ScrollView>
</Column>
) : null}
{openSellerPublicProfileDialog && (
<PublicProfileDialog
userId={sellerId}
@@ -314,4 +293,4 @@ const PrivateAssetPackDialog = ({
);
};
export default PrivateAssetPackDialog;
export default PrivateAssetPackInformationPage;

View File

@@ -291,7 +291,7 @@ const PrivateAssetPackPurchaseDialog = ({
subtitle: (
<Trans>
The asset pack {privateAssetPackListingData.name} will be linked to
your account {profile.email}
your account {profile.email}.
</Trans>
),
content: (

View File

@@ -41,7 +41,7 @@ import IconButton from '../UI/IconButton';
import { AssetDetails, type AssetDetailsInterface } from './AssetDetails';
import PlaceholderLoader from '../UI/PlaceholderLoader';
import Home from '@material-ui/icons/Home';
import PrivateAssetPackInformationDialog from './PrivateAssets/PrivateAssetPackInformationDialog';
import PrivateAssetPackInformationPage from './PrivateAssets/PrivateAssetPackInformationPage';
import PlaceholderError from '../UI/PlaceholderError';
import AlertMessage from '../UI/AlertMessage';
import AuthenticatedUserContext from '../Profile/AuthenticatedUserContext';
@@ -49,9 +49,7 @@ import PrivateAssetPackPurchaseDialog from './PrivateAssets/PrivateAssetPackPurc
import { LineStackLayout } from '../UI/Layout';
import Paper from '../UI/Paper';
type Props = {|
project: gdProject,
|};
type Props = {||};
export type AssetStoreInterface = {|
onClose: () => void,
@@ -83,7 +81,7 @@ const identifyAssetPackKind = ({
};
export const AssetStore = React.forwardRef<Props, AssetStoreInterface>(
({ project }: Props, ref) => {
(props: Props, ref) => {
const {
publicAssetPacks,
privateAssetPacks,
@@ -100,6 +98,7 @@ export const AssetStore = React.forwardRef<Props, AssetStoreInterface>(
isOnHomePage,
openedAssetPack,
openedAssetShortHeader,
openedPrivateAssetPackListingData,
filtersState,
} = navigationState.getCurrentPage();
const searchBar = React.useRef<?SearchBarInterface>(null);
@@ -108,10 +107,6 @@ export const AssetStore = React.forwardRef<Props, AssetStoreInterface>(
const [isFiltersPanelOpen, setIsFiltersPanelOpen] = React.useState(
!isOnHomePage && !openedAssetShortHeader
);
const [
selectedPrivateAssetPackListingData,
setSelectedPrivateAssetPackListingData,
] = React.useState<?PrivateAssetPackListingData>(null);
const [
purchasingPrivateAssetPackListingData,
setPurchasingPrivateAssetPackListingData,
@@ -246,14 +241,16 @@ export const AssetStore = React.forwardRef<Props, AssetStoreInterface>(
: null;
if (!receivedAssetPack) {
// The user has not received the pack, open the dialog to buy it.
// The user has not received the pack, open the page to buy it.
sendAssetPackInformationOpened({
assetPackName: assetPackListingData.name,
assetPackId: assetPackListingData.id,
assetPackKind: 'private',
});
setSelectedPrivateAssetPackListingData(assetPackListingData);
navigationState.openPrivateAssetPackInformationPage(
assetPackListingData
);
return;
}
@@ -292,7 +289,6 @@ export const AssetStore = React.forwardRef<Props, AssetStoreInterface>(
setIsFiltersPanelOpen(true);
saveScrollPosition();
navigationState.openPackPage(receivedAssetPack);
setSelectedPrivateAssetPackListingData(null);
}
}
},
@@ -353,7 +349,13 @@ export const AssetStore = React.forwardRef<Props, AssetStoreInterface>(
<ResponsiveWindowMeasurer>
{windowWidth => (
<>
<Column expand noMargin useFullHeight id="asset-store">
<Column
expand
noMargin
useFullHeight
noOverflowParent
id="asset-store"
>
<LineStackLayout>
<IconButton
key="back-discover"
@@ -414,12 +416,16 @@ export const AssetStore = React.forwardRef<Props, AssetStoreInterface>(
}}
/>
</Column>
{(openedAssetPack || filtersState.chosenCategory) && (
{(openedAssetPack ||
openedPrivateAssetPackListingData ||
filtersState.chosenCategory) && (
<>
<Column expand alignItems="center">
<Text size="block-title" noMargin>
{openedAssetPack
? openedAssetPack.name
: openedPrivateAssetPackListingData
? openedPrivateAssetPackListingData.name
: filtersState.chosenCategory
? capitalize(
filtersState.chosenCategory.node.name
@@ -442,64 +448,65 @@ export const AssetStore = React.forwardRef<Props, AssetStoreInterface>(
'hidden' /* Somehow required on Chrome/Firefox to avoid children growing (but not on Safari) */
}
>
{!openedAssetShortHeader && ( // Don't show filters on asset page.
<Column noMargin>
<ScrollView>
<Paper
style={{
width: !isFiltersPanelOpen
? 50
: windowWidth === 'small'
? 205
: 250,
}}
background="medium"
>
{!isFiltersPanelOpen ? (
<Line justifyContent="center">
<IconButton
onClick={() => setIsFiltersPanelOpen(true)}
>
<Tune />
</IconButton>
</Line>
) : (
<>
<Line
justifyContent="space-between"
alignItems="center"
>
<Column noMargin>
<Line alignItems="center">
<Tune />
<Subheader>
<Trans>Object filters</Trans>
</Subheader>
</Line>
</Column>
{!openedAssetShortHeader &&
!openedPrivateAssetPackListingData && ( // Don't show filters on asset page.
<Column noMargin>
<ScrollView>
<Paper
style={{
width: !isFiltersPanelOpen
? 50
: windowWidth === 'small'
? 205
: 250,
}}
background="medium"
>
{!isFiltersPanelOpen ? (
<Line justifyContent="center">
<IconButton
onClick={() => setIsFiltersPanelOpen(false)}
onClick={() => setIsFiltersPanelOpen(true)}
>
<DoubleChevronArrowLeft />
<Tune />
</IconButton>
</Line>
<Line
justifyContent="space-between"
alignItems="center"
>
<AssetStoreFilterPanel
assetFiltersState={assetFiltersState}
onChoiceChange={() => {
navigationState.openSearchIfNeeded();
}}
/>
</Line>
</>
)}
</Paper>
</ScrollView>
</Column>
)}
) : (
<>
<Line
justifyContent="space-between"
alignItems="center"
>
<Column noMargin>
<Line alignItems="center">
<Tune />
<Subheader>
<Trans>Object filters</Trans>
</Subheader>
</Line>
</Column>
<IconButton
onClick={() => setIsFiltersPanelOpen(false)}
>
<DoubleChevronArrowLeft />
</IconButton>
</Line>
<Line
justifyContent="space-between"
alignItems="center"
>
<AssetStoreFilterPanel
assetFiltersState={assetFiltersState}
onChoiceChange={() => {
navigationState.openSearchIfNeeded();
}}
/>
</Line>
</>
)}
</Paper>
</ScrollView>
</Column>
)}
{isOnHomePage &&
!(publicAssetPacks && privateAssetPacks) &&
!error && <PlaceholderLoader />}
@@ -516,27 +523,31 @@ export const AssetStore = React.forwardRef<Props, AssetStoreInterface>(
onPrivateAssetPackSelection={selectPrivateAssetPack}
/>
)}
{!isOnHomePage && !openedAssetShortHeader && (
<BoxSearchResults
ref={boxSearchResults}
baseSize={128}
onRetry={fetchAssetsAndFilters}
error={error}
searchItems={searchResults}
renderSearchItem={(assetShortHeader, size) => (
<AssetCard
size={size}
onOpenDetails={() => onOpenDetails(assetShortHeader)}
assetShortHeader={assetShortHeader}
/>
)}
noResultPlaceholder={
<NoResultPlaceholder
onClear={() => clearAllFilters(assetFiltersState)}
/>
}
/>
)}
{!isOnHomePage &&
!openedAssetShortHeader &&
!openedPrivateAssetPackListingData && (
<BoxSearchResults
ref={boxSearchResults}
baseSize={128}
onRetry={fetchAssetsAndFilters}
error={error}
searchItems={searchResults}
renderSearchItem={(assetShortHeader, size) => (
<AssetCard
size={size}
onOpenDetails={() =>
onOpenDetails(assetShortHeader)
}
assetShortHeader={assetShortHeader}
/>
)}
noResultPlaceholder={
<NoResultPlaceholder
onClear={() => clearAllFilters(assetFiltersState)}
/>
}
/>
)}
{isOnHomePage && error && (
<PlaceholderError onRetry={fetchAssetsAndFilters}>
<AlertMessage kind="error">
@@ -550,24 +561,20 @@ export const AssetStore = React.forwardRef<Props, AssetStoreInterface>(
{openedAssetShortHeader && (
<AssetDetails
ref={assetDetails}
project={project}
onTagSelection={selectTag}
assetShortHeader={openedAssetShortHeader}
onOpenDetails={onOpenDetails}
onAssetLoaded={applyBackScrollPosition}
/>
)}
{!!selectedPrivateAssetPackListingData && (
<PrivateAssetPackInformationDialog
{!!openedPrivateAssetPackListingData && (
<PrivateAssetPackInformationPage
privateAssetPackListingData={
selectedPrivateAssetPackListingData
openedPrivateAssetPackListingData
}
onClose={() => {
setSelectedPrivateAssetPackListingData(null);
}}
onOpenPurchaseDialog={() =>
setPurchasingPrivateAssetPackListingData(
selectedPrivateAssetPackListingData
openedPrivateAssetPackListingData
)
}
isPurchaseDialogOpen={

View File

@@ -349,7 +349,6 @@ const Physics2Editor = (props: Props) => {
>
<ImagePreview
resourceName={image}
project={props.project}
imageResourceSource={resourcesLoader.getResourceFullUrl(
props.project,
image,

View File

@@ -67,6 +67,7 @@ export const create = (authentication: Authentication) => {
initialDialog={appArguments['initial-dialog']}
initialGameId={appArguments['game-id']}
initialGamesDashboardTab={appArguments['games-dashboard-tab']}
initialAssetPackUserFriendlySlug={appArguments['asset-pack']}
renderExportDialog={props => (
<ExportDialog
project={props.project}

View File

@@ -120,7 +120,10 @@ export const declareObjectMetadata = (
'res/actions/scale_black.png'
)
.addParameter('object', i18n._('Object'), objectType)
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.markAsAdvanced()
.getCodeExtraInformation()
.setFunctionName('setWidth')
@@ -139,7 +142,10 @@ export const declareObjectMetadata = (
)
.setHidden()
.addParameter('object', i18n._('Object'), objectType)
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.markAsAdvanced()
.getCodeExtraInformation()
.setFunctionName('setWidth')
@@ -156,7 +162,10 @@ export const declareObjectMetadata = (
'res/actions/scale_black.png'
)
.addParameter('object', i18n._('Object'), objectType)
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.markAsAdvanced()
.getCodeExtraInformation()
.setFunctionName('setHeight')
@@ -175,7 +184,10 @@ export const declareObjectMetadata = (
)
.setHidden()
.addParameter('object', i18n._('Object'), objectType)
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.markAsAdvanced()
.getCodeExtraInformation()
.setFunctionName('setHeight')
@@ -192,7 +204,10 @@ export const declareObjectMetadata = (
'res/actions/scale_black.png'
)
.addParameter('object', i18n._('Object'), objectType)
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.markAsAdvanced()
.getCodeExtraInformation()
.setFunctionName('setScale')
@@ -211,7 +226,10 @@ export const declareObjectMetadata = (
)
.setHidden()
.addParameter('object', i18n._('Object'), objectType)
.useStandardOperatorParameters('number')
.useStandardOperatorParameters(
'number',
gd.ParameterOptions.makeNewOptions()
)
.markAsAdvanced()
.getCodeExtraInformation()
.setFunctionName('setScale')
@@ -228,7 +246,7 @@ export const declareObjectMetadata = (
'res/actions/scaleWidth24_black.png'
)
.addParameter('object', i18n._('Object'), objectType)
.useStandardParameters('number')
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
.markAsAdvanced()
.setFunctionName('setScaleX')
.setGetter('getScaleX');
@@ -244,7 +262,7 @@ export const declareObjectMetadata = (
'res/actions/scaleHeight24_black.png'
)
.addParameter('object', i18n._('Object'), objectType)
.useStandardParameters('number')
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
.markAsAdvanced()
.setFunctionName('setScaleY')
.setGetter('getScaleY');
@@ -389,7 +407,7 @@ export const declareObjectMetadata = (
'res/conditions/opacity24.png'
)
.addParameter('object', i18n._('Object'), objectType)
.useStandardParameters('number')
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
.setFunctionName('setOpacity')
.setGetter('getOpacity');
@@ -889,6 +907,9 @@ const declarePropertyInstructionAndExpression = (
.getCodeExtraInformation()
.setFunctionName(setterName);
} else {
const typeExtraInfo = getStringifiedExtraInfo(property);
const parameterOptions = gd.ParameterOptions.makeNewOptions();
if (typeExtraInfo) parameterOptions.setTypeExtraInfo(typeExtraInfo);
addObjectAndBehaviorParameters(
entityMetadata.addExpressionAndConditionAndAction(
gd.ValueTypeMetadata.convertPropertyTypeToValueType(propertyType),
@@ -902,7 +923,7 @@ const declarePropertyInstructionAndExpression = (
)
.useStandardParameters(
gd.ValueTypeMetadata.convertPropertyTypeToValueType(propertyType),
getStringifiedExtraInfo(property)
parameterOptions
)
.setFunctionName(setterName)
.setGetter(getterName);
@@ -1161,14 +1182,26 @@ export const declareEventsFunctionParameters = (
);
if (functionType === gd.EventsFunction.ExpressionAndCondition) {
((instructionOrExpression: any): gdMultipleInstructionMetadata).useStandardParameters(
const options = gd.ParameterOptions.makeNewOptions();
if (eventsFunction) {
const extraInfo = eventsFunction.getExpressionType().getExtraInfo();
if (extraInfo) options.setTypeExtraInfo(extraInfo);
}
// $FlowExpectedError[incompatible-cast]
(instructionOrExpression: gdMultipleInstructionMetadata).useStandardParameters(
eventsFunction ? eventsFunction.getExpressionType().getName() : 'string',
eventsFunction ? eventsFunction.getExpressionType().getExtraInfo() : ''
options
);
} else if (functionType === gd.EventsFunction.ActionWithOperator) {
((instructionOrExpression: any): gdInstructionMetadata).useStandardOperatorParameters(
const options = gd.ParameterOptions.makeNewOptions();
if (getterFunction) {
const extraInfo = getterFunction.getExpressionType().getExtraInfo();
if (extraInfo) options.setTypeExtraInfo(extraInfo);
}
// $FlowExpectedError[incompatible-cast]
(instructionOrExpression: gdInstructionMetadata).useStandardOperatorParameters(
getterFunction ? getterFunction.getExpressionType().getName() : 'string',
getterFunction ? getterFunction.getExpressionType().getExtraInfo() : ''
options
);
}

View File

@@ -50,7 +50,7 @@ const FeedbackAverageCard = ({ feedbacks }: Props) => {
return (
<I18n>
{({ i18n }) => (
<Card>
<Card background="dark">
<Column noMargin>
<Line noMargin justifyContent="space-between" alignItems="start">
<Column noMargin>

View File

@@ -149,7 +149,7 @@ const FeedbackCard = ({
)}
</Text>
)}
<BackgroundText style={styles.backgroundText}>
<BackgroundText style={styles.backgroundText} allowSelection>
{comment.playerName}
</BackgroundText>
</Column>
@@ -166,7 +166,9 @@ const FeedbackCard = ({
</ResponsiveLineStackLayout>
)}
<LargeSpacer />
<Text style={styles.textComment}>{comment.text}</Text>
<Text style={styles.textComment} allowSelection>
{comment.text}
</Text>
</Column>
</Card>
)}

View File

@@ -185,6 +185,7 @@ export const GameCard = ({
<>
<Card
key={game.id}
background={isCurrentGame ? 'dark' : 'medium'}
cardCornerAction={
<ElementWithMenu
element={
@@ -249,6 +250,7 @@ export const GameCard = ({
<GameThumbnail
gameName={game.gameName}
thumbnailUrl={game.thumbnailUrl}
background={isCurrentGame ? 'medium' : 'light'}
/>
</Column>
<Spacer />

View File

@@ -257,9 +257,8 @@ export const GameRegistrationWidget = ({
)}
>
<Trans>
This project is not registered online. Register it now to get access
to metrics collected anonymously, like the number of daily players and
retention of the players after a few days.
The project currently opened is not registered online. Register it now
to get access to leaderboards, player accounts, analytics and more!
</Trans>
</AlertMessage>
);
@@ -269,9 +268,9 @@ export const GameRegistrationWidget = ({
return (
<AlertMessage kind="error">
<Trans>
This project is registered online but you don't have access to it. Ask
the original owner of the game to share it with you to get access to
the game metrics.
The project currently opened is registered online but you don't have
access to it. Ask the original owner of the game to share it with you
to be able to manage it.
</Trans>
</AlertMessage>
);

View File

@@ -19,9 +19,14 @@ const styles = {
type Props = {|
thumbnailUrl?: string,
gameName: string,
background?: 'light' | 'medium' | 'dark',
|};
export const GameThumbnail = ({ thumbnailUrl, gameName }: Props) =>
export const GameThumbnail = ({
thumbnailUrl,
gameName,
background = 'light',
}: Props) =>
thumbnailUrl ? (
<img
src={thumbnailUrl}
@@ -40,7 +45,7 @@ export const GameThumbnail = ({ thumbnailUrl, gameName }: Props) =>
whiteSpace: 'normal',
display: 'flex',
}}
background="light"
background={background}
>
<EmptyMessage>
<Trans>No thumbnail set</Trans>

View File

@@ -1,14 +1,19 @@
// @flow
import { Trans } from '@lingui/macro';
import { t, Trans } from '@lingui/macro';
import * as React from 'react';
import AuthenticatedUserContext from '../Profile/AuthenticatedUserContext';
import PlaceholderLoader from '../UI/PlaceholderLoader';
import PlaceholderError from '../UI/PlaceholderError';
import { type Game, getGames } from '../Utils/GDevelopServices/Game';
import {
type Game,
getGames,
registerGame,
} from '../Utils/GDevelopServices/Game';
import { GameCard } from './GameCard';
import { ColumnStackLayout } from '../UI/Layout';
import { GameRegistration } from './GameRegistration';
import { GameDetailsDialog, type GameDetailsTab } from './GameDetailsDialog';
import useAlertDialog from '../UI/Alert/useAlertDialog';
type Props = {|
project: ?gdProject,
@@ -29,12 +34,15 @@ export const GamesList = ({
authenticated,
firebaseUser,
getAuthorizationHeader,
profile,
} = React.useContext(AuthenticatedUserContext);
const [openedGame, setOpenedGame] = React.useState<?Game>(null);
const [
openedGameInitialTab,
setOpenedGameInitialTab,
] = React.useState<GameDetailsTab>(initialTab || 'details');
const { showAlert, showConfirmation } = useAlertDialog();
const [isGameRegistering, setIsGameRegistering] = React.useState(false);
const loadGames = React.useCallback(
async () => {
@@ -44,19 +52,82 @@ export const GamesList = ({
setError(null);
const games = await getGames(getAuthorizationHeader, firebaseUser.uid);
setGames(games);
// If a game id was passed, open it.
if (initialGameId) {
const game = games.find(game => game.id === initialGameId);
if (game) {
setOpenedGame(game);
}
}
} catch (error) {
console.error('Error while loading user games.', error);
setError(error);
}
},
[authenticated, firebaseUser, getAuthorizationHeader, initialGameId]
[authenticated, firebaseUser, getAuthorizationHeader]
);
const onRegisterGame = React.useCallback(
async () => {
if (!profile || !project) return;
const { id } = profile;
try {
setIsGameRegistering(true);
await registerGame(getAuthorizationHeader, id, {
gameId: project.getProjectUuid(),
authorName: project.getAuthor() || 'Unspecified publisher',
gameName: project.getName() || 'Untitled game',
templateSlug: project.getTemplateSlug(),
});
await loadGames();
} catch (error) {
console.error('Unable to register the game', error);
if (error.response && error.response.status === 403) {
await showAlert({
title: t`Game already registered`,
message: t`The project currently opened is registered online but you don't have
access to it. Ask the original owner of the game to share it with you
to be able to manage it.`,
});
} else {
await showAlert({
title: t`Unable to register the game`,
message: t`An error happened while registering the game. Verify your internet connection
or retry later.`,
});
}
} finally {
setIsGameRegistering(false);
}
},
[getAuthorizationHeader, profile, project, showAlert, loadGames]
);
React.useEffect(
() => {
const loadInitialGame = async () => {
// When games are loaded and we have an initial game id, open it.
if (games && initialGameId) {
const game = games.find(game => game.id === initialGameId);
if (game) {
setOpenedGame(game);
} else {
onGameDetailsDialogClose(); // Ensure we reset initial props.
const answer = await showConfirmation({
title: t`Game not found`,
message: t`This project is not registered online. Register it now
to get access to leaderboards, player accounts, analytics and more!`,
confirmButtonLabel: t`Register`,
});
if (!answer) return;
await onRegisterGame();
}
}
};
loadInitialGame();
},
[
games,
initialGameId,
onRegisterGame,
onGameDetailsDialogClose,
showConfirmation,
]
);
React.useEffect(
@@ -97,12 +168,14 @@ export const GamesList = ({
return (
<ColumnStackLayout noMargin>
<GameRegistration
project={project}
hideIfRegistered
hideLoader
onGameRegistered={loadGames}
/>
{!isGameRegistering && (
<GameRegistration
project={project}
hideIfRegistered
hideLoader
onGameRegistered={loadGames}
/>
)}
{displayedGames.map(game => (
<GameCard
key={game.id}

View File

@@ -4,7 +4,7 @@ import * as PIXI from 'pixi.js-legacy';
import { type InstanceMeasurer } from './InstancesRenderer';
import Rectangle from '../Utils/Rectangle';
export default class InstancesSelection {
export default class HighlightedInstance {
instanceMeasurer: InstanceMeasurer;
toCanvasCoordinates: (x: number, y: number) => [number, number];
highlightedInstance: gdInitialInstance | null;
@@ -81,13 +81,14 @@ export default class InstancesSelection {
highlightedInstance.getObjectName() +
'\n' +
'X: ' +
parseInt(highlightedInstance.getX()) +
Math.round(highlightedInstance.getX() * 100) / 100 + // An instance position can have a lot of decimals, so round to 2 decimals.
' Y: ' +
parseInt(highlightedInstance.getY()) +
Math.round(highlightedInstance.getY() * 100) / 100 + // An instance position can have a lot of decimals, so round to 2 decimals.
'\n' +
'Layer: ' +
highlightedInstance.getLayer() +
' Z: ' +
(highlightedInstance.getLayer() || 'Base layer') +
'\n' +
'Z: ' +
highlightedInstance.getZOrder() +
'\n';
this.tooltipText.text = tooltipInfo;

View File

@@ -89,12 +89,16 @@ export default class InstancePropertiesEditor extends React.Component<Props> {
getLabel: () => this.props.i18n._(t`Lock position/angle in the editor`),
valueType: 'boolean',
getValue: (instance: gdInitialInstance) => instance.isLocked(),
setValue: (instance: gdInitialInstance, newValue: boolean) =>
instance.setLocked(newValue),
setValue: (instance: gdInitialInstance, newValue: boolean) => {
instance.setLocked(newValue);
if (!newValue) {
instance.setSealed(newValue);
}
},
},
{
name: 'Prevent instance selection',
getLabel: () => this.props.i18n._(t`Prevent selection in the canvas`),
getLabel: () => this.props.i18n._(t`Prevent selection in the editor`),
valueType: 'boolean',
disabled: (instances: gdInitialInstance[]) => {
return instances.some(instance => !instance.isLocked());

View File

@@ -139,7 +139,10 @@ export default class InstancesMover {
y: selectedInstance.getY(),
};
}
selectedInstance.setX(
// We round the position to the nearest pixel when an instance is moved in the editor.
// This is to avoid having a lot of decimals in the position of instances.
// It does not prevent the user from having decimals, when editing the position manually.
const newX = Math.round(
initialPosition.x +
this._getMoveDeltaX(
roundedTotalDeltaX,
@@ -147,7 +150,7 @@ export default class InstancesMover {
followAxis
)
);
selectedInstance.setY(
const newY = Math.round(
initialPosition.y +
this._getMoveDeltaY(
roundedTotalDeltaX,
@@ -155,6 +158,8 @@ export default class InstancesMover {
followAxis
)
);
selectedInstance.setX(newX);
selectedInstance.setY(newY);
}
}

View File

@@ -293,14 +293,17 @@ export default class InstancesResizer {
// is stable by instance rotation. This allows to use the same formula
// for both 90° or 270°.
const angle = ((selectedInstance.getAngle() % 360) + 360) % 360;
let newX = initialInstanceOriginPosition.x;
let newY = initialInstanceOriginPosition.y;
let newWidth = initialWidth;
let newHeight = initialHeight;
if (
!proportional &&
!hasRotatedInstance &&
(angle === 90 || angle === 270)
) {
selectedInstance.setCustomWidth(scaleY * initialWidth);
selectedInstance.setCustomHeight(scaleX * initialHeight);
selectedInstance.setHasCustomSize(true);
newWidth = scaleY * initialWidth;
newHeight = scaleX * initialHeight;
// These 4 variables are the positions and vector after the scaling.
// It's easier to scale the instance center
@@ -322,20 +325,27 @@ export default class InstancesResizer {
scaleX *
(initialInstanceOriginPosition.y -
initialUnrotatedInstanceAABB.centerY());
selectedInstance.setX(centerX + centerToOriginX);
selectedInstance.setY(centerY + centerToOriginY);
newX = centerX + centerToOriginX;
newY = centerY + centerToOriginY;
} else {
selectedInstance.setCustomWidth(scaleX * initialWidth);
selectedInstance.setCustomHeight(scaleY * initialHeight);
selectedInstance.setHasCustomSize(true);
selectedInstance.setX(
(initialInstanceOriginPosition.x - fixedPointX) * scaleX + fixedPointX
);
selectedInstance.setY(
(initialInstanceOriginPosition.y - fixedPointY) * scaleY + fixedPointY
);
newWidth = scaleX * initialWidth;
newHeight = scaleY * initialHeight;
newX =
(initialInstanceOriginPosition.x - fixedPointX) * scaleX +
fixedPointX;
newY =
(initialInstanceOriginPosition.y - fixedPointY) * scaleY +
fixedPointY;
}
// After resizing, we round the new positions and dimensions to the nearest pixel.
// This is to avoid having a lot of decimals appearing, and it does not
// prevent the user from modifying them manually in the inline fields.
selectedInstance.setX(Math.round(newX));
selectedInstance.setY(Math.round(newY));
selectedInstance.setCustomWidth(Math.round(newWidth));
selectedInstance.setCustomHeight(Math.round(newHeight));
selectedInstance.setHasCustomSize(true);
}
}

View File

@@ -110,25 +110,32 @@ export default class InstancesRotator {
);
const degreeAngle = this._getNewAngle(proportional, initialAngle);
selectedInstance.setAngle(((degreeAngle % 360) + 360) % 360);
// We round the angle to the nearest degree when an instance is rotated in the editor.
// This is to avoid having a lot of decimals in the angle of instances.
// It does not prevent the user from having decimals, when editing the angle manually.
const newAngle = Math.round(((degreeAngle % 360) + 360) % 360);
selectedInstance.setAngle(newAngle);
const rotationAngle = ((degreeAngle - initialAngle) * Math.PI) / 180;
const cosa = Math.cos(-rotationAngle);
const sina = Math.sin(-rotationAngle);
const deltaX = initialAABB.centerX() - this._fixedPoint[0];
const deltaY = initialAABB.centerY() - this._fixedPoint[1];
selectedInstance.setX(
// We also round the position to the nearest pixel after rotation.
const newX = Math.round(
this._fixedPoint[0] +
(initialInstanceOriginPosition.x - initialAABB.centerX()) +
cosa * deltaX +
sina * deltaY
);
selectedInstance.setY(
const newY = Math.round(
this._fixedPoint[1] +
(initialInstanceOriginPosition.y - initialAABB.centerY()) -
sina * deltaX +
cosa * deltaY
);
selectedInstance.setX(newX);
selectedInstance.setY(newY);
}
}

View File

@@ -36,6 +36,10 @@ import {
} from './InstancesEditorSettings';
import Rectangle from '../Utils/Rectangle';
import { isNoDialogOpened } from '../UI/MaterialUISpecificUtil';
import {
clampInstancesEditorZoom,
getWheelStepZoomFactor,
} from '../Utils/ZoomUtils';
const gd: libGDevelop = global.gd;
const styles = {
@@ -182,7 +186,7 @@ export default class InstancesEditor extends Component<Props> {
this.pixiRenderer.view.onwheel = (event: any) => {
const zoomFactor = this.getZoomFactor();
if (this.keyboardShortcuts.shouldZoom()) {
this.zoomOnCursorBy(-event.deltaY / 5000);
this.zoomOnCursorBy(getWheelStepZoomFactor(-event.deltaY));
} else if (this.keyboardShortcuts.shouldScrollHorizontally()) {
const deltaX = event.deltaY / (5 * zoomFactor);
this.scrollBy(-deltaX, 0);
@@ -516,7 +520,7 @@ export default class InstancesEditor extends Component<Props> {
}
zoomBy(value: number) {
this.setZoomFactor(this.getZoomFactor() + value);
this.setZoomFactor(this.getZoomFactor() * value);
}
/**
@@ -524,7 +528,7 @@ export default class InstancesEditor extends Component<Props> {
*/
zoomOnCursorBy(value: number) {
const beforeZoomCursorPosition = this.getLastCursorSceneCoordinates();
this.setZoomFactor(this.getZoomFactor() + value);
this.setZoomFactor(this.getZoomFactor() * value);
const afterZoomCursorPosition = this.getLastCursorSceneCoordinates();
// Compensate for the cursor change in position
this.scrollBy(
@@ -540,7 +544,7 @@ export default class InstancesEditor extends Component<Props> {
setZoomFactor = (zoomFactor: number) => {
this.props.onChangeInstancesEditorSettings({
...this.props.instancesEditorSettings,
zoomFactor: Math.max(Math.min(zoomFactor, 10), 0.01),
zoomFactor: clampInstancesEditorZoom(zoomFactor),
});
};

View File

@@ -4,7 +4,7 @@ import { type CommandName } from '../CommandPalette/CommandsList';
export type ShortcutMap = { [CommandName]: string };
const defaultShortcuts: ShortcutMap = {
QUIT_APP: 'CmdOrCtrl+Shift+KeyQ',
QUIT_APP: 'CmdOrCtrl+KeyQ', // It's important to keep this shortcut, as this default cannot be overriden on Mac.
OPEN_PROJECT_MANAGER: 'CmdOrCtrl+Alt+KeyE',
LAUNCH_NEW_PREVIEW: 'F4',
LAUNCH_DEBUG_PREVIEW: 'F6',
@@ -15,7 +15,7 @@ const defaultShortcuts: ShortcutMap = {
OPEN_PROJECT: 'CmdOrCtrl+KeyO',
SAVE_PROJECT: 'CmdOrCtrl+KeyS',
SAVE_PROJECT_AS: 'CmdOrCtrl+Shift+KeyS',
CLOSE_PROJECT: 'CmdOrCtrl+KeyQ',
CLOSE_PROJECT: 'CmdOrCtrl+KeyW',
EXPORT_GAME: 'CmdOrCtrl+Shift+KeyE',
OPEN_RECENT_PROJECT: '',
OPEN_COMMAND_PALETTE: 'CmdOrCtrl+KeyP',

View File

@@ -15,6 +15,7 @@ export type EditorContainerExtraProps = {|
// Homepage
storageProviders?: Array<StorageProvider>,
initialTab?: ?string,
|};
export type RenderEditorContainerProps = {|
@@ -65,6 +66,7 @@ export type RenderEditorContainerProps = {|
onOpenRecentFile: (file: FileMetadataAndStorageProviderName) => void,
onOpenProjectManager: () => void,
onCloseProject: () => Promise<boolean>,
onOpenGamesDashboard: (gameId: string) => void,
// Other dialogs opening:
onCreateProject: (?ExampleShortHeader) => void,

View File

@@ -101,7 +101,7 @@ export default function ExternalPropertiesDialog({
<FormControlLabel
key={name}
value={name}
control={<Radio color="primary" />}
control={<Radio color="secondary" />}
label={name}
/>
))}

View File

@@ -51,6 +51,11 @@ import { prepareExamples } from '../../../../AssetStore/ExampleStore';
import Skeleton from '@material-ui/lab/Skeleton';
import BackgroundText from '../../../../UI/BackgroundText';
import Paper from '../../../../UI/Paper';
import PlaceholderError from '../../../../UI/PlaceholderError';
import AlertMessage from '../../../../UI/AlertMessage';
import { ListItemSecondaryAction } from '@material-ui/core';
import IconButton from '../../../../UI/IconButton';
import ThreeDotsMenu from '../../../../UI/CustomSvgIcons/ThreeDotsMenu';
const electron = optionalRequire('electron');
const path = optionalRequire('path');
@@ -92,6 +97,7 @@ type Props = {|
onOpenNewProjectSetupDialog: (?ExampleShortHeader) => void,
onShowAllExamples: () => void,
onSelectExample: (exampleShortHeader: ExampleShortHeader) => void,
onOpenGamesDashboard: (gameId: string) => void,
storageProviders: Array<StorageProvider>,
|};
@@ -140,6 +146,7 @@ const BuildSection = React.forwardRef<Props, BuildSectionInterface>(
onShowAllExamples,
onSelectExample,
onOpenRecentFile,
onOpenGamesDashboard,
storageProviders,
},
ref
@@ -152,7 +159,12 @@ const BuildSection = React.forwardRef<Props, BuildSectionInterface>(
const { openSubscriptionDialog } = React.useContext(
SubscriptionSuggestionContext
);
const { cloudProjects, limits } = authenticatedUser;
const {
cloudProjects,
limits,
cloudProjectsFetchingErrorLabel,
onCloudProjectsChanged,
} = authenticatedUser;
const contextMenu = React.useRef<?ContextMenuInterface>(null);
const { showDeleteConfirmation } = useAlertDialog();
const [pendingProject, setPendingProject] = React.useState<?string>(null);
@@ -180,6 +192,7 @@ const BuildSection = React.forwardRef<Props, BuildSectionInterface>(
fileIdentifier: cloudProject.id,
lastModifiedDate: Date.parse(cloudProject.lastModifiedAt),
name: cloudProject.name,
gameId: cloudProject.gameId,
},
};
return file;
@@ -261,7 +274,6 @@ const BuildSection = React.forwardRef<Props, BuildSectionInterface>(
];
if (file.storageProviderName === 'Cloud') {
actions = actions.concat([
{ type: 'separator' },
{
label: i18n._(t`Delete`),
click: () => onDeleteCloudProject(i18n, file),
@@ -273,7 +285,6 @@ const BuildSection = React.forwardRef<Props, BuildSectionInterface>(
label: i18n._(t`Show in local folder`),
click: () => locateProjectFile(file),
},
{ type: 'separator' },
{
label: i18n._(t`Remove from list`),
click: () => onRemoveFromRecentFiles(file),
@@ -281,13 +292,24 @@ const BuildSection = React.forwardRef<Props, BuildSectionInterface>(
]);
} else {
actions = actions.concat([
{ type: 'separator' },
{
label: i18n._(t`Remove from list`),
click: () => onRemoveFromRecentFiles(file),
},
]);
}
const gameId = file.fileMetadata.gameId;
if (gameId) {
actions = actions.concat([
{ type: 'separator' },
{
label: i18n._(t`Manage game`),
click: () => onOpenGamesDashboard(gameId),
},
]);
}
return actions;
};
@@ -381,6 +403,15 @@ const BuildSection = React.forwardRef<Props, BuildSectionInterface>(
</ResponsiveLineStackLayout>
</Column>
</LineStackLayout>
{cloudProjectsFetchingErrorLabel && (
<Line>
<PlaceholderError onRetry={onCloudProjectsChanged}>
<AlertMessage kind="warning">
{cloudProjectsFetchingErrorLabel}
</AlertMessage>
</PlaceholderError>
</Line>
)}
<Line>
<Column noMargin expand>
{isWindowWidthMediumOrLarger && (
@@ -506,6 +537,20 @@ const BuildSection = React.forwardRef<Props, BuildSectionInterface>(
</Text>
)}
</Column>
<ListItemSecondaryAction>
<IconButton
size="small"
edge="end"
aria-label="menu"
onClick={event => {
// prevent trigerring the click on the list item.
event.stopPropagation();
openContextMenu(event, file);
}}
>
<ThreeDotsMenu />
</IconButton>
</ListItemSecondaryAction>
</LineStackLayout>
) : (
<Column expand>

View File

@@ -13,6 +13,7 @@ import SchoolIcon from '../../../UI/CustomSvgIcons/School';
import GoogleControllerIcon from '../../../UI/CustomSvgIcons/GoogleController';
import WebIcon from '../../../UI/CustomSvgIcons/Web';
import Sun from '../../../UI/CustomSvgIcons/Sun';
import StorefrontIcon from '@material-ui/icons/Storefront';
import Preferences from '../../../UI/CustomSvgIcons/Preferences';
import GDevelopGLogo from '../../../UI/CustomSvgIcons/GDevelopGLogo';
import GDevelopThemeContext from '../../../UI/Theme/ThemeContext';
@@ -42,7 +43,30 @@ export const styles = {
},
};
export type HomeTab = 'get-started' | 'build' | 'learn' | 'play' | 'community';
export type HomeTab =
| 'get-started'
| 'build'
| 'learn'
| 'play'
| 'community'
| 'shop';
export const getInitialHomeTab = (
initialTab: ?string,
showGetStartedSection: boolean
): HomeTab => {
if (
initialTab === 'get-started' ||
initialTab === 'build' ||
initialTab === 'learn' ||
initialTab === 'play' ||
initialTab === 'community' ||
initialTab === 'shop'
)
return initialTab;
return showGetStartedSection ? 'get-started' : 'build';
};
const tabs: {
label: React.Node,
@@ -62,6 +86,12 @@ const tabs: {
id: 'home-build-tab',
getIcon: color => <PickAxeIcon fontSize="small" color={color} />,
},
{
label: <Trans>Shop</Trans>,
tab: 'shop',
id: 'home-shop-tab',
getIcon: color => <StorefrontIcon fontSize="small" color={color} />,
},
{
label: <Trans>Learn</Trans>,
tab: 'learn',

View File

@@ -191,6 +191,21 @@ const MainPage = ({
</Line>
</SectionRow>
<>
<SectionRow>
<Line noMargin>
<Text size="title">
<Trans>Courses</Trans>
</Text>
</Line>
<Line noMargin>
<Text noMargin>
<Trans>Learn everything about GDevelop from the ground up</Trans>
</Text>
</Line>
</SectionRow>
<SectionRow>{renderTutorialsRow('official-beginner')}</SectionRow>
<SectionRow>{renderTutorialsRow('official-intermediate')}</SectionRow>
<SectionRow>{renderTutorialsRow('official-advanced')}</SectionRow>
<SectionRow>
<LineStackLayout
justifyContent="space-between"
@@ -227,21 +242,6 @@ const MainPage = ({
</SectionRow>
<SectionRow>{renderTutorialsRow('full-game')}</SectionRow>
<SectionRow>{renderTutorialsRow('game-mechanic')}</SectionRow>
<SectionRow>
<Line noMargin>
<Text size="title">
<Trans>Courses</Trans>
</Text>
</Line>
<Line noMargin>
<Text noMargin>
<Trans>Learn everything about GDevelop from the ground up</Trans>
</Text>
</Line>
</SectionRow>
<SectionRow>{renderTutorialsRow('official-beginner')}</SectionRow>
<SectionRow>{renderTutorialsRow('official-intermediate')}</SectionRow>
<SectionRow>{renderTutorialsRow('official-advanced')}</SectionRow>
</>
</SectionContainer>
);

View File

@@ -72,29 +72,31 @@ const SectionContainer = ({
square
background="dark"
>
<Column expand>
<SectionRow>
{backAction && (
<Line>
<TextButton
onClick={backAction}
icon={<ArrowLeft fontSize="small" />}
label={<Trans>Back</Trans>}
/>
</Line>
)}
<Line noMargin>
<Text size="bold-title" noMargin>
{title}
</Text>
</Line>
{subtitleText && (
<Column noOverflowParent expand>
{title && (
<SectionRow>
{backAction && (
<Line>
<TextButton
onClick={backAction}
icon={<ArrowLeft fontSize="small" />}
label={<Trans>Back</Trans>}
/>
</Line>
)}
<Line noMargin>
<Text noMargin>{subtitleText}</Text>
<Text size="bold-title" noMargin>
{title}
</Text>
</Line>
)}
{renderSubtitle && renderSubtitle()}
</SectionRow>
{subtitleText && (
<Line noMargin>
<Text noMargin>{subtitleText}</Text>
</Line>
)}
{renderSubtitle && renderSubtitle()}
</SectionRow>
)}
{children}
</Column>
</Paper>

View File

@@ -0,0 +1,115 @@
// @flow
import * as React from 'react';
import SectionContainer from '../SectionContainer';
import { AssetStore } from '../../../../AssetStore';
import { Line } from '../../../../UI/Grid';
import RaisedButton from '../../../../UI/RaisedButton';
import { type ResourceManagementProps } from '../../../../ResourcesList/ResourceSource';
import { Trans } from '@lingui/macro';
import { AssetStoreContext } from '../../../../AssetStore/AssetStoreContext';
import AssetPackInstallDialog from '../../../../AssetStore/AssetPackInstallDialog';
import { enumerateAssetStoreIds } from '../../../../AssetStore/EnumerateAssetStoreIds';
type Props = {|
project: ?gdProject,
resourceManagementProps: ResourceManagementProps,
canInstallPrivateAsset: () => boolean,
|};
const StoreSection = ({
project,
resourceManagementProps,
canInstallPrivateAsset,
}: Props) => {
const [
isAssetPackDialogInstallOpen,
setIsAssetPackDialogInstallOpen,
] = React.useState(false);
const { searchResults, navigationState } = React.useContext(
AssetStoreContext
);
const {
openedAssetPack,
openedAssetShortHeader,
} = navigationState.getCurrentPage();
const assetShortHeadersToInstall = openedAssetShortHeader
? [openedAssetShortHeader]
: openedAssetPack
? searchResults
: [];
const existingAssetStoreIds = React.useMemo(
() => {
if (!project || !isAssetPackDialogInstallOpen) {
return new Set<string>();
}
return enumerateAssetStoreIds(project);
},
[
project,
// Force recompute existing installed asset ids when the dialog to install them is
// opened/closed, so that this list of ids is always up-to-date (but not recomputed at each render,
// just when you're likely to need it).
isAssetPackDialogInstallOpen,
]
);
return (
<SectionContainer
title={null /* Give the asset store the full space to display */}
flexBody
>
<AssetStore />
<Line justifyContent="flex-end">
<RaisedButton
primary
onClick={() => {
if (!project) {
return; // TODO: create a project, await, and then show dialog.
}
setIsAssetPackDialogInstallOpen(true);
}}
disabled={!project || !assetShortHeadersToInstall.length}
label={
project ? (
openedAssetPack ? (
<Trans>Add assets from this pack to the project</Trans>
) : assetShortHeadersToInstall.length === 1 ? (
<Trans>Add this asset to the project</Trans>
) : (
<Trans>Add these assets to the project</Trans>
)
) : (
<Trans>
Create a project first to add assets from the asset store
</Trans>
)
}
/>
</Line>
{project &&
isAssetPackDialogInstallOpen &&
!!assetShortHeadersToInstall.length && (
<AssetPackInstallDialog
assetPack={openedAssetPack}
assetShortHeaders={assetShortHeadersToInstall}
addedAssetIds={existingAssetStoreIds}
onClose={() => setIsAssetPackDialogInstallOpen(false)}
onAssetsAdded={() => {
setIsAssetPackDialogInstallOpen(false);
}}
project={project}
objectsContainer={null}
onObjectAddedFromAsset={() => {}}
canInstallPrivateAsset={canInstallPrivateAsset}
resourceManagementProps={resourceManagementProps}
/>
)}
</SectionContainer>
);
};
export default StoreSection;

View File

@@ -12,15 +12,17 @@ import BuildSection, { type BuildSectionInterface } from './BuildSection';
import LearnSection from './LearnSection';
import PlaySection from './PlaySection';
import CommunitySection from './CommunitySection';
import StoreSection from './StoreSection';
import { TutorialContext } from '../../../Tutorial/TutorialContext';
import { ExampleStoreContext } from '../../../AssetStore/ExampleStore/ExampleStoreContext';
import { HomePageHeader } from './HomePageHeader';
import { HomePageMenu, type HomeTab } from './HomePageMenu';
import { getInitialHomeTab, HomePageMenu, type HomeTab } from './HomePageMenu';
import PreferencesContext from '../../Preferences/PreferencesContext';
import AuthenticatedUserContext from '../../../Profile/AuthenticatedUserContext';
import { type ExampleShortHeader } from '../../../Utils/GDevelopServices/Example';
import { AnnouncementsFeed } from '../../../AnnouncementsFeed';
import { AnnouncementsFeedContext } from '../../../AnnouncementsFeed/AnnouncementsFeedContext';
import { type ResourceManagementProps } from '../../../ResourcesList/ResourceSource';
type Props = {|
project: ?gdProject,
@@ -30,6 +32,7 @@ type Props = {|
project: ?gdProject,
setToolbar: (?React.Node) => void,
storageProviders: Array<StorageProvider>,
initialTab?: ?string,
// Project opening
canOpen: boolean,
@@ -37,6 +40,7 @@ type Props = {|
onOpenRecentFile: (file: FileMetadataAndStorageProviderName) => void,
onCreateProject: (ExampleShortHeader | null) => void,
onOpenProjectManager: () => void,
onOpenGamesDashboard: (gameId: string) => void,
// Other dialogs opening:
onOpenHelpFinder: () => void,
@@ -48,6 +52,9 @@ type Props = {|
// Project creation
onOpenNewProjectSetupDialog: (?ExampleShortHeader) => void,
resourceManagementProps: ResourceManagementProps,
canInstallPrivateAsset: () => boolean,
|};
type HomePageEditorInterface = {|
@@ -64,6 +71,7 @@ export const HomePage = React.memo<Props>(
canOpen,
onChooseProject,
onOpenRecentFile,
onOpenGamesDashboard,
onOpenNewProjectSetupDialog,
onCreateProject,
onOpenProjectManager,
@@ -76,6 +84,9 @@ export const HomePage = React.memo<Props>(
onOpenAbout,
isActive,
storageProviders,
initialTab,
resourceManagementProps,
canInstallPrivateAsset,
}: Props,
ref
) => {
@@ -158,15 +169,15 @@ export const HomePage = React.memo<Props>(
forceUpdateEditor,
}));
const initialTab = showGetStartedSection ? 'get-started' : 'build';
const [activeTab, setActiveTab] = React.useState<HomeTab>(initialTab);
const [activeTab, setActiveTab] = React.useState<HomeTab>(() =>
getInitialHomeTab(initialTab, showGetStartedSection)
);
return (
<I18n>
{({ i18n }) => (
<>
<Column expand noMargin>
<Column expand noMargin noOverflowParent>
<Line expand noMargin useFullHeight>
<HomePageMenu
activeTab={activeTab}
@@ -174,7 +185,7 @@ export const HomePage = React.memo<Props>(
onOpenPreferences={onOpenPreferences}
onOpenAbout={onOpenAbout}
/>
<Column noMargin expand>
<Column noMargin expand noOverflowParent>
{activeTab !== 'community' && !!announcements && (
<AnnouncementsFeed canClose level="urgent" addMargins />
)}
@@ -205,6 +216,7 @@ export const HomePage = React.memo<Props>(
onCreateProject(exampleShortHeader)
}
onOpenRecentFile={onOpenRecentFile}
onOpenGamesDashboard={onOpenGamesDashboard}
storageProviders={storageProviders}
/>
)}
@@ -219,6 +231,13 @@ export const HomePage = React.memo<Props>(
)}
{activeTab === 'play' && <PlaySection />}
{activeTab === 'community' && <CommunitySection />}
{activeTab === 'shop' && (
<StoreSection
project={project}
resourceManagementProps={resourceManagementProps}
canInstallPrivateAsset={canInstallPrivateAsset}
/>
)}
</Column>
</Line>
</Column>
@@ -245,6 +264,7 @@ export const renderHomePageContainer = (
canOpen={props.canOpen}
onChooseProject={props.onChooseProject}
onOpenRecentFile={props.onOpenRecentFile}
onOpenGamesDashboard={props.onOpenGamesDashboard}
onCreateProject={props.onCreateProject}
onOpenNewProjectSetupDialog={props.onOpenNewProjectSetupDialog}
onOpenProjectManager={props.onOpenProjectManager}
@@ -257,5 +277,10 @@ export const renderHomePageContainer = (
storageProviders={
(props.extraEditorProps && props.extraEditorProps.storageProviders) || []
}
initialTab={
(props.extraEditorProps && props.extraEditorProps.initialTab) || null
}
resourceManagementProps={props.resourceManagementProps}
canInstallPrivateAsset={props.canInstallPrivateAsset}
/>
);

View File

@@ -165,7 +165,7 @@ export const buildMainMenuDeclarativeTemplate = ({
onClickSendEvent: 'main-menu-close',
enabled: !!project,
},
...(!isMacLike() || !isApplicationTopLevelMenu
...(!isMacLike() && !isApplicationTopLevelMenu
? [
{ type: 'separator' },
{

View File

@@ -226,6 +226,7 @@ export type PreferencesValues = {|
showEventBasedObjectsEditor: boolean,
inAppTutorialsProgress: InAppTutorialProgressDatabase,
newProjectsDefaultFolder: string,
newProjectsDefaultStorageProviderName: string,
|};
/**
@@ -289,6 +290,7 @@ export type Preferences = {|
setShowGetStartedSection: (enabled: boolean) => void,
setShowEventBasedObjectsEditor: (enabled: boolean) => void,
getShowEventBasedObjectsEditor: () => boolean,
setNewProjectsDefaultStorageProviderName: (name: string) => void,
saveTutorialProgress: ({|
tutorialId: string,
userId: ?string,
@@ -340,6 +342,7 @@ export const initialPreferences = {
showEventBasedObjectsEditor: false,
inAppTutorialsProgress: {},
newProjectsDefaultFolder: app ? findDefaultFolder(app) : '',
newProjectsDefaultStorageProviderName: 'Cloud',
},
setLanguage: () => {},
setThemeName: () => {},
@@ -392,6 +395,7 @@ export const initialPreferences = {
saveTutorialProgress: () => {},
getTutorialProgress: () => {},
setNewProjectsDefaultFolder: () => {},
setNewProjectsDefaultStorageProviderName: () => {},
};
const PreferencesContext = React.createContext<Preferences>(initialPreferences);

View File

@@ -151,6 +151,9 @@ export default class PreferencesProvider extends React.Component<Props, State> {
saveTutorialProgress: this._saveTutorialProgress.bind(this),
getTutorialProgress: this._getTutorialProgress.bind(this),
setNewProjectsDefaultFolder: this._setNewProjectsDefaultFolder.bind(this),
setNewProjectsDefaultStorageProviderName: this._setNewProjectsDefaultStorageProviderName.bind(
this
),
};
componentDidMount() {
@@ -769,6 +772,18 @@ export default class PreferencesProvider extends React.Component<Props, State> {
);
}
_setNewProjectsDefaultStorageProviderName(newStorageProviderName: string) {
this.setState(
state => ({
values: {
...state.values,
newProjectsDefaultStorageProviderName: newStorageProviderName,
},
}),
() => this._persistValuesToLocalStorage(this.state)
);
}
render() {
return (
<PreferencesContext.Provider value={this.state}>

View File

@@ -252,6 +252,7 @@ export type Props = {|
initialDialog?: string,
initialGameId?: string,
initialGamesDashboardTab?: string,
initialAssetPackUserFriendlySlug?: string,
introDialog?: React.Element<*>,
renderMainMenu?: (BuildMainMenuProps, MainMenuCallbacks) => React.Node,
renderPreviewLauncher?: (
@@ -442,6 +443,7 @@ const MainFrame = (props: Props) => {
initialDialog,
initialGameId,
initialGamesDashboardTab,
initialAssetPackUserFriendlySlug,
initialFileMetadataToOpen,
introDialog,
i18n,
@@ -548,11 +550,13 @@ const MainFrame = (props: Props) => {
setGamesDashboardInitialGameId,
gamesDashboardInitialTab,
setGamesDashboardInitialTab,
openGameDashboard,
} = useOpenInitialDialog({
parameters: {
initialDialog,
initialGameId,
initialGamesDashboardTab,
initialAssetPackUserFriendlySlug,
},
actions: {
openOnboardingDialog: () => {
@@ -738,9 +742,12 @@ const MainFrame = (props: Props) => {
// (like locally or on Google Drive).
if (onSaveProject) {
preferences.insertRecentProjectFile({
fileMetadata: fileMetadata.name
? fileMetadata
: { ...fileMetadata, name: project.getName() },
fileMetadata: {
...fileMetadata,
name: project.getName(),
gameId: project.getProjectUuid(),
lastModifiedDate: Date.now(),
},
storageProviderName: storageProvider.internalName,
});
}
@@ -1583,12 +1590,13 @@ const MainFrame = (props: Props) => {
key: 'start page',
extraEditorProps: {
storageProviders: props.storageProviders,
initialTab: initialDialog === 'asset-store' ? 'shop' : null,
},
closable: false,
}),
}));
},
[setState, i18n, props.storageProviders]
[setState, i18n, initialDialog, props.storageProviders]
);
const _openDebugger = React.useCallback(
@@ -1949,7 +1957,6 @@ const MainFrame = (props: Props) => {
// At the end of the promise below, currentProject and storageProvider
// may have changed (if the user opened another project). So we read and
// store their values in variables now.
const projectName = currentProject.getName();
const storageProviderInternalName = newStorageProvider.internalName;
try {
@@ -2000,11 +2007,8 @@ const MainFrame = (props: Props) => {
// Save was done on a new file/location, so save it in the
// recent projects and in the state.
const enrichedFileMetadata = fileMetadata.name
? fileMetadata
: { ...fileMetadata, name: projectName };
const fileMetadataAndStorageProviderName = {
fileMetadata: enrichedFileMetadata,
fileMetadata,
storageProviderName: storageProviderInternalName,
};
preferences.insertRecentProjectFile(fileMetadataAndStorageProviderName);
@@ -2035,7 +2039,7 @@ const MainFrame = (props: Props) => {
// can happen if another project was loaded in the meantime.
setState(state => ({
...state,
currentFileMetadata: enrichedFileMetadata,
currentFileMetadata: fileMetadata,
}));
}
} catch (rawError) {
@@ -2127,7 +2131,6 @@ const MainFrame = (props: Props) => {
// At the end of the promise below, currentProject and storageProvider
// may have changed (if the user opened another project). So we read and
// store their values in variables now.
const projectName = currentProject.getName();
const storageProviderInternalName = getStorageProvider().internalName;
const { wasSaved, fileMetadata } = await onSaveProject(
@@ -2139,12 +2142,9 @@ const MainFrame = (props: Props) => {
console.info(
`Project saved in ${performance.now() - saveStartTime}ms.`
);
const enrichedFileMetadata = fileMetadata.name
? fileMetadata
: { ...fileMetadata, name: projectName };
const fileMetadataAndStorageProviderName = {
fileMetadata: enrichedFileMetadata,
fileMetadata: fileMetadata,
storageProviderName: storageProviderInternalName,
};
preferences.insertRecentProjectFile(
@@ -2169,7 +2169,7 @@ const MainFrame = (props: Props) => {
// can happen if another project was loaded in the meantime.
setState(state => ({
...state,
currentFileMetadata: enrichedFileMetadata,
currentFileMetadata: fileMetadata,
}));
}
@@ -2451,7 +2451,6 @@ const MainFrame = (props: Props) => {
setIsProjectOpening(true);
try {
const isCreatingFromExample = !!selectedExampleShortHeader;
const source = selectedExampleShortHeader
? await createNewProjectFromExampleShortHeader({
i18n,
@@ -2461,9 +2460,6 @@ const MainFrame = (props: Props) => {
if (!source) return; // New project creation aborted.
setSelectedExampleShortHeader(null);
await setState(state => ({ ...state, createDialogOpen: false }));
let state: ?State;
const sourceStorageProvider = source.storageProvider;
const sourceStorageProviderOperations = sourceStorageProvider
@@ -2492,12 +2488,11 @@ const MainFrame = (props: Props) => {
currentProject.setVersion('1.0.0');
currentProject.getAuthorIds().clear();
currentProject.setAuthor('');
if (selectedExampleShortHeader)
if (selectedExampleShortHeader) {
// Use the project settings of the example and add template slug to project
currentProject.setTemplateSlug(selectedExampleShortHeader.slug);
if (newProjectSetup.projectName)
currentProject.setName(newProjectSetup.projectName);
if (!isCreatingFromExample) {
// Use the project settings of the example
} else {
// Use the project settings requested by the user
currentProject.setGameResolutionSize(
newProjectSetup.width,
newProjectSetup.height
@@ -2509,6 +2504,10 @@ const MainFrame = (props: Props) => {
}
}
if (newProjectSetup.projectName) {
currentProject.setName(newProjectSetup.projectName);
}
const destinationStorageProviderOperations = getStorageProviderOperations(
newProjectSetup.storageProvider
);
@@ -2564,6 +2563,8 @@ const MainFrame = (props: Props) => {
// We were able to load and then save the project. We can now close the dialog,
// open the project editors and check if leaderboards must be replaced.
setNewProjectSetupDialogOpen(false);
setSelectedExampleShortHeader(null);
await setState(state => ({ ...state, createDialogOpen: false }));
findLeaderboardsToReplace(currentProject, oldProjectId);
openSceneOrProjectManager({
currentProject: currentProject,
@@ -2884,6 +2885,8 @@ const MainFrame = (props: Props) => {
canInstallPrivateAsset,
onChooseProject: () => openOpenFromStorageProviderDialog(),
onOpenRecentFile: openFromFileMetadataWithStorageProvider,
onOpenGamesDashboard: gameId =>
openGameDashboard({ gameId, tab: 'details' }),
onOpenNewProjectSetupDialog: exampleShortHeader => {
setSelectedExampleShortHeader(exampleShortHeader);
setNewProjectSetupDialogOpen(true);

View File

@@ -2,8 +2,8 @@
import { Trans } from '@lingui/macro';
import React from 'react';
import { Column, Line } from '../../../UI/Grid';
import { LineStackLayout } from '../../../UI/Layout';
import { Column } from '../../../UI/Grid';
import { LineStackLayout, ResponsiveLineStackLayout } from '../../../UI/Layout';
import ImagePreview from '../../../ResourcesList/ResourcePreview/ImagePreview';
import Replay from '@material-ui/icons/Replay';
import PlayArrow from '@material-ui/icons/PlayArrow';
@@ -14,6 +14,7 @@ import FlatButton from '../../../UI/FlatButton';
import Text from '../../../UI/Text';
import useForceUpdate from '../../../Utils/UseForceUpdate';
import PlaceholderLoader from '../../../UI/PlaceholderLoader';
import { useResponsiveWindowWidth } from '../../../UI/Reponsive/ResponsiveWindowMeasurer';
const styles = {
// This container is important to have the loader positioned on top of the image.
@@ -21,6 +22,8 @@ const styles = {
position: 'relative',
display: 'flex',
flex: 1,
width: '100%', // Needed for ImagePreview to be able to scroll horizontally
height: 'calc(100% - 80px)', // 80px are allocated to the space the play pause button line can take once the responsive line stack layout is collapsed
},
loaderContainer: {
position: 'absolute',
@@ -41,7 +44,6 @@ type Props = {|
resourceNames: string[],
getImageResourceSource: (resourceName: string) => string,
isImageResourceSmooth: (resourceName: string) => boolean,
project: gdProject,
timeBetweenFrames: number,
onChangeTimeBetweenFrames?: number => void,
isLooping: boolean,
@@ -59,7 +61,6 @@ const AnimationPreview = ({
resourceNames,
getImageResourceSource,
isImageResourceSmooth,
project,
timeBetweenFrames,
onChangeTimeBetweenFrames,
isLooping,
@@ -72,6 +73,7 @@ const AnimationPreview = ({
hideAnimationLoader,
}: Props) => {
const forceUdpate = useForceUpdate();
const windowWidth = useResponsiveWindowWidth();
// Use state for elements that don't need to be read from inside the animation callback.
const [fps, setFps] = React.useState<number>(
@@ -238,94 +240,108 @@ const AnimationPreview = ({
return (
<Column expand noOverflowParent noMargin>
<Line noMargin expand>
<div style={styles.imageContainer}>
<ImagePreview
resourceName={resourceName}
imageResourceSource={getImageResourceSource(resourceName)}
isImageResourceSmooth={isImageResourceSmooth(resourceName)}
initialZoom={initialZoom}
project={project}
hideCheckeredBackground={hideCheckeredBackground}
hideControls={hideControls}
fixedHeight={fixedHeight}
fixedWidth={fixedWidth}
onImageLoaded={onImageLoaded}
isImagePrivate={isAssetPrivate}
hideLoader // Handled by the animation preview, important to let the browser cache the image.
/>
{!hideAnimationLoader && isStillLoadingResources && (
<div style={styles.loaderContainer}>
<PlaceholderLoader />
</div>
)}
</div>
</Line>
<div style={styles.imageContainer}>
<ImagePreview
resourceName={resourceName}
imageResourceSource={getImageResourceSource(resourceName)}
isImageResourceSmooth={isImageResourceSmooth(resourceName)}
initialZoom={initialZoom}
hideCheckeredBackground={hideCheckeredBackground}
hideControls={hideControls}
fixedHeight={fixedHeight}
fixedWidth={fixedWidth}
onImageLoaded={onImageLoaded}
isImagePrivate={isAssetPrivate}
hideLoader // Handled by the animation preview, important to let the browser cache the image.
/>
{!hideAnimationLoader && isStillLoadingResources && (
<div style={styles.loaderContainer}>
<PlaceholderLoader />
</div>
)}
</div>
{!hideControls && (
<LineStackLayout noMargin alignItems="center">
<Text>
<Trans>FPS:</Trans>
</Text>
<TextField
margin="none"
value={fps}
onChange={(e, text) => {
const fps = parseFloat(text);
if (fps > 0) {
setFps(fps);
const newTimeBetweenFrames = parseFloat((1 / fps).toFixed(4));
timeBetweenFramesRef.current = newTimeBetweenFrames;
if (onChangeTimeBetweenFrames) {
onChangeTimeBetweenFrames(newTimeBetweenFrames);
}
replay();
}
}}
id="direction-time-between-frames"
type="number"
step={1}
min={1}
max={100}
style={styles.timeField}
autoFocus={true}
/>
<Timer style={styles.timeIcon} />
<TextField
margin="none"
value={timeBetweenFramesRef.current}
onChange={(e, text) => {
const time = parseFloat(text);
if (time > 0) {
setFps(Math.round(1 / time));
timeBetweenFramesRef.current = time;
if (onChangeTimeBetweenFrames) {
onChangeTimeBetweenFrames(time);
}
replay();
}
}}
id="direction-time-between-frames"
type="number"
step={0.005}
precision={2}
min={0.01}
max={5}
style={styles.timeField}
/>
<FlatButton
leftIcon={<Replay />}
label={<Trans>Replay</Trans>}
onClick={replay}
/>
<FlatButton
leftIcon={!!pausedRef.current ? <PlayArrow /> : <Pause />}
label={!!pausedRef.current ? 'Play' : 'Pause'}
onClick={() => {
pausedRef.current = !pausedRef.current;
forceUdpate();
}}
/>
</LineStackLayout>
// Column used to not have the expand behavior when responsive line stack layout is a column
<Column noMargin>
<ResponsiveLineStackLayout alignItems="center">
<LineStackLayout
alignItems="center"
justifyContent="center"
noMargin
>
<Text>
<Trans>FPS:</Trans>
</Text>
<TextField
margin="none"
value={fps}
onChange={(e, text) => {
const fps = parseFloat(text);
if (fps > 0) {
setFps(fps);
const newTimeBetweenFrames = parseFloat(
(1 / fps).toFixed(4)
);
timeBetweenFramesRef.current = newTimeBetweenFrames;
if (onChangeTimeBetweenFrames) {
onChangeTimeBetweenFrames(newTimeBetweenFrames);
}
replay();
}
}}
id="direction-time-between-frames"
type="number"
step={1}
min={1}
max={100}
style={styles.timeField}
autoFocus={windowWidth !== 'small'} // Do not autofocus textfield if on mobile
/>
<Timer style={styles.timeIcon} />
<TextField
margin="none"
value={timeBetweenFramesRef.current}
onChange={(e, text) => {
const time = parseFloat(text);
if (time > 0) {
setFps(Math.round(1 / time));
timeBetweenFramesRef.current = time;
if (onChangeTimeBetweenFrames) {
onChangeTimeBetweenFrames(time);
}
replay();
}
}}
id="direction-time-between-frames"
type="number"
step={0.005}
precision={2}
min={0.01}
max={5}
style={styles.timeField}
/>
</LineStackLayout>
<LineStackLayout
alignItems="center"
justifyContent="center"
noMargin
>
<FlatButton
leftIcon={<Replay />}
label={<Trans>Replay</Trans>}
onClick={replay}
/>
<FlatButton
leftIcon={!!pausedRef.current ? <PlayArrow /> : <Pause />}
label={!!pausedRef.current ? 'Play' : 'Pause'}
onClick={() => {
pausedRef.current = !pausedRef.current;
forceUdpate();
}}
/>
</LineStackLayout>
</ResponsiveLineStackLayout>
</Column>
)}
</Column>
);

View File

@@ -236,7 +236,6 @@ const CollisionMasksEditor = ({
project,
resourceName
)}
project={project}
onSize={setCurrentSpriteSize}
renderOverlay={overlayProps =>
sprite && (

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