From 5dc494b8a7a8929e03201ce16ef657f028801fab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Tue, 16 Sep 2025 19:47:55 +0200 Subject: [PATCH 1/6] [Gamepad tester] Allow to check if a gamepad works correctly with the extension --- examples/gamepad-tester/Gamepad tester.json | 13648 ++++++++++++++++ examples/gamepad-tester/README.md | 1 + examples/gamepad-tester/assets/A Button.png | Bin 0 -> 4548 bytes examples/gamepad-tester/assets/B Button.png | Bin 0 -> 4250 bytes examples/gamepad-tester/assets/Back.png | Bin 0 -> 3141 bytes examples/gamepad-tester/assets/Back_Alt.png | Bin 0 -> 3144 bytes examples/gamepad-tester/assets/Bar.png | Bin 0 -> 202 bytes examples/gamepad-tester/assets/Cursor.png | Bin 0 -> 123 bytes examples/gamepad-tester/assets/Down.png | Bin 0 -> 658 bytes .../gamepad-tester/assets/Dpad_Default.png | Bin 0 -> 4929 bytes examples/gamepad-tester/assets/Dpad_Down.png | Bin 0 -> 5248 bytes examples/gamepad-tester/assets/Dpad_Left.png | Bin 0 -> 5201 bytes examples/gamepad-tester/assets/Dpad_Right.png | Bin 0 -> 5173 bytes examples/gamepad-tester/assets/Dpad_Up.png | Bin 0 -> 5157 bytes examples/gamepad-tester/assets/LB.png | Bin 0 -> 3007 bytes examples/gamepad-tester/assets/LT.png | Bin 0 -> 2862 bytes .../assets/Left Stick Click.png | Bin 0 -> 2980 bytes examples/gamepad-tester/assets/Left Stick.png | Bin 0 -> 3840 bytes examples/gamepad-tester/assets/Left.png | Bin 0 -> 715 bytes .../gamepad-tester/assets/NewPanelSprite.png | Bin 0 -> 119 bytes .../On Screen Controls Button_Hovered.png | Bin 0 -> 486 bytes .../assets/On Screen Controls Button_Idle.png | Bin 0 -> 476 bytes .../On Screen Controls Button_Pressed.png | Bin 0 -> 547 bytes examples/gamepad-tester/assets/RB.png | Bin 0 -> 2799 bytes examples/gamepad-tester/assets/RT.png | Bin 0 -> 3066 bytes .../assets/Right Stick Click.png | Bin 0 -> 3311 bytes .../gamepad-tester/assets/Right Stick.png | Bin 0 -> 4144 bytes examples/gamepad-tester/assets/Right.png | Bin 0 -> 761 bytes .../gamepad-tester/assets/Roboto-Bold.ttf | Bin 0 -> 167336 bytes examples/gamepad-tester/assets/Start.png | Bin 0 -> 3098 bytes examples/gamepad-tester/assets/Start_Alt.png | Bin 0 -> 3022 bytes .../gamepad-tester/assets/Transparent.png | Bin 0 -> 427 bytes examples/gamepad-tester/assets/Up.png | Bin 0 -> 647 bytes examples/gamepad-tester/assets/X Button.png | Bin 0 -> 4575 bytes examples/gamepad-tester/assets/Y Button.png | Bin 0 -> 4346 bytes 35 files changed, 13649 insertions(+) create mode 100644 examples/gamepad-tester/Gamepad tester.json create mode 100644 examples/gamepad-tester/README.md create mode 100644 examples/gamepad-tester/assets/A Button.png create mode 100644 examples/gamepad-tester/assets/B Button.png create mode 100644 examples/gamepad-tester/assets/Back.png create mode 100644 examples/gamepad-tester/assets/Back_Alt.png create mode 100644 examples/gamepad-tester/assets/Bar.png create mode 100644 examples/gamepad-tester/assets/Cursor.png create mode 100644 examples/gamepad-tester/assets/Down.png create mode 100644 examples/gamepad-tester/assets/Dpad_Default.png create mode 100644 examples/gamepad-tester/assets/Dpad_Down.png create mode 100644 examples/gamepad-tester/assets/Dpad_Left.png create mode 100644 examples/gamepad-tester/assets/Dpad_Right.png create mode 100644 examples/gamepad-tester/assets/Dpad_Up.png create mode 100644 examples/gamepad-tester/assets/LB.png create mode 100644 examples/gamepad-tester/assets/LT.png create mode 100644 examples/gamepad-tester/assets/Left Stick Click.png create mode 100644 examples/gamepad-tester/assets/Left Stick.png create mode 100644 examples/gamepad-tester/assets/Left.png create mode 100644 examples/gamepad-tester/assets/NewPanelSprite.png create mode 100644 examples/gamepad-tester/assets/On Screen Controls Button_Hovered.png create mode 100644 examples/gamepad-tester/assets/On Screen Controls Button_Idle.png create mode 100644 examples/gamepad-tester/assets/On Screen Controls Button_Pressed.png create mode 100644 examples/gamepad-tester/assets/RB.png create mode 100644 examples/gamepad-tester/assets/RT.png create mode 100644 examples/gamepad-tester/assets/Right Stick Click.png create mode 100644 examples/gamepad-tester/assets/Right Stick.png create mode 100644 examples/gamepad-tester/assets/Right.png create mode 100644 examples/gamepad-tester/assets/Roboto-Bold.ttf create mode 100644 examples/gamepad-tester/assets/Start.png create mode 100644 examples/gamepad-tester/assets/Start_Alt.png create mode 100644 examples/gamepad-tester/assets/Transparent.png create mode 100644 examples/gamepad-tester/assets/Up.png create mode 100644 examples/gamepad-tester/assets/X Button.png create mode 100644 examples/gamepad-tester/assets/Y Button.png diff --git a/examples/gamepad-tester/Gamepad tester.json b/examples/gamepad-tester/Gamepad tester.json new file mode 100644 index 000000000..7565c31e6 --- /dev/null +++ b/examples/gamepad-tester/Gamepad tester.json @@ -0,0 +1,13648 @@ +{ + "firstLayout": "", + "gdVersion": { + "build": 240, + "major": 5, + "minor": 5, + "revision": 0 + }, + "properties": { + "adaptGameResolutionAtRuntime": true, + "antialiasingMode": "MSAA", + "antialisingEnabledOnMobile": false, + "folderProject": false, + "orientation": "landscape", + "packageName": "com.example.gamename", + "pixelsRounding": false, + "projectUuid": "e8d00b56-1407-478d-80c6-e7eb31c2254d", + "scaleMode": "linear", + "sizeOnStartupMode": "adaptWidth", + "templateSlug": "", + "version": "1.0.0", + "name": "Gamepad tester", + "description": "", + "author": "", + "windowWidth": 840, + "windowHeight": 860, + "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/Dpad_Default.png", + "kind": "image", + "metadata": "", + "name": "Dpad_Default.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Console Inputs/Xbox 360/0646ac975733f6359afe745db6aa3485d8633657d8bd49ac6b110935f622d484_Dpad_Default.png", + "name": "Dpad_Default.png" + } + }, + { + "file": "assets/Dpad_Down.png", + "kind": "image", + "metadata": "", + "name": "Dpad_Down.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Console Inputs/Xbox 360/2b9d2360492a3423955138cfbb35bdf566afacbb46873b5460e33a56543234e7_Dpad_Down.png", + "name": "Dpad_Down.png" + } + }, + { + "file": "assets/Dpad_Left.png", + "kind": "image", + "metadata": "", + "name": "Dpad_Left.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Console Inputs/Xbox 360/04b37b0b448e61b5fff2c2d9ac5080d7fb71a0007c70e0075b75f8911e3cb7a7_Dpad_Left.png", + "name": "Dpad_Left.png" + } + }, + { + "file": "assets/Dpad_Right.png", + "kind": "image", + "metadata": "", + "name": "Dpad_Right.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Console Inputs/Xbox 360/9a7a47a4639899d3d453ba654ecf28811d8197ae82fdd8631e39f5c993e10945_Dpad_Right.png", + "name": "Dpad_Right.png" + } + }, + { + "file": "assets/Dpad_Up.png", + "kind": "image", + "metadata": "", + "name": "Dpad_Up.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Console Inputs/Xbox 360/9674fdf3c92db97a8924838427a99f5a00c9a8ccfd88510f78181baefe72a318_Dpad_Up.png", + "name": "Dpad_Up.png" + } + }, + { + "file": "assets/LB.png", + "kind": "image", + "metadata": "", + "name": "LB.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Console Inputs/Xbox 360/dfb86c344a74cec281ea03ceeda5847208cbee1afe36a3e4d5e6c4beda34aa22_LB.png", + "name": "LB.png" + } + }, + { + "file": "assets/A Button.png", + "kind": "image", + "metadata": "", + "name": "A Button.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Console Inputs/Xbox 360/cf8c925d84fb64b73f2ace1e72470fad2b8bfe4dfecba19c9b902d831acada96_A Button.png", + "name": "A Button.png" + } + }, + { + "file": "assets/Left Stick Click.png", + "kind": "image", + "metadata": "", + "name": "Left Stick Click.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Console Inputs/Xbox 360/418401dd0b247aeb7638c1a5e9f9aad4f75ad8caf54bc68968bb0bbf2bfd2426_Left Stick Click.png", + "name": "Left Stick Click.png" + } + }, + { + "file": "assets/B Button.png", + "kind": "image", + "metadata": "", + "name": "B Button.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Console Inputs/Xbox 360/652de6822294c083b5d3ba3d27bd5b3311a62d5f8fbe69ed5fc9572ab3042e95_B Button.png", + "name": "B Button.png" + } + }, + { + "file": "assets/Back.png", + "kind": "image", + "metadata": "", + "name": "Back.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Console Inputs/Xbox 360/1178b0073bf2e7b5ae2b4088461206d78c1893e7bfd8bbd7d428d45c8218ef39_Back.png", + "name": "Back.png" + } + }, + { + "file": "assets/Back_Alt.png", + "kind": "image", + "metadata": "", + "name": "Back_Alt.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Console Inputs/Xbox 360/18af8869613dcd35d313efe4de12045ddc9757ee0cde080096e74d948a67253c_Back_Alt.png", + "name": "Back_Alt.png" + } + }, + { + "file": "assets/RB.png", + "kind": "image", + "metadata": "", + "name": "RB.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Console Inputs/Xbox 360/56f44c5a357cafa9ebdf925e13ab665a546139e51e34caf563b8014dc8cb910d_RB.png", + "name": "RB.png" + } + }, + { + "file": "assets/LT.png", + "kind": "image", + "metadata": "", + "name": "LT.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Console Inputs/Xbox 360/629601a282d3c00e610c9447658c93facdb8467938aa2431e15fb48e9f58a810_LT.png", + "name": "LT.png" + } + }, + { + "file": "assets/RT.png", + "kind": "image", + "metadata": "", + "name": "RT.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Console Inputs/Xbox 360/4482c63e950b80983a869795cef5236d5699cd60ed16b1bf51c355682577ba2a_RT.png", + "name": "RT.png" + } + }, + { + "file": "assets/Right Stick Click.png", + "kind": "image", + "metadata": "", + "name": "Right Stick Click.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Console Inputs/Xbox 360/75c3e2556fb53f13008261d06553fd1e1655e4edd7c3774e80c1035ec4941ce8_Right Stick Click.png", + "name": "Right Stick Click.png" + } + }, + { + "file": "assets/Left Stick.png", + "kind": "image", + "metadata": "", + "name": "Left Stick.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Console Inputs/Xbox 360/e16dff8da2fb4af9e6059ab5d2070e74786de2dcea998ada317acf35fb9663be_Left Stick.png", + "name": "Left Stick.png" + } + }, + { + "file": "assets/Right Stick.png", + "kind": "image", + "metadata": "", + "name": "Right Stick.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Console Inputs/Xbox 360/26d0570902aad40c0f3bf66c6c01a55e7a7b8baa2ea99159f222788b9e5b56b7_Right Stick.png", + "name": "Right Stick.png" + } + }, + { + "file": "assets/Start.png", + "kind": "image", + "metadata": "", + "name": "Start.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Console Inputs/Xbox 360/255e3dba9245839aa1d05a14e2e77bb6124b1db790c838bf1ed12bea1c6d8d8e_Start.png", + "name": "Start.png" + } + }, + { + "file": "assets/Start_Alt.png", + "kind": "image", + "metadata": "", + "name": "Start_Alt.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Console Inputs/Xbox 360/af87394b4707010a2281763087265785806d2b7186ca81954397d17e923d5b3c_Start_Alt.png", + "name": "Start_Alt.png" + } + }, + { + "file": "assets/Y Button.png", + "kind": "image", + "metadata": "", + "name": "Y Button.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Console Inputs/Xbox 360/0453bcf88c659688e8fc13e61a60d24769a49eb8fd60db2233be4ccca4f7f45d_Y Button.png", + "name": "Y Button.png" + } + }, + { + "file": "assets/X Button.png", + "kind": "image", + "metadata": "", + "name": "X Button.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Console Inputs/Xbox 360/d4b62d45ba580b0d065a9a1e417721becda184b28cdaeb9e4bd6496dddbeb44f_X Button.png", + "name": "X Button.png" + } + }, + { + "file": "assets/NewPanelSprite.png", + "kind": "image", + "metadata": "{\"extension\":\".png\",\"pskl\":{},\"localFilePath\":\"assets/NewPanelSprite.png\"}", + "name": "NewPanelSprite", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/On Screen Controls Button_Hovered.png", + "kind": "image", + "metadata": "", + "name": "On Screen Controls Button_Hovered.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Menu buttons/16e804dda11f82902d6b7469420d7b3b81d68ef00af71783070dd284114e8cdc_On Screen Controls Button_Hovered.png", + "name": "On Screen Controls Button_Hovered.png" + } + }, + { + "file": "assets/On Screen Controls Button_Idle.png", + "kind": "image", + "metadata": "", + "name": "On Screen Controls Button_Idle.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Menu buttons/174644b98156cc55e10a4eb991aebb06e0a2c9f98915abb1422cababc3124de3_On Screen Controls Button_Idle.png", + "name": "On Screen Controls Button_Idle.png" + } + }, + { + "file": "assets/On Screen Controls Button_Pressed.png", + "kind": "image", + "metadata": "", + "name": "On Screen Controls Button_Pressed.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Menu buttons/5a44f1cb97ef7da59c97179346b71d3f5b913af0208795784707c062fc20749f_On Screen Controls Button_Pressed.png", + "name": "On Screen Controls Button_Pressed.png" + } + }, + { + "file": "assets/Roboto-Bold.ttf", + "kind": "font", + "metadata": "", + "name": "Roboto-Bold.ttf", + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Menu buttons/3bd40ac788d44626fd640ec67ef04ab0364816b5e8c831f2077bff8805cfe689_Roboto-Bold.ttf", + "name": "Roboto-Bold.ttf" + } + }, + { + "file": "assets/Cursor.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "Cursor", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Transparent.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "Transparent", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Down.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "Down", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Up.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "Up", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Left.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "Left", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Right.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "Right", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Bar.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "Bar", + "smoothed": true, + "userAdded": false + } + ], + "resourceFolders": [] + }, + "objects": [], + "objectsFolderStructure": { + "folderName": "__ROOT" + }, + "objectsGroups": [], + "variables": [], + "layouts": [ + { + "b": 27, + "disableInputWhenNotFocused": true, + "mangledName": "GamepadTester", + "name": "GamepadTester", + "r": 27, + "standardSortMethod": true, + "stopSoundsOnStartup": true, + "title": "", + "v": 27, + "uiSettings": { + "grid": false, + "gridType": "rectangular", + "gridWidth": 32, + "gridHeight": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": false, + "zoomFactor": 0.546875, + "windowMask": false + }, + "objectsGroups": [], + "variables": [], + "instances": [], + "objects": [ + { + "assetStoreId": "", + "name": "GamepadTester", + "type": "GamepadTester::GamepadTester", + "variant": "", + "variables": [], + "effects": [], + "behaviors": [], + "content": {} + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "GamepadTester" + } + ] + }, + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "4", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PlayerId", + "+", + "1" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "GamepadTester", + "0", + "220 * (PlayerId - 1)", + "" + ] + }, + { + "type": { + "value": "GamepadTester::GamepadTester::SetPlayerId" + }, + "parameters": [ + "GamepadTester", + "=", + "PlayerId", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GamepadTester::GamepadTester::PlayerId" + }, + "parameters": [ + "GamepadTester", + "=", + "PlayerId", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "OpacityCapability::OpacityBehavior::SetValue" + }, + "parameters": [ + "GamepadTester", + "Opacity", + "=", + "63" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Controller_X_is_connected" + }, + "parameters": [ + "", + "PlayerId", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "OpacityCapability::OpacityBehavior::SetValue" + }, + "parameters": [ + "GamepadTester", + "Opacity", + "=", + "255" + ] + } + ] + } + ] + } + ] + } + ], + "variables": [ + { + "name": "PlayerId", + "type": "number", + "value": 0 + } + ] + } + ], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "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": "Effect", + "type": "EffectCapability::EffectBehavior" + }, + { + "name": "Flippable", + "type": "FlippableCapability::FlippableBehavior" + }, + { + "name": "Opacity", + "type": "OpacityCapability::OpacityBehavior" + }, + { + "name": "Resizable", + "type": "ResizableCapability::ResizableBehavior" + }, + { + "name": "Scale", + "type": "ScalableCapability::ScalableBehavior" + } + ] + } + ], + "externalEvents": [], + "eventsFunctionsExtensions": [ + { + "author": "", + "category": "", + "extensionNamespace": "", + "fullName": "", + "gdevelopVersion": "", + "helpPath": "", + "iconUrl": "", + "name": "GamepadTester", + "previewIconUrl": "", + "shortDescription": "", + "version": "", + "description": "", + "tags": [], + "authorIds": [], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "", + "fullName": "Button", + "name": "Button", + "objectType": "Sprite", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Button_pressed" + }, + "parameters": [ + "", + "PlayerId", + "Name", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "\"Pressed\"", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Button_released" + }, + "parameters": [ + "", + "PlayerId", + "Name", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "\"Pressed\"", + "no" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "GamepadTester::Button", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the player identifier of the object.", + "fullName": "Player identifier", + "functionType": "ExpressionAndCondition", + "group": "Button configuration", + "name": "PlayerId", + "sentence": "the player identifier", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PlayerId" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "GamepadTester::Button", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PlayerId", + "name": "SetPlayerId", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PlayerId", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "GamepadTester::Button", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "A", + "type": "String", + "label": "", + "name": "Name" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Player identifier", + "name": "PlayerId" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [ + { + "areaMaxX": 840, + "areaMaxY": 200, + "areaMaxZ": 1, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, + "defaultName": "", + "description": "", + "fullName": "Gamepad tester", + "isUsingLegacyInstancesRenderer": false, + "name": "GamepadTester", + "objects": [ + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "37fa98902c88739c3ffe1b8a7bda62f4844d0c657312ce19656f16760552a3cb", + "name": "Dpad", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Default", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Dpad_Default.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 5, + "y": 6 + }, + { + "x": 95, + "y": 6 + }, + { + "x": 95, + "y": 95 + }, + { + "x": 5, + "y": 95 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Down", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Dpad_Down.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 5, + "y": 6 + }, + { + "x": 95, + "y": 6 + }, + { + "x": 95, + "y": 95 + }, + { + "x": 5, + "y": 95 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Left", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Dpad_Left.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 5, + "y": 6 + }, + { + "x": 95, + "y": 6 + }, + { + "x": 95, + "y": 95 + }, + { + "x": 5, + "y": 95 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Right", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Dpad_Right.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 5, + "y": 6 + }, + { + "x": 95, + "y": 6 + }, + { + "x": 95, + "y": 95 + }, + { + "x": 5, + "y": 95 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Up", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Dpad_Up.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 5, + "y": 6 + }, + { + "x": 95, + "y": 6 + }, + { + "x": 95, + "y": 95 + }, + { + "x": 5, + "y": 95 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "63e800d73fa8ad37fe62048b9636746a0743eca41b7ff21f1dfe54e9eb4a622d", + "name": "LB", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [ + { + "effectType": "Adjustment", + "name": "Pressed", + "doubleParameters": { + "alpha": 1, + "blue": 0.25, + "brightness": 1, + "contrast": 1, + "gamma": 1, + "green": 0.5, + "red": 1, + "saturation": 1 + }, + "stringParameters": {}, + "booleanParameters": {} + } + ], + "behaviors": [ + { + "name": "Button", + "type": "GamepadTester::Button", + "Name": "LB", + "PlayerId": 1 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "LB.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 5, + "y": 18 + }, + { + "x": 95, + "y": 18 + }, + { + "x": 95, + "y": 81 + }, + { + "x": 5, + "y": 81 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "ea970db0bc6a63cd9f137b830747e00f47539d2c8d5ce5ea61b01e3990d6ecd4", + "name": "A_Button", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [ + { + "effectType": "Adjustment", + "name": "Pressed", + "doubleParameters": { + "alpha": 1, + "blue": 1, + "brightness": 1.5, + "contrast": 1, + "gamma": 1, + "green": 1, + "red": 1, + "saturation": 1 + }, + "stringParameters": {}, + "booleanParameters": {} + } + ], + "behaviors": [ + { + "name": "Button", + "type": "GamepadTester::Button", + "Name": "A", + "PlayerId": 1 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "A Button.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 91, + "y": 9 + }, + { + "x": 91, + "y": 91 + }, + { + "x": 9, + "y": 91 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "c498d0fc043ffaa05e407d7a05ab14127968ed13755d38cc3685c96ac5c46808", + "name": "Left_Stick_Click", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Left Stick Click.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 7, + "y": 6 + }, + { + "x": 93, + "y": 6 + }, + { + "x": 93, + "y": 95 + }, + { + "x": 7, + "y": 95 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "38dc55b4d4a2f380516b392e9f6ff87827681b901f30b54d0494e74a4131e946", + "name": "B_Button", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [ + { + "effectType": "Adjustment", + "name": "Pressed", + "doubleParameters": { + "alpha": 1, + "blue": 1, + "brightness": 1.5, + "contrast": 1, + "gamma": 1, + "green": 1, + "red": 1, + "saturation": 1 + }, + "stringParameters": {}, + "booleanParameters": {} + } + ], + "behaviors": [ + { + "name": "Button", + "type": "GamepadTester::Button", + "Name": "B", + "PlayerId": 1 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "B Button.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 91, + "y": 9 + }, + { + "x": 91, + "y": 91 + }, + { + "x": 9, + "y": 91 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "4dfb0acd82800a9760bcd373ccde8c4504bd4c6564c494ab9929cc8c9e80d9c9", + "name": "Back", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [ + { + "effectType": "Adjustment", + "name": "Pressed", + "doubleParameters": { + "alpha": 1, + "blue": 0.25, + "brightness": 1, + "contrast": 1, + "gamma": 1, + "green": 0.5, + "red": 1, + "saturation": 1 + }, + "stringParameters": {}, + "booleanParameters": {} + } + ], + "behaviors": [ + { + "name": "Button", + "type": "GamepadTester::Button", + "Name": "Back", + "PlayerId": 1 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Back.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 16, + "y": 16 + }, + { + "x": 86, + "y": 16 + }, + { + "x": 86, + "y": 85 + }, + { + "x": 16, + "y": 85 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Alt", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Back_Alt.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 16, + "y": 16 + }, + { + "x": 86, + "y": 16 + }, + { + "x": 86, + "y": 85 + }, + { + "x": 16, + "y": 85 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "0e9ae800f7b0526066deaac80265563bdf6dd437f9c1b9ef94a8a9800ba66796", + "name": "RB", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [ + { + "effectType": "Adjustment", + "name": "Pressed", + "doubleParameters": { + "alpha": 1, + "blue": 0.25, + "brightness": 1, + "contrast": 1, + "gamma": 1, + "green": 0.5, + "red": 1, + "saturation": 1 + }, + "stringParameters": {}, + "booleanParameters": {} + } + ], + "behaviors": [ + { + "name": "Button", + "type": "GamepadTester::Button", + "Name": "RB", + "PlayerId": 1 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "RB.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 5, + "y": 18 + }, + { + "x": 95, + "y": 18 + }, + { + "x": 95, + "y": 81 + }, + { + "x": 5, + "y": 81 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "f7d2f057489149c5106f0c06ac1b416ac277008a8c622d1ecb8e1cc4c834f577", + "name": "Right_Stick_Click", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Right Stick Click.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 7, + "y": 6 + }, + { + "x": 93, + "y": 6 + }, + { + "x": 93, + "y": 95 + }, + { + "x": 7, + "y": 95 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "a238e4c9df097857e6b6077483f8e309bb076628a6362a7a62b988018e349528", + "name": "Start", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [ + { + "effectType": "Adjustment", + "name": "Pressed", + "doubleParameters": { + "alpha": 1, + "blue": 0.25, + "brightness": 1, + "contrast": 1, + "gamma": 1, + "green": 0.5, + "red": 1, + "saturation": 1 + }, + "stringParameters": {}, + "booleanParameters": {} + } + ], + "behaviors": [ + { + "name": "Button", + "type": "GamepadTester::Button", + "Name": "Start", + "PlayerId": 1 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Start.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 13, + "y": 16 + }, + { + "x": 88, + "y": 16 + }, + { + "x": 88, + "y": 85 + }, + { + "x": 13, + "y": 85 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Alt", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Start_Alt.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 13, + "y": 16 + }, + { + "x": 88, + "y": 16 + }, + { + "x": 88, + "y": 85 + }, + { + "x": 13, + "y": 85 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "12580e71b750cbaddbb1ed3a2e57efc217441d0cdf1ec5a992cbbd0a56fe0f95", + "name": "Y_Button", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [ + { + "effectType": "Adjustment", + "name": "Pressed", + "doubleParameters": { + "alpha": 1, + "blue": 1, + "brightness": 1.25, + "contrast": 1, + "gamma": 1, + "green": 1, + "red": 1, + "saturation": 1 + }, + "stringParameters": {}, + "booleanParameters": {} + } + ], + "behaviors": [ + { + "name": "Button", + "type": "GamepadTester::Button", + "Name": "Y", + "PlayerId": 1 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Y Button.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 91, + "y": 9 + }, + { + "x": 91, + "y": 91 + }, + { + "x": 9, + "y": 91 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "39d34ad6279a440643832d74d1703d157659bf302faef87be033209e88880828", + "name": "X_Button", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [ + { + "effectType": "Adjustment", + "name": "Pressed", + "doubleParameters": { + "alpha": 1, + "blue": 1, + "brightness": 1.5, + "contrast": 1, + "gamma": 1, + "green": 1, + "red": 1, + "saturation": 1 + }, + "stringParameters": {}, + "booleanParameters": {} + } + ], + "behaviors": [ + { + "name": "Button", + "type": "GamepadTester::Button", + "Name": "X", + "PlayerId": 1 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "X Button.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 91, + "y": 9 + }, + { + "x": 91, + "y": 91 + }, + { + "x": 9, + "y": 91 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "bottomMargin": 0, + "height": 32, + "leftMargin": 0, + "name": "Background", + "rightMargin": 0, + "texture": "NewPanelSprite", + "tiled": false, + "topMargin": 0, + "type": "PanelSpriteObject::PanelSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "bold": false, + "italic": false, + "name": "PlayerLabel", + "smoothed": true, + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "P1", + "font": "", + "textAlignment": "center", + "characterSize": 60, + "color": { + "b": 228, + "g": 228, + "r": 228 + }, + "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": "P1", + "font": "", + "textAlignment": "center", + "verticalTextAlignment": "center", + "characterSize": 60, + "lineHeight": 0, + "color": "228;228;228" + } + }, + { + "assetStoreId": "26f7912e497fefccd32817a0c24533c9304633b47c6e556065dc498219877e81", + "name": "RumbleButton", + "type": "PanelSpriteButton::PanelSpriteButton", + "variant": "On Screen Controls Button", + "variables": [], + "effects": [], + "behaviors": [], + "content": { + "LeftPadding": 0, + "RightPadding": 0, + "PressedLabelOffsetY": 1, + "BottomPadding": 0, + "TopPadding": 0, + "HoveredFadeOutDuration": 0.2, + "LabelText": "Rumble" + } + }, + { + "assetStoreId": "", + "name": "LeftStick", + "type": "GamepadTester::Stick", + "variant": "Left stick", + "variables": [], + "effects": [], + "behaviors": [], + "content": {} + }, + { + "assetStoreId": "", + "name": "RightStick", + "type": "GamepadTester::Stick", + "variant": "Right stick", + "variables": [], + "effects": [], + "behaviors": [], + "content": { + "Name": "Right" + } + }, + { + "assetStoreId": "", + "name": "LeftTrigger", + "type": "GamepadTester::Trigger", + "variant": "Left trigger", + "variables": [], + "effects": [], + "behaviors": [], + "content": {} + }, + { + "assetStoreId": "", + "name": "RightTrigger", + "type": "GamepadTester::Trigger", + "variant": "Right trigger", + "variables": [], + "effects": [], + "behaviors": [], + "content": { + "Name": "RT" + } + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Dpad" + }, + { + "objectName": "LeftStick" + }, + { + "objectName": "RightStick" + }, + { + "objectName": "A_Button" + }, + { + "objectName": "B_Button" + }, + { + "objectName": "X_Button" + }, + { + "objectName": "Y_Button" + }, + { + "objectName": "Back" + }, + { + "objectName": "Start" + }, + { + "objectName": "LB" + }, + { + "objectName": "RB" + }, + { + "objectName": "LeftTrigger" + }, + { + "objectName": "RightTrigger" + }, + { + "objectName": "Left_Stick_Click" + }, + { + "objectName": "Right_Stick_Click" + }, + { + "objectName": "Background" + }, + { + "objectName": "PlayerLabel" + }, + { + "objectName": "RumbleButton" + } + ] + }, + "objectsGroups": [ + { + "name": "Button", + "objects": [ + { + "name": "A_Button" + }, + { + "name": "B_Button" + }, + { + "name": "Y_Button" + }, + { + "name": "X_Button" + }, + { + "name": "Back" + }, + { + "name": "Start" + }, + { + "name": "LB" + }, + { + "name": "RB" + } + ] + }, + { + "name": "Stick", + "objects": [ + { + "name": "LeftStick" + }, + { + "name": "RightStick" + } + ] + }, + { + "name": "Trigger", + "objects": [ + { + "name": "LeftTrigger" + }, + { + "name": "RightTrigger" + } + ] + } + ], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "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": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Dpad", + "persistentUuid": "1db6b43d-34b4-4ced-bbd8-a72d39ccab17", + "width": 0, + "x": 120, + "y": 0, + "zOrder": 3, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "A_Button", + "persistentUuid": "0d0205b2-7efe-416f-8720-6b7f57f69f72", + "width": 0, + "x": 420, + "y": 0, + "zOrder": 4, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "B_Button", + "persistentUuid": "69514bb0-4d24-4f01-b313-5c3cf511d96b", + "width": 0, + "x": 520, + "y": 0, + "zOrder": 5, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "X_Button", + "persistentUuid": "93abefc7-4219-470e-af92-68597a876907", + "width": 0, + "x": 620, + "y": 0, + "zOrder": 6, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Y_Button", + "persistentUuid": "6b03a2b4-b80c-42d1-9792-2eef8e24acf3", + "width": 0, + "x": 720, + "y": 0, + "zOrder": 7, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Start", + "persistentUuid": "df086177-417e-4a26-a6b8-9ec96481a669", + "width": 0, + "x": 320, + "y": 100, + "zOrder": 8, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Back", + "persistentUuid": "f54eac36-c988-439a-a50b-fa1f74155208", + "width": 0, + "x": 220, + "y": 100, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "LB", + "persistentUuid": "0a61c7d1-dff0-4bdc-9086-698ec0b65b65", + "width": 0, + "x": 420, + "y": 100, + "zOrder": 14, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "RB", + "persistentUuid": "7dd0f7ba-fd52-442b-87cb-6aaf4205748c", + "width": 0, + "x": 520, + "y": 100, + "zOrder": 15, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 200, + "keepRatio": true, + "layer": "", + "name": "Background", + "persistentUuid": "0db397aa-5480-4fe5-a9f6-b1c99417931e", + "width": 840, + "x": 0, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 100, + "keepRatio": true, + "layer": "", + "name": "PlayerLabel", + "persistentUuid": "854fa10f-efc9-43c8-8fd7-eab14a12710f", + "width": 100, + "x": 20, + "y": 50, + "zOrder": 16, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "RumbleButton", + "persistentUuid": "748f22b5-8991-41dc-ba9d-93d3a942b758", + "width": 0, + "x": 18, + "y": 118, + "zOrder": 17, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "LeftStick", + "persistentUuid": "3a5067f1-5df5-4d16-991e-67a304d693ab", + "width": 0, + "x": 220, + "y": 0, + "zOrder": 18, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "RightStick", + "persistentUuid": "3905cd9c-b485-405a-925e-345a8d0b3b1e", + "width": 0, + "x": 320, + "y": 0, + "zOrder": 19, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "LeftTrigger", + "persistentUuid": "5aa6a359-2416-4ab3-a975-a37d92001816", + "width": 0, + "x": 620, + "y": 100, + "zOrder": 20, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "RightTrigger", + "persistentUuid": "9003db69-0abf-4b2e-b2f0-d3aaa12f3ab5", + "width": 0, + "x": 720, + "y": 100, + "zOrder": 21, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Button", + "Effect", + "\"Pressed\"", + "no" + ] + }, + { + "type": { + "value": "GamepadTester::GamepadTester::SetPlayerId" + }, + "parameters": [ + "Object", + "=", + "PlayerId", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "GamepadTester::GamepadTester", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Dpad", + "Animation", + "=", + "\"Default\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Button_pressed" + }, + "parameters": [ + "", + "PlayerId", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Dpad", + "Animation", + "=", + "\"Up\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Button_pressed" + }, + "parameters": [ + "", + "PlayerId", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Dpad", + "Animation", + "=", + "\"Down\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Button_pressed" + }, + "parameters": [ + "", + "PlayerId", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Dpad", + "Animation", + "=", + "\"Left\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Button_pressed" + }, + "parameters": [ + "", + "PlayerId", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Dpad", + "Animation", + "=", + "\"Right\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::IsClicked" + }, + "parameters": [ + "RumbleButton", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Gamepads::A_Vibrate_controller" + }, + "parameters": [ + "", + "PlayerId", + "0.25", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "GamepadTester::GamepadTester", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the player identifier of the object.", + "fullName": "Player identifier", + "functionType": "ExpressionAndCondition", + "group": "Gamepad tester configuration", + "name": "PlayerId", + "sentence": "the player identifier", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PlayerId" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "GamepadTester::GamepadTester", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PlayerId", + "name": "SetPlayerId", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PlayerId", + "=", + "Value" + ] + }, + { + "type": { + "value": "GamepadTester::Button::SetPlayerId" + }, + "parameters": [ + "Button", + "Button", + "=", + "PlayerId", + "" + ] + }, + { + "type": { + "value": "GamepadTester::Stick::SetPlayerId" + }, + "parameters": [ + "Stick", + "=", + "PlayerId", + "" + ] + }, + { + "type": { + "value": "GamepadTester::Trigger::SetPlayerId" + }, + "parameters": [ + "Trigger", + "=", + "PlayerId", + "" + ] + }, + { + "type": { + "value": "TextContainerCapability::TextContainerBehavior::SetValue" + }, + "parameters": [ + "PlayerLabel", + "Text", + "=", + "\"P\" + PlayerId" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "GamepadTester::GamepadTester", + "type": "object" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Player identifier", + "name": "PlayerId" + } + ], + "variants": [] + }, + { + "areaMaxX": 100, + "areaMaxY": 100, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, + "defaultName": "", + "description": "", + "fullName": "", + "isUsingLegacyInstancesRenderer": false, + "name": "Stick", + "objects": [ + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Background", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Cursor", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "VerticalHighlight", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [] + } + ] + }, + { + "name": "Up", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [] + } + ] + }, + { + "name": "Down", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "HorizontalHighlight", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [] + } + ] + }, + { + "name": "Left", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [] + } + ] + }, + { + "name": "Right", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Background" + }, + { + "objectName": "Cursor" + }, + { + "objectName": "VerticalHighlight" + }, + { + "objectName": "HorizontalHighlight" + } + ] + }, + "objectsGroups": [], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "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": 0, + "height": 100, + "keepRatio": true, + "layer": "", + "name": "Background", + "persistentUuid": "a4c15717-821e-4d97-bdd3-44bc47b11cea", + "width": 100, + "x": 0, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Cursor", + "persistentUuid": "4a9349f5-71d1-4a0a-be6c-7d20121d6bdb", + "width": 0, + "x": 50, + "y": 50, + "zOrder": 4, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 0, + "height": 100, + "layer": "", + "name": "VerticalHighlight", + "opacity": 51, + "persistentUuid": "b1a322bf-1b54-491a-a8c9-0a49e1158e6f", + "width": 100, + "x": 0, + "y": 0, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 0, + "height": 100, + "layer": "", + "name": "HorizontalHighlight", + "opacity": 51, + "persistentUuid": "908bedd6-09e2-406a-acf9-99b76dfa398e", + "width": 100, + "x": 0, + "y": 0, + "zOrder": 3, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Cursor", + "=", + "Background.CenterX() + Background.Width() / 2 * Gamepads::StickForceX(PlayerId, Name)" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Cursor", + "=", + "Background.CenterY() + Background.Height() / 2 * Gamepads::StickForceY(PlayerId, Name)" + ] + }, + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "VerticalHighlight", + "Animation", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "HorizontalHighlight", + "Animation", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "PlayerId", + "Name", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "VerticalHighlight", + "Animation", + "=", + "\"Up\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "PlayerId", + "Name", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "VerticalHighlight", + "Animation", + "=", + "\"Down\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "PlayerId", + "Name", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "HorizontalHighlight", + "Animation", + "=", + "\"Left\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Gamepads::C_Axis_pushed" + }, + "parameters": [ + "", + "PlayerId", + "Name", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "HorizontalHighlight", + "Animation", + "=", + "\"Right\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "GamepadTester::Stick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the player identifier of the object.", + "fullName": "Player identifier", + "functionType": "ExpressionAndCondition", + "group": "Stick configuration", + "name": "PlayerId", + "sentence": "the player identifier", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PlayerId" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "GamepadTester::Stick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PlayerId", + "name": "SetPlayerId", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PlayerId", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "GamepadTester::Stick", + "type": "object" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "Left", + "type": "String", + "label": "", + "name": "Name" + }, + { + "value": "1", + "type": "Number", + "label": "Player identifier", + "name": "PlayerId" + } + ], + "variants": [ + { + "areaMaxX": 100, + "areaMaxY": 100, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, + "name": "Right stick", + "objects": [ + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Background", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "default", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Right Stick.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 6, + "y": 6 + }, + { + "x": 94, + "y": 6 + }, + { + "x": 94, + "y": 94 + }, + { + "x": 6, + "y": 94 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Cursor", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Cursor", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "metadata": "{\"pskl\":{}}", + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Cursor", + "points": [], + "originPoint": { + "name": "origine", + "x": 8, + "y": 8 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 16, + "y": 0 + }, + { + "x": 16, + "y": 16 + }, + { + "x": 0, + "y": 16 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "VerticalHighlight", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Transparent", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Up", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Up", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Down", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Down", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "HorizontalHighlight", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Transparent", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Left", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Left", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Right", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Right", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Background" + }, + { + "objectName": "Cursor" + }, + { + "objectName": "VerticalHighlight" + }, + { + "objectName": "HorizontalHighlight" + } + ] + }, + "objectsGroups": [], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "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": 0, + "height": 100, + "keepRatio": true, + "layer": "", + "name": "Background", + "persistentUuid": "a4c15717-821e-4d97-bdd3-44bc47b11cea", + "width": 100, + "x": 0, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Cursor", + "persistentUuid": "4a9349f5-71d1-4a0a-be6c-7d20121d6bdb", + "width": 0, + "x": 50, + "y": 50, + "zOrder": 4, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "VerticalHighlight", + "opacity": 51, + "persistentUuid": "d8ba8ce4-262e-448a-b39d-f16712cf1969", + "width": 0, + "x": 0, + "y": 0, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "HorizontalHighlight", + "opacity": 51, + "persistentUuid": "0dda389b-d285-4a21-8bc3-d2b31cc6a165", + "width": 0, + "x": 0, + "y": 0, + "zOrder": 3, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ] + }, + { + "areaMaxX": 100, + "areaMaxY": 100, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, + "name": "Left stick", + "objects": [ + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Background", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "default", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Left Stick.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 6, + "y": 6 + }, + { + "x": 94, + "y": 6 + }, + { + "x": 94, + "y": 94 + }, + { + "x": 6, + "y": 94 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Cursor", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Cursor", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "metadata": "{\"pskl\":{}}", + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Cursor", + "points": [], + "originPoint": { + "name": "origine", + "x": 8, + "y": 8 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 16, + "y": 0 + }, + { + "x": 16, + "y": 16 + }, + { + "x": 0, + "y": 16 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "VerticalHighlight", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Transparent", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Up", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "metadata": "{\"pskl\":{}}", + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Up", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Down", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "metadata": "{\"pskl\":{}}", + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Down", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "HorizontalHighlight", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Transparent", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Left", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Left", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Right", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Right", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Background" + }, + { + "objectName": "Cursor" + }, + { + "objectName": "VerticalHighlight" + }, + { + "objectName": "HorizontalHighlight" + } + ] + }, + "objectsGroups": [], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "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": 0, + "height": 100, + "keepRatio": true, + "layer": "", + "name": "Background", + "persistentUuid": "a4c15717-821e-4d97-bdd3-44bc47b11cea", + "width": 100, + "x": 0, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Cursor", + "persistentUuid": "4a9349f5-71d1-4a0a-be6c-7d20121d6bdb", + "width": 0, + "x": 50, + "y": 50, + "zOrder": 4, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "VerticalHighlight", + "opacity": 51, + "persistentUuid": "8c0b4d2b-5feb-455d-a547-6f6e1da71401", + "width": 0, + "x": 0, + "y": 0, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "HorizontalHighlight", + "opacity": 51, + "persistentUuid": "974f86ac-b2a0-4cb2-a127-c27746978496", + "width": 0, + "x": 0, + "y": 0, + "zOrder": 3, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ] + } + ] + }, + { + "areaMaxX": 100, + "areaMaxY": 100, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, + "defaultName": "", + "description": "", + "fullName": "", + "isUsingLegacyInstancesRenderer": false, + "name": "Trigger", + "objects": [ + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Background", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Bar", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Background" + }, + { + "objectName": "Bar" + } + ] + }, + "objectsGroups": [], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "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": 0, + "height": 100, + "keepRatio": true, + "layer": "", + "name": "Background", + "persistentUuid": "2e020b0a-7420-4ac7-a1b3-a81dc16fbb17", + "width": 100, + "x": 0, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 0, + "height": 33, + "layer": "", + "name": "Bar", + "opacity": 51, + "persistentUuid": "f03f2f04-22c4-4fb0-9a67-19fa2cb64cd8", + "width": 100, + "x": 0, + "y": 67, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Bar", + "=", + "Background.Height() * (1 - Gamepads::TriggerPressure(PlayerId, Name))" + ] + }, + { + "type": { + "value": "ResizableCapability::ResizableBehavior::SetHeight" + }, + "parameters": [ + "Bar", + "Resizable", + "=", + "Background.Height() * Gamepads::TriggerPressure(PlayerId, Name)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "GamepadTester::Trigger", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the player identifier of the object.", + "fullName": "Player identifier", + "functionType": "ExpressionAndCondition", + "group": "Trigger configuration", + "name": "PlayerId", + "sentence": "the player identifier", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PlayerId" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "GamepadTester::Trigger", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PlayerId", + "name": "SetPlayerId", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PlayerId", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "GamepadTester::Trigger", + "type": "object" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Player identifier", + "name": "PlayerId" + }, + { + "value": "LT", + "type": "String", + "label": "", + "name": "Name" + } + ], + "variants": [ + { + "areaMaxX": 100, + "areaMaxY": 100, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, + "name": "Right trigger", + "objects": [ + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Background", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "default", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "RT.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 13, + "y": 10 + }, + { + "x": 87, + "y": 10 + }, + { + "x": 87, + "y": 94 + }, + { + "x": 13, + "y": 94 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Bar", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Bar", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "metadata": "{\"pskl\":{}}", + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Bar", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 64, + "y": 0 + }, + { + "x": 64, + "y": 64 + }, + { + "x": 0, + "y": 64 + } + ] + ] + } + ] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Background" + }, + { + "objectName": "Bar" + } + ] + }, + "objectsGroups": [], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "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": 0, + "height": 100, + "keepRatio": true, + "layer": "", + "name": "Background", + "persistentUuid": "2e020b0a-7420-4ac7-a1b3-a81dc16fbb17", + "width": 100, + "x": 0, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 33, + "layer": "", + "name": "Bar", + "opacity": 51, + "persistentUuid": "f03f2f04-22c4-4fb0-9a67-19fa2cb64cd8", + "width": 100, + "x": 0, + "y": 67, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ] + }, + { + "areaMaxX": 100, + "areaMaxY": 100, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, + "name": "Left trigger", + "objects": [ + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Background", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "default", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "LT.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 13, + "y": 10 + }, + { + "x": 87, + "y": 10 + }, + { + "x": 87, + "y": 94 + }, + { + "x": 13, + "y": 94 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Bar", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Bar", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "metadata": "{\"pskl\":{}}", + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Bar", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 64, + "y": 0 + }, + { + "x": 64, + "y": 64 + }, + { + "x": 0, + "y": 64 + } + ] + ] + } + ] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Background" + }, + { + "objectName": "Bar" + } + ] + }, + "objectsGroups": [], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "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": 0, + "height": 100, + "keepRatio": true, + "layer": "", + "name": "Background", + "persistentUuid": "2e020b0a-7420-4ac7-a1b3-a81dc16fbb17", + "width": 100, + "x": 0, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 33, + "layer": "", + "name": "Bar", + "opacity": 51, + "persistentUuid": "f03f2f04-22c4-4fb0-9a67-19fa2cb64cd8", + "width": 100, + "x": 0, + "y": 67, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ] + } + ] + } + ] + }, + { + "author": "", + "category": "User interface", + "extensionNamespace": "", + "fullName": "Panel sprite 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": "A button that can be customized.", + "version": "2.1.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": [] + } + ], + "eventsBasedBehaviors": [ + { + "description": "The finite state machine used internally by the button object.", + "fullName": "Button finite state machine", + "name": "ButtonFSM", + "objectType": "", + "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": [] + } + ], + "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" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [ + { + "areaMaxX": 256, + "areaMaxY": 64, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, + "defaultName": "Button", + "description": "A button that can be customized.", + "fullName": "Button (panel sprite)", + "isInnerAreaFollowingParentSize": true, + "isUsingLegacyInstancesRenderer": false, + "name": "PanelSpriteButton", + "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 + } + ], + "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 + } + ], + "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, + "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": [] + } + ], + "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": "Cache" + }, + "parameters": [ + "Hovered" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Pressed" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "Hovered", + "=", + "1" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "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::PanelSpriteButton::SetLabelOffset" + }, + "parameters": [ + "Object", + "=", + "0", + "" + ] + }, + { + "type": { + "value": "Montre" + }, + "parameters": [ + "Idle", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "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": "Cache" + }, + "parameters": [ + "Hovered" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "OpacityCapability::OpacityBehavior::Value" + }, + "parameters": [ + "Hovered", + "Opacity", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "Cache" + }, + "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::PanelSpriteButton::SetLabelOffset" + }, + "parameters": [ + "Object", + "=", + "0", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Idle" + ] + }, + { + "type": { + "value": "Montre" + }, + "parameters": [ + "Hovered", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Pressed" + ] + }, + { + "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::PanelSpriteButton::SetLabelOffset" + }, + "parameters": [ + "Object", + "=", + "PressedLabelOffsetY", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Idle" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Hovered" + ] + }, + { + "type": { + "value": "Montre" + }, + "parameters": [ + "Pressed", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::SetLabelOffset" + }, + "parameters": [ + "Object", + "=", + "0", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Idle" + ] + }, + { + "type": { + "value": "Montre" + }, + "parameters": [ + "Hovered", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "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": [] + } + ], + "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": "", + "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" + } + ], + "variants": [ + { + "areaMaxX": 192, + "areaMaxY": 64, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, + "assetStoreAssetId": "26f7912e497fefccd32817a0c24533c9304633b47c6e556065dc498219877e81", + "assetStoreOriginalName": "On Screen Controls Button", + "name": "On Screen Controls 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": 2, + "leftEdgeAnchor": 1, + "relativeToOriginalWindowSize": true, + "rightEdgeAnchor": 2, + "topEdgeAnchor": 1, + "useLegacyBottomAndRightAnchors": false + } + ], + "string": "Button", + "font": "Roboto-Bold.ttf", + "textAlignment": "center", + "characterSize": 40, + "color": { + "b": 255, + "g": 255, + "r": 255 + }, + "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": "Button", + "font": "Roboto-Bold.ttf", + "textAlignment": "center", + "verticalTextAlignment": "center", + "characterSize": 40, + "lineHeight": 0, + "color": "255;255;255" + } + }, + { + "assetStoreId": "", + "bottomMargin": 6, + "height": 64, + "leftMargin": 6, + "name": "Idle", + "rightMargin": 6, + "texture": "On Screen Controls Button_Idle.png", + "tiled": false, + "topMargin": 6, + "type": "PanelSpriteObject::PanelSprite", + "width": 192, + "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", + "serializedBehavior": { + "name": "ButtonFSM", + "type": "PanelSpriteButton::ButtonFSM", + "ShouldCheckHovering": true + } + } + ] + }, + { + "assetStoreId": "", + "bottomMargin": 6, + "height": 64, + "leftMargin": 6, + "name": "Hovered", + "rightMargin": 6, + "texture": "On Screen Controls Button_Hovered.png", + "tiled": false, + "topMargin": 6, + "type": "PanelSpriteObject::PanelSprite", + "width": 192, + "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", + "serializedBehavior": { + "name": "Tween", + "type": "Tween::TweenBehavior" + } + } + ] + }, + { + "assetStoreId": "", + "bottomMargin": 6, + "height": 64, + "leftMargin": 6, + "name": "Pressed", + "rightMargin": 6, + "texture": "On Screen Controls Button_Pressed.png", + "tiled": false, + "topMargin": 6, + "type": "PanelSpriteObject::PanelSprite", + "width": 192, + "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 + } + ], + "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": "Idle" + }, + { + "objectName": "Hovered" + }, + { + "objectName": "Pressed" + }, + { + "objectName": "BitmapLabel" + } + ] + }, + "objectsGroups": [ + { + "name": "Background", + "objects": [ + { + "name": "Idle" + }, + { + "name": "Hovered" + }, + { + "name": "Pressed" + } + ] + }, + { + "name": "Labels", + "objects": [ + { + "name": "Label" + }, + { + "name": "BitmapLabel" + } + ] + } + ], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "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": false, + "depth": 1, + "height": 64, + "layer": "", + "name": "Idle", + "persistentUuid": "24882334-eec8-403e-8bf1-70fc928a46e6", + "width": 64, + "x": 0, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 59, + "keepRatio": true, + "layer": "", + "name": "Label", + "persistentUuid": "c7a477d0-e3f5-4e10-8b11-352dd89768f1", + "width": 186, + "x": 3, + "y": 32, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ] + } + ] + } + ] + }, + { + "author": "Bouh", + "category": "Input", + "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": "Add support for gamepads (or other controllers) to your game, giving access to information such as button presses, axis positions, trigger pressure, etc...", + "version": "0.8.1", + "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" + ], + "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::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "//Define an new private object javascript for the gamepad extension\r", + "gdjs._extensionController = {\r", + " players: {\r", + " 0: { mapping: 'DEFAULT', lastButtonUsed: -1, deadzone: 0.2, previousFrameStateButtons: {}, rumble: {} },\r", + " 1: { mapping: 'DEFAULT', lastButtonUsed: -1, deadzone: 0.2, previousFrameStateButtons: {}, rumble: {} },\r", + " 2: { mapping: 'DEFAULT', lastButtonUsed: -1, deadzone: 0.2, previousFrameStateButtons: {}, rumble: {} },\r", + " 3: { mapping: 'DEFAULT', lastButtonUsed: -1, deadzone: 0.2, previousFrameStateButtons: {}, rumble: {} },\r", + " },\r", + " lastActiveController: -1, // Last active controller\r", + " controllerButtonNames: { //Map associating controller button ids to button names\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", + "gdjs._extensionController.getInputString = function (type, buttonId) {\r", + " const controllerButtonNames = gdjs._extensionController.controllerButtonNames;\r", + " if (controllerButtonNames[type] !== undefined) {\r", + " return controllerButtonNames[type][buttonId];\r", + " }\r", + "\r", + " return \"UNKNOWN_BUTTON\";\r", + "}\r", + "\r", + "gdjs._extensionController.axisToAngle = function (deltaX, deltaY) {\r", + " const rad = Math.atan2(deltaY, deltaX);\r", + " const deg = rad * (180 / Math.PI);\r", + " return deg;\r", + "}\r", + "\r", + "gdjs._extensionController.isXbox = function (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", + "//Returns the new value taking into account the dead zone for the player_ID given\r", + "gdjs._extensionController.getNormalizedAxisValue = function (v, player_ID) {\r", + " // gdjs._extensionController = gdjs._extensionController || { deadzone: 0.2 };\r", + "\r", + " // Anything smaller than this is assumed to be 0,0\r", + " const DEADZONE = gdjs._extensionController.players[player_ID].deadzone;\r", + "\r", + " if (Math.abs(v) < DEADZONE) {\r", + " // In the dead zone, set to 0\r", + " v = 0;\r", + "\r", + " if (v == null) {\r", + " return 0;\r", + " } else {\r", + " return v;\r", + " }\r", + "\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 v from\r", + " // DEADZONE..1 to 0..(1-DEADZONE)\r", + " // or from\r", + " // -1..-DEADZONE to -(1-DEADZONE)..0\r", + "\r", + " v = v - Math.sign(v) * DEADZONE;\r", + "\r", + " // Remap v from\r", + " // 0..(1-DEADZONE) to 0..1\r", + " // or from\r", + " // -(1-DEADZONE)..0 to -1..0\r", + "\r", + " return v / (1 - DEADZONE);\r", + " }\r", + "};" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onScenePostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "//Each time a player press a button i save the last button pressed for the next frame", + "/** @type {Gamepad[]} */", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);", + "", + "//Get function parameter", + "let countPlayers = Object.keys(gdjs._extensionController.players).length;", + "", + "//Repeat for each players", + "for (let i = 0; i < countPlayers; i++) {", + " let gamepad = gamepads[i]; // Get the gamepad of the player", + "", + " //We have to keep this condition because if the user hasn't plugged in his controller yet, we can't get the controller in the gamepad variable.", + " if (gamepad == null) {", + " continue;", + " }", + "", + " for (let b = 0; b < Object.keys(gamepad.buttons).length; b++) { //For each buttons", + " if (gamepad.buttons[b].pressed) { //One of them is pressed", + " gdjs._extensionController.players[i].lastButtonUsed = b; //Save the button pressed", + "", + " //Save the state of the button for the next frame.", + " gdjs._extensionController.players[i].previousFrameStateButtons[b] = { pressed: true };", + "", + " // Update Last Active Controller", + " gdjs._extensionController.lastActiveController = i;", + " } else {", + " gdjs._extensionController.players[i].previousFrameStateButtons[b] = { pressed: false };", + " }", + " }", + "", + "", + " gdjs._extensionController.players[i].rumble.elapsedTime += runtimeScene.getElapsedTime(runtimeScene) / 1000;", + " if (", + " gdjs._extensionController.players[i].rumble.duration - gdjs._extensionController.players[i].rumble.elapsedTime <= 0 &&", + " (gdjs._extensionController.players[i].rumble.weakMagnitude || gdjs._extensionController.players[i].rumble.strongMagnitude)", + " ) {", + " gdjs._extensionController.players[i].rumble.weakMagnitude = 0;", + " gdjs._extensionController.players[i].rumble.strongMagnitude = 0;", + " }", + "", + "", + "}", + "" + ], + "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": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameters\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "const trigger = eventsFunctionContext.getArgument(\"trigger\").toUpperCase();\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier in expression: \"Pressure on a gamepad trigger\", is not valid number, must be between 0 and 4.');\r", + " return;\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", + "\r", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) 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": "player_ID", + "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": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameters\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "const stick = eventsFunctionContext.getArgument(\"stick\").toUpperCase();\r", + "\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier is not valid in expression: \"Value of a stick force\"');\r", + " return;\r", + "}\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", + "\r", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) return;\r", + "\r", + "\r", + "switch (stick) {\r", + " case 'LEFT':\r", + " eventsFunctionContext.returnValue = gdjs.evtTools.common.clamp(Math.abs(gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[0], playerId)) + Math.abs(gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[1], playerId)), 0, 1);\r", + " break;\r", + "\r", + " case 'RIGHT':\r", + " eventsFunctionContext.returnValue = gdjs.evtTools.common.clamp(Math.abs(gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[2], playerId)) + Math.abs(gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[3], playerId)), 0, 1);\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": "player_ID", + "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(player_ID, stick)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "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": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameters\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "const stick = eventsFunctionContext.getArgument(\"stick\").toUpperCase();\r", + "\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier is not valid in expression: \"Value of a stick rotation\"');\r", + " return;\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", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) return;\r", + "\r", + "switch (stick) {\r", + " case 'LEFT':\r", + " eventsFunctionContext.returnValue = gdjs._extensionController.axisToAngle(gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[0], playerId), gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[1], playerId));\r", + " break;\r", + "\r", + " case 'RIGHT':\r", + " eventsFunctionContext.returnValue = gdjs._extensionController.axisToAngle(gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[2], playerId), gdjs._extensionController.getNormalizedAxisValue(gamepad.axes[3], playerId));\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": "player_ID", + "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": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameters\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "const stick = eventsFunctionContext.getArgument(\"stick\").toUpperCase();\r", + "const direction = eventsFunctionContext.getArgument(\"direction\").toUpperCase();\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier is not valid in expression: \"Value of a gamepad axis\"');\r", + " return;\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", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) 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": "player_ID", + "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": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameters\r", + "const playerId = eventsFunctionContext.getArgument(\"Gamepad\") - 1;\r", + "const stick = eventsFunctionContext.getArgument(\"Stick\").toLowerCase();\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier is not valid in expression: \"Value of a gamepad axis\"');\r", + " return;\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", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) 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": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameters\r", + "const playerId = eventsFunctionContext.getArgument(\"Gamepad\") - 1;\r", + "const stick = eventsFunctionContext.getArgument(\"Stick\").toLowerCase();\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier is not valid in expression: \"Value of a gamepad axis\"');\r", + " return;\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", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) 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": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameters\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "const button = eventsFunctionContext.getArgument(\"button\").toUpperCase();\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier in condition: \"Gamepad button released\", is not valid number, must be between 0 and 4.');\r", + " return;\r", + "}\r", + "if (button === \"\") {\r", + " console.error('Parameter button is not valid in condition: \"Gamepad button released\"');\r", + " return;\r", + "}\r", + "\r", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) return;\r", + "\r", + "let buttonId;\r", + "\r", + "switch (button) {\r", + " case 'A':\r", + " case 'CROSS':\r", + " buttonId = 0;\r", + " break;\r", + " case 'B':\r", + " case 'CIRCLE':\r", + " buttonId = 1;\r", + " break;\r", + " case 'X':\r", + " case 'SQUARE':\r", + " buttonId = 2;\r", + " break;\r", + " case 'Y':\r", + " case 'TRIANGLE':\r", + " buttonId = 3;\r", + " break;\r", + " case 'LB':\r", + " case 'L1':\r", + " buttonId = 4;\r", + " break;\r", + " case 'RB':\r", + " case 'R1':\r", + " buttonId = 5;\r", + " break;\r", + " case 'LT':\r", + " case 'L2':\r", + " buttonId = 6;\r", + " break;\r", + " case 'RT':\r", + " case 'R2':\r", + " buttonId = 7;\r", + " break;\r", + "\r", + " case 'UP':\r", + " buttonId = 12;\r", + " break;\r", + " case 'DOWN':\r", + " buttonId = 13;\r", + " break;\r", + " case 'LEFT':\r", + " buttonId = 14;\r", + " break;\r", + " case 'RIGHT':\r", + " buttonId = 15;\r", + " break;\r", + "\r", + " case 'BACK':\r", + " case 'SHARE':\r", + " buttonId = 8;\r", + " break;\r", + " case 'START':\r", + " case 'OPTIONS':\r", + " buttonId = 9;\r", + " break;\r", + "\r", + " case 'CLICK_STICK_LEFT':\r", + " buttonId = 10;\r", + " break;\r", + " case 'CLICK_STICK_RIGHT':\r", + " buttonId = 11;\r", + " break;\r", + "\r", + " //PS4\r", + " case 'PS_BUTTON':\r", + " buttonId = 16;\r", + " break;\r", + " case 'CLICK_TOUCHPAD':\r", + " buttonId = 17;\r", + " break;\r", + "\r", + " default:\r", + " console.error('The button: ' + button + ' in condition: \"Gamepad button released\" is not valid.');\r", + " break;\r", + "}\r", + "\r", + "if (buttonId === undefined) {\r", + " console.error('There is no buttons valid in condition: \"Gamepad button released\"');\r", + " eventsFunctionContext.returnValue = false;\r", + " return;\r", + "}\r", + "\r", + "if (gamepad.buttons == null || gamepad.buttons[buttonId] == null) {\r", + " console.error('Buttons on the gamepad are not accessible in condition: \"Gamepad button released\"');\r", + " eventsFunctionContext.returnValue = false;\r", + " return;\r", + "}\r", + "\r", + "//Define default value on pressed button or use previous value\r", + "gdjs._extensionController.players[playerId].previousFrameStateButtons[buttonId] = gdjs._extensionController.players[playerId].previousFrameStateButtons[buttonId] || { pressed: false };\r", + "\r", + "//Get state of button at previous frame\r", + "const previousStateButton = gdjs._extensionController.players[playerId].previousFrameStateButtons[buttonId].pressed;\r", + "\r", + "//When previousStateButton is true and actual button state is not pressed\r", + "//Player have release the button\r", + "if (previousStateButton === true && gamepad.buttons[buttonId].pressed === false) {\r", + " // Save the last button used for the player \r", + " gdjs._extensionController.players[playerId].lastButtonUsed = buttonId;\r", + " gdjs._extensionController.players[playerId].previousFrameStateButtons[buttonId].pressed = true;\r", + " eventsFunctionContext.returnValue = true;\r", + "\r", + "} else {\r", + " gdjs._extensionController.players[playerId].previousFrameStateButtons[buttonId].pressed = false;\r", + " eventsFunctionContext.returnValue = false;\r", + "}\r", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "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": [ + "//Get function parameter\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "\r", + "//Player id is not valid\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier in expression: \"Last pressed button (id)\", is not valid number, must be between 0 and 4.');\r", + " return;\r", + "}\r", + "\r", + "//Return the last button used by the player\r", + "eventsFunctionContext.returnValue = gdjs._extensionController.players[playerId].lastButtonUsed;" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "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": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameter\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier in condition: \"Any gamepad button pressed\", is not valid number, must be between 0 and 4.');\r", + " return;\r", + "}\r", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) return;\r", + "\r", + "let buttonId;\r", + "for (let i = 0; i < gamepad.buttons.length; i++) { //For each buttons\r", + " if (gamepad.buttons[i].pressed) { //One of them is pressed\r", + " buttonId = i; //Save the button pressed\r", + " break;\r", + " }\r", + "}\r", + "\r", + "if (buttonId === undefined) {\r", + " // No buttons are pressed.\r", + " eventsFunctionContext.returnValue = false;\r", + " return;\r", + "}\r", + "\r", + "if (gamepad.buttons == null || gamepad.buttons[buttonId] == null) {\r", + " console.error('Buttons on the gamepad are not accessible in condition: \"Any gamepad button pressed\"');\r", + " eventsFunctionContext.returnValue = false;\r", + " return;\r", + "}\r", + "\r", + "//When a button is pressed, save the button in lastButtonUsed for each players\r", + "if (gamepad.buttons[buttonId].pressed) gdjs._extensionController.players[playerId].lastButtonUsed = buttonId;\r", + "eventsFunctionContext.returnValue = gamepad.buttons[buttonId].pressed;\r", + "\r", + "\r", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "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": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameters\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "const controllerType = eventsFunctionContext.getArgument(\"controller_type\").toUpperCase();\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier in string expression: \"Last pressed button (LastButtonString)\", is not valid number, must be between 0 and 4.');\r", + " return;\r", + "}\r", + "if (controllerType === \"\") {\r", + " console.error('Parameter controller type is not valid in string expression: \"Last pressed button (LastButtonString)\"');\r", + " return;\r", + "}\r", + "\r", + "const gamepad = gamepads[playerId];\r", + "\r", + "if (gamepad !== null) { //Gamepad exist\r", + " //Get last btn id\r", + " const lastButtonUsedID = gdjs._extensionController.players[playerId].lastButtonUsed;\r", + "\r", + " //Return last button as string \r", + " eventsFunctionContext.returnValue = gdjs._extensionController.getInputString(controllerType, lastButtonUsedID);\r", + "\r", + "} else { //Gamepad dosen't exist\r", + " console.error('Your controller is not supported or the gamepad wasn\\'t detected in string expression: \"Last pressed button (LastButtonString)\"');\r", + " eventsFunctionContext.returnValue = \"Gamepad not connected\";\r", + "}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "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": [ + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get the last activated controller\r", + "const controllerId = gdjs._extensionController.lastActiveController;\r", + "\r", + "// Check if controller is active\r", + "const gamepad = gamepads[controllerId];\r", + "if (gamepad == null) {\r", + " eventsFunctionContext.returnValue = 0;\r", + "} else {\r", + " // Return active controller id\r", + " eventsFunctionContext.returnValue = controllerId + 1;\r", + "}\r", + "" + ], + "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": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameters\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "const button = eventsFunctionContext.getArgument(\"button\").toUpperCase();\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier in condition: \"Gamepad button pressed\", is not valid number, must be between 0 and 4.');\r", + " return;\r", + "}\r", + "if (button === \"\") {\r", + " console.error('Parameter button is not valid in condition: \"Gamepad button pressed\"');\r", + " eventsFunctionContext.returnValue = false;\r", + " return;\r", + "}\r", + "\r", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) return;\r", + "\r", + "let buttonId;\r", + "\r", + "switch (button) {\r", + " case 'A':\r", + " case 'CROSS':\r", + " buttonId = 0;\r", + " break;\r", + " case 'B':\r", + " case 'CIRCLE':\r", + " buttonId = 1;\r", + " break;\r", + " case 'X':\r", + " case 'SQUARE':\r", + " buttonId = 2;\r", + " break;\r", + " case 'Y':\r", + " case 'TRIANGLE':\r", + " buttonId = 3;\r", + " break;\r", + " case 'LB':\r", + " case 'L1':\r", + " buttonId = 4;\r", + " break;\r", + " case 'RB':\r", + " case 'R1':\r", + " buttonId = 5;\r", + " break;\r", + " case 'LT':\r", + " case 'L2':\r", + " buttonId = 6;\r", + " break;\r", + " case 'RT':\r", + " case 'R2':\r", + " buttonId = 7;\r", + " break;\r", + "\r", + " case 'UP':\r", + " buttonId = 12;\r", + " break;\r", + " case 'DOWN':\r", + " buttonId = 13;\r", + " break;\r", + " case 'LEFT':\r", + " buttonId = 14;\r", + " break;\r", + " case 'RIGHT':\r", + " buttonId = 15;\r", + " break;\r", + "\r", + " case 'BACK':\r", + " case 'SHARE':\r", + " buttonId = 8;\r", + " break;\r", + " case 'START':\r", + " case 'OPTIONS':\r", + " buttonId = 9;\r", + " break;\r", + "\r", + " case 'CLICK_STICK_LEFT':\r", + " buttonId = 10;\r", + " break;\r", + " case 'CLICK_STICK_RIGHT':\r", + " buttonId = 11;\r", + " break;\r", + "\r", + " //PS4\r", + " case 'PS_BUTTON':\r", + " buttonId = 16;\r", + " break;\r", + " case 'CLICK_TOUCHPAD':\r", + " buttonId = 17;\r", + " break;\r", + "\r", + " default:\r", + " console.error('The button: ' + button + ' in condition: \"Gamepad button pressed\" is not valid.');\r", + " eventsFunctionContext.returnValue = false;\r", + " break;\r", + "}\r", + "\r", + "\r", + "\r", + "if (buttonId === undefined) {\r", + " console.error('There is no buttons valid in condition: \"Gamepad button pressed\"');\r", + " eventsFunctionContext.returnValue = false;\r", + " return;\r", + "}\r", + "\r", + "if (gamepad.buttons == null || gamepad.buttons[buttonId] == null) {\r", + " console.error('Buttons on the gamepad are not accessible in condition: \"Gamepad button pressed\"');\r", + " eventsFunctionContext.returnValue = false;\r", + " return;\r", + "}\r", + "\r", + "//When a button is pressed, save the button in lastButtonUsed for each players\r", + "if (gamepad.buttons[buttonId].pressed) gdjs._extensionController.players[playerId].lastButtonUsed = buttonId;\r", + "eventsFunctionContext.returnValue = gamepad.buttons[buttonId].pressed;\r", + "\r", + "\r", + "\r", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "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": [ + "//Get function parameter\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier in expression: \"Gamepad deadzone for sticks\", is not valid number, must be between 0 and 4.');\r", + " return;\r", + "}\r", + "///Return the deadzone value for a given player\r", + "eventsFunctionContext.returnValue = gdjs._extensionController.players[playerId].deadzone;" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "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": [ + "//Get function parameter\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "const newDeadzone = eventsFunctionContext.getArgument(\"deadzone\");\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier in action: \"Set gamepad deadzone for sticks\", is not valid, must be between 0 and 4.');\r", + " return;\r", + "}\r", + "\r", + "// clamp the newDeadzone in range [0, 1].\r", + "// https://github.com/4ian/GDevelop-extensions/pull/33#issuecomment-618224857\r", + "gdjs._extensionController.players[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": "player_ID", + "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": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameters\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "const stick = eventsFunctionContext.getArgument(\"stick\").toUpperCase();\r", + "const direction = eventsFunctionContext.getArgument(\"direction\").toUpperCase();\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + " console.error('Parameter gamepad identifier in condition: \"Gamepad stick pushed (axis)\", is not valid number, must be between 0 and 4.');\r", + " return;\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 deadzone in condition: \"Gamepad stick pushed (axis)\", is not valid, must be UP, DOWN, LEFT or RIGHT');\r", + " return;\r", + "}\r", + "\r", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) {\r", + " eventsFunctionContext.returnValue = false;\r", + " return;\r", + "}\r", + "\r", + "\r", + "//Define in onFirstSceneLoaded function\r", + "const getNormalizedAxisValue = gdjs._extensionController.getNormalizedAxisValue;\r", + "\r", + "switch (stick) {\r", + " case 'LEFT':\r", + " switch (direction) {\r", + " case 'LEFT':\r", + " if (getNormalizedAxisValue(gamepad.axes[0], playerId) < 0) {\r", + " eventsFunctionContext.returnValue = true;\r", + " return;\r", + " }\r", + " break;\r", + "\r", + " case 'RIGHT':\r", + " if (getNormalizedAxisValue(gamepad.axes[0], playerId) > 0) {\r", + " eventsFunctionContext.returnValue = true;\r", + " return;\r", + " }\r", + " break;\r", + "\r", + " case 'UP':\r", + " if (getNormalizedAxisValue(gamepad.axes[1], playerId) < 0) {\r", + " eventsFunctionContext.returnValue = true;\r", + " return;\r", + " }\r", + " break;\r", + "\r", + " case 'DOWN':\r", + " if (getNormalizedAxisValue(gamepad.axes[1], playerId) > 0) {\r", + " eventsFunctionContext.returnValue = true;\r", + " return;\r", + " }\r", + " break;\r", + "\r", + " case 'ANY':\r", + " if ( getNormalizedAxisValue(gamepad.axes[0], playerId) < 0\r", + " || getNormalizedAxisValue(gamepad.axes[0], playerId) > 0\r", + " || getNormalizedAxisValue(gamepad.axes[1], playerId) < 0 \r", + " || getNormalizedAxisValue(gamepad.axes[1], playerId) > 0) {\r", + " eventsFunctionContext.returnValue = true;\r", + " return;\r", + " }\r", + " break;\r", + "\r", + " default:\r", + " console.error('The value Direction on stick Left on the condition: \"Gamepad stick pushed (axis)\" is not valid.');\r", + " eventsFunctionContext.returnValue = false;\r", + " break;\r", + " }\r", + " break;\r", + "\r", + " case 'RIGHT':\r", + " switch (direction) {\r", + " case 'LEFT':\r", + " if (getNormalizedAxisValue(gamepad.axes[2], playerId) < 0) {\r", + " eventsFunctionContext.returnValue = true;\r", + " return;\r", + " }\r", + " break;\r", + "\r", + " case 'RIGHT':\r", + " if (getNormalizedAxisValue(gamepad.axes[2], playerId) > 0) {\r", + " eventsFunctionContext.returnValue = true;\r", + " return;\r", + " }\r", + " break;\r", + "\r", + " case 'UP':\r", + " if (getNormalizedAxisValue(gamepad.axes[3], playerId) < 0) {\r", + " eventsFunctionContext.returnValue = true;\r", + " return;\r", + " }\r", + " break;\r", + "\r", + " case 'DOWN':\r", + " if (getNormalizedAxisValue(gamepad.axes[3], playerId) > 0) {\r", + " eventsFunctionContext.returnValue = true;\r", + " return;\r", + " }\r", + " break;\r", + "\r", + " case 'ANY':\r", + " if ( getNormalizedAxisValue(gamepad.axes[2], playerId) < 0\r", + " || getNormalizedAxisValue(gamepad.axes[2], playerId) > 0\r", + " || getNormalizedAxisValue(gamepad.axes[3], playerId) < 0 \r", + " || getNormalizedAxisValue(gamepad.axes[3], playerId) > 0) {\r", + " eventsFunctionContext.returnValue = true;\r", + " return;\r", + " }\r", + " break;\r", + "\r", + " default:\r", + " console.error('The value Direction on stick Right on the condition: \"Gamepad stick pushed (axis)\" is not valid.');\r", + " eventsFunctionContext.returnValue = false;\r", + " break;\r", + " }\r", + " break;\r", + "\r", + " default:\r", + " console.error('The value Stick on the condition: \"Gamepad stick pushed (axis)\" is not valid.');\r", + " eventsFunctionContext.returnValue = false;\r", + " break;\r", + "}\r", + "\r", + "eventsFunctionContext.returnValue = false;\r", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "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 number", + "functionType": "Expression", + "name": "ConnectedGamepadsCount", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "// Gamepads can be disconnected and become null, so we have to filter them.\r", + "eventsFunctionContext.returnValue = Object.keys(gamepads).filter(key => !!gamepads[key]).length;\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": [ + "/** @type {Gamepad[]} */", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);", + "", + "//Get function parameter", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;", + "", + "if (playerId < 0 || playerId > 4) {", + " console.error('Parameter gamepad identifier in string expression: \"Gamepad type\", is not valid number, must be between 0 and 4');", + " return;", + "}", + "", + "const gamepad = gamepads[playerId];", + "", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.", + "if (gamepad == null) 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": "player_ID", + "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": [ + "/** @type {Gamepad[]} */", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);", + "", + "//Get function parameters", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;", + "const controllerType = eventsFunctionContext.getArgument(\"controller_type\").toUpperCase();", + "", + "if (playerId < 0 || playerId > 4) {", + " console.error('Parameter gamepad identifier in condition: \"Gamepad type\", is not valid number, must be between 0 and 4.');", + " return;", + "}", + "if (controllerType === \"\") {", + " console.error('Parameter type in condition: \"Gamepad type\", is not a string.');", + " return;", + "}", + "", + "const gamepad = gamepads[playerId];", + "", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.", + "if (gamepad == null) 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": "player_ID", + "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": [ + "/** @type {Gamepad[]} */", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);", + "", + "//Get function parameter", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;", + "", + "if (playerId < 0 || playerId > 4) {", + " console.error('Parameter gamepad identifier in condition: \"Gamepad connected\", is not valid number, must be between 0 and 4.');", + " return;", + "}", + "", + "// 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": "player_ID", + "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": [ + "/** @type {Gamepad[]} */", + "//Vibration work only on game in browser.", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);", + "", + "//Get function parameters", + "const playerId = eventsFunctionContext.getArgument(\"Player_ID\") - 1;", + "const duration = eventsFunctionContext.getArgument(\"Duration\") || 1;", + "", + "if (playerId < 0 || playerId > 4) {", + " console.error('Parameter gamepad identifier in action: \"Gamepad connected\", is not valid number, must be between 0 and 4.');", + " return;", + "}", + "", + "const gamepad = gamepads[playerId];", + "", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.", + "if (gamepad == null) return;", + "", + "if (gamepad && 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": "Player_ID", + "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": [ + "/** @type {Gamepad[]} */", + "//Vibration work only on game in browser.", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);", + "", + "//Get function parameters", + "const playerId = eventsFunctionContext.getArgument(\"Player_ID\") - 1;", + "const duration = eventsFunctionContext.getArgument(\"Duration\") || 1;", + "const strongRumbleMagnitude = eventsFunctionContext.getArgument(\"StrongMagnitude\");", + "const weakRumbleMagnitude = eventsFunctionContext.getArgument(\"WeakMagnitude\");", + "", + "if (playerId < 0 || playerId > 4) {", + " console.error('Parameter gamepad identifier in action: \"Advanced gamepad vibration\", is not valid number, must be between 0 and 4.');", + " return;", + "}", + "if (weakRumbleMagnitude < 0 || weakRumbleMagnitude > 1) {", + " console.error('Parameter weakRumble identifier in action: \"Advanced gamepad vibration\", is not valid number, must be between 0 and 1.');", + " return;", + "}", + "if (strongRumbleMagnitude < 0 || strongRumbleMagnitude > 1) {", + " console.error('Parameter strongRumble identifier in action: \"Advanced gamepad vibration\", is not valid number, must be between 0 and 1.');", + " return;", + "}", + "", + "const gamepad = gamepads[playerId];", + "", + "//we need keep this condition because when use have not yet plug the controller we can't get the controller in the gamepad variable.", + "if (gamepad == null) return;", + "", + "if (gamepad && gamepad.vibrationActuator) {", + " gamepad.vibrationActuator.playEffect(\"dual-rumble\", {", + " startDelay: 0,", + " duration: duration * 1000,", + " weakMagnitude: weakRumbleMagnitude,", + " strongMagnitude: strongRumbleMagnitude", + " });", + "}", + "", + "gdjs._extensionController.players[playerId].rumble.duration = duration;", + "gdjs._extensionController.players[playerId].rumble.elapsedTime = 0;", + "gdjs._extensionController.players[playerId].rumble.weakMagnitude = weakRumbleMagnitude;", + "gdjs._extensionController.players[playerId].rumble.strongMagnitude = strongRumbleMagnitude;" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "Player_ID", + "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": [ + "/** @type {Gamepad[]} */", + "//Vibration work only on game in browser.", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);", + "", + "//Get function parameters", + "const playerId = eventsFunctionContext.getArgument(\"Player_ID\") - 1;", + "const elapsedTime = gdjs._extensionController.players[playerId].rumble.elapsedTime || 0;", + "const originalDuration = gdjs._extensionController.players[playerId].rumble.duration || 1;", + "const strongRumbleMagnitude = eventsFunctionContext.getArgument(\"StrongMagnitude\");", + "const weakRumbleMagnitude = eventsFunctionContext.getArgument(\"WeakMagnitude\");", + "", + "", + "if (playerId < 0 || playerId > 4) {", + " console.error('Parameter gamepad identifier in action: \"Change gamepad active vibration\", is not valid number, must be between 0 and 4.');", + " return;", + "}", + "if (weakRumbleMagnitude < 0 || weakRumbleMagnitude > 1) {", + " console.error('Parameter weakRumble identifier in action: \"Change gamepad active vibration\", is not valid number, must be between 0 and 1.');", + " return;", + "}", + "if (strongRumbleMagnitude < 0 || strongRumbleMagnitude > 1) {", + " console.error('Parameter strongRumble identifier in action: \"Change gamepad active vibration\", is not valid number, must be between 0 and 1.');", + " return;", + "}", + "", + "const gamepad = gamepads[playerId];", + "", + "//we need keep this condition because when use have not yet plug the controller we can't get the controller in the gamepad variable.", + "if (gamepad == null) return;", + "", + "if (originalDuration - elapsedTime <= 0) return;", + "", + "if (gamepad && gamepad.vibrationActuator) {", + " gamepad.vibrationActuator.playEffect(\"dual-rumble\", {", + " startDelay: 0,", + " duration: 1000 * (originalDuration - elapsedTime),", + " weakMagnitude: weakRumbleMagnitude,", + " strongMagnitude: strongRumbleMagnitude", + " });", + "}", + "", + "gdjs._extensionController.players[playerId].rumble.weakMagnitude = weakRumbleMagnitude;", + "gdjs._extensionController.players[playerId].rumble.strongMagnitude = strongRumbleMagnitude;" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "Player_ID", + "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": [ + "/** @type {Gamepad[]} */\r", + "const gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);\r", + "\r", + "//Get function parameters\r", + "const playerId = eventsFunctionContext.getArgument(\"player_ID\") - 1;\r", + "\r", + "if (playerId < 0 || playerId > 4) {\r", + "\tconsole.error('Parameter gamepad identifier in condition: \"Any gamepad button released\", is not valid number, must be between 0 and 4.');\r", + "\treturn;\r", + "}\r", + "\r", + "const gamepad = gamepads[playerId];\r", + "\r", + "//we need keep this condition because when use have not yet plug her controller we can't get the controller in the gamepad variable.\r", + "if (gamepad == null) return;\r", + "\r", + "for (let buttonId = 0; buttonId < gamepad.buttons.length; buttonId++) { //For each buttons on current frame.\r", + "\r", + "\tif (buttonId === undefined) {\r", + "\t\teventsFunctionContext.returnValue = false;\r", + "\t\treturn;\r", + "\t}\r", + "\r", + "\t//Get previous value or define value by default for the current button\r", + "\tgdjs._extensionController.players[playerId].previousFrameStateButtons[buttonId] = gdjs._extensionController.players[playerId].previousFrameStateButtons[buttonId] || { pressed: false };\r", + "\r", + "\t//Get state of the button at previous frame\r", + "\tconst previousStateButtonIsPressed = gdjs._extensionController.players[playerId].previousFrameStateButtons[buttonId].pressed;\r", + "\r", + "\t//Get the state of the button on the current frame.\r", + "\tconst currentFrameStateButtonIsPressed = gamepad.buttons[buttonId].pressed;\r", + "\r", + "\t//When previousStateButtonIsPressed is true and actual button state is not pressed\r", + "\t//Player have release the button\r", + "\tif (previousStateButtonIsPressed === true && currentFrameStateButtonIsPressed === false) {\r", + "\t\tgdjs._extensionController.players[playerId].previousFrameStateButtons[buttonId].pressed = true;\r", + "\t\teventsFunctionContext.returnValue = true;\r", + "\t\t//break;\r", + "\t\treturn;\r", + "\t} else {\r", + "\t\t//The player didn't released the button yet, the previous frame state is still true\r", + "\t\tgdjs._extensionController.players[playerId].previousFrameStateButtons[buttonId].pressed = false;\r", + "\t\teventsFunctionContext.returnValue = false;\r", + "\t}\r", + "\r", + "\tif (currentFrameStateButtonIsPressed) gdjs._extensionController.players[playerId].lastButtonUsed = buttonId;\r", + "}\r", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "player_ID", + "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(\"Player_ID\") - 1;\r", + "eventsFunctionContext.returnValue = gdjs._extensionController.players[playerId].rumble.weakMagnitude;" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "Player_ID", + "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(\"Player_ID\") - 1;\r", + "eventsFunctionContext.returnValue = gdjs._extensionController.players[playerId].rumble.strongMagnitude;" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "The gamepad identifier: 1, 2, 3 or 4", + "name": "Player_ID", + "type": "expression" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [ + { + "description": "Control a platformer character with a gamepad.", + "fullName": "Platformer gamepad mapper", + "name": "PlatformerGamepadMapper", + "objectType": "", + "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": [] + } + ], + "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" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a 3D physics character with a gamepad.", + "fullName": "3D platformer gamepad mapper", + "name": "Platformer3DGamepadMapper", + "objectType": "", + "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": [] + } + ], + "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" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a 3D physics character with a gamepad.", + "fullName": "3D shooter gamepad mapper", + "name": "Shooter3DGamepadMapper", + "objectType": "", + "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": [] + } + ], + "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" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control camera rotations with a gamepad.", + "fullName": "First person camera gamepad mapper", + "name": "FirstPersonGamepadMapper", + "objectType": "", + "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": "CentreCamera" + }, + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "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": [] + } + ], + "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" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a 3D physics car with a gamepad.", + "fullName": "3D car gamepad mapper", + "name": "PhysicsCar3DGamepadMapper", + "objectType": "", + "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": [] + } + ], + "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" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a top-down character with a gamepad.", + "fullName": "Top-down gamepad mapper", + "name": "TopDownGamepadMapper", + "objectType": "", + "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": [] + } + ], + "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" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + } + ], + "externalLayouts": [] +} \ No newline at end of file diff --git a/examples/gamepad-tester/README.md b/examples/gamepad-tester/README.md new file mode 100644 index 000000000..96e0eec01 --- /dev/null +++ b/examples/gamepad-tester/README.md @@ -0,0 +1 @@ +Allow to check if a gamepad works correctly with the extension. \ No newline at end of file diff --git a/examples/gamepad-tester/assets/A Button.png b/examples/gamepad-tester/assets/A Button.png new file mode 100644 index 0000000000000000000000000000000000000000..cd716d1adee46c185b041b37ab69c9ed0f57d208 GIT binary patch literal 4548 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 P_W)pGXkkzdzw_i@Qq~8{ literal 0 HcmV?d00001 diff --git a/examples/gamepad-tester/assets/Back_Alt.png b/examples/gamepad-tester/assets/Back_Alt.png new file mode 100644 index 0000000000000000000000000000000000000000..900705b172733f225e5fd463e3b5d91443a68c5f GIT binary patch literal 3144 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 N2xDSnTw~-*`VZNt{51do literal 0 HcmV?d00001 diff --git a/examples/gamepad-tester/assets/Bar.png b/examples/gamepad-tester/assets/Bar.png new file mode 100644 index 0000000000000000000000000000000000000000..08334f6302ac9a376b3e70d344cd6867513e134c GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|T0C7GLn`9l zUS||!P~c%Ue8ybd;l|JLQ(@upS+DPGzR$H^utEL-ONqk{=IKI97+5tN7`a-64=Au1 zb~y612^zE+0O=%wW(gkk1}H;0ffpoj1gJ*Bj{(YXJ0JxT04X+@!vJOUG?;cAv}%_B YGi6F+bR^Yrq#x&mwm{|=qHG%`924{1@Z#|Dwuwp1Zo)!`4Nh<~#GQ8O UWIQD{0cZe&r>mdKI;Vst0J^m$DF6Tf literal 0 HcmV?d00001 diff --git a/examples/gamepad-tester/assets/Down.png b/examples/gamepad-tester/assets/Down.png new file mode 100644 index 0000000000000000000000000000000000000000..aa6385217b0d63d44cf70051fb6a51825c9b5c1d GIT binary patch literal 658 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 literal 0 HcmV?d00001 diff --git a/examples/gamepad-tester/assets/Dpad_Down.png b/examples/gamepad-tester/assets/Dpad_Down.png new file mode 100644 index 0000000000000000000000000000000000000000..944d59bb015bd1304c86dad5ccc0af75779a4c16 GIT binary patch literal 5248 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 literal 0 HcmV?d00001 diff --git a/examples/gamepad-tester/assets/Dpad_Right.png b/examples/gamepad-tester/assets/Dpad_Right.png new file mode 100644 index 0000000000000000000000000000000000000000..d099719f1917f1fa2508364dfd7042bd4bcc1a5e GIT binary patch literal 5173 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 $;c1~y2r*O!C%U;cCxfat7cN` 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 M07*qoM6N<$f(7bmng9R* literal 0 HcmV?d00001 diff --git a/examples/gamepad-tester/assets/Left Stick Click.png b/examples/gamepad-tester/assets/Left Stick Click.png new file mode 100644 index 0000000000000000000000000000000000000000..21a4ee7f9a2cdd03f555dd63242df9ff346f6662 GIT binary patch literal 2980 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 literal 0 HcmV?d00001 diff --git a/examples/gamepad-tester/assets/NewPanelSprite.png b/examples/gamepad-tester/assets/NewPanelSprite.png new file mode 100644 index 0000000000000000000000000000000000000000..bd79862eb29ee79257a66e7d9ec25b9f4f878c7e GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}hMq2tArbCx zFE|P^FmN0;NXz>t+sI?LvMKIT+4GGO3Jwhnj7%&X0#L?2R=$(HR*nwWi<^O(89ZJ6 KT-G@yGywp96dx4; literal 0 HcmV?d00001 diff --git a/examples/gamepad-tester/assets/On Screen Controls Button_Hovered.png b/examples/gamepad-tester/assets/On Screen Controls Button_Hovered.png new file mode 100644 index 0000000000000000000000000000000000000000..af9160d942fc0157b51d19b58bc64da62aac274c GIT binary patch literal 486 zcmeAS@N?(olHy`uVBq!ia0vp^IY4Z{!3HG1Xw7#7QjEnx?oJHr&dIz4vKM%|IEGZr zd3(n;?~sE4>w}q{g{(~6T3Rn+idyC{TvS;4#6w2W-DBn?Om3}urSetrW%|2)YgfH8)b2{sRhlf3{L1*Een@GU$WbfdiAPH#mS6Tf z_k44Vp7=wC%R!+hKgU$8nVbo+lb^iP zJnz0gW82-_gjKU%*?eh#c0lK$DM^GW8L06vXbbXa3rYyHHI#QIR7~gSnaa@+tt64xd0>VCgO3DA z#dJP{HAs5m{xM~o>i{a7%F)Bg3^Ea{|AAg&Y3%!?o*Iv(N7sE``MPTQ%$sg5VM)f|xciw-W-2Spe>dxP*XT0{kxaRk6AE%;Csny)={AF^i VTd%M55CldXgQu&X%Q~loCID5d%$xuK literal 0 HcmV?d00001 diff --git a/examples/gamepad-tester/assets/On Screen Controls Button_Idle.png b/examples/gamepad-tester/assets/On Screen Controls Button_Idle.png new file mode 100644 index 0000000000000000000000000000000000000000..2953c67a7123368bbb491b1a013cf9748698e947 GIT binary patch literal 476 zcmeAS@N?(olHy`uVBq!ia0vp^IY4Z{!3HG1Xw7#7QjEnx?oJHr&dIz4vZr~vIEGZr zd3#4Y@34bN>%-#wT;XOL4=*KG$JVoaTun_(+`HEt(p$K}!25(ykVHy2@Tqsk?b|Gs_)5JeU;1iGLPHhi_N>&Gb$`CdHv4WBR#2S>&#sHI{Wa@uT!4? zoUJ?k^uY?7d$Vq?dF_1ad{WQtRjb~u6YD;@c=!F%T7{o;XU2-V7S3giSU!b;q5Ux9 z@yCL`mmhrb*_D{4(Z!S+xk%^q<;SIEKjTBMmzpo1tRLjXp{USOu+N}eK5e<`QHk9) z^Zz{BRQ89uum>WoVIvJACKOdGkkH~F6X70>%{TBa^C)Z%v-pbd;(J)a)Hss;OXk; Jvd$@?2>=-S#vuRz literal 0 HcmV?d00001 diff --git a/examples/gamepad-tester/assets/On Screen Controls Button_Pressed.png b/examples/gamepad-tester/assets/On Screen Controls Button_Pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..17e5d65020ffc14093e7e00fcb22a164fa7adf05 GIT binary patch literal 547 zcmV+;0^I$HP)Px$-AP12RCt{2+%Zl9K@a0G3( zVu_MaJd&NUVRa*5OpNTz@PE~0v&BpPytj`@6dY0eZId|})kC}*E02ly( zF=miu*|;c*0f2X)7Ff62eE@LDfczpN*PCqafLdSxhE-V0w<$FAwN6_|)@y+qB} z6_{zD4*G-74&x~F&#p|^VS(BDhLJyhTsk-s{lk$M0ggnE{pxoZ`GbK4hJgi!HysgR zhk1-6F)$p75nzXTj8{{E;nh?GI1)X^Eio|M5+lG4^B6lU0$l4o#@bgU=?Dx*Vg%S>9{aJw%CdZM&M`QTRC$zT`BFWr|55rBz<6_R zpgh`VlMMjiq&l?Q?P;2(_W;fssfzY_%k%tZKA$U43#{MotF`vo7;{zsZ#dK(Ywc83 lZ(FU_Yo6y#mqT;}J^=id1`GkZhsyu}002ovPDHLkV1lNL_j&*T literal 0 HcmV?d00001 diff --git a/examples/gamepad-tester/assets/RB.png b/examples/gamepad-tester/assets/RB.png new file mode 100644 index 0000000000000000000000000000000000000000..7735e4cc1884e5e735d5356ee84173dd4c6c2bf2 GIT binary patch literal 2799 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 IM6N<$f`1Opv;Y7A literal 0 HcmV?d00001 diff --git a/examples/gamepad-tester/assets/Right Stick Click.png b/examples/gamepad-tester/assets/Right Stick Click.png new file mode 100644 index 0000000000000000000000000000000000000000..bb321d2b760d272bded0ed5134a112247b8d0bd8 GIT binary patch literal 3311 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 T)0~RHw9Me?>gTe~DWM4f?c6a4 literal 0 HcmV?d00001 diff --git a/examples/gamepad-tester/assets/Roboto-Bold.ttf b/examples/gamepad-tester/assets/Roboto-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..43da14d84ecb949ca5f5e8ecca3a514aa7fe1c7d GIT binary patch literal 167336 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 N@O1TaS?83{1OVgyh2;PM literal 0 HcmV?d00001 diff --git a/examples/gamepad-tester/assets/Up.png b/examples/gamepad-tester/assets/Up.png new file mode 100644 index 0000000000000000000000000000000000000000..dce4736bade12ba634af193be17b3394ec58b077 GIT binary patch literal 647 zcmeAS@N?(olHy`uVBq!ia0vp^DImU~=?yaSW-5 zdwct#?_mc4m&8l#vH_w~14U&ouxmI?WRP^J*}Xmg{k;FylINFOdQU8>%qZDwXTNWL z=kG6{$}EfHkJ_GCklww2yMvMlTZ-7B{0xyfK@+lAl>9h3L?5XK9L-wRRMNPjWhT=l z(M3#ZqA8*sGYv8oRwvyl*mO@{Q(<*-%A%I0H%t>NTUs06bP4XACNSZyp;BO*lH2v##g)8dj(wec$f3+`pVBnJeG_7* z3v~jiy8(*~FFBN1>@zY5atw1jdB}r3QczVmnd^j?#!ZRK4q*;68x2L57@yMVd8r^9 zn3go9p~PusZy?(x#-&V)MOu1-S_Ao6QzP?A2gO7M z$FxNk3^phj2XsheOz;uWVv|#0Ztc0qq$1SXcacqnX(_Xt_5{HxdJ=CP&Mhc8l)+iV z?`7VzP2s=e%Z`guPxPm(lX&ac7hsjF!}v*bsr4}(`QVmB76$d%>lc9(0NNN+a-9%u@V(@hJb6Mw<&;$S?)djf# literal 0 HcmV?d00001 diff --git a/examples/gamepad-tester/assets/X Button.png b/examples/gamepad-tester/assets/X Button.png new file mode 100644 index 0000000000000000000000000000000000000000..4b8cec1834610cb45ebf6ecb0fe31d625b584c1c GIT binary patch literal 4575 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 JPDHLkV1gh9uC)LF literal 0 HcmV?d00001 diff --git a/examples/gamepad-tester/assets/Y Button.png b/examples/gamepad-tester/assets/Y Button.png new file mode 100644 index 0000000000000000000000000000000000000000..e32b04a323a5d2bb031cd9174b9655ec6f7d876e GIT binary patch literal 4346 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 literal 0 HcmV?d00001 From 5260811073707e0dadc27eaad7f9fe73e7e14811 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 16 Sep 2025 17:50:10 +0000 Subject: [PATCH 2/6] Optimised images with calibre/image-actions --- examples/gamepad-tester/assets/A Button.png | Bin 4548 -> 1240 bytes examples/gamepad-tester/assets/B Button.png | Bin 4250 -> 1196 bytes examples/gamepad-tester/assets/Back.png | Bin 3141 -> 1156 bytes examples/gamepad-tester/assets/Back_Alt.png | Bin 3144 -> 900 bytes examples/gamepad-tester/assets/Bar.png | Bin 202 -> 120 bytes examples/gamepad-tester/assets/Down.png | Bin 658 -> 255 bytes .../gamepad-tester/assets/Dpad_Default.png | Bin 4929 -> 1483 bytes examples/gamepad-tester/assets/Dpad_Down.png | Bin 5248 -> 1580 bytes examples/gamepad-tester/assets/Dpad_Left.png | Bin 5201 -> 1557 bytes examples/gamepad-tester/assets/Dpad_Right.png | Bin 5173 -> 1527 bytes examples/gamepad-tester/assets/Dpad_Up.png | Bin 5157 -> 1567 bytes examples/gamepad-tester/assets/LB.png | Bin 3007 -> 989 bytes examples/gamepad-tester/assets/LT.png | Bin 2862 -> 1027 bytes .../assets/Left Stick Click.png | Bin 2980 -> 979 bytes examples/gamepad-tester/assets/Left Stick.png | Bin 3840 -> 965 bytes examples/gamepad-tester/assets/Left.png | Bin 715 -> 287 bytes .../gamepad-tester/assets/NewPanelSprite.png | Bin 119 -> 111 bytes .../On Screen Controls Button_Hovered.png | Bin 486 -> 316 bytes .../assets/On Screen Controls Button_Idle.png | Bin 476 -> 312 bytes .../On Screen Controls Button_Pressed.png | Bin 547 -> 299 bytes examples/gamepad-tester/assets/RB.png | Bin 2799 -> 1057 bytes examples/gamepad-tester/assets/RT.png | Bin 3066 -> 1075 bytes .../assets/Right Stick Click.png | Bin 3311 -> 1097 bytes .../gamepad-tester/assets/Right Stick.png | Bin 4144 -> 1191 bytes examples/gamepad-tester/assets/Right.png | Bin 761 -> 301 bytes examples/gamepad-tester/assets/Start.png | Bin 3098 -> 1123 bytes 26 files changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/gamepad-tester/assets/A Button.png b/examples/gamepad-tester/assets/A Button.png index cd716d1adee46c185b041b37ab69c9ed0f57d208..55b15834c6e9928b45fcb63bc539b04f97652c91 100644 GIT binary patch delta 1231 zcmV;=1Tg!=BiIR$8Gi!+002ikWo7^X083CzR7Ff_afjA8Sd$(bEeRDS1R5;}8Y~DJ zD+d@X2O2C0s^W6a?yi~JS0_RYkl9G3-)xS@Re7^NH(e6M>zz!08KK@}Kx-AX=7eRS zE9G1=tpET33UpFVQvm<}{}t%RbUvW!TFdfhV5^&DO<%m_^74tIp<{k z;eEeA6KrD8nQ{z(z(uN18ZfQyKSOXbS27e=kGYGT9tduHYRhAWCY}H`2 z@CLCevr_8Bf>;bu1Y^rt4?KpG3L=+zzy3QdiVVt-P?j}W9bm91L#0eo-WIEpleMrU z9fq=)vIKoxf@G0ohNLi)u%N@RN!D8QqjTxF26a*7dWlE@LKZipV9zyLXZ3sSuz(a~ zgb0s!$A1lSkWw&{ur4U2(n5MqLBvxAJLJ(M>=iQDx}j_@!`#U#W(Aqu#Wz)H0%aex z5ax2xQ^)ZYn3ggGmc7ZA@Ca!Q#4Uxz@@2BMc!bdL8I#gS@@2fmJwg~@99_Ih;Sqmf zD_hj--+A=7m|FS5-jYnAY)Su$+2i6hUyItn+)%!{dl4>56NGSgNoMV;*5hItg`fyT`uF{0>T&TKLiBP(9>})d-}{4iAu=H9AVu#i zXCctI!m}4&g$V2ANB4rf3Yo1kv~Cw)gs8PK%Xm6nd=WA~oiU$)cr9%0zfa#@Ortww zaDOqj9)>N2X0CYRJU=*sW^F5>4N`a+mW$&XWN52bE1ZCsk1kHw>dluH+ZBblsw@sJ zPWjR@9^Mzly;Y6-Pl6`twEc3T(^-^l70ZGX-&^=57kJn<$6lE=~x-0%*>;@95eNd;UT zaJWw}nY#l?XApAh)QYTFsLK3O|-SU?vN4^BYSSDNtoL3LVvJ1 zC@GPq8dDv@F1dAQw;+ihBN1wSNCrC7u;sd=3EPl=oz8tfb;@cDmo{YywQO6yoMNax zBxpYKC?cETXrnJZaS*Px(G|rS2>gu$Ok$SAw58O5?#g_wsULoh8At&>>TA>Brh=o)K?j^>*4GEl4SoazH{YKAR-c?? tmk1v~)rV*0Y9tS$`8?nkzxc(s;~zbHZ3NdXIL`n8002ovPDHLkV1jJbI57YK literal 4548 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 BC&B;# literal 4250 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 M07*qoM6N<$f_5(@$N&HU literal 3141 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 P_W)pGXkkzdzw_i@Qq~8{ diff --git a/examples/gamepad-tester/assets/Back_Alt.png b/examples/gamepad-tester/assets/Back_Alt.png index 900705b172733f225e5fd463e3b5d91443a68c5f..ac3083ad9ebcdeb88f832258d66239424f1ff31f 100644 GIT binary patch delta 888 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 N2xDSnTw~-*`VZNt{51do diff --git a/examples/gamepad-tester/assets/Bar.png b/examples/gamepad-tester/assets/Bar.png index 08334f6302ac9a376b3e70d344cd6867513e134c..733982e56a4a682b6488032f13720a1f56ca7020 100644 GIT binary patch delta 101 zcmX@bSTR8|o|%DxVeaEaktaqI2DMj(gb@PePg_aCr?G6LB(%mNM!jC*ai_k(0SUHx3vIVCg!0K2Xn&;S4c literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|T0C7GLn`9l zUS||!P~c%Ue8ybd;l|JLQ(@upS+DPGzR$H^utEL-ONqk{=IKI97+5tN7`a-64=Au1 zb~y612^zE+0O=%wW(gkk1}H;0ffpoj1gJ*Bj{(YXJ0JxT04X+@!vJOUG?;cAv}%_B YGi6F+b!eI z+icGcr$;`29+|y%>$NB-q5t^M3(>09xP{?lQ2$&jj~nl_j5U9M@?ykJ$qD9*|GhX} svBg8?ZLE9ttE*QZzOwrMTE3J2V-5Sn-#r#3K-V#Ny85}Sb4q9e0JDi@mjD0& literal 658 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 diff --git a/examples/gamepad-tester/assets/Dpad_Down.png b/examples/gamepad-tester/assets/Dpad_Down.png index 944d59bb015bd1304c86dad5ccc0af75779a4c16..bf01b76b45e23eece1404b1ad1a7c087e58eafeb 100644 GIT binary patch delta 1574 zcmV+>2HE+5DXa{T8Gi!+002ikWo7^X08~&+R7Ff_aUUNa9v&V(K0YNSB_bjsA0Hn^ zMn)PM8Xq4YKtMoFu5Bq=LC5>Q&y|nx8LZmQ{Ma)&`(vkt zJd?Z#A0*Jusz;hFHv=lmUZMfFyyKP{L75 z%IeLGiw#2v^-C(<2kCma56eFbQD4eY5X@F#JO=6XWPb{fq17h;D?g)ppnPs1W%Z6+ zEwfk$51rCo{rV1a_mn3c5s!*zycQ9G$PbpDhImln*K8>Rtltir87G?uqi99k16| z^=k1t27gG>#kxC4=aly;E3%v;#v+MbT!HRR`N>n>r)0OW`WnqJlBBw4l=p(qK9d)- zu(}A6>Yga?%`wqmR#uiLI$=UXNGeIF{4z81{>L=q>;giPW1v(lioA*VzaT!|!Zw_h-Xa&&rw?pnTo(Yb<71rk992*p%-ok&O( zy2Tq2SQi$Ix=v{k$Pm?(%lh?;WNd9A{#}_81!5>BV>qcmwk^c}Z8W}8M%&siMx;*e zQh!k@q~0Cjm(4I*uMivBF(##3%Nd>rsChmASw@=-@<}`qrGWF#OVCS1iqRzPhbE$A z>RmZ$SV1Vvkbu-`Ao0%90A!zkpOjSNO8I1Q1%Yh$kCH~SJ=X}NJ?cLuwPtzM(VB=aL%I(hFtc&yAb&p+$;Tn}PeUsIIeFtrv0DtbgwrQ}H!0l0 zM)NQ>*xofH+vAa)O9e8;d)Eo7QEa1MB_UhzG8(!SMeaO_j>LOdM1%(n61Y9KNOEXJ zCu2&IZio5nVeD(ZM-1P;J+#WS>_W>3>!@`IWxe}qz)FeqCe#G=VnmY8=I0}^S$_dW ztfyyc%Bb!t(8|#kck}a^P@c~oDZBhivRExsc~s*`Modwk3{h1VR;uL*FCo!tb?zS- zNI#(UX{O*lW%|E#0nL5i8WOdB|@D#zb^G$=~M+ z?>gs5jIjxYJOMH-LwJ0n%XKB(eSZ!>Ttk?2^%dvKWUKGx2zQS&b8}6J26_d=yZ>_O zVqSyHa)k9SFWJzOXkIo87Lw4j7#n&-dHJ)EguzI%p}Uf_J&1;&%7Y}MhLEJ~(X4g5 z{05Ft5KQ?%cY!o;vVFB8ZbdCKGRg4Y4dSn^p1KooO^i_8l5`RWRQSPbo zp!+?PWK$E;HdE~+329SNK$2ENLeXEeQ*B#VtSgV}E;crXO{3mxKBLNGx|8jV^!gID z(NX0i-I>q0Zg}zFC@imhsyo}muoQT;VU@=qpgR%v)yDo8C@fO`iR;dGzofAgbGih| zJM(lu^13N{aTX{aLS}&Q{eKMa$TyI?%@^1Mba#qh&wJlzR<=WEmG8e?nW~aybmzGW zXvdph3d*M@b%!vD`gFufv&t4v1cwk?L|n?#K{M}|W#ZX#YX|}Nb|R*TIG{#?5e#ga z%*Et3!AIgeJ_}D*uw$e^oc%^dF}y+P=sCul;BC Y55c-w;YV-|;Q#;t07*qoM6N<$g6JCLH2?qr literal 5248 zcmXX~c{r5c`yOjUlPzT_V`(rn$(DV|GMOQhZDg;J!5~YPELlP_h!B%~r%)K#%Qj?- zQIjo%B+DS0C|kbo=Xd?C>%8y#&wG~Ve$Kg{``kn`jL|7hVNMVTbPA0!v;e*?|2<%K z;O+Y@!wLlAH$ofgSq0~AI8J*{zi<5)oL0@~3cB4zc2PD>{ax;T`Ag#2_;bH?B4S*1 zyGA0SmyTF3(oenpDi;25{G7XY=*K0{r7u!1n_$ysQFbRR6a(i8w`?eB6mg^lIq&rb zH;(Mm_A}qkHZ}KN^4@-3Xz}v1Pb=3D^L^SGaEx)8g#arqXL;`~ zXd2Y0o?L%ifzf3hZ9>q&SLc+6FHq!#H-g$i9CsX9f1Vf5$;lDrh_3DPn~{qW0rg6r zodb>5BIrCI#E^!Dy850gap`i>{phE_s3aI6WwBYh8MdI|=VCklu$(}hW0Pq$*KcfW zgfg^_Sv$X)j#C~kmlL2frJrZO;th5ip2>^53uDLaHja*Lpz2qz6poprDl5&fXUGTx zn(~291&wIe8;7?&cx6p5Fu&};KVgh&unUKSyOm$j zTX5JwDk1w|LPp_R;7lnH`DtR0lA)RD-h;1W2P7s7C!K=F#c-V5)I!L=kateHxtNL@ zuPN^x)WwxFw;?)f#N`kdMWL0}(Pnxed0O85*fx!pwM^u^gjU_ z8!hD)FM(tjRvNU;UTd4>LfB6Pe!r()Y9W(!?E>VnflVe-0Q+5Sv(UO~qtWiwal91~ zJYQ2hYVp$Q#RPq>u76&QE9*KtolaK~>cp3*=~Y!($)3rA%%>UJ6|a!<{$R>1Y;N5$ zl1gXl3o%9X`Q2FC+3$EQt5F-EFPmYkT|gCOo-B(zjpSXrCzN&lec+5dNa^@Py*v=7xry=R0>C z5W{iLjLY;TQq`ExtO4=tJ%A3leER1koADF{+uGf*2RZ56u;+PSMViZJU4I^khVj8k zL$7}-b3Te5B8~=%47l*c;ckbAiClq&*5kR`)i`^sd7xps_86FL-VWFY>x*rA& zdn{n306eZ9gGhEN1AaD9MaWQBnvcUh+qJ+bOkY_%T5J-}GYZqtGeOCb7`X;>6x$P~ zG+-;6$&oe=q|(v+iO8+DO#`fY!R?5h26=HVMF$UKe&jP_N&6jsPBx$&Jj^{MPc3w- zx1G38Q`Ua68H*Ey{>jL!6{BDVGhrNM76a|Ndn2_Mk>>o|B;1OCL{ADNdC?4URvgT% zmTb`Cusb$YP8hke^5)d-Czsr7*DXf15kq8jY0a=}J)EBtKqy+Q&;~))s&xi1Lu44Q zGg+Y!hX1WNRu3$sMV-EuT1Fub7K=LZBUAJ$Bw;8=-qF%Jh~_K}-Gb;QaxSWkSocCK z8X0?sjFya(SH1LIW7?%h?!-dSX%5FUc~e?MaK$C2ZlT}ueEK94Qdg@$OI&;A)ihWR zKRWFYHT7!DBQnQcPqatE#nY3n;5ll<{Ls*JkBu!)J2xWOt_i^O#*JN1`HnD<7X>qy z_-sg+#4}o2tHIOfci=a>&>stAoSDiv@q61##j~nhOfl+q3`SSX^RNr-8Qke%W*7MB z59b;j!()NUdSlE6%3tRGHksZZ`<=1JVz#+4IGFINgc3V6K*=s&-H!VKEcBD!)vCsj zxLMnRkf1>sk<|d%#E{6>oCaHWLkUBkSeAVoIT8z%!GlbFSwT?4j$nlXm@^NI zDb(7>k~*Xz;LLAnQ6EHD=dg(@iz`ua(;**({O@t?ySrz{eROBF&2+>C*-`5y-ugjW z=UNb}Wk1ntE`sc>vvT~%E_dZ$SAGErDb*R~ zJ)7NeB3wEiyyAqa;@@9THa&?SJsK21@)8ZZvC`u+U?#`NZ??SD8)-0bGzgvc6jM=D zDXW+TkxC~Hsf>Kt?4W#B=l?%yHH*_qA83XZPtb81c_Vk_De{H%)+0aXe7zKBU2r+= za_K$v#tskacxxK7ytb{=Bz0e zn>E3U7B2`{bIl(*hjiqvWqv|g82ytE^7Zpu*vDMk`M&sD;uK|T=0b)sP7B($rs+xP z<;Xha+nCoUCYZN^AMWhSP`j!)}{i+3b2iyJm zIrkVb^m;EfdUt;0l_%M`>^gk%_6ykenHOSRh1C*H)={upbm}Hiy z?ck&cT_>#js;9E>N>JPDJFvRV!^87rgpm{+!H<;L4b`6d`R6Lfz|y^w6~R9kA#K|n zObjzPzk>^CD^COxvmLx{Q9tGZ6s)#@4j9_T-k$N9ihhb1!ZBJNqz*0Z0_0zFDXW4U zR5Ifg7(h@BM7seeGCO+M5&eqSctYJcKx1yu&r}zTh$of9K<)drDE|5*)vuvlij+&nT&{uP5buE?PZT33B0zRX)V7 z9_O%ndOt=$?~Od+DWwr|crq<1e&;QXpT}-#bwyU-RYIe2zCj(+FD zkmfWt&8DsBOg>!>A`-kobRfC?mW%O@3Hh2`Ko2wNPvgnp(e06l9e?EK^Y15X>nZ)o zlRv&=5c=Md&N@FD0A*xUy=bDa7A@B7(0=SwSZ{e&HZgFNTz$bUTU%t>?NS`N%wqR# zlhS$ehxz$7P}=9K-H3>_Z10j zKqJ>PdSN~CN$i)R$%tw3sE_Wk5gno)8)_zbsglE(VsGI9YoLgMXa6c|864zH8z{}= zY6YYII%2Vh+kK+>b8z`G7H~3Nq?2KBSLw zsHm!D^_@W$S*kmV1twi&N+0OSFO*=2>xoV4tB-DJPLQ5v;pR@kKeLP@>~de)>+zV$ zW@xq8v^a46eD?r47 zNgNx)l1hC4Y&t&J?iF}`UFxLjhX9S<6y1OE>FK8@wj(-HFctN0-k*@;01pEH=d^F= zT)s@d^}Jr>R_=!$F+kvX`S?t`fJlt_#L~cf=iM}Ue7?Tz;?_OwkjuVGPFdSd7RAo;R)Z?LR`Yy)zAU6-U8gBI&TI*a_62oP4Kc|xYvMC z`rf~1=i=g$NMG>!%V02U2xXagwnjHGacODkxzF?+c8PT;=OH@n^vLzThK4J*7XK}g zZaLq%!va*DCF9F{*@ZQxQt5x!s%knJS`h~usz0t&RkhGz>VUgL@20Nr2$)L=lYq2loZiY0PZ}aOrdaJ7z^k9Rya~# zN@GQu`vwKYWn`Qo9eq?DRw{J9+oH<-+a?B~Db^f$tfO%52JN+pp-OkOEJ5oj>iathGF< zowU5ypU-0ozL>NP06Be}u63!yD=d_dbIZuZVNMjn?yp+TkrC)@JFb+x$kl&84cGl^ z)iwjhdz-IG(Ue9rtEi~RC%<2;8xoIKBA3_Tt|*85NQeWvqwdl;`HJpSwY<}rcx`UG z7X~~DPrGh!Jy4OVJHe4qJSi)cb^VLy8cHrxso3Q4%e*!w_3gE>ix0NCPVC;-2;l3h zrA>_D+e3E-{Y^FUuIUtTuY&>_OOzOKOW}me-}V!WnpnZ z2mqCBcb@Gn?*6g|_7ej_@x3xRFhES?$qWUUJ>YLX-hV}L^`V5P@(t(cn~b8V11HNlLXP$umL2StFYALZ=H8e~|15J|qJhF$x^JDb2#DlpG(BcNcI z=H)9Z$#jur36LO!{f3^Y^J;5yM2An9Wge#Qrp4hp*yKr%!a5G35ndCrOOc0Yj^MMU z_K$QtwZ@*m+_8x_Mb%8CpFvKs;cw)Y3dTKTF#KI7XQ;`Dq1wyNqqd)l2*M*&>V{)| zc>fB$wOydM>epw@%}1S*GOe$Fc0cAP=iO?W#><^!`6jems{(tGBo>1)>33Jwub|a6 zrR<2aloND_cT{t2)G~grudkPh%Di);THCs)JQ+K=EVPTCdRiDZdXNtyvC1Skhgrtq z3Mc3a1At*Mpy&i`d^Y2x3+x8Nrs)Rk*#X;PmUKqaE5MHU6pbp1ynxFs3{#_D{rYuu zBk1mcgr;#V>=3ZX#1^JXk5k>*q(cYJIw-xIgl7p4IHt@!aL zk^%-+0}?P5i>q~rD_8rTpPkAlwr8GEDxm{9Zge%^u-|>9wf#-gnwpEg{xZqR3Bnr~H$&Yt4_Zj5AxeujSSMA&a zESi4xY1GxyN2R1s_3;3;OiuY##5UMn((KXoN#XnDG*hb-8;6_ZphW;E6RO6XH^0>* z9QJZ_>|c%Rs;a7{7@9v|f6o;-5>L=6XiBMf{dJuN$+)A%9WYf{Iby<4SA;CCVqd_8 zC&-v1Af@>Fsl!j?>WVGfb=1!c;4a^~C3i2PP%^f?i6wl9oUf8IoKh15nP+#JbCk{C zY;o8WItqg3FKdTgV(u(4O8M{l{>oZg76Gxs_Ez1j+1lUn%+1Z6|NZ+}hUZXrkoKtZ z-Q(6;g8uH8tinA&? z@2Vw-*~yWbNOf7R{Qcx4@1|)W;4Hx8@<{+kpOfw(dNl0UI@SC{r@e`ZxBvY9Dof|W z>gsA&j;hb=UY*!3O(giq?Ck7u4_%*`bSc!fDY0p zTD@>O{o1c>S-n{EBf}Tf^%7ZiF29PZlko#m{T)J6R+km~2Btn=w(MGdhA90y3Bjjn zx_O(XUI~vW{(oMaI#{P0X4B@m$uv%lc>oL1l0VzfMh)R`jkMRF|AL`!w~whuWD%s*Q|Xth zET-D6e{=QIQ1&4Otk!5vLl|tY`6}fnvsW0$nAPa|-hbZAHAD|RFk_lG!1fZI>N!mL za%~Q*)yz=6zS-+;9)E!tQG}gwub&1e^=`&|5AQt$bRQkW$P*|(U)d|5Z0iy;<~t+Z zBS@gUxt6<~c&WA^XIQJ=Sfcv?kTF)?Ko&}|=NT(D~_$cpZy z@{9Pz%FYTFi*rTko-407PZq2pRhM?=+_=2Z1t+>^${VvJw_p`H5n&uJm{Rj?N`me~ z2#J)JQV4$&oIy3Ahz!Q(-Vogr<=qh{J&Bk~34iWA8eiK4x`&KKc@alpj)YG|zaugo zUmJVE(VIbx@>7?`ds3orWFxyAFtPUic)a0Mj3C|-Yfcd8g_drxG9JFS<6C>%i3~Ah z^f3#NcuGp6moq-TqqNy-+4ZsucB4q?dfD-B?469S?e*uKPsC2e?l6jUO?=m z?tgz~d#8#lly)50lZcb+Op+-d-vErYjFA+aBr{R8BrJRWz(x$hhB)4fNGcO$_J+JA z#-Htee=wYqV2pM)9Pcwxv?On%F#<5wGRlTwOhHc&1=SrL-`In#T0(-8rbZwybbMnk zwrvaPi9qz`>H%`ct!2B+f*7*BU@;Cw+{%gqpLz6FU z;U&aKw{Y?@-Z2n6@;0)SH~v96l|61{Oq^GCpn!wC6Yg=tL8cyZz#OD;^@H*Bchu99 zu0C_X#@FMnK035s`I$mYWL!D4cy?$Z$8SV>42O?jk>w9mAmKDNc(Tr}ccgP&1NjEfgU_N!gB6^9}SZYXuvK$4=OX(!YWH>SWQgl;eTa#s~|J^3etF!z{4X+TUudQiVct;pPg4%trcrzQm) zy4qc&)tK#4)RdQ^#sn8Py#amwI12K<+G~_lqRlH*3n>eI{49U6e-~ z0?I=cMzO1#b;(*AifU~LkVGA0L=>JVKMuxH-TBgSDi3z%|8(|_G{%?`B9lD4m0irlxS4&k*i7c&~Y0C6o&ryp+19-l_u zV4l_+%%Akjmsa^j^kJvmgu6j7RDARyLm7R!Agsxx>tB5Qtwdd|e^^kJU-=xPDd-O| ziZ6YMVds;9u2oTD%PDHLkV1lWE B;^P1S literal 5201 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 diff --git a/examples/gamepad-tester/assets/Dpad_Right.png b/examples/gamepad-tester/assets/Dpad_Right.png index d099719f1917f1fa2508364dfd7042bd4bcc1a5e..7bf492a468601288776c395e648e7c39867a4cd5 100644 GIT binary patch delta 1520 zcmV|2>I&Kr2Ce=eQiB|6(1Xs-^xsTf@a{~j3yYvC@>C(F z)*F%EaHW;grhF?@8-h~#LC7IPM%zkf77cNj^9vzs41-b&k+RPbL%ZUhguY5Kvr68~ zn7&;ONaWCyGWltg-%))XbIx3zq|}}vIHOMYQI1TM$$yWNRermWix(+I5BYqY^Fa5> zLzGj2@`4LyDbGaAFq9iyKB3cH2@ya7<>lirE6gz^W^k71ZXr{wyo9KbJx3{QtP~@J z$futyWK5LjhN2@@>@&)kVI(;vx(CV&?Kh7pyKiNaFfiQ#@PAZySb1}YqMY}Gz9Z^2G<%DfxHdyWkRQFtY=e!FTvV+9I5`r;QcQ1-j zep}^49Iz61LAdT>(2}&e-cz^sJ z(%mR86GkW_8sUh^ulpO25^bW7^OEUqa(bP6i7fY;!JJ6?IIURD1toV$nwn&JGvLao z`%x=AKA5IL33osm(S&P2HOlev#?iHrBEwM#VVY}AKyi;Ni z{?VAcd#A*Xn*|o+nguP=EO1?0+bs~g%>vsk@NExsJy`x?Z4XZO95Jpy4V>#28#sD` z0j((8f}8-|hqx6bj#^Q>O*Nq36|`1fXsWr67me=$ly|RU1aS@3>bRNeDSxQ)u;=wziD$UOT#ns`r|Wf4l$PC^#AR1>^eN}r#woOmqqxD=2Cug z@?V!}6E{dlzJpMhqu&-3)z3GqE>X^<`sNQl>MHxe$E9q3etzYrE7qD{0sPtj%l-pw W2H~OQs)zsp0000M)?d}YEpBm( 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 AivR!s literal 3007 zcmZuzc{tSD8~<7c4Z8M31{0FC&{Xyr&9x+1ry0wLC>n$eZnBJQnJ`E$L&RllgObLQ zC5$x{!_0MuNLjjmXq1xm_wDcB?|nY!yyrR3bI!Xw?>V3MzN3S+I8*@&0D!oy%>`#r z`~4asLf{-apXUkyqA9i)kgm~1t3?(;+NH24Bd4J6=#IU}c5GZg%5|uJ zpNr_rh%f&voi4_YKRt?nPdV>p*ztUs&9DDk0Id?yZUi&6DTG4M6E;ZI?wt95vejAe zSrwQS>>w@2=Ay&8fXKX80Ix?szH4WO7bP5e?%3hf-Vgty9MnF2{W<*?H}t*A$NlbR z0%x2?qjC7^_$V2-9`PrnCQ10;xUsYp*6`EV@R777nF{Fr{tjlx+|o><@b9DG;_7KW zN1d}JdY2zt6%U@t_aQn4P2 z)5S&EmKf-=hZ|pt8(+7PuoOv<_bk)T;69ge>za>`&nKaWBmSYY|lru zdmV$p%DAg2x5@4dPb{{(r-xt9tIeBxz`_Y=ir*A3i2w|WWz)KCmT zk!dD{s^7t-(^OL0@4RBiZ-1t>gfFDiL;m>VXqjfA|0UMD&k=PQzs{S&lrO3PU^Z)N z%4R~inI|rlk6AXmGjmT|7Rq>v7fGaS{_A3DLcC@-gVehb&&+n91^WWsLqqrJbt}eq zI$$6Yc!E-B$udpj>Eqgmb)$@x0t)4}epn|9!3YGx)^d4PV@F4Za@^Ld)d@2AGS2et za#xl2%5)0ojSghT#igZS&?BMufIg`XE>6yO1m3M|+F!AT_$G_yx@sk7S?tT_sD0Sq z+XdTU%Lyx8G5b<`MUuU+jrJhraT@}{ueJ*|G_FjCDn zyyMTj##r8|txd0qNhgjqo&0D(6_#a{qqh5+jam>}7UR9BKG@B;6ciz=QQ>?D1er|Un!EQKWylZS&ep_2#8A!d#M(%) zHWJX(fp6?Q3l**AtaR=^m@cOm=a`2Z#%G_rW*zIc&#&9;|{x~Yp zSu5`t5xkJ1c4%Z|BpcdiPKo>NaPbbbXE4!Td-IMG2+(A{zIXq|#zui>6c+h_k$JeE z{IfER$wceu=@t6BxjkhtQp?NB54{-9f3i)ni $;c1~y2r*O!C%U;cCxfat7cN` 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 M07*qoM6N<$f(7bmng9R* diff --git a/examples/gamepad-tester/assets/Left Stick Click.png b/examples/gamepad-tester/assets/Left Stick Click.png index 21a4ee7f9a2cdd03f555dd63242df9ff346f6662..448bfeedeb797a6b03d9604c5d5e6bb120faedb7 100644 GIT binary patch delta 968 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 literal 3840 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 BV^9D9 literal 715 zcmeAS@N?(olHy`uVBq!ia0vp^DImU~2VraSW-5 zdwcg{=wSn%*2G=x(gvcF4Mn9lu+I^RnzgMn*R^x~n)%Pw++UpD8Z>#@Wp4W*Sqsll zXG8slj#!ok2Bm9^8;d+R6p~~GwA)+oagWcLaQ^%C_uKpRKYvWBouGOA$_38HpQIZe zW#8l}>SpZHKUT6$Z9=-lf**@Qn%5*YJZgW$Wi<7u&&{@A)}YCKw~ZV&E*5c&GK|>w zM&jtgyrT?9`!>y*uvX#Bl(HGF0{lFal(?LNUM0>`J7O$*r}k>H4&T?k4jx{T&lMG` zlMI4g96e4MozYQrU(!5t)4WOR6jYuHF1O~;D4wEy;^OJ6f43fNdy?;-;^5Jxz@bsk z`EqZ}#+tw75B8+2Y)tX%((wor$(+!m@k!xkfKx+?lcgr#m!)^-@#M=nH>P-aSxmSX z=+xBHBP5m*GUbAT@}d@YNnX|opNiSr_bJ(&$awGT)ZEin_^&&0N%2#g#PS$e8C%&f|8oy%YXH1+~#PD&JYQmM|GiKuRWw({?XujAM$Z~U% zkijj(RSr5D2{#N@IYtE>*pR%VxnU#kV$LN~gbcPNn>6bzYSXYA^>bP0l+XkKAXp~I diff --git a/examples/gamepad-tester/assets/NewPanelSprite.png b/examples/gamepad-tester/assets/NewPanelSprite.png index bd79862eb29ee79257a66e7d9ec25b9f4f878c7e..0f70fa4bfc95283c3be13f44c9036877ab0d002a 100644 GIT binary patch delta 91 zcmXTVpCB2=%)r3lvZU)6kYWz-32}9Eb9?piKp&9HS>O>_%)r1c48n{Iv*t(u1%*6a o978H@B_~L*E=~~XVS2;Bz@oswSab0G4xlW9r>mdKI;Vst07*s|UH||9 delta 99 zcmc~VpCB2>#=yW(Tvhc2NHG=%xjQkeJ16rJ$T9SEaSVxYe|y1Ekb!~Yut8ehKiNhe vyOm9Gm&%@Rlu&SJU|?io;Shi__ObGv?6q=qxL({0)Xd=N>gTe~DWM4f+&vxL diff --git a/examples/gamepad-tester/assets/On Screen Controls Button_Hovered.png b/examples/gamepad-tester/assets/On Screen Controls Button_Hovered.png index af9160d942fc0157b51d19b58bc64da62aac274c..9e986fc9afbfd27bd94fad724535996eb3eb9acc 100644 GIT binary patch delta 300 zcmaFHyoYImWIZzj1H<7j`Ncp=F~BFp)yc^zIyyQbA;H1H!P3&w(a|wEIoa9SIXF1j z%gYNW<$FuA9;leLB*-tAb4UAmeUXx%89)Kf0*^?bDcr&!%*Zfnjs#F}gQtsQNX4zU zH!kuXQQ%<-6n5J4`X9I5^B`w8r!MIVDen3o3QB#3>#nEwC|Buaxs@m0D7};Tsj7BO zTV9Uh=Y-aX$lg%L)KJl*Q%%FB#zY3DDr~dM3HA|C+vOuvd|rxc>IzdX?dYZU$M*CJ zMSM$~oy2CCoXU2(X8O&Lnbo~%aRRgTjKk8_y*X@lbkZRqozr@!eK<}Z*`TtqHF@&k uw4NoZX$W>wG1Jun^UdInEdKbLh*2~7a(T5{F^ delta 471 zcmdnP^o)6eWIY=L1H%`s`Hnz}u{g-xiDBJ2nU_HJ0#6smkcv5P@7U%Yau8sBFtf9e zm5EzR>qSga%N&M_3QM1O$SAsd%$%fLz;fw=q@YTd>!+Mq4LzUKmqyyZtQB1pmHB0! zd-NK;>E4`*U)m2pJatA)Ny+fo%$d9`lM25tUX^EGzdt0j{_C9QKX;#d{`p^q$*ond zRK6;{OnbY`dGAuxi#T zn=kFp4(L3zd?9b7C;s+(eXeRy^+usa!$gL6S`%N_{5DNL;>B{AkTJ}1Rn{8 zFeQmFB?C1c25mteZ9xfPwubV~go^1LJySUvqLn1_IuFb+VDOOushG}Zum(v_+&`v_ za~(isQ#pD#nL#Fk^*_){ERB7i)KlZJ^k~4k&nsV7O`mzw%_U4pDJ|!Onepb{X{k5m z`;S`-K75_~w(QRP?~~hKmPpbP0l+XkKX?4vw diff --git a/examples/gamepad-tester/assets/On Screen Controls Button_Idle.png b/examples/gamepad-tester/assets/On Screen Controls Button_Idle.png index 2953c67a7123368bbb491b1a013cf9748698e947..43e17e283a2f1645d8253a37d5148ecfee6ebf05 100644 GIT binary patch delta 296 zcmcb^yn|_iWIZzj1H<7j`Ncp=F~BFp)xp8R($do3-`~s2%h1r!!omW`4G#|w4Gs11 z@BoS*dH356sF<}R$S?RG=h1%s6DPe2fdZTb9+5y(xP?KOkzv*x383H_PZ!6Kid%25 z844XX;BdL<8lmyxA3I-9@bb^{;``+)4%;(86D^>U4xg%+F3@FVnCUC9ZUTHy^U?|U}MTY0N0*|Ie o%PB_0sGZU}weDa~VazwyX~~&a4sLJx40Jhzr>mdKI;Vst0Ks-{v;Y7A delta 461 zcmdnNbccC@WIY=L1H%`s`Hnz}u{g-xiDBJ2nU_HJG*1`Dkcv5P?`Y>8b`WWOSe&0L z+-&3FrR3_^dX|r?sfmeu_nJd`3pW^epAZU?NC{`W81c!+Q+VksZ>^2}C3Yf`y(U)m zJvpnda`|57aa(+`dG~rog{390-#L4vC-rQdnQLEXA0Ar&b;|RfvvsGRK3HLMZ`RE< zuboewPwKh7YSp`SV%P!nuqQ%cn3fv>#?X{#elW@`EovyAsnh zx|mWU7wMe7{J6C2XME`OQuF1L^@F@P6ct(u_8FARr!7}KDzV#U{+~yi%ARu@Z(es! zxqinUgZCd~KJm|t)B9Eb{^`FeAgPITAp@`JOJ0Ar-gY z-q_7|#DK%)V#4ufAOFkmxz;o_?R2V$>Yc9ocNtNAk56u$oUzQUWZMQcrJ`Onx8F&x z1>{z4)JaKJ-pjqY<_wdub3$65;e+VKf>+RnN058yjPW0N|XvHpW~uSAX8|vDUtc$ZT_dDvIJU zNs{-;WC8#-Cx)c3>icBuS8_DLS1_^>~Qyfz`iNi^bxg zMba1N98?vm`hOW%J)6_|ivVD)J#>w<$FAwN6_|)@y+qB}6_{zD4*G-74&x~F&#p|^ zVS(BDhLJyhTsk-s{lk$M0ggnE{pxoZ`GbK4hJgi!HysgRhk1-6F)$p75nzXTj8{{E z;nh?GI1)X^Eio|M5+lG4^B6lU0$l4o#UO_xJ-1U>-# XmIe#~x(+9>u$;q^|v|e6biHV7)r>ApsbKBe7l$4asx&r6` z000VfQchC<|NsByDVTG=Lm-t<0000032;bRa{vGf6951U6Mq2!nw%H_00V4EL_t(| z+U=Ryc7q@ghKq5*hzzLY{U5cm8N|UY$sPYio0I1JAG4^L>EB;gR#sM4R@RSH{Tk3V z^r1!T=C=T+^4plItycgmT7A#Iq2&Wt*?uEGX@5tlK01A!u$MyzMFE|3lsjkFho`A? zTY%GOG4(a`dVeo9Qocm77Mu#Dwbln|f5>SVV}Ow`e@-=WwUd(AUqEE7dcs(5UQXsi zXziQwgu5JG8+#4la^3(fW+)P`N|R1ZBJ&2oNdPb+=}_ABsjYR= z+nqo1XN>7z{Spd|Af<2k5sD-Avp;*r0HUSeX8JRov42C8HNcVk)_wsP`A`7Kmknf0 zWk#DL?h(L;LY6LGUG*pQHbtrR8TzI~1;M3?zK4&@fxYEVaAfqY-RubP`Q+%CVfq+YwOL$d6GW!ec zM*j@&!O{2B3lI(f{oWJn{qU`CK%h_u4@Kq!5u2;zEaU{h2Qp#b>OX=o#-h* z2!CV9-~bYxwC+II20(fhOmmy@_Zoz4{GW_-<%i!XG5wx|Ant3xJ6DhPG6Z+mpX2>{ zh9BIthD@ai2uqpkk8s|r6<{2uWg^6e_!zQ3IcWcA2_arGoI24(!8wR=@8dyi4nUq- zcZEYxk7RyMeUuw_{y}cHP^o+xsl0D9jy;{b$0xnQ15QoRCW`h%KDA|0c6ir^$^2J RE4csw002ovPDHLkV1l;@^6LNq literal 2799 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 IM6N<$f`1Opv;Y7A diff --git a/examples/gamepad-tester/assets/Right Stick Click.png b/examples/gamepad-tester/assets/Right Stick Click.png index bb321d2b760d272bded0ed5134a112247b8d0bd8..f120220fed5b624647dd405e7b810eb492e64e8c 100644 GIT binary patch delta 1087 zcmV-F1i<_68OaEc8Gi!+002ikWo7^X07XztR7Ff_aS#v?|NsC0|Nj&e6ciK`6ciK^ z5)u;=6BHB_6%`duPEJ`_StceXjEsz5UtjxMxz6wCWOHR-~Uk$R|RYoFlOph<=cODCCW-S^aZ%xe){R3>kpuhL)yO^ zwYTdj?G+Adzrctn?NyWCeu3dp+A9}w`vr!jv{wgZ`vr!iw7>NC)Bi>dA^k95DKtXD zxEqF^kfw5YIe&Nuj|>T6EMbL&Zmf{BD;LxZXgnb_kYfT4Ug4AqA>LAVK=NbxEu}o> z>@s@f4KD}3=StFi6iQpubSq&Uf6{t@GT$vEAr?@df>;K37NmxTX%0lqDBT`|mJ=3` z<gX^XQ7~N9_ZEQ;w(bTQGd3ksQ94jS1`uT5ajD>6g4k+ zvwRn4org@$6asjQ>seEeu@eaP(8F-RUxV|OrBra3eb0=d{51eUB3z8S=W|ialZ$@= zObYfOA;z#k8rwWJt=SBKbOFSyWLBhyM@T@tIl23}F$c9~6i))kEIJkwdE6#pw)yiC z<3`Zx(tlY++&?B|$hgTX!}v+c8_vTG{vbsp66B2_znq*h!xR*-1RIJhj3*I%x6Bh9 z)!!ON*(#6It;EuDL7e$zHJfa{wZYYQnYEhC&MtP_>*?vmz{$3K*I{q$wWuNuc|PX^ zqU#GARk{Ot`nEVfp{}68C$^)fF=SRUxYve}X@A6Kt-T|N`T4V^OhJ5OQnf|tmXaJp zrqEw%*><%XArzS6L4yCaA*iX{%?-f{^9FusOCH|J8mhO9eK7Uw#G5I3`qSQ5L&z2a z1qw}N!}E~WbUkFA?w3JiehkgH0>W&JJg$Y9aDQD4nd0<#4$^~=ICE)8H`IlEk4G3X zMSu0gnG&h_PQ}_3-Pj%E~Yv#IDV~{(t*zTSrJiApXQ}4oYDKPou&moQGK-Em*=${3_*15a%>vj7@&y7*Ze*4*`ymT~@l#(|O`! zzO#Z8;!;EjV@dWS=LLk~j(9DNha6s47~|@g1o^80)iw4cyb9uxg4>L)zVWhc(Kz81 zQ2p-2nsda#J-K~C5`^JPtPcTJlDZ9CB`^MdSEN7f>p$0P)58Pepick*002ovPDHLk FV1k-?`P~2j literal 3311 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 OhQZU-&t;ucLK6VC33BED delta 748 zcmZ3>^pkahWIY=L14F^1sUbj$u{g-xiDBJ2nU@R?OuxNQ5h`5|lP_XEasK-8_s_rY*1Wxp{q6^Q zpU+dYk9|A8WdXybk4q;cZCS){iSr4^Vpi4(du?n zkjb+0Xh0xCCPU`YfB=S-EIYdbt>!TVF4(}`G# zbX~@J73L!KW0BqrmW&$@SY&Z3uq%W~xa%^euqX9y%;!|#JRvO6U{iC(!n*y&I=0Ib zQX}VOxpgt0sF#v6xU_xk1>TQM6X)f&vVLsaxK%}^!@XyNLY$#fQ^he3_D8bHA}2T` zZqK~-h5hS9gRm(p9o-JkkV&NXm<2LSVqP_<1dil8mY{9pzIdD9j5y)KuZh$@@r9 z)uuyTr0(|Ym}6fH-f~a4Tl#f*AcN(PMUOS7eDQN!XeXf+Z)V%bDeErO+C2LfwA5t!`-S#{nW+W{}~+&CE{EPPCwF>_XeKJ>+*EgnozZfAxN+$ZwtHE zyJ;IumN353;!@yUI9={iSJ1A7M!cG;_dgbUaVE!d0pq~*{&Ee8hL|HaA?KkDi?7R0Jky N22WQ%mvv4FO#t%-GLZlP diff --git a/examples/gamepad-tester/assets/Start.png b/examples/gamepad-tester/assets/Start.png index 4c624345f01c76520e067ae11d5676e840df1bf9..e85995704268d2ef85bbf364116c90bc3df0598f 100644 GIT binary patch delta 1113 zcmV-f1g86%7~=?#8Gi!+002ikWo7^X09sH?R7Ff_aX~>r|Ns9$KtTWh|NsC0LPA3S z|NsC0|3E-M|Ns9$KtMo1KtMo1|NsC0|NsC0|NsC0KtMqC_4U`+*PEN0u&}V;;Na=$ z>4SrVWo2c~&d$ERzFApW05`+(0000HbW%=J06c={73vp3z<RXyI(6!A>f-2&izm128a=mk&GO`9#O?arRrC=j$)YDr z*-=cALlMlH+kY{}!cjktJ~!rO9v_;i-q6?%niYAcTcTX`)6_ef21QAZFb5D$lq=j@lXO-!gEUP$Zc!=~`vh9FUi7`3crXan*soLQBRq|7(2xu=B5RPQnff(I zFa4E6L(&LHwGN?Pt6d6(G|-@2Le=G=QW-^(IqmiT@UMsB*Uj4&Sj@P0*v8isDDN^_vuqJ*$R)MPwls2(u*!t_K(nh zXhC^4W4)`fc^+aI%4?YRZVs=b44TOLGWQzVO=-fx3*E)z%6R0SHBT~#@*p^V$NuFT zHu#<$ec^u+{Qn-C%5GmEoceEs!!S%SVxMN>g9zhN&n&G0{Y?tJL!i4jCE^eT^K*j_ z6Ms6QpC@W44omAB7k{*@PGtZKC1Sdfe>K=(t`#< z?1aORx`G5JTtG^;IH8JF7V{NxY$Y`uBArGSkiw2YYyzKJW&uCtx|Hr zrxgZ*O+oY7j8+AE7{{lx!hlR!A+xN;fOD~+Sz4IFBF;W!9f9&k#Lq%?Udpqu+&dIc fojP^u)W4}e0vq23DQ60+00000NkvXXu0mjf) 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 Date: Tue, 16 Sep 2025 19:50:21 +0200 Subject: [PATCH 3/6] Fix name --- .../gamepad-tester/{Gamepad tester.json => gamepad-tester.json} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/gamepad-tester/{Gamepad tester.json => gamepad-tester.json} (100%) diff --git a/examples/gamepad-tester/Gamepad tester.json b/examples/gamepad-tester/gamepad-tester.json similarity index 100% rename from examples/gamepad-tester/Gamepad tester.json rename to examples/gamepad-tester/gamepad-tester.json From 024b50b6edb7d1fac75a2deacadaf3891ef74e82 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 16 Sep 2025 17:53:46 +0000 Subject: [PATCH 4/6] Optimised images with calibre/image-actions --- examples/gamepad-tester/assets/A Button.png | Bin 1240 -> 1133 bytes examples/gamepad-tester/assets/B Button.png | Bin 1196 -> 1049 bytes examples/gamepad-tester/assets/Back.png | Bin 1156 -> 1071 bytes examples/gamepad-tester/assets/Back_Alt.png | Bin 900 -> 768 bytes .../gamepad-tester/assets/Dpad_Default.png | Bin 1483 -> 1320 bytes examples/gamepad-tester/assets/Dpad_Down.png | Bin 1580 -> 1465 bytes examples/gamepad-tester/assets/Dpad_Left.png | Bin 1557 -> 1421 bytes examples/gamepad-tester/assets/Dpad_Right.png | Bin 1527 -> 1436 bytes examples/gamepad-tester/assets/Dpad_Up.png | Bin 1567 -> 1393 bytes examples/gamepad-tester/assets/LB.png | Bin 989 -> 919 bytes examples/gamepad-tester/assets/LT.png | Bin 1027 -> 907 bytes .../assets/Left Stick Click.png | Bin 979 -> 915 bytes examples/gamepad-tester/assets/Left Stick.png | Bin 965 -> 809 bytes .../On Screen Controls Button_Hovered.png | Bin 316 -> 282 bytes .../assets/On Screen Controls Button_Idle.png | Bin 312 -> 263 bytes .../On Screen Controls Button_Pressed.png | Bin 299 -> 271 bytes examples/gamepad-tester/assets/RB.png | Bin 1057 -> 970 bytes examples/gamepad-tester/assets/RT.png | Bin 1075 -> 959 bytes .../assets/Right Stick Click.png | Bin 1097 -> 1003 bytes .../gamepad-tester/assets/Right Stick.png | Bin 1191 -> 1037 bytes examples/gamepad-tester/assets/Start.png | Bin 1123 -> 1054 bytes examples/gamepad-tester/assets/Start_Alt.png | Bin 3022 -> 909 bytes 22 files changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/gamepad-tester/assets/A Button.png b/examples/gamepad-tester/assets/A Button.png index 55b15834c6e9928b45fcb63bc539b04f97652c91..031aca3aebfabd2b23a0507c177096ab24c3e6dd 100644 GIT binary patch delta 1070 zcmV+}1kwB03GE1wBt<+>OjJcoX>nMS9*5RA8!ZVHCIlKS2pTL18Y>4FEC(7a2&&?7 z&hD<9+*^;)PCH{0zUh)DLJWDcKTLlaWuPl@9>Q*scrAYe!AV3xRCwC$ncKFjAPhx! zy&;--{r`VGt%?LC0n|R6F`C_{b`NJ)R-lml{r%z>zxXesUgAp+FKVT$oJ3V=RXj>i z&hz&utEV`HDsv$!^#DTCCk{43td8J(;-mSHHfwMDGsf+P!~8HQpLCRUiX$wI&9*e`)T%C=qtQizb5sjH@4 zqVZ}OW27i61en_GSI9|9MiMrNQp#P($QS}`%Sb_+uudwlWkXrNOd|_PtJ>Le}=a zXQ~*Td}-E_Ny^q{JM^5CeFvLZQ+7*6v3`35$$D!F=ldW*U>DFc*1M+EA_V=G*he>v z6bwRC0J7EZ=gG)a@lut$^NN9V`<^22zde5=#VM~V5L&pv?8SE>Zb>m!d>7(Y6l48O zh!N7f|2{9j^*14OYi!xQI10j+FftHV3I=ybaWOUw!dguV5}s8bvDIs*ywD>AGV#rrA1zzMM^pS;)#+Vujw>o~kT{%((EqF69HoE6 z93=kiwZT2xHU8}o4^?cBM3ZoY)K0#dK(=gMW6I%9`H!iv-WK}vukH3hlX6V`%Uvmv zH=wiwH@yQzTzlE`_8{JXYis?ONFkS?<#@MdET|mgz z=pqS=%NV`LPvM?KogbS8aHUyL#J7JvFpdJWAJs+mysA?pDnPl?CR*EFZr2WCTT!pr zhL@tv!MLVcV>*OGbnDJ-K?0B2KYCGyy3(*k+vg;!hIBedrv<6gTF=woca~bVIA3Cz zJ|t;AV-S(d@U+prJ#M_$MmH2^An+as5CA1?mM1dopebdvk;_lEGZroHA zH)nIF$=qI2261OTS64aDu_M5|x;G83OFGKz_Mp?u>i)pF*0~tE{`T~@d~%XqD18Ez o56{ZYNS;LfJm43<_{F#5AF7{eFa(16sQ>@~07*qoM6N<$f_~2T5C8xG delta 1178 zcmV;L1ZDf}2-pdbBveaKOjJcoX>o_vI9QV&8!ZVHCIlKS2pTL18Y>4FEC(7a2&&?8 z&hD<6+gB$-43ODKrQd9h$5nZ=KQ~9IcvC5R=e{MYz{spMt{~ji~yK3V$k-2QN%lj?QgRwTg5y0sHN{Y=Vbli zeZN2xY+}%vatwgLMY|8u@5SI8$i|qAh9hAOVKA>;Eo-hi&ETy+n8r+b6l|5FXZpPf zp(=<_AB)8*49fA9)Ugm%09x#VQkg_`zVbLqGSby4JciAVuL7B{0{&ox?S^?U8GfD~ke z2#Y1+{r3t1)1H&H&tl@WgoN< z=5oWxT~bLKt8iUA#)+5r1JT zTh!~{dGxrLTKU4>l1!m&N&kx3rh<6;_xpa?|z_x)t*aq$~M^m0TV$hO|!`-68OG9c<8Mei(U zA<($Ovlm~52Z7ZP-Qg|7bi{l$)XscH%oPd~*E>76$&6gJ26@|E}EDkPC z`O-2T-WSEaRgL>kiFI5-k%PqUL`2;Ox^}NG0_4B)0O! z{CU~!0yO7vhs-e*p6SJQTNn@D$m$nu&N207ZVo*0CI^zo(ti%z@D9Y{*WTkv1za6) zxKA*dy8}sQ5OWDyZ;fTRJJjW08RhMSqzI8xUb&ZF$zY4=7nIRP7f4uI#^6PMiuWX% z$F5nBLOC`I%JjAePoognk9sBbylU8pN@?IQs3WmWw6(kLkP;Fjdv2;pnA-3{usJ9x zk)|3`9l|cTb$@5KAc-F%5o&!%20GKQ<+`H@+mL^q&V4_1%4!XlHf0I5Y+JsZVyHeO zXg>2OBAel8qc1&i5U#b+6~!6|{EY)lW1B;QEO{ow44RTg8?VPHh8duIbx30-T502^ zy1Y1>J51)ZrPP4#%6zV=AAXJ*0Y2($)8M9pqs&1EoI7UL*9XoGegp$I-=6+fpPXcu s2p>SzhiBz#BoCtbJm43<_{F#5A3b|*1lKJ%&j0`b07*qoM6N<$f_Y9VxBvhE diff --git a/examples/gamepad-tester/assets/B Button.png b/examples/gamepad-tester/assets/B Button.png index 99e87eeb3a9b15ae428cf0b9060b5e32d301ce25..1160b047f503791e44f88f0c117b7c67b481935d 100644 GIT binary patch delta 1007 zcmVq9-7~m%-=vi4r1O!G22}cSFMF zj0tPs`TR-BAJ3$mSWkkG{3mH#ie4Iiiq=67^PIF<>xe;!ZCUm^vVB>$E*R^mWw|G9 zSzpU6ZVxhAEwk0m{JC# zvBw1ceC(bKhzJJkCZY&}vwt?k zfGWeMyi$x4vKQwSfng}xg=MN{*5NEV;^ISqNS*BK;Mz=*`{jaW@Xlk2~itJyM>jei2r#5h{2qd~kc6 zT+}+uL8GUD*gLq^K||uKRDYXba6%-dn`>*d;?9BHs9n&hcCI4ClcL)jQ%&sTr8_Ic zQ9-himp5vUO{ORaM-r_6*aMn}E4*n)6b^8RVJMz~pcC*I(oH(uptEgg%RP!Nk8HKakgWr5G<>cintvIIF?w>wZ5?%P zjBY62LSRLp=Sm=62(&TWqN!!I(aLbUrmrq(9;cF1Fb2Wdha1N1R?BX*KH1MPjy8bt zYR>Kemsi3g9OvsTdeW2?<0721Eb=MFXA|g1a3Zei2019+c zPE!E?|Nqz{4@iEiAk1-9k$f0`@kvBMRCwC$nQN1)APk1Lma4d*wu5C8xwbw9r>_RiDL%%Cmu~U#${)tihj;yCZ|MYS)w=E#^%@ zoXQ(yyraQ~DryQN0EOg#AzSh;kin{?Ig|yJVl6ly^Y-sUm9ckdW^i5_gtL0U;8})C z*;0%kvRCC5N9ow|Y@Wq*c1RcpxlociAW`)dNUa<$XX_~yG z<2Ecy`mg{YuYcn3t9}PIbv{KotWQa)Jt0*Z^2GST7gkCt>_7;A%R(H=78Vg9wB6K{6(WhehY~Vy%j=~!-5kjb$*d(+)YSWg;FwA@t~yR zE)WnUqzfvT4N8-LgseNIQA6Hu6+V6M2-$+NCLt{b5K zXF;Z&7slz37l-`^h+7~}gS_sD!;CB2K#0>PA( zXQA4^w$f$AEsz|mWGX6<_Vz`UdiDt2g(&qUm)6id!jpo3xwJ6XuYN+BbMn{?$r!zU zF%OBry4{fU@rM`YNtAirar?TBr3qH7o-^sbH z!>f7l8ohzL5AHhOI!L~ARJ*i69l`UwWysNY&(|`;z*Gtjp@cv z&RVjaJhf+k1vx6PEjDQ6X?}V$!l4I(vL%)te2j=0PFp%!(KDQ);R=C+s17mt;Bd5p z924E(*ltcvyTB-_bl}y5l&F|N4b^1vfY2R5u3c1(ozZjUmyF}$NrlA1JOTr V$U`U&?y3L)002ovPDHLkV1i1KBuM}O diff --git a/examples/gamepad-tester/assets/Back.png b/examples/gamepad-tester/assets/Back.png index d3cf8058140cb794cf4428b854521fc5f4970801..c4e36c0c08174ec8e3618cefca42a4076d04f2c5 100644 GIT binary patch delta 1050 zcmV+#1m*jL39kr{B!5d#OjJcoX>tGm|NsC0LPA3S|NsC0|NsC0|Ns9$KtMo1K>z>$ z|Ns9$KtMo1K>z>$KtMqD_V(A;*P5D|udlCQU|{L#>EPht#l^*ggM;yCHf{g_01k9g zPE!C}gBKLP)jUS00009a7bBm000XU000XU0e=9RoEQKA18_-1K~#9! z?U?C$s~`}D1L6|V1Q*o%ztST+D%8O==TH6mJZ+OWyw1Wf=JB|7>(;GXxBjQ9gMM-G ztZJX{n3`u>WuFt8_o<#A`INP9n40#oI}k4{=33PDZj1-*f|h;a#<&b~7t!1=4wIak z%rKTHz^FGaHGkPPhKHCAvL6lO6-uUd#yH3|IAgDf7~{&D3whBD=|-GjI5Ih!l8|)A z;4grLH}ja5e4P-%@VsD$AMZ2k3pg!mgA9(revqRK(yRqKqUy>r*oiDfZJ8_~BeTv& zWM$s%Fx&*Jf|u6n$i$+MY3_#|giYF&Cp=oS4ps=!4S#*VfiNAg85}Pet#J);n89a( z*g+&^H5sAts&ur18R2uUb%byouL_!yUO_@}3PPBI^w6X{^(J9E2=@^o2-92TI>g24 zix9T;<4X{^Ierb&des%Jtw`b*X!kNDJcUbmh?ek_P{OKpb%A(ok~0LN)xn#WY4p+l zI0f4ZH-F7OsX@k@mq^ZVY+VTrQpaofu?=rpy=lTj$^qP%7Rg_LQ_CImvOP9QbHw6} z5oZX=Skfj5H4*iliP)J$tn}#hOr3-K4mJ~UH{LZ>>foh@)H7$K8}o8u=GKo5YKH7M zkEMjGDOFE)(0OP_dH1J7y?B0jUt&1Qc=qftFMs1z#_lO7DoaSp`L##Js|;6U5LMrQ z#%{B3e_POe{+)#S-Xp5^Hwd@>ib!d+e|LKw!WdJEh_&&}&mg5eC<^4>#p`R|6czfS z8f%+eS=Zvd1juSg%)7N+MlrS*SqOnKHjo$IEJ{KQagBkH0>-cgW#Qet3Jx_1Qj3>j z)qff}8!*Fj-9e0Z+7;@pMVyUfywD>RLfxv^MX&Gz>Df>)LmCvK3=3OO5+{DuE?VRO zNnrSiuaT=?BySYi+X&kL86Kpj$kuP|t&O+k?Ad^lekfsN3Kr{Blp1pMq$m<7w&t-} zRQxUSJTG)5$X#-@Q5%sYL97QG*F?g}A%FVHMz)lKq(gF5zfM$Fv{?*!Hqu29#qARn z9(mtbit2a}TY7}9we4)clx=iMnP&Rf?n10Oqs-E}soafWAZ6bmYp=;;zl!aN;B{dY zTbcsNk&1w=SC?{B`^SNUs8&khC!^|p=AVaorCSZkg>V@>8Oc3i+`4t^)*sV9&l4)T Ud~mLW?EnA(07*qoM6N<$g43}FPyhe` delta 1135 zcmV-#1d#i$2!sicB!6H~OjJcoX>mb8K|nx2LPA3S|NsC0|NsC0|Ns9$KtTWh|NsC0 zKtMqM|NlThK>z>$|NsC0|NsC0|NsC0KtMqC_4U`+*P5D|`T6;;udm?X;OXhdaEE1hLadkToZ$$Sk3+4<&hm1D%kY= zsb8O`ZA^yOSs2D#E~ieNI(6#Q|I~G*4=x_u^7v&_8t2#G=Y;gNtN8XKME-J9njdz@ z#S4YG1)p%^Yk#Fh&<;?p%8jqS9cqi-O|LQDsR<;bw*sUZ=~5aTV;G2TCG}Q29-#z$ zXN)adgCJB{gb?B09LS4cFgFmcz7<9+IfCL*yPWZ+UQ`aE-n>V@1e$V%@DVJT@i1aHJ?6M{LUaZO4rHVIldLQKRGf_PHepFwn-ei4G^etZ&w z7n`H`E`KLJkld&)Y^yCx;(OQbB}=&5Ea9QGmT>1$!dJF!r=5kjJ6CPljCe9(rcUFl zZ1lv|R=Ul$LS(b|YLKP^WKD=I?SxOMgBXVM%jE#&)$9)S6GBYFz6?zn_nsYwemu%BpMu7|wMr4Z za=t}zdT2cQSbuY8++tja$@IQ3TqBcWn>b^f^w0PuWfP`+Cj z=6}T=BvJ=OnCYuvdTml3q4-b&gw35@FA{pq12P#xc{NeXa5v^3QV{6Im_aHqTT~$* zi_b_14BZ&Ypa_kd=fNpug81SET{X$HjWfe=T|=aI!j+P)B{BrH4P#W<#TQcQRe_FP zXav%*c{($gK}hQ`R0YLw^jD&z1y_*Loqu5_K6&W+eK2=2bsO6@jtm2mln+(EiLo}A zm$PBxl=M{zXR>~QNJS(dYfr+^gQ994P^&^L9^UVF`u8b!$=Zf*MCb+Ki-Cn}G~sX+ zeQv{AN(lWR8UL@GK}u24atu}JIbobSb?Vd~(?22w>G*>GZuI~F002ovPDHLkV1fwH BBvAkW diff --git a/examples/gamepad-tester/assets/Back_Alt.png b/examples/gamepad-tester/assets/Back_Alt.png index ac3083ad9ebcdeb88f832258d66239424f1ff31f..518709711c56d6005fe8382f530adcf2d8d25ae7 100644 GIT binary patch delta 724 zcmV;_0xSK52Y?2UBtt4tOjJcoX>mY6KtMo1K|w+P|NlThK=t+Y*Vosbot@<5nmgdhw?i#jZc zzW?i1AOskf$}-a%{+s#KHpe6wNPd2XhK7cQhK7cQ{!jBfO`=%SuK6ipdNt_*Xcn(# ziTR^mFy@BAh;3aplxp3zanSx?Y#LRyP;a-Ci4dw$uw7F;BO*+xB1T_PX7>QReYw<0 z5(=HMfBA-CmKI5efm4d$SjnYPk|QQg99g?Ch_W7CaqB8!$Vw#?x5f@D3z#7r#1wd6 zVS<8Xni)hf6fp6Y5&M~UU=Ss&<2j4g795eX2gOiUrbD!revsu5FX7W(=!n@X!>ucj zK`13DM0)|UA<#N8s=z(BkJbL`?xDSrKrmaxfA&J1LNr@8!2;X!QVd}RC*=WT--mRx zj0wMfg$!bJvvE`y-FE{5Q8@8;Tp(} z(cvybRF<&NvMX-Pc2yon5FDXuQV(S!OW?7wrQ-~m~W---3eLyV68mFHxK@k@rwdlhyR+D~*=>L=Q?WXXoI9~O)1bzH%h;hdbb2>!wj;jj5?pXtS>;2A;BFYm1HB-Bg0cDs7lBED(Q9tGm|JT>onwpwGKtT2N^*}&CKtMo1KtMr3LHzvu zv9Yn@;^L*HrRwVHyu7^0$;p6#fL&c(Z(wmz0000AbW%=J0RR90<^TV_bvYjQ#TWnp z010qNS#tmY3ljhU3ljkVnw%H_00P@dL_t(|+U=O#dV?SghJQDZit?-Xf3YJF5Vdv% zTzA5E(5JP^OA-tuUte8aU0q#WU0q%Or)lDREEac~-X-wi(V*cC&@?`pHBP@+@wi3f z3r2F(x-3+bYH?bV(=HiEpq5n2QsnSgjFpl`iS?Qi7#l*CYQxYg%H;nLVSF}!SBdF> zGJderBAbT9kbji~&r^FDA?LAQ>Lg3D5UwKR%OvOoR zoG!lcVfOgO%Z>6BGK4)#KFeKUlo)7}<*8%tf`8jW4#fm%cDp>JdgaJjs!v&1`urPL z4rE-CWnqzLVGB=aO!aO!wM+FJH!W7OX}QCq)R&tU!%d5ywqJSQ_A5`@??(<2A2||* z!=1hDaOWdpPvyfWj;X3FO^)Imdx{Y|BVkNR+3XtfnV^Hv0%ORcyAW#Z^)z#J2)z#J2b-#W9EID0;P0L7&00000NkvXXu0mjf DH$I{t diff --git a/examples/gamepad-tester/assets/Dpad_Default.png b/examples/gamepad-tester/assets/Dpad_Default.png index 2c7d4d1dca3000f34d70fae7ec8c9b1eb117d11d..220df710269707f438f6f286ac4e4b671a73b5fa 100644 GIT binary patch delta 1301 zcmV+w1?u|C3#bZ^B!4qdOjJcoX>o3DZlIu`h=_Z;PU9G2? zF2gap7_{W^__IIzc^fCb+Up%{{r5D^_s*XuukAJ7M4$k1MbqcYnfQCx_-D(R;39-w zp2e0$isH5Dx}yL>LO`~US2I_RdZMPG)8-F6rQJ+AOlpex|6BjS)t#1?p@ndh2#-)h zG3Ndvy;dS&rhiL}6(PL5(oG2&!{FAk1W3l5aoHFdLL`Wj-BgUQl>8>*EG6zLH`v-R z{Fx!jng56Tn+VU@yqMQP%3K&y+AuhIOEGUML2OvClqV@s5BGl34bHj)2y;sT%1ie) zk#fXik>Qu&Az61X1b_hLZJ>yQl!jp&-4jIB%G>xt2Y)HqSF(jL;H@HxfKO+S?R@7o zBMoaMDUc${VanJrDBU|zWJ4MEHZNdMx}(ZN%Em@cqGtxBJE1(-$$Z;c;I&BIDdo!$ z^04fjMe0r}4;;3!v#OV}r0$(4>nYbbY@!zuzg{auIf893Nmzl7M5r>Rg;evu)BUb6NI8h#EeT%=hcQ9N z@DRorqI^fm6LDPj_EC|-txgi)uXTs5Vq>A@jDCn-s7UP}7ve1}+2h!Jav*-Fh5guxQH^+T5yu>MB(XbGTr=PG-chhLn6rzk|aUKY!Cvbf2ndj zSNCp&m~->fBoiTXySYG2txn93k_@uF5`>+5f11P)$Q18CMsK7OmdK1OrxP^so8Av1MA9w8woq7aK<;-ukeEY6Bo{Iw zqCz4xR9Qnxjf9XTxI;(=jfoT*cERY5Z-0lWO_XPb{V=tjAI}?+fE$q1X26Zb!C1ik zpz6Qc5=$wmgP`igWD?ZnKzLqSs!_`u$%3eS4yJQ8X`wQ$Qdev9IVv;l64Ojd1qp>6 z=&3ebWu|0NVlF9m$*={P{Z=WqhB@|Diro|oA}ALNhMi(TsTOP&3sSY&rb|(3zZ50+N>Q6dHKg7JN-HOdYPsTtl?R8d@}R8+*=`N+hC(V& z6*|R%a%xi+CY7g3w#N#?u~2`q_$(^Mez|^p5oPoa(n^vU2RcHfv0*dBQVoFu$qj*H zU8jl?hH9#{A^Xh zxd-7fd%rE<)8h`?;Jl_gfABH)Klpg@@$vY^Pgk;yUjh8t@3MbqpM~80AP(yD00000 LNkvXXu0mjf%0FrX delta 1465 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 N002ovPDHLkV1liD;{N~u diff --git a/examples/gamepad-tester/assets/Dpad_Left.png b/examples/gamepad-tester/assets/Dpad_Left.png index 48150bceedcb0cafeede58e5ab1f08bece1c0703..eb697238607869abc34ca75ee2dd39c0e3e8de2e 100644 GIT binary patch delta 1402 zcmV-=1%>*R42=trB!53pOjJcoX>o3DZitA8prD{3At4zV86O`XDJdx zJ1|3)V8q2|2;s+x^J!hz#%o>W6#gmtTYAx8TA!a{`gou?3TZwaG(V%b{$;X_ZeI3p z4*xe7UY-I1?tdId{X^;|RU5Pz%xJFwjQG`1?G0FnwtQ=2EgCYxH4fALf-(C0b&D*4 zw7M%YTxBucY5#lfyD?b^htXQBG=#zQ+OL{?XU-ZEF{HFN8{c))iWzC1g6YM_Nk)|Z z!dUH$N$Q)u@8e^X^*v zM8|W?kCimad{+QjGUsJN5og{(&mep+oDY{2lGXxBe5Y9>3iw?esMNnJ?Xk* znD&z;IDhlKaNfw09HpyvWDJ_LIQXt&Na8%-9{xu5d@S2vS^Ivy-mohs5Wf&> zP88_H$|smeo0qnItGDflN+FAnSx8d;u5@_&j(^e?qh-g-4p>8x^6|3mH|(9YuQmU? z%Z}Kt*cnEVc(%rC#tYFr&p*4~xg&wnE{bhLoIDhktY!NKVAL{3Qg9M4OwpFG;`t*j z7=)=b-b+YRVTxX@TB7}3^Za5sCBqo+Y&b3pQ?w;-<1qp-Y8fS^mK?N!DX8yg`$jKT zRewf;on}BFGupltJ60fV2t-dV36L3A%TCFH7&5(J2G2BOezTKO|2yP$1)}~($j?`Y z>*oue+%$zlh>=6GmvP2G?8@87DsTLYT2#&~D@(R`6&nh1$CvtK)0#^X(UIlSriE<334iIOZrFaQK*Et`Bv?5JBud{OJw!w}2n~sB z;Ki_v-a4UY6d&ASB>TWQ1Pkuc=&q}Vsc971Zi)y~+pVd^siFwDi*OrAm4KTy)rh-C zjt(3-I_#tdJvuOdbimpt4)cT0qZJ(FTuL8;>?w#k%Xjf{E}-9ZP#q$(12b5}iokG(-Z2&fbYU8*`kBT8UItcbrs{SCeW} z+IJ#-L#7A0OA~E)dT>mi3K-%z(SI49EJ}E_Xrhy2Im@G@txpS|OWFE7dXh{%N~L>S z>d9x+cVIk+bL9YjGL0^gH2RrZ&A_9AfDF!~1%Z&Uy~KbicCNI+!IFy%PZ_ZyjWWvL z_fS4LU)KsFc2I6weYpvWC*sz^S?s&-#>Fb22o$sgXyX*;JCqu`{+DH69&?;;HXXui zF&8u1VkZB6&Gcef_IfwU0`pogFn>}n52f-amvN;$gu8Cye)J)ONW!Y!AfvqM-+%kt zf==}Jd?i7Dh#_wJ62tbV0P#+U$Kx9xuQ=^r$NYUN^ru7p16kgx=*F9JMF0Q*07*qo IM6N<$f^Gq#$^ZZW delta 1539 zcmV+e2K@Pr3zZCzB!5v*OjJcoX>lhfCy0oMA0Hnc9v&(xDjy#oA0HnX85tiRA8u}L zprD{NH8o63Oh7Ak(Z)4>3j z0000AbW%=J0ImQ3glxw>7U>DHvhV-^010qNS#tmY3ljhU3x5*<0GgZ_000G4Nkl2j+$5Jqj8%?4y&A%yMsf6zfo3oYF&*Un7URQg9!selgBCtAI5I{n(OZCSlo z^CQC-)%6ltbuPb(s*~{pQvDr5Q&yK1`v#^yU$*R8eugOhItjt2X}Wovrd|n;DgIuZ zI#{P0X4B4s;S(T+u7=-Sq^5I<8wwT?#0;W&vjw7FaEI8PR=Ayt=l=G?fv&;=*DXUZG1B)4D{IT2wTFPKvEZAyafLkNkKmr@9S6P!Uc zp@3Z4mZ|t3nukH2colnG0#qKbQbWMD`W;_skz3zWzd#8#lly)50 zlYfYl>r9d zHXQFWQM4p)qcH+7)-uY5VN5|!5Czp89pBi4ty)5Ylcq)>FLZokFScz9>4`w}=IQ}* z$E{_%%z_xQyg65vI1!+ghBOhN+Fn;%y+U1l){{gVBs` zu6M{Bq)9h4bznYqz#@8y*H~&ug0dV1%S-7b$Yw!QE?ZC%XVBQ>2etx)ucsyj9J<+&62=-F+rkxLuS-8v@Eh7DlnFn{~-r z8;WXe2#`b_V?-35C_fIyQr-E|aVigX=HzC(Y4YtRXatqVn_7ZyoQ1mkr8?LJESB~h z+5)t3iqqY7%?`B9lD4m0ihSI+rw-w@F&8r$y#R47PNyGk%O0Ob-e8{A8_b{d%a>O9 zMf72(+=RP9FjRc>AwwB`xge~`r0ZXN{H;V?t$$chm0$TBqbcYQF^VsJiDBoHfv#0i po=!jU@rtwg>zLn9g???*{sE)`=6&Y#A}{~|002ovPDHLkV1l?);V}RJ diff --git a/examples/gamepad-tester/assets/Dpad_Right.png b/examples/gamepad-tester/assets/Dpad_Right.png index 7bf492a468601288776c395e648e7c39867a4cd5..fe8b7fc106204b558cd4bcef7a501fd08afcaee5 100644 GIT binary patch delta 1418 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 LNkvXXu0mjf7ZJ>P diff --git a/examples/gamepad-tester/assets/Dpad_Up.png b/examples/gamepad-tester/assets/Dpad_Up.png index 24e6fbfc797dbd2c21f8483787aabe45ce89bd43..e0613ace01f5d63ea2e76fbccdbbf18f95d5b3d5 100644 GIT binary patch delta 1374 zcmV-k1)=(%4Dkw(B!53pOjJcoX>o~(i60*yZfJj$b4U+4#}A;X8<- z6S`vE@cG0IlMu27kwSdt&b%Xpb40Cn*|tZpZQGhv?Vs!|ruQ+ULmZF?YXEtA^WGYm zyQ90Ct(AwY$A5e|>*x2x2n=mu*gO0>vk62@m!0VWAsxiHF@F+se^{LK0n@)ZRUWeC zjDxZrkbvpt>kKIY^57v4fB@z^1y;f50e=#mc}XcimDiXu zpV}Y5@DP2=EK|*q#M1a)g7`QuNl(_5E@cP^L#gfr5|kH0;ICLv zCG5ixOaWp!-SM7BT>@q1_Xq|!Q_6C)73a$;C3qWn*|9y>z}oJ%(b)pXX7>iqG>`dy z9Y0%i{KJ+X3OOiABT5=M**yS_zuPlIeGtYDd4DW6Yq}~~c4aDzzgx3B?Li=qCu1QL zL}F%(0obN7i!;+~n6Wh*e9|zamCo0`6J=?9KT=~7%(nlbiJw0~8A+1hwJ%^*7#|pJ z)Xmw_!2gjUk|v^b0I@djnIJebd1IJ7Mb0mfgaAwp02~SeQRW=tHpIp8OQe0QT=~&M z?0;M1GbCGpNIzR|j*nGpnC105Aqq!2>`d7FPR{i@>C<>fBl zgHhgKh|Zj^R0wA>VMXOl8vhc=>!Mm*#@G`^`Aqi<VJmB3D5YE1x~9x46}{Tg`dODt&94W#dTq z$Qa+fo%7cb{hVSG{$l5yjIY#Vil%gp|E*~X5fEX2}Gpqt;mCRYdJDtZv# zKfA}C`vj9EuPdrH_MhDRBTQbx4qo&hzg#f%lc?D@-d{Lg#3&J_{);bsaG>u3l9yL{ gu;G6I{_L08KP_RZ*N|iV)Bpeg07*qoM6N<$g2ot$S^xk5 delta 1550 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 KMNUMnLSTZH0E?sm delta 1005 zcmVs-S_1D+eKtMo1KtMo1KtVx4K|w)4KtMo1K>z>$ z`}_NunVI3?;bmoI$;rv=?Ci6%vxkR=udlC6OiX#u3^4!z019+cPE!E?|NrQkCq%z{ z0nb+R00009a7bBm000XU000XU0RWnu7ytkRR7pfZRCwC$nt$1ns~`}D5f?C`xV`_g zo+y~eW;cja=OX`AQk9u+dbQI%g#7f=Pye$ThF6n@Xsa?x6>nK2f<+=UsE*;(WvVLn zJmW2nix1NuUk9`dOpAf2c&vg(NG|i2RAUWU<@U4vwJeZW(Gxr@sQCjniWjr3=jeOOGEk-gi6_~SMnZvy<9Di&pa?fE0vS~WM^FtO8vUmFB zTqq`F$pPUCGCm5aokDp4(mI9m07U2TpFv(A#M6cGko8=R4?t9*SP-#nqCQA*2T~Z2 zT{1I7q9Fd(g@N#I$*W)WnX^XyZp;el5}v*Xq$Y8FC8(DlBH#hZOprj_)pW-)xhoKNHFuFbf#1B<(LgO$86jgRxp*c>C?tsF zih~40!bn^fzJL@VLrRhda@FUdkf;$-;vk+$WyN^Qef);K)%m+TVqM@25@Cq#t>bHa z1#aw+5RbQJy^yFH)NW;fA&$4E0l$rM$5dQyeSg+BoWODiZj`q~)Vd4V=`C-GxWygr zi@ephMC1w**SbtYrWKi0Mwv`NExwGftDOxh;t>UJZHImyB}j~6@VSpOT(^`T5OMmHV_>3c57<3Oj^HD+V)o2%0TVxBYCS$Z#i%TV5CobStnnCwem z)I|{ym*aLi9~#z_LvQ*8m^b9Un)>Qs&Kb$1mInxJHpFgD%PWV_kO%bsFNju)Jp%aY br#t!w@ylH-2}N0N00000NkvXXu0mjfE<)Ok diff --git a/examples/gamepad-tester/assets/Left Stick Click.png b/examples/gamepad-tester/assets/Left Stick Click.png index 448bfeedeb797a6b03d9604c5d5e6bb120faedb7..cbc87b17d4f0554937b1ebc1317042ca99efe35a 100644 GIT binary patch delta 892 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 R&X@oI002ovPDHLkV1lwDt9bwb diff --git a/examples/gamepad-tester/assets/On Screen Controls Button_Hovered.png b/examples/gamepad-tester/assets/On Screen Controls Button_Hovered.png index 9e986fc9afbfd27bd94fad724535996eb3eb9acc..7f99c07c5e1f7895dddc05157a1958eb6cb2a72c 100644 GIT binary patch delta 234 zcmV#KN=iyhq~SCG000DZ zQchFB35PGOpy#8JUl@OwNklPE>;4Nq=TbvPLW&!B8VmR!B91Yx*Jq3)dVelzMt5P@b=+a{dVQ>h zZfqg*V1-y&ja5NqRTagRHCB~eSy5#mwmxiAOb{lzOcHa?8VZ%DH3}s0*3;SBrX+DOjJccKtMG$HBV1ZN=iyNI5<^RRY*uk4Vqd%00004bW%=J z{tv~E75x2)kzW{ph)G02RCwC$(?JRYF$@GjjbzXNpBy>lo=e;;L4(-xeC9c&>R>}Qy_AXaJ*e!=5cd9KXxU(c4R#+}5Vo+aW1YisBy}#5w2H$XDuksqB_(5}^a9`WQNzkf RVs`)l002ovPDHLkV1kBlS@Hk? delta 285 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 GLSTZRi}7aw diff --git a/examples/gamepad-tester/assets/RT.png b/examples/gamepad-tester/assets/RT.png index 76a8d0700cbb6a175a4e8ab3dfb44e5908ced202..d6130d70279ee35268b5abc72dfefd38419568d2 100644 GIT binary patch delta 937 zcmV;a16KUA2)_rAB!4YXOjJcoX>mb8K|nx2KtMo1KtMo1K-bsT_4W1t|Noblm*wT< z`T6;=v9V@mX35FPIeHcn00005bW%=J06w*T*SG>&G45Ezv|G4vU`){_Lq9(=rO_VR9G-w(NTCF`;8 zhj>#gz+v4nDfA_)4%<3YxOm{>6$=c}0PhDAh(k|!Ag`w95_8`Om6PRHcEOsIt}?AE0eiO zGJukCpw(%}>GYzrNt*BKoJVtXnx0aOE)M^!Sf4Y}>0|Z~u7z2LFiwY82XZ7m+lZ8{Cm{or{f(-;w2;Vg6%BD`<#Vr%r*FZo(|Ns9$KtMr3LG|_ZK|w)4KtMo1K$)4D z;o;%=`T4T4vdPKGV`F3M>+6b&ic3pNb#-;8r>D&C1El}}019+cPE!E?|Nqw~|3tNZ zb)d`>9bZzyCQx{2SKS_$fG}R|n zE!Gd|2sEX;+%upxMOf@~#xVAhM2PJeJY!-ufIn(`ha7NA=?;ViprQ;&tsJS>QiZ~5 zH`H|%JV*cxA%CO3J&=`^lTjk2h}8Eth=o`TLg6FCpFZ22dyhqQiHx!(ZVciu6HA=4{}Fh8_+L>C;4;gZM)Q8t7h z`_&af^M61%?DE@{o6jR4o?RGq{=(ra-$BYuhp!hx{uc<%4VlSP3}=E2`$=Xr!v&=BzalH?RL1e}tVj{4A& zn6KF0rGzsDSwNoO=lTSDML=LF4oc8o5s*E=CVv(kUr-WFh_CTy+hZ6b?InPy+jx(JR3AA)7lT6ki&`V%m_0 z$;^zQ&y;iXstUArio7mGWZ1m!l=43_K@M_*F; z3|1mr65cSL>{hh!Wqfop8eSPm$YAt zJAJ&hzPU2n_2h~X;@hQ%UcnG~oY(>8qJLaOkLgL11ZnP++t@~|b08hQi3|D8pe}P2 zWe%X!HqZjbr%r?%)r(al@68*<&Cy&}6fY^CVQ~)sIc{o*<3jtQ^+CNPA{&1q(wf-{V_dAlG{uiSD Y1KOQmzUTuRQUCw|07*qoM6N<$f(``tA^-pY diff --git a/examples/gamepad-tester/assets/Right Stick Click.png b/examples/gamepad-tester/assets/Right Stick Click.png index f120220fed5b624647dd405e7b810eb492e64e8c..7939dea9e8947ac3a5c4695da6b9ee968107a31b 100644 GIT binary patch delta 981 zcmV;`11kK<2tGm|4vR$6%`c}6ciK`6#xJK6ciK^5)u;=6IoeV zBqSt^jErAjU;qFAd3kw3K|wMyGMP0TJzSppe<8sEl$Z&LQ|m- zcr*k6j4`7XBY$K+w%^)kFy}Z-ZD8ISXSuSp5Y--dBRs*|@0UMX^LHD`dgUyr69#M^ z^x4`_qvMDphV!8>KseIMfiy)%h&rtfjme13b3R@{cz0$>ODwGEb8{8pI3w-Kv_D{C zXsxdh?C{CTG%tJy*@ATsWOhXo(Sl_{^aad3mN{1xv44Jnc}fLGujAMT5d_3+n_O=y zF+a=MFvO(r5E5Y)7D>~)$AWA|Ktv3gSF$cr-^VF40fAj|?XytGybqV4_F^iLFL_Mw z{`xQnBT=hs&MJo8rpb|p&cU})#zY?GH&RR@LB3=g=K4!+ECq!u!3)I}##<1nGA}u< zzZHR6tA8(-=Peh-88-Rk5&Pi#2$9>_;jj(wK!YYHJE!kLEviXFEGB^vs<2Uo1ISyW z{hjGVum)BRV8}8l*cB*q0Z@Wj6lOGp0P?;+Gifqzssybc-I^ANO4ZiTE9GT?H4D@3n* zq<O4Xb2;gaNVAF_XZSX*yqP7eW|KEpMtRcj&I7d zeR%zmt|tSA6gi{Z}4*l-2n_t|tMIYyU` z2EzN$GDtY_yNgm<(bH|=63)Y*M>DfA9tsWQ5Z0el&^V&ughLQN;qHaA%ZjHM$dU2C zqM&q%AQmRW{^qDCt?psW3`sLMl&ZQkB2KGj$E+)ixH>lJa5Ys`kvKReNTqL0PTHc= zS3vcrlhvIw4p;JZhb)NGFR^X{#BT$=F1+~r>bK}0G=p$ObyRu?00000NkvXXu0mjf Dfz-bx delta 1076 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 U1}SF>s{jB107*qoM6N<$f(Eb@@c;k- diff --git a/examples/gamepad-tester/assets/Start_Alt.png b/examples/gamepad-tester/assets/Start_Alt.png index 7a10fcdbc0a5ee4e50cf0ea19e9bf2c10010892b..176f4220d3002bc758ab610d577389d49411f546 100644 GIT binary patch delta 897 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 Date: Tue, 16 Sep 2025 19:58:03 +0200 Subject: [PATCH 5/6] Remove unused resources --- examples/gamepad-tester/assets/Back_Alt.png | Bin 768 -> 0 bytes .../assets/Left Stick Click.png | Bin 915 -> 0 bytes .../assets/Right Stick Click.png | Bin 1003 -> 0 bytes examples/gamepad-tester/assets/Start_Alt.png | Bin 909 -> 0 bytes examples/gamepad-tester/gamepad-tester.json | 270 ------------------ 5 files changed, 270 deletions(-) delete mode 100644 examples/gamepad-tester/assets/Back_Alt.png delete mode 100644 examples/gamepad-tester/assets/Left Stick Click.png delete mode 100644 examples/gamepad-tester/assets/Right Stick Click.png delete mode 100644 examples/gamepad-tester/assets/Start_Alt.png diff --git a/examples/gamepad-tester/assets/Back_Alt.png b/examples/gamepad-tester/assets/Back_Alt.png deleted file mode 100644 index 518709711c56d6005fe8382f530adcf2d8d25ae7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 768 zcmV+b1ONPqP)TJ4ZsUk*SQD*l5ynVUUNfHX3 zvH6B!mKI5efm4d$SjnYPk|QQg99g?Ch_W7CaqB8!$Vw#?x5f@D3z#7r#1wd6VS<8X zni)hf6fp6Y5&M~UU=Ss&<2j4g795eX2gOiUrbD!revsu5FX7W(=!n@X!>ucjK`13D zM0)|UA<#N8s=z(BkJbL`?xDSrKrmax_ClRPG+Q>o0^9Ra3}FT*F2m7-`X%hYbEMz_S&!d|^~ghvj{cSBWQXxfhT1}3ynlOI2MOg8f>*W6 zTQRYoT-7ech3B+D3OWv5RAGqGR^e@_3d4I9b`;uAbXMvo+O%ZJhO!?Pjk(-TByC#L zcemfK93;MSB=Uzl?0dMwL;LWJW2$#W_dIaxlRoGb0@kT@@NLkinxN&T3Cdc=>UNI$ ztm~#xWR0n*QfRZUCkCFfVrz?y+uc-x#wu-?Ff0&%jXky%>ZEz@G2IMsUY!Ow_j95y yW1{Kf6E8789o~sbJ)RE^4Gj$q4Gj$q_17P)5VxOI5inK00009a7bBm000XU000XU0RWnu7ytkQ?MXyI zRCwC$+1ZwzAP@!6+mTVqg#Q1ZjRP`SNP(JUt$6zJ3cFE+Qa_(JZ~k`l4lCF>72k3T)^|1Ei%GE<{LG7t%2RfZZ}8*?yUi$(>V!i>UiT&trj$ zDN!DcW|0s&Frz7F{xy;I9(W0nPVgfz^aRK`^2~q^A%z@+Dk>sOZyZxRW9v1)Xza|Y zh~qlIy)l_fnar*nhqBBpSdHnDGB;m(S*{B^Oy4k&Taa}q3OQS_U6APlv$h@gp>SmW z!WfheXL9XEk4OXwcgW<^()}8LS0WdMMMxM;uqJ#W<%dOU41&lM$;Ly8G3k<7K;W>r z8WNRt9}tP%i^Y|EKRMZ7yfWs&X4kr^(D#q}2DALr8eN0!t%fY@SoTH(Ss*`3B-_aq zV%t#AEqGHdGma>2^J?GYt-VSNtXxX?k_%Ahdx<$IS$rKKHLEjfE;u5ugtungh-O8nV|~y!GKh9q-N(Vk`6M?5weTC?#aA8hRgu@GBTM> zRJs5F019+cPE!Cs|NrU7&yqP_4#h^h00009a7bBm000XU000XU0RWnu7ytkRMM*?K zRCwC$neCRNAPk1PC<3Oea{o8G_<=wS3aH&PXZp^cIj!Vr0we)nudlxP@A^aNc1ZVk zr|$JUrF$Y^-3J(m(mgf#-3J%}rF(KAcOPJ^l0TJzSppe<8sEl$Z&LQ|m-cr*k6j4`7XBV<3e-`Zy|=QvDlVBQ*M zxw5nn)gE{wJi*)Vmp@wbcN@ui;I;{?k z$%xH!K3+k1cVhpeDKi0qU2^TSP{_Owm!S4yDv>XFOz-~sFb5-1t830GhTW#gk%rE}w^7DK9_BYv zOd>(PWEl06Nq-0vaO zMuAi|ybc-I^ANO4ZiTE9GT?H4D@3n*q<O4Xb2;g zaNVAF_XZSX*yqP7eW|KEpMtRcj&I7deR%zmt|tSA6gi{Z~lzK7`XmfK(Fy{0$u{7Ah09gUCn1lX% zG}}F5Ed-jwKHqoPa0TM`*>oj2MwgBT!u!xNNI3Dki&9$A({14r&cmQbGqW)s3Jv5C z)}K?*IHKW%Ll8gV?uE0c79g%*@PPU0r;9 ze2|ckWP@*F0000AbW%=J0RR90<^TV_bvYjQ#TWnp010qNS#tmY3ljhU3ljkVnw%H_ z00QAjL_t(|+U=NYbF3f?hFg@X$W8tK|MfsZP;}QS*gao(r!!7h@F5qGO0nIlZSKV~JzMU9Fhq9c6$U5}(ha9|u9%#zaKVSV(}7!v0;<7a%Qekb)qRoMN_1OdVqh zqMLo_03vXMY?G~CIda_UEu@yR^h~7$?7x&p#_z=oU8O>JtI_Z3+`x)x^F>f6~BdA8O#7_lf!kFm3 Date: Tue, 16 Sep 2025 18:02:32 +0000 Subject: [PATCH 6/6] Optimised images with calibre/image-actions --- examples/gamepad-tester/assets/A Button.png | Bin 1133 -> 1076 bytes examples/gamepad-tester/assets/Back.png | Bin 1071 -> 1016 bytes .../gamepad-tester/assets/Dpad_Default.png | Bin 1320 -> 1190 bytes examples/gamepad-tester/assets/Dpad_Down.png | Bin 1465 -> 1326 bytes examples/gamepad-tester/assets/Dpad_Left.png | Bin 1421 -> 1342 bytes examples/gamepad-tester/assets/Dpad_Right.png | Bin 1436 -> 1332 bytes examples/gamepad-tester/assets/LB.png | Bin 919 -> 862 bytes .../On Screen Controls Button_Pressed.png | Bin 271 -> 247 bytes examples/gamepad-tester/assets/RB.png | Bin 970 -> 916 bytes examples/gamepad-tester/assets/RT.png | Bin 959 -> 899 bytes .../gamepad-tester/assets/Right Stick.png | Bin 1037 -> 899 bytes .../gamepad-tester/assets/Transparent.png | Bin 427 -> 139 bytes examples/gamepad-tester/assets/Up.png | Bin 647 -> 276 bytes examples/gamepad-tester/assets/X Button.png | Bin 4575 -> 1267 bytes examples/gamepad-tester/assets/Y Button.png | Bin 4346 -> 1171 bytes 15 files changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/gamepad-tester/assets/A Button.png b/examples/gamepad-tester/assets/A Button.png index 031aca3aebfabd2b23a0507c177096ab24c3e6dd..8b5faf654eeb90b316e52daa5518ae749caa50cc 100644 GIT binary patch delta 1034 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 delta 1050 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 delta 1301 zcmV+w1?u{y38)H?B!4qdOjJcoX>o3DZlIu`h=_Z;PU9G2? zF2gap7_{W^__IIzc^fCb+Up%{{r5D^_s*XuukAJ7M4$k1MbqcYnfQCx_-D(R;39-w zp2e0$isH5Dx}yL>LO`~US2I_RdZMPG)8-F6rQJ+AOlpex|6BjS)t#1?p@ndh2#-)h zG3Ndvy;dS&rhiL}6(PL5(oG2&!{FAk1W3l5aoHFdLL`Wj-BgUQl>8>*EG6zLH`v-R z{Fx!jng56Tn+VU@yqMQP%3K&y+AuhIOEGUML2OvClqV@s5BGl34bHj)2y;sT%1ie) zk#fXik>Qu&Az61X1b_hLZJ>yQl!jp&-4jIB%G>xt2Y)HqSF(jL;H@HxfKO+S?R@7o zBMoaMDUc${VanJrDBU|zWJ4MEHZNdMx}(ZN%Em@cqGtxBJE1(-$$Z;c;I&BIDdo!$ z^04fjMe0r}4;;3!v#OV}r0$(4>nYbbY@!zuzg{auIf893Nmzl7M5r>Rg;evu)BUb6NI8h#EeT%=hcQ9N z@DRorqI^fm6LDPj_EC|-txgi)uXTs5Vq>A@jDCn-s7UP}7ve1}+2h!Jav*-Fh5guxQH^+T5yu>MB(XbGTr=PG-chhLn6rzk|aUKY!Cvbf2ndj zSNCp&m~->fBoiTXySYG2txn93k_@uF5`>+5f11P)$Q18CMsK7OmdK1OrxP^so8Av1MA9w8woq7aK<;-ukeEY6Bo{Iw zqCz4xR9Qnxjf9XTxI;(=jfoT*cERY5Z-0lWO_XPb{V=tjAI}?+fE$q1X26Zb!C1ik zpz6Qc5=$wmgP`igWD?ZnKzLqSs!_`u$%3eS4yJQ8X`wQ$Qdev9IVv;l64Ojd1qp>6 z=&3ebWu|0NVlF9m$*={P{Z=WqhB@|Diro|oA}ALNhMi(TsTOP&3sSY&rb|(3zZ50+N>Q6dHKg7JN-HOdYPsTtl?R8d@}R8+*=`N+hC(V& z6*|R%a%xi+CY7g3w#N#?u~2`q_$(^Mez|^p5oPoa(n^vU2RcHfv0*dBQVoFu$qj*H zU8jl?hH9#{A^Xh zxd-7fd%rE<)8h`?;Jl_gfABH)Klpg@@$vY^Pgk;yUjh8t@3MbqpM~80AP(yD00000 LNkvXXu0mjf1P*E2 diff --git a/examples/gamepad-tester/assets/Dpad_Down.png b/examples/gamepad-tester/assets/Dpad_Down.png index 58d5cb96c08e6cbac13f48bca14513cf156cc065..70143c76e5e0d147e2741b46c6142dc77aec1c92 100644 GIT binary patch delta 1307 zcmV+$1?2j<3$6-~B!4qdOjJcoX>l?#GN7QKK|w)pZ*Pc*h#wyxA0HniBqSgpAoTR~ zO-)VL*Vq65|CN=MUteFmyu9ID;)nnM019+cPE!E?|NsC0|J#d6D4b9s00009a7bBm z000XU000XU0RWnu7ytkSi%CR5RCwC$nv1fVI1Gjl2*-8+!+-lfZNXq$H*-sNXSZ|I zPN$P#eUW|;Lgwe^*M99kVBR}t?Q1dXobz9IzdL7U?e|zt0~C_`Mi8%4`!F1jgJ>Fn zY3jOentEs&5{~~0Vs*}Knm)(iL^YjiI2`*)7%?#kVwOMKKN*q}cRv`H5zz-kLW?YN z03EWP0rwa-BY!pzQIeKeRD~RLGi8_&*NZ^*Q0P&&Qf4y(nj%S9U57R-e=}qg1q$Xe z1u=RC31+kPzXj6tP=fLI7|^GS4w59MKw6|cAj+j!Fe5>x8e~e4cxZD~eZokPq{-r&oW6;z%4l)*WXnLWuH|a({SLdd8^fE|l*X#h(dM7zxtX zAw3cWQS3>w5Ti#$h3HWC5hBSkav- zA1e@CN|;4g?^g1fs_sJh%>Y#iTUDe>8AnBnvdb{S0ihz_ttSqTXul9yZinoSKNKzmR29)2nntmY?|2=BxS_uh- z5=p%z`J+w_de$(uGFuxYu%2=`e{qvs=}(0J+@`QVc1o*subE_(Z1q~hyZe$1WAYbT zpWI7Pyw>lgA6sD<)QANMlKFBJVmjo%$}r*}-hYfcAqlVqogyR#lNupPrQcl_g#$#y z1OdwBS%=*7k4b_el=rC)B7nJVh?L5+S0Lu8e@-&{>E)G^%N(nG5wk;@zY5|MNRV~# zf$fE}2KiSa`Tq+~u9FY0lw4wtARQ?x&-~}&C2lCGb_G!$pH!|G$fQF0N})d_DJ6Kn zRew&R3gi0;y(PA^iJ&(aCGhM7&hCtow7L!RJKNkcM&Nf~d1uVZi#8%VG6=ESP`(OU zE1@)Aq+evVI-AG0uvzK6Xius4UA%Kl&D}hXf-;VS(stoa(jK;{yvJJ^oDx3?2mPbc zam(RvAz9d9U9D0OdKT z@;pZ$=hBMh8F*45V}eXjC})pz^m#5Hxp;sC8CA%7#5TEQOWomM1wa3;E>=wj4YGbd z1KaGlM+<(<^ z*ACH?C%V%WX9F)~s8&&)=?*tWcmBm>*+gmUkd{hvX$Z-NsXN3-QBt-Hk>uhy)ryg= zsyxvh*nszZFf4}8s`8rdaD9;O`50YQUeO)yYzcU_A)qQRb%%S~4xVjoB;_?o(*5?< z2H&K?%8&Z>4)-@{*me_9z8KQ|(SLRmr4Z$d(K`QV7Z7a$LQ?)M0%>>1vn{~VBO&F7 z_fY!B0qOpffwxSP^3w4A{o(HKz7e05mj)T~!M40h9m|q1(^5cdV%>tLnc~kBkZhXv z2a|3}A2lB%wxkt^V$C<+Ux=?TxGLkTZ+$2r=fD11Nq%)D+CSv~*Zwa10~Dt_jPr&t R(c1t3002ovPDHLkV1hruUt0hG delta 1447 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 XQ52MVe1dlX00000NkvXXu0mjfnk{@B delta 1418 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 VMn2gGU9A8B002ovPDHLkV1l**SZ4qL delta 223 zcmV<503iSO0gnQZBrzCJOjJcoX>n6iQ$0OBVPRoGK|y0u-7Z(U;qeZ zz{ZS#!7)bJDk5UcGDFs~`i+GZR#;)*n36`spjpctL!H?VWx^w|gpYL&=1)9?w)4P~ Zbr-isN%h!};mY6KtMo1K|w)5K|%lj|JT>oKtMqC_4S&Xn&;=| zu&}UYWo609$%%=H?U(?=00005bW%=J0DaFxDOf8jCjbBd32;bRa{vGf6951U69E94 zoEQKA0{lrtK~#9!?U~(jgdhxsiwKKAeE-KSKcXlJBD>ykW`El5?8W&=fleNN~dui_phf*kjEEs_I#ZnbBv?3)`~Dk{13{W zuc^!y0{ni-Z8U*V*C@!W<$oh{7Pe39=h&|Jk@? zIV8LRG5#k&+&A(Sh%b2f6Cox9*gm%ncU zs7AuOcYhbCw7UR#P!i-*g{T_{#LvF)3aQHW?kZpPf8m=3h_AKDAWN~m($QERTFsEK zf#VbJb{8ZhRrgMa-(2yDKc0TNB&-vnV^z`?#u!IQ=1#~Kit{&*Ui8l(8US?dSj5l8 zR*1XJG#tIzU4?f*>i#Of)}vS9uOQ-dO`|XM-G30Fkj4SpG9E=Zt3=zZ?++|3gd-!$h){w50f(Su(4*KFR&1(0K5NqPE zkekk-@OSTHn|Gb)pr8@r-E}d4Sgmau5#>#g#(F};Jgk4USFtA3Ga&e7C_rDFot56|OiTky>#7da68;-ajzUN07U7u;#D-A7N-{XlQ6?=pFq7MRa|< T056mK00000NkvXXu0mjfLbJS6 delta 948 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 diff --git a/examples/gamepad-tester/assets/Transparent.png b/examples/gamepad-tester/assets/Transparent.png index 71574d343c1b746990b6ae5905acea9f1fd3138e..c6a44a28ca0b8445305ce447c55325e465b3717b 100644 GIT binary patch delta 121 zcmZ3@+|4*avWS_1fx+D-H4R8H2l#}z`eYXR9=~A)UTR;Y>x=gFFcqx}%z)0l~ukspULFs>J)1j=<1o N@O1TaS?83{1OVgyh2;PM diff --git a/examples/gamepad-tester/assets/Up.png b/examples/gamepad-tester/assets/Up.png index dce4736bade12ba634af193be17b3394ec58b077..21188bbeb2c4e5675e8379bf9a4b55f8d5bc2fa3 100644 GIT binary patch delta 259 zcmZo?ox(IhvYwfNfx+D-H4R9y1^9%x`eYVfO_Ztp8ITVYVJr#q3ubV5b^|2MS>O>_ z%)r1c48n{Iv*t(u1($oeIEGZ*dVBpe?_mcX=8K8{eV@N^p7eLd5xoPM4`g#r3-v5_ z-!pgLGx2*xCLs+sl1xGyB9gX*9GVfVvU|~5p_*eelzxhyT<@`6Bi&~5ncGu;`hA&)Sw&Cg7dl#&O`H+ZcW<}al*iYvII3U~=?yaSW-5 zdwct#?_mc4m&8l#vH_w~14U&ouxmI?WRP^J*}Xmg{k;FylINFOdQU8>%qZDwXTNWL z=kG6{$}EfHkJ_GCklww2yMvMlTZ-7B{0xyfK@+lAl>9h3L?5XK9L-wRRMNPjWhT=l z(M3#ZqA8*sGYv8oRwvyl*mO@{Q(<*-%A%I0H%t>NTUs06bP4XACNSZyp;BO*lH2v##g)8dj(wec$f3+`pVBnJeG_7* z3v~jiy8(*~FFBN1>@zY5atw1jdB}r3QczVmnd^j?#!ZRK4q*;68x2L57@yMVd8r^9 zn3go9p~PusZy?(x#-&V)MOu1-S_Ao6QzP?A2gO7M z$FxNk3^phj2XsheOz;uWVv|#0Ztc0qq$1SXcacqnX(_Xt_5{HxdJ=CP&Mhc8l)+iV z?`7VzP2s=e%Z`guPxPm(lX&ac7hsjF!}v*bsr4}(`QVmB76$d%>lc9(0NNN+a-9%u@V(@hJb6Mw<&;$S?)djf# diff --git a/examples/gamepad-tester/assets/X Button.png b/examples/gamepad-tester/assets/X Button.png index 4b8cec1834610cb45ebf6ecb0fe31d625b584c1c..262f9e9fd5ad4ce4b8a24910c5debe79b023342e 100644 GIT binary patch delta 1258 zcmVmk010qNS$}f?01FcU01FcV0GgZ_ z000CvNkl8pkN=_pOWf+bL?J`Q=w>8-hx(EC*c$^1dT(A6Cm)8%~M;0SF7SIh-cgVIM%gK z`0^cZh#_k70Dk~zGNc`iO`+4NX@3&dHt%qz-AF?qm?O?qnGgtu9HZ)qw^C}5T$>z} z!rv`9P#wU)ZYU{g&xBOIGrLe03`i+8tPnKL061N3)P=7xDE;b^NUa$2ilUarlTeYdvM-@VnBPqdJHN{+f9N1_FT)trO1Z_B@*S~+ zjn1cf)y32XUj%LrGSC)r5JZ41?TUnZ1&Q|G7Ju0C>rgyw?8kLRn*?K!UsXCJ0k)i2 zo1a*y>#KB7UgZwC6*xo;VQdVNr9qaef9;iyy9|RsN`=XCf)a~7g}C!bYlOlNleGke zL*!{BxuzrtWNw%&3^GO1i$HQYeJey*n5>ttrn9uiL69r`$3PgOtNs+oh(I3vGa$W_ zU4Q*YKr~s8K2BH`NU~0#(8m~IZk><=#n?mc)-l4ii*ci^Fho*}uaVjbxaVL2Cx z%gwnG@ikdvpdt4Gwh~t&bh(qRD`ViCs()99SDkgaBleo=ycPRk@%gv#%xmh!z8oZa z$<^kO;3b?{Ua&dKyKu*z4q4_s9jdfW(Al?x$j1=&5j4LVi}WL2yTW%p=eYNrtF|PM zcJJd?V=!g)f?`XL(7KAMvl$ckiQQ~!5)_GoLoSLVNjx(&9I{thF&J1}Az1=Whkt!x zIRehGOD3XNwj1g#XSA?3An`6o@FD?}n2f`P!R}`4eRHe1NZg?Q5U5e=+%P U*EtNS3jhEB07*qoM6N<$g28o5m;e9( literal 4575 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 JPDHLkV1gh9uC)LF diff --git a/examples/gamepad-tester/assets/Y Button.png b/examples/gamepad-tester/assets/Y Button.png index e32b04a323a5d2bb031cd9174b9655ec6f7d876e..12445ed62252f078308deffab3174683c0ebceab 100644 GIT binary patch delta 1162 zcmV;51au z2KN8}019+cPE!E?|Nj>0$8h>a@D#c)Vn(6`yykb9C^!RC8T}3g-@qI^lk8*&2o~fpB zLJi|RiqY}ZM}NJkY&-SxeNW;o`!kx^GJ1L6fu%W8OiQFdG|e%o1}u~@N^uLNjKQKU z-n0iea2ZC4ZUv#tx|kxCg=5SxY3A?hI_kZ9RxRIckX#!`)`9(u)EQvYz zEenBJB&m^SLk7&DZ#&?aWgyrxi)BqWG>(5AfLLbpYeM%fh8RKQa4g2#lI`OP8A9i< ziV1H^w!>O47BAqiEZhs$kP0z`zS{JdqLeZh;>8lT0wBS%rOd4*efNT|FN-N~+dbvp zd{j#AK!350h(Ijy#{%ou*=G~B#k;~XY7N^${$W}z_`9Zk^wL-`1v@ge?Q7U0V&%Gi zZAx*xBIqyyd!^2(z|#Ig-0pugI@C0n)7vK@AP+U^yTH|2M`r+?H!f@%NvOK-RRqSxx-9ASWIgX1-vik&|zEkqkh-Xhob~On*aI6qW_K%hDfD}ha z_J0q^oui&YLOAN%+)Il>LV0OrU%wO*%Ii1xAweRcd`SE}f=?n{N}?&BM937CEJfsx zV6|h(Vv7CVPJYv;N&IJOPOU{RREjPkp?+{vt`12O5ndhId`>X>QX+zh$Rz^AQvTLh z@zLwg3`0jTz3APC&IF$oM5_=g= zQyQ(TI3y|adTv4@Q4rt|V4czjEQ*G!kOi{Ncw}o1akv~3h0lDKqL>4sdWll>2oF~%Mt?sX z)~^Nvh)8gCdLRIUrlQeCDTmuH*qIc@{=~$I)ox^#t-_AAp4G|OTym-f6Rk7TMh2tU zUT$O?B}^Ni=LV;&#-mILz~js(yI}D9$l{{$Z`IVFocto5?U=c4uVjFce}llTC-~xv cFFuXG-k@klC}wC*00000NkvXXt^-0~f*>*~qW}N^ literal 4346 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