Files
WorldOfSolariaV1/WorldOfSolariaV1.json
T
2026-08-13 20:07:54 -04:00

17862 lines
639 KiB
JSON

{
"firstLayout": "",
"gdVersion": {
"build": 274,
"major": 5,
"minor": 6,
"revision": 0
},
"initialGDVersion": "5.6.279",
"properties": {
"adaptGameResolutionAtRuntime": true,
"antialiasingMode": "MSAA",
"antialisingEnabledOnMobile": false,
"folderProject": false,
"orientation": "landscape",
"packageName": "com.example.gamename",
"pixelsRounding": true,
"projectUuid": "459bb859-e4c7-45fe-a4a8-13e8403e786f",
"scaleMode": "nearest",
"sizeOnStartupMode": "adaptWidth",
"templateSlug": "",
"version": "1.0.0",
"name": "WorldOfSolariaV1",
"description": "",
"author": "",
"windowWidth": 768,
"windowHeight": 432,
"latestCompilationDirectory": "",
"maxFPS": 60,
"minFPS": 20,
"verticalSync": false,
"platformSpecificAssets": {
"android-icon-144": "",
"android-icon-192": "",
"android-icon-36": "",
"android-icon-48": "",
"android-icon-72": "",
"android-icon-96": "",
"android-windowSplashScreenAnimatedIcon": "",
"desktop-icon-512": "",
"ios-icon-100": "",
"ios-icon-1024": "",
"ios-icon-114": "",
"ios-icon-120": "",
"ios-icon-144": "",
"ios-icon-152": "",
"ios-icon-167": "",
"ios-icon-180": "",
"ios-icon-20": "",
"ios-icon-29": "",
"ios-icon-40": "",
"ios-icon-50": "",
"ios-icon-57": "",
"ios-icon-58": "",
"ios-icon-60": "",
"ios-icon-72": "",
"ios-icon-76": "",
"ios-icon-80": "",
"ios-icon-87": ""
},
"loadingScreen": {
"backgroundColor": 0,
"backgroundFadeInDuration": 0.2,
"backgroundImageResourceName": "",
"gdevelopLogoStyle": "light",
"logoAndProgressFadeInDuration": 0.2,
"logoAndProgressLogoFadeInDelay": 0,
"minDuration": 1.5,
"progressBarColor": 16777215,
"progressBarHeight": 20,
"progressBarMaxWidth": 200,
"progressBarMinWidth": 40,
"progressBarWidthPercent": 30,
"showGDevelopSplash": true,
"showProgressBar": true
},
"watermark": {
"placement": "bottom-left",
"showWatermark": true
},
"authorIds": [],
"authorUsernames": [],
"categories": [],
"playableDevices": [],
"extensionProperties": [],
"platforms": [
{
"name": "GDevelop JS platform"
}
],
"currentPlatform": "GDevelop JS platform"
},
"resources": {
"resources": [
{
"file": "assets/NewSprite.png",
"kind": "image",
"metadata": "{\"extension\":\".png\"}",
"name": "NewSprite",
"smoothed": false,
"userAdded": false
},
{
"file": "assets/tempLogo.png",
"kind": "image",
"metadata": "{\"extension\":\".png\"}",
"name": "tempLogo",
"smoothed": false,
"userAdded": false
},
{
"file": "assets/tempLogo.png",
"kind": "image",
"metadata": "",
"name": "assets/tempLogo.png",
"smoothed": false,
"userAdded": false
},
{
"file": "assets/tempLogo3.png",
"kind": "image",
"metadata": "",
"name": "assets/tempLogo3.png",
"smoothed": false,
"userAdded": false
},
{
"file": "assets/NewSprite2.png",
"kind": "image",
"metadata": "{\"extension\":\".png\"}",
"name": "NewSprite2",
"smoothed": false,
"userAdded": false
},
{
"file": "assets/tempTitle.png",
"kind": "image",
"metadata": "",
"name": "assets/tempTitle.png",
"smoothed": false,
"userAdded": false
},
{
"file": "assets/8BitOperatorPlus8Regular_Edited.png",
"kind": "image",
"metadata": "",
"name": "assets\\8BitOperatorPlus8Regular_Edited.png",
"smoothed": false,
"userAdded": false,
"origin": {
"identifier": "https://asset-resources.gdevelop.io/public-resources/Menu buttons/Pixel art/15c1797cbcb41c3a753b6bbb21cfa60284cfaf81c9891c3abf78a8e0e1cacf59_8BitOperatorPlus8Regular_Edited.png",
"name": "8BitOperatorPlus8Regular_Edited.png"
}
},
{
"file": "assets/Small Blue Button_Hovered.png",
"kind": "image",
"metadata": "",
"name": "assets\\Small Blue Button_Hovered.png",
"smoothed": false,
"userAdded": false,
"origin": {
"identifier": "https://asset-resources.gdevelop.io/public-resources/Menu buttons/Pixel art/f80ae062891a0a4612c0160ed931165461392019f89a8545f28c195f645ebc48_Small Blue Button_Hovered.png",
"name": "Small Blue Button_Hovered.png"
}
},
{
"file": "assets/Small Blue Button_Idle.png",
"kind": "image",
"metadata": "",
"name": "assets\\Small Blue Button_Idle.png",
"smoothed": false,
"userAdded": false,
"origin": {
"identifier": "https://asset-resources.gdevelop.io/public-resources/Menu buttons/Pixel art/c22b15c77047f1545806141e1129900bdc985d191b7ab5ebaae834a90c270ed2_Small Blue Button_Idle.png",
"name": "Small Blue Button_Idle.png"
}
},
{
"file": "assets/Small Blue Button_Pressed.png",
"kind": "image",
"metadata": "",
"name": "assets\\Small Blue Button_Pressed.png",
"smoothed": false,
"userAdded": false,
"origin": {
"identifier": "https://asset-resources.gdevelop.io/public-resources/Menu buttons/Pixel art/9e01b09016c6a200b53a55cac3cf34f083785eb6b9f55de490a71ad352858b36_Small Blue Button_Pressed.png",
"name": "Small Blue Button_Pressed.png"
}
},
{
"file": "assets/8BitOperatorPlus8Regular_Edited.fnt",
"kind": "bitmapFont",
"metadata": "",
"name": "assets\\8BitOperatorPlus8Regular_Edited.fnt",
"userAdded": false,
"origin": {
"identifier": "https://asset-resources.gdevelop.io/public-resources/Menu buttons/Pixel art/6b410f07a3a02e721a49d41795e84b56707ef28ac4d095d55f1fd1093760e134_8BitOperatorPlus8Regular_Edited.fnt",
"name": "8BitOperatorPlus8Regular_Edited.fnt"
}
}
]
},
"objects": [
{
"assetStoreId": "",
"name": "shp_fade",
"persistentUuid": "7c029e6d-47df-4889-bb1b-6130d9888e56",
"type": "PrimitiveDrawing::Drawer",
"variables": [],
"effects": [],
"behaviors": [
{
"name": "FlashTransitionPainter",
"type": "FlashTransitionPainter::FlashTransitionPainter",
"Progress": 0,
"Duration": 0,
"Type": "",
"Direction": "",
"MaxOpacity": 255
}
],
"fillOpacity": 255,
"outlineSize": 1,
"outlineOpacity": 255,
"absoluteCoordinates": false,
"clearBetweenFrames": true,
"antialiasing": "none",
"fillColor": {
"r": 255,
"g": 255,
"b": 255
},
"outlineColor": {
"r": 0,
"g": 0,
"b": 0
}
}
],
"objectsFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"folderName": "Fade",
"children": [
{
"objectName": "shp_fade"
}
]
}
]
},
"objectsGroups": [],
"variables": [
{
"name": "host",
"type": "string",
"value": ""
}
],
"layouts": [
{
"b": 14,
"disableInputWhenNotFocused": true,
"mangledName": "Splash",
"name": "Splash",
"r": 14,
"standardSortMethod": true,
"stopSoundsOnStartup": true,
"title": "",
"v": 14,
"uiSettings": {
"grid": true,
"gridType": "rectangular",
"gridWidth": 16,
"gridHeight": 16,
"gridDepth": 32,
"gridOffsetX": 0,
"gridOffsetY": 0,
"gridOffsetZ": 0,
"gridColor": 10401023,
"gridAlpha": 0.8,
"snap": true,
"zoomFactor": 1.1726229638177634,
"windowMask": false,
"selectedLayer": "",
"gameEditorMode": "instances-editor"
},
"objectsGroups": [],
"variables": [],
"instances": [
{
"angle": 0,
"customSize": true,
"depth": 1,
"height": 224,
"keepRatio": true,
"layer": "",
"name": "spr_studioLogo",
"persistentUuid": "a65e3907-a834-4122-b84c-e184ed30d7a5",
"width": 480,
"x": 144,
"y": 96,
"zOrder": 1,
"numberProperties": [],
"stringProperties": [],
"initialVariables": []
},
{
"angle": 0,
"customSize": false,
"height": 0,
"keepRatio": true,
"layer": "",
"name": "shp_fade",
"persistentUuid": "43c12b31-9f4a-4fd7-970e-a848140da139",
"width": 0,
"x": 640,
"y": 0,
"zOrder": 2,
"numberProperties": [],
"stringProperties": [],
"initialVariables": []
}
],
"objects": [
{
"adaptCollisionMaskAutomatically": true,
"assetStoreId": "",
"name": "spr_studioLogo",
"persistentUuid": "d8d7a523-1dfa-4cd4-9080-3d6c7deb792f",
"type": "Sprite",
"updateIfNotVisible": false,
"variables": [],
"effects": [],
"behaviors": [],
"animations": [
{
"name": "tempLogo",
"useMultipleDirections": false,
"directions": [
{
"looping": false,
"metadata": "{\"pskl\":{}}",
"timeBetweenFrames": 0.08,
"sprites": [
{
"hasCustomCollisionMask": true,
"image": "tempLogo",
"points": [],
"originPoint": {
"name": "origine",
"x": 0,
"y": 0
},
"centerPoint": {
"automatic": true,
"name": "centre",
"x": 0,
"y": 0
},
"customCollisionMask": [
[
{
"x": 0,
"y": 0
},
{
"x": 640,
"y": 0
},
{
"x": 640,
"y": 304
},
{
"x": 0,
"y": 304
}
]
]
}
]
}
]
}
]
}
],
"objectsFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"folderName": "Sprites",
"children": [
{
"objectName": "spr_studioLogo"
}
]
}
]
},
"events": [
{
"type": "BuiltinCommonInstructions::Link",
"include": {
"includeConfig": 0
},
"target": "Functions"
},
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Scene Start",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "SceneJustBegins"
},
"parameters": [
""
]
}
],
"actions": [
{
"type": {
"value": "SetWindowSize"
},
"parameters": [
"",
"768",
"432",
""
]
},
{
"type": {
"value": "CenterWindow"
},
"parameters": [
""
]
},
{
"type": {
"value": "AdvancedWindow::SetResizable"
},
"parameters": [
"",
""
]
},
{
"type": {
"value": "Wait"
},
"parameters": [
"3"
]
},
{
"type": {
"value": "FlashTransitionPainter::FlashTransitionPainter::PaintEffect"
},
"parameters": [
"shp_fade",
"FlashTransitionPainter",
"\"0;0;0\"",
"1",
"\"Flash\"",
"\"Forward\"",
"255",
""
]
},
{
"type": {
"value": "Wait"
},
"parameters": [
"1"
]
},
{
"type": {
"value": "Scene"
},
"parameters": [
"",
"\"Title\"",
""
]
}
]
}
],
"parameters": []
},
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Host Device",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "SystemInfo::HasTouchScreen"
},
"parameters": [
""
]
}
],
"actions": [
{
"type": {
"value": "SetStringVariable"
},
"parameters": [
"host",
"=",
"\"touchscreen\""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "SystemInfo::IsNativeDesktopApp"
},
"parameters": [
""
]
}
],
"actions": [
{
"type": {
"value": "SetStringVariable"
},
"parameters": [
"host",
"=",
"\"desktop\""
]
}
]
}
],
"parameters": []
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": []
}
],
"layers": [
{
"ambientLightColorB": 200,
"ambientLightColorG": 200,
"ambientLightColorR": 200,
"camera2DPlaneMaxDrawingDistance": 5000,
"camera3DFarPlaneDistance": 10000,
"camera3DFieldOfView": 45,
"camera3DNearPlaneDistance": 3,
"cameraType": "",
"followBaseLayerCamera": false,
"isLightingLayer": false,
"isLocked": false,
"name": "",
"renderingType": "",
"visibility": true,
"cameras": [
{
"defaultSize": true,
"defaultViewport": true,
"height": 0,
"viewportBottom": 1,
"viewportLeft": 0,
"viewportRight": 1,
"viewportTop": 0,
"width": 0
}
],
"effects": [
{
"effectType": "Scene3D::HemisphereLight",
"name": "3D Ambient Hemisphere Light",
"doubleParameters": {
"elevation": 40,
"intensity": 0.33,
"rotation": 300
},
"stringParameters": {
"groundColor": "127;127;127",
"skyColor": "255;255;255",
"top": "Z+"
},
"booleanParameters": {}
},
{
"effectType": "Scene3D::DirectionalLight",
"name": "3D Sun Light",
"doubleParameters": {
"distanceFromCamera": 1500,
"elevation": 40,
"frustumSize": 4000,
"intensity": 0.75,
"minimumShadowBias": 0,
"rotation": 300
},
"stringParameters": {
"color": "255;255;255",
"shadowQuality": "medium",
"top": "Z+"
},
"booleanParameters": {
"isCastingShadow": true
}
}
]
}
],
"behaviorsSharedData": [
{
"name": "Animation",
"type": "AnimatableCapability::AnimatableBehavior"
},
{
"name": "Effect",
"type": "EffectCapability::EffectBehavior"
},
{
"name": "FlashTransitionPainter",
"type": "FlashTransitionPainter::FlashTransitionPainter"
},
{
"name": "Flippable",
"type": "FlippableCapability::FlippableBehavior"
},
{
"name": "Opacity",
"type": "OpacityCapability::OpacityBehavior"
},
{
"name": "Resizable",
"type": "ResizableCapability::ResizableBehavior"
},
{
"name": "Scale",
"type": "ScalableCapability::ScalableBehavior"
}
]
},
{
"b": 255,
"disableInputWhenNotFocused": true,
"mangledName": "Title",
"name": "Title",
"r": 247,
"standardSortMethod": true,
"stopSoundsOnStartup": true,
"title": "",
"v": 249,
"uiSettings": {
"grid": true,
"gridType": "rectangular",
"gridWidth": 16,
"gridHeight": 16,
"gridDepth": 32,
"gridOffsetX": 0,
"gridOffsetY": 0,
"gridOffsetZ": 0,
"gridColor": 10401023,
"gridAlpha": 0.8,
"snap": true,
"zoomFactor": 0.9114583333333334,
"windowMask": false,
"selectedLayer": "",
"gameEditorMode": "instances-editor"
},
"objectsGroups": [],
"variables": [],
"instances": [
{
"angle": 0,
"customSize": true,
"depth": 1,
"height": 432,
"keepRatio": true,
"layer": "",
"name": "spr_tempTitle",
"persistentUuid": "7c69ad43-c862-4f49-b2a0-f7aa2a009e17",
"width": 768,
"x": 0,
"y": 0,
"zOrder": 1,
"numberProperties": [],
"stringProperties": [],
"initialVariables": []
},
{
"angle": 0,
"customSize": false,
"height": 0,
"keepRatio": true,
"layer": "",
"name": "shp_fade",
"persistentUuid": "b2376dc0-a75e-41fc-b571-46598d263229",
"width": 0,
"x": 768,
"y": 0,
"zOrder": 2,
"numberProperties": [],
"stringProperties": [],
"initialVariables": []
},
{
"angle": 0,
"customSize": false,
"height": 0,
"keepRatio": true,
"layer": "",
"name": "btn_login",
"persistentUuid": "1094a52f-c2c7-43fd-9c08-fd6d96bf9310",
"width": 0,
"x": 208,
"y": 352,
"zOrder": 3,
"numberProperties": [],
"stringProperties": [],
"initialVariables": []
},
{
"angle": 0,
"customSize": false,
"height": 0,
"keepRatio": true,
"layer": "",
"name": "btn_register",
"persistentUuid": "985c1bc0-a895-4ac6-8cfb-27f8999e9fa1",
"width": 0,
"x": 400,
"y": 352,
"zOrder": 4,
"numberProperties": [],
"stringProperties": [],
"initialVariables": []
},
{
"angle": 0,
"customSize": false,
"height": 0,
"keepRatio": true,
"layer": "",
"name": "btn_settings",
"persistentUuid": "e0c76744-0bfc-491c-8182-c8f0dc1d5d73",
"width": 0,
"x": 688,
"y": 16,
"zOrder": 5,
"numberProperties": [],
"stringProperties": [],
"initialVariables": []
}
],
"objects": [
{
"adaptCollisionMaskAutomatically": true,
"assetStoreId": "",
"name": "spr_tempTitle",
"persistentUuid": "d772eb58-a6cd-4786-9454-1d305a42c932",
"type": "Sprite",
"updateIfNotVisible": false,
"variables": [],
"effects": [],
"behaviors": [],
"animations": [
{
"name": "",
"useMultipleDirections": false,
"directions": [
{
"looping": false,
"timeBetweenFrames": 0.08,
"sprites": [
{
"hasCustomCollisionMask": true,
"image": "assets/tempTitle.png",
"points": [],
"originPoint": {
"name": "origine",
"x": 0,
"y": 0
},
"centerPoint": {
"automatic": true,
"name": "centre",
"x": 0,
"y": 0
},
"customCollisionMask": [
[
{
"x": 0,
"y": 0
},
{
"x": 640,
"y": 0
},
{
"x": 640,
"y": 480
},
{
"x": 0,
"y": 480
}
]
]
}
]
}
]
}
]
},
{
"assetStoreId": "80b9ddd78c8727888bb53c7524f443682746667b1ba493c223114c04e7661bbf",
"name": "btn_login",
"persistentUuid": "510c8083-e726-45db-abbd-3ce87aeaa45f",
"type": "PanelSpriteButton::PanelSpriteButton",
"variant": "Small Blue Button",
"variables": [],
"effects": [],
"behaviors": [],
"content": {
"LabelText": "Login",
"PressedLabelOffsetY": 2
}
},
{
"assetStoreId": "80b9ddd78c8727888bb53c7524f443682746667b1ba493c223114c04e7661bbf",
"name": "btn_register",
"persistentUuid": "dfc9eada-5314-4e7b-ba3c-fdde292f095b",
"type": "PanelSpriteButton::PanelSpriteButton",
"variant": "Small Blue Button",
"variables": [],
"effects": [],
"behaviors": [],
"content": {
"LabelText": "Register",
"PressedLabelOffsetY": 2
}
},
{
"assetStoreId": "90c9b872a1439405f56d1591e01d6b9fe5dadc4dc1c3afc0bdd98f763b340fa0",
"name": "btn_settings",
"persistentUuid": "4ce8f8a6-d5f7-44d7-8681-c71ba077bf4b",
"type": "PanelSpriteButton::PanelSpriteButton",
"variant": "Tiny Blue Button",
"variables": [],
"effects": [],
"behaviors": [],
"content": {
"LabelText": "Settings",
"PressedLabelOffsetY": 2
}
}
],
"objectsFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"objectName": "spr_tempTitle"
},
{
"objectName": "btn_login"
},
{
"objectName": "btn_register"
},
{
"objectName": "btn_settings"
}
]
},
"events": [
{
"type": "BuiltinCommonInstructions::Link",
"include": {
"includeConfig": 0
},
"target": "Functions"
}
],
"layers": [
{
"ambientLightColorB": 200,
"ambientLightColorG": 200,
"ambientLightColorR": 200,
"camera2DPlaneMaxDrawingDistance": 5000,
"camera3DFarPlaneDistance": 10000,
"camera3DFieldOfView": 45,
"camera3DNearPlaneDistance": 3,
"cameraType": "",
"followBaseLayerCamera": false,
"isLightingLayer": false,
"isLocked": false,
"name": "",
"renderingType": "",
"visibility": true,
"cameras": [
{
"defaultSize": true,
"defaultViewport": true,
"height": 0,
"viewportBottom": 1,
"viewportLeft": 0,
"viewportRight": 1,
"viewportTop": 0,
"width": 0
}
],
"effects": [
{
"effectType": "Scene3D::HemisphereLight",
"name": "3D Ambient Hemisphere Light",
"doubleParameters": {
"elevation": 40,
"intensity": 0.33,
"rotation": 300
},
"stringParameters": {
"groundColor": "127;127;127",
"skyColor": "255;255;255",
"top": "Z+"
},
"booleanParameters": {}
},
{
"effectType": "Scene3D::DirectionalLight",
"name": "3D Sun Light",
"doubleParameters": {
"distanceFromCamera": 1500,
"elevation": 40,
"frustumSize": 4000,
"intensity": 0.75,
"minimumShadowBias": 0,
"rotation": 300
},
"stringParameters": {
"color": "255;255;255",
"shadowQuality": "medium",
"top": "Z+"
},
"booleanParameters": {
"isCastingShadow": true
}
}
]
}
],
"behaviorsSharedData": [
{
"name": "Animation",
"type": "AnimatableCapability::AnimatableBehavior"
},
{
"name": "Effect",
"type": "EffectCapability::EffectBehavior"
},
{
"name": "FlashTransitionPainter",
"type": "FlashTransitionPainter::FlashTransitionPainter"
},
{
"name": "Flippable",
"type": "FlippableCapability::FlippableBehavior"
},
{
"name": "Opacity",
"type": "OpacityCapability::OpacityBehavior"
},
{
"name": "Resizable",
"type": "ResizableCapability::ResizableBehavior"
},
{
"name": "Scale",
"type": "ScalableCapability::ScalableBehavior"
}
]
}
],
"externalEvents": [
{
"associatedLayout": "Splash",
"name": "Functions",
"events": [
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Scene Start",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "SceneJustBegins"
},
"parameters": [
""
]
}
],
"actions": [
{
"type": {
"value": "FlashTransitionPainter::FlashTransitionPainter::PaintEffect"
},
"parameters": [
"shp_fade",
"FlashTransitionPainter",
"\"0;0;0\"",
"1",
"\"Flash\"",
"\"Backward\"",
"255",
""
]
},
{
"type": {
"value": "Wait"
},
"parameters": [
"1"
]
}
]
}
],
"parameters": []
}
]
}
],
"eventsFunctionsExtensions": [
{
"author": "Bouh",
"category": "Input",
"dimension": "",
"extensionNamespace": "",
"fullName": "Gamepads (controllers)",
"gdevelopVersion": ">=5.5.222",
"helpPath": "/all-features/gamepad",
"iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWdhbWVwYWQtdmFyaWFudC1vdXRsaW5lIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTYsOUg4VjExSDEwVjEzSDhWMTVINlYxM0g0VjExSDZWOU0xOC41LDlBMS41LDEuNSAwIDAsMSAyMCwxMC41QTEuNSwxLjUgMCAwLDEgMTguNSwxMkExLjUsMS41IDAgMCwxIDE3LDEwLjVBMS41LDEuNSAwIDAsMSAxOC41LDlNMTUuNSwxMkExLjUsMS41IDAgMCwxIDE3LDEzLjVBMS41LDEuNSAwIDAsMSAxNS41LDE1QTEuNSwxLjUgMCAwLDEgMTQsMTMuNUExLjUsMS41IDAgMCwxIDE1LjUsMTJNMTcsNUE3LDcgMCAwLDEgMjQsMTJBNyw3IDAgMCwxIDE3LDE5QzE1LjA0LDE5IDEzLjI3LDE4LjIgMTIsMTYuOUMxMC43MywxOC4yIDguOTYsMTkgNywxOUE3LDcgMCAwLDEgMCwxMkE3LDcgMCAwLDEgNyw1SDE3TTcsN0E1LDUgMCAwLDAgMiwxMkE1LDUgMCAwLDAgNywxN0M4LjY0LDE3IDEwLjA5LDE2LjIxIDExLDE1SDEzQzEzLjkxLDE2LjIxIDE1LjM2LDE3IDE3LDE3QTUsNSAwIDAsMCAyMiwxMkE1LDUgMCAwLDAgMTcsN0g3WiIgLz48L3N2Zz4=",
"name": "Gamepads",
"previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/gamepad-variant-outline.svg",
"shortDescription": "Gamepad/controller support: buttons, sticks, triggers, vibration. Mapper behaviors for 2D/3D.",
"version": "0.9.2",
"description": [
"Add support for gamepads (or other physical controllers).",
"",
"It gives access to:",
"- button presses,",
"- axis positions and force,",
"- trigger pressure,",
"- configurable deadzone,",
"- vibration,",
"- automatic \"gamepad mapper\" behaviors for 2D and 3D movement behaviors (platformer characters, top-down movement, 3D character etc...). Add one of these to the object with the movement behavior (i.e: the player most of the time) and the behavior will then be controlled automatically by the gamepad (it works by reading the gamepad state and simulating controls). No need for additional events to make it work once the behaviors are set up.",
"",
"The Bomberman-like example handles 4 players with gamepads ([open the project online](https://editor.gdevelop.io/?project=example://goose-bomberman))."
],
"origin": {
"identifier": "Gamepads",
"name": "gdevelop-extension-store"
},
"tags": [
"controllers",
"gamepads",
"joysticks",
"axis",
"xbox",
"ps4",
"platformer",
"platform",
"top-down"
],
"authorIds": [
"2OwwM8ToR9dx9RJ2sAKTcrLmCB92",
"taRwmWxwAFYFL9yyBwB3cwBw0BO2",
"mnImQKdn8nQxwzkS5D6a1JB27V23",
"IWykYNRvhCZBN3vEgKEbBPOR3Oc2"
],
"dependencies": [],
"globalVariables": [],
"sceneVariables": [
{
"name": "Buttons",
"type": "structure",
"children": [
{
"name": "A or Cross",
"type": "string",
"value": "A"
},
{
"name": "B or Circle",
"type": "string",
"value": "B"
},
{
"name": "LB or L1",
"type": "string",
"value": "LB"
},
{
"name": "LT or L2",
"type": "string",
"value": "LT"
},
{
"name": "RB or R1",
"type": "string",
"value": "RB"
},
{
"name": "RT or R2",
"type": "string",
"value": "RT"
},
{
"name": "X or Square",
"type": "string",
"value": "X"
},
{
"name": "Y or Triangle",
"type": "string",
"value": "Y"
}
]
}
],
"eventsFunctions": [
{
"fullName": "",
"functionType": "Action",
"name": "onFirstSceneLoaded",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"if (gdjs._extensionController) {\r",
" return;\r",
"}\r",
"\r",
"/**\r",
" * Associate controller button ids to button names\r",
" */\r",
"const controllerButtonNames = {\r",
" \"XBOX\": {\r",
" 0: \"A\",\r",
" 1: \"B\",\r",
" 2: \"X\",\r",
" 3: \"Y\",\r",
" 4: \"LB\",\r",
" 5: \"RB\",\r",
" 6: \"LT\",\r",
" 7: \"RT\",\r",
" 8: \"BACK\",\r",
" 9: \"START\",\r",
" 10: \"CLICK_STICK_LEFT\",\r",
" 11: \"CLICK_STICK_RIGHT\",\r",
" 12: \"UP\",\r",
" 13: \"DOWN\",\r",
" 14: \"LEFT\",\r",
" 15: \"RIGHT\",\r",
" 16: \"NONE\",\r",
" 17: \"NONE\"\r",
" },\r",
" \"PS4\": {\r",
" 0: \"CROSS\",\r",
" 1: \"CIRCLE\",\r",
" 2: \"SQUARE\",\r",
" 3: \"TRIANGLE\",\r",
" 4: \"L1\",\r",
" 5: \"R1\",\r",
" 6: \"L2\",\r",
" 7: \"R2\",\r",
" 8: \"SHARE\",\r",
" 9: \"OPTIONS\",\r",
" 10: \"CLICK_STICK_LEFT\",\r",
" 11: \"CLICK_STICK_RIGHT\",\r",
" 12: \"UP\",\r",
" 13: \"DOWN\",\r",
" 14: \"LEFT\",\r",
" 15: \"RIGHT\",\r",
" 16: \"PS_BUTTON\",\r",
" 17: \"CLICK_TOUCHPAD\"\r",
" }\r",
"};\r",
"\r",
"/**\r",
" * @param {number} playerId\r",
" */\r",
"function getGamepad(playerId) {\r",
" /** @type {Gamepad[]} */\r",
" const gamepads = navigator.getGamepads ? navigator.getGamepads() : [];\r",
" return gamepads[playerId];\r",
"}\r",
"\r",
"/** @type {{[playerId: number]: Player}} */\r",
"const players = {};\r",
"\r",
"/**\r",
" * @param {number} playerId\r",
" */\r",
"function getPlayer(playerId) {\r",
" let player = players[playerId];\r",
" if (!player) {\r",
" player = new Player(playerId);\r",
" players[playerId] = player;\r",
" }\r",
" return player;\r",
"}\r",
"\r",
"class Player {\r",
" /** @type {number} */\r",
" playerId;\r",
" mapping = 'DEFAULT';\r",
" lastButtonUsed = -1;\r",
" deadzone = 0.2;\r",
" /** @type {{[buttonId: number]: ButtonState}} */\r",
" buttonStates = {};\r",
" rumble = { elapsedTime: 0, duration: 0, weakMagnitude: 0, strongMagnitude: 0 };\r",
"\r",
" /**\r",
" * @param {number} playerId\r",
" */\r",
" constructor(playerId) {\r",
" this.playerId = playerId;\r",
" }\r",
"\r",
" /**\r",
" * @param {number} buttonId\r",
" */\r",
" getButtonState(buttonId) {\r",
" let buttonState = this.buttonStates[buttonId];\r",
" if (!buttonState) {\r",
" buttonState = new ButtonState();\r",
" this.buttonStates[buttonId] = buttonState;\r",
" }\r",
" return buttonState;\r",
" }\r",
"\r",
" /**\r",
" * @param {number} buttonId\r",
" */\r",
" isButtonPressed(buttonId) {\r",
" return this.getButtonState(buttonId).isPressed;\r",
" }\r",
"\r",
" /**\r",
" * @param {number} buttonId\r",
" */\r",
" isButtonJustPressed(buttonId) {\r",
" return this.getButtonState(buttonId).isJustPressed();\r",
" }\r",
"\r",
" /**\r",
" * @param {number} buttonId\r",
" */\r",
" isButtonReleased(buttonId) {\r",
" return this.getButtonState(buttonId).isReleased();\r",
" }\r",
"\r",
" isAnyButtonReleased() {\r",
" for (const buttonId in this.buttonStates) {\r",
" const buttonState = this.buttonStates[buttonId];\r",
" if (buttonState.isReleased()) {\r",
" return true;\r",
" }\r",
" }\r",
" return false;\r",
" }\r",
"\r",
" isAnyButtonPressed() {\r",
" for (const buttonId in this.buttonStates) {\r",
" const buttonState = this.buttonStates[buttonId];\r",
" if (buttonState.isPressed) {\r",
" return true;\r",
" }\r",
" }\r",
" return false;\r",
" }\r",
"}\r",
"\r",
"class ButtonState {\r",
" wasPressed = false;\r",
" isPressed = false;\r",
"\r",
" isReleased() {\r",
" return this.wasPressed && !this.isPressed;\r",
" }\r",
"\r",
" isJustPressed() {\r",
" return !this.wasPressed && this.isPressed;\r",
" }\r",
"}\r",
"\r",
"// Async tasks are run before everything.\r",
"// This is a hack to make sure that button states are updated\r",
"// before mapping behavior events.\r",
"const frameBeginningTask = new class extends gdjs.AsyncTask {\r",
" update() {\r",
" /** @type {Gamepad[]} */\r",
" const gamepads = navigator.getGamepads ? navigator.getGamepads() : [];\r",
" for (let playerId = 0; playerId < gamepads.length; playerId++) {\r",
" const gamepad = gamepads[playerId];\r",
" if (gamepad == null) {\r",
" // The gamepad is not connected.\r",
" continue;\r",
" }\r",
" const player = getPlayer(playerId);\r",
"\r",
" for (let buttonId = 0; buttonId < Object.keys(gamepad.buttons).length; buttonId++) {\r",
" const buttonState = player.getButtonState(buttonId);\r",
" buttonState.wasPressed = buttonState.isPressed;\r",
" buttonState.isPressed = gamepad.buttons[buttonId].pressed;\r",
" if (buttonState.isJustPressed()) {\r",
" player.lastButtonUsed = buttonId;\r",
" }\r",
" }\r",
" }\r",
" return false;\r",
" }\r",
"}();\r",
"\r",
"/**\r",
" * @param {gdjs.RuntimeScene} runtimeScene\r",
" */\r",
"function addFrameBeginningTaskIfNeeded(runtimeScene) {\r",
" const taskManager = runtimeScene.getAsyncTasksManager();\r",
" for (const taskWithCallback of taskManager.tasksWithCallback) {\r",
" if (taskWithCallback.asyncTask === frameBeginningTask) {\r",
" return;\r",
" }\r",
" }\r",
" // Async tasks are run before everything.\r",
" // This is a hack to make sure that button states are updated\r",
" // before mapping behavior events.\r",
" taskManager.addTask(frameBeginningTask);\r",
"}\r",
"\r",
"/**\r",
" * @param {gdjs.RuntimeScene} runtimeScene\r",
" */\r",
"function onScenePostEvents(runtimeScene) {\r",
" addFrameBeginningTaskIfNeeded(runtimeScene);\r",
" /** @type {Gamepad[]} */\r",
" const gamepads = navigator.getGamepads ? navigator.getGamepads() : [];\r",
" for (let playerId = 0; playerId < gamepads.length; playerId++) {\r",
" let gamepad = gamepads[playerId];\r",
" if (gamepad == null) {\r",
" // The gamepad is not connected.\r",
" continue;\r",
" }\r",
" const player = getPlayer(playerId);\r",
" const rumble = player.rumble;\r",
" rumble.elapsedTime += runtimeScene.getElapsedTime(runtimeScene) / 1000;\r",
" if (rumble.duration - rumble.elapsedTime <= 0 &&\r",
" (rumble.weakMagnitude || rumble.strongMagnitude)\r",
" ) {\r",
" rumble.weakMagnitude = 0;\r",
" rumble.strongMagnitude = 0;\r",
" }\r",
" }\r",
"}\r",
"\r",
"/**\r",
" * @param {string} type\r",
" * @param {number} buttonId\r",
" */\r",
"function getInputString(type, buttonId) {\r",
" if (!controllerButtonNames[type]) {\r",
" return \"UNKNOWN_BUTTON\";\r",
" }\r",
" return controllerButtonNames[type][buttonId];\r",
"}\r",
"\r",
"function getButtonId(buttonName) {\r",
" switch (buttonName) {\r",
" case 'A':\r",
" case 'CROSS':\r",
" return 0;\r",
" case 'B':\r",
" case 'CIRCLE':\r",
" return 1;\r",
" case 'X':\r",
" case 'SQUARE':\r",
" return 2;\r",
" case 'Y':\r",
" case 'TRIANGLE':\r",
" return 3;\r",
" case 'LB':\r",
" case 'L1':\r",
" return 4;\r",
" case 'RB':\r",
" case 'R1':\r",
" return 5;\r",
" case 'LT':\r",
" case 'L2':\r",
" return 6;\r",
" case 'RT':\r",
" case 'R2':\r",
" return 7;\r",
" case 'UP':\r",
" return 12;\r",
" case 'DOWN':\r",
" return 13;\r",
" case 'LEFT':\r",
" return 14;\r",
" case 'RIGHT':\r",
" return 15;\r",
" case 'BACK':\r",
" case 'SHARE':\r",
" return 8;\r",
" case 'START':\r",
" case 'OPTIONS':\r",
" return 9;\r",
" case 'CLICK_STICK_LEFT':\r",
" return 10;\r",
" case 'CLICK_STICK_RIGHT':\r",
" return 11;\r",
" //PS4\r",
" case 'PS_BUTTON':\r",
" return 16;\r",
" case 'CLICK_TOUCHPAD':\r",
" return 17;\r",
" default:\r",
" console.error('The gamepad button: ' + buttonName + ' is not valid.');\r",
" return null;\r",
" }\r",
"}\r",
"\r",
"/**\r",
" * @param {number} playerId\r",
" * @param {string} directionName\r",
" * @param {number} axisValueX\r",
" * @param {number} axisValueY\r",
" */\r",
"function isAxisPushed(playerId, directionName, axisValueX, axisValueY) {\r",
" switch (directionName) {\r",
" case 'LEFT':\r",
" return getNormalizedAxisValue(axisValueX, playerId) < 0;\r",
" case 'RIGHT':\r",
" return getNormalizedAxisValue(axisValueX, playerId) > 0;\r",
" case 'UP':\r",
" return getNormalizedAxisValue(axisValueY, playerId) < 0;\r",
" case 'DOWN':\r",
" return getNormalizedAxisValue(axisValueY, playerId) > 0;\r",
" case 'ANY':\r",
" return getNormalizedAxisValue(axisValueX, playerId) < 0\r",
" || getNormalizedAxisValue(axisValueX, playerId) > 0\r",
" || getNormalizedAxisValue(axisValueY, playerId) < 0\r",
" || getNormalizedAxisValue(axisValueY, playerId) > 0\r",
" default:\r",
" console.error('The value stick direction is not valid.');\r",
" return false;\r",
" }\r",
"}\r",
"\r",
"/**\r",
" * @param {number} deltaX\r",
" * @param {number} deltaY\r",
" */\r",
"function axisToAngle(deltaX, deltaY) {\r",
" const rad = Math.atan2(deltaY, deltaX);\r",
" const deg = rad * (180 / Math.PI);\r",
" return deg;\r",
"}\r",
"\r",
"/**\r",
" * @param {{id: string}} gamepad\r",
" */\r",
"function isXbox(gamepad) {\r",
" return (gamepad ? (\r",
" gamepad.id.toUpperCase().indexOf(\"XBOX\") !== -1\r",
" // \"XINPUT\" cannot be used to check if it is a xbox controller is just a generic\r",
" // name reported in Firefox corresponding to the driver being used by the controller\r",
" // https://gamefaqs.gamespot.com/boards/916373-pc/73341312?page=1\r",
" ) : false);\r",
"}\r",
"\r",
"/**\r",
" * Returns the new value taking into account the dead zone for the player_ID given\r",
" * @param {number} value\r",
" * @param {number} playerID\r",
" */\r",
"function getNormalizedAxisValue(value, playerID) {\r",
" // gdjs._extensionController = gdjs._extensionController || { deadzone: 0.2 };\r",
"\r",
" // Anything smaller than this is assumed to be 0,0\r",
" const deadzone = getPlayer(playerID).deadzone;\r",
"\r",
" if (Math.abs(value) < deadzone) {\r",
" return 0;\r",
" } else {\r",
" // We're outside the dead zone, but we'd like to smooth\r",
" // this value out so it still runs nicely between 0..1.\r",
" // That is, we don't want it to jump suddenly from 0 to\r",
" // deadzone.\r",
"\r",
" // Remap value from\r",
" // deadzone..1 to 0..(1-deadzone)\r",
" // or from\r",
" // -1..-deadzone to -(1-deadzone)..0\r",
" value = value - Math.sign(value) * deadzone;\r",
"\r",
" // Remap value from\r",
" // 0..(1-deadzone) to 0..1\r",
" // or from\r",
" // -(1-deadzone)..0 to -1..0\r",
" return value / (1 - deadzone);\r",
" }\r",
"}\r",
"\r",
"gdjs._extensionController = {\r",
" getPlayer,\r",
" controllerButtonNames,\r",
" getInputString,\r",
" getButtonId,\r",
" axisToAngle,\r",
" isXbox,\r",
" getNormalizedAxisValue,\r",
" isAxisPushed,\r",
" getGamepad,\r",
" onScenePostEvents,\r",
" frameBeginningTask,\r",
" addFrameBeginningTaskIfNeeded,\r",
"}"
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"parameters": [],
"objectGroups": []
},
{
"fullName": "",
"functionType": "Action",
"name": "onSceneLoaded",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": "gdjs._extensionController.addFrameBeginningTaskIfNeeded(runtimeScene);",
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": false
}
],
"parameters": [],
"objectGroups": []
},
{
"fullName": "",
"functionType": "Action",
"name": "onScenePostEvents",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"gdjs._extensionController.onScenePostEvents(runtimeScene);",
""
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"parameters": [],
"objectGroups": []
},
{
"fullName": "Accelerated speed",
"functionType": "Expression",
"name": "AcceleratedSpeed",
"private": true,
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"AcceleratedSpeed",
"=",
"CurrentSpeed"
]
}
],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"TargetedSpeed",
"<",
"0"
]
}
],
"actions": [],
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Reduce the speed to match the stick force."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"CurrentSpeed",
"<",
"TargetedSpeed"
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"AcceleratedSpeed",
"=",
"min(TargetedSpeed, CurrentSpeed + Acceleration * TimeDelta())"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"CurrentSpeed",
">",
"TargetedSpeed"
]
},
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"CurrentSpeed",
"<",
"0"
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"AcceleratedSpeed",
"-",
"Acceleration * TimeDelta()"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Turn back at least as fast as it would stop."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"CurrentSpeed",
">=",
"0"
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"AcceleratedSpeed",
"=",
"max(TargetedSpeed, CurrentSpeed - max(Acceleration , Deceleration) * TimeDelta())"
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"TargetedSpeed",
">",
"0"
]
}
],
"actions": [],
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Reduce the speed to match the stick force."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"CurrentSpeed",
">",
"TargetedSpeed"
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"AcceleratedSpeed",
"=",
"max(TargetedSpeed, CurrentSpeed - Acceleration * TimeDelta())"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"CurrentSpeed",
"<",
"TargetedSpeed"
]
},
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"CurrentSpeed",
">",
"0"
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"AcceleratedSpeed",
"+",
"Acceleration * TimeDelta()"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Turn back at least as fast as it would stop."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"CurrentSpeed",
"<=",
"0"
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"AcceleratedSpeed",
"=",
"min(TargetedSpeed, CurrentSpeed + max(Acceleration , Deceleration) * TimeDelta())"
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"TargetedSpeed",
"=",
"0"
]
}
],
"actions": [],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"CurrentSpeed",
"<",
"0"
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"AcceleratedSpeed",
"=",
"min(0, CurrentSpeed + Acceleration * TimeDelta())"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"CurrentSpeed",
">",
"0"
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"AcceleratedSpeed",
"=",
"max(0, CurrentSpeed - Acceleration * TimeDelta())"
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnNumber"
},
"parameters": [
"clamp(AcceleratedSpeed, -SpeedMax, SpeedMax)"
]
}
]
}
],
"variables": [
{
"name": "AcceleratedSpeed",
"type": "number",
"value": 0
}
]
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "Current speed",
"name": "CurrentSpeed",
"type": "expression"
},
{
"description": "Targeted speed",
"name": "TargetedSpeed",
"type": "expression"
},
{
"description": "Max speed",
"name": "SpeedMax",
"type": "expression"
},
{
"description": "Acceleration",
"name": "Acceleration",
"type": "expression"
},
{
"description": "Deceleration",
"name": "Deceleration",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Get the value of the pressure on a gamepad trigger.",
"fullName": "Pressure on a gamepad trigger",
"functionType": "Expression",
"name": "TriggerPressure",
"sentence": "Player _PARAM1_ push axis _PARAM2_ to _PARAM3_",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"\r",
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;\r",
"const trigger = eventsFunctionContext.getArgument(\"Trigger\").toUpperCase();\r",
"\r",
"if (trigger != \"LT\" && trigger != \"RT\" && trigger != \"L2\" && trigger != \"R2\") {\r",
" console.error('Parameter trigger is not valid in expression: \"Pressure on a gamepad trigger\"');\r",
" return;\r",
"}\r",
"/** @type {Gamepad} */\r",
"const gamepad = gdjs._extensionController.getGamepad(playerId);\r",
"if (!gamepad) {\r",
" // The gamepad is not connected.\r",
" return;\r",
"}\r",
"switch (trigger) {\r",
" case 'LT':\r",
" case 'L2':\r",
" eventsFunctionContext.returnValue = gamepad.buttons[6].value;\r",
" break;\r",
"\r",
" case 'RT':\r",
" case 'R2':\r",
" eventsFunctionContext.returnValue = gamepad.buttons[7].value;\r",
" break;\r",
"\r",
" default:\r",
" eventsFunctionContext.returnValue = -1;\r",
" break;\r",
"}"
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
},
{
"description": "Trigger button",
"name": "Trigger",
"supplementaryInformation": "[\"LT\",\"RT\",\"L2\",\"R2\"]",
"type": "stringWithSelector"
}
],
"objectGroups": []
},
{
"description": "the force of gamepad stick (from 0 to 1).",
"fullName": "Stick force",
"functionType": "ExpressionAndCondition",
"name": "StickForce",
"sentence": "the gamepad _PARAM1_ _PARAM2_ stick force",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"const { getNormalizedAxisValue } = gdjs._extensionController;\r",
"\r",
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;\r",
"const stick = eventsFunctionContext.getArgument(\"Stick\").toUpperCase();\r",
"\r",
"if (stick !== \"LEFT\" && stick !== \"RIGHT\") {\r",
" console.error('Parameter stick is not valid in expression: \"Value of a stick force\"');\r",
" return;\r",
"}\r",
"/** @type {Gamepad} */\r",
"const gamepad = gdjs._extensionController.getGamepad(playerId);\r",
"if (!gamepad) {\r",
" // The gamepad is not connected.\r",
" return;\r",
"}\r",
"const axisValueX = stick === 'RIGHT' ? gamepad.axes[2] : gamepad.axes[0];\r",
"const axisValueY = stick === 'RIGHT' ? gamepad.axes[3] : gamepad.axes[1];\r",
"\r",
"eventsFunctionContext.returnValue = gdjs.evtTools.common.clamp(\r",
" Math.abs(getNormalizedAxisValue(axisValueX, playerId)) +\r",
" Math.abs(getNormalizedAxisValue(axisValueY, playerId)), 0, 1);\r",
""
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
},
{
"description": "Stick: \"Left\" or \"Right\"",
"name": "Stick",
"supplementaryInformation": "[\"Left\",\"Right\"]",
"type": "stringWithSelector"
}
],
"objectGroups": []
},
{
"description": "Get the rotation value of a gamepad stick.\nIf the deadzone value is high, the angle value is rounded to main axes, left, left, up, down.\nAn zero deadzone value give a total freedom on the angle value.",
"fullName": "Value of a stick rotation (deprecated)",
"functionType": "Expression",
"name": "StickRotationValue",
"private": true,
"sentence": "Player _PARAM1_ push axis _PARAM2_ to _PARAM3_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnNumber"
},
"parameters": [
"Gamepads::StickAngle(PlayerId, Stick)"
]
}
]
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
},
{
"description": "Stick: \"Left\" or \"Right\"",
"name": "Stick",
"supplementaryInformation": "[\"Left\",\"Right\"]",
"type": "stringWithSelector"
}
],
"objectGroups": []
},
{
"description": "Return the angle of a gamepad stick.\nIf the deadzone value is high, the angle value is rounded to main axes, left, left, up, down.\nAn zero deadzone value give a total freedom on the angle value.",
"fullName": "Stick angle",
"functionType": "Expression",
"name": "StickAngle",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"const { getNormalizedAxisValue } = gdjs._extensionController;\r",
"\r",
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;\r",
"const stick = eventsFunctionContext.getArgument(\"Stick\").toUpperCase();\r",
"\r",
"if (stick !== \"LEFT\" && stick !== \"RIGHT\") {\r",
" console.error('Parameter stick is not valid in expression: \"Value of a stick rotation\"');\r",
" return;\r",
"}\r",
"/** @type {Gamepad} */\r",
"const gamepad = gdjs._extensionController.getGamepad(playerId);\r",
"if (!gamepad) {\r",
" // The gamepad is not connected.\r",
" return;\r",
"}\r",
"const axisValueX = stick === 'RIGHT' ? gamepad.axes[2] : gamepad.axes[0];\r",
"const axisValueY = stick === 'RIGHT' ? gamepad.axes[3] : gamepad.axes[1];\r",
"\r",
"eventsFunctionContext.returnValue = gdjs._extensionController.axisToAngle(\r",
" getNormalizedAxisValue(axisValueX, playerId),\r",
" getNormalizedAxisValue(axisValueY, playerId));"
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
},
{
"description": "Stick: \"Left\" or \"Right\"",
"name": "Stick",
"supplementaryInformation": "[\"Left\",\"Right\"]",
"type": "stringWithSelector"
}
],
"objectGroups": []
},
{
"description": "Get the value of axis of a gamepad stick.",
"fullName": "Value of a gamepad axis (deprecated)",
"functionType": "Expression",
"name": "AxisValue",
"private": true,
"sentence": "Player _PARAM1_ push axis _PARAM2_ to _PARAM3_",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"\r",
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;\r",
"const stick = eventsFunctionContext.getArgument(\"stick\").toUpperCase();\r",
"const direction = eventsFunctionContext.getArgument(\"direction\").toUpperCase();\r",
"\r",
"if (stick != \"LEFT\" && stick != \"RIGHT\") {\r",
" console.error('Parameter stick is not valid in expression: \"Value of a gamepad axis\"');\r",
" return;\r",
"}\r",
"if (direction != \"UP\" && direction != \"DOWN\" && direction != \"LEFT\" && direction != \"RIGHT\" && direction != \"HORIZONTAL\" && direction != \"VERTICAL\") {\r",
" console.error('Parameter direction is not valid in expression: \"Value of a gamepad axis\"');\r",
" return;\r",
"}\r",
"/** @type {Gamepad} */\r",
"const gamepad = gdjs._extensionController.getGamepad(playerId);\r",
"if (!gamepad) {\r",
" // The gamepad is not connected.\r",
" return;\r",
"}\r",
"let parameterError = false;\r",
"switch (stick) {\r",
" case 'LEFT':\r",
" switch (direction) {\r",
" case 'LEFT':\r",
" if (gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[0], playerId) < 0) {\r",
" eventsFunctionContext.returnValue = -gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[0], playerId);\r",
" }\r",
" break;\r",
"\r",
" case 'RIGHT':\r",
" if (gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[0], playerId) > 0) {\r",
" eventsFunctionContext.returnValue = gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[0], playerId);\r",
" }\r",
" break;\r",
"\r",
" case 'UP':\r",
" if (gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[1], playerId) < 0) {\r",
" eventsFunctionContext.returnValue = -gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[1], playerId);\r",
" }\r",
" break;\r",
"\r",
" case 'DOWN':\r",
" if (gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[1], playerId) > 0) {\r",
" eventsFunctionContext.returnValue = gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[1], playerId);\r",
" }\r",
" break;\r",
"\r",
" case \"HORIZONTAL\":\r",
" eventsFunctionContext.returnValue = gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[0], playerId);\r",
" break;\r",
"\r",
" case \"VERTICAL\":\r",
" eventsFunctionContext.returnValue = gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[1], playerId);\r",
" break;\r",
"\r",
" default:\r",
" break;\r",
" }\r",
" break;\r",
"\r",
" case 'RIGHT':\r",
" switch (direction) {\r",
" case 'LEFT':\r",
" if (gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[2], playerId) < 0) {\r",
" eventsFunctionContext.returnValue = -gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[2], playerId);\r",
" }\r",
" break;\r",
"\r",
" case 'RIGHT':\r",
" if (gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[2], playerId) > 0) {\r",
" eventsFunctionContext.returnValue = gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[2], playerId);\r",
" }\r",
" break;\r",
"\r",
" case 'UP':\r",
" if (gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[3], playerId) < 0) {\r",
" eventsFunctionContext.returnValue = -gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[3], playerId);\r",
" }\r",
" break;\r",
"\r",
" case 'DOWN':\r",
" if (gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[3], playerId) > 0) {\r",
" eventsFunctionContext.returnValue = gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[3], playerId);\r",
" }\r",
" break;\r",
"\r",
" case \"HORIZONTAL\":\r",
" eventsFunctionContext.returnValue = gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[2], playerId);\r",
" break;\r",
"\r",
" case \"VERTICAL\":\r",
" eventsFunctionContext.returnValue = gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[3], playerId);\r",
" break;\r",
"\r",
" default:\r",
" break;\r",
" }\r",
" break;\r",
"\r",
" default:\r",
" break;\r",
"}\r",
""
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
},
{
"description": "Stick: \"Left\" or \"Right\"",
"name": "stick",
"supplementaryInformation": "[\"Left\",\"Right\"]",
"type": "stringWithSelector"
},
{
"description": "Direction",
"name": "direction",
"supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"Horizontal\",\"Vertical\"]",
"type": "stringWithSelector"
}
],
"objectGroups": []
},
{
"description": "Return the gamepad stick force on X axis (from -1 at the left to 1 at the right).",
"fullName": "Stick X force",
"functionType": "Expression",
"name": "StickForceX",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"\r",
"const playerId = eventsFunctionContext.getArgument(\"Gamepad\") - 1;\r",
"const stick = eventsFunctionContext.getArgument(\"Stick\").toLowerCase();\r",
"\r",
"if (stick != \"left\" && stick != \"right\") {\r",
" console.error('Parameter stick is not valid in expression: \"Value of a gamepad axis\"');\r",
" return;\r",
"}\r",
"/** @type {Gamepad} */\r",
"const gamepad = gdjs._extensionController.getGamepad(playerId);\r",
"if (!gamepad) {\r",
" // The gamepad is not connected.\r",
" return;\r",
"}\r",
"const axisIndex = stick === 'right' ? 2 : 0;\r",
"eventsFunctionContext.returnValue = gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[axisIndex], playerId);\r",
""
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "Gamepad",
"type": "expression"
},
{
"description": "Stick: \"Left\" or \"Right\"",
"name": "Stick",
"supplementaryInformation": "[\"Left\",\"Right\"]",
"type": "stringWithSelector"
}
],
"objectGroups": []
},
{
"description": "Return the gamepad stick force on Y axis (from -1 at the top to 1 at the bottom).",
"fullName": "Stick Y force",
"functionType": "Expression",
"name": "StickForceY",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"\r",
"const playerId = eventsFunctionContext.getArgument(\"Gamepad\") - 1;\r",
"const stick = eventsFunctionContext.getArgument(\"Stick\").toLowerCase();\r",
"\r",
"if (stick != \"left\" && stick != \"right\") {\r",
" console.error('Parameter stick is not valid in expression: \"Value of a gamepad axis\"');\r",
" return;\r",
"}\r",
"/** @type {Gamepad} */\r",
"const gamepad = gdjs._extensionController.getGamepad(playerId);\r",
"if (!gamepad) {\r",
" // The gamepad is not connected.\r",
" return;\r",
"}\r",
"const axisIndex = stick === 'right' ? 3 : 1;\r",
"eventsFunctionContext.returnValue = gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[axisIndex], playerId);\r",
""
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "Gamepad",
"type": "expression"
},
{
"description": "Stick: \"Left\" or \"Right\"",
"name": "Stick",
"supplementaryInformation": "[\"Left\",\"Right\"]",
"type": "stringWithSelector"
}
],
"objectGroups": []
},
{
"description": "Test if a button is released on a gamepad. Buttons can be:\n* Xbox: \"A\", \"B\", \"X\", \"Y\", \"LB\", \"RB\", \"LT\", \"RT\", \"BACK\", \"START\",\n* PS4: \"CROSS\", \"SQUARE\", \"CIRCLE\", \"TRIANGLE\", \"L1\", \"L2\", \"R1\", \"R2\", \"SHARE\", \"OPTIONS\", \"PS_BUTTON\", \"CLICK_TOUCHPAD\",\n* Other: \"UP\", \"DOWN\", \"LEFT\", \"RIGHT\", \"CLICK_STICK_LEFT\", \"CLICK_STICK_RIGHT\".",
"fullName": "Gamepad button released",
"functionType": "Condition",
"name": "C_Button_released",
"sentence": "Button _PARAM2_ of gamepad _PARAM1_ is released",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"\r",
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;\r",
"const button = eventsFunctionContext.getArgument(\"Button\").toUpperCase();\r",
"\r",
"let buttonId = gdjs._extensionController.getButtonId(button);\r",
"if (buttonId === null) {\r",
" return;\r",
"}\r",
"const player = gdjs._extensionController.getPlayer(playerId)\r",
"eventsFunctionContext.returnValue = player.isButtonReleased(buttonId);"
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
},
{
"description": "Name of the button",
"name": "Button",
"supplementaryInformation": "[\"A\",\"Cross\",\"B\",\"Circle\",\"X\",\"Square\",\"Y\",\"Triangle\",\"LB\",\"L1\",\"RB\",\"R1\",\"LT\",\"L2\",\"RT\",\"R2\",\"Up\",\"Down\",\"Left\",\"Right\",\"Back\",\"Share\",\"Start\",\"Options\",\"Click_Stick_Left\",\"Click_Stick_Right\",\"PS_Button\",\"Click_Touchpad\"]",
"type": "stringWithSelector"
}
],
"objectGroups": []
},
{
"description": "Check if a button was just pressed on a gamepad. Buttons can be:\n* Xbox: \"A\", \"B\", \"X\", \"Y\", \"LB\", \"RB\", \"LT\", \"RT\", \"BACK\", \"START\",\n* PS4: \"CROSS\", \"SQUARE\", \"CIRCLE\", \"TRIANGLE\", \"L1\", \"L2\", \"R1\", \"R2\", \"SHARE\", \"OPTIONS\", \"PS_BUTTON\", \"CLICK_TOUCHPAD\",\n* Other: \"UP\", \"DOWN\", \"LEFT\", \"RIGHT\", \"CLICK_STICK_LEFT\", \"CLICK_STICK_RIGHT\".",
"fullName": "Gamepad button just pressed",
"functionType": "Condition",
"name": "IsButtonJustPressed",
"sentence": "Button _PARAM2_ of gamepad _PARAM1_ was just pressed",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"\r",
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;\r",
"const button = eventsFunctionContext.getArgument(\"Button\").toUpperCase();\r",
"\r",
"let buttonId = gdjs._extensionController.getButtonId(button);\r",
"if (buttonId === null) {\r",
" return;\r",
"}\r",
"const player = gdjs._extensionController.getPlayer(playerId)\r",
"eventsFunctionContext.returnValue = player.isButtonJustPressed(buttonId);"
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
},
{
"description": "Name of the button",
"name": "Button",
"supplementaryInformation": "[\"A\",\"Cross\",\"B\",\"Circle\",\"X\",\"Square\",\"Y\",\"Triangle\",\"LB\",\"L1\",\"RB\",\"R1\",\"LT\",\"L2\",\"RT\",\"R2\",\"Up\",\"Down\",\"Left\",\"Right\",\"Back\",\"Share\",\"Start\",\"Options\",\"Click_Stick_Left\",\"Click_Stick_Right\",\"PS_Button\",\"Click_Touchpad\"]",
"type": "stringWithSelector"
}
],
"objectGroups": []
},
{
"description": "Return the index of the last pressed button of a gamepad.",
"fullName": "Last pressed button (id)",
"functionType": "Expression",
"name": "LastButtonID",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"\r",
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;\r",
"eventsFunctionContext.returnValue = gdjs._extensionController.getPlayer(playerId).lastButtonUsed;"
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Check if any button is pressed on a gamepad.",
"fullName": "Any gamepad button pressed",
"functionType": "Condition",
"name": "C_Any_Button_pressed",
"sentence": "Any button of gamepad _PARAM1_ is pressed",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"\r",
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;\r",
"const player = gdjs._extensionController.getPlayer(playerId)\r",
"eventsFunctionContext.returnValue = player.isAnyButtonPressed();\r",
""
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Return the last button pressed. \nButtons for Xbox and PS4 can be:\n* Xbox: \"A\", \"B\", \"X\", \"Y\", \"LB\", \"RB\", \"LT\", \"RT\", \"BACK\", \"START\",\n* PS4: \"CROSS\", \"SQUARE\", \"CIRCLE\", \"TRIANGLE\", \"L1\", \"L2\", \"R1\", \"R2\", \"SHARE\", \"OPTIONS\", \"PS_BUTTON\", \"CLICK_TOUCHPAD\",\n* Both: \"UP\", \"DOWN\", \"LEFT\", \"RIGHT\", \"CLICK_STICK_LEFT\", \"CLICK_STICK_RIGHT\".",
"fullName": "Last pressed button (string)",
"functionType": "StringExpression",
"name": "LastButtonString",
"sentence": "Button _PARAM2_ of gamepad _PARAM1_ is pressed",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"\r",
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;\r",
"const controllerType = eventsFunctionContext.getArgument(\"controller_type\").toUpperCase();\r",
"/** @type {Gamepad} */\r",
"const gamepad = gdjs._extensionController.getGamepad(playerId);\r",
"if (!gamepad) {\r",
" // The gamepad is not connected.\r",
" return;\r",
"}\r",
"const lastButtonUsedID = gdjs._extensionController.getPlayer(playerId).lastButtonUsed;\r",
"eventsFunctionContext.returnValue = gdjs._extensionController.getInputString(controllerType, lastButtonUsedID);\r",
""
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"expressionType": {
"type": "string"
},
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
},
{
"description": "Controller type",
"name": "controller_type",
"supplementaryInformation": "[\"Xbox\",\"PS4\"]",
"type": "stringWithSelector"
}
],
"objectGroups": []
},
{
"description": "Return the number of gamepads.",
"fullName": "Gamepad count",
"functionType": "Expression",
"name": "GamepadCount",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"\r",
"const gamepads = navigator.getGamepads ? navigator.getGamepads() : [];\r",
"let lastGamepadIndex = -1;\r",
"for (let playerId = 0; playerId < gamepads.length; playerId++) {\r",
" // Gamepads can be disconnected and become null\r",
" if (gamepads[playerId]) {\r",
" lastGamepadIndex = playerId\r",
" }\r",
"}\r",
"eventsFunctionContext.returnValue = lastGamepadIndex + 1;"
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"expressionType": {
"type": "expression"
},
"parameters": [],
"objectGroups": []
},
{
"description": "Check if a button is pressed on a gamepad. \nButtons can be:\n* Xbox: \"A\", \"B\", \"X\", \"Y\", \"LB\", \"RB\", \"LT\", \"RT\", \"BACK\", \"START\",\n* PS4: \"CROSS\", \"SQUARE\", \"CIRCLE\", \"TRIANGLE\", \"L1\", \"L2\", \"R1\", \"R2\", \"SHARE\", \"OPTIONS\", \"PS_BUTTON\", \"CLICK_TOUCHPAD\",\n* Other: \"UP\", \"DOWN\", \"LEFT\", \"RIGHT\", \"CLICK_STICK_LEFT\", \"CLICK_STICK_RIGHT\".",
"fullName": "Gamepad button pressed",
"functionType": "Condition",
"name": "C_Button_pressed",
"sentence": "Button _PARAM2_ of gamepad _PARAM1_ is pressed",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"\r",
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;\r",
"const button = eventsFunctionContext.getArgument(\"button\").toUpperCase();\r",
"\r",
"const buttonId = gdjs._extensionController.getButtonId(button);\r",
"if (buttonId === null) {\r",
" return;\r",
"}\r",
"const player = gdjs._extensionController.getPlayer(playerId)\r",
"eventsFunctionContext.returnValue = player.isButtonPressed(buttonId);\r",
""
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
},
{
"description": "Name of the button",
"name": "button",
"supplementaryInformation": "[\"A\",\"Cross\",\"B\",\"Circle\",\"X\",\"Square\",\"Y\",\"Triangle\",\"LB\",\"L1\",\"RB\",\"R1\",\"LT\",\"L2\",\"RT\",\"R2\",\"Up\",\"Down\",\"Left\",\"Right\",\"Back\",\"Share\",\"Start\",\"Options\",\"Click_Stick_Left\",\"Click_Stick_Right\",\"PS_Button\",\"Click_Touchpad\"]",
"type": "stringWithSelector"
}
],
"objectGroups": []
},
{
"description": "Return the value of the deadzone applied to a gamepad sticks, between 0 and 1.",
"fullName": "Gamepad deadzone for sticks",
"functionType": "Expression",
"name": "Deadzone",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": []
},
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"\r",
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;\r",
"eventsFunctionContext.returnValue = gdjs._extensionController.getPlayer(playerId).deadzone;"
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Set the deadzone for sticks of the gamepad. The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved). Deadzone is between 0 and 1, and is by default 0.2.",
"fullName": "Set gamepad deadzone for sticks",
"functionType": "Action",
"name": "A_Set_deadzone",
"sentence": "Set deadzone for sticks on gamepad: _PARAM1_ to _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"\r",
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;\r",
"const newDeadzone = eventsFunctionContext.getArgument(\"deadzone\");\r",
"\r",
"// https://github.com/4ian/GDevelop-extensions/pull/33#issuecomment-618224857\r",
"gdjs._extensionController.getPlayer(playerId).deadzone = gdjs.evtTools.common.clamp(newDeadzone, 0, 1);\r",
""
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
},
{
"description": "Deadzone for sticks, 0.2 by default (0 to 1)",
"name": "deadzone",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Check if a stick of a gamepad is pushed in a given direction.",
"fullName": "Gamepad stick pushed (axis)",
"functionType": "Condition",
"name": "C_Axis_pushed",
"sentence": "_PARAM2_ stick of gamepad _PARAM1_ is pushed in direction _PARAM3_",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"\r",
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;\r",
"const stick = eventsFunctionContext.getArgument(\"stick\").toUpperCase();\r",
"const direction = eventsFunctionContext.getArgument(\"direction\").toUpperCase();\r",
"\r",
"if (stick != \"LEFT\" && stick != \"RIGHT\") {\r",
" console.error('Parameter stick in condition: \"Gamepad stick pushed (axis)\", is not valid, must be LEFT or RIGHT');\r",
" return;\r",
"}\r",
"if (direction != \"UP\" && direction != \"DOWN\" && direction != \"LEFT\" && direction != \"RIGHT\" && direction != \"ANY\") {\r",
" console.error('Parameter direction in condition: \"Gamepad stick pushed (axis)\", is not valid, must be UP, DOWN, LEFT or RIGHT');\r",
" return;\r",
"}\r",
"/** @type {Gamepad} */\r",
"const gamepad = gdjs._extensionController.getGamepad(playerId);\r",
"if (!gamepad) {\r",
" // The gamepad is not connected.\r",
" return;\r",
"}\r",
"const axisValueX = stick === 'RIGHT' ? gamepad.axes[2] : gamepad.axes[0];\r",
"const axisValueY = stick === 'RIGHT' ? gamepad.axes[3] : gamepad.axes[1];\r",
"eventsFunctionContext.returnValue = gdjs._extensionController.isAxisPushed(playerId, direction, axisValueX, axisValueY);\r",
""
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
},
{
"description": "Stick: \"Left\" or \"Right\"",
"name": "stick",
"supplementaryInformation": "[\"Left\",\"Right\"]",
"type": "stringWithSelector"
},
{
"description": "Direction",
"name": "direction",
"supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"Any\"]",
"type": "stringWithSelector"
}
],
"objectGroups": []
},
{
"description": "Return the number of connected gamepads.",
"fullName": "Connected gamepads count",
"functionType": "Expression",
"name": "ConnectedGamepadsCount",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"\r",
"const gamepads = navigator.getGamepads ? navigator.getGamepads() : [];\r",
"let connectedGamepadCount = 0;\r",
"for (let playerId = 0; playerId < gamepads.length; playerId++) {\r",
" // Gamepads can be disconnected and become null\r",
" if (gamepads[playerId]) {\r",
" connectedGamepadCount++;\r",
" }\r",
"}\r",
"eventsFunctionContext.returnValue = connectedGamepadCount;\r",
""
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"expressionType": {
"type": "expression"
},
"parameters": [],
"objectGroups": []
},
{
"description": "Return a string containing informations about the specified gamepad.",
"fullName": "Gamepad type",
"functionType": "StringExpression",
"name": "GamepadType",
"sentence": "Player _PARAM1_ use _PARAM2_ controller",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;",
"/** @type {Gamepad} */",
"const gamepad = gdjs._extensionController.getGamepad(playerId);",
"if (!gamepad) {",
" // The gamepad is not connected.",
" return;",
"}",
"eventsFunctionContext.returnValue = (gamepad && gamepad.id) ? gamepad.id : \"No information for player \" + (playerId + 1)",
""
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"expressionType": {
"type": "string"
},
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Check if the specified gamepad has the specified information in its description. Useful to know if the gamepad is a Xbox or PS4 controller.",
"fullName": "Gamepad type",
"functionType": "Condition",
"name": "C_Controller_type",
"sentence": "Gamepad _PARAM1_ is a _PARAM2_ controller",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;",
"const controllerType = eventsFunctionContext.getArgument(\"controller_type\").toUpperCase();",
"/** @type {Gamepad} */",
"const gamepad = gdjs._extensionController.getGamepad(playerId);",
"if (!gamepad) {",
" // The gamepad is not connected.",
" return;",
"}",
"if (controllerType == \"XBOX\") {",
" eventsFunctionContext.returnValue = gdjs._extensionController.isXbox(gamepad);",
"} else {",
" eventsFunctionContext.returnValue = gamepad ? gamepad.id.toUpperCase().indexOf(controllerType) !== -1 : false;",
"}"
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
},
{
"description": "Type: \"Xbox\", \"PS4\", \"Steam\" or \"PS3\" (among other)",
"name": "controller_type",
"type": "string"
}
],
"objectGroups": []
},
{
"description": "Check if a gamepad is connected.",
"fullName": "Gamepad connected",
"functionType": "Condition",
"name": "C_Controller_X_is_connected",
"sentence": "Gamepad _PARAM1_ is plugged and connected",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;",
"/** @type {Gamepad[]} */",
"const gamepads = navigator.getGamepads ? navigator.getGamepads() : [];",
"// If gamepad was disconnected it will be null (so this will return false)",
"// If gamepad was never connected it will be undefined (so this will return false)",
"eventsFunctionContext.returnValue = !!gamepads[playerId];"
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Generate a vibration on the specified controller. Might only work if the game is running in a recent web browser.",
"fullName": "Gamepad vibration",
"functionType": "Action",
"name": "A_Vibrate_controller",
"sentence": "Make gamepad _PARAM1_ vibrate for _PARAM2_ seconds",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;",
"const duration = eventsFunctionContext.getArgument(\"Duration\") || 1;",
"/** @type {Gamepad} */",
"const gamepad = gdjs._extensionController.getGamepad(playerId);",
"if (!gamepad) {",
" // The gamepad is not connected.",
" return;",
"}",
"//Vibration work only on game in browser.",
"if (gamepad.vibrationActuator) {",
" gamepad.vibrationActuator.playEffect(\"dual-rumble\", {",
" startDelay: 0,",
" duration: duration * 1000,",
" weakMagnitude: 1.0,",
" strongMagnitude: 1.0",
" });",
"}"
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
},
{
"description": "Time of the vibration, in seconds (optional, default value is 1)",
"name": "Duration",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Generate an advanced vibration on the specified controller. Incompatible with Firefox.",
"fullName": "Advanced gamepad vibration",
"functionType": "Action",
"name": "A_Advanced_Vibration_Controller",
"sentence": "Make gamepad _PARAM1_ vibrate for _PARAM2_ seconds with the vibration magnitude of _PARAM3_ and _PARAM4_",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"const { clamp } = gdjs.evtTools.common;",
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;",
"const duration = eventsFunctionContext.getArgument(\"Duration\") || 1;",
"const strongRumbleMagnitude = clamp(eventsFunctionContext.getArgument(\"StrongMagnitude\"), 0, 1);",
"const weakRumbleMagnitude = clamp(eventsFunctionContext.getArgument(\"WeakMagnitude\"), 0, 1);",
"/** @type {Gamepad} */",
"const gamepad = gdjs._extensionController.getGamepad(playerId);",
"if (!gamepad) {",
" // The gamepad is not connected.",
" return;",
"}",
"//Vibration work only on game in browser.",
"if (gamepad.vibrationActuator) {",
" gamepad.vibrationActuator.playEffect(\"dual-rumble\", {",
" startDelay: 0,",
" duration: duration * 1000,",
" weakMagnitude: weakRumbleMagnitude,",
" strongMagnitude: strongRumbleMagnitude",
" });",
"}",
"const player = gdjs._extensionController.getPlayer(playerId)",
"player.rumble.duration = duration;",
"player.rumble.elapsedTime = 0;",
"player.rumble.weakMagnitude = weakRumbleMagnitude;",
"player.rumble.strongMagnitude = strongRumbleMagnitude;"
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
},
{
"description": "Time of the vibration, in seconds (optional, default value is 1)",
"name": "Duration",
"type": "expression"
},
{
"description": "Strong rumble magnitude (from 0 to 1)",
"name": "StrongMagnitude",
"type": "expression"
},
{
"description": "Weak rumble magnitude (from 0 to 1)",
"name": "WeakMagnitude",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Change a vibration on the specified controller. Incompatible with Firefox.",
"fullName": "Change gamepad active vibration",
"functionType": "Action",
"name": "A_Change_Vibration_Magnitude",
"sentence": "Change the vibration magnitude of _PARAM2_ & _PARAM3_ on gamepad _PARAM1_",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"const { clamp } = gdjs.evtTools.common;",
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;",
"const player = gdjs._extensionController.getPlayer(playerId);",
"const elapsedTime = player.rumble.elapsedTime || 0;",
"const originalDuration = player.rumble.duration || 1;",
"const strongRumbleMagnitude = clamp(eventsFunctionContext.getArgument(\"StrongMagnitude\"), 0, 1);",
"const weakRumbleMagnitude = clamp(eventsFunctionContext.getArgument(\"WeakMagnitude\"), 0, 1);",
"/** @type {Gamepad} */",
"const gamepad = gdjs._extensionController.getGamepad(playerId);",
"if (!gamepad) {",
" // The gamepad is not connected.",
" return;",
"}",
"if (originalDuration - elapsedTime <= 0) return;",
"//Vibration work only on game in browser.",
"if (gamepad.vibrationActuator) {",
" gamepad.vibrationActuator.playEffect(\"dual-rumble\", {",
" startDelay: 0,",
" duration: 1000 * (originalDuration - elapsedTime),",
" weakMagnitude: weakRumbleMagnitude,",
" strongMagnitude: strongRumbleMagnitude",
" });",
"}",
"",
"player.rumble.weakMagnitude = weakRumbleMagnitude;",
"player.rumble.strongMagnitude = strongRumbleMagnitude;"
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
},
{
"description": "Strong rumble magnitude (from 0 to 1)",
"name": "StrongMagnitude",
"type": "expression"
},
{
"description": "Weak rumble magnitude (from 0 to 1)",
"name": "WeakMagnitude",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Check if any button is released on a gamepad.",
"fullName": "Any gamepad button released",
"functionType": "Condition",
"name": "C_any_button_released",
"sentence": "Any button of gamepad _PARAM1_ is released",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": []
},
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"\r",
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;\r",
"const player = gdjs._extensionController.getPlayer(playerId)\r",
"eventsFunctionContext.returnValue = player.isAnyButtonReleased();"
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Return the strength of the weak vibration motor on the gamepad of a player.",
"fullName": "Weak rumble magnitude",
"functionType": "Expression",
"name": "WeakVibrationMagnitude",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;\r",
"eventsFunctionContext.returnValue = gdjs._extensionController.getPlayer(playerId).rumble.weakMagnitude;"
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": false
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Return the strength of the strong vibration motor on the gamepad of a player.",
"fullName": "Strong rumble magnitude",
"functionType": "Expression",
"name": "StrongVibrationMagnitude",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"const playerId = eventsFunctionContext.getArgument(\"PlayerId\") - 1;\r",
"eventsFunctionContext.returnValue = gdjs._extensionController.getPlayer(playerId).rumble.strongMagnitude;"
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": false
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "The gamepad identifier: 1, 2, 3 or 4",
"name": "PlayerId",
"type": "expression"
}
],
"objectGroups": []
}
],
"eventsFunctionsFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"functionName": "onFirstSceneLoaded"
},
{
"functionName": "onSceneLoaded"
},
{
"functionName": "onScenePostEvents"
},
{
"functionName": "AcceleratedSpeed"
},
{
"functionName": "TriggerPressure"
},
{
"functionName": "StickForce"
},
{
"functionName": "StickRotationValue"
},
{
"functionName": "StickAngle"
},
{
"functionName": "AxisValue"
},
{
"functionName": "StickForceX"
},
{
"functionName": "StickForceY"
},
{
"functionName": "C_Button_released"
},
{
"functionName": "IsButtonJustPressed"
},
{
"functionName": "LastButtonID"
},
{
"functionName": "C_Any_Button_pressed"
},
{
"functionName": "LastButtonString"
},
{
"functionName": "GamepadCount"
},
{
"functionName": "C_Button_pressed"
},
{
"functionName": "Deadzone"
},
{
"functionName": "A_Set_deadzone"
},
{
"functionName": "C_Axis_pushed"
},
{
"functionName": "ConnectedGamepadsCount"
},
{
"functionName": "GamepadType"
},
{
"functionName": "C_Controller_type"
},
{
"functionName": "C_Controller_X_is_connected"
},
{
"functionName": "A_Vibrate_controller"
},
{
"functionName": "A_Advanced_Vibration_Controller"
},
{
"functionName": "A_Change_Vibration_Magnitude"
},
{
"functionName": "C_any_button_released"
},
{
"functionName": "WeakVibrationMagnitude"
},
{
"functionName": "StrongVibrationMagnitude"
}
]
},
"eventsBasedBehaviors": [
{
"description": "Control a platformer character with a gamepad.",
"fullName": "Platformer gamepad mapper",
"helpPath": "",
"iconUrl": "",
"name": "PlatformerGamepadMapper",
"objectType": "",
"previewIconUrl": "",
"quickCustomizationVisibility": "hidden",
"eventsFunctions": [
{
"fullName": "",
"functionType": "Action",
"name": "doStepPreEvents",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Controller_X_is_connected"
},
"parameters": [
"",
"GamepadIdentifier",
""
]
}
],
"actions": [],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"UseArrows",
"True",
""
]
}
],
"actions": [],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Button_pressed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Left\"",
"\"Left\""
]
}
],
"actions": [
{
"type": {
"value": "PlatformBehavior::SimulateLeftKey"
},
"parameters": [
"Object",
"PlatformerCharacter"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Button_pressed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Right\"",
"\"Left\""
]
}
],
"actions": [
{
"type": {
"value": "PlatformBehavior::SimulateRightKey"
},
"parameters": [
"Object",
"PlatformerCharacter"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Button_pressed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Up\"",
"\"Left\""
]
}
],
"actions": [
{
"type": {
"value": "PlatformBehavior::SimulateUpKey"
},
"parameters": [
"Object",
"PlatformerCharacter"
]
},
{
"type": {
"value": "PlatformBehavior::SimulateLadderKey"
},
"parameters": [
"Object",
"PlatformerCharacter"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Button_pressed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Down\"",
"\"Left\""
]
}
],
"actions": [
{
"type": {
"value": "PlatformBehavior::SimulateDownKey"
},
"parameters": [
"Object",
"PlatformerCharacter"
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"UseLeftStick",
"True",
""
]
}
],
"actions": [],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Axis_pushed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Left\"",
"\"Left\"",
""
]
}
],
"actions": [
{
"type": {
"value": "PlatformBehavior::SimulateLeftKey"
},
"parameters": [
"Object",
"PlatformerCharacter"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Axis_pushed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Left\"",
"\"Right\"",
""
]
}
],
"actions": [
{
"type": {
"value": "PlatformBehavior::SimulateRightKey"
},
"parameters": [
"Object",
"PlatformerCharacter"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Axis_pushed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Left\"",
"\"Up\"",
""
]
}
],
"actions": [
{
"type": {
"value": "PlatformBehavior::SimulateUpKey"
},
"parameters": [
"Object",
"PlatformerCharacter"
]
},
{
"type": {
"value": "PlatformBehavior::SimulateLadderKey"
},
"parameters": [
"Object",
"PlatformerCharacter"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Axis_pushed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Left\"",
"\"Down\"",
""
]
}
],
"actions": [
{
"type": {
"value": "PlatformBehavior::SimulateDownKey"
},
"parameters": [
"Object",
"PlatformerCharacter"
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"UseRightStick",
"True",
""
]
}
],
"actions": [],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Axis_pushed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Right\"",
"\"Left\"",
""
]
}
],
"actions": [
{
"type": {
"value": "PlatformBehavior::SimulateLeftKey"
},
"parameters": [
"Object",
"PlatformerCharacter"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Axis_pushed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Right\"",
"\"Right\"",
""
]
}
],
"actions": [
{
"type": {
"value": "PlatformBehavior::SimulateRightKey"
},
"parameters": [
"Object",
"PlatformerCharacter"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Axis_pushed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Right\"",
"\"Up\"",
""
]
}
],
"actions": [
{
"type": {
"value": "PlatformBehavior::SimulateUpKey"
},
"parameters": [
"Object",
"PlatformerCharacter"
]
},
{
"type": {
"value": "PlatformBehavior::SimulateLadderKey"
},
"parameters": [
"Object",
"PlatformerCharacter"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Axis_pushed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Right\"",
"\"Down\"",
""
]
}
],
"actions": [
{
"type": {
"value": "PlatformBehavior::SimulateDownKey"
},
"parameters": [
"Object",
"PlatformerCharacter"
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Button_pressed"
},
"parameters": [
"",
"GamepadIdentifier",
"Buttons[JumpButton]",
"\"Left\""
]
}
],
"actions": [
{
"type": {
"value": "PlatformBehavior::SimulateJumpKey"
},
"parameters": [
"Object",
"PlatformerCharacter"
]
}
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::PlatformerGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
}
],
"eventsFunctionsFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"functionName": "doStepPreEvents"
}
]
},
"propertyDescriptors": [
{
"value": "",
"type": "Behavior",
"label": "Platformer character behavior",
"extraInformation": [
"PlatformBehavior::PlatformerObjectBehavior"
],
"choices": [],
"name": "PlatformerCharacter"
},
{
"value": "1",
"type": "Number",
"label": "Gamepad identifier (1, 2, 3 or 4)",
"name": "GamepadIdentifier"
},
{
"value": "true",
"type": "Boolean",
"label": "Use directional pad",
"group": "Controls",
"name": "UseArrows"
},
{
"value": "true",
"type": "Boolean",
"label": "Use left stick",
"group": "Controls",
"name": "UseLeftStick"
},
{
"value": "",
"type": "Boolean",
"label": "Use right stick",
"group": "Controls",
"name": "UseRightStick"
},
{
"value": "A or Cross",
"type": "Choice",
"label": "Jump button",
"group": "Controls",
"choices": [
{
"label": "A or Cross",
"value": "A or Cross"
},
{
"label": "B or Circle",
"value": "B or Circle"
},
{
"label": "X or Square",
"value": "X or Square"
},
{
"label": "Y or Triangle",
"value": "Y or Triangle"
},
{
"label": "LB or L1",
"value": "LB or L1"
},
{
"label": "RB or R1",
"value": "RB or R1"
},
{
"label": "LT or L2",
"value": "LT or L2"
},
{
"label": "RT or R2",
"value": "RT or R2"
}
],
"name": "JumpButton"
}
],
"propertiesFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"propertyName": "PlatformerCharacter"
},
{
"propertyName": "GamepadIdentifier"
},
{
"folderName": "Controls",
"children": [
{
"propertyName": "UseArrows"
},
{
"propertyName": "UseLeftStick"
},
{
"propertyName": "UseRightStick"
},
{
"propertyName": "JumpButton"
}
]
}
]
}
},
{
"description": "Control a 3D physics character with a gamepad.",
"fullName": "3D platformer gamepad mapper",
"helpPath": "",
"iconUrl": "",
"name": "Platformer3DGamepadMapper",
"objectType": "",
"previewIconUrl": "",
"quickCustomizationVisibility": "hidden",
"eventsFunctions": [
{
"fullName": "",
"functionType": "Action",
"name": "doStepPreEvents",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Controller_X_is_connected"
},
"parameters": [
"",
"GamepadIdentifier",
""
]
}
],
"actions": [],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::StickForce"
},
"parameters": [
"",
">",
"0",
"GamepadIdentifier",
"JoystickIdentifier",
""
]
}
],
"actions": [
{
"type": {
"value": "Physics3D::PhysicsCharacter3D::SetForwardAngle"
},
"parameters": [
"Object",
"PhysicsCharacter3D",
"=",
"Gamepads::StickAngle(GamepadIdentifier, JoystickIdentifier) + CameraAngle(Object.Layer())"
]
},
{
"type": {
"value": "Physics3D::PhysicsCharacter3D::SimulateStick"
},
"parameters": [
"Object",
"PhysicsCharacter3D",
"-90",
"Gamepads::StickForce(GamepadIdentifier, JoystickIdentifier)"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Button_pressed"
},
"parameters": [
"",
"GamepadIdentifier",
"Buttons[JumpButton]",
"\"Left\""
]
}
],
"actions": [
{
"type": {
"value": "Physics3D::PhysicsCharacter3D::SimulateJumpKey"
},
"parameters": [
"Object",
"PhysicsCharacter3D"
]
}
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::Platformer3DGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
}
],
"eventsFunctionsFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"functionName": "doStepPreEvents"
}
]
},
"propertyDescriptors": [
{
"value": "",
"type": "Behavior",
"label": "3D physics character",
"extraInformation": [
"Physics3D::PhysicsCharacter3D"
],
"choices": [],
"name": "PhysicsCharacter3D"
},
{
"value": "1",
"type": "Number",
"label": "Gamepad identifier (1, 2, 3 or 4)",
"name": "GamepadIdentifier"
},
{
"value": "Left",
"type": "Choice",
"label": "Walk joystick",
"group": "Controls",
"choices": [
{
"label": "Left",
"value": "Left"
},
{
"label": "Right",
"value": "Right"
}
],
"name": "JoystickIdentifier"
},
{
"value": "A or Cross",
"type": "Choice",
"label": "Jump button",
"group": "Controls",
"choices": [
{
"label": "A or Cross",
"value": "A or Cross"
},
{
"label": "B or Circle",
"value": "B or Circle"
},
{
"label": "X or Square",
"value": "X or Square"
},
{
"label": "Y or Triangle",
"value": "Y or Triangle"
},
{
"label": "LB or L1",
"value": "LB or L1"
},
{
"label": "RB or R1",
"value": "RB or R1"
},
{
"label": "LT or L2",
"value": "LT or L2"
},
{
"label": "RT or R2",
"value": "RT or R2"
}
],
"name": "JumpButton"
}
],
"propertiesFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"propertyName": "PhysicsCharacter3D"
},
{
"propertyName": "GamepadIdentifier"
},
{
"folderName": "Controls",
"children": [
{
"propertyName": "JoystickIdentifier"
},
{
"propertyName": "JumpButton"
}
]
}
]
}
},
{
"description": "Control a 3D physics character with a gamepad.",
"fullName": "3D shooter gamepad mapper",
"helpPath": "",
"iconUrl": "",
"name": "Shooter3DGamepadMapper",
"objectType": "",
"previewIconUrl": "",
"quickCustomizationVisibility": "hidden",
"eventsFunctions": [
{
"fullName": "",
"functionType": "Action",
"name": "doStepPreEvents",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Controller_X_is_connected"
},
"parameters": [
"",
"GamepadIdentifier",
""
]
}
],
"actions": [],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::StickForce"
},
"parameters": [
"",
">",
"0",
"GamepadIdentifier",
"WalkStick",
""
]
}
],
"actions": [
{
"type": {
"value": "Physics3D::PhysicsCharacter3D::SimulateStick"
},
"parameters": [
"Object",
"PhysicsCharacter3D",
"Gamepads::StickAngle(GamepadIdentifier, WalkStick)",
"Gamepads::StickForce(GamepadIdentifier, WalkStick)"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Button_pressed"
},
"parameters": [
"",
"GamepadIdentifier",
"Buttons[JumpButton]",
"\"Left\""
]
}
],
"actions": [
{
"type": {
"value": "Physics3D::PhysicsCharacter3D::SimulateJumpKey"
},
"parameters": [
"Object",
"PhysicsCharacter3D"
]
}
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::Shooter3DGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
}
],
"eventsFunctionsFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"functionName": "doStepPreEvents"
}
]
},
"propertyDescriptors": [
{
"value": "",
"type": "Behavior",
"label": "3D physics character",
"extraInformation": [
"Physics3D::PhysicsCharacter3D"
],
"choices": [],
"name": "PhysicsCharacter3D"
},
{
"value": "1",
"type": "Number",
"label": "Gamepad identifier (1, 2, 3 or 4)",
"name": "GamepadIdentifier"
},
{
"value": "Left",
"type": "Choice",
"label": "Walk joystick",
"group": "Controls",
"choices": [
{
"label": "Left",
"value": "Left"
},
{
"label": "Right",
"value": "Right"
}
],
"name": "WalkStick"
},
{
"value": "Right",
"type": "Choice",
"label": "Camera joystick",
"group": "Controls",
"choices": [
{
"label": "Left",
"value": "Left"
},
{
"label": "Right",
"value": "Right"
}
],
"name": "CameraStick"
},
{
"value": "A or Cross",
"type": "Choice",
"label": "Jump button",
"group": "Controls",
"choices": [
{
"label": "A or Cross",
"value": "A or Cross"
},
{
"label": "B or Circle",
"value": "B or Circle"
},
{
"label": "X or Square",
"value": "X or Square"
},
{
"label": "Y or Triangle",
"value": "Y or Triangle"
},
{
"label": "LB or L1",
"value": "LB or L1"
},
{
"label": "RB or R1",
"value": "RB or R1"
},
{
"label": "LT or L2",
"value": "LT or L2"
},
{
"label": "RT or R2",
"value": "RT or R2"
}
],
"name": "JumpButton"
}
],
"propertiesFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"propertyName": "PhysicsCharacter3D"
},
{
"propertyName": "GamepadIdentifier"
},
{
"folderName": "Controls",
"children": [
{
"propertyName": "WalkStick"
},
{
"propertyName": "CameraStick"
},
{
"propertyName": "JumpButton"
}
]
}
]
}
},
{
"description": "Control camera rotations with a gamepad.",
"fullName": "First person camera gamepad mapper",
"helpPath": "",
"iconUrl": "",
"name": "FirstPersonGamepadMapper",
"objectType": "",
"previewIconUrl": "",
"quickCustomizationVisibility": "hidden",
"eventsFunctions": [
{
"fullName": "",
"functionType": "Action",
"name": "doStepPreEvents",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "TODO It's probably a bad idea to rotate the object around Y."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"CurrentRotationSpeedZ",
"=",
"Gamepads::AcceleratedSpeed(CurrentRotationSpeedZ, Gamepads::StickForceX(GamepadIdentifier, CameraStick) * HorizontalRotationSpeedMax, HorizontalRotationSpeedMax, HorizontalRotationAcceleration, HorizontalRotationDeceleration)"
]
},
{
"type": {
"value": "SetAngle"
},
"parameters": [
"Object",
"+",
"CurrentRotationSpeedZ * TimeDelta()"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"CurrentRotationSpeedY",
"=",
"Gamepads::AcceleratedSpeed(CurrentRotationSpeedY, Gamepads::StickForceY(GamepadIdentifier, CameraStick) * VerticalRotationSpeedMax, VerticalRotationSpeedMax, VerticalRotationAcceleration, VerticalRotationDeceleration)"
]
},
{
"type": {
"value": "Scene3D::Base3DBehavior::SetRotationY"
},
"parameters": [
"Object",
"Object3D",
"+",
"CurrentRotationSpeedY * TimeDelta()"
]
},
{
"type": {
"value": "Scene3D::Base3DBehavior::SetRotationY"
},
"parameters": [
"Object",
"Object3D",
"=",
"clamp(Object.Object3D::RotationY(), VerticalAngleMin, VerticalAngleMax)"
]
},
{
"type": {
"value": "Gamepads::FirstPersonGamepadMapper::LookFromObjectEyes"
},
"parameters": [
"Object",
"Behavior",
""
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::FirstPersonGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Move the camera to look though _PARAM1_ eyes. The object must look to the right when all its angles are 0 and the top of its head be toward Z+.",
"fullName": "Look through object eyes",
"functionType": "Action",
"group": "Layers and cameras",
"name": "LookFromObjectEyes",
"private": true,
"sentence": "Move the camera to look though _PARAM0_ eyes",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "CenterCameraOnObject"
},
"parameters": [
"",
"Object",
"",
"Object.Layer()",
""
]
},
{
"type": {
"value": "Scene3D::SetCameraZ"
},
"parameters": [
"",
"=",
"Object.Object3D::Z() + Object.Object3D::Depth() + OffsetZ",
"",
""
]
},
{
"type": {
"value": "Scene3D::SetCameraRotationX"
},
"parameters": [
"",
"=",
"- Object.Object3D::RotationY() + 90",
"GetArgumentAsString(\"Layer\")",
""
]
},
{
"type": {
"value": "Scene3D::SetCameraRotationY"
},
"parameters": [
"",
"=",
"Object.Object3D::RotationX()",
"GetArgumentAsString(\"Layer\")",
""
]
},
{
"type": {
"value": "SetCameraAngle"
},
"parameters": [
"",
"=",
"Object.Angle() + 90",
"Object.Layer()",
""
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::FirstPersonGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "the maximum horizontal rotation speed of the object.",
"fullName": "Maximum horizontal rotation speed",
"functionType": "ExpressionAndCondition",
"group": "First person camera gamepad mapper horizontal rotation configuration",
"name": "HorizontalRotationSpeedMax",
"sentence": "the maximum horizontal rotation speed",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnNumber"
},
"parameters": [
"HorizontalRotationSpeedMax"
]
}
]
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::FirstPersonGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
},
{
"fullName": "",
"functionType": "ActionWithOperator",
"getterName": "HorizontalRotationSpeedMax",
"group": "First person camera gamepad mapper horizontal rotation configuration",
"name": "SetHorizontalRotationSpeedMax",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"HorizontalRotationSpeedMax",
"=",
"Value"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::FirstPersonGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "the horizontal rotation acceleration of the object.",
"fullName": "Horizontal rotation acceleration",
"functionType": "ExpressionAndCondition",
"group": "First person camera gamepad mapper horizontal rotation configuration",
"name": "HorizontalRotationAcceleration",
"sentence": "the horizontal rotation acceleration",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnNumber"
},
"parameters": [
"HorizontalRotationAcceleration"
]
}
]
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::FirstPersonGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
},
{
"fullName": "",
"functionType": "ActionWithOperator",
"getterName": "HorizontalRotationAcceleration",
"group": "First person camera gamepad mapper horizontal rotation configuration",
"name": "SetHorizontalRotationAcceleration",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"HorizontalRotationAcceleration",
"=",
"Value"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::FirstPersonGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "the horizontal rotation deceleration of the object.",
"fullName": "Horizontal rotation deceleration",
"functionType": "ExpressionAndCondition",
"group": "First person camera gamepad mapper horizontal rotation configuration",
"name": "HorizontalRotationDeceleration",
"sentence": "the horizontal rotation deceleration",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnNumber"
},
"parameters": [
"HorizontalRotationDeceleration"
]
}
]
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::FirstPersonGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
},
{
"fullName": "",
"functionType": "ActionWithOperator",
"getterName": "HorizontalRotationDeceleration",
"group": "First person camera gamepad mapper horizontal rotation configuration",
"name": "SetHorizontalRotationDeceleration",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"HorizontalRotationDeceleration",
"=",
"Value"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::FirstPersonGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "the maximum vertical rotation speed of the object.",
"fullName": "Maximum vertical rotation speed",
"functionType": "ExpressionAndCondition",
"group": "First person camera gamepad mapper vertical rotation configuration",
"name": "VerticalRotationSpeedMax",
"sentence": "the maximum vertical rotation speed",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnNumber"
},
"parameters": [
"VerticalRotationSpeedMax"
]
}
]
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::FirstPersonGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
},
{
"fullName": "",
"functionType": "ActionWithOperator",
"getterName": "VerticalRotationSpeedMax",
"group": "First person camera gamepad mapper vertical rotation configuration",
"name": "SetVerticalRotationSpeedMax",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"VerticalRotationSpeedMax",
"=",
"Value"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::FirstPersonGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "the vertical rotation acceleration of the object.",
"fullName": "Vertical rotation acceleration",
"functionType": "ExpressionAndCondition",
"group": "First person camera gamepad mapper vertical rotation configuration",
"name": "VerticalRotationAcceleration",
"sentence": "the vertical rotation acceleration",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnNumber"
},
"parameters": [
"VerticalRotationAcceleration"
]
}
]
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::FirstPersonGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
},
{
"fullName": "",
"functionType": "ActionWithOperator",
"getterName": "VerticalRotationAcceleration",
"group": "First person camera gamepad mapper vertical rotation configuration",
"name": "SetVerticalRotationAcceleration",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"VerticalRotationAcceleration",
"=",
"Value"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::FirstPersonGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "the vertical rotation deceleration of the object.",
"fullName": "Vertical rotation deceleration",
"functionType": "ExpressionAndCondition",
"group": "First person camera gamepad mapper vertical rotation configuration",
"name": "VerticalRotationDeceleration",
"sentence": "the vertical rotation deceleration",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnNumber"
},
"parameters": [
"VerticalRotationDeceleration"
]
}
]
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::FirstPersonGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
},
{
"fullName": "",
"functionType": "ActionWithOperator",
"getterName": "VerticalRotationDeceleration",
"group": "First person camera gamepad mapper vertical rotation configuration",
"name": "SetVerticalRotationDeceleration",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"VerticalRotationDeceleration",
"=",
"Value"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::FirstPersonGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "the minimum vertical camera angle of the object.",
"fullName": "Minimum vertical camera angle",
"functionType": "ExpressionAndCondition",
"group": "First person camera gamepad mapper vertical rotation configuration",
"name": "VerticalAngleMin",
"sentence": "the minimum vertical camera angle",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnNumber"
},
"parameters": [
"VerticalAngleMin"
]
}
]
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::FirstPersonGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
},
{
"fullName": "",
"functionType": "ActionWithOperator",
"getterName": "VerticalAngleMin",
"group": "First person camera gamepad mapper vertical rotation configuration",
"name": "SetVerticalAngleMin",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"VerticalAngleMin",
"=",
"Value"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::FirstPersonGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "the maximum vertical camera angle of the object.",
"fullName": "Maximum vertical camera angle",
"functionType": "ExpressionAndCondition",
"group": "First person camera gamepad mapper vertical rotation configuration",
"name": "VerticalAngleMax",
"sentence": "the maximum vertical camera angle",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnNumber"
},
"parameters": [
"VerticalAngleMax"
]
}
]
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::FirstPersonGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
},
{
"fullName": "",
"functionType": "ActionWithOperator",
"getterName": "VerticalAngleMax",
"group": "First person camera gamepad mapper vertical rotation configuration",
"name": "SetVerticalAngleMax",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"VerticalAngleMax",
"=",
"Value"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::FirstPersonGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "the z position offset of the object.",
"fullName": "Z position offset",
"functionType": "ExpressionAndCondition",
"group": "First person camera gamepad mapper position configuration",
"name": "OffsetZ",
"sentence": "the z position offset",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnNumber"
},
"parameters": [
"OffsetZ"
]
}
]
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::FirstPersonGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
},
{
"fullName": "",
"functionType": "ActionWithOperator",
"getterName": "OffsetZ",
"group": "First person camera gamepad mapper position configuration",
"name": "SetOffsetZ",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"OffsetZ",
"=",
"Value"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::FirstPersonGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
}
],
"eventsFunctionsFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"functionName": "doStepPreEvents"
},
{
"folderName": "Layers and cameras",
"children": [
{
"functionName": "LookFromObjectEyes"
}
]
},
{
"folderName": "First person camera gamepad mapper horizontal rotation configuration",
"children": [
{
"functionName": "HorizontalRotationSpeedMax"
},
{
"functionName": "SetHorizontalRotationSpeedMax"
},
{
"functionName": "HorizontalRotationAcceleration"
},
{
"functionName": "SetHorizontalRotationAcceleration"
},
{
"functionName": "HorizontalRotationDeceleration"
},
{
"functionName": "SetHorizontalRotationDeceleration"
}
]
},
{
"folderName": "First person camera gamepad mapper vertical rotation configuration",
"children": [
{
"functionName": "VerticalRotationSpeedMax"
},
{
"functionName": "SetVerticalRotationSpeedMax"
},
{
"functionName": "VerticalRotationAcceleration"
},
{
"functionName": "SetVerticalRotationAcceleration"
},
{
"functionName": "VerticalRotationDeceleration"
},
{
"functionName": "SetVerticalRotationDeceleration"
},
{
"functionName": "VerticalAngleMin"
},
{
"functionName": "SetVerticalAngleMin"
},
{
"functionName": "VerticalAngleMax"
},
{
"functionName": "SetVerticalAngleMax"
}
]
},
{
"folderName": "First person camera gamepad mapper position configuration",
"children": [
{
"functionName": "OffsetZ"
},
{
"functionName": "SetOffsetZ"
}
]
}
]
},
"propertyDescriptors": [
{
"value": "",
"type": "Behavior",
"label": "3D capability",
"extraInformation": [
"Scene3D::Base3DBehavior"
],
"choices": [],
"name": "Object3D"
},
{
"value": "1",
"type": "Number",
"label": "Gamepad identifier (1, 2, 3 or 4)",
"name": "GamepadIdentifier"
},
{
"value": "Right",
"type": "Choice",
"label": "Camera joystick",
"choices": [
{
"label": "Left",
"value": "Left"
},
{
"label": "Right",
"value": "Right"
}
],
"name": "CameraStick"
},
{
"value": "180",
"type": "Number",
"unit": "AngularSpeed",
"label": "Maximum rotation speed",
"group": "Horizontal rotation",
"name": "HorizontalRotationSpeedMax"
},
{
"value": "360",
"type": "Number",
"label": "Rotation acceleration",
"group": "Horizontal rotation",
"name": "HorizontalRotationAcceleration"
},
{
"value": "720",
"type": "Number",
"label": "Rotation deceleration",
"group": "Horizontal rotation",
"name": "HorizontalRotationDeceleration"
},
{
"value": "120",
"type": "Number",
"unit": "AngularSpeed",
"label": "Maximum rotation speed",
"group": "Vertical rotation",
"name": "VerticalRotationSpeedMax"
},
{
"value": "240",
"type": "Number",
"label": "Rotation acceleration",
"group": "Vertical rotation",
"name": "VerticalRotationAcceleration"
},
{
"value": "480",
"type": "Number",
"label": "Rotation deceleration",
"group": "Vertical rotation",
"name": "VerticalRotationDeceleration"
},
{
"value": "-90",
"type": "Number",
"unit": "DegreeAngle",
"label": "Minimum angle",
"group": "Vertical rotation",
"name": "VerticalAngleMin"
},
{
"value": "90",
"type": "Number",
"unit": "DegreeAngle",
"label": "Maximum angle",
"group": "Vertical rotation",
"name": "VerticalAngleMax"
},
{
"value": "0",
"type": "Number",
"unit": "Pixel",
"label": "Z position offset",
"group": "Position",
"name": "OffsetZ"
},
{
"value": "0",
"type": "Number",
"unit": "AngularSpeed",
"label": "Current rotation speed Z",
"hidden": true,
"name": "CurrentRotationSpeedZ"
},
{
"value": "0",
"type": "Number",
"unit": "AngularSpeed",
"label": "Current rotation speed Y",
"hidden": true,
"name": "CurrentRotationSpeedY"
}
],
"propertiesFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"propertyName": "Object3D"
},
{
"propertyName": "GamepadIdentifier"
},
{
"propertyName": "CameraStick"
},
{
"folderName": "Horizontal rotation",
"children": [
{
"propertyName": "HorizontalRotationSpeedMax"
},
{
"propertyName": "HorizontalRotationAcceleration"
},
{
"propertyName": "HorizontalRotationDeceleration"
}
]
},
{
"folderName": "Vertical rotation",
"children": [
{
"propertyName": "VerticalRotationSpeedMax"
},
{
"propertyName": "VerticalRotationAcceleration"
},
{
"propertyName": "VerticalRotationDeceleration"
},
{
"propertyName": "VerticalAngleMin"
},
{
"propertyName": "VerticalAngleMax"
}
]
},
{
"folderName": "Position",
"children": [
{
"propertyName": "OffsetZ"
}
]
},
{
"propertyName": "CurrentRotationSpeedZ"
},
{
"propertyName": "CurrentRotationSpeedY"
}
]
}
},
{
"description": "Control a 3D physics car with a gamepad.",
"fullName": "3D car gamepad mapper",
"helpPath": "",
"iconUrl": "",
"name": "PhysicsCar3DGamepadMapper",
"objectType": "",
"previewIconUrl": "",
"quickCustomizationVisibility": "hidden",
"eventsFunctions": [
{
"fullName": "",
"functionType": "Action",
"name": "doStepPreEvents",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Controller_X_is_connected"
},
"parameters": [
"",
"GamepadIdentifier",
""
]
}
],
"actions": [],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"UseArrows",
"True",
""
]
}
],
"actions": [],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Button_pressed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Left\"",
"\"Left\""
]
}
],
"actions": [
{
"type": {
"value": "Physics3D::PhysicsCar3D::SimulateLeftKey"
},
"parameters": [
"Object",
"PhysicsCar3D"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Button_pressed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Right\"",
"\"Left\""
]
}
],
"actions": [
{
"type": {
"value": "Physics3D::PhysicsCar3D::SimulateRightKey"
},
"parameters": [
"Object",
"PhysicsCar3D"
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"UseLeftStick",
"True",
""
]
}
],
"actions": [],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Axis_pushed"
},
"parameters": [
"",
"1",
"\"Left\"",
"\"Any\"",
""
]
}
],
"actions": [
{
"type": {
"value": "Physics3D::PhysicsCar3D::SimulateSteeringStick"
},
"parameters": [
"Object",
"PhysicsCar3D",
"Gamepads::StickForceX(GamepadIdentifier, \"Left\")"
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"UseRightStick",
"True",
""
]
}
],
"actions": [],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Axis_pushed"
},
"parameters": [
"",
"1",
"\"Right\"",
"\"Any\"",
""
]
}
],
"actions": [
{
"type": {
"value": "Physics3D::PhysicsCar3D::SimulateSteeringStick"
},
"parameters": [
"Object",
"PhysicsCar3D",
"Gamepads::StickForceX(GamepadIdentifier, \"Right\")"
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BuiltinCommonInstructions::Or"
},
"parameters": [],
"subInstructions": [
{
"type": {
"value": "Gamepads::C_Button_pressed"
},
"parameters": [
"",
"1",
"\"LT\"",
"\"Up\""
]
},
{
"type": {
"value": "Gamepads::C_Button_pressed"
},
"parameters": [
"",
"1",
"\"RT\"",
"\"Up\""
]
}
]
}
],
"actions": [
{
"type": {
"value": "Physics3D::PhysicsCar3D::SimulateAcceleratorStick"
},
"parameters": [
"Object",
"PhysicsCar3D",
"Gamepads::TriggerPressure(GamepadIdentifier, \"RT\") - Gamepads::TriggerPressure(GamepadIdentifier, \"LT\")"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Button_pressed"
},
"parameters": [
"",
"GamepadIdentifier",
"Buttons[HandBrakeButton]",
"\"Left\""
]
}
],
"actions": [
{
"type": {
"value": "Physics3D::PhysicsCar3D::SimulateHandBrakeKey"
},
"parameters": [
"Object",
"PhysicsCar3D"
]
}
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::PhysicsCar3DGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
}
],
"eventsFunctionsFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"functionName": "doStepPreEvents"
}
]
},
"propertyDescriptors": [
{
"value": "",
"type": "Behavior",
"label": "3D physics car",
"extraInformation": [
"Physics3D::PhysicsCar3D"
],
"choices": [],
"name": "PhysicsCar3D"
},
{
"value": "1",
"type": "Number",
"label": "Gamepad identifier (1, 2, 3 or 4)",
"name": "GamepadIdentifier"
},
{
"value": "true",
"type": "Boolean",
"label": "Use directional pad",
"group": "Controls",
"name": "UseArrows"
},
{
"value": "true",
"type": "Boolean",
"label": "Use left stick",
"group": "Controls",
"name": "UseLeftStick"
},
{
"value": "",
"type": "Boolean",
"label": "Use right stick",
"group": "Controls",
"name": "UseRightStick"
},
{
"value": "B or Circle",
"type": "Choice",
"label": "Hand brake button",
"group": "Controls",
"choices": [
{
"label": "A or Cross",
"value": "A or Cross"
},
{
"label": "B or Circle",
"value": "B or Circle"
},
{
"label": "X or Square",
"value": "X or Square"
},
{
"label": "Y or Triangle",
"value": "Y or Triangle"
},
{
"label": "LB or L1",
"value": "LB or L1"
},
{
"label": "RB or R1",
"value": "RB or R1"
},
{
"label": "LT or L2",
"value": "LT or L2"
},
{
"label": "RT or R2",
"value": "RT or R2"
}
],
"name": "HandBrakeButton"
}
],
"propertiesFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"propertyName": "PhysicsCar3D"
},
{
"propertyName": "GamepadIdentifier"
},
{
"folderName": "Controls",
"children": [
{
"propertyName": "UseArrows"
},
{
"propertyName": "UseLeftStick"
},
{
"propertyName": "UseRightStick"
},
{
"propertyName": "HandBrakeButton"
}
]
}
]
}
},
{
"description": "Control a top-down character with a gamepad.",
"fullName": "Top-down gamepad mapper",
"helpPath": "",
"iconUrl": "",
"name": "TopDownGamepadMapper",
"objectType": "",
"previewIconUrl": "",
"quickCustomizationVisibility": "hidden",
"eventsFunctions": [
{
"fullName": "",
"functionType": "Action",
"name": "doStepPreEvents",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Controller_X_is_connected"
},
"parameters": [
"",
"GamepadIdentifier",
""
]
}
],
"actions": [],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"UseArrows",
"True",
""
]
}
],
"actions": [],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Button_pressed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Left\"",
"\"Left\""
]
}
],
"actions": [
{
"type": {
"value": "TopDownMovementBehavior::SimulateLeftKey"
},
"parameters": [
"Object",
"TopDownMovement"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Button_pressed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Right\"",
"\"Left\""
]
}
],
"actions": [
{
"type": {
"value": "TopDownMovementBehavior::SimulateRightKey"
},
"parameters": [
"Object",
"TopDownMovement"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Button_pressed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Up\"",
"\"Left\""
]
}
],
"actions": [
{
"type": {
"value": "TopDownMovementBehavior::SimulateUpKey"
},
"parameters": [
"Object",
"TopDownMovement"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Button_pressed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Down\"",
"\"Left\""
]
}
],
"actions": [
{
"type": {
"value": "TopDownMovementBehavior::SimulateDownKey"
},
"parameters": [
"Object",
"TopDownMovement"
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"UseLeftStick",
"True",
""
]
}
],
"actions": [],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"StickMode",
"=",
"\"Analog\""
]
}
],
"actions": [
{
"type": {
"value": "TopDownMovementBehavior::SimulateStick"
},
"parameters": [
"Object",
"TopDownMovement",
"Gamepads::StickRotationValue(GamepadIdentifier, \"Left\")",
"Gamepads::StickForce(GamepadIdentifier, \"Left\")"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"StickMode",
"=",
"\"360°\""
]
}
],
"actions": [
{
"type": {
"value": "TopDownMovementBehavior::SimulateStick"
},
"parameters": [
"Object",
"TopDownMovement",
"Gamepads::StickRotationValue(GamepadIdentifier, \"Left\")",
"sign(Gamepads::StickForce(GamepadIdentifier, \"Left\"))"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"StickMode",
"=",
"\"8 Directions\""
]
}
],
"actions": [],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Axis_pushed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Left\"",
"\"Left\"",
""
]
}
],
"actions": [
{
"type": {
"value": "TopDownMovementBehavior::SimulateLeftKey"
},
"parameters": [
"Object",
"TopDownMovement"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Axis_pushed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Left\"",
"\"Right\"",
""
]
}
],
"actions": [
{
"type": {
"value": "TopDownMovementBehavior::SimulateRightKey"
},
"parameters": [
"Object",
"TopDownMovement"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Axis_pushed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Left\"",
"\"Up\"",
""
]
}
],
"actions": [
{
"type": {
"value": "TopDownMovementBehavior::SimulateUpKey"
},
"parameters": [
"Object",
"TopDownMovement"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Axis_pushed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Left\"",
"\"Down\"",
""
]
}
],
"actions": [
{
"type": {
"value": "TopDownMovementBehavior::SimulateDownKey"
},
"parameters": [
"Object",
"TopDownMovement"
]
}
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"UseRightStick",
"True",
""
]
}
],
"actions": [],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"StickMode",
"=",
"\"Analog\""
]
}
],
"actions": [
{
"type": {
"value": "TopDownMovementBehavior::SimulateStick"
},
"parameters": [
"Object",
"TopDownMovement",
"Gamepads::StickRotationValue(GamepadIdentifier, \"Right\")",
"Gamepads::StickForce(GamepadIdentifier, \"Right\")"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"StickMode",
"=",
"\"360°\""
]
}
],
"actions": [
{
"type": {
"value": "TopDownMovementBehavior::SimulateStick"
},
"parameters": [
"Object",
"TopDownMovement",
"sign(Gamepads::StickForce(GamepadIdentifier, \"Right\"))",
"1"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"StickMode",
"=",
"\"8 Directions\""
]
}
],
"actions": [],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Axis_pushed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Right\"",
"\"Left\"",
""
]
}
],
"actions": [
{
"type": {
"value": "TopDownMovementBehavior::SimulateLeftKey"
},
"parameters": [
"Object",
"TopDownMovement"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Axis_pushed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Right\"",
"\"Right\"",
""
]
}
],
"actions": [
{
"type": {
"value": "TopDownMovementBehavior::SimulateRightKey"
},
"parameters": [
"Object",
"TopDownMovement"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Axis_pushed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Right\"",
"\"Up\"",
""
]
}
],
"actions": [
{
"type": {
"value": "TopDownMovementBehavior::SimulateUpKey"
},
"parameters": [
"Object",
"TopDownMovement"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Gamepads::C_Axis_pushed"
},
"parameters": [
"",
"GamepadIdentifier",
"\"Right\"",
"\"Down\"",
""
]
}
],
"actions": [
{
"type": {
"value": "TopDownMovementBehavior::SimulateDownKey"
},
"parameters": [
"Object",
"TopDownMovement"
]
}
]
}
]
}
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "Gamepads::TopDownGamepadMapper",
"type": "behavior"
}
],
"objectGroups": []
}
],
"eventsFunctionsFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"functionName": "doStepPreEvents"
}
]
},
"propertyDescriptors": [
{
"value": "",
"type": "Behavior",
"label": "Top-down movement behavior",
"extraInformation": [
"TopDownMovementBehavior::TopDownMovementBehavior"
],
"choices": [],
"name": "TopDownMovement"
},
{
"value": "1",
"type": "Number",
"label": "Gamepad identifier (1, 2, 3 or 4)",
"name": "GamepadIdentifier"
},
{
"value": "true",
"type": "Boolean",
"label": "Use directional pad",
"group": "Controls",
"name": "UseArrows"
},
{
"value": "true",
"type": "Boolean",
"label": "Use left stick",
"group": "Controls",
"name": "UseLeftStick"
},
{
"value": "",
"type": "Boolean",
"label": "Use right stick",
"group": "Controls",
"name": "UseRightStick"
},
{
"value": "Analog",
"type": "Choice",
"label": "Stick mode",
"group": "Controls",
"choices": [
{
"label": "Analog",
"value": "Analog"
},
{
"label": "360°",
"value": "360°"
},
{
"label": "8 Directions",
"value": "8 Directions"
}
],
"name": "StickMode"
}
],
"propertiesFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"propertyName": "TopDownMovement"
},
{
"propertyName": "GamepadIdentifier"
},
{
"folderName": "Controls",
"children": [
{
"propertyName": "UseArrows"
},
{
"propertyName": "UseLeftStick"
},
{
"propertyName": "UseRightStick"
},
{
"propertyName": "StickMode"
}
]
}
]
}
}
],
"eventsBasedObjects": []
},
{
"author": "",
"category": "Camera",
"dimension": "2D",
"extensionNamespace": "",
"fullName": "Smooth Camera",
"gdevelopVersion": ">=5.5.222",
"helpPath": "/tutorials/follow-player-with-camera/",
"iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQoJLnN0MXtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwO30NCjwvc3R5bGU+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjQsMTNoLTZjLTEuMSwwLTItMC45LTItMlY1YzAtMS4xLDAuOS0yLDItMmg2YzEuMSwwLDIsMC45LDIsMnY2QzI2LDEyLjEsMjUuMSwxMywyNCwxM3oiLz4NCjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0yNiw4djEwYzAsMS4xLTAuOSwyLTIsMkg4Yy0xLjEsMC0yLTAuOS0yLTJWOGMwLTEuMSwwLjktMiwyLTJoOCIvPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjEiIGN5PSI4IiByPSIyIi8+DQo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxMSIgY3k9IjE2IiByPSIxIi8+DQo8cmVjdCB4PSI5IiB5PSI5IiBjbGFzcz0ic3QwIiB3aWR0aD0iNCIgaGVpZ2h0PSIzIi8+DQo8cG9seWxpbmUgY2xhc3M9InN0MCIgcG9pbnRzPSIyMSwyOSAyMSwyOSAxMSwyOSAxMSwyOSAiLz4NCjxwb2x5bGluZSBjbGFzcz0ic3QwIiBwb2ludHM9IjE4LDIwIDE4LDI5IDE0LDI5IDE0LDIwICIvPg0KPHJlY3QgeD0iNyIgeT0iMyIgY2xhc3M9InN0MCIgd2lkdGg9IjQiIGhlaWdodD0iMyIvPg0KPC9zdmc+DQo=",
"name": "SmoothCamera",
"previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Computers and Hardware/Computers and Hardware_camcoder_gopro_go_pro_camera.svg",
"shortDescription": "Smoothly scroll to follow an object.",
"version": "0.4.5",
"description": [
"The camera follows an object according to:",
"- a frame rate independent catch-up speed to make the scrolling from smooth to strong",
"- a maximum speed to do linear following ([open the project online](https://editor.gdevelop.io/?project=example://platformer-with-tilemap)) or slow down the camera when teleporting the object",
"- a follow-free zone to avoid scrolling on small movements",
"- an offset to see further in one direction",
"- an extra delay and catch-up speed to give an impression of speed (useful for dash)",
"- position forecasting and delay to simulate a cameraman response time",
"",
"A platformer dedicated behavior allows to switch of settings when the character is in air or on the floor. This can be used to stabilize the camera when jumping."
],
"origin": {
"identifier": "SmoothCamera",
"name": "gdevelop-extension-store"
},
"tags": [
"camera",
"scrolling",
"follow",
"smooth",
"platformer",
"platform"
],
"authorIds": [
"IWykYNRvhCZBN3vEgKEbBPOR3Oc2"
],
"dependencies": [],
"globalVariables": [],
"sceneVariables": [],
"eventsFunctions": [],
"eventsFunctionsFolderStructure": {
"folderName": "__ROOT"
},
"eventsBasedBehaviors": [
{
"description": "Smoothly scroll to follow an object.",
"fullName": "Smooth Camera",
"helpPath": "",
"iconUrl": "",
"name": "SmoothCamera",
"objectType": "",
"previewIconUrl": "",
"quickCustomizationVisibility": "hidden",
"eventsFunctions": [
{
"fullName": "",
"functionType": "Action",
"name": "onCreated",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Update private properties through setters to check their values and initialize state."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetLeftwardSpeed"
},
"parameters": [
"Object",
"Behavior",
"LeftwardSpeed",
"log(1 - )"
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetRightwardSpeed"
},
"parameters": [
"Object",
"Behavior",
"RightwardSpeed",
"log(1 - )"
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetUpwardSpeed"
},
"parameters": [
"Object",
"Behavior",
"UpwardSpeed",
"log(1 - )"
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetDownwardSpeed"
},
"parameters": [
"Object",
"Behavior",
"DownwardSpeed",
"log(1 - )"
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetLeftwardSpeedMax"
},
"parameters": [
"Object",
"Behavior",
"LeftwardSpeedMax",
"log(1 - )"
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetRightwardSpeedMax"
},
"parameters": [
"Object",
"Behavior",
"RightwardSpeedMax",
"log(1 - )"
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetUpwardSpeedMax"
},
"parameters": [
"Object",
"Behavior",
"UpwardSpeedMax",
"log(1 - )"
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetDownwardSpeedMax"
},
"parameters": [
"Object",
"Behavior",
"DownwardSpeedMax",
"log(1 - )"
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaLeft"
},
"parameters": [
"Object",
"Behavior",
"FollowFreeAreaLeft",
"log(1 - )"
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaRight"
},
"parameters": [
"Object",
"Behavior",
"FollowFreeAreaRight",
"log(1 - )"
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaTop"
},
"parameters": [
"Object",
"Behavior",
"FollowFreeAreaTop",
"log(1 - )"
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom"
},
"parameters": [
"Object",
"Behavior",
"FollowFreeAreaBottom",
"log(1 - )"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"CameraDelay",
"=",
"CameraDelay"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
}
],
"objectGroups": []
},
{
"fullName": "",
"functionType": "Action",
"name": "doStepPreEvents",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"inverted": true,
"value": "BooleanVariable"
},
"parameters": [
"IsCalledManually",
"True",
""
]
}
],
"actions": [
{
"type": {
"value": "SmoothCamera::SmoothCamera::DoMoveCameraCloser"
},
"parameters": [
"Object",
"Behavior",
""
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Move the camera closer to the object. This action must be called after the object has moved for the frame.",
"fullName": "Move the camera closer",
"functionType": "Action",
"name": "MoveCameraCloser",
"sentence": "Move the camera closer to _PARAM0_",
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "The camera following is called with an action, the call from doStepPreEvents must be disabled to avoid to do it twice."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetBooleanVariable"
},
"parameters": [
"IsCalledManually",
"True",
""
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::DoMoveCameraCloser"
},
"parameters": [
"Object",
"Behavior",
""
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Move the camera closer to the object.",
"fullName": "Do move the camera closer",
"functionType": "Action",
"name": "DoMoveCameraCloser",
"private": true,
"sentence": "Do move the camera closer _PARAM0_",
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Delaying and forecasting can be used at the same time.\nForecasting only use the positions that are older than the one used for delaying.\nThe behavior uses a position history that is split in 2 arrays:\n- one for delaying the position (from TimeFromStart to TimeFromStart - CamearDelay)\n- one for forecasting the position (from TimeFromStart - CamearDelay to TimeFromStart - CamearDelay - ForecastHistoryDuration"
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SmoothCamera::SmoothCamera::UpdateDelayedPosition"
},
"parameters": [
"Object",
"Behavior",
""
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::UpdateForecastedPosition"
},
"parameters": [
"Object",
"Behavior",
""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "At each frame, the camera must catchup the target by a given ratio (speed)\ncameraX(t) - targetX = (cameraX(t - 1) - targetX) * speed\n\nThe frame rate must not impact on the catch-up speed, we don't want a speed in ratio per frame but a speed ratio per second, like this:\ncameraX(t) - targetX = (cameraX(t - 1s) - targetX) * speed\n\nOk, but we still need to process each frame, we can use a exponent for this:\ncameraX(t) - targetX = (cameraX(t - timeDelta) - targetX) * speed^timeDelta\ncameraX(t) = targetX + (cameraX(t - timeDelta) - targetX) * exp(timeDelta * ln(speed))\n\npow is probably more efficient than precalculated log if the speed is changed continuously but this might be rare enough."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"FollowOnX",
"True",
""
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"OldX",
"=",
"CameraX(Object.Layer(), 0)"
]
}
],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "CameraCenterX"
},
"parameters": [
"",
">",
"Object.Behavior::FreeAreaRight()",
"Object.Layer()",
"0"
]
}
],
"actions": [
{
"type": {
"value": "SetCameraCenterX"
},
"parameters": [
"",
"=",
"Object.Behavior::FreeAreaRight()\n+ (CameraX(Object.Layer(), 0) - Object.Behavior::FreeAreaRight())\n* exp(TimeDelta() * LogLeftwardSpeed)",
"Object.Layer()",
"0"
]
}
],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "CameraCenterX"
},
"parameters": [
"",
"<",
"OldX - LeftwardSpeedMax * TimeDelta()",
"Object.Layer()",
"0"
]
}
],
"actions": [
{
"type": {
"value": "SetCameraCenterX"
},
"parameters": [
"",
"=",
"OldX - LeftwardSpeedMax * TimeDelta()",
"Object.Layer()",
"0"
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "CameraCenterX"
},
"parameters": [
"",
"<",
"Object.Behavior::FreeAreaLeft()",
"Object.Layer()",
"0"
]
}
],
"actions": [
{
"type": {
"value": "SetCameraCenterX"
},
"parameters": [
"",
"=",
"Object.Behavior::FreeAreaLeft()\n+ (CameraX(Object.Layer(), 0) - Object.Behavior::FreeAreaLeft())\n* exp(TimeDelta() * LogRightwardSpeed)",
"Object.Layer()",
"0"
]
}
],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "CameraCenterX"
},
"parameters": [
"",
">",
"OldX + RightwardSpeedMax * TimeDelta()",
"Object.Layer()",
"0"
]
}
],
"actions": [
{
"type": {
"value": "SetCameraCenterX"
},
"parameters": [
"",
"=",
"OldX + RightwardSpeedMax * TimeDelta()",
"Object.Layer()",
"0"
]
}
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"FollowOnY",
"True",
""
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"OldY",
"=",
"CameraY(Object.Layer(), 0)"
]
}
],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "CameraCenterY"
},
"parameters": [
"",
">",
"Object.Behavior::FreeAreaBottom()",
"Object.Layer()",
"0"
]
}
],
"actions": [
{
"type": {
"value": "SetCameraCenterY"
},
"parameters": [
"",
"=",
"Object.Behavior::FreeAreaBottom()\n+ (CameraY(Object.Layer(), 0) - Object.Behavior::FreeAreaBottom())\n* exp(TimeDelta() * LogUpwardSpeed)",
"Object.Layer()",
"0"
]
}
],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "CameraCenterY"
},
"parameters": [
"",
"<",
"OldY - UpwardSpeedMax * TimeDelta()",
"Object.Layer()",
"0"
]
}
],
"actions": [
{
"type": {
"value": "SetCameraCenterY"
},
"parameters": [
"",
"=",
"OldY - UpwardSpeedMax * TimeDelta()",
"Object.Layer()",
"0"
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "CameraCenterY"
},
"parameters": [
"",
"<",
"Object.Behavior::FreeAreaTop()",
"Object.Layer()",
"0"
]
}
],
"actions": [
{
"type": {
"value": "SetCameraCenterY"
},
"parameters": [
"",
"=",
"Object.Behavior::FreeAreaTop()\n+ (CameraY(Object.Layer(), 0) - Object.Behavior::FreeAreaTop())\n* exp(TimeDelta() * LogDownwardSpeed)",
"Object.Layer()",
"0"
]
}
],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "CameraCenterY"
},
"parameters": [
"",
">",
"OldY + DownwardSpeedMax * TimeDelta()",
"Object.Layer()",
"0"
]
}
],
"actions": [
{
"type": {
"value": "SetCameraCenterY"
},
"parameters": [
"",
"=",
"OldY + DownwardSpeedMax * TimeDelta()",
"Object.Layer()",
"0"
]
}
]
}
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Delay the camera according to a maximum speed and catch up the delay.",
"fullName": "Wait and catch up",
"functionType": "Action",
"name": "WaitAndCatchUp",
"sentence": "Delay the camera of _PARAM0_ during: _PARAM2_ seconds according to the maximum speed _PARAM3_;_PARAM4_ seconds and catch up in _PARAM5_ seconds",
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Maybe the catch-up show be done in constant pixel speed instead of constant time speed."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"WaitingEnd",
"=",
"TimeFromStart() + NewWaitingDuration"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"WaitingSpeedXMax",
"=",
"NewWaitingSpeedXMax"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"WaitingSpeedYMax",
"=",
"NewWaitingSpeedYMax"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"CameraDelayCatchUpDuration",
"=",
"NewCatchUpDuration"
]
}
]
},
{
"disabled": true,
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "DebuggerTools::ConsoleLog"
},
"parameters": [
"\"Wait and catch up\"",
"\"info\"",
"\"SmoothCamera\""
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "Waiting duration (in seconds)",
"name": "NewWaitingDuration",
"type": "expression"
},
{
"description": "Waiting maximum camera target speed X",
"name": "NewWaitingSpeedXMax",
"type": "expression"
},
{
"description": "Waiting maximum camera target speed Y",
"name": "NewWaitingSpeedYMax",
"type": "expression"
},
{
"description": "Catch up duration (in seconds)",
"name": "NewCatchUpDuration",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Draw the targeted and actual camera position.",
"fullName": "Draw debug",
"functionType": "Action",
"name": "DrawDebug",
"sentence": "Draw targeted and actual camera position for _PARAM0_ on _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "PrimitiveDrawing::FillOpacity"
},
"parameters": [
"ShapePainter",
"=",
"0"
]
}
]
},
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Path used by the forecasting",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BuiltinCommonInstructions::CompareNumbers"
},
"parameters": [
"Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)",
">",
"0"
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"Index",
"=",
"0"
]
},
{
"type": {
"value": "PrimitiveDrawing::OutlineColor"
},
"parameters": [
"ShapePainter",
"\"245;166;35\""
]
},
{
"type": {
"value": "PrimitiveDrawing::BeginFillPath"
},
"parameters": [
"ShapePainter",
"Object.Variable(__SmoothCamera.ForecastHistoryX[0])",
"Object.Variable(__SmoothCamera.ForecastHistoryY[0])"
]
}
],
"events": [
{
"type": "BuiltinCommonInstructions::Repeat",
"repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)",
"conditions": [],
"actions": [
{
"type": {
"value": "PrimitiveDrawing::PathLineTo"
},
"parameters": [
"ShapePainter",
"Object.Variable(__SmoothCamera.ForecastHistoryX[Index])",
"Object.Variable(__SmoothCamera.ForecastHistoryY[Index])"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"Index",
"+",
"1"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "PrimitiveDrawing::EndFillPath"
},
"parameters": [
"ShapePainter"
]
}
]
}
]
}
],
"parameters": []
},
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Follow-free area.",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BuiltinCommonInstructions::Or"
},
"parameters": [],
"subInstructions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"FollowFreeAreaLeft",
"!=",
"0"
]
},
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"FollowFreeAreaRight",
"!=",
"0"
]
},
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"FollowFreeAreaTop",
"!=",
"0"
]
},
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"FollowFreeAreaBottom",
"!=",
"0"
]
}
]
}
],
"actions": [
{
"type": {
"value": "PrimitiveDrawing::OutlineColor"
},
"parameters": [
"ShapePainter",
"\"126;211;33\""
]
},
{
"type": {
"value": "PrimitiveDrawing::Rectangle"
},
"parameters": [
"ShapePainter",
"Object.Behavior::FreeAreaLeft() - 1",
"Object.Behavior::FreeAreaTop() - 1",
"Object.Behavior::FreeAreaRight() + 1",
"Object.Behavior::FreeAreaBottom() + 1"
]
}
]
}
],
"parameters": []
},
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Linear regression vector used by the forecasting.",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "PrimitiveDrawing::OutlineColor"
},
"parameters": [
"ShapePainter",
"\"208;2;27\""
]
},
{
"type": {
"value": "PrimitiveDrawing::LineV2"
},
"parameters": [
"ShapePainter",
"ProjectedOldestX",
"ProjectedOldestY",
"ProjectedNewestX",
"ProjectedNewestY",
"1"
]
}
]
}
],
"parameters": []
},
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Targeted and actual camera position",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "PrimitiveDrawing::Circle"
},
"parameters": [
"ShapePainter",
"ForecastedX",
"ForecastedY",
"3"
]
},
{
"type": {
"value": "PrimitiveDrawing::LineV2"
},
"parameters": [
"ShapePainter",
"CameraX(Object.Layer(), 0)",
"CameraY(Object.Layer(), 0) - 4",
"CameraX(Object.Layer(), 0)",
"CameraY(Object.Layer(), 0) + 4",
"1"
]
},
{
"type": {
"value": "PrimitiveDrawing::LineV2"
},
"parameters": [
"ShapePainter",
"CameraX(Object.Layer(), 0) - 4",
"CameraY(Object.Layer(), 0)",
"CameraX(Object.Layer(), 0) + 4",
"CameraY(Object.Layer(), 0)",
"1"
]
}
]
}
],
"parameters": []
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "Shape painter",
"name": "ShapePainter",
"supplementaryInformation": "PrimitiveDrawing::Drawer",
"type": "objectList"
}
],
"objectGroups": []
},
{
"description": "Enable or disable the following on X axis.",
"fullName": "Follow on X",
"functionType": "Action",
"group": "Camera configuration",
"name": "SetFollowOnX",
"sentence": "The camera follows _PARAM0_ on X axis: _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetBooleanVariable"
},
"parameters": [
"FollowOnX",
"False",
""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"Value",
"True",
""
]
}
],
"actions": [
{
"type": {
"value": "SetBooleanVariable"
},
"parameters": [
"FollowOnX",
"True",
""
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "Follow on X axis",
"name": "Value",
"type": "yesorno"
}
],
"objectGroups": []
},
{
"description": "Enable or disable the following on Y axis.",
"fullName": "Follow on Y",
"functionType": "Action",
"group": "Camera configuration",
"name": "SetFollowOnY",
"sentence": "The camera follows _PARAM0_ on Y axis: _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetBooleanVariable"
},
"parameters": [
"FollowOnY",
"False",
""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"Value",
"True",
""
]
}
],
"actions": [
{
"type": {
"value": "SetBooleanVariable"
},
"parameters": [
"FollowOnY",
"True",
""
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "Follow on Y axis",
"name": "Value",
"type": "yesorno"
}
],
"objectGroups": []
},
{
"description": "Change the camera follow free area right border.",
"fullName": "Follow free area right border",
"functionType": "Action",
"group": "Camera configuration",
"name": "SetFollowFreeAreaRight",
"sentence": "Change the camera follow free area right border of _PARAM0_: _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"FollowFreeAreaRight",
"=",
"max(0, Value)"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "Follow free area right border",
"name": "Value",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Change the camera follow free area left border.",
"fullName": "Follow free area left border",
"functionType": "Action",
"group": "Camera configuration",
"name": "SetFollowFreeAreaLeft",
"sentence": "Change the camera follow free area left border of _PARAM0_: _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"FollowFreeAreaLeft",
"=",
"max(0, Value)"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "Follow free area left border",
"name": "Value",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Change the camera follow free area top border.",
"fullName": "Follow free area top border",
"functionType": "Action",
"group": "Camera configuration",
"name": "SetFollowFreeAreaTop",
"sentence": "Change the camera follow free area top border of _PARAM0_: _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"FollowFreeAreaTop",
"=",
"max(0, Value)"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "Follow free area top border",
"name": "Value",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Change the camera follow free area bottom border.",
"fullName": "Follow free area bottom border",
"functionType": "Action",
"group": "Camera configuration",
"name": "SetFollowFreeAreaBottom",
"sentence": "Change the camera follow free area bottom border of _PARAM0_: _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"FollowFreeAreaBottom",
"=",
"max(0, Value)"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "Follow free area bottom border",
"name": "Value",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Change the camera leftward maximum speed (in pixels per second).",
"fullName": "Leftward maximum speed",
"functionType": "Action",
"group": "Camera configuration",
"name": "SetLeftwardSpeedMax",
"sentence": "Change the camera leftward maximum speed of _PARAM0_: _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"LeftwardSpeedMax",
"=",
"max(0, Value)"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "Leftward maximum speed (in pixels per second)",
"name": "Value",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Change the camera rightward maximum speed (in pixels per second).",
"fullName": "Rightward maximum speed",
"functionType": "Action",
"group": "Camera configuration",
"name": "SetRightwardSpeedMax",
"sentence": "Change the camera rightward maximum speed of _PARAM0_: _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"RightwardSpeedMax",
"=",
"max(0, Value)"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "Rightward maximum speed (in pixels per second)",
"name": "Value",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Change the camera upward maximum speed (in pixels per second).",
"fullName": "Upward maximum speed",
"functionType": "Action",
"group": "Camera configuration",
"name": "SetUpwardSpeedMax",
"sentence": "Change the camera upward maximum speed of _PARAM0_: _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"UpwardSpeedMax",
"=",
"max(0, Value)"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "Upward maximum speed (in pixels per second)",
"name": "Value",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Change the camera downward maximum speed (in pixels per second).",
"fullName": "Downward maximum speed",
"functionType": "Action",
"group": "Camera configuration",
"name": "SetDownwardSpeedMax",
"sentence": "Change the camera downward maximum speed of _PARAM0_: _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"DownwardSpeedMax",
"=",
"max(0, Value)"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "Downward maximum speed (in pixels per second)",
"name": "Value",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Change the camera leftward catch-up speed (in ratio per second).",
"fullName": "Leftward catch-up speed",
"functionType": "Action",
"group": "Camera configuration",
"name": "SetLeftwardSpeed",
"sentence": "Change the camera leftward catch-up speed of _PARAM0_: _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"LeftwardSpeed",
"=",
"clamp(0, 1, Value)"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"LogLeftwardSpeed",
"=",
"log(1 - Value)"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "Leftward catch-up speed (in ratio per second)",
"name": "Value",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Change the camera rightward catch-up speed (in ratio per second).",
"fullName": "Rightward catch-up speed",
"functionType": "Action",
"group": "Camera configuration",
"name": "SetRightwardSpeed",
"sentence": "Change the camera rightward catch-up speed of _PARAM0_: _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"RightwardSpeed",
"=",
"clamp(0, 1, Value)"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"LogRightwardSpeed",
"=",
"log(1 - Value)"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "Rightward catch-up speed (in ratio per second)",
"name": "Value",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Change the camera downward catch-up speed (in ratio per second).",
"fullName": "Downward catch-up speed",
"functionType": "Action",
"group": "Camera configuration",
"name": "SetDownwardSpeed",
"sentence": "Change the camera downward catch-up speed of _PARAM0_: _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"DownwardSpeed",
"=",
"clamp(0, 1, Value)"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"LogDownwardSpeed",
"=",
"log(1 - Value)"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "Downward catch-up speed (in ratio per second)",
"name": "Value",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Change the camera upward catch-up speed (in ratio per second).",
"fullName": "Upward catch-up speed",
"functionType": "Action",
"group": "Camera configuration",
"name": "SetUpwardSpeed",
"sentence": "Change the camera upward catch-up speed of _PARAM0_: _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"UpwardSpeed",
"=",
"clamp(0, 1, Value)"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"LogUpwardSpeed",
"=",
"log(1 - Value)"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "Upward catch-up speed (in ratio per second)",
"name": "Value",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "the camera offset on X axis of the object. This is not the current difference between the object and the camera position.",
"fullName": "Camera offset X",
"functionType": "ExpressionAndCondition",
"group": "Camera configuration",
"name": "OffsetX",
"sentence": "the camera offset on X axis",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnNumber"
},
"parameters": [
"CameraOffsetX"
]
}
]
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
}
],
"objectGroups": []
},
{
"fullName": "",
"functionType": "ActionWithOperator",
"getterName": "OffsetX",
"group": "Camera configuration",
"name": "SetOffsetXOp",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"CameraOffsetX",
"=",
"Value"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Change the camera offset on X axis of an object.",
"fullName": "Camera Offset X",
"functionType": "Action",
"group": "Camera configuration",
"name": "SetOffsetX",
"private": true,
"sentence": "Change the camera offset on X axis of _PARAM0_: _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Deprecated use SetOffsetXOp instead."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetOffsetXOp"
},
"parameters": [
"Object",
"Behavior",
"=",
"Value",
""
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "Camera offset X",
"name": "Value",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "the camera offset on Y axis of the object. This is not the current difference between the object and the camera position.",
"fullName": "Camera offset Y",
"functionType": "ExpressionAndCondition",
"group": "Camera configuration",
"name": "OffsetY",
"sentence": "the camera offset on Y axis",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnNumber"
},
"parameters": [
"CameraOffsetY"
]
}
]
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
}
],
"objectGroups": []
},
{
"fullName": "",
"functionType": "ActionWithOperator",
"getterName": "OffsetY",
"group": "Camera configuration",
"name": "SetOffsetYOp",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"CameraOffsetY",
"=",
"Value"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Change the camera offset on Y axis of an object.",
"fullName": "Camera Offset Y",
"functionType": "Action",
"group": "Camera configuration",
"name": "SetOffsetY",
"private": true,
"sentence": "Change the camera offset on Y axis of _PARAM0_: _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Deprecated use SetOffsetYOp instead."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetOffsetYOp"
},
"parameters": [
"Object",
"Behavior",
"=",
"CameraOffsetY",
""
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "Camera offset Y",
"name": "CameraOffsetY",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Change the camera forecast time (in seconds).",
"fullName": "Forecast time",
"functionType": "Action",
"group": "Camera configuration",
"name": "SetForecastTime",
"sentence": "Change the camera forecast time of _PARAM0_: _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastTime",
"=",
"min(0, Value)"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "Forecast time",
"name": "Value",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Change the camera delay (in seconds).",
"fullName": "Camera delay",
"functionType": "Action",
"group": "Camera configuration",
"name": "SetCameraDelay",
"sentence": "Change the camera delay of _PARAM0_: _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"CameraDelay",
"=",
"max(0, Value)"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "Camera delay",
"name": "Value",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Return follow free area left border X.",
"fullName": "Free area left",
"functionType": "Expression",
"group": "Private",
"name": "FreeAreaLeft",
"private": true,
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnNumber"
},
"parameters": [
"ForecastedX + CameraOffsetX - FollowFreeAreaLeft"
]
}
]
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Return follow free area right border X.",
"fullName": "Free area right",
"functionType": "Expression",
"group": "Private",
"name": "FreeAreaRight",
"private": true,
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnNumber"
},
"parameters": [
"ForecastedX + CameraOffsetX + FollowFreeAreaRight"
]
}
]
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Return follow free area bottom border Y.",
"fullName": "Free area bottom",
"functionType": "Expression",
"group": "Private",
"name": "FreeAreaBottom",
"private": true,
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnNumber"
},
"parameters": [
"ForecastedY + CameraOffsetY + FollowFreeAreaBottom"
]
}
]
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Return follow free area top border Y.",
"fullName": "Free area top",
"functionType": "Expression",
"group": "Private",
"name": "FreeAreaTop",
"private": true,
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnNumber"
},
"parameters": [
"ForecastedY + CameraOffsetY - FollowFreeAreaTop"
]
}
]
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Update delayed position and delayed history. This is called in doStepPreEvents.",
"fullName": "Update delayed position",
"functionType": "Action",
"group": "Private",
"name": "UpdateDelayedPosition",
"private": true,
"sentence": "Update delayed position and delayed history of _PARAM0_",
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Add the previous position to have enough (2) positions to evaluate the extra delay for waiting mode."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "SmoothCamera::SmoothCamera::IsWaiting"
},
"parameters": [
"Object",
"Behavior",
""
]
},
{
"type": {
"value": "BuiltinCommonInstructions::CompareNumbers"
},
"parameters": [
"Object.VariableChildCount(__SmoothCamera.ObjectTime)",
"=",
"0"
]
}
],
"actions": [
{
"type": {
"value": "ObjectVariablePushNumber"
},
"parameters": [
"Object",
"__SmoothCamera.ObjectTime",
"TimeFromStart()"
]
},
{
"type": {
"value": "ObjectVariablePushNumber"
},
"parameters": [
"Object",
"__SmoothCamera.ObjectX",
"DelayedCenterX"
]
},
{
"type": {
"value": "ObjectVariablePushNumber"
},
"parameters": [
"Object",
"__SmoothCamera.ObjectY",
"DelayedCenterY"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Use the object center when no delay is asked."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"DelayedCenterX",
"=",
"Object.CenterX()"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"DelayedCenterY",
"=",
"Object.CenterY()"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"inverted": true,
"value": "SmoothCamera::SmoothCamera::IsDelayed"
},
"parameters": [
"Object",
"Behavior",
""
]
}
],
"actions": [
{
"type": {
"value": "SmoothCamera::SmoothCamera::AddForecastHistoryPosition"
},
"parameters": [
"Object",
"Behavior",
"TimeFromStart()",
"Object.CenterX()",
"Object.CenterY()",
""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BuiltinCommonInstructions::Or"
},
"parameters": [],
"subInstructions": [
{
"type": {
"value": "SmoothCamera::SmoothCamera::IsDelayed"
},
"parameters": [
"Object",
"Behavior",
""
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::IsWaiting"
},
"parameters": [
"Object",
"Behavior",
""
]
}
]
}
],
"actions": [
{
"type": {
"value": "ObjectVariablePushNumber"
},
"parameters": [
"Object",
"__SmoothCamera.ObjectTime",
"TimeFromStart()"
]
},
{
"type": {
"value": "ObjectVariablePushNumber"
},
"parameters": [
"Object",
"__SmoothCamera.ObjectX",
"Object.CenterX()"
]
},
{
"type": {
"value": "ObjectVariablePushNumber"
},
"parameters": [
"Object",
"__SmoothCamera.ObjectY",
"Object.CenterY()"
]
}
],
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Remove history entries that are too old to be useful for delaying and pass it to the history for forecasting."
},
{
"infiniteLoopWarning": true,
"type": "BuiltinCommonInstructions::While",
"whileConditions": [
{
"type": {
"value": "BuiltinCommonInstructions::CompareNumbers"
},
"parameters": [
"Object.VariableChildCount(__SmoothCamera.ObjectTime)",
">=",
"2"
]
},
{
"type": {
"value": "VarObjet"
},
"parameters": [
"Object",
"__SmoothCamera.ObjectTime[1]",
"<",
"TimeFromStart() - Object.Behavior::CurrentDelay()"
]
}
],
"conditions": [],
"actions": [
{
"type": {
"value": "SmoothCamera::SmoothCamera::AddForecastHistoryPosition"
},
"parameters": [
"Object",
"Behavior",
"Object.Variable(__SmoothCamera.ObjectTime[0])",
"Object.Variable(__SmoothCamera.ObjectX[0])",
"Object.Variable(__SmoothCamera.ObjectY[0])",
""
]
},
{
"type": {
"value": "ObjectVariableRemoveAt"
},
"parameters": [
"Object",
"__SmoothCamera.ObjectTime",
"0"
]
},
{
"type": {
"value": "ObjectVariableRemoveAt"
},
"parameters": [
"Object",
"__SmoothCamera.ObjectX",
"0"
]
},
{
"type": {
"value": "ObjectVariableRemoveAt"
},
"parameters": [
"Object",
"__SmoothCamera.ObjectY",
"0"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Don't move the camera if there is not enough history."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"DelayedCenterX",
"=",
"Object.Variable(__SmoothCamera.ObjectX[0])"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"DelayedCenterY",
"=",
"Object.Variable(__SmoothCamera.ObjectY[0])"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BuiltinCommonInstructions::CompareNumbers"
},
"parameters": [
"Object.VariableChildCount(__SmoothCamera.ObjectTime)",
">=",
"2"
]
},
{
"type": {
"value": "VarObjet"
},
"parameters": [
"Object",
"__SmoothCamera.ObjectTime[0]",
"<",
"TimeFromStart() - Object.Behavior::CurrentDelay()"
]
}
],
"actions": [],
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Add the extra delay that could be needed to respect the speed limit in waiting mode.\n\nspeedRatio = min(speedMaxX / historySpeedX, speedMaxY / historySpeedY)\ndelay += min(0, timeDelta * (1 - speedRatio))"
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "SmoothCamera::SmoothCamera::IsWaiting"
},
"parameters": [
"Object",
"Behavior",
""
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"CameraExtraDelay",
"+",
"max(0, TimeDelta() * (1 - min(WaitingSpeedXMax * abs(Object.Variable(__SmoothCamera.ObjectX[1]) - Object.Variable(__SmoothCamera.ObjectX[0])), WaitingSpeedYMax * abs(Object.Variable(__SmoothCamera.ObjectY[1]) - Object.Variable(__SmoothCamera.ObjectY[0]))) / (Object.Variable(__SmoothCamera.ObjectTime[1]) - Object.Variable(__SmoothCamera.ObjectTime[0]))))"
]
}
],
"events": [
{
"disabled": true,
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "DebuggerTools::ConsoleLog"
},
"parameters": [
"\"Extra delay: \" + ToString(CameraExtraDelay)",
"\"info\"",
"\"SmoothCamera\""
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "The time with delay is now between the first 2 indexes"
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"DelayedCenterX",
"=",
"lerp(Object.Variable(__SmoothCamera.ObjectX[1]), Object.Variable(__SmoothCamera.ObjectX[0]), ((TimeFromStart() - Object.Behavior::CurrentDelay()) - Object.Variable(__SmoothCamera.ObjectTime[1])) / (Object.Variable(__SmoothCamera.ObjectTime[0]) - Object.Variable(__SmoothCamera.ObjectTime[1])))"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"DelayedCenterY",
"=",
"lerp(Object.Variable(__SmoothCamera.ObjectY[1]), Object.Variable(__SmoothCamera.ObjectY[0]), ((TimeFromStart() - Object.Behavior::CurrentDelay()) - Object.Variable(__SmoothCamera.ObjectTime[1])) / (Object.Variable(__SmoothCamera.ObjectTime[0]) - Object.Variable(__SmoothCamera.ObjectTime[1])))"
]
}
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"inverted": true,
"value": "SmoothCamera::SmoothCamera::IsDelayed"
},
"parameters": [
"Object",
"Behavior",
""
]
},
{
"type": {
"inverted": true,
"value": "SmoothCamera::SmoothCamera::IsWaiting"
},
"parameters": [
"Object",
"Behavior",
""
]
}
],
"actions": [
{
"type": {
"value": "ObjectVariableClearChildren"
},
"parameters": [
"Object",
"__SmoothCamera.ObjectTime"
]
},
{
"type": {
"value": "ObjectVariableClearChildren"
},
"parameters": [
"Object",
"__SmoothCamera.ObjectX"
]
},
{
"type": {
"value": "ObjectVariableClearChildren"
},
"parameters": [
"Object",
"__SmoothCamera.ObjectY"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"inverted": true,
"value": "SmoothCamera::SmoothCamera::IsWaiting"
},
"parameters": [
"Object",
"Behavior",
""
]
},
{
"type": {
"value": "BuiltinCommonInstructions::Once"
},
"parameters": []
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"CameraDelayCatchUpSpeed",
"=",
"CameraExtraDelay / CameraDelayCatchUpDuration"
]
}
],
"events": [
{
"disabled": true,
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "DebuggerTools::ConsoleLog"
},
"parameters": [
"\"Start to catch up\"",
"\"info\"",
"\"SmoothCamera\""
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"inverted": true,
"value": "SmoothCamera::SmoothCamera::IsWaiting"
},
"parameters": [
"Object",
"Behavior",
""
]
},
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"CameraExtraDelay",
">",
"0"
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"CameraExtraDelay",
"=",
"max(0, CameraExtraDelay -CameraDelayCatchUpSpeed * TimeDelta())"
]
}
],
"events": [
{
"disabled": true,
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "DebuggerTools::ConsoleLog"
},
"parameters": [
"\"Catching up delay: \" + ToString(CameraExtraDelay)",
"\"info\"",
"\"SmoothCamera\""
]
}
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Check if the camera following target is delayed from the object.",
"fullName": "Camera is delayed",
"functionType": "Condition",
"name": "IsDelayed",
"private": true,
"sentence": "The camera of _PARAM0_ is delayed",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BuiltinCommonInstructions::CompareNumbers"
},
"parameters": [
"Object.Behavior::CurrentDelay()",
">",
"0"
]
}
],
"actions": [
{
"type": {
"value": "SetReturnBoolean"
},
"parameters": [
"True"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Return the current camera delay.",
"fullName": "Current delay",
"functionType": "Expression",
"name": "CurrentDelay",
"private": true,
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnNumber"
},
"parameters": [
"CameraDelay + CameraExtraDelay"
]
}
]
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Check if the camera following is waiting at a reduced speed.",
"fullName": "Camera is waiting",
"functionType": "Condition",
"name": "IsWaiting",
"private": true,
"sentence": "The camera of _PARAM0_ is waiting",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"WaitingEnd",
">",
"TimeFromStart()"
]
}
],
"actions": [
{
"type": {
"value": "SetReturnBoolean"
},
"parameters": [
"True"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Add a position to the history for forecasting. This is called 2 times in UpadteDelayedPosition.",
"fullName": "Add forecast history position",
"functionType": "Action",
"group": "Private",
"name": "AddForecastHistoryPosition",
"private": true,
"sentence": "Add the time:_PARAM2_ and position: _PARAM3_; _PARAM4_ to the forecast history of _PARAM0_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BuiltinCommonInstructions::Or"
},
"parameters": [],
"subInstructions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"ForecastHistoryDuration",
">",
"0"
]
},
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"ForecastTime",
">",
"0"
]
}
]
}
],
"actions": [
{
"type": {
"value": "ObjectVariablePushNumber"
},
"parameters": [
"Object",
"__SmoothCamera.ForecastHistoryTime",
"Time"
]
},
{
"type": {
"value": "ObjectVariablePushNumber"
},
"parameters": [
"Object",
"__SmoothCamera.ForecastHistoryX",
"ObjectX"
]
},
{
"type": {
"value": "ObjectVariablePushNumber"
},
"parameters": [
"Object",
"__SmoothCamera.ForecastHistoryY",
"ObjectY"
]
}
],
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Remove history entries that are too old to be useful.\nKeep at least 2 positions because no forecast can be done with less positions."
},
{
"infiniteLoopWarning": true,
"type": "BuiltinCommonInstructions::While",
"whileConditions": [
{
"type": {
"value": "BuiltinCommonInstructions::CompareNumbers"
},
"parameters": [
"Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)",
">=",
"3"
]
},
{
"type": {
"value": "VarObjet"
},
"parameters": [
"Object",
"__SmoothCamera.ForecastHistoryTime[0]",
"<",
"TimeFromStart() - CameraDelay - CameraExtraDelay - ForecastHistoryDuration"
]
}
],
"conditions": [],
"actions": [
{
"type": {
"value": "ObjectVariableRemoveAt"
},
"parameters": [
"Object",
"__SmoothCamera.ForecastHistoryTime",
"0"
]
},
{
"type": {
"value": "ObjectVariableRemoveAt"
},
"parameters": [
"Object",
"__SmoothCamera.ForecastHistoryX",
"0"
]
},
{
"type": {
"value": "ObjectVariableRemoveAt"
},
"parameters": [
"Object",
"__SmoothCamera.ForecastHistoryY",
"0"
]
}
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "Time",
"name": "Time",
"type": "expression"
},
{
"description": "Object X",
"name": "ObjectX",
"type": "expression"
},
{
"description": "Object Y",
"name": "ObjectY",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Update forecasted position. This is called in doStepPreEvents.",
"fullName": "Update forecasted position",
"functionType": "Action",
"group": "Private",
"name": "UpdateForecastedPosition",
"private": true,
"sentence": "Update forecasted position of _PARAM0_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastedX",
"=",
"DelayedCenterX"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastedY",
"=",
"DelayedCenterY"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Simple linear regression\ny = A * x + B\n\nA = Covariance / VarianceX\nB = MeanY - A * MeanX\n\nNote than we could use only one position every N positions to reduce the process time,\nbut if we really need efficient process JavaScript and circular queues are a must."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BuiltinCommonInstructions::CompareNumbers"
},
"parameters": [
"Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)",
">=",
"2"
]
},
{
"type": {
"value": "BuiltinCommonInstructions::Or"
},
"parameters": [],
"subInstructions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"ForecastHistoryDuration",
">",
"0"
]
},
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"ForecastTime",
">",
"0"
]
}
]
}
],
"actions": [],
"events": [
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Mean X",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastHistoryMeanX",
"=",
"0"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"Index",
"=",
"0"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Repeat",
"repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastHistoryMeanX",
"+",
"Object.Variable(__SmoothCamera.ForecastHistoryX[Index])"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"Index",
"+",
"1"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastHistoryMeanX",
"/",
"Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)"
]
}
]
}
],
"parameters": []
},
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Mean Y",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastHistoryMeanY",
"=",
"0"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"Index",
"=",
"0"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Repeat",
"repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryY)",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastHistoryMeanY",
"+",
"Object.Variable(__SmoothCamera.ForecastHistoryY[Index])"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"Index",
"+",
"1"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastHistoryMeanY",
"/",
"Object.VariableChildCount(__SmoothCamera.ForecastHistoryY)"
]
}
]
},
{
"disabled": true,
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "DebuggerTools::ConsoleLog"
},
"parameters": [
"\"Mean: \" + ToString(ForecastHistoryMeanX) + \" \" + ToString(ForecastHistoryMeanY)",
"",
""
]
}
]
}
],
"parameters": []
},
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Variance and Covariance",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "VarianceX = sum((X[i] - MeanX)²)\nVarianceY = sum((Y[i] - MeanY)²)\nCovariance = sum((X[i] - MeanX) * (Y[i] - MeanY))"
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastHistoryVarianceX",
"=",
"0"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastHistoryVarianceY",
"=",
"0"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastHistoryCovariance",
"=",
"0"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"Index",
"=",
"0"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Repeat",
"repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastHistoryVarianceX",
"+",
"pow(Object.Variable(__SmoothCamera.ForecastHistoryX[Index]) - ForecastHistoryMeanX, 2)"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastHistoryVarianceY",
"+",
"pow(Object.Variable(__SmoothCamera.ForecastHistoryY[Index]) - ForecastHistoryMeanY, 2)"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastHistoryCovariance",
"+",
"(Object.Variable(__SmoothCamera.ForecastHistoryX[Index]) - ForecastHistoryMeanX)\n*\n(Object.Variable(__SmoothCamera.ForecastHistoryY[Index]) - ForecastHistoryMeanY)"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"Index",
"+",
"1"
]
}
]
},
{
"disabled": true,
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "DebuggerTools::ConsoleLog"
},
"parameters": [
"\"Variances: \" + ToString(ForecastHistoryVarianceX) + \" \" + ToString(ForecastHistoryVarianceY) + \" \" + ToString(ForecastHistoryCovariance)",
"\"info\"",
"\"SmoothCamera\""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BuiltinCommonInstructions::CompareNumbers"
},
"parameters": [
"abs(ForecastHistoryVarianceX)",
"<",
"1"
]
},
{
"type": {
"value": "BuiltinCommonInstructions::CompareNumbers"
},
"parameters": [
"abs(ForecastHistoryVarianceY)",
"<",
"1"
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastedX",
"=",
"DelayedCenterX"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastedY",
"=",
"DelayedCenterY"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BuiltinCommonInstructions::Or"
},
"parameters": [],
"subInstructions": [
{
"type": {
"value": "BuiltinCommonInstructions::CompareNumbers"
},
"parameters": [
"abs(ForecastHistoryVarianceX)",
">=",
"1"
]
},
{
"type": {
"value": "BuiltinCommonInstructions::CompareNumbers"
},
"parameters": [
"abs(ForecastHistoryVarianceY)",
">=",
"1"
]
}
]
}
],
"actions": [],
"events": [
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Linear function parameters",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "y = A * x + B\n\nA = Covariance / VarianceX\nB = MeanY - A * MeanX"
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BuiltinCommonInstructions::CompareNumbers"
},
"parameters": [
"abs(ForecastHistoryVarianceX)",
">=",
"abs(ForecastHistoryVarianceY)"
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastHistoryLinearA",
"=",
"ForecastHistoryCovariance / ForecastHistoryVarianceX"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastHistoryLinearB",
"=",
"ForecastHistoryMeanY - ForecastHistoryLinearA * ForecastHistoryMeanX"
]
}
],
"events": [
{
"disabled": true,
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "DebuggerTools::ConsoleLog"
},
"parameters": [
"\"Linear: \" + ToString(ForecastHistoryLinearA) + \" \" + ToString(ForecastHistoryLinearB)",
"\"info\"",
"\"SmoothCamera\""
]
}
]
},
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Projection",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SmoothCamera::SmoothCamera::ProjectHistoryEnds"
},
"parameters": [
"Object",
"Behavior",
"Object.Variable(__SmoothCamera.ForecastHistoryX[0])",
"Object.Variable(__SmoothCamera.ForecastHistoryY[0])",
"Object.Variable(__SmoothCamera.ForecastHistoryX[Object.VariableChildCount(__SmoothCamera.ForecastHistoryX) - 1])",
"Object.Variable(__SmoothCamera.ForecastHistoryY[Object.VariableChildCount(__SmoothCamera.ForecastHistoryY) - 1])",
""
]
}
]
}
],
"parameters": []
}
]
},
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Axis permutation to avoid a ratio between 2 numbers near 0."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BuiltinCommonInstructions::CompareNumbers"
},
"parameters": [
"abs(ForecastHistoryVarianceX)",
"<",
"abs(ForecastHistoryVarianceY)"
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastHistoryLinearA",
"=",
"ForecastHistoryCovariance / ForecastHistoryVarianceY"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastHistoryLinearB",
"=",
"ForecastHistoryMeanX - ForecastHistoryLinearA * ForecastHistoryMeanY"
]
}
],
"events": [
{
"disabled": true,
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "DebuggerTools::ConsoleLog"
},
"parameters": [
"\"Linear: \" + ToString(ForecastHistoryLinearA) + \" \" + ToString(ForecastHistoryLinearB)",
"\"info\"",
"\"SmoothCamera\""
]
}
]
},
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Projection",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SmoothCamera::SmoothCamera::ProjectHistoryEnds"
},
"parameters": [
"Object",
"Behavior",
"Object.Variable(__SmoothCamera.ForecastHistoryY[0])",
"Object.Variable(__SmoothCamera.ForecastHistoryX[0])",
"Object.Variable(__SmoothCamera.ForecastHistoryY[Object.VariableChildCount(__SmoothCamera.ForecastHistoryY) - 1])",
"Object.Variable(__SmoothCamera.ForecastHistoryX[Object.VariableChildCount(__SmoothCamera.ForecastHistoryX) - 1])",
""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Permute back axis"
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"Index",
"=",
"ProjectedOldestX"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ProjectedOldestX",
"=",
"ProjectedOldestY"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ProjectedOldestY",
"=",
"Index"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"Index",
"=",
"ProjectedNewestX"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ProjectedNewestX",
"=",
"ProjectedNewestY"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ProjectedNewestY",
"=",
"Index"
]
}
]
}
],
"parameters": []
},
{
"disabled": true,
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "DebuggerTools::ConsoleLog"
},
"parameters": [
"\"Oldest: \" + ToString(ProjectedOldestX) + \" \" + ToString(ProjectedOldestY)",
"\"info\"",
"\"SmoothCamera\""
]
}
]
},
{
"disabled": true,
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "DebuggerTools::ConsoleLog"
},
"parameters": [
"\"Newest: \" + ToString(ProjectedNewestX) + \" \" + ToString(ProjectedNewestY)",
"\"info\"",
"\"SmoothCamera\""
]
}
]
}
]
},
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Forecasted position",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastedX",
"=",
"ProjectedNewestX + ( ProjectedNewestX - ProjectedOldestX) * Object.Behavior::ForecastTimeRatio()"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ForecastedY",
"=",
"ProjectedNewestY + ( ProjectedNewestY - ProjectedOldestY) * Object.Behavior::ForecastTimeRatio()"
]
}
]
},
{
"disabled": true,
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "DebuggerTools::ConsoleLog"
},
"parameters": [
"\"Forecasted: \" + ToString(ForecastedX) + \" \" + ToString(ForecastedY)",
"\"info\"",
"\"SmoothCamera\""
]
}
]
}
],
"parameters": []
}
],
"parameters": []
}
]
}
],
"parameters": []
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Project history ends position to have the vector on the line from linear regression. This function is only called by UpdateForecastedPosition.",
"fullName": "Project history ends",
"functionType": "Action",
"group": "Private",
"name": "ProjectHistoryEnds",
"private": true,
"sentence": "Project history oldest: _PARAM2_;_PARAM3_ and newest position: _PARAM4_;_PARAM5_ of _PARAM0_",
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Perpendicular line:\npA = -1/a; \npB = -pA * x + y\n\nIntersection:\n/ ProjectedY = a * ProjectedX + b\n\\ ProjectedY = pA * ProjectedX + b\n\nSolution that is cleaned out from indeterminism (like 0 / 0 or infinity / infinity):\nProjectedX= (x + (y - b) * a) / (a² + 1)\nProjectedY = y + (x * a - y + b) / (a² + 1)"
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ProjectedNewestX",
"=",
"(NewestX + (NewestY - ForecastHistoryLinearB) * ForecastHistoryLinearA) / (1 + pow(ForecastHistoryLinearA, 2))"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ProjectedNewestY",
"=",
"NewestY + (NewestX * ForecastHistoryLinearA - NewestY \n+ ForecastHistoryLinearB) / (1 + pow(ForecastHistoryLinearA, 2))"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ProjectedOldestX",
"=",
"(OldestX + (OldestY - ForecastHistoryLinearB) * ForecastHistoryLinearA) / (1 + pow(ForecastHistoryLinearA, 2))"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"ProjectedOldestY",
"=",
"OldestY + (OldestX * ForecastHistoryLinearA - OldestY \n+ ForecastHistoryLinearB) / (1 + pow(ForecastHistoryLinearA, 2))"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
},
{
"description": "OldestX",
"name": "OldestX",
"type": "expression"
},
{
"description": "OldestY",
"name": "OldestY",
"type": "expression"
},
{
"description": "Newest X",
"name": "NewestX",
"type": "expression"
},
{
"description": "Newest Y",
"name": "NewestY",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Return the ratio between forecast time and the duration of the history. This function is only called by UpdateForecastedPosition.",
"fullName": "Forecast time ratio",
"functionType": "Expression",
"group": "Private",
"name": "ForecastTimeRatio",
"private": true,
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnNumber"
},
"parameters": [
"- ForecastTime / (Object.Variable(__SmoothCamera.ForecastHistoryTime[0]) - Object.Variable(__SmoothCamera.ForecastHistoryTime[Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime) - 1]))"
]
}
]
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothCamera",
"type": "behavior"
}
],
"objectGroups": []
}
],
"eventsFunctionsFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"functionName": "onCreated"
},
{
"functionName": "doStepPreEvents"
},
{
"functionName": "MoveCameraCloser"
},
{
"functionName": "DoMoveCameraCloser"
},
{
"functionName": "WaitAndCatchUp"
},
{
"functionName": "DrawDebug"
},
{
"folderName": "Camera configuration",
"children": [
{
"functionName": "SetFollowOnX"
},
{
"functionName": "SetFollowOnY"
},
{
"functionName": "SetFollowFreeAreaRight"
},
{
"functionName": "SetFollowFreeAreaLeft"
},
{
"functionName": "SetFollowFreeAreaTop"
},
{
"functionName": "SetFollowFreeAreaBottom"
},
{
"functionName": "SetLeftwardSpeedMax"
},
{
"functionName": "SetRightwardSpeedMax"
},
{
"functionName": "SetUpwardSpeedMax"
},
{
"functionName": "SetDownwardSpeedMax"
},
{
"functionName": "SetLeftwardSpeed"
},
{
"functionName": "SetRightwardSpeed"
},
{
"functionName": "SetDownwardSpeed"
},
{
"functionName": "SetUpwardSpeed"
},
{
"functionName": "OffsetX"
},
{
"functionName": "SetOffsetXOp"
},
{
"functionName": "SetOffsetX"
},
{
"functionName": "OffsetY"
},
{
"functionName": "SetOffsetYOp"
},
{
"functionName": "SetOffsetY"
},
{
"functionName": "SetForecastTime"
},
{
"functionName": "SetCameraDelay"
}
]
},
{
"folderName": "Private",
"children": [
{
"functionName": "FreeAreaLeft"
},
{
"functionName": "FreeAreaRight"
},
{
"functionName": "FreeAreaBottom"
},
{
"functionName": "FreeAreaTop"
},
{
"functionName": "UpdateDelayedPosition"
},
{
"functionName": "AddForecastHistoryPosition"
},
{
"functionName": "UpdateForecastedPosition"
},
{
"functionName": "ProjectHistoryEnds"
},
{
"functionName": "ForecastTimeRatio"
}
]
},
{
"functionName": "IsDelayed"
},
{
"functionName": "CurrentDelay"
},
{
"functionName": "IsWaiting"
}
]
},
"propertyDescriptors": [
{
"value": "0.9",
"type": "Number",
"label": "Leftward catch-up speed (in ratio per second)",
"group": "Catch-up speed",
"name": "LeftwardSpeed"
},
{
"value": "0.9",
"type": "Number",
"label": "Rightward catch-up speed (in ratio per second)",
"group": "Catch-up speed",
"name": "RightwardSpeed"
},
{
"value": "0.9",
"type": "Number",
"label": "Upward catch-up speed (in ratio per second)",
"group": "Catch-up speed",
"name": "UpwardSpeed"
},
{
"value": "0.9",
"type": "Number",
"label": "Downward catch-up speed (in ratio per second)",
"group": "Catch-up speed",
"name": "DownwardSpeed"
},
{
"value": "true",
"type": "Boolean",
"label": "Follow on X axis",
"name": "FollowOnX"
},
{
"value": "true",
"type": "Boolean",
"label": "Follow on Y axis",
"name": "FollowOnY"
},
{
"value": "0",
"type": "Number",
"unit": "Pixel",
"label": "Follow free area left border",
"group": "Position",
"advanced": true,
"name": "FollowFreeAreaLeft"
},
{
"value": "0",
"type": "Number",
"unit": "Pixel",
"label": "Follow free area right border",
"group": "Position",
"advanced": true,
"name": "FollowFreeAreaRight"
},
{
"value": "0",
"type": "Number",
"unit": "Pixel",
"label": "Follow free area top border",
"group": "Position",
"advanced": true,
"name": "FollowFreeAreaTop"
},
{
"value": "0",
"type": "Number",
"unit": "Pixel",
"label": "Follow free area bottom border",
"group": "Position",
"advanced": true,
"name": "FollowFreeAreaBottom"
},
{
"value": "0",
"type": "Number",
"unit": "Pixel",
"label": "Camera offset X",
"group": "Position",
"advanced": true,
"name": "CameraOffsetX"
},
{
"value": "0",
"type": "Number",
"unit": "Pixel",
"label": "Camera offset Y",
"group": "Position",
"advanced": true,
"name": "CameraOffsetY"
},
{
"value": "0",
"type": "Number",
"unit": "Second",
"label": "Camera delay",
"group": "Timing",
"deprecated": true,
"name": "CameraDelay"
},
{
"value": "0",
"type": "Number",
"unit": "Second",
"label": "Forecast time",
"group": "Timing",
"deprecated": true,
"name": "ForecastTime"
},
{
"value": "0",
"type": "Number",
"unit": "Second",
"label": "Forecast history duration",
"group": "Timing",
"deprecated": true,
"name": "ForecastHistoryDuration"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "LogLeftwardSpeed"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "LogRightwardSpeed"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "LogDownwardSpeed"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "LogUpwardSpeed"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "DelayedCenterX"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "DelayedCenterY"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "ForecastHistoryMeanX"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "ForecastHistoryMeanY"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "ForecastHistoryVarianceX"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "ForecastHistoryCovariance"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "ForecastHistoryLinearA"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "ForecastHistoryLinearB"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "ForecastedX"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "ForecastedY"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "ProjectedNewestX"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "ProjectedNewestY"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "ProjectedOldestX"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "ProjectedOldestY"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "ForecastHistoryVarianceY"
},
{
"value": "",
"type": "Number",
"label": "Index (local variable)",
"hidden": true,
"name": "Index"
},
{
"value": "0",
"type": "Number",
"label": "",
"hidden": true,
"name": "CameraDelayCatchUpSpeed"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "CameraExtraDelay"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "WaitingSpeedXMax"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "WaitingSpeedYMax"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "WaitingEnd"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "CameraDelayCatchUpDuration"
},
{
"value": "9000",
"type": "Number",
"unit": "PixelSpeed",
"label": "Leftward maximum speed",
"group": "Maximum speed",
"advanced": true,
"name": "LeftwardSpeedMax"
},
{
"value": "9000",
"type": "Number",
"unit": "PixelSpeed",
"label": "Rightward maximum speed",
"group": "Maximum speed",
"advanced": true,
"name": "RightwardSpeedMax"
},
{
"value": "9000",
"type": "Number",
"unit": "PixelSpeed",
"label": "Upward maximum speed",
"group": "Maximum speed",
"advanced": true,
"name": "UpwardSpeedMax"
},
{
"value": "9000",
"type": "Number",
"unit": "PixelSpeed",
"label": "Downward maximum speed",
"group": "Maximum speed",
"advanced": true,
"name": "DownwardSpeedMax"
},
{
"value": "",
"type": "Number",
"label": "OldX (local variable)",
"hidden": true,
"name": "OldX"
},
{
"value": "",
"type": "Number",
"label": "OldY (local variable)",
"hidden": true,
"name": "OldY"
},
{
"value": "",
"type": "Boolean",
"label": "",
"hidden": true,
"name": "IsCalledManually"
}
],
"propertiesFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"folderName": "Catch-up speed",
"children": [
{
"propertyName": "LeftwardSpeed"
},
{
"propertyName": "RightwardSpeed"
},
{
"propertyName": "UpwardSpeed"
},
{
"propertyName": "DownwardSpeed"
}
]
},
{
"propertyName": "FollowOnX"
},
{
"propertyName": "FollowOnY"
},
{
"folderName": "Position",
"children": [
{
"propertyName": "FollowFreeAreaLeft"
},
{
"propertyName": "FollowFreeAreaRight"
},
{
"propertyName": "FollowFreeAreaTop"
},
{
"propertyName": "FollowFreeAreaBottom"
},
{
"propertyName": "CameraOffsetX"
},
{
"propertyName": "CameraOffsetY"
}
]
},
{
"folderName": "Timing",
"children": [
{
"propertyName": "CameraDelay"
},
{
"propertyName": "ForecastTime"
},
{
"propertyName": "ForecastHistoryDuration"
}
]
},
{
"propertyName": "LogLeftwardSpeed"
},
{
"propertyName": "LogRightwardSpeed"
},
{
"propertyName": "LogDownwardSpeed"
},
{
"propertyName": "LogUpwardSpeed"
},
{
"propertyName": "DelayedCenterX"
},
{
"propertyName": "DelayedCenterY"
},
{
"propertyName": "ForecastHistoryMeanX"
},
{
"propertyName": "ForecastHistoryMeanY"
},
{
"propertyName": "ForecastHistoryVarianceX"
},
{
"propertyName": "ForecastHistoryCovariance"
},
{
"propertyName": "ForecastHistoryLinearA"
},
{
"propertyName": "ForecastHistoryLinearB"
},
{
"propertyName": "ForecastedX"
},
{
"propertyName": "ForecastedY"
},
{
"propertyName": "ProjectedNewestX"
},
{
"propertyName": "ProjectedNewestY"
},
{
"propertyName": "ProjectedOldestX"
},
{
"propertyName": "ProjectedOldestY"
},
{
"propertyName": "ForecastHistoryVarianceY"
},
{
"propertyName": "Index"
},
{
"propertyName": "CameraDelayCatchUpSpeed"
},
{
"propertyName": "CameraExtraDelay"
},
{
"propertyName": "WaitingSpeedXMax"
},
{
"propertyName": "WaitingSpeedYMax"
},
{
"propertyName": "WaitingEnd"
},
{
"propertyName": "CameraDelayCatchUpDuration"
},
{
"folderName": "Maximum speed",
"children": [
{
"propertyName": "LeftwardSpeedMax"
},
{
"propertyName": "RightwardSpeedMax"
},
{
"propertyName": "UpwardSpeedMax"
},
{
"propertyName": "DownwardSpeedMax"
}
]
},
{
"propertyName": "OldX"
},
{
"propertyName": "OldY"
},
{
"propertyName": "IsCalledManually"
}
]
}
},
{
"description": "Smoothly scroll to follow a character and stabilize the camera when jumping.",
"fullName": "Smooth platformer camera",
"helpPath": "",
"iconUrl": "",
"name": "SmoothPlatformerCamera",
"objectType": "",
"previewIconUrl": "",
"quickCustomizationVisibility": "hidden",
"eventsFunctions": [
{
"fullName": "",
"functionType": "Action",
"name": "doStepPreEvents",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"inverted": true,
"value": "PlatformBehavior::IsJumping"
},
"parameters": [
"Object",
"PlatformerCharacter"
]
},
{
"type": {
"inverted": true,
"value": "PlatformBehavior::IsFalling"
},
"parameters": [
"Object",
"PlatformerCharacter"
]
}
],
"actions": [
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom"
},
"parameters": [
"Object",
"SmoothCamera",
"FloorFollowFreeAreaTop",
""
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaTop"
},
"parameters": [
"Object",
"SmoothCamera",
"FloorFollowFreeAreaBottom",
""
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetUpwardSpeed"
},
"parameters": [
"Object",
"SmoothCamera",
"FloorUpwardSpeed",
""
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetDownwardSpeed"
},
"parameters": [
"Object",
"SmoothCamera",
"FloorDownwardSpeed",
""
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetUpwardSpeedMax"
},
"parameters": [
"Object",
"SmoothCamera",
"FloorUpwardSpeedMax",
""
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetDownwardSpeedMax"
},
"parameters": [
"Object",
"SmoothCamera",
"FloorDownwardSpeedMax",
""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BuiltinCommonInstructions::Or"
},
"parameters": [],
"subInstructions": [
{
"type": {
"value": "PlatformBehavior::IsJumping"
},
"parameters": [
"Object",
"PlatformerCharacter"
]
},
{
"type": {
"value": "PlatformBehavior::IsFalling"
},
"parameters": [
"Object",
"PlatformerCharacter"
]
}
]
}
],
"actions": [
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom"
},
"parameters": [
"Object",
"SmoothCamera",
"AirFollowFreeAreaTop",
""
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaTop"
},
"parameters": [
"Object",
"SmoothCamera",
"AirFollowFreeAreaBottom",
""
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetUpwardSpeed"
},
"parameters": [
"Object",
"SmoothCamera",
"AirUpwardSpeed",
""
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetDownwardSpeed"
},
"parameters": [
"Object",
"SmoothCamera",
"AirDownwardSpeed",
""
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetUpwardSpeedMax"
},
"parameters": [
"Object",
"SmoothCamera",
"AirUpwardSpeedMax",
""
]
},
{
"type": {
"value": "SmoothCamera::SmoothCamera::SetDownwardSpeedMax"
},
"parameters": [
"Object",
"SmoothCamera",
"AirDownwardSpeedMax",
""
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "SmoothCamera::SmoothPlatformerCamera",
"type": "behavior"
}
],
"objectGroups": []
}
],
"eventsFunctionsFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"functionName": "doStepPreEvents"
}
]
},
"propertyDescriptors": [
{
"value": "",
"type": "Behavior",
"label": "Platformer character behavior",
"extraInformation": [
"PlatformBehavior::PlatformerObjectBehavior"
],
"choices": [],
"name": "PlatformerCharacter"
},
{
"value": "",
"type": "Behavior",
"label": "Smooth camera behavior",
"extraInformation": [
"SmoothCamera::SmoothCamera"
],
"choices": [],
"name": "SmoothCamera"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "JumpOriginY"
},
{
"value": "0",
"type": "Number",
"unit": "Pixel",
"label": "Follow free area top in the air",
"group": "Position",
"name": "AirFollowFreeAreaTop"
},
{
"value": "0",
"type": "Number",
"unit": "Pixel",
"label": "Follow free area bottom in the air",
"group": "Position",
"name": "AirFollowFreeAreaBottom"
},
{
"value": "0",
"type": "Number",
"unit": "Pixel",
"label": "Follow free area top on the floor",
"group": "Position",
"name": "FloorFollowFreeAreaTop"
},
{
"value": "0",
"type": "Number",
"unit": "Pixel",
"label": "Follow free area bottom on the floor",
"group": "Position",
"name": "FloorFollowFreeAreaBottom"
},
{
"value": "0.95",
"type": "Number",
"label": "Upward speed in the air (in ratio per second)",
"group": "Catch-up speed",
"name": "AirUpwardSpeed"
},
{
"value": "0.95",
"type": "Number",
"label": "Downward speed in the air (in ratio per second)",
"group": "Catch-up speed",
"name": "AirDownwardSpeed"
},
{
"value": "0.9",
"type": "Number",
"label": "Upward speed on the floor (in ratio per second)",
"group": "Catch-up speed",
"name": "FloorUpwardSpeed"
},
{
"value": "0.9",
"type": "Number",
"label": "Downward speed on the floor (in ratio per second)",
"group": "Catch-up speed",
"name": "FloorDownwardSpeed"
},
{
"value": "9000",
"type": "Number",
"unit": "PixelSpeed",
"label": "Upward maximum speed in the air",
"group": "Maximum speed",
"name": "AirUpwardSpeedMax"
},
{
"value": "9000",
"type": "Number",
"unit": "PixelSpeed",
"label": "Downward maximum speed in the air",
"group": "Maximum speed",
"name": "AirDownwardSpeedMax"
},
{
"value": "9000",
"type": "Number",
"unit": "PixelSpeed",
"label": "Upward maximum speed on the floor",
"group": "Maximum speed",
"name": "FloorUpwardSpeedMax"
},
{
"value": "9000",
"type": "Number",
"unit": "PixelSpeed",
"label": "Downward maximum speed on the floor",
"group": "Maximum speed",
"name": "FloorDownwardSpeedMax"
}
],
"propertiesFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"propertyName": "PlatformerCharacter"
},
{
"propertyName": "SmoothCamera"
},
{
"propertyName": "JumpOriginY"
},
{
"folderName": "Position",
"children": [
{
"propertyName": "AirFollowFreeAreaTop"
},
{
"propertyName": "AirFollowFreeAreaBottom"
},
{
"propertyName": "FloorFollowFreeAreaTop"
},
{
"propertyName": "FloorFollowFreeAreaBottom"
}
]
},
{
"folderName": "Catch-up speed",
"children": [
{
"propertyName": "AirUpwardSpeed"
},
{
"propertyName": "AirDownwardSpeed"
},
{
"propertyName": "FloorUpwardSpeed"
},
{
"propertyName": "FloorDownwardSpeed"
}
]
},
{
"folderName": "Maximum speed",
"children": [
{
"propertyName": "AirUpwardSpeedMax"
},
{
"propertyName": "AirDownwardSpeedMax"
},
{
"propertyName": "FloorUpwardSpeedMax"
},
{
"propertyName": "FloorDownwardSpeedMax"
}
]
}
]
}
}
],
"eventsBasedObjects": []
},
{
"author": "Westboy31",
"category": "Visual effect",
"dimension": "2D",
"extensionNamespace": "",
"fullName": "Flash and transition painter",
"gdevelopVersion": ">=5.5.222",
"helpPath": "",
"iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLW1vdmllLWZpbHRlciIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xOCA0TDIwIDdIMTdMMTUgNEgxM0wxNSA3SDEyTDEwIDRIOEwxMCA3SDdMNSA0SDRDMi45IDQgMiA0LjkgMiA2TDIgMThDMiAxOS4xIDIuOSAyMCA0IDIwSDIwQzIxLjEgMjAgMjIgMTkuMSAyMiAxOFY0SDE4TTExLjI1IDE1LjI1TDEwIDE4TDguNzUgMTUuMjVMNiAxNEw4Ljc1IDEyLjc1TDEwIDEwTDExLjI1IDEyLjc1TDE0IDE0TDExLjI1IDE1LjI1TTE2Ljk0IDExLjk0TDE2IDE0TDE1LjA2IDExLjk0TDEzIDExTDE1LjA2IDEwLjA2TDE2IDhMMTYuOTQgMTAuMDZMMTkgMTFMMTYuOTQgMTEuOTRaIiAvPjwvc3ZnPg==",
"name": "FlashTransitionPainter",
"previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/movie-filter.svg",
"shortDescription": "Screen transitions painted with plain color fill using Shape Painter.",
"version": "0.2.0",
"description": [
"Paint transition effects",
"- Fade in, fade out",
"- Right to left",
"- Top to bottom",
"- Circular",
"",
"A blur effect can be added to the painter layer to smooth the transition."
],
"origin": {
"identifier": "FlashTransitionPainter",
"name": "gdevelop-extension-store"
},
"tags": [
"flash",
"transition",
"effect"
],
"authorIds": [],
"dependencies": [],
"globalVariables": [],
"sceneVariables": [],
"eventsFunctions": [],
"eventsFunctionsFolderStructure": {
"folderName": "__ROOT"
},
"eventsBasedBehaviors": [
{
"description": "Paint all over the screen a color for a period of time.",
"fullName": "Flash and transition painter",
"helpPath": "",
"iconUrl": "",
"name": "FlashTransitionPainter",
"objectType": "PrimitiveDrawing::Drawer",
"previewIconUrl": "",
"eventsFunctions": [
{
"fullName": "",
"functionType": "Action",
"name": "onCreated",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "ActivateBehavior"
},
"parameters": [
"Object",
"Behavior",
""
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "PrimitiveDrawing::Drawer",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "FlashTransitionPainter::FlashTransitionPainter",
"type": "behavior"
}
],
"objectGroups": []
},
{
"fullName": "",
"functionType": "Action",
"name": "doStepPostEvents",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Ensure shape painter properties are set correctly for this extension to work.\n"
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BuiltinCommonInstructions::Once"
},
"parameters": []
}
],
"actions": [
{
"type": {
"value": "PrimitiveDrawing::ClearBetweenFrames"
},
"parameters": [
"Object",
"no"
]
},
{
"type": {
"value": "PrimitiveDrawing::OutlineSize"
},
"parameters": [
"Object",
"=",
"0"
]
},
{
"type": {
"value": "PrimitiveDrawing::UseRelativeCoordinates"
},
"parameters": [
"Object",
""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"Progress",
"=",
"min(1, Object.ObjectTimerElapsedTime(\"__FlashTransitionPainter_Time\") / Duration)"
]
},
{
"type": {
"value": "PrimitiveDrawing::Drawer::ClearShapes"
},
"parameters": [
"Object"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"Progress",
"=",
"1"
]
}
],
"actions": [
{
"type": {
"value": "ActivateBehavior"
},
"parameters": [
"Object",
"Behavior",
""
]
},
{
"type": {
"value": "PauseObjectTimer"
},
"parameters": [
"Object",
"\"__FlashTransitionPainter_Time\""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"Direction",
"=",
"\"Backward\""
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"Progress",
"=",
"1 - Progress"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"Direction",
"=",
"\"Both\""
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"Progress",
"=",
"min(2 * Progress, 2 * (1 - Progress))"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"Progress",
">",
"0"
]
}
],
"actions": [
{
"type": {
"value": "PrimitiveDrawing::FillOpacity"
},
"parameters": [
"Object",
"=",
"MaxOpacity"
]
}
],
"events": [
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Flash",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"Type",
"=",
"\"Flash\""
]
}
],
"actions": [
{
"type": {
"value": "PrimitiveDrawing::FillOpacity"
},
"parameters": [
"Object",
"=",
"MaxOpacity * Progress"
]
},
{
"type": {
"value": "PrimitiveDrawing::Rectangle"
},
"parameters": [
"Object",
"CameraBorderLeft(Object.Layer())",
"CameraBorderTop(Object.Layer())",
"CameraBorderRight(Object.Layer())",
"CameraBorderBottom(Object.Layer())"
]
}
]
}
],
"parameters": []
},
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Horizontal",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "from left to right"
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"Type",
"=",
"\"Horizontal\""
]
}
],
"actions": [
{
"type": {
"value": "PrimitiveDrawing::Rectangle"
},
"parameters": [
"Object",
"CameraBorderLeft(Object.Layer())",
"CameraBorderTop(Object.Layer())",
"lerp(CameraBorderLeft(Object.Layer()), CameraBorderRight(Object.Layer()), Progress)",
"CameraBorderBottom(Object.Layer())"
]
}
]
}
],
"parameters": []
},
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Vertical",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "from top to bottom"
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"Type",
"=",
"\"Vertical\""
]
}
],
"actions": [
{
"type": {
"value": "PrimitiveDrawing::Rectangle"
},
"parameters": [
"Object",
"CameraBorderLeft(Object.Layer())",
"CameraBorderTop(Object.Layer())",
"CameraBorderRight(Object.Layer())",
"lerp(CameraBorderTop(Object.Layer()), CameraBorderBottom(Object.Layer()), Progress)"
]
}
]
}
],
"parameters": []
},
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Circular",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "A circle scale up from the middle."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"Type",
"=",
"\"Circular\""
]
}
],
"actions": [
{
"type": {
"value": "PrimitiveDrawing::Circle"
},
"parameters": [
"Object",
"CameraCenterX(Object.Layer())",
"CameraCenterY(Object.Layer())",
"(DistanceBetweenPositions(0, 0, CameraWidth(Object.Layer()), CameraHeight(Object.Layer())) / 2 + 1) * Progress"
]
}
]
}
],
"parameters": []
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "PrimitiveDrawing::Drawer",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "FlashTransitionPainter::FlashTransitionPainter",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Paint Effect.",
"fullName": "Paint Effect",
"functionType": "Action",
"name": "PaintEffect",
"sentence": "Paint effect type _PARAM4_ of _PARAM0_ with direction _PARAM5_ and color _PARAM2_ for _PARAM3_ seconds",
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Initialise all variables and then activate the behavior.\nIf user doesn't assign value to color and type , we take the last value registred."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"inverted": true,
"value": "BehaviorActivated"
},
"parameters": [
"Object",
"Behavior"
]
}
],
"actions": [
{
"type": {
"value": "ActivateBehavior"
},
"parameters": [
"Object",
"Behavior",
"yes"
]
},
{
"type": {
"value": "UnPauseObjectTimer"
},
"parameters": [
"Object",
"\"__FlashTransitionPainter_Time\""
]
},
{
"type": {
"value": "ResetObjectTimer"
},
"parameters": [
"Object",
"\"__FlashTransitionPainter_Time\""
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"Duration",
"=",
"NewDuration"
]
},
{
"type": {
"value": "SetStringVariable"
},
"parameters": [
"Direction",
"=",
"NewDirection"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"Progress",
"=",
"0"
]
}
],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetStringVariable"
},
"parameters": [
"Type",
"=",
"\"Flash\""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"NewType",
"!=",
"\"\""
]
}
],
"actions": [
{
"type": {
"value": "SetStringVariable"
},
"parameters": [
"Type",
"=",
"NewType"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"Color",
"!=",
"\"\""
]
}
],
"actions": [
{
"type": {
"value": "PrimitiveDrawing::FillColor"
},
"parameters": [
"Object",
"Color"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"MaxOpacity",
"=",
"255"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"NewMaxOpacity",
"!=",
"0"
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"MaxOpacity",
"=",
"NewMaxOpacity"
]
}
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "PrimitiveDrawing::Drawer",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "FlashTransitionPainter::FlashTransitionPainter",
"type": "behavior"
},
{
"description": "Color",
"name": "Color",
"type": "color"
},
{
"description": "Duration",
"name": "NewDuration",
"type": "expression"
},
{
"description": "Type of effect ",
"name": "NewType",
"supplementaryInformation": "[\"Flash\",\"Horizontal\",\"Vertical\",\"Circular\"]",
"type": "stringWithSelector"
},
{
"description": "Direction transition",
"name": "NewDirection",
"supplementaryInformation": "[\"Both\",\"Forward\",\"Backward\"]",
"type": "stringWithSelector"
},
{
"description": "End opacity",
"name": "NewMaxOpacity",
"type": "expression"
}
],
"objectGroups": []
},
{
"description": "Paint effect ended.",
"fullName": "Paint effect ended ",
"functionType": "Condition",
"name": "PaintEffectIsEnd",
"sentence": "When paint effect of _PARAM0_ ends",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "ObjectTimerPaused"
},
"parameters": [
"Object",
"\"__FlashTransitionPainter_Time\""
]
}
],
"actions": [
{
"type": {
"value": "SetReturnBoolean"
},
"parameters": [
"True"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "PrimitiveDrawing::Drawer",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "FlashTransitionPainter::FlashTransitionPainter",
"type": "behavior"
}
],
"objectGroups": []
}
],
"eventsFunctionsFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"functionName": "onCreated"
},
{
"functionName": "doStepPostEvents"
},
{
"functionName": "PaintEffect"
},
{
"functionName": "PaintEffectIsEnd"
}
]
},
"propertyDescriptors": [
{
"value": "0",
"type": "Number",
"unit": "Dimensionless",
"label": "",
"hidden": true,
"name": "Progress"
},
{
"value": "0",
"type": "Number",
"label": "",
"hidden": true,
"name": "Duration"
},
{
"value": "",
"type": "String",
"label": "Type of effect ",
"hidden": true,
"name": "Type"
},
{
"value": "",
"type": "String",
"label": "Direction of transition",
"hidden": true,
"name": "Direction"
},
{
"value": "255",
"type": "Number",
"label": "The maximum of the opacity only for flash",
"hidden": true,
"name": "MaxOpacity"
}
],
"propertiesFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"propertyName": "Progress"
},
{
"propertyName": "Duration"
},
{
"propertyName": "Type"
},
{
"propertyName": "Direction"
},
{
"propertyName": "MaxOpacity"
}
]
}
}
],
"eventsBasedObjects": []
},
{
"author": "",
"category": "User interface",
"dimension": "2D",
"extensionNamespace": "",
"fullName": "Labeled button",
"gdevelopVersion": ">=5.5.230",
"helpPath": "/objects/button",
"iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPHBhdGggY2xhc3M9InN0MCIgZD0iTTI5LDIzSDNjLTEuMSwwLTItMC45LTItMlYxMWMwLTEuMSwwLjktMiwyLTJoMjZjMS4xLDAsMiwwLjksMiwydjEwQzMxLDIyLjEsMzAuMSwyMywyOSwyM3oiLz4NCjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMywxOUwxMywxOWMtMS4xLDAtMi0wLjktMi0ydi0yYzAtMS4xLDAuOS0yLDItMmgwYzEuMSwwLDIsMC45LDIsMnYyQzE1LDE4LjEsMTQuMSwxOSwxMywxOXoiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIxOCIgeTE9IjEzIiB4Mj0iMTgiIHkyPSIxOSIvPg0KPGxpbmUgY2xhc3M9InN0MCIgeDE9IjIxIiB5MT0iMTMiIHgyPSIxOCIgeTI9IjE3Ii8+DQo8bGluZSBjbGFzcz0ic3QwIiB4MT0iMjEiIHkxPSIxOSIgeDI9IjE5IiB5Mj0iMTYiLz4NCjwvc3ZnPg0K",
"name": "PanelSpriteButton",
"previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Interface Elements/Interface Elements_interface_ui_button_ok_cta_clock_tap.svg",
"shortDescription": "Resizeable button with a label.",
"version": "2.2.1",
"description": [
"A button that can be used for menus and most labelled buttons of a game. The button can be customized with a background for each state and a label. It handles user interactions and a simple condition can be used to check if it is clicked.",
"",
"There are ready-to-use buttons in the asset-store [menu buttons pack](https://editor.gdevelop.io/?initial-dialog=asset-store&asset-pack=menu-buttons-menu-buttons)."
],
"origin": {
"identifier": "PanelSpriteButton",
"name": "gdevelop-extension-store"
},
"tags": [
"button",
"ui"
],
"authorIds": [
"IWykYNRvhCZBN3vEgKEbBPOR3Oc2"
],
"changelog": [
{
"version": "2.0.0",
"breaking": "- Buttons now use \"variants\", allowing easy swapping of their visual aspect. You will have to make some adjustments to existing buttons in your project. Follow this [migration documentation](https://wiki.gdevelop.io/gdevelop5/objects/custom-objects-prefab-template/migrate-to-variants/) to do these changes."
}
],
"dependencies": [],
"globalVariables": [],
"sceneVariables": [],
"eventsFunctions": [
{
"description": "Check if the events are running for the editor.",
"fullName": "Editor is running",
"functionType": "Condition",
"name": "IsInGameEdition",
"private": true,
"sentence": "Events are running for the editor",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"const game = runtimeScene.getGame();\r",
"eventsFunctionContext.returnValue = game.isInGameEdition && game.isInGameEdition();"
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": false
}
],
"parameters": [],
"objectGroups": []
}
],
"eventsFunctionsFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"functionName": "IsInGameEdition"
}
]
},
"eventsBasedBehaviors": [
{
"description": "The finite state machine used internally by the button object.",
"fullName": "Button finite state machine",
"helpPath": "",
"iconUrl": "",
"name": "ButtonFSM",
"objectType": "",
"previewIconUrl": "",
"private": true,
"eventsFunctions": [
{
"fullName": "",
"functionType": "Action",
"name": "doStepPostEvents",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"inverted": true,
"value": "PanelSpriteButton::IsInGameEdition"
},
"parameters": [
"",
""
]
}
],
"actions": [],
"events": [
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Finite state machine",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "The \"Validated\" state only last one frame."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"State",
"=",
"\"Validated\""
]
}
],
"actions": [
{
"type": {
"value": "SetStringVariable"
},
"parameters": [
"State",
"=",
"\"Idle\""
]
}
]
},
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Check position",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Make sure the cursor position is only checked once per frame."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetBooleanVariable"
},
"parameters": [
"MouseIsInside",
"False",
""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"ShouldCheckHovering",
"True",
""
]
},
{
"type": {
"value": "CollisionPoint"
},
"parameters": [
"Object",
"MouseOnlyCursorX(Object.Layer(), 0)",
"MouseOnlyCursorY(Object.Layer(), 0)"
]
}
],
"actions": [
{
"type": {
"value": "SetBooleanVariable"
},
"parameters": [
"MouseIsInside",
"True",
""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Touches are always pressed, so ShouldCheckHovering doesn't matter."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetBooleanVariable"
},
"parameters": [
"TouchIsInside",
"False",
""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"TouchId",
"!=",
"0"
]
},
{
"type": {
"value": "CollisionPoint"
},
"parameters": [
"Object",
"TouchX(TouchId, Object.Layer(), 0)",
"TouchY(TouchId, Object.Layer(), 0)"
]
}
],
"actions": [
{
"type": {
"value": "SetBooleanVariable"
},
"parameters": [
"TouchIsInside",
"True",
""
]
}
]
}
],
"parameters": []
},
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Handle touch start",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "HasAnyTouchOrMouseStarted"
},
"parameters": [
""
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"Index",
"=",
"0"
]
}
],
"events": [
{
"type": "BuiltinCommonInstructions::Repeat",
"repeatExpression": "StartedTouchOrMouseCount()",
"conditions": [],
"actions": [],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "CollisionPoint"
},
"parameters": [
"Object",
"TouchX(StartedTouchOrMouseId(Index), Object.Layer(), 0)",
"TouchY(StartedTouchOrMouseId(Index), Object.Layer(), 0)"
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"TouchId",
"=",
"StartedTouchOrMouseId(Index)"
]
},
{
"type": {
"value": "SetBooleanVariable"
},
"parameters": [
"TouchIsInside",
"True",
""
]
}
],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BuiltinCommonInstructions::Or"
},
"parameters": [],
"subInstructions": [
{
"type": {
"value": "PanelSpriteButton::ButtonFSM::PropertyState"
},
"parameters": [
"Object",
"Behavior",
"=",
"\"Hovered\""
]
},
{
"type": {
"value": "PanelSpriteButton::ButtonFSM::PropertyState"
},
"parameters": [
"Object",
"Behavior",
"=",
"\"Idle\""
]
}
]
}
],
"actions": [
{
"type": {
"value": "SetStringVariable"
},
"parameters": [
"State",
"=",
"\"PressedInside\""
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"Index",
"+",
"1"
]
}
]
}
]
}
]
}
],
"parameters": []
},
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Apply position changes",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"inverted": true,
"value": "BooleanVariable"
},
"parameters": [
"MouseIsInside",
"True",
""
]
},
{
"type": {
"value": "StringVariable"
},
"parameters": [
"State",
"=",
"\"Hovered\""
]
}
],
"actions": [
{
"type": {
"value": "SetStringVariable"
},
"parameters": [
"State",
"=",
"\"Idle\""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"MouseIsInside",
"True",
""
]
},
{
"type": {
"value": "StringVariable"
},
"parameters": [
"State",
"=",
"\"Idle\""
]
}
],
"actions": [
{
"type": {
"value": "SetStringVariable"
},
"parameters": [
"State",
"=",
"\"Hovered\""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"inverted": true,
"value": "BooleanVariable"
},
"parameters": [
"TouchIsInside",
"True",
""
]
},
{
"type": {
"value": "StringVariable"
},
"parameters": [
"State",
"=",
"\"PressedInside\""
]
}
],
"actions": [
{
"type": {
"value": "SetStringVariable"
},
"parameters": [
"State",
"=",
"\"PressedOutside\""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"TouchIsInside",
"True",
""
]
},
{
"type": {
"value": "StringVariable"
},
"parameters": [
"State",
"=",
"\"PressedOutside\""
]
}
],
"actions": [
{
"type": {
"value": "SetStringVariable"
},
"parameters": [
"State",
"=",
"\"PressedInside\""
]
}
]
}
],
"parameters": []
},
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Handle touch end",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "HasTouchEnded"
},
"parameters": [
"",
"TouchId"
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"TouchId",
"=",
"0"
]
}
],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"State",
"=",
"\"PressedInside\""
]
}
],
"actions": [
{
"type": {
"value": "SetStringVariable"
},
"parameters": [
"State",
"=",
"\"Validated\""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"inverted": true,
"value": "StringVariable"
},
"parameters": [
"State",
"=",
"\"PressedInside\""
]
},
{
"type": {
"inverted": true,
"value": "StringVariable"
},
"parameters": [
"State",
"=",
"\"Validated\""
]
}
],
"actions": [
{
"type": {
"value": "SetStringVariable"
},
"parameters": [
"State",
"=",
"\"Idle\""
]
}
]
}
]
}
],
"parameters": []
}
],
"parameters": []
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "PanelSpriteButton::ButtonFSM",
"type": "behavior"
}
],
"objectGroups": []
},
{
"fullName": "",
"functionType": "Action",
"name": "onDeActivate",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "PanelSpriteButton::ButtonFSM::ResetState"
},
"parameters": [
"Object",
"Behavior",
""
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "PanelSpriteButton::ButtonFSM",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Reset the state of the button.",
"fullName": "Reset state",
"functionType": "Action",
"name": "ResetState",
"private": true,
"sentence": "Reset the button state of _PARAM0_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetStringVariable"
},
"parameters": [
"State",
"=",
"\"Idle\""
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"TouchId",
"=",
"0"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "PanelSpriteButton::ButtonFSM",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Check if the button is not used.",
"fullName": "Is idle",
"functionType": "Condition",
"name": "IsIdle",
"sentence": "_PARAM0_ is idle",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"State",
"=",
"\"Idle\""
]
}
],
"actions": [
{
"type": {
"value": "SetReturnBoolean"
},
"parameters": [
"True"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "PanelSpriteButton::ButtonFSM",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Check if the button was just clicked.",
"fullName": "Is clicked",
"functionType": "Condition",
"name": "IsClicked",
"sentence": "_PARAM0_ is clicked",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"State",
"=",
"\"Validated\""
]
}
],
"actions": [
{
"type": {
"value": "SetReturnBoolean"
},
"parameters": [
"True"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "PanelSpriteButton::ButtonFSM",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Check if the cursor is hovered over the button.",
"fullName": "Is hovered",
"functionType": "Condition",
"name": "IsHovered",
"sentence": "_PARAM0_ is hovered",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"State",
"=",
"\"Hovered\""
]
}
],
"actions": [
{
"type": {
"value": "SetReturnBoolean"
},
"parameters": [
"True"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "PanelSpriteButton::ButtonFSM",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Check if the button is either hovered or pressed but not hovered.",
"fullName": "Is focused",
"functionType": "Condition",
"name": "IsFocused",
"sentence": "_PARAM0_ is focused",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"State",
"=",
"\"Hovered\""
]
}
],
"actions": [
{
"type": {
"value": "SetReturnBoolean"
},
"parameters": [
"True"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"State",
"=",
"\"PressedOutside\""
]
}
],
"actions": [
{
"type": {
"value": "SetReturnBoolean"
},
"parameters": [
"True"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "PanelSpriteButton::ButtonFSM",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Check if the button is currently being pressed with mouse or touch.",
"fullName": "Is pressed",
"functionType": "Condition",
"name": "IsPressed",
"sentence": "_PARAM0_ is pressed",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"State",
"=",
"\"PressedInside\""
]
}
],
"actions": [
{
"type": {
"value": "SetReturnBoolean"
},
"parameters": [
"True"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "PanelSpriteButton::ButtonFSM",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Check if the button is currently being pressed outside with mouse or touch.",
"fullName": "Is held outside",
"functionType": "Condition",
"name": "IsPressedOutside",
"sentence": "_PARAM0_ is held outside",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"State",
"=",
"\"PressedOutside\""
]
}
],
"actions": [
{
"type": {
"value": "SetReturnBoolean"
},
"parameters": [
"True"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "PanelSpriteButton::ButtonFSM",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "the touch id that is using the button or 0 if none.",
"fullName": "Touch id",
"functionType": "ExpressionAndCondition",
"name": "TouchId",
"sentence": "the touch id",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnNumber"
},
"parameters": [
"TouchId"
]
}
]
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "PanelSpriteButton::ButtonFSM",
"type": "behavior"
}
],
"objectGroups": []
}
],
"eventsFunctionsFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"functionName": "doStepPostEvents"
},
{
"functionName": "onDeActivate"
},
{
"functionName": "ResetState"
},
{
"functionName": "IsIdle"
},
{
"functionName": "IsClicked"
},
{
"functionName": "IsHovered"
},
{
"functionName": "IsFocused"
},
{
"functionName": "IsPressed"
},
{
"functionName": "IsPressedOutside"
},
{
"functionName": "TouchId"
}
]
},
"propertyDescriptors": [
{
"value": "true",
"type": "Boolean",
"label": "",
"description": "Should check hovering",
"hidden": true,
"name": "ShouldCheckHovering"
},
{
"value": "Idle",
"type": "Choice",
"label": "State",
"choices": [
{
"label": "Idle",
"value": "Idle"
},
{
"label": "Hovered",
"value": "Hovered"
},
{
"label": "PressedInside",
"value": "PressedInside"
},
{
"label": "PressedOutside",
"value": "PressedOutside"
},
{
"label": "Validated",
"value": "Validated"
}
],
"hidden": true,
"name": "State"
},
{
"value": "0",
"type": "Number",
"label": "Touch id",
"hidden": true,
"name": "TouchId"
},
{
"value": "",
"type": "Boolean",
"label": "Touch is inside",
"hidden": true,
"name": "TouchIsInside"
},
{
"value": "",
"type": "Boolean",
"label": "Mouse is inside",
"hidden": true,
"name": "MouseIsInside"
},
{
"value": "",
"type": "Number",
"label": "",
"hidden": true,
"name": "Index"
}
],
"propertiesFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"propertyName": "ShouldCheckHovering"
},
{
"propertyName": "State"
},
{
"propertyName": "TouchId"
},
{
"propertyName": "TouchIsInside"
},
{
"propertyName": "MouseIsInside"
},
{
"propertyName": "Index"
}
]
}
},
{
"description": "Change the text style when the button is hovered.",
"fullName": "Hover text style",
"helpPath": "",
"iconUrl": "",
"name": "TextStyleState",
"objectType": "TextObject::Text",
"previewIconUrl": "",
"private": true,
"eventsFunctions": [
{
"description": "Check if isHovered.",
"fullName": "IsHovered",
"functionType": "Condition",
"name": "IsHovered",
"sentence": "_PARAM0_ isHovered",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"IsHovered",
"True",
""
]
}
],
"actions": [
{
"type": {
"value": "SetReturnBoolean"
},
"parameters": [
"True"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "TextObject::Text",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "PanelSpriteButton::TextStyleState",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Change if isHovered.",
"fullName": "IsHovered",
"functionType": "Action",
"name": "SetIsHovered",
"sentence": "_PARAM0_ isHovered: _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"IsHovered",
"False",
""
]
},
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"Value",
"True",
""
]
}
],
"actions": [
{
"type": {
"value": "SetBooleanVariable"
},
"parameters": [
"IsHovered",
"True",
""
]
}
],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"HoverFontSize",
">",
"0"
]
}
],
"actions": [
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"IdleFontSize",
"=",
"Object.FontSize()"
]
},
{
"type": {
"value": "TextObject::Text::SetFontSize"
},
"parameters": [
"Object",
"=",
"HoverFontSize"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"HoverColor",
"!=",
"\"\""
]
}
],
"actions": [
{
"type": {
"value": "SetStringVariable"
},
"parameters": [
"IdleColor",
"=",
"Object.Behavior::Color()"
]
},
{
"type": {
"value": "TextObject::ChangeColor"
},
"parameters": [
"Object",
"HoverColor"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"ShouldEnableShadowOnHover",
"True",
""
]
}
],
"actions": [
{
"type": {
"value": "TextObject::ShowShadow"
},
"parameters": [
"Object",
""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"ShouldEnableOutlineOnHover",
"True",
""
]
}
],
"actions": [
{
"type": {
"value": "TextObject::Text::SetOutlineEnabled"
},
"parameters": [
"Object",
"yes"
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"IsHovered",
"True",
""
]
},
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"Value",
"False",
""
]
}
],
"actions": [
{
"type": {
"value": "SetBooleanVariable"
},
"parameters": [
"IsHovered",
"False",
""
]
}
],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"HoverFontSize",
">",
"0"
]
}
],
"actions": [
{
"type": {
"value": "TextObject::Text::SetFontSize"
},
"parameters": [
"Object",
"=",
"IdleFontSize"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"HoverColor",
"!=",
"\"\""
]
}
],
"actions": [
{
"type": {
"value": "TextObject::ChangeColor"
},
"parameters": [
"Object",
"IdleColor"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"ShouldEnableShadowOnHover",
"True",
""
]
}
],
"actions": [
{
"type": {
"value": "TextObject::ShowShadow"
},
"parameters": [
"Object",
"no"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"ShouldEnableOutlineOnHover",
"True",
""
]
}
],
"actions": [
{
"type": {
"value": "TextObject::Text::SetOutlineEnabled"
},
"parameters": [
"Object",
"no"
]
}
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "TextObject::Text",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "PanelSpriteButton::TextStyleState",
"type": "behavior"
},
{
"defaultValue": "yes",
"description": "IsHovered",
"name": "Value",
"optional": true,
"type": "yesorno"
}
],
"objectGroups": []
},
{
"description": "Return the text color",
"fullName": "Text color",
"functionType": "StringExpression",
"name": "Color",
"private": true,
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"/** @type {gdjs.TextRuntimeObject} */",
"const object = eventsFunctionContext.getObjects(\"Object\")[0];",
"",
"eventsFunctionContext.returnValue = object._color.join(\";\");"
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"expressionType": {
"type": "color"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "TextObject::Text",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "PanelSpriteButton::TextStyleState",
"type": "behavior"
}
],
"objectGroups": []
}
],
"eventsFunctionsFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"functionName": "IsHovered"
},
{
"functionName": "SetIsHovered"
},
{
"functionName": "Color"
}
]
},
"propertyDescriptors": [
{
"value": "",
"type": "Boolean",
"label": "Outline on hover",
"name": "ShouldEnableOutlineOnHover"
},
{
"value": "",
"type": "Color",
"label": "Hover color",
"name": "HoverColor"
},
{
"value": "",
"type": "Boolean",
"label": "Enable shadow on hover",
"name": "ShouldEnableShadowOnHover"
},
{
"value": "0",
"type": "Number",
"unit": "Pixel",
"label": "Hover font size",
"name": "HoverFontSize"
},
{
"value": "",
"type": "Boolean",
"label": "",
"hidden": true,
"name": "IsHovered"
},
{
"value": "0",
"type": "Number",
"unit": "Pixel",
"label": "Idle font size",
"hidden": true,
"name": "IdleFontSize"
},
{
"value": "",
"type": "Color",
"label": "Idle color",
"hidden": true,
"name": "IdleColor"
}
],
"propertiesFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"propertyName": "IsHovered"
},
{
"propertyName": "HoverFontSize"
},
{
"propertyName": "IdleFontSize"
},
{
"propertyName": "HoverColor"
},
{
"propertyName": "IdleColor"
},
{
"propertyName": "ShouldEnableOutlineOnHover"
},
{
"propertyName": "ShouldEnableShadowOnHover"
}
]
}
},
{
"description": "Change the text style when the button is hovered.",
"fullName": "Hover bitmap text style",
"helpPath": "",
"iconUrl": "",
"name": "BitmapTextStyleState",
"objectType": "BitmapText::BitmapTextObject",
"previewIconUrl": "",
"private": true,
"eventsFunctions": [
{
"description": "Check if isHovered.",
"fullName": "IsHovered",
"functionType": "Condition",
"name": "IsHovered",
"sentence": "_PARAM0_ isHovered",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"IsHovered",
"True",
""
]
}
],
"actions": [
{
"type": {
"value": "SetReturnBoolean"
},
"parameters": [
"True"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "BitmapText::BitmapTextObject",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "PanelSpriteButton::BitmapTextStyleState",
"type": "behavior"
}
],
"objectGroups": []
},
{
"description": "Change if isHovered.",
"fullName": "IsHovered",
"functionType": "Action",
"name": "SetIsHovered",
"sentence": "_PARAM0_ isHovered: _PARAM2_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"IsHovered",
"False",
""
]
},
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"Value",
"True",
""
]
}
],
"actions": [
{
"type": {
"value": "SetBooleanVariable"
},
"parameters": [
"IsHovered",
"True",
""
]
}
],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"HoverColor",
"!=",
"\"\""
]
}
],
"actions": [
{
"type": {
"value": "SetStringVariable"
},
"parameters": [
"IdleColor",
"=",
"Object.Behavior::Color()"
]
},
{
"type": {
"value": "BitmapText::SetTint"
},
"parameters": [
"Object",
"HoverColor"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BuiltinCommonInstructions::Or"
},
"parameters": [],
"subInstructions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"HoverPrefix",
"!=",
"\"\""
]
},
{
"type": {
"value": "StringVariable"
},
"parameters": [
"HoverSuffix",
"!=",
"\"\""
]
}
]
}
],
"actions": [
{
"type": {
"value": "SetStringVariable"
},
"parameters": [
"IdleText",
"=",
"Object.Text::Value()"
]
},
{
"type": {
"value": "TextContainerCapability::TextContainerBehavior::SetValue"
},
"parameters": [
"Object",
"Text",
"=",
"HoverPrefix + Object.Text::Value() + HoverSuffix"
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"IsHovered",
"True",
""
]
},
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"Value",
"False",
""
]
}
],
"actions": [
{
"type": {
"value": "SetBooleanVariable"
},
"parameters": [
"IsHovered",
"False",
""
]
}
],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"HoverColor",
"!=",
"\"\""
]
}
],
"actions": [
{
"type": {
"value": "BitmapText::SetTint"
},
"parameters": [
"Object",
"IdleColor"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BuiltinCommonInstructions::Or"
},
"parameters": [],
"subInstructions": [
{
"type": {
"value": "StringVariable"
},
"parameters": [
"HoverPrefix",
"!=",
"\"\""
]
},
{
"type": {
"value": "StringVariable"
},
"parameters": [
"HoverSuffix",
"!=",
"\"\""
]
}
]
}
],
"actions": [
{
"type": {
"value": "TextContainerCapability::TextContainerBehavior::SetValue"
},
"parameters": [
"Object",
"Text",
"=",
"IdleText"
]
}
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "BitmapText::BitmapTextObject",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "PanelSpriteButton::BitmapTextStyleState",
"type": "behavior"
},
{
"defaultValue": "yes",
"description": "IsHovered",
"name": "Value",
"optional": true,
"type": "yesorno"
}
],
"objectGroups": []
},
{
"description": "Return the text color",
"fullName": "Text color",
"functionType": "StringExpression",
"name": "Color",
"private": true,
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::JsCode",
"inlineCode": [
"/** @type {gdjs.BitmapTextRuntimeObject} */",
"const object = eventsFunctionContext.getObjects(\"Object\")[0];",
"",
"eventsFunctionContext.returnValue = object._tint.join(\";\");"
],
"parameterObjects": "",
"useStrict": true,
"eventsSheetExpanded": true
}
],
"expressionType": {
"type": "color"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "BitmapText::BitmapTextObject",
"type": "object"
},
{
"description": "Behavior",
"name": "Behavior",
"supplementaryInformation": "PanelSpriteButton::BitmapTextStyleState",
"type": "behavior"
}
],
"objectGroups": []
}
],
"eventsFunctionsFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"functionName": "IsHovered"
},
{
"functionName": "SetIsHovered"
},
{
"functionName": "Color"
}
]
},
"propertyDescriptors": [
{
"value": "",
"type": "Color",
"label": "Hover color",
"name": "HoverColor"
},
{
"value": "",
"type": "String",
"label": "Hover prefix",
"name": "HoverPrefix"
},
{
"value": "",
"type": "String",
"label": "Hover suffix",
"name": "HoverSuffix"
},
{
"value": "",
"type": "Boolean",
"label": "",
"hidden": true,
"name": "IsHovered"
},
{
"value": "",
"type": "String",
"label": "Idle text",
"hidden": true,
"name": "IdleText"
},
{
"value": "",
"type": "Color",
"label": "Idle color",
"hidden": true,
"name": "IdleColor"
}
],
"propertiesFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"propertyName": "IsHovered"
},
{
"propertyName": "HoverPrefix"
},
{
"propertyName": "HoverSuffix"
},
{
"propertyName": "IdleText"
},
{
"propertyName": "HoverColor"
},
{
"propertyName": "IdleColor"
}
]
}
}
],
"eventsBasedObjects": [
{
"areaMaxX": 256,
"areaMaxY": 64,
"areaMaxZ": 64,
"areaMinX": 0,
"areaMinY": 0,
"areaMinZ": 0,
"assetStoreTag": "menu buttons",
"defaultName": "Button",
"description": "Button with a label.",
"fullName": "Labeled button",
"helpPath": "",
"iconUrl": "",
"isInnerAreaFollowingParentSize": true,
"isUsingLegacyInstancesRenderer": false,
"name": "PanelSpriteButton",
"previewIconUrl": "",
"objects": [
{
"assetStoreId": "",
"bold": false,
"italic": false,
"name": "Label",
"smoothed": true,
"type": "TextObject::Text",
"underlined": false,
"variables": [],
"effects": [],
"behaviors": [
{
"name": "Anchor",
"type": "AnchorBehavior::AnchorBehavior",
"bottomEdgeAnchor": 4,
"topEdgeAnchor": 4,
"leftEdgeAnchor": 1,
"relativeToOriginalWindowSize": true,
"rightEdgeAnchor": 2,
"useLegacyBottomAndRightAnchors": false
},
{
"name": "TextStyleState",
"type": "PanelSpriteButton::TextStyleState",
"ShouldEnableOutlineOnHover": false,
"HoverColor": "",
"ShouldEnableShadowOnHover": false,
"HoverFontSize": 0,
"IsHovered": false,
"IdleFontSize": 0,
"IdleColor": ""
}
],
"string": "Text",
"font": "",
"textAlignment": "center",
"characterSize": 20,
"color": {
"b": 0,
"g": 0,
"r": 0
},
"content": {
"bold": false,
"isOutlineEnabled": false,
"isShadowEnabled": false,
"italic": false,
"outlineColor": "255;255;255",
"outlineThickness": 2,
"shadowAngle": 90,
"shadowBlurRadius": 2,
"shadowColor": "0;0;0",
"shadowDistance": 4,
"shadowOpacity": 127,
"smoothed": true,
"underlined": false,
"text": "Text",
"font": "",
"textAlignment": "center",
"verticalTextAlignment": "center",
"characterSize": 20,
"lineHeight": 0,
"color": "0;0;0"
}
},
{
"assetStoreId": "",
"bottomMargin": 0,
"height": 32,
"leftMargin": 0,
"name": "Idle",
"rightMargin": 0,
"texture": "",
"tiled": false,
"topMargin": 0,
"type": "PanelSpriteObject::PanelSprite",
"width": 32,
"variables": [
{
"folded": true,
"name": "State",
"type": "string",
"value": "Idle"
}
],
"effects": [],
"behaviors": [
{
"name": "Anchor",
"type": "AnchorBehavior::AnchorBehavior",
"bottomEdgeAnchor": 2,
"leftEdgeAnchor": 1,
"relativeToOriginalWindowSize": true,
"rightEdgeAnchor": 2,
"topEdgeAnchor": 1,
"useLegacyBottomAndRightAnchors": false
},
{
"name": "ButtonFSM",
"type": "PanelSpriteButton::ButtonFSM",
"ShouldCheckHovering": true
}
]
},
{
"assetStoreId": "",
"bottomMargin": 0,
"height": 32,
"leftMargin": 0,
"name": "Hovered",
"rightMargin": 0,
"texture": "",
"tiled": false,
"topMargin": 0,
"type": "PanelSpriteObject::PanelSprite",
"width": 32,
"variables": [],
"effects": [],
"behaviors": [
{
"name": "Anchor",
"type": "AnchorBehavior::AnchorBehavior",
"bottomEdgeAnchor": 2,
"leftEdgeAnchor": 1,
"relativeToOriginalWindowSize": true,
"rightEdgeAnchor": 2,
"topEdgeAnchor": 1,
"useLegacyBottomAndRightAnchors": false
},
{
"name": "Tween",
"type": "Tween::TweenBehavior"
}
]
},
{
"assetStoreId": "",
"bottomMargin": 0,
"height": 32,
"leftMargin": 0,
"name": "Pressed",
"rightMargin": 0,
"texture": "",
"tiled": false,
"topMargin": 0,
"type": "PanelSpriteObject::PanelSprite",
"width": 32,
"variables": [],
"effects": [],
"behaviors": [
{
"name": "Anchor",
"type": "AnchorBehavior::AnchorBehavior",
"bottomEdgeAnchor": 2,
"leftEdgeAnchor": 1,
"relativeToOriginalWindowSize": true,
"rightEdgeAnchor": 2,
"topEdgeAnchor": 1,
"useLegacyBottomAndRightAnchors": false
}
]
},
{
"assetStoreId": "",
"name": "BitmapLabel",
"type": "BitmapText::BitmapTextObject",
"variables": [],
"effects": [],
"behaviors": [
{
"name": "Anchor",
"type": "AnchorBehavior::AnchorBehavior",
"bottomEdgeAnchor": 4,
"topEdgeAnchor": 4,
"leftEdgeAnchor": 1,
"relativeToOriginalWindowSize": true,
"rightEdgeAnchor": 2,
"useLegacyBottomAndRightAnchors": false
},
{
"name": "BitmapTextStyleState",
"type": "PanelSpriteButton::BitmapTextStyleState",
"HoverColor": "",
"HoverPrefix": "",
"HoverSuffix": "",
"IsHovered": false,
"IdleText": "",
"IdleColor": ""
}
],
"content": {
"text": "Text",
"opacity": 255,
"scale": 1,
"fontSize": 20,
"tint": "255;255;255",
"bitmapFontResourceName": "",
"textureAtlasResourceName": "",
"align": "center",
"verticalTextAlignment": "center"
}
}
],
"objectsFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"objectName": "Label"
},
{
"objectName": "BitmapLabel"
},
{
"objectName": "Idle"
},
{
"objectName": "Hovered"
},
{
"objectName": "Pressed"
}
]
},
"objectsGroups": [
{
"name": "Background",
"objects": [
{
"name": "Idle"
},
{
"name": "Hovered"
},
{
"name": "Pressed"
}
]
},
{
"name": "Labels",
"objects": [
{
"name": "Label"
},
{
"name": "BitmapLabel"
}
]
}
],
"layers": [
{
"ambientLightColorB": 200,
"ambientLightColorG": 200,
"ambientLightColorR": 200,
"camera2DPlaneMaxDrawingDistance": 5000,
"camera3DFarPlaneDistance": 10000,
"camera3DFieldOfView": 45,
"camera3DNearPlaneDistance": 3,
"cameraType": "",
"followBaseLayerCamera": false,
"isLightingLayer": false,
"isLocked": false,
"name": "",
"renderingType": "",
"visibility": true,
"cameras": [
{
"defaultSize": true,
"defaultViewport": true,
"height": 0,
"viewportBottom": 1,
"viewportLeft": 0,
"viewportRight": 1,
"viewportTop": 0,
"width": 0
}
],
"effects": []
}
],
"instances": [
{
"angle": 0,
"customSize": true,
"depth": 1,
"height": 64,
"layer": "",
"name": "Idle",
"persistentUuid": "24882334-eec8-403e-8bf1-70fc928a46e6",
"width": 256,
"x": 0,
"y": 0,
"zOrder": 1,
"numberProperties": [],
"stringProperties": [],
"initialVariables": []
},
{
"angle": 0,
"customSize": true,
"depth": 1,
"height": 64,
"layer": "",
"name": "Label",
"persistentUuid": "3b29c95c-5363-4e25-bf47-eecf13e8a226",
"width": 256,
"x": 0,
"y": 32,
"zOrder": 2,
"numberProperties": [],
"stringProperties": [],
"initialVariables": []
}
],
"editionSettings": {
"grid": false,
"gridType": "rectangular",
"gridWidth": 32,
"gridHeight": 32,
"gridDepth": 32,
"gridOffsetX": 0,
"gridOffsetY": 0,
"gridOffsetZ": 0,
"gridColor": 10401023,
"gridAlpha": 0.8,
"snap": false,
"zoomFactor": 2.734375,
"windowMask": false,
"selectedLayer": "",
"gameEditorMode": "instances-editor"
},
"eventsFunctions": [
{
"fullName": "",
"functionType": "Action",
"name": "onCreated",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Create one background instance for of each state.\nOnly the instance for the current state is shown."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "Create"
},
"parameters": [
"",
"Hovered",
"0",
"0",
""
]
},
{
"type": {
"value": "Create"
},
"parameters": [
"",
"Pressed",
"0",
"0",
""
]
},
{
"type": {
"value": "ResizableCapability::ResizableBehavior::SetSize"
},
"parameters": [
"Hovered",
"Resizable",
"Idle.Width()",
"Idle.Height()"
]
},
{
"type": {
"value": "ResizableCapability::ResizableBehavior::SetSize"
},
"parameters": [
"Pressed",
"Resizable",
"Idle.Width()",
"Idle.Height()"
]
},
{
"type": {
"value": "Hide"
},
"parameters": [
"Hovered"
]
},
{
"type": {
"value": "Hide"
},
"parameters": [
"Pressed"
]
},
{
"type": {
"value": "SetZOrder"
},
"parameters": [
"Hovered",
"=",
"1"
]
},
{
"type": {
"value": "SetZOrder"
},
"parameters": [
"Pressed",
"=",
"1"
]
},
{
"type": {
"value": "TextContainerCapability::TextContainerBehavior::SetValue"
},
"parameters": [
"Labels",
"Text",
"=",
"LabelText"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "PanelSpriteButton::PanelSpriteButton",
"type": "object"
}
],
"objectGroups": [
{
"name": "Background",
"objects": [
{
"name": "Idle"
},
{
"name": "Hovered"
},
{
"name": "Pressed"
}
]
}
]
},
{
"fullName": "",
"functionType": "Action",
"name": "onHotReloading",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "PanelSpriteButton::PanelSpriteButton::IsPressed"
},
"parameters": [
"Object",
""
]
}
],
"actions": [
{
"type": {
"value": "PanelSpriteButton::PanelSpriteButton::SetLabelOffset"
},
"parameters": [
"Object",
"=",
"PressedLabelOffsetY",
""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "TextContainerCapability::TextContainerBehavior::SetValue"
},
"parameters": [
"Labels",
"Text",
"=",
"LabelText"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "PanelSpriteButton::PanelSpriteButton",
"type": "object"
}
],
"objectGroups": []
},
{
"fullName": "",
"functionType": "Action",
"name": "doStepPostEvents",
"sentence": "",
"events": [
{
"colorB": 228,
"colorG": 176,
"colorR": 74,
"creationTime": 0,
"name": "Apply states",
"source": "",
"type": "BuiltinCommonInstructions::Group",
"events": [
{
"type": "BuiltinCommonInstructions::Comment",
"color": {
"b": 109,
"g": 230,
"r": 255,
"textB": 0,
"textG": 0,
"textR": 0
},
"comment": "Show the right background accordingly to the new state."
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "PanelSpriteButton::PanelSpriteButton::IsIdle"
},
"parameters": [
"Object",
"ButtonFSM"
]
},
{
"type": {
"value": "BuiltinCommonInstructions::Once"
},
"parameters": []
}
],
"actions": [
{
"type": {
"value": "PanelSpriteButton::TextStyleState::SetIsHovered"
},
"parameters": [
"Label",
"TextStyleState",
"no",
""
]
},
{
"type": {
"value": "PanelSpriteButton::BitmapTextStyleState::SetIsHovered"
},
"parameters": [
"BitmapLabel",
"BitmapTextStyleState",
"no",
""
]
},
{
"type": {
"value": "PanelSpriteButton::PanelSpriteButton::SetLabelOffset"
},
"parameters": [
"Object",
"=",
"0",
""
]
},
{
"type": {
"value": "Show"
},
"parameters": [
"Idle",
""
]
},
{
"type": {
"value": "Hide"
},
"parameters": [
"Pressed"
]
}
],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "Visible"
},
"parameters": [
"Hovered"
]
},
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"HoveredFadeOutDuration",
">",
"0"
]
}
],
"actions": [
{
"type": {
"value": "Tween::TweenBehavior::AddObjectOpacityTween2"
},
"parameters": [
"Hovered",
"Tween",
"\"Fadeout\"",
"0",
"\"linear\"",
"HoveredFadeOutDuration",
""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"HoveredFadeOutDuration",
"=",
"0"
]
}
],
"actions": [
{
"type": {
"value": "Hide"
},
"parameters": [
"Hovered"
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "OpacityCapability::OpacityBehavior::Value"
},
"parameters": [
"Hovered",
"Opacity",
"=",
"0"
]
}
],
"actions": [
{
"type": {
"value": "Hide"
},
"parameters": [
"Hovered"
]
},
{
"type": {
"value": "OpacityCapability::OpacityBehavior::SetValue"
},
"parameters": [
"Hovered",
"Opacity",
"=",
"255"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "PanelSpriteButton::PanelSpriteButton::IsHovered"
},
"parameters": [
"Object",
"ButtonFSM"
]
},
{
"type": {
"value": "BuiltinCommonInstructions::Once"
},
"parameters": []
}
],
"actions": [
{
"type": {
"value": "PanelSpriteButton::TextStyleState::SetIsHovered"
},
"parameters": [
"Label",
"TextStyleState",
"",
""
]
},
{
"type": {
"value": "PanelSpriteButton::BitmapTextStyleState::SetIsHovered"
},
"parameters": [
"BitmapLabel",
"BitmapTextStyleState",
"yes",
""
]
},
{
"type": {
"value": "PanelSpriteButton::PanelSpriteButton::SetLabelOffset"
},
"parameters": [
"Object",
"=",
"0",
""
]
},
{
"type": {
"value": "Hide"
},
"parameters": [
"Idle"
]
},
{
"type": {
"value": "Show"
},
"parameters": [
"Hovered",
""
]
},
{
"type": {
"value": "Hide"
},
"parameters": [
"Pressed"
]
}
],
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "NumberVariable"
},
"parameters": [
"HoveredFadeOutDuration",
">",
"0"
]
}
],
"actions": [
{
"type": {
"value": "Tween::RemoveTween"
},
"parameters": [
"Hovered",
"Tween",
"\"Fadeout\""
]
},
{
"type": {
"value": "OpacityCapability::OpacityBehavior::SetValue"
},
"parameters": [
"Hovered",
"Opacity",
"=",
"255"
]
}
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "PanelSpriteButton::PanelSpriteButton::IsPressed"
},
"parameters": [
"Object",
"ButtonFSM"
]
},
{
"type": {
"value": "BuiltinCommonInstructions::Once"
},
"parameters": []
}
],
"actions": [
{
"type": {
"value": "PanelSpriteButton::TextStyleState::SetIsHovered"
},
"parameters": [
"Label",
"TextStyleState",
"no",
""
]
},
{
"type": {
"value": "PanelSpriteButton::BitmapTextStyleState::SetIsHovered"
},
"parameters": [
"BitmapLabel",
"BitmapTextStyleState",
"no",
""
]
},
{
"type": {
"value": "PanelSpriteButton::PanelSpriteButton::SetLabelOffset"
},
"parameters": [
"Object",
"=",
"PressedLabelOffsetY",
""
]
},
{
"type": {
"value": "Hide"
},
"parameters": [
"Idle"
]
},
{
"type": {
"value": "Hide"
},
"parameters": [
"Hovered"
]
},
{
"type": {
"value": "Show"
},
"parameters": [
"Pressed",
""
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "PanelSpriteButton::PanelSpriteButton::IsFocused"
},
"parameters": [
"Object",
"ButtonFSM"
]
},
{
"type": {
"value": "BuiltinCommonInstructions::Once"
},
"parameters": []
}
],
"actions": [
{
"type": {
"value": "PanelSpriteButton::TextStyleState::SetIsHovered"
},
"parameters": [
"Label",
"TextStyleState",
"yes",
""
]
},
{
"type": {
"value": "PanelSpriteButton::BitmapTextStyleState::SetIsHovered"
},
"parameters": [
"BitmapLabel",
"BitmapTextStyleState",
"yes",
""
]
},
{
"type": {
"value": "PanelSpriteButton::PanelSpriteButton::SetLabelOffset"
},
"parameters": [
"Object",
"=",
"0",
""
]
},
{
"type": {
"value": "Hide"
},
"parameters": [
"Idle"
]
},
{
"type": {
"value": "Show"
},
"parameters": [
"Hovered",
""
]
},
{
"type": {
"value": "Hide"
},
"parameters": [
"Pressed"
]
}
]
}
],
"parameters": []
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "PanelSpriteButton::PanelSpriteButton",
"type": "object"
}
],
"objectGroups": []
},
{
"description": "Check if the button is not used.",
"fullName": "Is idle",
"functionType": "Condition",
"name": "IsIdle",
"sentence": "_PARAM0_ is idle",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "PanelSpriteButton::ButtonFSM::IsIdle"
},
"parameters": [
"Idle",
"ButtonFSM",
""
]
}
],
"actions": [
{
"type": {
"value": "SetReturnBoolean"
},
"parameters": [
"True"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "PanelSpriteButton::PanelSpriteButton",
"type": "object"
}
],
"objectGroups": []
},
{
"description": "Check if the button was just clicked.",
"fullName": "Is clicked",
"functionType": "Condition",
"name": "IsClicked",
"sentence": "_PARAM0_ is clicked",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "PanelSpriteButton::ButtonFSM::IsClicked"
},
"parameters": [
"Idle",
"ButtonFSM",
""
]
}
],
"actions": [
{
"type": {
"value": "SetReturnBoolean"
},
"parameters": [
"True"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "PanelSpriteButton::PanelSpriteButton",
"type": "object"
}
],
"objectGroups": []
},
{
"description": "Check if the cursor is hovered over the button.",
"fullName": "Is hovered",
"functionType": "Condition",
"name": "IsHovered",
"sentence": "_PARAM0_ is hovered",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "PanelSpriteButton::ButtonFSM::IsHovered"
},
"parameters": [
"Idle",
"ButtonFSM",
""
]
}
],
"actions": [
{
"type": {
"value": "SetReturnBoolean"
},
"parameters": [
"True"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "PanelSpriteButton::PanelSpriteButton",
"type": "object"
}
],
"objectGroups": []
},
{
"description": "Check if the button is either hovered or pressed but not hovered.",
"fullName": "Is focused",
"functionType": "Condition",
"name": "IsFocused",
"sentence": "_PARAM0_ is focused",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "PanelSpriteButton::ButtonFSM::IsFocused"
},
"parameters": [
"Idle",
"ButtonFSM",
""
]
}
],
"actions": [
{
"type": {
"value": "SetReturnBoolean"
},
"parameters": [
"True"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "PanelSpriteButton::PanelSpriteButton",
"type": "object"
}
],
"objectGroups": []
},
{
"description": "Check if the button is currently being pressed with mouse or touch.",
"fullName": "Is pressed",
"functionType": "Condition",
"name": "IsPressed",
"sentence": "_PARAM0_ is pressed",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "PanelSpriteButton::ButtonFSM::IsPressed"
},
"parameters": [
"Idle",
"ButtonFSM",
""
]
}
],
"actions": [
{
"type": {
"value": "SetReturnBoolean"
},
"parameters": [
"True"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "PanelSpriteButton::PanelSpriteButton",
"type": "object"
}
],
"objectGroups": []
},
{
"description": "Change the text of the button label.",
"fullName": "Label text",
"functionType": "Action",
"name": "SetLabelText",
"private": true,
"sentence": "Change the text of _PARAM0_ to _PARAM1_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "TextContainerCapability::TextContainerBehavior::SetValue"
},
"parameters": [
"Labels",
"Text",
"=",
"Value"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "PanelSpriteButton::PanelSpriteButton",
"type": "object"
},
{
"description": "Text",
"name": "Value",
"type": "string"
}
],
"objectGroups": []
},
{
"fullName": "",
"functionType": "ActionWithOperator",
"getterName": "LabelText",
"name": "SetLabelTextOp",
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "TextContainerCapability::TextContainerBehavior::SetValue"
},
"parameters": [
"Labels",
"Text",
"=",
"Value"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "PanelSpriteButton::PanelSpriteButton",
"type": "object"
}
],
"objectGroups": []
},
{
"description": "the label text.",
"fullName": "Label text",
"functionType": "ExpressionAndCondition",
"name": "LabelText",
"sentence": "the label text",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnString"
},
"parameters": [
"Labels.Text::Value()"
]
}
]
}
],
"expressionType": {
"type": "string"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "PanelSpriteButton::PanelSpriteButton",
"type": "object"
}
],
"objectGroups": []
},
{
"description": "De/activate interactions with the button.",
"fullName": "De/activate interactions",
"functionType": "Action",
"name": "Activate",
"sentence": "Activate interactions with _PARAM0_: _PARAM1_",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BooleanVariable"
},
"parameters": [
"ShouldActivate",
"True",
""
]
}
],
"actions": [
{
"type": {
"value": "ActivateBehavior"
},
"parameters": [
"Idle",
"ButtonFSM",
"yes"
]
}
]
},
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"inverted": true,
"value": "BooleanVariable"
},
"parameters": [
"ShouldActivate",
"True",
""
]
}
],
"actions": [
{
"type": {
"value": "ActivateBehavior"
},
"parameters": [
"Idle",
"ButtonFSM",
"no"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "PanelSpriteButton::PanelSpriteButton",
"type": "object"
},
{
"description": "Activate",
"name": "ShouldActivate",
"type": "yesorno"
}
],
"objectGroups": []
},
{
"description": "Check if interactions are activated on the button.",
"fullName": "Interactions activated",
"functionType": "Condition",
"name": "IsActivated",
"sentence": "Interactions on _PARAM0_ are activated",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [
{
"type": {
"value": "BehaviorActivated"
},
"parameters": [
"Idle",
"ButtonFSM"
]
}
],
"actions": [
{
"type": {
"value": "SetReturnBoolean"
},
"parameters": [
"True"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "PanelSpriteButton::PanelSpriteButton",
"type": "object"
}
],
"objectGroups": []
},
{
"description": "the labelOffset of the object.",
"fullName": "LabelOffset",
"functionType": "ExpressionAndCondition",
"name": "LabelOffset",
"private": true,
"sentence": "the labelOffset",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetReturnNumber"
},
"parameters": [
"LabelOffset"
]
}
]
}
],
"expressionType": {
"type": "expression"
},
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "PanelSpriteButton::PanelSpriteButton",
"type": "object"
}
],
"objectGroups": []
},
{
"fullName": "",
"functionType": "ActionWithOperator",
"getterName": "LabelOffset",
"name": "SetLabelOffset",
"private": true,
"sentence": "",
"events": [
{
"type": "BuiltinCommonInstructions::Standard",
"conditions": [],
"actions": [
{
"type": {
"value": "SetCenterY"
},
"parameters": [
"Labels",
"+",
"Value - LabelOffset"
]
},
{
"type": {
"value": "SetNumberVariable"
},
"parameters": [
"LabelOffset",
"=",
"Value"
]
}
]
}
],
"parameters": [
{
"description": "Object",
"name": "Object",
"supplementaryInformation": "PanelSpriteButton::PanelSpriteButton",
"type": "object"
}
],
"objectGroups": []
}
],
"eventsFunctionsFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"functionName": "onCreated"
},
{
"functionName": "onHotReloading"
},
{
"functionName": "doStepPostEvents"
},
{
"functionName": "IsIdle"
},
{
"functionName": "IsClicked"
},
{
"functionName": "IsHovered"
},
{
"functionName": "IsFocused"
},
{
"functionName": "IsPressed"
},
{
"functionName": "SetLabelText"
},
{
"functionName": "SetLabelTextOp"
},
{
"functionName": "LabelText"
},
{
"functionName": "Activate"
},
{
"functionName": "IsActivated"
},
{
"functionName": "LabelOffset"
},
{
"functionName": "SetLabelOffset"
}
]
},
"propertyDescriptors": [
{
"value": "",
"type": "MultilineString",
"label": "Label",
"name": "LabelText"
},
{
"value": "0.25",
"type": "Number",
"unit": "Second",
"label": "Hovered fade out duration",
"group": "States",
"name": "HoveredFadeOutDuration"
},
{
"value": "0",
"type": "Number",
"unit": "Pixel",
"label": "Label offset on Y axis when pressed",
"group": "States",
"name": "PressedLabelOffsetY"
},
{
"value": "0",
"type": "Number",
"unit": "Pixel",
"label": "",
"group": "States",
"hidden": true,
"name": "LabelOffset"
},
{
"value": "",
"type": "Choice",
"label": "",
"choices": [
{
"label": "Label.Text=LabelText",
"value": "Label.Text=LabelText"
},
{
"label": "BitmapLabel.Text=LabelText",
"value": "BitmapLabel.Text=LabelText"
}
],
"hidden": true,
"name": "_PropertyMapping"
}
],
"propertiesFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"propertyName": "LabelText"
},
{
"propertyName": "_PropertyMapping"
},
{
"folderName": "States",
"children": [
{
"propertyName": "HoveredFadeOutDuration"
},
{
"propertyName": "PressedLabelOffsetY"
},
{
"propertyName": "LabelOffset"
}
]
}
]
},
"variants": [
{
"areaMaxX": 128,
"areaMaxY": 48,
"areaMaxZ": 64,
"areaMinX": 0,
"areaMinY": 0,
"areaMinZ": 0,
"assetStoreAssetId": "80b9ddd78c8727888bb53c7524f443682746667b1ba493c223114c04e7661bbf",
"assetStoreOriginalName": "Small Blue Button",
"name": "Small Blue Button",
"objects": [
{
"assetStoreId": "",
"bold": false,
"italic": false,
"name": "Label",
"smoothed": true,
"type": "TextObject::Text",
"underlined": false,
"variables": [],
"effects": [],
"behaviors": [
{
"name": "Anchor",
"type": "AnchorBehavior::AnchorBehavior",
"bottomEdgeAnchor": 4,
"topEdgeAnchor": 4,
"leftEdgeAnchor": 1,
"relativeToOriginalWindowSize": true,
"rightEdgeAnchor": 2,
"useLegacyBottomAndRightAnchors": false
},
{
"name": "TextStyleState",
"type": "PanelSpriteButton::TextStyleState",
"ShouldEnableOutlineOnHover": false,
"HoverColor": "",
"ShouldEnableShadowOnHover": false,
"HoverFontSize": 0,
"IsHovered": false,
"IdleFontSize": 0,
"IdleColor": ""
}
],
"string": "Text",
"font": "",
"textAlignment": "center",
"characterSize": 20,
"color": {
"b": 0,
"g": 0,
"r": 0
},
"content": {
"bold": false,
"isOutlineEnabled": false,
"isShadowEnabled": false,
"italic": false,
"outlineColor": "255;255;255",
"outlineThickness": 2,
"shadowAngle": 90,
"shadowBlurRadius": 2,
"shadowColor": "0;0;0",
"shadowDistance": 4,
"shadowOpacity": 127,
"smoothed": true,
"underlined": false,
"text": "Text",
"font": "",
"textAlignment": "center",
"verticalTextAlignment": "center",
"characterSize": 20,
"lineHeight": 0,
"color": "0;0;0"
}
},
{
"assetStoreId": "",
"bottomMargin": 5,
"height": 32,
"leftMargin": 3,
"name": "Idle",
"rightMargin": 3,
"texture": "assets\\Small Blue Button_Idle.png",
"tiled": false,
"topMargin": 3,
"type": "PanelSpriteObject::PanelSprite",
"width": 32,
"variables": [
{
"folded": true,
"name": "State",
"type": "string",
"value": "Idle"
}
],
"effects": [],
"behaviors": [
{
"name": "Anchor",
"type": "AnchorBehavior::AnchorBehavior",
"bottomEdgeAnchor": 2,
"leftEdgeAnchor": 1,
"relativeToOriginalWindowSize": true,
"rightEdgeAnchor": 2,
"topEdgeAnchor": 1,
"useLegacyBottomAndRightAnchors": false
},
{
"name": "ButtonFSM",
"type": "PanelSpriteButton::ButtonFSM",
"ShouldCheckHovering": true
}
]
},
{
"assetStoreId": "",
"bottomMargin": 5,
"height": 32,
"leftMargin": 3,
"name": "Hovered",
"rightMargin": 3,
"texture": "assets\\Small Blue Button_Hovered.png",
"tiled": false,
"topMargin": 3,
"type": "PanelSpriteObject::PanelSprite",
"width": 32,
"variables": [],
"effects": [],
"behaviors": [
{
"name": "Anchor",
"type": "AnchorBehavior::AnchorBehavior",
"bottomEdgeAnchor": 2,
"leftEdgeAnchor": 1,
"relativeToOriginalWindowSize": true,
"rightEdgeAnchor": 2,
"topEdgeAnchor": 1,
"useLegacyBottomAndRightAnchors": false
},
{
"name": "Tween",
"type": "Tween::TweenBehavior"
}
]
},
{
"assetStoreId": "",
"bottomMargin": 3,
"height": 32,
"leftMargin": 3,
"name": "Pressed",
"rightMargin": 3,
"texture": "assets\\Small Blue Button_Pressed.png",
"tiled": false,
"topMargin": 3,
"type": "PanelSpriteObject::PanelSprite",
"width": 32,
"variables": [],
"effects": [],
"behaviors": [
{
"name": "Anchor",
"type": "AnchorBehavior::AnchorBehavior",
"bottomEdgeAnchor": 2,
"leftEdgeAnchor": 1,
"relativeToOriginalWindowSize": true,
"rightEdgeAnchor": 2,
"topEdgeAnchor": 1,
"useLegacyBottomAndRightAnchors": false
}
]
},
{
"assetStoreId": "",
"name": "BitmapLabel",
"type": "BitmapText::BitmapTextObject",
"variables": [],
"effects": [],
"behaviors": [
{
"name": "Anchor",
"type": "AnchorBehavior::AnchorBehavior",
"bottomEdgeAnchor": 4,
"topEdgeAnchor": 4,
"leftEdgeAnchor": 1,
"relativeToOriginalWindowSize": true,
"rightEdgeAnchor": 2,
"useLegacyBottomAndRightAnchors": false
},
{
"name": "BitmapTextStyleState",
"type": "PanelSpriteButton::BitmapTextStyleState",
"HoverColor": "",
"HoverPrefix": "",
"HoverSuffix": "",
"IsHovered": false,
"IdleText": "",
"IdleColor": ""
}
],
"content": {
"text": "Button",
"opacity": 255,
"scale": 1,
"fontSize": 20,
"tint": "255;255;255",
"bitmapFontResourceName": "assets\\8BitOperatorPlus8Regular_Edited.fnt",
"textureAtlasResourceName": "assets\\8BitOperatorPlus8Regular_Edited.png",
"align": "center",
"verticalTextAlignment": "center"
}
}
],
"objectsFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"objectName": "Label"
},
{
"objectName": "BitmapLabel"
},
{
"objectName": "Idle"
},
{
"objectName": "Hovered"
},
{
"objectName": "Pressed"
}
]
},
"objectsGroups": [
{
"name": "Background",
"objects": [
{
"name": "Idle"
},
{
"name": "Hovered"
},
{
"name": "Pressed"
}
]
},
{
"name": "Labels",
"objects": [
{
"name": "Label"
},
{
"name": "BitmapLabel"
}
]
}
],
"layers": [
{
"ambientLightColorB": 200,
"ambientLightColorG": 200,
"ambientLightColorR": 200,
"camera2DPlaneMaxDrawingDistance": 5000,
"camera3DFarPlaneDistance": 10000,
"camera3DFieldOfView": 45,
"camera3DNearPlaneDistance": 3,
"cameraType": "",
"followBaseLayerCamera": false,
"isLightingLayer": false,
"isLocked": false,
"name": "",
"renderingType": "",
"visibility": true,
"cameras": [
{
"defaultSize": true,
"defaultViewport": true,
"height": 0,
"viewportBottom": 1,
"viewportLeft": 0,
"viewportRight": 1,
"viewportTop": 0,
"width": 0
}
],
"effects": []
}
],
"instances": [
{
"angle": 0,
"customSize": true,
"depth": 1,
"height": 48,
"layer": "",
"name": "Idle",
"persistentUuid": "24882334-eec8-403e-8bf1-70fc928a46e6",
"width": 128,
"x": 0,
"y": 0,
"zOrder": 1,
"numberProperties": [],
"stringProperties": [],
"initialVariables": []
},
{
"angle": 0,
"customSize": true,
"depth": 1,
"height": 48,
"keepRatio": true,
"layer": "",
"name": "BitmapLabel",
"persistentUuid": "c3c3200d-dec4-4ac4-9dc5-4715d8989830",
"width": 128,
"x": 5,
"y": 26,
"zOrder": 2,
"numberProperties": [],
"stringProperties": [],
"initialVariables": []
}
],
"editionSettings": []
},
{
"areaMaxX": 68,
"areaMaxY": 28,
"areaMaxZ": 64,
"areaMinX": 0,
"areaMinY": 0,
"areaMinZ": 0,
"assetStoreAssetId": "90c9b872a1439405f56d1591e01d6b9fe5dadc4dc1c3afc0bdd98f763b340fa0",
"assetStoreOriginalName": "Tiny Blue Button",
"name": "Tiny Blue Button",
"objects": [
{
"assetStoreId": "",
"bold": false,
"italic": false,
"name": "Label",
"smoothed": true,
"type": "TextObject::Text",
"underlined": false,
"variables": [],
"effects": [],
"behaviors": [
{
"name": "Anchor",
"type": "AnchorBehavior::AnchorBehavior",
"bottomEdgeAnchor": 4,
"topEdgeAnchor": 4,
"leftEdgeAnchor": 1,
"relativeToOriginalWindowSize": true,
"rightEdgeAnchor": 2,
"useLegacyBottomAndRightAnchors": false
},
{
"name": "TextStyleState",
"type": "PanelSpriteButton::TextStyleState",
"ShouldEnableOutlineOnHover": false,
"HoverColor": "",
"ShouldEnableShadowOnHover": false,
"HoverFontSize": 0,
"IsHovered": false,
"IdleFontSize": 0,
"IdleColor": ""
}
],
"string": "Text",
"font": "",
"textAlignment": "center",
"characterSize": 20,
"color": {
"b": 0,
"g": 0,
"r": 0
},
"content": {
"bold": false,
"isOutlineEnabled": false,
"isShadowEnabled": false,
"italic": false,
"outlineColor": "255;255;255",
"outlineThickness": 2,
"shadowAngle": 90,
"shadowBlurRadius": 2,
"shadowColor": "0;0;0",
"shadowDistance": 4,
"shadowOpacity": 127,
"smoothed": true,
"underlined": false,
"text": "Text",
"font": "",
"textAlignment": "center",
"verticalTextAlignment": "center",
"characterSize": 20,
"lineHeight": 0,
"color": "0;0;0"
}
},
{
"assetStoreId": "",
"bottomMargin": 5,
"height": 32,
"leftMargin": 3,
"name": "Idle",
"rightMargin": 3,
"texture": "assets\\Small Blue Button_Idle.png",
"tiled": false,
"topMargin": 3,
"type": "PanelSpriteObject::PanelSprite",
"width": 32,
"variables": [
{
"folded": true,
"name": "State",
"type": "string",
"value": "Idle"
}
],
"effects": [],
"behaviors": [
{
"name": "Anchor",
"type": "AnchorBehavior::AnchorBehavior",
"bottomEdgeAnchor": 2,
"leftEdgeAnchor": 1,
"relativeToOriginalWindowSize": true,
"rightEdgeAnchor": 2,
"topEdgeAnchor": 1,
"useLegacyBottomAndRightAnchors": false
},
{
"name": "ButtonFSM",
"type": "PanelSpriteButton::ButtonFSM",
"ShouldCheckHovering": true
}
]
},
{
"assetStoreId": "",
"bottomMargin": 5,
"height": 32,
"leftMargin": 3,
"name": "Hovered",
"rightMargin": 3,
"texture": "assets\\Small Blue Button_Hovered.png",
"tiled": false,
"topMargin": 3,
"type": "PanelSpriteObject::PanelSprite",
"width": 32,
"variables": [],
"effects": [],
"behaviors": [
{
"name": "Anchor",
"type": "AnchorBehavior::AnchorBehavior",
"bottomEdgeAnchor": 2,
"leftEdgeAnchor": 1,
"relativeToOriginalWindowSize": true,
"rightEdgeAnchor": 2,
"topEdgeAnchor": 1,
"useLegacyBottomAndRightAnchors": false
},
{
"name": "Tween",
"type": "Tween::TweenBehavior"
}
]
},
{
"assetStoreId": "",
"bottomMargin": 3,
"height": 32,
"leftMargin": 3,
"name": "Pressed",
"rightMargin": 3,
"texture": "assets\\Small Blue Button_Pressed.png",
"tiled": false,
"topMargin": 3,
"type": "PanelSpriteObject::PanelSprite",
"width": 32,
"variables": [],
"effects": [],
"behaviors": [
{
"name": "Anchor",
"type": "AnchorBehavior::AnchorBehavior",
"bottomEdgeAnchor": 2,
"leftEdgeAnchor": 1,
"relativeToOriginalWindowSize": true,
"rightEdgeAnchor": 2,
"topEdgeAnchor": 1,
"useLegacyBottomAndRightAnchors": false
}
]
},
{
"assetStoreId": "",
"name": "BitmapLabel",
"type": "BitmapText::BitmapTextObject",
"variables": [],
"effects": [],
"behaviors": [
{
"name": "Anchor",
"type": "AnchorBehavior::AnchorBehavior",
"bottomEdgeAnchor": 4,
"topEdgeAnchor": 4,
"leftEdgeAnchor": 1,
"relativeToOriginalWindowSize": true,
"rightEdgeAnchor": 2,
"useLegacyBottomAndRightAnchors": false
},
{
"name": "BitmapTextStyleState",
"type": "PanelSpriteButton::BitmapTextStyleState",
"HoverColor": "",
"HoverPrefix": "",
"HoverSuffix": "",
"IsHovered": false,
"IdleText": "",
"IdleColor": ""
}
],
"content": {
"text": "Button",
"opacity": 255,
"scale": 0.5,
"fontSize": 20,
"tint": "255;255;255",
"bitmapFontResourceName": "assets\\8BitOperatorPlus8Regular_Edited.fnt",
"textureAtlasResourceName": "assets\\8BitOperatorPlus8Regular_Edited.png",
"align": "center",
"verticalTextAlignment": "center"
}
}
],
"objectsFolderStructure": {
"folderName": "__ROOT",
"children": [
{
"objectName": "Label"
},
{
"objectName": "BitmapLabel"
},
{
"objectName": "Idle"
},
{
"objectName": "Hovered"
},
{
"objectName": "Pressed"
}
]
},
"objectsGroups": [
{
"name": "Background",
"objects": [
{
"name": "Idle"
},
{
"name": "Hovered"
},
{
"name": "Pressed"
}
]
},
{
"name": "Labels",
"objects": [
{
"name": "Label"
},
{
"name": "BitmapLabel"
}
]
}
],
"layers": [
{
"ambientLightColorB": 200,
"ambientLightColorG": 200,
"ambientLightColorR": 200,
"camera2DPlaneMaxDrawingDistance": 5000,
"camera3DFarPlaneDistance": 10000,
"camera3DFieldOfView": 45,
"camera3DNearPlaneDistance": 3,
"cameraType": "",
"followBaseLayerCamera": false,
"isLightingLayer": false,
"isLocked": false,
"name": "",
"renderingType": "",
"visibility": true,
"cameras": [
{
"defaultSize": true,
"defaultViewport": true,
"height": 0,
"viewportBottom": 1,
"viewportLeft": 0,
"viewportRight": 1,
"viewportTop": 0,
"width": 0
}
],
"effects": []
}
],
"instances": [
{
"angle": 0,
"customSize": true,
"depth": 1,
"height": 28,
"layer": "",
"name": "Idle",
"persistentUuid": "24882334-eec8-403e-8bf1-70fc928a46e6",
"width": 68,
"x": 0,
"y": 0,
"zOrder": 1,
"numberProperties": [],
"stringProperties": [],
"initialVariables": []
},
{
"angle": 0,
"customSize": true,
"depth": 1.04,
"height": 28,
"layer": "",
"name": "BitmapLabel",
"persistentUuid": "c3c3200d-dec4-4ac4-9dc5-4715d8989830",
"width": 64,
"x": 5,
"y": 14,
"zOrder": 2,
"numberProperties": [],
"stringProperties": [],
"initialVariables": []
}
],
"editionSettings": []
}
]
}
]
}
],
"externalLayouts": [
{
"associatedLayout": "",
"name": "functions",
"instances": [],
"editionSettings": {}
}
]
}