{
  "firstLayout": "",
  "gdVersion": {
    "build": 262,
    "major": 5,
    "minor": 6,
    "revision": 0
  },
  "properties": {
    "adaptGameResolutionAtRuntime": true,
    "antialiasingMode": "MSAA",
    "antialisingEnabledOnMobile": false,
    "folderProject": false,
    "orientation": "landscape",
    "packageName": "com.example.gamename",
    "pixelsRounding": false,
    "projectUuid": "0c921c99-5278-45cd-9e6e-b2b207c1e069",
    "scaleMode": "linear",
    "sizeOnStartupMode": "",
    "templateSlug": "starting-first-person",
    "version": "1.0.0",
    "name": "гаем - Copy - Copy - Copy - Copy",
    "description": "",
    "author": "",
    "windowWidth": 1280,
    "windowHeight": 720,
    "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": [
      "mobile",
      "mobile"
    ],
    "extensionProperties": [],
    "platforms": [
      {
        "name": "GDevelop JS platform"
      }
    ],
    "currentPlatform": "GDevelop JS platform"
  },
  "resources": {
    "resources": [
      {
        "file": "assets/StartingBackground.png",
        "kind": "image",
        "metadata": "",
        "name": "assets\\StartingBackground.png",
        "smoothed": true,
        "userAdded": false
      },
      {
        "file": "assets/StartingWall.png",
        "kind": "image",
        "metadata": "",
        "name": "assets\\StartingWall.png",
        "smoothed": true,
        "userAdded": false
      },
      {
        "file": "assets/StartingGround.png",
        "kind": "image",
        "metadata": "",
        "name": "assets\\StartingGround.png",
        "smoothed": true,
        "userAdded": false
      },
      {
        "file": "assets/StarterPushable.png",
        "kind": "image",
        "metadata": "",
        "name": "assets\\StarterPushable.png",
        "smoothed": true,
        "userAdded": false
      },
      {
        "file": "assets/Flat dark joystick border.png",
        "kind": "image",
        "metadata": "",
        "name": "Flat dark joystick border.png",
        "smoothed": true,
        "userAdded": false,
        "origin": {
          "identifier": "https://asset-resources.gdevelop.io/public-resources/Multitouch joysticks/1db606cabd7372d1494ba5934bc25bcdd72f5a213c4a27509be57c3f4d5aecca_Flat dark joystick border.png",
          "name": "Flat dark joystick border.png"
        }
      },
      {
        "file": "assets/Flat dark joystick thumb.png",
        "kind": "image",
        "metadata": "",
        "name": "Flat dark joystick thumb.png",
        "smoothed": true,
        "userAdded": false,
        "origin": {
          "identifier": "https://asset-resources.gdevelop.io/public-resources/Multitouch joysticks/10167ade22c4a6b48324e6c1d1bd6dc74179d7bed0775890903f418b4a05c8a1_Flat dark joystick thumb.png",
          "name": "Flat dark joystick thumb.png"
        }
      },
      {
        "file": "assets/Top arrow button.png",
        "kind": "image",
        "metadata": "",
        "name": "Top arrow button.png",
        "smoothed": true,
        "userAdded": false,
        "origin": {
          "identifier": "https://asset-resources.gdevelop.io/public-resources/On-Screen Controls/Sprites/Flat Dark/e3943e1b23ceb90f00fc5e7c0481c5147b983fdc5397fb3690e102e53ce72d4f_Top arrow button.png",
          "name": "Top arrow button.png"
        }
      },
      {
        "file": "assets/StarterToggle_Keyboard.png",
        "kind": "image",
        "metadata": "",
        "name": "StarterToggle_Keyboard.png",
        "smoothed": true,
        "userAdded": false
      },
      {
        "file": "assets/StarterToggle_Touch.png",
        "kind": "image",
        "metadata": "",
        "name": "StarterToggle_Touch.png",
        "smoothed": true,
        "userAdded": false
      },
      {
        "file": "compass.glb",
        "kind": "model3D",
        "metadata": "",
        "name": "compass.glb",
        "userAdded": false
      },
      {
        "file": "assets/NewSprite.png",
        "kind": "image",
        "metadata": "{\"extension\":\".png\"}",
        "name": "NewSprite",
        "smoothed": true,
        "userAdded": false
      },
      {
        "file": "assets/NewSprite2.png",
        "kind": "image",
        "metadata": "{\"extension\":\".png\"}",
        "name": "NewSprite2",
        "smoothed": true,
        "userAdded": false
      },
      {
        "file": "assets/NewSprite3.png",
        "kind": "image",
        "metadata": "{\"extension\":\".png\"}",
        "name": "NewSprite3",
        "smoothed": true,
        "userAdded": false
      },
      {
        "file": "assets/assets/StarterPushable.png",
        "kind": "image",
        "metadata": "",
        "name": "assets\\assets\\StarterPushable.png",
        "smoothed": true,
        "userAdded": false
      },
      {
        "file": "assets/assets/StartingWall.png",
        "kind": "image",
        "metadata": "",
        "name": "assets\\assets\\StartingWall.png",
        "smoothed": true,
        "userAdded": false
      },
      {
        "file": "assets/assets/StartingGround.png",
        "kind": "image",
        "metadata": "",
        "name": "assets\\assets\\StartingGround.png",
        "smoothed": true,
        "userAdded": false
      },
      {
        "file": "assets/assets/StartingBackground.png",
        "kind": "image",
        "metadata": "",
        "name": "assets\\assets\\StartingBackground.png",
        "smoothed": true,
        "userAdded": false
      },
      {
        "file": "assets/NewSprite4.png",
        "kind": "image",
        "metadata": "{\"extension\":\".png\"}",
        "name": "NewSprite4",
        "smoothed": true,
        "userAdded": false
      },
      {
        "file": "assets/assets/StarterToggle_Keyboard.png",
        "kind": "image",
        "metadata": "",
        "name": "assets\\assets\\StarterToggle_Keyboard.png",
        "smoothed": true,
        "userAdded": false
      },
      {
        "file": "assets/assets/StarterToggle_Touch.png",
        "kind": "image",
        "metadata": "",
        "name": "assets\\assets\\StarterToggle_Touch.png",
        "smoothed": true,
        "userAdded": false
      },
      {
        "file": "assets/assets/Top arrow button.png",
        "kind": "image",
        "metadata": "",
        "name": "assets\\assets\\Top arrow button.png",
        "smoothed": true,
        "userAdded": false
      },
      {
        "file": "assets/assets/Flat dark joystick thumb.png",
        "kind": "image",
        "metadata": "",
        "name": "assets\\assets\\Flat dark joystick thumb.png",
        "smoothed": true,
        "userAdded": false
      },
      {
        "file": "assets/assets/Flat dark joystick border.png",
        "kind": "image",
        "metadata": "",
        "name": "assets\\assets\\Flat dark joystick border.png",
        "smoothed": true,
        "userAdded": false
      }
    ]
  },
  "objects": [],
  "objectsFolderStructure": {
    "folderName": "__ROOT"
  },
  "objectsGroups": [],
  "variables": [],
  "layouts": [
    {
      "b": 255,
      "disableInputWhenNotFocused": true,
      "mangledName": "Game_32Scene",
      "name": "Game Scene",
      "r": 255,
      "standardSortMethod": true,
      "stopSoundsOnStartup": true,
      "title": "",
      "v": 255,
      "uiSettings": {
        "grid": false,
        "gridType": "rectangular",
        "gridWidth": 64,
        "gridHeight": 64,
        "gridDepth": 32,
        "gridOffsetX": 0,
        "gridOffsetY": 0,
        "gridOffsetZ": 0,
        "gridColor": 10401023,
        "gridAlpha": 0.8,
        "snap": false,
        "zoomFactor": 0.43357743047025565,
        "windowMask": false,
        "selectedLayer": "",
        "gameEditorMode": "embedded-game"
      },
      "objectsGroups": [],
      "variables": [
        {
          "name": "ControlKind",
          "type": "string",
          "value": "Keyboard"
        }
      ],
      "instances": [
        {
          "angle": 0,
          "customSize": true,
          "depth": 30,
          "height": 1000,
          "keepRatio": true,
          "layer": "",
          "locked": true,
          "name": "Ground",
          "persistentUuid": "6a14e5ab-5c31-4692-8cd5-c50937fd60c6",
          "width": 1000,
          "x": 140,
          "y": -143,
          "z": -30,
          "zOrder": 1,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 60,
          "height": 128,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "ca0783fc-909c-418e-8ce1-00021a50eb13",
          "width": 128,
          "x": 320,
          "y": 448,
          "zOrder": 3,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 180,
          "height": 320,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "6b301c71-6326-4b68-8e68-9bb7cd5a43fc",
          "width": 128,
          "x": 832,
          "y": 0,
          "zOrder": 3,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 440,
          "height": 128,
          "layer": "",
          "name": "PushableBox",
          "persistentUuid": "23eef725-fc64-4eec-8627-4bfb97898d8a",
          "width": 16,
          "x": 412,
          "y": 320,
          "z": 120,
          "zOrder": 5,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 1,
          "height": 720,
          "layer": "Background",
          "locked": true,
          "name": "Skybox",
          "persistentUuid": "d15cbacb-fb3c-4e6c-94ae-3fe2134650f5",
          "width": 1280,
          "x": 0,
          "y": 0,
          "zOrder": 6,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": false,
          "height": 0,
          "keepRatio": true,
          "layer": "MobileControls",
          "locked": true,
          "name": "MovementJoystick",
          "persistentUuid": "757f9f40-246a-49c8-a4d3-fe0022b826a7",
          "width": 0,
          "x": 170,
          "y": 576,
          "zOrder": 7,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 0,
          "height": 120,
          "keepRatio": true,
          "layer": "MobileControls",
          "locked": true,
          "name": "JumpButton",
          "persistentUuid": "c641f19e-29c5-4424-be1c-656b5505f1ac",
          "width": 120,
          "x": 1110,
          "y": 576,
          "zOrder": 8,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 180,
          "height": 320,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "7d546d65-52a7-420f-a48c-4781e86cfe51",
          "width": 128,
          "x": 320,
          "y": 0,
          "zOrder": 3,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 120,
          "height": 128,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "380775e6-26ee-476b-bd88-4f7960166508",
          "width": 128,
          "x": 320,
          "y": 320,
          "zOrder": 3,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 120,
          "height": 128,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "03fa04af-e8bd-45a9-a0c1-016a54c0e109",
          "width": 128,
          "x": 832,
          "y": 320,
          "zOrder": 3,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 60,
          "height": 128,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "5178807c-226a-4d1a-88d2-31682c13160c",
          "width": 128,
          "x": 832,
          "y": 448,
          "zOrder": 3,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 93,
          "height": 50,
          "layer": "",
          "name": "Player",
          "persistentUuid": "21360899-9239-44bc-86fa-6b7a8dbc66b0",
          "width": 50,
          "x": 615,
          "y": 768,
          "zOrder": 14,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": false,
          "height": 0,
          "keepRatio": true,
          "layer": "MobileControls",
          "locked": true,
          "name": "ControlsToggle",
          "persistentUuid": "8f7d9c3d-1567-4a65-867e-d042f38c0e86",
          "width": 0,
          "x": 32,
          "y": 32,
          "zOrder": 15,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 30,
          "height": 1000,
          "keepRatio": true,
          "layer": "",
          "locked": true,
          "name": "Ground",
          "persistentUuid": "3592e917-b79a-4907-875d-b379e1c275e6",
          "width": 1000,
          "x": 140,
          "y": -143,
          "z": -30,
          "zOrder": 1,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 30,
          "height": 1000,
          "keepRatio": true,
          "layer": "",
          "locked": true,
          "name": "Ground",
          "persistentUuid": "426b0d66-cdf0-4b9d-a124-1d7fe15a26e5",
          "width": 1000,
          "x": 140,
          "y": -143,
          "z": -30,
          "zOrder": 1,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": false,
          "height": 1000,
          "layer": "",
          "name": "Ground",
          "persistentUuid": "5dca1298-28fc-43b5-b81a-41a02d7d030c",
          "width": 1000,
          "x": 140,
          "y": -1142,
          "z": -40,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": false,
          "height": 100,
          "layer": "",
          "name": "PushableBox",
          "persistentUuid": "f72eb2b0-bf40-4d8c-8c6e-3926644cf3f2",
          "width": 100,
          "x": 571,
          "y": -430,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": false,
          "depth": 172,
          "height": 100,
          "layer": "",
          "name": "PushableBox",
          "persistentUuid": "381b2f4a-624e-47a2-a180-81a1db6076da",
          "width": 100,
          "x": 932,
          "y": -326,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 341,
          "height": 221,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "5a5d7349-11dd-4184-a9c0-fce92137a358",
          "width": 208,
          "x": 576,
          "y": -661,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": false,
          "depth": 235,
          "height": 100,
          "layer": "",
          "name": "PushableBox",
          "persistentUuid": "29f7cb7a-cc79-4438-888b-0d314bc28277",
          "width": 100,
          "x": 819,
          "y": -547,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "height": 173,
          "layer": "",
          "name": "PushableBox",
          "persistentUuid": "7c6d9830-bbe3-4426-a502-1ae8c43da6a4",
          "width": 190,
          "x": 221,
          "y": -1068,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": false,
          "height": 6.456524927172273,
          "layer": "",
          "name": "New3DModel",
          "persistentUuid": "cc1000b9-174c-434d-a9c9-3ae0ceb011b0",
          "rotationX": 269,
          "width": 29,
          "x": 680,
          "y": -558,
          "z": 343,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": false,
          "height": 1000,
          "layer": "",
          "name": "Ground",
          "persistentUuid": "0522d9cb-99ed-49e9-b44f-b61699ee32ab",
          "width": 1000,
          "x": 140,
          "y": -2142,
          "z": -40,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 338,
          "height": 995,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "2facd5c4-daf7-4faf-a883-a62fe7351303",
          "width": 100,
          "x": 140,
          "y": -2142,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 338,
          "height": 995,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "359efe91-afdc-4446-83b8-1a5130ae1e70",
          "width": 100,
          "x": 1040,
          "y": -2142,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 337,
          "height": 100,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "149883b1-8d64-4a01-8979-281a3d423610",
          "width": 259,
          "x": 239,
          "y": -2142,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "height": 100,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "0cb31bf0-04bc-4cb1-b656-10c84538a344",
          "width": 298,
          "x": 495,
          "y": -2142,
          "z": 237,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 337,
          "height": 100,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "0e56b226-2ebb-4b9b-a874-a59da7d8d557",
          "width": 259,
          "x": 783,
          "y": -2142,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 337,
          "height": 100,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "a31dfede-385c-473c-8df9-ec4567b09578",
          "width": 259,
          "x": 239,
          "y": -1247,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "height": 100,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "c333d5eb-5ddd-4c6f-9f0a-e95f5c7d5483",
          "width": 298,
          "x": 495,
          "y": -1247,
          "z": 237,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 337,
          "height": 100,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "89487ca1-2104-404d-8338-46d8e9afe140",
          "width": 259,
          "x": 783,
          "y": -1247,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 335,
          "height": 995,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "a5f42c59-c896-4e31-b8a3-868be78a9e60",
          "rotationX": 180,
          "width": 1000,
          "x": 140,
          "y": -2143,
          "z": 338,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": false,
          "height": 1000,
          "layer": "",
          "name": "Ground",
          "persistentUuid": "9e3b0733-40e3-48e3-aca8-bde2d01a52c7",
          "width": 1000,
          "x": 140,
          "y": -3136,
          "z": -40,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 338,
          "height": 995,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "17493a53-f302-4cc0-9845-969e0eae5577",
          "width": 100,
          "x": 140,
          "y": -3136,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 338,
          "height": 995,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "67a33a47-4b0e-4877-a359-7e0920d413c5",
          "width": 100,
          "x": 1040,
          "y": -3136,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 337,
          "height": 100,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "af78f2be-688f-4e35-b7a1-3efeab4b87c2",
          "width": 259,
          "x": 239,
          "y": -3136,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "height": 100,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "799c54cd-f0d2-4731-b1c4-7eafb4354974",
          "width": 298,
          "x": 495,
          "y": -3136,
          "z": 237,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 337,
          "height": 100,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "ab7777d8-0d41-4c4b-98b9-1110d42d8da3",
          "width": 259,
          "x": 783,
          "y": -3136,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 335,
          "height": 995,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "c83023dc-87d4-4102-9170-fdf412ada8a7",
          "rotationX": 180,
          "width": 1000,
          "x": 140,
          "y": -3137,
          "z": 338,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": false,
          "height": 1000,
          "layer": "",
          "name": "Ground",
          "persistentUuid": "f431ac22-d5f2-438d-b185-8507211a1176",
          "width": 1000,
          "x": 140,
          "y": -4132,
          "z": -40,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 338,
          "height": 995,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "5978d4be-4aeb-4e0f-9325-10436c033008",
          "width": 100,
          "x": 140,
          "y": -4132,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 338,
          "height": 995,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "e982ba5e-b264-414b-97f3-29502bd59adb",
          "width": 100,
          "x": 1040,
          "y": -4132,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 337,
          "height": 100,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "f6caf884-0247-4e39-8aa0-2fbc9270d121",
          "width": 259,
          "x": 239,
          "y": -4132,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "height": 100,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "e5ddc35b-7b18-44a9-ae8e-b111959bfcaa",
          "width": 298,
          "x": 495,
          "y": -4132,
          "z": 237,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 337,
          "height": 100,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "8516dc3f-2808-406c-8e24-204cf4686b71",
          "width": 259,
          "x": 783,
          "y": -4132,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 335,
          "height": 995,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "f5d87328-f21b-4094-831a-23335d0b61a3",
          "rotationX": 180,
          "width": 1000,
          "x": 140,
          "y": -4133,
          "z": 338,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": false,
          "height": 1000,
          "layer": "",
          "name": "Ground",
          "persistentUuid": "7da6c59e-8705-4b91-ab14-766928ed8c28",
          "width": 1000,
          "x": 140,
          "y": -5124,
          "z": -40,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 338,
          "height": 995,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "2c30b3c3-30e3-422d-a347-b8f60f5d497f",
          "width": 100,
          "x": 140,
          "y": -5124,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 338,
          "height": 995,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "064ff304-a0f4-4bdc-98c2-7073036694ea",
          "width": 100,
          "x": 1040,
          "y": -5124,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 337,
          "height": 100,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "dbff984b-c54f-42b6-8ea0-a877863ecbd3",
          "width": 259,
          "x": 239,
          "y": -5124,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "height": 100,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "49b190bc-cd7b-4042-870a-889fc7e1e81c",
          "width": 298,
          "x": 495,
          "y": -5124,
          "z": 237,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 337,
          "height": 100,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "d06e743b-2214-4412-8811-e226e9645819",
          "width": 259,
          "x": 783,
          "y": -5124,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 335,
          "height": 995,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "d5bf1952-d9cd-4492-82ef-52b310f05756",
          "rotationX": 180,
          "width": 1000,
          "x": 140,
          "y": -5125,
          "z": 338,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": false,
          "height": 1000,
          "layer": "",
          "name": "Ground",
          "persistentUuid": "8ab9d5c4-234d-4eae-bbd6-55a2ccc3a199",
          "width": 1000,
          "x": 140,
          "y": -6108,
          "z": -40,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 338,
          "height": 995,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "ebac390e-45cc-4840-b627-30583567a38f",
          "width": 100,
          "x": 140,
          "y": -6108,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 338,
          "height": 995,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "5d9e103d-844d-4b22-9a46-5357846dae39",
          "width": 100,
          "x": 1040,
          "y": -6108,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 337,
          "height": 100,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "d462afd4-f43c-4c44-aa5f-e5e39238e961",
          "width": 259,
          "x": 239,
          "y": -6108,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "height": 100,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "c85988f2-693b-4ffb-be36-aaeacc11cfb8",
          "width": 298,
          "x": 495,
          "y": -6108,
          "z": 237,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 337,
          "height": 100,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "bd746752-4a40-45a4-9d82-933ee9acbe6b",
          "width": 259,
          "x": 783,
          "y": -6108,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        },
        {
          "angle": 0,
          "customSize": true,
          "depth": 335,
          "height": 995,
          "layer": "",
          "name": "Obstacle",
          "persistentUuid": "6f1a0cf5-9b10-4b7c-be4e-744800a105ce",
          "rotationX": 180,
          "width": 1000,
          "x": 140,
          "y": -6109,
          "z": 338,
          "zOrder": 0,
          "numberProperties": [],
          "stringProperties": [],
          "initialVariables": []
        }
      ],
      "objects": [
        {
          "assetStoreId": "",
          "name": "Ground",
          "persistentUuid": "be787969-2d67-4979-a5b0-987ed79f5edf",
          "type": "Scene3D::Cube3DObject",
          "variables": [],
          "effects": [],
          "behaviors": [
            {
              "name": "Physics3D",
              "type": "Physics3D::Physics3DBehavior",
              "object3D": "Object3D",
              "bodyType": "Static",
              "bullet": false,
              "fixedRotation": false,
              "shape": "Box",
              "shapeOrientation": "Z",
              "shapeDimensionA": 0,
              "shapeDimensionB": 0,
              "shapeDimensionC": 0,
              "density": 1,
              "friction": 0.3,
              "restitution": 0.1,
              "linearDamping": 0.1,
              "angularDamping": 0.1,
              "gravityScale": 1,
              "layers": 17,
              "masks": 17,
              "shapeOffsetX": 0,
              "shapeOffsetY": 0,
              "shapeOffsetZ": 0,
              "massCenterOffsetX": 0,
              "massCenterOffsetY": 0,
              "massCenterOffsetZ": 0,
              "massOverride": 0
            }
          ],
          "content": {
            "width": 1000,
            "height": 1000,
            "depth": 40,
            "enableTextureTransparency": false,
            "facesOrientation": "Y",
            "frontFaceResourceName": "assets\\assets\\StartingGround.png",
            "backFaceResourceName": "assets\\assets\\StartingGround.png",
            "backFaceUpThroughWhichAxisRotation": "X",
            "leftFaceResourceName": "assets\\assets\\StartingGround.png",
            "rightFaceResourceName": "assets\\assets\\StartingGround.png",
            "topFaceResourceName": "assets\\assets\\StartingGround.png",
            "bottomFaceResourceName": "assets\\assets\\StartingGround.png",
            "frontFaceVisible": true,
            "backFaceVisible": false,
            "leftFaceVisible": true,
            "rightFaceVisible": true,
            "topFaceVisible": true,
            "bottomFaceVisible": true,
            "frontFaceResourceRepeat": true,
            "backFaceResourceRepeat": false,
            "leftFaceResourceRepeat": false,
            "rightFaceResourceRepeat": false,
            "topFaceResourceRepeat": false,
            "bottomFaceResourceRepeat": false,
            "materialType": "StandardWithoutMetalness",
            "isCastingShadow": true,
            "isReceivingShadow": true
          }
        },
        {
          "assetStoreId": "",
          "name": "Obstacle",
          "persistentUuid": "376667d8-244e-46e4-85ee-69192da466c5",
          "type": "Scene3D::Cube3DObject",
          "variables": [],
          "effects": [],
          "behaviors": [
            {
              "name": "Physics3D",
              "type": "Physics3D::Physics3DBehavior",
              "object3D": "Object3D",
              "bodyType": "Static",
              "bullet": false,
              "fixedRotation": false,
              "shape": "Box",
              "shapeOrientation": "Z",
              "shapeDimensionA": 0,
              "shapeDimensionB": 0,
              "shapeDimensionC": 0,
              "density": 1,
              "friction": 0.3,
              "restitution": 0.1,
              "linearDamping": 0.1,
              "angularDamping": 0.1,
              "gravityScale": 1,
              "layers": 17,
              "masks": 17,
              "shapeOffsetX": 0,
              "shapeOffsetY": 0,
              "shapeOffsetZ": 0,
              "massCenterOffsetX": 0,
              "massCenterOffsetY": 0,
              "massCenterOffsetZ": 0,
              "massOverride": 0
            }
          ],
          "content": {
            "width": 100,
            "height": 100,
            "depth": 100,
            "enableTextureTransparency": false,
            "facesOrientation": "Y",
            "frontFaceResourceName": "assets\\assets\\StartingWall.png",
            "backFaceResourceName": "assets\\assets\\StartingWall.png",
            "backFaceUpThroughWhichAxisRotation": "X",
            "leftFaceResourceName": "assets\\assets\\StartingWall.png",
            "rightFaceResourceName": "assets\\assets\\StartingWall.png",
            "topFaceResourceName": "assets\\assets\\StartingWall.png",
            "bottomFaceResourceName": "assets\\assets\\StartingWall.png",
            "frontFaceVisible": true,
            "backFaceVisible": false,
            "leftFaceVisible": true,
            "rightFaceVisible": true,
            "topFaceVisible": true,
            "bottomFaceVisible": true,
            "frontFaceResourceRepeat": false,
            "backFaceResourceRepeat": false,
            "leftFaceResourceRepeat": false,
            "rightFaceResourceRepeat": false,
            "topFaceResourceRepeat": false,
            "bottomFaceResourceRepeat": false,
            "materialType": "StandardWithoutMetalness",
            "isCastingShadow": true,
            "isReceivingShadow": true
          }
        },
        {
          "assetStoreId": "",
          "name": "PushableBox",
          "persistentUuid": "e78370a1-5001-4d93-a950-e3babe3a31ee",
          "type": "Scene3D::Cube3DObject",
          "variables": [],
          "effects": [],
          "behaviors": [
            {
              "name": "Physics3D",
              "type": "Physics3D::Physics3DBehavior",
              "object3D": "Object3D",
              "bodyType": "Dynamic",
              "bullet": false,
              "fixedRotation": false,
              "shape": "Box",
              "shapeOrientation": "Z",
              "shapeDimensionA": 0,
              "shapeDimensionB": 0,
              "shapeDimensionC": 0,
              "density": 10,
              "friction": 3,
              "restitution": 0.1,
              "linearDamping": 4,
              "angularDamping": 5,
              "gravityScale": 1,
              "layers": 17,
              "masks": 17,
              "shapeOffsetX": 0,
              "shapeOffsetY": 0,
              "shapeOffsetZ": 0,
              "massCenterOffsetX": 0,
              "massCenterOffsetY": 0,
              "massCenterOffsetZ": 0,
              "massOverride": 0
            }
          ],
          "content": {
            "width": 100,
            "height": 100,
            "depth": 100,
            "enableTextureTransparency": false,
            "facesOrientation": "Y",
            "frontFaceResourceName": "assets\\assets\\StarterPushable.png",
            "backFaceResourceName": "assets\\assets\\StarterPushable.png",
            "backFaceUpThroughWhichAxisRotation": "X",
            "leftFaceResourceName": "assets\\assets\\StarterPushable.png",
            "rightFaceResourceName": "assets\\assets\\StarterPushable.png",
            "topFaceResourceName": "assets\\assets\\StarterPushable.png",
            "bottomFaceResourceName": "assets\\assets\\StarterPushable.png",
            "frontFaceVisible": true,
            "backFaceVisible": true,
            "leftFaceVisible": true,
            "rightFaceVisible": true,
            "topFaceVisible": true,
            "bottomFaceVisible": true,
            "frontFaceResourceRepeat": false,
            "backFaceResourceRepeat": false,
            "leftFaceResourceRepeat": false,
            "rightFaceResourceRepeat": false,
            "topFaceResourceRepeat": false,
            "bottomFaceResourceRepeat": false,
            "materialType": "StandardWithoutMetalness",
            "isCastingShadow": true,
            "isReceivingShadow": true
          }
        },
        {
          "assetStoreId": "",
          "height": 128,
          "name": "Skybox",
          "persistentUuid": "a7871e12-9a9c-4aa5-8a4f-61c83a045b9d",
          "texture": "assets\\assets\\StartingBackground.png",
          "type": "TiledSpriteObject::TiledSprite",
          "width": 128,
          "variables": [],
          "effects": [],
          "behaviors": []
        },
        {
          "assetStoreId": "e71bd69f896d6c7531b48c65ceb5da25071d4fbdeb518aeceecba8d21f34ed8d",
          "name": "MovementJoystick",
          "type": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
          "variant": "",
          "variables": [],
          "effects": [],
          "behaviors": [],
          "content": {
            "DeadZoneRadius": 0.1
          },
          "childrenContent": {
            "Border": {
              "adaptCollisionMaskAutomatically": false,
              "updateIfNotVisible": false,
              "animations": [
                {
                  "name": "Idle",
                  "useMultipleDirections": false,
                  "directions": [
                    {
                      "looping": false,
                      "timeBetweenFrames": 0.08,
                      "sprites": [
                        {
                          "hasCustomCollisionMask": false,
                          "image": "assets\\assets\\Flat dark joystick thumb.png",
                          "points": [],
                          "originPoint": {
                            "name": "origine",
                            "x": 0,
                            "y": 0
                          },
                          "centerPoint": {
                            "automatic": true,
                            "name": "centre",
                            "x": 0,
                            "y": 0
                          },
                          "customCollisionMask": []
                        }
                      ]
                    }
                  ]
                }
              ]
            },
            "Thumb": {
              "adaptCollisionMaskAutomatically": false,
              "updateIfNotVisible": false,
              "animations": [
                {
                  "name": "Idle",
                  "useMultipleDirections": false,
                  "directions": [
                    {
                      "looping": false,
                      "timeBetweenFrames": 0.08,
                      "sprites": [
                        {
                          "hasCustomCollisionMask": false,
                          "image": "assets\\assets\\Flat dark joystick border.png",
                          "points": [],
                          "originPoint": {
                            "name": "origine",
                            "x": 0,
                            "y": 0
                          },
                          "centerPoint": {
                            "automatic": true,
                            "name": "centre",
                            "x": 0,
                            "y": 0
                          },
                          "customCollisionMask": []
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          }
        },
        {
          "adaptCollisionMaskAutomatically": false,
          "assetStoreId": "9c727020616afdd6ba786b8af206a90481f07db0ca175ed6a4cc5b7e01c66d06",
          "name": "JumpButton",
          "type": "Sprite",
          "updateIfNotVisible": false,
          "variables": [],
          "effects": [],
          "behaviors": [
            {
              "name": "MultitouchButton",
              "type": "SpriteMultitouchJoystick::MultitouchButton",
              "ControllerIdentifier": 1,
              "ButtonIdentifier": "A",
              "TouchId": 0,
              "TouchIndex": 2.0247e-320,
              "IsReleased": false
            }
          ],
          "animations": [
            {
              "name": "",
              "useMultipleDirections": false,
              "directions": [
                {
                  "looping": true,
                  "timeBetweenFrames": 0.025,
                  "sprites": [
                    {
                      "hasCustomCollisionMask": true,
                      "image": "assets\\assets\\Top arrow button.png",
                      "points": [],
                      "originPoint": {
                        "name": "origine",
                        "x": 40,
                        "y": 40
                      },
                      "centerPoint": {
                        "automatic": true,
                        "name": "centre",
                        "x": 0,
                        "y": 0
                      },
                      "customCollisionMask": [
                        [
                          {
                            "x": 0,
                            "y": 40
                          },
                          {
                            "x": 10,
                            "y": 10
                          },
                          {
                            "x": 40,
                            "y": 0
                          },
                          {
                            "x": 70,
                            "y": 10
                          },
                          {
                            "x": 80,
                            "y": 40
                          },
                          {
                            "x": 70,
                            "y": 70
                          },
                          {
                            "x": 40,
                            "y": 80
                          },
                          {
                            "x": 10,
                            "y": 70
                          }
                        ]
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "assetStoreId": "",
          "name": "Player",
          "type": "Scene3D::Cube3DObject",
          "variables": [],
          "effects": [],
          "behaviors": [
            {
              "isFolded": true,
              "name": "FirstPersonMultitouchMapper",
              "type": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper",
              "Object3D": "Object3D",
              "ControllerIdentifier": 2,
              "CameraStick": "Secondary",
              "HorizontalRotationSpeedMax": 110,
              "HorizontalRotationAcceleration": 120,
              "HorizontalRotationDeceleration": 600,
              "VerticalRotationSpeedMax": 80,
              "VerticalRotationAcceleration": 120,
              "VerticalRotationDeceleration": 480,
              "VerticalAngleMin": -90,
              "VerticalAngleMax": 90,
              "OffsetZ": 0,
              "CurrentRotationSpeedZ": 0,
              "CurrentRotationSpeedY": 0
            },
            {
              "isFolded": true,
              "name": "FirstPersonPointerMapper",
              "type": "MousePointerLock::FirstPersonPointerMapper",
              "Object3D": "Object3D",
              "HorizontalSpeed": 100,
              "VerticalSpeed": 80,
              "VerticalAngleMin": -90,
              "VerticalAngleMax": 90,
              "OffsetZ": 0,
              "ShouldLock": false
            },
            {
              "isFolded": true,
              "name": "Physics3D",
              "type": "Physics3D::Physics3DBehavior",
              "object3D": "Object3D",
              "bodyType": "Dynamic",
              "bullet": false,
              "fixedRotation": false,
              "shape": "Capsule",
              "shapeOrientation": "Z",
              "shapeDimensionA": 0,
              "shapeDimensionB": 0,
              "shapeDimensionC": 0,
              "density": 1,
              "friction": 0.3,
              "restitution": 0.1,
              "linearDamping": 0.1,
              "angularDamping": 0.1,
              "gravityScale": 1,
              "layers": 17,
              "masks": 17,
              "shapeOffsetX": 0,
              "shapeOffsetY": 0,
              "shapeOffsetZ": 0,
              "massCenterOffsetX": 0,
              "massCenterOffsetY": 0,
              "massCenterOffsetZ": 0,
              "massOverride": 0
            },
            {
              "isFolded": true,
              "name": "PhysicsCharacter3D",
              "type": "Physics3D::PhysicsCharacter3D",
              "physics3D": "Physics3D",
              "jumpHeight": 100,
              "jumpSustainTime": 0.3,
              "gravity": 800,
              "fallingSpeedMax": 450,
              "forwardAcceleration": 650,
              "forwardDeceleration": 1600,
              "forwardSpeedMax": 300,
              "sidewaysAcceleration": 650,
              "sidewaysDeceleration": 1600,
              "sidewaysSpeedMax": 400,
              "slopeMaxAngle": 50,
              "stairHeightMax": 20,
              "shouldBindObjectAndForwardAngle": true,
              "canBePushed": true
            },
            {
              "isFolded": true,
              "name": "Shooter3DKeyboardMapper",
              "type": "PhysicsCharacter3DKeyMapper::Shooter3DKeyboardMapper",
              "PhysicsCharacter3D": "PhysicsCharacter3D",
              "Jump": "Space",
              "Up": "w",
              "Left": "a",
              "Down": "s",
              "Right": "d"
            },
            {
              "isFolded": true,
              "name": "Shooter3DMultitouchMapper",
              "type": "SpriteMultitouchJoystick::Shooter3DMultitouchMapper",
              "PhysicsCharacter3D": "PhysicsCharacter3D",
              "ControllerIdentifier": 1,
              "JoystickIdentifier": "Primary",
              "JumpButton": "A"
            }
          ],
          "content": {
            "width": 100,
            "height": 100,
            "depth": 100,
            "enableTextureTransparency": false,
            "facesOrientation": "Z",
            "frontFaceResourceName": "",
            "backFaceResourceName": "",
            "backFaceUpThroughWhichAxisRotation": "X",
            "leftFaceResourceName": "",
            "rightFaceResourceName": "",
            "topFaceResourceName": "",
            "bottomFaceResourceName": "",
            "frontFaceVisible": true,
            "backFaceVisible": false,
            "leftFaceVisible": true,
            "rightFaceVisible": true,
            "topFaceVisible": true,
            "bottomFaceVisible": true,
            "frontFaceResourceRepeat": false,
            "backFaceResourceRepeat": false,
            "leftFaceResourceRepeat": false,
            "rightFaceResourceRepeat": false,
            "topFaceResourceRepeat": false,
            "bottomFaceResourceRepeat": false,
            "materialType": "StandardWithoutMetalness",
            "isReceivingShadow": true,
            "isCastingShadow": true
          }
        },
        {
          "assetStoreId": "",
          "name": "ControlsToggle",
          "persistentUuid": "5282eb07-6cf6-48a4-848e-20e8c3290aa2",
          "type": "SpriteToggleSwitch::SpriteToggleSwitch",
          "variant": "Controls toggle",
          "variables": [],
          "effects": [],
          "behaviors": [],
          "content": {
            "IsChecked": false
          }
        },
        {
          "assetStoreId": "",
          "name": "New3DBox",
          "type": "Scene3D::Cube3DObject",
          "variables": [],
          "effects": [],
          "behaviors": [],
          "content": {
            "width": 100,
            "height": 100,
            "depth": 100,
            "enableTextureTransparency": false,
            "facesOrientation": "Y",
            "frontFaceResourceName": "",
            "backFaceResourceName": "",
            "backFaceUpThroughWhichAxisRotation": "X",
            "leftFaceResourceName": "",
            "rightFaceResourceName": "",
            "topFaceResourceName": "",
            "bottomFaceResourceName": "",
            "frontFaceVisible": true,
            "backFaceVisible": true,
            "leftFaceVisible": true,
            "rightFaceVisible": true,
            "topFaceVisible": true,
            "bottomFaceVisible": true,
            "frontFaceResourceRepeat": false,
            "backFaceResourceRepeat": false,
            "leftFaceResourceRepeat": false,
            "rightFaceResourceRepeat": false,
            "topFaceResourceRepeat": false,
            "bottomFaceResourceRepeat": false,
            "materialType": "StandardWithoutMetalness",
            "tint": "255;255;255",
            "isCastingShadow": true,
            "isReceivingShadow": true
          }
        },
        {
          "assetStoreId": "",
          "name": "New3DModel",
          "persistentUuid": "a843e8f3-cd6f-4424-a2d8-9d1bc85a091d",
          "type": "Scene3D::Model3DObject",
          "variables": [],
          "effects": [],
          "behaviors": [
            {
              "name": "Physics3D",
              "type": "Physics3D::Physics3DBehavior",
              "object3D": "Object3D",
              "bodyType": "Dynamic",
              "bullet": false,
              "fixedRotation": false,
              "shape": "Box",
              "meshShapeResourceName": "",
              "shapeOrientation": "Z",
              "shapeDimensionA": 0,
              "shapeDimensionB": 0,
              "shapeDimensionC": 0,
              "shapeOffsetX": 0,
              "shapeOffsetY": 0,
              "shapeOffsetZ": 0,
              "massCenterOffsetX": 0,
              "massCenterOffsetY": 0,
              "massCenterOffsetZ": 0,
              "massOverride": 0,
              "density": 1,
              "friction": 0.3,
              "restitution": 0.1,
              "linearDamping": 0.1,
              "angularDamping": 0.1,
              "gravityScale": 1,
              "layers": 17,
              "masks": 17
            }
          ],
          "content": {
            "centerLocation": "ModelOrigin",
            "crossfadeDuration": 0.10000000149011612,
            "depth": 30,
            "height": 10,
            "isCastingShadow": true,
            "isReceivingShadow": true,
            "keepAspectRatio": true,
            "materialType": "StandardWithoutMetalness",
            "modelResourceName": "compass.glb",
            "originLocation": "ModelOrigin",
            "rotationX": 90,
            "rotationY": 0,
            "rotationZ": 90,
            "width": 29,
            "animations": []
          }
        },
        {
          "assetStoreId": "",
          "name": "New3DModel2",
          "persistentUuid": "93711aba-1925-40fe-b28c-c736f5582cfc",
          "type": "Scene3D::Model3DObject",
          "variables": [],
          "effects": [],
          "behaviors": [],
          "content": {
            "centerLocation": "ModelOrigin",
            "crossfadeDuration": 0.10000000149011612,
            "depth": 100,
            "height": 100,
            "isCastingShadow": true,
            "isReceivingShadow": true,
            "keepAspectRatio": true,
            "materialType": "StandardWithoutMetalness",
            "modelResourceName": "",
            "originLocation": "ModelOrigin",
            "rotationX": 90,
            "rotationY": 0,
            "rotationZ": 90,
            "width": 100,
            "animations": []
          }
        },
        {
          "assetStoreId": "",
          "bottomMargin": 0,
          "height": 32,
          "leftMargin": 0,
          "name": "NewPanelSprite",
          "rightMargin": 0,
          "texture": "",
          "tiled": false,
          "topMargin": 0,
          "type": "PanelSpriteObject::PanelSprite",
          "width": 32,
          "variables": [],
          "effects": [],
          "behaviors": []
        },
        {
          "assetStoreId": "",
          "name": "New3DBox2",
          "type": "Scene3D::Cube3DObject",
          "variables": [],
          "effects": [],
          "behaviors": [],
          "content": {
            "width": 100,
            "height": 100,
            "depth": 100,
            "enableTextureTransparency": false,
            "facesOrientation": "Y",
            "frontFaceResourceName": "",
            "backFaceResourceName": "",
            "backFaceUpThroughWhichAxisRotation": "X",
            "leftFaceResourceName": "",
            "rightFaceResourceName": "",
            "topFaceResourceName": "",
            "bottomFaceResourceName": "",
            "frontFaceVisible": true,
            "backFaceVisible": true,
            "leftFaceVisible": true,
            "rightFaceVisible": true,
            "topFaceVisible": true,
            "bottomFaceVisible": true,
            "frontFaceResourceRepeat": false,
            "backFaceResourceRepeat": false,
            "leftFaceResourceRepeat": false,
            "rightFaceResourceRepeat": false,
            "topFaceResourceRepeat": false,
            "bottomFaceResourceRepeat": false,
            "materialType": "StandardWithoutMetalness",
            "tint": "255;255;255",
            "isCastingShadow": true,
            "isReceivingShadow": true
          }
        },
        {
          "assetStoreId": "",
          "name": "New3DModel3",
          "type": "Scene3D::Model3DObject",
          "variables": [],
          "effects": [],
          "behaviors": [
            {
              "name": "Physics3D",
              "type": "Physics3D::Physics3DBehavior",
              "object3D": "Object3D",
              "bodyType": "Dynamic",
              "bullet": false,
              "fixedRotation": false,
              "shape": "Box",
              "meshShapeResourceName": "",
              "shapeOrientation": "Z",
              "shapeDimensionA": 0,
              "shapeDimensionB": 0,
              "shapeDimensionC": 0,
              "shapeOffsetX": 0,
              "shapeOffsetY": 0,
              "shapeOffsetZ": 0,
              "massCenterOffsetX": 0,
              "massCenterOffsetY": 0,
              "massCenterOffsetZ": 0,
              "massOverride": 0,
              "density": 1,
              "friction": 0.3,
              "restitution": 0.1,
              "linearDamping": 0.1,
              "angularDamping": 0.1,
              "gravityScale": 1,
              "layers": 17,
              "masks": 17
            },
            {
              "canBeGrabbed": true,
              "name": "Platform",
              "platformType": "NormalPlatform",
              "type": "PlatformBehavior::PlatformBehavior",
              "yGrabOffset": 0
            }
          ],
          "content": {
            "centerLocation": "CenteredOnZ",
            "crossfadeDuration": 0.10000000149011612,
            "depth": 100,
            "height": 100,
            "isCastingShadow": true,
            "isReceivingShadow": true,
            "keepAspectRatio": true,
            "materialType": "StandardWithoutMetalness",
            "modelResourceName": "",
            "originLocation": "ModelOrigin",
            "rotationX": 90,
            "rotationY": 0,
            "rotationZ": 90,
            "width": 100,
            "animations": []
          }
        }
      ],
      "objectsFolderStructure": {
        "folderName": "__ROOT",
        "children": [
          {
            "objectName": "Player"
          },
          {
            "objectName": "PushableBox"
          },
          {
            "objectName": "NewPanelSprite"
          },
          {
            "objectName": "Obstacle"
          },
          {
            "objectName": "Ground"
          },
          {
            "folderName": "Mobile Controls",
            "children": [
              {
                "objectName": "MovementJoystick"
              },
              {
                "objectName": "JumpButton"
              }
            ]
          },
          {
            "objectName": "New3DModel"
          },
          {
            "objectName": "ControlsToggle"
          },
          {
            "objectName": "Skybox"
          },
          {
            "objectName": "New3DBox"
          },
          {
            "objectName": "New3DModel2"
          },
          {
            "objectName": "New3DBox2"
          },
          {
            "objectName": "New3DModel3"
          }
        ]
      },
      "events": [
        {
          "type": "BuiltinCommonInstructions::Standard",
          "conditions": [
            {
              "type": {
                "value": "DepartScene"
              },
              "parameters": [
                ""
              ]
            }
          ],
          "actions": [
            {
              "type": {
                "value": "Cache"
              },
              "parameters": [
                "Player"
              ]
            }
          ],
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [],
              "actions": [
                {
                  "type": {
                    "value": "Cache"
                  },
                  "parameters": [
                    "MovementJoystick"
                  ]
                },
                {
                  "type": {
                    "value": "Cache"
                  },
                  "parameters": [
                    "JumpButton"
                  ]
                },
                {
                  "type": {
                    "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::ActivateControl"
                  },
                  "parameters": [
                    "MovementJoystick",
                    "",
                    ""
                  ]
                }
              ]
            }
          ]
        },
        {
          "type": "BuiltinCommonInstructions::Standard",
          "conditions": [],
          "actions": [
            {
              "type": {
                "value": "FirstPersonCamera::LookFromObjectEyes"
              },
              "parameters": [
                "",
                "Player",
                "",
                ""
              ]
            },
            {
              "type": {
                "value": "Scene3D::SetCameraZ"
              },
              "parameters": [
                "",
                "+",
                "64",
                "",
                ""
              ]
            }
          ]
        },
        {
          "colorB": 228,
          "colorG": 176,
          "colorR": 74,
          "creationTime": 0,
          "folded": true,
          "name": "Controls toggle",
          "source": "",
          "type": "BuiltinCommonInstructions::Group",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "SpriteToggleSwitch::SpriteToggleSwitch::HasJustBeenToggled"
                  },
                  "parameters": [
                    "ControlsToggle",
                    ""
                  ]
                }
              ],
              "actions": [],
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Comment",
                  "color": {
                    "b": 109,
                    "g": 230,
                    "r": 255,
                    "textB": 0,
                    "textG": 0,
                    "textR": 0
                  },
                  "comment": "Set to Touch"
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::SpriteToggleSwitch::IsChecked"
                      },
                      "parameters": [
                        "ControlsToggle",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetStringVariable"
                      },
                      "parameters": [
                        "ControlKind",
                        "=",
                        "\"Touch\""
                      ]
                    },
                    {
                      "type": {
                        "value": "Montre"
                      },
                      "parameters": [
                        "JumpButton",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "ActivateBehavior"
                      },
                      "parameters": [
                        "JumpButton",
                        "MultitouchButton",
                        "yes"
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Comment",
                  "color": {
                    "b": 109,
                    "g": 230,
                    "r": 255,
                    "textB": 0,
                    "textG": 0,
                    "textR": 0
                  },
                  "comment": "Set to Keyboard"
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "inverted": true,
                        "value": "SpriteToggleSwitch::SpriteToggleSwitch::IsChecked"
                      },
                      "parameters": [
                        "ControlsToggle",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetStringVariable"
                      },
                      "parameters": [
                        "ControlKind",
                        "=",
                        "\"Keyboard\""
                      ]
                    },
                    {
                      "type": {
                        "value": "Cache"
                      },
                      "parameters": [
                        "JumpButton"
                      ]
                    },
                    {
                      "type": {
                        "value": "ActivateBehavior"
                      },
                      "parameters": [
                        "JumpButton",
                        "MultitouchButton",
                        ""
                      ]
                    }
                  ]
                }
              ]
            }
          ],
          "parameters": []
        },
        {
          "colorB": 228,
          "colorG": 176,
          "colorR": 74,
          "creationTime": 0,
          "folded": true,
          "name": "Mobile controls",
          "source": "",
          "type": "BuiltinCommonInstructions::Group",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "StringVariable"
                  },
                  "parameters": [
                    "ControlKind",
                    "=",
                    "\"Touch\""
                  ]
                },
                {
                  "type": {
                    "inverted": true,
                    "value": "SourisSurObjet"
                  },
                  "parameters": [
                    "ControlsToggle",
                    "",
                    "",
                    ""
                  ]
                }
              ],
              "actions": [],
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::HasTouchStartedOnScreenSide"
                      },
                      "parameters": [
                        "",
                        "MovementJoystick",
                        "\"Left\"",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::TeleportAndPress"
                      },
                      "parameters": [
                        "MovementJoystick",
                        "CursorX(\"UI\")",
                        "CursorY(\"UI\")",
                        ""
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "MouseButtonFromTextPressed"
                      },
                      "parameters": [
                        "",
                        "\"Left\""
                      ]
                    },
                    {
                      "type": {
                        "value": "BuiltinCommonInstructions::Once"
                      },
                      "parameters": []
                    }
                  ],
                  "actions": [],
                  "events": [
                    {
                      "type": "BuiltinCommonInstructions::Standard",
                      "conditions": [
                        {
                          "type": {
                            "inverted": true,
                            "value": "SpriteMultitouchJoystick::HasTouchStartedOnScreenSide"
                          },
                          "parameters": [
                            "",
                            "MovementJoystick",
                            "\"Left\"",
                            ""
                          ]
                        },
                        {
                          "type": {
                            "inverted": true,
                            "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed"
                          },
                          "parameters": [
                            "JumpButton",
                            "MultitouchButton",
                            ""
                          ]
                        }
                      ],
                      "actions": [
                        {
                          "type": {
                            "value": "MousePointerLock::RequestPointerLock"
                          },
                          "parameters": [
                            "",
                            ""
                          ]
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ],
          "parameters": []
        },
        {
          "colorB": 228,
          "colorG": 176,
          "colorR": 74,
          "creationTime": 0,
          "folded": true,
          "name": "Keyboard controls",
          "source": "",
          "type": "BuiltinCommonInstructions::Group",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "StringVariable"
                  },
                  "parameters": [
                    "ControlKind",
                    "=",
                    "\"Keyboard\""
                  ]
                },
                {
                  "type": {
                    "value": "MouseButtonFromTextPressed"
                  },
                  "parameters": [
                    "",
                    "\"Left\""
                  ]
                },
                {
                  "type": {
                    "inverted": true,
                    "value": "SourisSurObjet"
                  },
                  "parameters": [
                    "ControlsToggle",
                    "",
                    "",
                    ""
                  ]
                },
                {
                  "type": {
                    "inverted": true,
                    "value": "MousePointerLock::isPointerLocked"
                  },
                  "parameters": [
                    "",
                    ""
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "MousePointerLock::RequestPointerLock"
                  },
                  "parameters": [
                    "",
                    ""
                  ]
                }
              ]
            }
          ],
          "parameters": []
        },
        {
          "type": "BuiltinCommonInstructions::Standard",
          "conditions": [
            {
              "type": {
                "value": "Physics3D::Collision"
              },
              "parameters": [
                "Player",
                "Physics3D",
                "New3DModel",
                "Physics3D",
                ""
              ]
            }
          ],
          "actions": [
            {
              "type": {
                "value": "Hide"
              },
              "parameters": [
                "New3DModel"
              ]
            },
            {
              "type": {
                "value": "ActivateBehavior"
              },
              "parameters": [
                "New3DModel3",
                "Physics3D",
                ""
              ]
            }
          ]
        },
        {
          "type": "BuiltinCommonInstructions::Standard",
          "conditions": [
            {
              "type": {
                "value": "CollisionNP"
              },
              "parameters": [
                "Player",
                "New3DModel3",
                "",
                "",
                ""
              ]
            }
          ],
          "actions": [
            {
              "type": {
                "value": "ActivateBehavior"
              },
              "parameters": [
                "New3DModel3",
                "Physics3D",
                "yes"
              ]
            }
          ]
        }
      ],
      "layers": [
        {
          "ambientLightColorB": 200,
          "ambientLightColorG": 200,
          "ambientLightColorR": 200,
          "camera2DPlaneMaxDrawingDistance": 5000,
          "camera3DFarPlaneDistance": 10000,
          "camera3DFieldOfView": 45,
          "camera3DNearPlaneDistance": 3,
          "cameraType": "",
          "followBaseLayerCamera": false,
          "isLightingLayer": false,
          "isLocked": false,
          "name": "Background",
          "renderingType": "",
          "visibility": true,
          "cameras": [],
          "effects": []
        },
        {
          "ambientLightColorB": 200,
          "ambientLightColorG": 200,
          "ambientLightColorR": 200,
          "camera2DPlaneMaxDrawingDistance": 5000,
          "camera3DFarPlaneDistance": 10000,
          "camera3DFieldOfView": 45,
          "camera3DNearPlaneDistance": 3,
          "cameraType": "",
          "followBaseLayerCamera": false,
          "isLightingLayer": false,
          "isLocked": false,
          "name": "",
          "renderingType": "",
          "visibility": true,
          "cameras": [
            {
              "defaultSize": true,
              "defaultViewport": true,
              "height": 0,
              "viewportBottom": 1,
              "viewportLeft": 0,
              "viewportRight": 1,
              "viewportTop": 0,
              "width": 0
            }
          ],
          "effects": [
            {
              "effectType": "Scene3D::AmbientLight",
              "name": "3D Light",
              "doubleParameters": {
                "intensity": 0.25
              },
              "stringParameters": {
                "color": "255;255;255"
              },
              "booleanParameters": {}
            },
            {
              "effectType": "Scene3D::DirectionalLight",
              "name": "Effect",
              "doubleParameters": {
                "distanceFromCamera": 1500,
                "elevation": 45,
                "frustumSize": 4000,
                "intensity": 0.75,
                "rotation": 30
              },
              "stringParameters": {
                "color": "255;255;255",
                "shadowQuality": "medium",
                "top": "Z+"
              },
              "booleanParameters": {
                "isCastingShadow": true
              }
            }
          ]
        },
        {
          "ambientLightColorB": 200,
          "ambientLightColorG": 200,
          "ambientLightColorR": 200,
          "camera2DPlaneMaxDrawingDistance": 5000,
          "camera3DFarPlaneDistance": 10000,
          "camera3DFieldOfView": 45,
          "camera3DNearPlaneDistance": 3,
          "cameraType": "",
          "followBaseLayerCamera": false,
          "isLightingLayer": false,
          "isLocked": false,
          "name": "MobileControls",
          "renderingType": "",
          "visibility": true,
          "cameras": [],
          "effects": []
        }
      ],
      "behaviorsSharedData": [
        {
          "name": "Animation",
          "type": "AnimatableCapability::AnimatableBehavior"
        },
        {
          "name": "Effect",
          "type": "EffectCapability::EffectBehavior"
        },
        {
          "name": "FirstPersonMultitouchMapper",
          "type": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper"
        },
        {
          "name": "FirstPersonPointerMapper",
          "type": "MousePointerLock::FirstPersonPointerMapper"
        },
        {
          "name": "Flippable",
          "type": "FlippableCapability::FlippableBehavior"
        },
        {
          "name": "MultitouchButton",
          "type": "SpriteMultitouchJoystick::MultitouchButton"
        },
        {
          "name": "Object3D",
          "type": "Scene3D::Base3DBehavior"
        },
        {
          "name": "Opacity",
          "type": "OpacityCapability::OpacityBehavior"
        },
        {
          "name": "Physics3D",
          "type": "Physics3D::Physics3DBehavior",
          "gravityX": 0,
          "gravityY": 0,
          "gravityZ": -9.8,
          "worldScale": 100
        },
        {
          "name": "PhysicsCharacter3D",
          "type": "Physics3D::PhysicsCharacter3D"
        },
        {
          "name": "Platform",
          "type": "PlatformBehavior::PlatformBehavior"
        },
        {
          "name": "Resizable",
          "type": "ResizableCapability::ResizableBehavior"
        },
        {
          "name": "Scale",
          "type": "ScalableCapability::ScalableBehavior"
        },
        {
          "name": "Shooter3DKeyboardMapper",
          "type": "PhysicsCharacter3DKeyMapper::Shooter3DKeyboardMapper"
        },
        {
          "name": "Shooter3DMultitouchMapper",
          "type": "SpriteMultitouchJoystick::Shooter3DMultitouchMapper"
        }
      ]
    }
  ],
  "externalEvents": [],
  "eventsFunctionsExtensions": [
    {
      "author": "",
      "category": "Input",
      "dimension": "",
      "extensionNamespace": "",
      "fullName": "3D character keyboard mapper",
      "gdevelopVersion": ">=5.5.222",
      "helpPath": "",
      "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPHBhdGggZD0iTTI5LDE0aC00LjJjMC4xLTAuMywwLjItMC42LDAuMi0xYzAtMS43LTEuMy0zLTMtM0g4Yy0wLjYsMC0xLTAuNC0xLTFzMC40LTEsMS0xaDZjMS43LDAsMy0xLjMsMy0zVjJjMC0wLjYtMC40LTEtMS0xDQoJcy0xLDAuNC0xLDF2M2MwLDAuNi0wLjQsMS0xLDFIOEM2LjMsNiw1LDcuMyw1LDlzMS4zLDMsMywzaDE0YzAuNiwwLDEsMC40LDEsMXMtMC40LDEtMSwxSDNjLTAuNiwwLTEsMC40LTEsMXYxNGMwLDAuNiwwLjQsMSwxLDENCgloMjZjMC42LDAsMS0wLjQsMS0xVjE1QzMwLDE0LjQsMjkuNiwxNCwyOSwxNHogTTcsMThoMmMwLjYsMCwxLDAuNCwxLDFjMC0wLjYsMC40LTEsMS0xaDJjMC42LDAsMSwwLjQsMSwxYzAtMC42LDAuNC0xLDEtMWgyDQoJYzAuNiwwLDEsMC40LDEsMWMwLTAuNiwwLjQtMSwxLTFoMmMwLjYsMCwxLDAuNCwxLDFjMC0wLjYsMC40LTEsMS0xaDJjMC42LDAsMSwwLjQsMSwxcy0wLjQsMS0xLDFoLTJjLTAuNiwwLTEtMC40LTEtMQ0KCWMwLDAuNi0wLjQsMS0xLDFoLTJjLTAuNiwwLTEtMC40LTEtMWMwLDAuNi0wLjQsMS0xLDFoLTJjLTAuNiwwLTEtMC40LTEtMWMwLDAuNi0wLjQsMS0xLDFoLTJjLTAuNiwwLTEtMC40LTEtMWMwLDAuNi0wLjQsMS0xLDFINw0KCWMtMC42LDAtMS0wLjQtMS0xUzYuNCwxOCw3LDE4eiBNMTksMjJjMCwwLjEsMCwwLjMtMC4xLDAuNHMtMC4xLDAuMi0wLjIsMC4zYzAsMC0wLjEsMC4xLTAuMiwwLjFjMCwwLTAuMSwwLjEtMC4yLDAuMQ0KCWMtMC4xLDAtMC4xLDAtMC4yLDAuMWMtMC4xLDAtMC4xLDAtMC4yLDBjLTAuMSwwLTAuMSwwLTAuMiwwYy0wLjEsMC0wLjEsMC0wLjItMC4xYy0wLjEsMC0wLjEtMC4xLTAuMi0wLjFjMCwwLTAuMS0wLjEtMC4xLTAuMQ0KCWMtMC4xLTAuMS0wLjItMC4yLTAuMi0wLjNDMTcsMjIuMywxNywyMi4xLDE3LDIyYzAtMC4xLDAtMC4zLDAuMS0wLjRjMC0wLjEsMC4xLTAuMiwwLjItMC4zYzAsMCwwLjEtMC4xLDAuMS0wLjENCgljMC4xLDAsMC4xLTAuMSwwLjItMC4xYzAuMSwwLDAuMSwwLDAuMi0wLjFjMC4xLDAsMC4zLDAsMC40LDBjMC4xLDAsMC4xLDAsMC4yLDAuMWMwLjEsMCwwLjEsMC4xLDAuMiwwLjFjMC4xLDAsMC4xLDAuMSwwLjIsMC4xDQoJYzAuMSwwLjEsMC4yLDAuMiwwLjIsMC4zQzE5LDIxLjcsMTksMjEuOSwxOSwyMnogTTE1LDIyYzAsMC4xLDAsMC4zLTAuMSwwLjRzLTAuMSwwLjItMC4yLDAuM2MwLDAtMC4xLDAuMS0wLjIsMC4xDQoJYzAsMC0wLjEsMC4xLTAuMiwwLjFjLTAuMSwwLTAuMSwwLTAuMiwwLjFjLTAuMSwwLTAuMSwwLTAuMiwwYy0wLjMsMC0wLjUtMC4xLTAuNy0wLjNjLTAuMS0wLjEtMC4yLTAuMi0wLjItMC4zDQoJQzEzLDIyLjMsMTMsMjIuMSwxMywyMmMwLTAuMSwwLTAuMSwwLTAuMmMwLTAuMSwwLTAuMSwwLjEtMC4yYzAtMC4xLDAtMC4xLDAuMS0wLjJjMC0wLjEsMC4xLTAuMSwwLjEtMC4xYzAuMi0wLjIsMC42LTAuMywwLjktMC4zDQoJYzAuMSwwLDAuMSwwLDAuMiwwLjFjMC4xLDAsMC4xLDAuMSwwLjIsMC4xYzAuMSwwLDAuMSwwLjEsMC4yLDAuMWMwLDAsMC4xLDAuMSwwLjEsMC4xYzAsMC4xLDAuMSwwLjEsMC4xLDAuMmMwLDAuMSwwLDAuMSwwLjEsMC4yDQoJQzE1LDIxLjksMTUsMjEuOSwxNSwyMnogTTUsMjJjMC0wLjEsMC0wLjMsMC4xLTAuNGMwLTAuMSwwLjEtMC4yLDAuMi0wLjNjMC4yLTAuMiwwLjYtMC4zLDAuOS0wLjNjMC4xLDAsMC4xLDAsMC4yLDAuMQ0KCWMwLjEsMCwwLjEsMC4xLDAuMiwwLjFjMCwwLDAuMSwwLjEsMC4yLDAuMWMwLjEsMC4xLDAuMiwwLjIsMC4yLDAuM0M3LDIxLjcsNywyMS45LDcsMjJjMCwwLjMtMC4xLDAuNS0wLjMsMC43YzAsMC0wLjEsMC4xLTAuMiwwLjENCgljLTAuMSwwLTAuMSwwLjEtMC4yLDAuMWMtMC4xLDAtMC4xLDAtMC4yLDAuMWMtMC4xLDAtMC4xLDAtMC4yLDBjLTAuMywwLTAuNS0wLjEtMC43LTAuM0M1LjEsMjIuNSw1LDIyLjMsNSwyMnogTTgsMjZINw0KCWMtMC42LDAtMS0wLjQtMS0xczAuNC0xLDEtMWgxYzAuNiwwLDEsMC40LDEsMVM4LjYsMjYsOCwyNnogTTEwLjksMjIuNGMwLDAuMSwwLDAuMS0wLjEsMC4yYzAsMC0wLjEsMC4xLTAuMSwwLjENCglDMTAuNSwyMi45LDEwLjMsMjMsMTAsMjNjLTAuMSwwLTAuMywwLTAuNC0wLjFjLTAuMS0wLjEtMC4yLTAuMS0wLjMtMC4yYzAtMC4xLTAuMS0wLjEtMC4xLTAuMWMwLTAuMS0wLjEtMC4xLTAuMS0wLjINCgljMC0wLjEsMC0wLjEtMC4xLTAuMmMwLTAuMSwwLTAuMSwwLTAuMmMwLTAuMywwLjEtMC41LDAuMy0wLjdjMC4xLTAuMSwwLjItMC4yLDAuMy0wLjJjMC40LTAuMiwwLjgtMC4xLDEuMSwwLjINCgljMC4yLDAuMiwwLjMsMC40LDAuMywwLjdjMCwwLjEsMCwwLjEsMCwwLjJDMTEsMjIuMywxMSwyMi4zLDEwLjksMjIuNHogTTIwLDI2aC04Yy0wLjYsMC0xLTAuNC0xLTFzMC40LTEsMS0xaDhjMC42LDAsMSwwLjQsMSwxDQoJUzIwLjYsMjYsMjAsMjZ6IE0yMi45LDIyLjRjMCwwLjEsMCwwLjEtMC4xLDAuMmMwLDAtMC4xLDAuMS0wLjEsMC4xYzAsMC0wLjEsMC4xLTAuMiwwLjFjMCwwLTAuMSwwLjEtMC4yLDAuMWMtMC4xLDAtMC4xLDAtMC4yLDAuMQ0KCWMtMC4xLDAtMC4xLDAtMC4yLDBjLTAuMSwwLTAuMSwwLTAuMiwwYy0wLjEsMC0wLjEsMC0wLjItMC4xYy0wLjEsMC0wLjEtMC4xLTAuMi0wLjFjMCwwLTAuMS0wLjEtMC4xLTAuMWMwLTAuMS0wLjEtMC4xLTAuMS0wLjENCgljMC0wLjEtMC4xLTAuMS0wLjEtMC4yYzAtMC4xLDAtMC4xLTAuMS0wLjJjMC0wLjEsMC0wLjEsMC0wLjJjMC0wLjMsMC4xLTAuNSwwLjMtMC43YzAsMCwwLjEtMC4xLDAuMS0wLjFjMC4xLDAsMC4xLTAuMSwwLjItMC4xDQoJYzAuMSwwLDAuMSwwLDAuMi0wLjFjMC4xLDAsMC4zLDAsMC40LDBjMC4xLDAsMC4xLDAsMC4yLDAuMWMwLjEsMCwwLjEsMC4xLDAuMiwwLjFjMC4xLDAsMC4xLDAuMSwwLjIsMC4xYzAuMiwwLjIsMC4zLDAuNCwwLjMsMC43DQoJYzAsMC4xLDAsMC4xLDAsMC4yQzIzLDIyLjMsMjMsMjIuMywyMi45LDIyLjR6IE0yNSwyNmgtMWMtMC42LDAtMS0wLjQtMS0xczAuNC0xLDEtMWgxYzAuNiwwLDEsMC40LDEsMVMyNS42LDI2LDI1LDI2eiBNMjYuNywyMi43DQoJQzI2LjUsMjIuOSwyNi4zLDIzLDI2LDIzYy0wLjEsMC0wLjEsMC0wLjIsMGMtMC4xLDAtMC4xLDAtMC4yLTAuMWMtMC4xLDAtMC4xLTAuMS0wLjItMC4xYy0wLjEsMC0wLjEtMC4xLTAuMi0wLjENCglDMjUuMSwyMi41LDI1LDIyLjMsMjUsMjJjMC0wLjEsMC0wLjMsMC4xLTAuNGMwLTAuMSwwLjEtMC4yLDAuMi0wLjNjMCwwLDAuMS0wLjEsMC4yLTAuMWMwLDAsMC4xLTAuMSwwLjItMC4xYzAuMSwwLDAuMSwwLDAuMi0wLjENCgljMC4zLTAuMSwwLjcsMCwwLjksMC4zYzAuMiwwLjIsMC4zLDAuNCwwLjMsMC43QzI3LDIyLjMsMjYuOSwyMi41LDI2LjcsMjIuN3oiLz4NCjwvc3ZnPg0K",
      "name": "PhysicsCharacter3DKeyMapper",
      "previewIconUrl": "https://asset-resources.gdevelop.io/public-resources/Icons/Glyphster Pack/Master/SVG/Computers and Hardware/3e5871434a72821bf3ecb44a6857e62a438cf23dc8f95966f56ae97e95315468_Computers and Hardware_keyboard.svg",
      "shortDescription": "3D platformer and 3D shooter keyboard controls.",
      "version": "1.1.1",
      "description": "3D platformer and 3D shooter keyboard controls.",
      "origin": {
        "identifier": "PhysicsCharacter3DKeyMapper",
        "name": "gdevelop-extension-store"
      },
      "tags": [
        "3d"
      ],
      "authorIds": [
        "IWykYNRvhCZBN3vEgKEbBPOR3Oc2"
      ],
      "dependencies": [],
      "globalVariables": [],
      "sceneVariables": [],
      "eventsFunctions": [],
      "eventsFunctionsFolderStructure": {
        "folderName": "__ROOT"
      },
      "eventsBasedBehaviors": [
        {
          "description": "Control a 3D physics character with a keyboard for a platformer or a top-down game.",
          "fullName": "3D platformer keyboard mapper",
          "name": "Platformer3DKeyboardMapper",
          "objectType": "",
          "eventsFunctions": [
            {
              "fullName": "",
              "functionType": "Action",
              "name": "doStepPreEvents",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "inverted": true,
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "LockedCameraAngle",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "CameraAngle",
                        "=",
                        "CameraAngle(Object.Layer())"
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetBooleanVariable"
                      },
                      "parameters": [
                        "LockedCameraAngle",
                        "False",
                        ""
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "BuiltinCommonInstructions::Or"
                      },
                      "parameters": [],
                      "subInstructions": [
                        {
                          "type": {
                            "value": "KeyFromTextPressed"
                          },
                          "parameters": [
                            "",
                            "Up"
                          ]
                        },
                        {
                          "type": {
                            "value": "KeyFromTextPressed"
                          },
                          "parameters": [
                            "",
                            "Down"
                          ]
                        },
                        {
                          "type": {
                            "value": "KeyFromTextPressed"
                          },
                          "parameters": [
                            "",
                            "Left"
                          ]
                        },
                        {
                          "type": {
                            "value": "KeyFromTextPressed"
                          },
                          "parameters": [
                            "",
                            "Right"
                          ]
                        }
                      ]
                    }
                  ],
                  "actions": [],
                  "events": [
                    {
                      "type": "BuiltinCommonInstructions::Standard",
                      "conditions": [
                        {
                          "type": {
                            "value": "KeyFromTextPressed"
                          },
                          "parameters": [
                            "",
                            "Up"
                          ]
                        }
                      ],
                      "actions": [
                        {
                          "type": {
                            "value": "SetNumberVariable"
                          },
                          "parameters": [
                            "TargetAngle",
                            "=",
                            "-90"
                          ]
                        }
                      ]
                    },
                    {
                      "type": "BuiltinCommonInstructions::Standard",
                      "conditions": [
                        {
                          "type": {
                            "value": "KeyFromTextPressed"
                          },
                          "parameters": [
                            "",
                            "Down"
                          ]
                        }
                      ],
                      "actions": [
                        {
                          "type": {
                            "value": "SetNumberVariable"
                          },
                          "parameters": [
                            "TargetAngle",
                            "=",
                            "90"
                          ]
                        }
                      ]
                    },
                    {
                      "type": "BuiltinCommonInstructions::Standard",
                      "conditions": [
                        {
                          "type": {
                            "value": "KeyFromTextPressed"
                          },
                          "parameters": [
                            "",
                            "Left"
                          ]
                        }
                      ],
                      "actions": [
                        {
                          "type": {
                            "value": "SetNumberVariable"
                          },
                          "parameters": [
                            "TargetAngle",
                            "=",
                            "180"
                          ]
                        }
                      ]
                    },
                    {
                      "type": "BuiltinCommonInstructions::Standard",
                      "conditions": [
                        {
                          "type": {
                            "value": "KeyFromTextPressed"
                          },
                          "parameters": [
                            "",
                            "Right"
                          ]
                        }
                      ],
                      "actions": [
                        {
                          "type": {
                            "value": "SetNumberVariable"
                          },
                          "parameters": [
                            "TargetAngle",
                            "=",
                            "0"
                          ]
                        }
                      ]
                    },
                    {
                      "type": "BuiltinCommonInstructions::Standard",
                      "conditions": [
                        {
                          "type": {
                            "value": "KeyFromTextPressed"
                          },
                          "parameters": [
                            "",
                            "Up"
                          ]
                        },
                        {
                          "type": {
                            "value": "KeyFromTextPressed"
                          },
                          "parameters": [
                            "",
                            "Left"
                          ]
                        }
                      ],
                      "actions": [
                        {
                          "type": {
                            "value": "SetNumberVariable"
                          },
                          "parameters": [
                            "TargetAngle",
                            "=",
                            "-135"
                          ]
                        }
                      ]
                    },
                    {
                      "type": "BuiltinCommonInstructions::Standard",
                      "conditions": [
                        {
                          "type": {
                            "value": "KeyFromTextPressed"
                          },
                          "parameters": [
                            "",
                            "Up"
                          ]
                        },
                        {
                          "type": {
                            "value": "KeyFromTextPressed"
                          },
                          "parameters": [
                            "",
                            "Right"
                          ]
                        }
                      ],
                      "actions": [
                        {
                          "type": {
                            "value": "SetNumberVariable"
                          },
                          "parameters": [
                            "TargetAngle",
                            "=",
                            "-45"
                          ]
                        }
                      ]
                    },
                    {
                      "type": "BuiltinCommonInstructions::Standard",
                      "conditions": [
                        {
                          "type": {
                            "value": "KeyFromTextPressed"
                          },
                          "parameters": [
                            "",
                            "Down"
                          ]
                        },
                        {
                          "type": {
                            "value": "KeyFromTextPressed"
                          },
                          "parameters": [
                            "",
                            "Right"
                          ]
                        }
                      ],
                      "actions": [
                        {
                          "type": {
                            "value": "SetNumberVariable"
                          },
                          "parameters": [
                            "TargetAngle",
                            "=",
                            "45"
                          ]
                        }
                      ]
                    },
                    {
                      "type": "BuiltinCommonInstructions::Standard",
                      "conditions": [
                        {
                          "type": {
                            "value": "KeyFromTextPressed"
                          },
                          "parameters": [
                            "",
                            "Down"
                          ]
                        },
                        {
                          "type": {
                            "value": "KeyFromTextPressed"
                          },
                          "parameters": [
                            "",
                            "Left"
                          ]
                        }
                      ],
                      "actions": [
                        {
                          "type": {
                            "value": "SetNumberVariable"
                          },
                          "parameters": [
                            "TargetAngle",
                            "=",
                            "135"
                          ]
                        }
                      ]
                    },
                    {
                      "type": "BuiltinCommonInstructions::Standard",
                      "conditions": [],
                      "actions": [
                        {
                          "type": {
                            "value": "SetNumberVariable"
                          },
                          "parameters": [
                            "TargetAngle",
                            "+",
                            "CameraAngle"
                          ]
                        }
                      ]
                    },
                    {
                      "type": "BuiltinCommonInstructions::Standard",
                      "conditions": [
                        {
                          "type": {
                            "value": "Physics3D::PhysicsCharacter3D::IsForwardAngleAround"
                          },
                          "parameters": [
                            "Object",
                            "PhysicsCharacter3D",
                            "TargetAngle + 180",
                            "67.5"
                          ]
                        }
                      ],
                      "actions": [
                        {
                          "type": {
                            "value": "Physics3D::PhysicsCharacter3D::SetCurrentForwardSpeed"
                          },
                          "parameters": [
                            "Object",
                            "PhysicsCharacter3D",
                            "=",
                            "-Object.PhysicsCharacter3D::CurrentForwardSpeed()"
                          ]
                        }
                      ]
                    },
                    {
                      "type": "BuiltinCommonInstructions::Standard",
                      "conditions": [],
                      "actions": [
                        {
                          "type": {
                            "value": "Physics3D::PhysicsCharacter3D::SetForwardAngle"
                          },
                          "parameters": [
                            "Object",
                            "PhysicsCharacter3D",
                            "=",
                            "TargetAngle"
                          ]
                        },
                        {
                          "type": {
                            "value": "Physics3D::PhysicsCharacter3D::SimulateForwardKey"
                          },
                          "parameters": [
                            "Object",
                            "PhysicsCharacter3D"
                          ]
                        }
                      ]
                    }
                  ],
                  "variables": [
                    {
                      "name": "TargetAngle",
                      "type": "number",
                      "value": 0
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "KeyFromTextPressed"
                      },
                      "parameters": [
                        "",
                        "Jump"
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "Physics3D::PhysicsCharacter3D::SimulateJumpKey"
                      },
                      "parameters": [
                        "Object",
                        "PhysicsCharacter3D"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "PhysicsCharacter3DKeyMapper::Platformer3DKeyboardMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check if camera is locked for the frame.",
              "fullName": "Camera is locked",
              "functionType": "Condition",
              "name": "LockedCameraAngle",
              "private": true,
              "sentence": "_PARAM0_ camera is locked for the frame",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "LockedCameraAngle",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "PhysicsCharacter3DKeyMapper::Platformer3DKeyboardMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Change if camera is locked for the frame.",
              "fullName": "Lock the camera",
              "functionType": "Action",
              "name": "SetLockedCameraAngle",
              "private": true,
              "sentence": "_PARAM0_ camera is locked for the frame: _PARAM2_",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "inverted": true,
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "Value",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetBooleanVariable"
                      },
                      "parameters": [
                        "LockedCameraAngle",
                        "False",
                        ""
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "Value",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetBooleanVariable"
                      },
                      "parameters": [
                        "LockedCameraAngle",
                        "True",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "PhysicsCharacter3DKeyMapper::Platformer3DKeyboardMapper",
                  "type": "behavior"
                },
                {
                  "defaultValue": "yes",
                  "description": "Lock the camera",
                  "name": "Value",
                  "optional": true,
                  "type": "yesorno"
                }
              ],
              "objectGroups": []
            }
          ],
          "eventsFunctionsFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "functionName": "doStepPreEvents"
              },
              {
                "functionName": "LockedCameraAngle"
              },
              {
                "functionName": "SetLockedCameraAngle"
              }
            ]
          },
          "propertyDescriptors": [
            {
              "value": "",
              "type": "Behavior",
              "label": "3D physics character",
              "extraInformation": [
                "Physics3D::PhysicsCharacter3D"
              ],
              "choices": [],
              "name": "PhysicsCharacter3D"
            },
            {
              "value": "Space",
              "type": "KeyboardKey",
              "label": "Jump key",
              "name": "Jump"
            },
            {
              "value": "w",
              "type": "KeyboardKey",
              "label": "Up key",
              "name": "Up"
            },
            {
              "value": "a",
              "type": "KeyboardKey",
              "label": "Left key",
              "name": "Left"
            },
            {
              "value": "s",
              "type": "KeyboardKey",
              "label": "Down key",
              "name": "Down"
            },
            {
              "value": "d",
              "type": "KeyboardKey",
              "label": "Right key",
              "name": "Right"
            },
            {
              "value": "0",
              "type": "Number",
              "unit": "DegreeAngle",
              "label": "",
              "hidden": true,
              "name": "CameraAngle"
            },
            {
              "value": "",
              "type": "Boolean",
              "label": "Camera is locked for the frame",
              "hidden": true,
              "name": "LockedCameraAngle"
            }
          ],
          "propertiesFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "propertyName": "PhysicsCharacter3D"
              },
              {
                "propertyName": "Jump"
              },
              {
                "propertyName": "Up"
              },
              {
                "propertyName": "Left"
              },
              {
                "propertyName": "Down"
              },
              {
                "propertyName": "Right"
              },
              {
                "propertyName": "CameraAngle"
              },
              {
                "propertyName": "LockedCameraAngle"
              }
            ]
          }
        },
        {
          "description": "Control a 3D physics character with a keyboard for a first or third person shooter.",
          "fullName": "3D shooter keyboard mapper",
          "name": "Shooter3DKeyboardMapper",
          "objectType": "",
          "eventsFunctions": [
            {
              "fullName": "",
              "functionType": "Action",
              "name": "doStepPreEvents",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "KeyFromTextPressed"
                      },
                      "parameters": [
                        "",
                        "Up"
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "Physics3D::PhysicsCharacter3D::SimulateForwardKey"
                      },
                      "parameters": [
                        "Object",
                        "PhysicsCharacter3D"
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "KeyFromTextPressed"
                      },
                      "parameters": [
                        "",
                        "Down"
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "Physics3D::PhysicsCharacter3D::SimulateBackwardKey"
                      },
                      "parameters": [
                        "Object",
                        "PhysicsCharacter3D"
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "KeyFromTextPressed"
                      },
                      "parameters": [
                        "",
                        "Left"
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "Physics3D::PhysicsCharacter3D::SimulateLeftKey"
                      },
                      "parameters": [
                        "Object",
                        "PhysicsCharacter3D"
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "KeyFromTextPressed"
                      },
                      "parameters": [
                        "",
                        "Right"
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "Physics3D::PhysicsCharacter3D::SimulateRightKey"
                      },
                      "parameters": [
                        "Object",
                        "PhysicsCharacter3D"
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "KeyFromTextPressed"
                      },
                      "parameters": [
                        "",
                        "Jump"
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "Physics3D::PhysicsCharacter3D::SimulateJumpKey"
                      },
                      "parameters": [
                        "Object",
                        "PhysicsCharacter3D"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "PhysicsCharacter3DKeyMapper::Shooter3DKeyboardMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            }
          ],
          "eventsFunctionsFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "functionName": "doStepPreEvents"
              }
            ]
          },
          "propertyDescriptors": [
            {
              "value": "",
              "type": "Behavior",
              "label": "3D physics character",
              "extraInformation": [
                "Physics3D::PhysicsCharacter3D"
              ],
              "choices": [],
              "name": "PhysicsCharacter3D"
            },
            {
              "value": "Space",
              "type": "KeyboardKey",
              "label": "Jump key",
              "name": "Jump"
            },
            {
              "value": "w",
              "type": "KeyboardKey",
              "label": "Up key",
              "name": "Up"
            },
            {
              "value": "a",
              "type": "KeyboardKey",
              "label": "Left key",
              "name": "Left"
            },
            {
              "value": "s",
              "type": "KeyboardKey",
              "label": "Down key",
              "name": "Down"
            },
            {
              "value": "d",
              "type": "KeyboardKey",
              "label": "Right key",
              "name": "Right"
            }
          ],
          "propertiesFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "propertyName": "PhysicsCharacter3D"
              },
              {
                "propertyName": "Jump"
              },
              {
                "propertyName": "Up"
              },
              {
                "propertyName": "Left"
              },
              {
                "propertyName": "Down"
              },
              {
                "propertyName": "Right"
              }
            ]
          }
        }
      ],
      "eventsBasedObjects": []
    },
    {
      "author": "",
      "category": "Input",
      "dimension": "",
      "extensionNamespace": "",
      "fullName": "Multitouch joystick and buttons (sprite)",
      "gdevelopVersion": ">=5.5.222",
      "helpPath": "/objects/multitouch-joystick",
      "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTMiLz4NCjxwb2x5bGluZSBjbGFzcz0ic3QwIiBwb2ludHM9IjI4LjQsMTIgMjAsMTIgMjAsMy42ICIvPg0KPHBvbHlsaW5lIGNsYXNzPSJzdDAiIHBvaW50cz0iMjAsMjguNCAyMCwyMCAyOC40LDIwICIvPg0KPHBvbHlsaW5lIGNsYXNzPSJzdDAiIHBvaW50cz0iMy42LDIwIDEyLDIwIDEyLDI4LjQgIi8+DQo8cG9seWxpbmUgY2xhc3M9InN0MCIgcG9pbnRzPSIxMiwzLjYgMTIsMTIgMy42LDEyICIvPg0KPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIxNiw2IDE2LjcsNyAxNS4zLDcgIi8+DQo8cG9seWdvbiBjbGFzcz0ic3QwIiBwb2ludHM9IjE2LDI2IDE1LjMsMjUgMTYuNywyNSAiLz4NCjxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iNiwxNiA3LDE1LjMgNywxNi43ICIvPg0KPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIyNiwxNiAyNSwxNi43IDI1LDE1LjMgIi8+DQo8L3N2Zz4NCg==",
      "name": "SpriteMultitouchJoystick",
      "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Videogames/Videogames_controller_joystick_arrows_direction.svg",
      "shortDescription": "Joysticks or buttons for touchscreens.",
      "version": "1.9.0",
      "description": [
        "Multitouch joysticks are objects showing a joystick on the screen, useful for mobile. They work like a physical gamepad:",
        "- 4 or 8 directions",
        "- Analogus pads",
        "- Player selection",
        "- Automatic \"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 virtual joystick (it works by reading the multitouch joystick state and simulating controls). No need for additional events to make it work once the behaviors are set up.",
        "",
        "There are ready-to-use joysticks in the asset-store [multitouch joysticks pack](https://editor.gdevelop.io/?initial-dialog=asset-store&asset-pack=multitouch-joysticks-multitouch-joysticks)."
      ],
      "origin": {
        "identifier": "SpriteMultitouchJoystick",
        "name": "gdevelop-extension-store"
      },
      "tags": [
        "multitouch",
        "joystick",
        "thumbstick",
        "controller",
        "touchscreen",
        "twin stick",
        "shooter",
        "virtual",
        "platformer",
        "platform",
        "top-down"
      ],
      "authorIds": [
        "gqDaZjCfevOOxBYkK6zlhtZnXCg1",
        "1OgYzWp5UeVPbiWGJwI6vqfgZLC3",
        "v0YRpdAnIucZFgiRCCecqVnGKno2",
        "IWykYNRvhCZBN3vEgKEbBPOR3Oc2"
      ],
      "dependencies": [],
      "globalVariables": [],
      "sceneVariables": [
        {
          "name": "Controllers",
          "type": "array",
          "children": [
            {
              "type": "structure",
              "children": [
                {
                  "name": "Buttons",
                  "type": "array",
                  "children": [
                    {
                      "type": "structure",
                      "children": [
                        {
                          "name": "State",
                          "type": "string",
                          "value": "Idle"
                        }
                      ]
                    }
                  ]
                },
                {
                  "name": "Joystick",
                  "type": "structure",
                  "children": []
                }
              ]
            }
          ]
        }
      ],
      "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": []
        },
        {
          "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": "Check if a button was just pressed on a multitouch controller.",
          "fullName": "Multitouch controller button just pressed",
          "functionType": "Condition",
          "name": "IsButtonJustPressed",
          "sentence": "Button _PARAM2_ of multitouch controller _PARAM1_ was just pressed",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "StringVariable"
                  },
                  "parameters": [
                    "Controllers[ControllerIdentifier].Buttons[Button].State",
                    "=",
                    "\"JustPressed\""
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnBoolean"
                  },
                  "parameters": [
                    "True"
                  ]
                }
              ]
            }
          ],
          "parameters": [
            {
              "description": "Multitouch controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier",
              "type": "expression"
            },
            {
              "description": "Button name",
              "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": "string"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "Check if a button is pressed on a multitouch controller.",
          "fullName": "Multitouch controller button pressed",
          "functionType": "Condition",
          "name": "IsButtonPressed",
          "sentence": "Button _PARAM2_ of multitouch controller _PARAM1_ is pressed",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "BuiltinCommonInstructions::Or"
                  },
                  "parameters": [],
                  "subInstructions": [
                    {
                      "type": {
                        "value": "StringVariable"
                      },
                      "parameters": [
                        "Controllers[ControllerIdentifier].Buttons[Button].State",
                        "=",
                        "\"Pressed\""
                      ]
                    },
                    {
                      "type": {
                        "value": "StringVariable"
                      },
                      "parameters": [
                        "Controllers[ControllerIdentifier].Buttons[Button].State",
                        "=",
                        "\"JustPressed\""
                      ]
                    }
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnBoolean"
                  },
                  "parameters": [
                    "True"
                  ]
                }
              ]
            }
          ],
          "parameters": [
            {
              "description": "Multitouch controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier",
              "type": "expression"
            },
            {
              "description": "Button name",
              "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": "string"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "Check if a button is released on a multitouch controller.",
          "fullName": "Multitouch controller button released",
          "functionType": "Condition",
          "name": "IsButtonReleased",
          "sentence": "Button _PARAM2_ of multitouch controller _PARAM1_ is released",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "StringVariable"
                  },
                  "parameters": [
                    "Controllers[ControllerIdentifier].Buttons[Button].State",
                    "=",
                    "\"Released\""
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnBoolean"
                  },
                  "parameters": [
                    "True"
                  ]
                }
              ]
            }
          ],
          "parameters": [
            {
              "description": "Multitouch controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier",
              "type": "expression"
            },
            {
              "description": "Button name",
              "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": "string"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "Change a button state for a multitouch controller.",
          "fullName": "Button state",
          "functionType": "Action",
          "name": "SetButtonState",
          "private": true,
          "sentence": "Mark _PARAM2_ button as _PARAM3_ for multitouch controller _PARAM1_",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [],
              "actions": [
                {
                  "type": {
                    "value": "SetStringVariable"
                  },
                  "parameters": [
                    "Controllers[ControllerIdentifier].Buttons[Button].State",
                    "=",
                    "ButtonState"
                  ]
                }
              ]
            }
          ],
          "parameters": [
            {
              "description": "Multitouch controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier",
              "type": "expression"
            },
            {
              "description": "Button name",
              "name": "Button",
              "type": "string"
            },
            {
              "description": "Button state",
              "name": "ButtonState",
              "supplementaryInformation": "[\"Idle\",\"Pressed\",\"JustPressed\",\"Released\"]",
              "type": "stringWithSelector"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "Change the dead zone radius of a joystick. 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).",
          "fullName": "Dead zone radius",
          "functionType": "Action",
          "name": "SetDeadZone",
          "private": true,
          "sentence": "Change the dead zone of multitouch joystick _PARAM2_ of multitouch controller _PARAM1_ to _PARAM3_",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [],
              "actions": [
                {
                  "type": {
                    "value": "SetNumberVariable"
                  },
                  "parameters": [
                    "Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].DeadZone",
                    "=",
                    "DeadZoneRadius"
                  ]
                }
              ]
            }
          ],
          "parameters": [
            {
              "description": "Multitouch controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier",
              "type": "expression"
            },
            {
              "description": "Joystick name",
              "name": "JoystickIdentifier",
              "type": "string"
            },
            {
              "description": "Dead zone radius",
              "name": "DeadZoneRadius",
              "supplementaryInformation": "[]",
              "type": "expression"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "Return the dead zone radius of a joystick. 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).",
          "fullName": "Dead zone radius",
          "functionType": "Expression",
          "name": "DeadZone",
          "private": true,
          "sentence": "Change multitouch joystick _PARAM2_ of multitouch controller _PARAM1_ dead zone to _PARAM3_",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnNumber"
                  },
                  "parameters": [
                    "Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].DeadZone"
                  ]
                }
              ]
            }
          ],
          "expressionType": {
            "type": "expression"
          },
          "parameters": [
            {
              "description": "Multitouch controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier",
              "type": "expression"
            },
            {
              "description": "Joystick name",
              "name": "JoystickIdentifier",
              "type": "string"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "the direction index (left = 1, bottom = 1, right = 2, top = 3) for an angle (in degrees).",
          "fullName": "Angle to 4-way index",
          "functionType": "ExpressionAndCondition",
          "name": "AngleTo4Way",
          "private": true,
          "sentence": "The angle _PARAM1_ 4-way index",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnNumber"
                  },
                  "parameters": [
                    "mod(round(Angle * 4 / 360), 4)"
                  ]
                }
              ]
            }
          ],
          "expressionType": {
            "type": "expression"
          },
          "parameters": [
            {
              "description": "Angle",
              "name": "Angle",
              "type": "expression"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "the direction index (left = 1, bottom-left = 1... top-left = 7) for an angle (in degrees).",
          "fullName": "Angle to 8-way index",
          "functionType": "ExpressionAndCondition",
          "name": "AngleTo8Way",
          "private": true,
          "sentence": "The angle _PARAM1_ 8-way index",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnNumber"
                  },
                  "parameters": [
                    "mod(round(Angle * 8 / 360), 8)"
                  ]
                }
              ]
            }
          ],
          "expressionType": {
            "type": "expression"
          },
          "parameters": [
            {
              "description": "Angle",
              "name": "Angle",
              "type": "expression"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "Check if angle is in a given direction.",
          "fullName": "Angle 4-way direction",
          "functionType": "Condition",
          "name": "IsAngleIn4WayDirection",
          "private": true,
          "sentence": "The angle _PARAM1_ is the 4-way direction _PARAM2_",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "BuiltinCommonInstructions::CompareStrings"
                  },
                  "parameters": [
                    "Direction",
                    "=",
                    "\"Right\""
                  ]
                },
                {
                  "type": {
                    "value": "SpriteMultitouchJoystick::AngleTo4Way"
                  },
                  "parameters": [
                    "",
                    "=",
                    "0",
                    "Angle",
                    ""
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnBoolean"
                  },
                  "parameters": [
                    "True"
                  ]
                }
              ]
            },
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "BuiltinCommonInstructions::CompareStrings"
                  },
                  "parameters": [
                    "Direction",
                    "=",
                    "\"Down\""
                  ]
                },
                {
                  "type": {
                    "value": "SpriteMultitouchJoystick::AngleTo4Way"
                  },
                  "parameters": [
                    "",
                    "=",
                    "1",
                    "Angle",
                    ""
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnBoolean"
                  },
                  "parameters": [
                    "True"
                  ]
                }
              ]
            },
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "BuiltinCommonInstructions::CompareStrings"
                  },
                  "parameters": [
                    "Direction",
                    "=",
                    "\"Left\""
                  ]
                },
                {
                  "type": {
                    "value": "SpriteMultitouchJoystick::AngleTo4Way"
                  },
                  "parameters": [
                    "",
                    "=",
                    "2",
                    "Angle",
                    ""
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnBoolean"
                  },
                  "parameters": [
                    "True"
                  ]
                }
              ]
            },
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "BuiltinCommonInstructions::CompareStrings"
                  },
                  "parameters": [
                    "Direction",
                    "=",
                    "\"Up\""
                  ]
                },
                {
                  "type": {
                    "value": "SpriteMultitouchJoystick::AngleTo4Way"
                  },
                  "parameters": [
                    "",
                    "=",
                    "3",
                    "Angle",
                    ""
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnBoolean"
                  },
                  "parameters": [
                    "True"
                  ]
                }
              ]
            }
          ],
          "parameters": [
            {
              "description": "Angle",
              "name": "Angle",
              "type": "expression"
            },
            {
              "description": "Direction",
              "name": "Direction",
              "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]",
              "type": "stringWithSelector"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "Check if angle is in a given direction.",
          "fullName": "Angle 8-way direction",
          "functionType": "Condition",
          "name": "IsAngleIn8WayDirection",
          "private": true,
          "sentence": "The angle _PARAM1_ is the 8-way direction _PARAM2_",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "BuiltinCommonInstructions::CompareStrings"
                  },
                  "parameters": [
                    "Direction",
                    "=",
                    "\"Right\""
                  ]
                },
                {
                  "type": {
                    "value": "SpriteMultitouchJoystick::AngleTo8Way"
                  },
                  "parameters": [
                    "",
                    "=",
                    "0",
                    "Angle",
                    ""
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnBoolean"
                  },
                  "parameters": [
                    "True"
                  ]
                }
              ]
            },
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "BuiltinCommonInstructions::CompareStrings"
                  },
                  "parameters": [
                    "Direction",
                    "=",
                    "\"DownRight\""
                  ]
                },
                {
                  "type": {
                    "value": "SpriteMultitouchJoystick::AngleTo8Way"
                  },
                  "parameters": [
                    "",
                    "=",
                    "1",
                    "Angle",
                    ""
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnBoolean"
                  },
                  "parameters": [
                    "True"
                  ]
                }
              ]
            },
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "BuiltinCommonInstructions::CompareStrings"
                  },
                  "parameters": [
                    "Direction",
                    "=",
                    "\"Down\""
                  ]
                },
                {
                  "type": {
                    "value": "SpriteMultitouchJoystick::AngleTo8Way"
                  },
                  "parameters": [
                    "",
                    "=",
                    "2",
                    "Angle",
                    ""
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnBoolean"
                  },
                  "parameters": [
                    "True"
                  ]
                }
              ]
            },
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "BuiltinCommonInstructions::CompareStrings"
                  },
                  "parameters": [
                    "Direction",
                    "=",
                    "\"DownLeft\""
                  ]
                },
                {
                  "type": {
                    "value": "SpriteMultitouchJoystick::AngleTo8Way"
                  },
                  "parameters": [
                    "",
                    "=",
                    "3",
                    "Angle",
                    ""
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnBoolean"
                  },
                  "parameters": [
                    "True"
                  ]
                }
              ]
            },
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "BuiltinCommonInstructions::CompareStrings"
                  },
                  "parameters": [
                    "Direction",
                    "=",
                    "\"Left\""
                  ]
                },
                {
                  "type": {
                    "value": "SpriteMultitouchJoystick::AngleTo8Way"
                  },
                  "parameters": [
                    "",
                    "=",
                    "4",
                    "Angle",
                    ""
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnBoolean"
                  },
                  "parameters": [
                    "True"
                  ]
                }
              ]
            },
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "BuiltinCommonInstructions::CompareStrings"
                  },
                  "parameters": [
                    "Direction",
                    "=",
                    "\"UpLeft\""
                  ]
                },
                {
                  "type": {
                    "value": "SpriteMultitouchJoystick::AngleTo8Way"
                  },
                  "parameters": [
                    "",
                    "=",
                    "5",
                    "Angle",
                    ""
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnBoolean"
                  },
                  "parameters": [
                    "True"
                  ]
                }
              ]
            },
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "BuiltinCommonInstructions::CompareStrings"
                  },
                  "parameters": [
                    "Direction",
                    "=",
                    "\"Up\""
                  ]
                },
                {
                  "type": {
                    "value": "SpriteMultitouchJoystick::AngleTo8Way"
                  },
                  "parameters": [
                    "",
                    "=",
                    "6",
                    "Angle",
                    ""
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnBoolean"
                  },
                  "parameters": [
                    "True"
                  ]
                }
              ]
            },
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "BuiltinCommonInstructions::CompareStrings"
                  },
                  "parameters": [
                    "Direction",
                    "=",
                    "\"UpRight\""
                  ]
                },
                {
                  "type": {
                    "value": "SpriteMultitouchJoystick::AngleTo8Way"
                  },
                  "parameters": [
                    "",
                    "=",
                    "7",
                    "Angle",
                    ""
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnBoolean"
                  },
                  "parameters": [
                    "True"
                  ]
                }
              ]
            }
          ],
          "parameters": [
            {
              "description": "Angle",
              "name": "Angle",
              "type": "expression"
            },
            {
              "description": "Direction",
              "name": "Direction",
              "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]",
              "type": "stringWithSelector"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "Check if joystick is pushed in a given direction.",
          "fullName": "Joystick pushed in a direction (4-way)",
          "functionType": "Condition",
          "name": "IsDirectionPushed4Way",
          "sentence": "Joystick _PARAM2_ of multitouch controller _PARAM1_ is pushed in direction _PARAM3_",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Comment",
              "color": {
                "b": 109,
                "g": 230,
                "r": 255,
                "textB": 0,
                "textG": 0,
                "textR": 0
              },
              "comment": "Make sure the joystick has moved from center"
            },
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "SpriteMultitouchJoystick::JoystickForce"
                  },
                  "parameters": [
                    "",
                    ">",
                    "0",
                    "ControllerIdentifier",
                    "JoystickIdentifier",
                    ""
                  ]
                },
                {
                  "type": {
                    "value": "SpriteMultitouchJoystick::IsAngleIn4WayDirection"
                  },
                  "parameters": [
                    "",
                    "SpriteMultitouchJoystick::JoystickAngle(ControllerIdentifier, JoystickIdentifier)",
                    "Direction",
                    ""
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnBoolean"
                  },
                  "parameters": [
                    "True"
                  ]
                }
              ]
            }
          ],
          "parameters": [
            {
              "description": "Multitouch controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier",
              "type": "expression"
            },
            {
              "description": "Joystick name",
              "name": "JoystickIdentifier",
              "supplementaryInformation": "[\"Primary\",\"Secondary\"]",
              "type": "stringWithSelector"
            },
            {
              "description": "Direction",
              "name": "Direction",
              "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]",
              "type": "stringWithSelector"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "Check if joystick is pushed in a given direction.",
          "fullName": "Joystick pushed in a direction (8-way)",
          "functionType": "Condition",
          "name": "IsDirectionPushed8Way",
          "sentence": "Joystick _PARAM2_ of multitouch controller _PARAM1_ is pushed in direction _PARAM3_",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Comment",
              "color": {
                "b": 109,
                "g": 230,
                "r": 255,
                "textB": 0,
                "textG": 0,
                "textR": 0
              },
              "comment": "Make sure the joystick has moved from center"
            },
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "SpriteMultitouchJoystick::JoystickForce"
                  },
                  "parameters": [
                    "",
                    ">",
                    "0",
                    "ControllerIdentifier",
                    "JoystickIdentifier",
                    ""
                  ]
                },
                {
                  "type": {
                    "value": "SpriteMultitouchJoystick::IsAngleIn8WayDirection"
                  },
                  "parameters": [
                    "",
                    "SpriteMultitouchJoystick::JoystickAngle(ControllerIdentifier, JoystickIdentifier)",
                    "Direction",
                    ""
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnBoolean"
                  },
                  "parameters": [
                    "True"
                  ]
                }
              ]
            }
          ],
          "parameters": [
            {
              "description": "Multitouch controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier",
              "type": "expression"
            },
            {
              "description": "Joystick name",
              "name": "JoystickIdentifier",
              "supplementaryInformation": "[\"Primary\",\"Secondary\"]",
              "type": "stringWithSelector"
            },
            {
              "description": "Direction",
              "name": "Direction",
              "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]",
              "type": "stringWithSelector"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "the percentage the thumb has been pulled away from the joystick center (Range: 0 to 1).",
          "fullName": "Joystick force (deprecated)",
          "functionType": "ExpressionAndCondition",
          "name": "JoystickForce",
          "private": true,
          "sentence": "Joystick _PARAM2_ of multitouch controller _PARAM1_ force",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnNumber"
                  },
                  "parameters": [
                    "SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier)"
                  ]
                }
              ]
            }
          ],
          "expressionType": {
            "type": "expression"
          },
          "parameters": [
            {
              "description": "Multitouch controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier",
              "type": "expression"
            },
            {
              "description": "Joystick name",
              "name": "JoystickIdentifier",
              "supplementaryInformation": "[\"Primary\",\"Secondary\"]",
              "type": "stringWithSelector"
            },
            {
              "description": "",
              "name": "Coucou",
              "type": "expression"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "the force of multitouch contoller stick (from 0 to 1).",
          "fullName": "Stick force",
          "functionType": "ExpressionAndCondition",
          "name": "StickForce",
          "sentence": "multitouch controller _PARAM1_ _PARAM2_ stick force",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnNumber"
                  },
                  "parameters": [
                    "max(0, Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].Force - SpriteMultitouchJoystick::DeadZone(ControllerIdentifier, JoystickIdentifier)) / (1 - SpriteMultitouchJoystick::DeadZone(ControllerIdentifier, JoystickIdentifier))"
                  ]
                }
              ]
            }
          ],
          "expressionType": {
            "type": "expression"
          },
          "parameters": [
            {
              "description": "Multitouch controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier",
              "type": "expression"
            },
            {
              "description": "Stick name",
              "name": "JoystickIdentifier",
              "supplementaryInformation": "[\"Primary\",\"Secondary\"]",
              "type": "stringWithSelector"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "Change the percentage the thumb has been pulled away from the joystick center (Range: 0 to 1).",
          "fullName": "Joystick force",
          "functionType": "Action",
          "name": "SetJoystickForce",
          "private": true,
          "sentence": "Change the force of the joystick _PARAM2_ of multitouch controller _PARAM1_ to _PARAM3_",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [],
              "actions": [
                {
                  "type": {
                    "value": "SetNumberVariable"
                  },
                  "parameters": [
                    "Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].Force",
                    "=",
                    "Value"
                  ]
                }
              ]
            }
          ],
          "parameters": [
            {
              "description": "Multitouch controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier",
              "type": "expression"
            },
            {
              "description": "Joystick name",
              "name": "JoystickIdentifier",
              "type": "string"
            },
            {
              "description": "Value",
              "name": "Value",
              "type": "expression"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "Return the angle the joystick is pointing towards (Range: -180 to 180).",
          "fullName": "Joystick angle (deprecated)",
          "functionType": "Expression",
          "name": "JoystickAngle",
          "private": true,
          "sentence": "",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnNumber"
                  },
                  "parameters": [
                    "SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier)"
                  ]
                }
              ]
            }
          ],
          "expressionType": {
            "type": "expression"
          },
          "parameters": [
            {
              "description": "Multitouch controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier",
              "type": "expression"
            },
            {
              "description": "Joystick name",
              "name": "JoystickIdentifier",
              "supplementaryInformation": "[\"Primary\",\"Secondary\"]",
              "type": "stringWithSelector"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "Return the angle the multitouch controller stick is pointing towards (Range: -180 to 180).",
          "fullName": "Stick angle",
          "functionType": "Expression",
          "name": "StickAngle",
          "sentence": "",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnNumber"
                  },
                  "parameters": [
                    "Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].Angle"
                  ]
                }
              ]
            }
          ],
          "expressionType": {
            "type": "expression"
          },
          "parameters": [
            {
              "description": "Multitouch controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier",
              "type": "expression"
            },
            {
              "description": "Joystick name",
              "name": "JoystickIdentifier",
              "supplementaryInformation": "[\"Primary\",\"Secondary\"]",
              "type": "stringWithSelector"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "Change the angle the joystick is pointing towards (Range: -180 to 180).",
          "fullName": "Joystick angle",
          "functionType": "Action",
          "name": "SetJoystickAngle",
          "private": true,
          "sentence": "Change the angle of the joystick _PARAM2_ of multitouch controller _PARAM1_ to _PARAM3_",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [],
              "actions": [
                {
                  "type": {
                    "value": "SetNumberVariable"
                  },
                  "parameters": [
                    "Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].Angle",
                    "=",
                    "Value"
                  ]
                }
              ]
            }
          ],
          "parameters": [
            {
              "description": "Multitouch controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier",
              "type": "expression"
            },
            {
              "description": "Joystick name",
              "name": "JoystickIdentifier",
              "type": "string"
            },
            {
              "description": "Value",
              "name": "Value",
              "type": "expression"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "Return the multitouch contoller 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::Standard",
              "conditions": [],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnNumber"
                  },
                  "parameters": [
                    "XFromAngleAndDistance(SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier), SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier))"
                  ]
                }
              ]
            }
          ],
          "expressionType": {
            "type": "expression"
          },
          "parameters": [
            {
              "description": "Multitouch controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier",
              "type": "expression"
            },
            {
              "description": "Joystick name",
              "name": "JoystickIdentifier",
              "supplementaryInformation": "[\"Primary\",\"Secondary\"]",
              "type": "stringWithSelector"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "Return the multitouch contoller 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::Standard",
              "conditions": [],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnNumber"
                  },
                  "parameters": [
                    "YFromAngleAndDistance(SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier), SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier))"
                  ]
                }
              ]
            }
          ],
          "expressionType": {
            "type": "expression"
          },
          "parameters": [
            {
              "description": "Multitouch controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier",
              "type": "expression"
            },
            {
              "description": "Joystick name",
              "name": "JoystickIdentifier",
              "supplementaryInformation": "[\"Primary\",\"Secondary\"]",
              "type": "stringWithSelector"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "Check if a new touch has started on the right or left side of the screen.",
          "fullName": "New touch on a screen side",
          "functionType": "Condition",
          "group": "Multitouch Joystick",
          "name": "HasTouchStartedOnScreenSide",
          "sentence": "A new touch has started on the _PARAM2_ side of the screen on _PARAM1_'s layer",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "HasAnyTouchOrMouseStarted"
                  },
                  "parameters": [
                    ""
                  ]
                }
              ],
              "actions": [],
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "StringVariable"
                      },
                      "parameters": [
                        "Side",
                        "=",
                        "\"Left\""
                      ]
                    },
                    {
                      "type": {
                        "value": "TouchX"
                      },
                      "parameters": [
                        "",
                        "StartedTouchOrMouseId(0)",
                        "<",
                        "CameraCenterX(Object.Layer())",
                        "Object.Layer()",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "StringVariable"
                      },
                      "parameters": [
                        "Side",
                        "=",
                        "\"Right\""
                      ]
                    },
                    {
                      "type": {
                        "value": "TouchX"
                      },
                      "parameters": [
                        "",
                        "StartedTouchOrMouseId(0)",
                        ">=",
                        "CameraCenterX(Object.Layer())",
                        "Object.Layer()",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ]
            }
          ],
          "parameters": [
            {
              "description": "Multitouch joystick",
              "name": "Object",
              "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
              "type": "objectList"
            },
            {
              "description": "Screen side",
              "name": "Side",
              "supplementaryInformation": "[\"Left\",\"Right\"]",
              "type": "stringWithSelector"
            }
          ],
          "objectGroups": []
        }
      ],
      "eventsFunctionsFolderStructure": {
        "folderName": "__ROOT",
        "children": [
          {
            "functionName": "IsInGameEdition"
          },
          {
            "functionName": "AcceleratedSpeed"
          },
          {
            "functionName": "IsButtonJustPressed"
          },
          {
            "functionName": "IsButtonPressed"
          },
          {
            "functionName": "IsButtonReleased"
          },
          {
            "functionName": "SetButtonState"
          },
          {
            "functionName": "SetDeadZone"
          },
          {
            "functionName": "DeadZone"
          },
          {
            "functionName": "AngleTo4Way"
          },
          {
            "functionName": "AngleTo8Way"
          },
          {
            "functionName": "IsAngleIn4WayDirection"
          },
          {
            "functionName": "IsAngleIn8WayDirection"
          },
          {
            "functionName": "IsDirectionPushed4Way"
          },
          {
            "functionName": "IsDirectionPushed8Way"
          },
          {
            "functionName": "JoystickForce"
          },
          {
            "functionName": "StickForce"
          },
          {
            "functionName": "SetJoystickForce"
          },
          {
            "functionName": "JoystickAngle"
          },
          {
            "functionName": "StickAngle"
          },
          {
            "functionName": "SetJoystickAngle"
          },
          {
            "functionName": "StickForceX"
          },
          {
            "functionName": "StickForceY"
          },
          {
            "folderName": "Multitouch Joystick",
            "children": [
              {
                "functionName": "HasTouchStartedOnScreenSide"
              }
            ]
          }
        ]
      },
      "eventsBasedBehaviors": [
        {
          "description": "Joystick that can be controlled by interacting with a touchscreen.",
          "fullName": "Multitouch Joystick",
          "name": "MultitouchJoystick",
          "objectType": "",
          "private": true,
          "eventsFunctions": [
            {
              "fullName": "",
              "functionType": "Action",
              "name": "onCreated",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::SetDeadZone"
                      },
                      "parameters": [
                        "",
                        "ControllerIdentifier",
                        "JoystickIdentifier",
                        "DeadZoneRadius",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset"
                      },
                      "parameters": [
                        "Object",
                        "Behavior",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "Action",
              "name": "onDeActivate",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset"
                      },
                      "parameters": [
                        "Object",
                        "Behavior",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "Action",
              "name": "doStepPreEvents",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "inverted": true,
                        "value": "SpriteMultitouchJoystick::IsInGameEdition"
                      },
                      "parameters": [
                        "",
                        ""
                      ]
                    }
                  ],
                  "actions": [],
                  "events": [
                    {
                      "type": "BuiltinCommonInstructions::Standard",
                      "conditions": [
                        {
                          "type": {
                            "value": "HasGameJustResumed"
                          },
                          "parameters": [
                            ""
                          ]
                        }
                      ],
                      "actions": [
                        {
                          "type": {
                            "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset"
                          },
                          "parameters": [
                            "Object",
                            "Behavior",
                            ""
                          ]
                        }
                      ]
                    },
                    {
                      "colorB": 228,
                      "colorG": 176,
                      "colorR": 74,
                      "creationTime": 0,
                      "name": "Manage touches",
                      "source": "",
                      "type": "BuiltinCommonInstructions::Group",
                      "events": [
                        {
                          "type": "BuiltinCommonInstructions::Standard",
                          "conditions": [
                            {
                              "type": {
                                "value": "HasAnyTouchOrMouseStarted"
                              },
                              "parameters": [
                                ""
                              ]
                            }
                          ],
                          "actions": [
                            {
                              "type": {
                                "value": "SetNumberVariable"
                              },
                              "parameters": [
                                "TouchIndex",
                                "=",
                                "0"
                              ]
                            }
                          ],
                          "events": [
                            {
                              "type": "BuiltinCommonInstructions::Repeat",
                              "repeatExpression": "StartedTouchOrMouseCount()",
                              "conditions": [],
                              "actions": [],
                              "events": [
                                {
                                  "type": "BuiltinCommonInstructions::Standard",
                                  "conditions": [
                                    {
                                      "type": {
                                        "value": "NumberVariable"
                                      },
                                      "parameters": [
                                        "TouchId",
                                        "=",
                                        "0"
                                      ]
                                    },
                                    {
                                      "type": {
                                        "value": "CollisionPoint"
                                      },
                                      "parameters": [
                                        "Object",
                                        "TouchX(StartedTouchOrMouseId(TouchIndex), Object.Layer(), 0)",
                                        "TouchY(StartedTouchOrMouseId(TouchIndex), Object.Layer(), 0)"
                                      ]
                                    }
                                  ],
                                  "actions": [
                                    {
                                      "type": {
                                        "value": "SetNumberVariable"
                                      },
                                      "parameters": [
                                        "TouchId",
                                        "=",
                                        "StartedTouchOrMouseId(TouchIndex)"
                                      ]
                                    }
                                  ]
                                },
                                {
                                  "type": "BuiltinCommonInstructions::Standard",
                                  "conditions": [],
                                  "actions": [
                                    {
                                      "type": {
                                        "value": "SetNumberVariable"
                                      },
                                      "parameters": [
                                        "TouchIndex",
                                        "+",
                                        "1"
                                      ]
                                    }
                                  ]
                                }
                              ]
                            }
                          ]
                        },
                        {
                          "type": "BuiltinCommonInstructions::Comment",
                          "color": {
                            "b": 109,
                            "g": 230,
                            "r": 255,
                            "textB": 0,
                            "textG": 0,
                            "textR": 0
                          },
                          "comment": "Move thumb back to center when not being pressed (acts like a spring on a real controller)"
                        },
                        {
                          "type": "BuiltinCommonInstructions::Standard",
                          "conditions": [
                            {
                              "type": {
                                "value": "HasTouchEnded"
                              },
                              "parameters": [
                                "",
                                "TouchId"
                              ]
                            }
                          ],
                          "actions": [
                            {
                              "type": {
                                "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset"
                              },
                              "parameters": [
                                "Object",
                                "Behavior",
                                ""
                              ]
                            }
                          ]
                        }
                      ],
                      "parameters": []
                    },
                    {
                      "colorB": 228,
                      "colorG": 176,
                      "colorR": 74,
                      "creationTime": 0,
                      "name": "Update joystick position",
                      "source": "",
                      "type": "BuiltinCommonInstructions::Group",
                      "events": [
                        {
                          "type": "BuiltinCommonInstructions::Standard",
                          "conditions": [
                            {
                              "type": {
                                "value": "NumberVariable"
                              },
                              "parameters": [
                                "TouchId",
                                "!=",
                                "0"
                              ]
                            }
                          ],
                          "actions": [
                            {
                              "type": {
                                "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickAngle"
                              },
                              "parameters": [
                                "Object",
                                "Behavior",
                                "AngleBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(TouchId, Object.Layer(), 0), TouchY(TouchId, Object.Layer(), 0))",
                                "AngleBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(TouchId, Object.Layer(), 0), TouchY(TouchId, Object.Layer(), 0))"
                              ]
                            },
                            {
                              "type": {
                                "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickForce"
                              },
                              "parameters": [
                                "Object",
                                "Behavior",
                                "=",
                                "clamp(2 * DistanceBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(TouchId, Object.Layer(), 0), TouchY(TouchId, Object.Layer(), 0)) / Object.Width(), 0, 1)",
                                ""
                              ]
                            }
                          ]
                        }
                      ],
                      "parameters": []
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the joystick force (from 0 to 1).",
              "fullName": "Joystick force",
              "functionType": "ExpressionAndCondition",
              "name": "JoystickForce",
              "sentence": "the joystick force",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnNumber"
                      },
                      "parameters": [
                        "max(0, JoystickForce - DeadZoneRadius) / (1 - DeadZoneRadius)"
                      ]
                    }
                  ]
                }
              ],
              "expressionType": {
                "type": "expression"
              },
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "ActionWithOperator",
              "getterName": "JoystickForce",
              "name": "SetJoystickForce",
              "private": true,
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "JoystickForce",
                        "=",
                        "Value"
                      ]
                    },
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::SetJoystickForce"
                      },
                      "parameters": [
                        "",
                        "ControllerIdentifier",
                        "JoystickIdentifier",
                        "JoystickForce",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick",
                  "type": "behavior"
                },
                {
                  "description": "",
                  "name": "Parameter",
                  "type": "objectList"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Return the angle the joystick is pointing towards (Range: -180 to 180).",
              "fullName": "Joystick angle",
              "functionType": "Expression",
              "name": "JoystickAngle",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnNumber"
                      },
                      "parameters": [
                        "JoystickAngle"
                      ]
                    }
                  ]
                }
              ],
              "expressionType": {
                "type": "expression"
              },
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Change the angle the joystick is pointing towards (Range: -180 to 180).",
              "fullName": "Joystick angle",
              "functionType": "Action",
              "name": "SetJoystickAngle",
              "private": true,
              "sentence": "Change the joystick angle of _PARAM0_ to _PARAM2_",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "JoystickAngle",
                        "=",
                        "Value"
                      ]
                    },
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::SetJoystickAngle"
                      },
                      "parameters": [
                        "",
                        "ControllerIdentifier",
                        "JoystickIdentifier",
                        "JoystickAngle",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick",
                  "type": "behavior"
                },
                {
                  "description": "Angle",
                  "name": "Value",
                  "type": "expression"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Return the 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::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnNumber"
                      },
                      "parameters": [
                        "Object.Behavior::JoystickForce() * cos(ToRad(Object.Behavior::JoystickAngle()))"
                      ]
                    }
                  ]
                }
              ],
              "expressionType": {
                "type": "expression"
              },
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Return the 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::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnNumber"
                      },
                      "parameters": [
                        "Object.Behavior::JoystickForce() * sin(ToRad(Object.Behavior::JoystickAngle()))"
                      ]
                    }
                  ]
                }
              ],
              "expressionType": {
                "type": "expression"
              },
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check if joystick is pushed in a given direction.",
              "fullName": "Joystick pushed in a direction (4-way movement)",
              "functionType": "Condition",
              "name": "IsDirectionPushed4Way",
              "sentence": "_PARAM0_ is pushed in direction _PARAM2_",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::MultitouchJoystick::JoystickForce"
                      },
                      "parameters": [
                        "Object",
                        "Behavior",
                        ">",
                        "0",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::IsAngleIn4WayDirection"
                      },
                      "parameters": [
                        "",
                        "JoystickAngle",
                        "Direction",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick",
                  "type": "behavior"
                },
                {
                  "description": "Direction",
                  "name": "Direction",
                  "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]",
                  "type": "stringWithSelector"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check if joystick is pushed in a given direction.",
              "fullName": "Joystick pushed in a direction (8-way movement)",
              "functionType": "Condition",
              "name": "IsDirectionPushed8Way",
              "sentence": "_PARAM0_ is pushed in direction _PARAM2_",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::MultitouchJoystick::JoystickForce"
                      },
                      "parameters": [
                        "Object",
                        "Behavior",
                        ">",
                        "0",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::IsAngleIn8WayDirection"
                      },
                      "parameters": [
                        "",
                        "JoystickAngle",
                        "Direction",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick",
                  "type": "behavior"
                },
                {
                  "description": "Direction",
                  "name": "Direction",
                  "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]",
                  "type": "stringWithSelector"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check if a joystick is pressed.",
              "fullName": "Joystick pressed",
              "functionType": "Condition",
              "name": "IsPressed",
              "sentence": "Joystick _PARAM0_ is pressed",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "NumberVariable"
                      },
                      "parameters": [
                        "TouchId",
                        "!=",
                        "0"
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Reset the joystick values (except for angle, which stays the same)",
              "fullName": "Reset",
              "functionType": "Action",
              "name": "Reset",
              "private": true,
              "sentence": "Reset the joystick of _PARAM0_",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickForce"
                      },
                      "parameters": [
                        "Object",
                        "Behavior",
                        "=",
                        "0",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "TouchId",
                        "=",
                        "0"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the multitouch controller identifier.",
              "fullName": "Multitouch controller identifier",
              "functionType": "ExpressionAndCondition",
              "group": "Multitouch Joystick configuration",
              "name": "ControllerIdentifier",
              "sentence": "the multitouch controller identifier",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnNumber"
                      },
                      "parameters": [
                        "ControllerIdentifier"
                      ]
                    }
                  ]
                }
              ],
              "expressionType": {
                "type": "expression"
              },
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "ActionWithOperator",
              "getterName": "ControllerIdentifier",
              "group": "Multitouch Joystick configuration",
              "name": "SetControllerIdentifier",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "ControllerIdentifier",
                        "=",
                        "Value"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the joystick name.",
              "fullName": "Joystick name",
              "functionType": "ExpressionAndCondition",
              "group": "Multitouch Joystick configuration",
              "name": "JoystickIdentifier",
              "sentence": "the joystick name",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnString"
                      },
                      "parameters": [
                        "JoystickIdentifier"
                      ]
                    }
                  ]
                }
              ],
              "expressionType": {
                "type": "string"
              },
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "ActionWithOperator",
              "getterName": "JoystickIdentifier",
              "group": "Multitouch Joystick configuration",
              "name": "SetJoystickIdentifier",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetStringVariable"
                      },
                      "parameters": [
                        "JoystickIdentifier",
                        "=",
                        "Value"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the dead zone radius (range: 0 to 1) of the joystick. 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).",
              "fullName": "Dead zone radius",
              "functionType": "ExpressionAndCondition",
              "group": "Multitouch Joystick configuration",
              "name": "DeadZoneRadius",
              "sentence": "the dead zone radius",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnNumber"
                      },
                      "parameters": [
                        "DeadZoneRadius"
                      ]
                    }
                  ]
                }
              ],
              "expressionType": {
                "type": "expression"
              },
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "ActionWithOperator",
              "getterName": "DeadZoneRadius",
              "group": "Multitouch Joystick configuration",
              "name": "SetDeadZoneRadius",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "DeadZoneRadius",
                        "=",
                        "Value"
                      ]
                    },
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::SetDeadZone"
                      },
                      "parameters": [
                        "",
                        "ControllerIdentifier",
                        "JoystickIdentifier",
                        "Value",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Force the joystick into the pressing state.",
              "fullName": "Force start pressing",
              "functionType": "Action",
              "name": "ForceStartPressing",
              "sentence": "Force start pressing _PARAM0_ with touch identifier: _PARAM2_",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "TouchId",
                        "=",
                        "Value"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick",
                  "type": "behavior"
                },
                {
                  "description": "Touch identifier",
                  "name": "Value",
                  "type": "expression"
                }
              ],
              "objectGroups": []
            }
          ],
          "eventsFunctionsFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "functionName": "onCreated"
              },
              {
                "functionName": "onDeActivate"
              },
              {
                "functionName": "doStepPreEvents"
              },
              {
                "functionName": "JoystickForce"
              },
              {
                "functionName": "SetJoystickForce"
              },
              {
                "functionName": "JoystickAngle"
              },
              {
                "functionName": "SetJoystickAngle"
              },
              {
                "functionName": "StickForceX"
              },
              {
                "functionName": "StickForceY"
              },
              {
                "functionName": "IsDirectionPushed4Way"
              },
              {
                "functionName": "IsDirectionPushed8Way"
              },
              {
                "functionName": "IsPressed"
              },
              {
                "functionName": "Reset"
              },
              {
                "folderName": "Multitouch Joystick configuration",
                "children": [
                  {
                    "functionName": "ControllerIdentifier"
                  },
                  {
                    "functionName": "SetControllerIdentifier"
                  },
                  {
                    "functionName": "JoystickIdentifier"
                  },
                  {
                    "functionName": "SetJoystickIdentifier"
                  },
                  {
                    "functionName": "DeadZoneRadius"
                  },
                  {
                    "functionName": "SetDeadZoneRadius"
                  }
                ]
              },
              {
                "functionName": "ForceStartPressing"
              }
            ]
          },
          "propertyDescriptors": [
            {
              "value": "1",
              "type": "Number",
              "label": "Multitouch controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier"
            },
            {
              "value": "Primary",
              "type": "String",
              "label": "Joystick name",
              "name": "JoystickIdentifier"
            },
            {
              "value": "0.4",
              "type": "Number",
              "label": "Dead zone radius (range: 0 to 1)",
              "description": "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)",
              "name": "DeadZoneRadius"
            },
            {
              "value": "0",
              "type": "Number",
              "label": "Joystick angle (range: -180 to 180)",
              "hidden": true,
              "name": "JoystickAngle"
            },
            {
              "value": "0",
              "type": "Number",
              "label": "Joystick force (range: 0 to 1)",
              "hidden": true,
              "name": "JoystickForce"
            },
            {
              "value": "0",
              "type": "Number",
              "label": "",
              "hidden": true,
              "name": "TouchId"
            },
            {
              "value": "",
              "type": "Number",
              "label": "",
              "hidden": true,
              "name": "TouchIndex"
            }
          ],
          "propertiesFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "propertyName": "ControllerIdentifier"
              },
              {
                "propertyName": "JoystickIdentifier"
              },
              {
                "propertyName": "DeadZoneRadius"
              },
              {
                "propertyName": "JoystickAngle"
              },
              {
                "propertyName": "JoystickForce"
              },
              {
                "propertyName": "TouchId"
              },
              {
                "propertyName": "TouchIndex"
              }
            ]
          }
        },
        {
          "description": "Detect presses made on a touchscreen on the object so it acts like a button and automatically trigger the button having the same identifier for the mapper behaviors.",
          "fullName": "Multitouch button",
          "name": "MultitouchButton",
          "objectType": "",
          "eventsFunctions": [
            {
              "fullName": "",
              "functionType": "Action",
              "name": "doStepPreEvents",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "IsReleased",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetBooleanVariable"
                      },
                      "parameters": [
                        "IsReleased",
                        "False",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState"
                      },
                      "parameters": [
                        "Object",
                        "Behavior",
                        "\"Idle\"",
                        ""
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "IsJustPressed",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetBooleanVariable"
                      },
                      "parameters": [
                        "IsJustPressed",
                        "False",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState"
                      },
                      "parameters": [
                        "Object",
                        "Behavior",
                        "\"Pressed\"",
                        ""
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "inverted": true,
                        "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed"
                      },
                      "parameters": [
                        "Object",
                        "Behavior",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "HasAnyTouchOrMouseStarted"
                      },
                      "parameters": [
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "TouchIndex",
                        "=",
                        "0"
                      ]
                    }
                  ],
                  "events": [
                    {
                      "type": "BuiltinCommonInstructions::Repeat",
                      "repeatExpression": "StartedTouchOrMouseCount()",
                      "conditions": [],
                      "actions": [],
                      "events": [
                        {
                          "type": "BuiltinCommonInstructions::Standard",
                          "conditions": [
                            {
                              "type": {
                                "value": "BuiltinCommonInstructions::Or"
                              },
                              "parameters": [],
                              "subInstructions": [
                                {
                                  "type": {
                                    "value": "CollisionPoint"
                                  },
                                  "parameters": [
                                    "Object",
                                    "TouchX(StartedTouchOrMouseId(TouchIndex), Object.Layer())",
                                    "TouchY(StartedTouchOrMouseId(TouchIndex), Object.Layer())"
                                  ]
                                },
                                {
                                  "type": {
                                    "value": "NumberVariable"
                                  },
                                  "parameters": [
                                    "Radius",
                                    ">",
                                    "DistanceBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(StartedTouchOrMouseId(TouchIndex), Object.Layer()), TouchY(StartedTouchOrMouseId(TouchIndex), Object.Layer()))"
                                  ]
                                }
                              ]
                            }
                          ],
                          "actions": [
                            {
                              "type": {
                                "value": "SetNumberVariable"
                              },
                              "parameters": [
                                "TouchId",
                                "=",
                                "StartedTouchOrMouseId(TouchIndex)"
                              ]
                            },
                            {
                              "type": {
                                "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState"
                              },
                              "parameters": [
                                "Object",
                                "Behavior",
                                "\"JustPressed\"",
                                ""
                              ]
                            },
                            {
                              "type": {
                                "value": "SetBooleanVariable"
                              },
                              "parameters": [
                                "IsJustPressed",
                                "True",
                                ""
                              ]
                            }
                          ]
                        },
                        {
                          "type": "BuiltinCommonInstructions::Standard",
                          "conditions": [],
                          "actions": [
                            {
                              "type": {
                                "value": "SetNumberVariable"
                              },
                              "parameters": [
                                "TouchIndex",
                                "+",
                                "1"
                              ]
                            }
                          ]
                        }
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed"
                      },
                      "parameters": [
                        "Object",
                        "Behavior",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "HasTouchEnded"
                      },
                      "parameters": [
                        "",
                        "TouchId"
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState"
                      },
                      "parameters": [
                        "Object",
                        "Behavior",
                        "\"Released\"",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "SetBooleanVariable"
                      },
                      "parameters": [
                        "IsReleased",
                        "True",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "SetBooleanVariable"
                      },
                      "parameters": [
                        "IsJustPressed",
                        "False",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "TouchId",
                        "=",
                        "0"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check if the button was just pressed.",
              "fullName": "Button just pressed",
              "functionType": "Condition",
              "name": "IsJustPressed",
              "sentence": "Button _PARAM0_ was just pressed",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "IsJustPressed",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check if the button is pressed.",
              "fullName": "Button pressed",
              "functionType": "Condition",
              "name": "IsPressed",
              "sentence": "Button _PARAM0_ is pressed",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "NumberVariable"
                      },
                      "parameters": [
                        "TouchId",
                        "!=",
                        "0"
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check if the button is released.",
              "fullName": "Button released",
              "functionType": "Condition",
              "name": "IsReleased",
              "sentence": "Button _PARAM0_ is released",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "IsReleased",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "Button state",
              "functionType": "Action",
              "name": "SetButtonState",
              "private": true,
              "sentence": "Mark the button _PARAM0_ as _PARAM2_",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::SetButtonState"
                      },
                      "parameters": [
                        "",
                        "ControllerIdentifier",
                        "ButtonIdentifier",
                        "ButtonState",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton",
                  "type": "behavior"
                },
                {
                  "description": "Button state",
                  "name": "ButtonState",
                  "supplementaryInformation": "[\"Idle\",\"JustPressed\",\"Pressed\",\"Released\"]",
                  "type": "stringWithSelector"
                }
              ],
              "objectGroups": []
            }
          ],
          "eventsFunctionsFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "functionName": "doStepPreEvents"
              },
              {
                "functionName": "IsJustPressed"
              },
              {
                "functionName": "IsPressed"
              },
              {
                "functionName": "IsReleased"
              },
              {
                "functionName": "SetButtonState"
              }
            ]
          },
          "propertyDescriptors": [
            {
              "value": "1",
              "type": "Number",
              "label": "Multitouch controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier"
            },
            {
              "value": "A",
              "type": "String",
              "label": "Button identifier",
              "name": "ButtonIdentifier"
            },
            {
              "value": "0",
              "type": "Number",
              "label": "TouchID",
              "hidden": true,
              "name": "TouchId"
            },
            {
              "value": "",
              "type": "Number",
              "label": "",
              "hidden": true,
              "name": "TouchIndex"
            },
            {
              "value": "",
              "type": "Boolean",
              "label": "Button released",
              "hidden": true,
              "name": "IsReleased"
            },
            {
              "value": "",
              "type": "Boolean",
              "label": "Button just pressed",
              "hidden": true,
              "name": "IsJustPressed"
            },
            {
              "value": "0",
              "type": "Number",
              "unit": "Pixel",
              "label": "Triggering circle radius",
              "description": "This circle adds up to the object collision mask.",
              "name": "Radius"
            }
          ],
          "propertiesFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "propertyName": "ControllerIdentifier"
              },
              {
                "propertyName": "ButtonIdentifier"
              },
              {
                "propertyName": "TouchId"
              },
              {
                "propertyName": "TouchIndex"
              },
              {
                "propertyName": "IsReleased"
              },
              {
                "propertyName": "IsJustPressed"
              },
              {
                "propertyName": "Radius"
              }
            ]
          }
        },
        {
          "description": "Control a platformer character with a multitouch controller.",
          "fullName": "Platformer multitouch controller mapper",
          "name": "PlatformerMultitouchMapper",
          "objectType": "",
          "quickCustomizationVisibility": "hidden",
          "eventsFunctions": [
            {
              "fullName": "",
              "functionType": "Action",
              "name": "doStepPreEvents",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way"
                      },
                      "parameters": [
                        "",
                        "ControllerIdentifier",
                        "JoystickIdentifier",
                        "\"Left\"",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "PlatformBehavior::SimulateLeftKey"
                      },
                      "parameters": [
                        "Object",
                        "Property"
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way"
                      },
                      "parameters": [
                        "",
                        "ControllerIdentifier",
                        "JoystickIdentifier",
                        "\"Right\"",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "PlatformBehavior::SimulateRightKey"
                      },
                      "parameters": [
                        "Object",
                        "Property"
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way"
                      },
                      "parameters": [
                        "",
                        "ControllerIdentifier",
                        "JoystickIdentifier",
                        "\"Up\"",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "PlatformBehavior::SimulateUpKey"
                      },
                      "parameters": [
                        "Object",
                        "Property"
                      ]
                    },
                    {
                      "type": {
                        "value": "PlatformBehavior::SimulateLadderKey"
                      },
                      "parameters": [
                        "Object",
                        "Property"
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way"
                      },
                      "parameters": [
                        "",
                        "ControllerIdentifier",
                        "JoystickIdentifier",
                        "\"Down\"",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "PlatformBehavior::SimulateDownKey"
                      },
                      "parameters": [
                        "Object",
                        "Property"
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::IsButtonPressed"
                      },
                      "parameters": [
                        "",
                        "ControllerIdentifier",
                        "JumpButton",
                        "\"Down\""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "PlatformBehavior::SimulateJumpKey"
                      },
                      "parameters": [
                        "Object",
                        "Property"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::PlatformerMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            }
          ],
          "eventsFunctionsFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "functionName": "doStepPreEvents"
              }
            ]
          },
          "propertyDescriptors": [
            {
              "value": "",
              "type": "Behavior",
              "label": "Platform character behavior",
              "extraInformation": [
                "PlatformBehavior::PlatformerObjectBehavior"
              ],
              "choices": [],
              "name": "Property"
            },
            {
              "value": "1",
              "type": "Number",
              "label": "Controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier"
            },
            {
              "value": "Primary",
              "type": "Choice",
              "label": "Joystick name",
              "group": "Controls",
              "choices": [
                {
                  "label": "Primary",
                  "value": "Primary"
                },
                {
                  "label": "Secondary",
                  "value": "Secondary"
                }
              ],
              "name": "JoystickIdentifier"
            },
            {
              "value": "A",
              "type": "String",
              "label": "Jump button name",
              "group": "Controls",
              "name": "JumpButton"
            }
          ],
          "propertiesFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "propertyName": "Property"
              },
              {
                "propertyName": "ControllerIdentifier"
              },
              {
                "folderName": "Controls",
                "children": [
                  {
                    "propertyName": "JoystickIdentifier"
                  },
                  {
                    "propertyName": "JumpButton"
                  }
                ]
              }
            ]
          }
        },
        {
          "description": "Control a 3D physics character with a multitouch controller.",
          "fullName": "3D platformer multitouch controller mapper",
          "name": "Platformer3DMultitouchMapper",
          "objectType": "",
          "quickCustomizationVisibility": "hidden",
          "eventsFunctions": [
            {
              "fullName": "",
              "functionType": "Action",
              "name": "doStepPreEvents",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::StickForce"
                      },
                      "parameters": [
                        "",
                        ">",
                        "0",
                        "ControllerIdentifier",
                        "JoystickIdentifier",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "Physics3D::PhysicsCharacter3D::SetForwardAngle"
                      },
                      "parameters": [
                        "Object",
                        "PhysicsCharacter3D",
                        "=",
                        "SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier) + CameraAngle(Object.Layer())"
                      ]
                    },
                    {
                      "type": {
                        "value": "Physics3D::PhysicsCharacter3D::SimulateStick"
                      },
                      "parameters": [
                        "Object",
                        "PhysicsCharacter3D",
                        "-90",
                        "SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier)"
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::IsButtonPressed"
                      },
                      "parameters": [
                        "",
                        "ControllerIdentifier",
                        "JumpButton",
                        "\"Down\""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "Physics3D::PhysicsCharacter3D::SimulateJumpKey"
                      },
                      "parameters": [
                        "Object",
                        "PhysicsCharacter3D"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::Platformer3DMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            }
          ],
          "eventsFunctionsFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "functionName": "doStepPreEvents"
              }
            ]
          },
          "propertyDescriptors": [
            {
              "value": "",
              "type": "Behavior",
              "label": "3D physics character",
              "extraInformation": [
                "Physics3D::PhysicsCharacter3D"
              ],
              "choices": [],
              "name": "PhysicsCharacter3D"
            },
            {
              "value": "1",
              "type": "Number",
              "label": "Controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier"
            },
            {
              "value": "Primary",
              "type": "Choice",
              "label": "Walk joystick",
              "group": "Controls",
              "choices": [
                {
                  "label": "Primary",
                  "value": "Primary"
                },
                {
                  "label": "Secondary",
                  "value": "Secondary"
                }
              ],
              "name": "JoystickIdentifier"
            },
            {
              "value": "A",
              "type": "String",
              "label": "Jump button name",
              "group": "Controls",
              "name": "JumpButton"
            }
          ],
          "propertiesFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "propertyName": "PhysicsCharacter3D"
              },
              {
                "propertyName": "ControllerIdentifier"
              },
              {
                "folderName": "Controls",
                "children": [
                  {
                    "propertyName": "JoystickIdentifier"
                  },
                  {
                    "propertyName": "JumpButton"
                  }
                ]
              }
            ]
          }
        },
        {
          "description": "Control a 3D physics character with a multitouch controller.",
          "fullName": "3D shooter multitouch controller mapper",
          "name": "Shooter3DMultitouchMapper",
          "objectType": "",
          "quickCustomizationVisibility": "hidden",
          "eventsFunctions": [
            {
              "fullName": "",
              "functionType": "Action",
              "name": "doStepPreEvents",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::StickForce"
                      },
                      "parameters": [
                        "",
                        ">",
                        "0",
                        "ControllerIdentifier",
                        "JoystickIdentifier",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "Physics3D::PhysicsCharacter3D::SimulateStick"
                      },
                      "parameters": [
                        "Object",
                        "PhysicsCharacter3D",
                        "SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier)",
                        "SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier)"
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::IsButtonPressed"
                      },
                      "parameters": [
                        "",
                        "ControllerIdentifier",
                        "JumpButton",
                        "\"Down\""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "Physics3D::PhysicsCharacter3D::SimulateJumpKey"
                      },
                      "parameters": [
                        "Object",
                        "PhysicsCharacter3D"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::Shooter3DMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            }
          ],
          "eventsFunctionsFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "functionName": "doStepPreEvents"
              }
            ]
          },
          "propertyDescriptors": [
            {
              "value": "",
              "type": "Behavior",
              "label": "3D physics character",
              "extraInformation": [
                "Physics3D::PhysicsCharacter3D"
              ],
              "choices": [],
              "name": "PhysicsCharacter3D"
            },
            {
              "value": "1",
              "type": "Number",
              "label": "Controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier"
            },
            {
              "value": "Primary",
              "type": "Choice",
              "label": "Walk joystick",
              "group": "Controls",
              "choices": [
                {
                  "label": "Primary",
                  "value": "Primary"
                },
                {
                  "label": "Secondary",
                  "value": "Secondary"
                }
              ],
              "name": "JoystickIdentifier"
            },
            {
              "value": "A",
              "type": "String",
              "label": "Jump button name",
              "group": "Controls",
              "name": "JumpButton"
            }
          ],
          "propertiesFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "propertyName": "PhysicsCharacter3D"
              },
              {
                "propertyName": "ControllerIdentifier"
              },
              {
                "folderName": "Controls",
                "children": [
                  {
                    "propertyName": "JoystickIdentifier"
                  },
                  {
                    "propertyName": "JumpButton"
                  }
                ]
              }
            ]
          }
        },
        {
          "description": "Control camera rotations with a multitouch controller.",
          "fullName": "First person camera multitouch controller mapper",
          "name": "FirstPersonMultitouchMapper",
          "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",
                        "=",
                        "SpriteMultitouchJoystick::AcceleratedSpeed(CurrentRotationSpeedZ, SpriteMultitouchJoystick::StickForceX(ControllerIdentifier, CameraStick) * HorizontalRotationSpeedMax, HorizontalRotationSpeedMax, HorizontalRotationAcceleration, HorizontalRotationDeceleration)"
                      ]
                    },
                    {
                      "type": {
                        "value": "SetAngle"
                      },
                      "parameters": [
                        "Object",
                        "+",
                        "CurrentRotationSpeedZ * TimeDelta()"
                      ]
                    },
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "CurrentRotationSpeedY",
                        "=",
                        "SpriteMultitouchJoystick::AcceleratedSpeed(CurrentRotationSpeedY, SpriteMultitouchJoystick::StickForceY(ControllerIdentifier, 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": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper::LookFromObjectEyes"
                      },
                      "parameters": [
                        "Object",
                        "Behavior",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper",
                  "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": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the maximum horizontal rotation speed of the object.",
              "fullName": "Maximum horizontal rotation speed",
              "functionType": "ExpressionAndCondition",
              "group": "First person camera multitouch controller 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": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "ActionWithOperator",
              "getterName": "HorizontalRotationSpeedMax",
              "group": "First person camera multitouch controller mapper horizontal rotation configuration",
              "name": "SetHorizontalRotationSpeedMax",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "HorizontalRotationSpeedMax",
                        "=",
                        "Value"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the horizontal rotation acceleration of the object.",
              "fullName": "Horizontal rotation acceleration",
              "functionType": "ExpressionAndCondition",
              "group": "First person camera multitouch controller 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": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "ActionWithOperator",
              "getterName": "HorizontalRotationAcceleration",
              "group": "First person camera multitouch controller mapper horizontal rotation configuration",
              "name": "SetHorizontalRotationAcceleration",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "HorizontalRotationAcceleration",
                        "=",
                        "Value"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the horizontal rotation deceleration of the object.",
              "fullName": "Horizontal rotation deceleration",
              "functionType": "ExpressionAndCondition",
              "group": "First person camera multitouch controller 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": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "ActionWithOperator",
              "getterName": "HorizontalRotationDeceleration",
              "group": "First person camera multitouch controller mapper horizontal rotation configuration",
              "name": "SetHorizontalRotationDeceleration",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "HorizontalRotationDeceleration",
                        "=",
                        "Value"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the maximum vertical rotation speed of the object.",
              "fullName": "Maximum vertical rotation speed",
              "functionType": "ExpressionAndCondition",
              "group": "First person camera multitouch controller 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": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "ActionWithOperator",
              "getterName": "VerticalRotationSpeedMax",
              "group": "First person camera multitouch controller mapper vertical rotation configuration",
              "name": "SetVerticalRotationSpeedMax",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "VerticalRotationSpeedMax",
                        "=",
                        "Value"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the vertical rotation acceleration of the object.",
              "fullName": "Vertical rotation acceleration",
              "functionType": "ExpressionAndCondition",
              "group": "First person camera multitouch controller 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": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "ActionWithOperator",
              "getterName": "VerticalRotationAcceleration",
              "group": "First person camera multitouch controller mapper vertical rotation configuration",
              "name": "SetVerticalRotationAcceleration",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "VerticalRotationAcceleration",
                        "=",
                        "Value"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the vertical rotation deceleration of the object.",
              "fullName": "Vertical rotation deceleration",
              "functionType": "ExpressionAndCondition",
              "group": "First person camera multitouch controller 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": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "ActionWithOperator",
              "getterName": "VerticalRotationDeceleration",
              "group": "First person camera multitouch controller mapper vertical rotation configuration",
              "name": "SetVerticalRotationDeceleration",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "VerticalRotationDeceleration",
                        "=",
                        "Value"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the minimum vertical camera angle of the object.",
              "fullName": "Minimum vertical camera angle",
              "functionType": "ExpressionAndCondition",
              "group": "First person camera multitouch controller 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": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "ActionWithOperator",
              "getterName": "VerticalAngleMin",
              "group": "First person camera multitouch controller mapper vertical rotation configuration",
              "name": "SetVerticalAngleMin",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "VerticalAngleMin",
                        "=",
                        "Value"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the maximum vertical camera angle of the object.",
              "fullName": "Maximum vertical camera angle",
              "functionType": "ExpressionAndCondition",
              "group": "First person camera multitouch controller 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": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "ActionWithOperator",
              "getterName": "VerticalAngleMax",
              "group": "First person camera multitouch controller mapper vertical rotation configuration",
              "name": "SetVerticalAngleMax",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "VerticalAngleMax",
                        "=",
                        "Value"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the z position offset of the object.",
              "fullName": "Z position offset",
              "functionType": "ExpressionAndCondition",
              "group": "First person camera multitouch controller 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": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "ActionWithOperator",
              "getterName": "OffsetZ",
              "group": "First person camera multitouch controller mapper position configuration",
              "name": "SetOffsetZ",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "OffsetZ",
                        "=",
                        "Value"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            }
          ],
          "eventsFunctionsFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "functionName": "doStepPreEvents"
              },
              {
                "folderName": "Layers and cameras",
                "children": [
                  {
                    "functionName": "LookFromObjectEyes"
                  }
                ]
              },
              {
                "folderName": "First person camera multitouch controller mapper horizontal rotation configuration",
                "children": [
                  {
                    "functionName": "HorizontalRotationSpeedMax"
                  },
                  {
                    "functionName": "SetHorizontalRotationSpeedMax"
                  },
                  {
                    "functionName": "HorizontalRotationAcceleration"
                  },
                  {
                    "functionName": "SetHorizontalRotationAcceleration"
                  },
                  {
                    "functionName": "HorizontalRotationDeceleration"
                  },
                  {
                    "functionName": "SetHorizontalRotationDeceleration"
                  }
                ]
              },
              {
                "folderName": "First person camera multitouch controller mapper vertical rotation configuration",
                "children": [
                  {
                    "functionName": "VerticalRotationSpeedMax"
                  },
                  {
                    "functionName": "SetVerticalRotationSpeedMax"
                  },
                  {
                    "functionName": "VerticalRotationAcceleration"
                  },
                  {
                    "functionName": "SetVerticalRotationAcceleration"
                  },
                  {
                    "functionName": "VerticalRotationDeceleration"
                  },
                  {
                    "functionName": "SetVerticalRotationDeceleration"
                  },
                  {
                    "functionName": "VerticalAngleMin"
                  },
                  {
                    "functionName": "SetVerticalAngleMin"
                  },
                  {
                    "functionName": "VerticalAngleMax"
                  },
                  {
                    "functionName": "SetVerticalAngleMax"
                  }
                ]
              },
              {
                "folderName": "First person camera multitouch controller mapper position configuration",
                "children": [
                  {
                    "functionName": "OffsetZ"
                  },
                  {
                    "functionName": "SetOffsetZ"
                  }
                ]
              }
            ]
          },
          "propertyDescriptors": [
            {
              "value": "",
              "type": "Behavior",
              "label": "3D capability",
              "extraInformation": [
                "Scene3D::Base3DBehavior"
              ],
              "choices": [],
              "name": "Object3D"
            },
            {
              "value": "1",
              "type": "Number",
              "label": "Controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier"
            },
            {
              "value": "Secondary",
              "type": "Choice",
              "label": "Camera joystick",
              "group": "Controls",
              "choices": [
                {
                  "label": "Primary",
                  "value": "Primary"
                },
                {
                  "label": "Secondary",
                  "value": "Secondary"
                }
              ],
              "name": "CameraStick"
            },
            {
              "value": "180",
              "type": "Number",
              "unit": "AngularSpeed",
              "label": "Maximum rotation speed",
              "group": "Horizontal rotation",
              "name": "HorizontalRotationSpeedMax"
            },
            {
              "value": "360",
              "type": "Number",
              "label": "Rotation acceleration",
              "group": "Horizontal rotation",
              "name": "HorizontalRotationAcceleration"
            },
            {
              "value": "720",
              "type": "Number",
              "label": "Rotation deceleration",
              "group": "Horizontal rotation",
              "name": "HorizontalRotationDeceleration"
            },
            {
              "value": "120",
              "type": "Number",
              "unit": "AngularSpeed",
              "label": "Maximum rotation speed",
              "group": "Vertical rotation",
              "name": "VerticalRotationSpeedMax"
            },
            {
              "value": "240",
              "type": "Number",
              "label": "Rotation acceleration",
              "group": "Vertical rotation",
              "name": "VerticalRotationAcceleration"
            },
            {
              "value": "480",
              "type": "Number",
              "label": "Rotation deceleration",
              "group": "Vertical rotation",
              "name": "VerticalRotationDeceleration"
            },
            {
              "value": "-90",
              "type": "Number",
              "unit": "DegreeAngle",
              "label": "Minimum angle",
              "group": "Vertical rotation",
              "name": "VerticalAngleMin"
            },
            {
              "value": "90",
              "type": "Number",
              "unit": "DegreeAngle",
              "label": "Maximum angle",
              "group": "Vertical rotation",
              "name": "VerticalAngleMax"
            },
            {
              "value": "0",
              "type": "Number",
              "unit": "Pixel",
              "label": "Z position offset",
              "group": "Position",
              "name": "OffsetZ"
            },
            {
              "value": "0",
              "type": "Number",
              "unit": "AngularSpeed",
              "label": "Current rotation speed Z",
              "hidden": true,
              "name": "CurrentRotationSpeedZ"
            },
            {
              "value": "0",
              "type": "Number",
              "unit": "AngularSpeed",
              "label": "Current rotation speed Y",
              "hidden": true,
              "name": "CurrentRotationSpeedY"
            }
          ],
          "propertiesFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "propertyName": "Object3D"
              },
              {
                "propertyName": "ControllerIdentifier"
              },
              {
                "folderName": "Controls",
                "children": [
                  {
                    "propertyName": "CameraStick"
                  }
                ]
              },
              {
                "folderName": "Horizontal rotation",
                "children": [
                  {
                    "propertyName": "HorizontalRotationSpeedMax"
                  },
                  {
                    "propertyName": "HorizontalRotationAcceleration"
                  },
                  {
                    "propertyName": "HorizontalRotationDeceleration"
                  }
                ]
              },
              {
                "folderName": "Vertical rotation",
                "children": [
                  {
                    "propertyName": "VerticalRotationSpeedMax"
                  },
                  {
                    "propertyName": "VerticalRotationAcceleration"
                  },
                  {
                    "propertyName": "VerticalRotationDeceleration"
                  },
                  {
                    "propertyName": "VerticalAngleMin"
                  },
                  {
                    "propertyName": "VerticalAngleMax"
                  }
                ]
              },
              {
                "folderName": "Position",
                "children": [
                  {
                    "propertyName": "OffsetZ"
                  }
                ]
              },
              {
                "propertyName": "CurrentRotationSpeedZ"
              },
              {
                "propertyName": "CurrentRotationSpeedY"
              }
            ]
          }
        },
        {
          "description": "Control a 3D physics car with a multitouch controller.",
          "fullName": "3D car multitouch controller mapper",
          "name": "PhysicsCar3DMultitouchMapper",
          "objectType": "",
          "quickCustomizationVisibility": "hidden",
          "eventsFunctions": [
            {
              "fullName": "",
              "functionType": "Action",
              "name": "doStepPreEvents",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::StickForce"
                      },
                      "parameters": [
                        "",
                        ">",
                        "0",
                        "ControllerIdentifier",
                        "SteerJoystickIdentifier",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "Physics3D::PhysicsCar3D::SimulateSteeringStick"
                      },
                      "parameters": [
                        "Object",
                        "PhysicsCar3D",
                        "SpriteMultitouchJoystick::StickForceX(ControllerIdentifier, \"Primary\")"
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::StickForce"
                      },
                      "parameters": [
                        "",
                        ">",
                        "0",
                        "ControllerIdentifier",
                        "SpeedJoystickIdentifier",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "Physics3D::PhysicsCar3D::SimulateAcceleratorStick"
                      },
                      "parameters": [
                        "Object",
                        "PhysicsCar3D",
                        "-SpriteMultitouchJoystick::StickForceY(ControllerIdentifier, \"Secondary\")"
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::IsButtonPressed"
                      },
                      "parameters": [
                        "",
                        "ControllerIdentifier",
                        "HandBrakeButton",
                        "\"Down\""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "Physics3D::PhysicsCar3D::SimulateHandBrakeKey"
                      },
                      "parameters": [
                        "Object",
                        "PhysicsCar3D"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::PhysicsCar3DMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            }
          ],
          "eventsFunctionsFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "functionName": "doStepPreEvents"
              }
            ]
          },
          "propertyDescriptors": [
            {
              "value": "",
              "type": "Behavior",
              "label": "3D physics car",
              "extraInformation": [
                "Physics3D::PhysicsCar3D"
              ],
              "choices": [],
              "name": "PhysicsCar3D"
            },
            {
              "value": "1",
              "type": "Number",
              "label": "Controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier"
            },
            {
              "value": "Primary",
              "type": "Choice",
              "label": "Steer joystick",
              "group": "Controls",
              "choices": [
                {
                  "label": "Primary",
                  "value": "Primary"
                },
                {
                  "label": "Secondary",
                  "value": "Secondary"
                }
              ],
              "name": "SteerJoystickIdentifier"
            },
            {
              "value": "Secondary",
              "type": "Choice",
              "label": "Speed joystick",
              "group": "Controls",
              "choices": [
                {
                  "label": "Primary",
                  "value": "Primary"
                },
                {
                  "label": "Secondary",
                  "value": "Secondary"
                }
              ],
              "name": "SpeedJoystickIdentifier"
            },
            {
              "value": "B",
              "type": "String",
              "label": "Hand brake button name",
              "group": "Controls",
              "name": "HandBrakeButton"
            }
          ],
          "propertiesFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "propertyName": "PhysicsCar3D"
              },
              {
                "propertyName": "ControllerIdentifier"
              },
              {
                "folderName": "Controls",
                "children": [
                  {
                    "propertyName": "SteerJoystickIdentifier"
                  },
                  {
                    "propertyName": "SpeedJoystickIdentifier"
                  },
                  {
                    "propertyName": "HandBrakeButton"
                  }
                ]
              }
            ]
          }
        },
        {
          "description": "Control a top-down character with a multitouch controller.",
          "fullName": "Top-down multitouch controller mapper",
          "name": "TopDownMultitouchMapper",
          "objectType": "",
          "quickCustomizationVisibility": "hidden",
          "eventsFunctions": [
            {
              "fullName": "",
              "functionType": "Action",
              "name": "doStepPreEvents",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "StringVariable"
                      },
                      "parameters": [
                        "StickMode",
                        "=",
                        "\"Analog\""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "TopDownMovementBehavior::SimulateStick"
                      },
                      "parameters": [
                        "Object",
                        "TopDownMovement",
                        "SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier)",
                        "SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier)"
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "StringVariable"
                      },
                      "parameters": [
                        "StickMode",
                        "=",
                        "\"360°\""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "TopDownMovementBehavior::SimulateStick"
                      },
                      "parameters": [
                        "Object",
                        "TopDownMovement",
                        "SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier)",
                        "sign(SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier))"
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "StringVariable"
                      },
                      "parameters": [
                        "StickMode",
                        "=",
                        "\"8 Directions\""
                      ]
                    }
                  ],
                  "actions": [],
                  "events": [
                    {
                      "type": "BuiltinCommonInstructions::Standard",
                      "conditions": [
                        {
                          "type": {
                            "inverted": true,
                            "value": "TopDownMovementBehavior::DiagonalsAllowed"
                          },
                          "parameters": [
                            "Object",
                            "TopDownMovement"
                          ]
                        }
                      ],
                      "actions": [],
                      "events": [
                        {
                          "type": "BuiltinCommonInstructions::Standard",
                          "conditions": [
                            {
                              "type": {
                                "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way"
                              },
                              "parameters": [
                                "",
                                "ControllerIdentifier",
                                "JoystickIdentifier",
                                "\"Left\"",
                                ""
                              ]
                            }
                          ],
                          "actions": [
                            {
                              "type": {
                                "value": "TopDownMovementBehavior::SimulateLeftKey"
                              },
                              "parameters": [
                                "Object",
                                "TopDownMovement"
                              ]
                            }
                          ]
                        },
                        {
                          "type": "BuiltinCommonInstructions::Standard",
                          "conditions": [
                            {
                              "type": {
                                "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way"
                              },
                              "parameters": [
                                "",
                                "ControllerIdentifier",
                                "JoystickIdentifier",
                                "\"Right\"",
                                ""
                              ]
                            }
                          ],
                          "actions": [
                            {
                              "type": {
                                "value": "TopDownMovementBehavior::SimulateRightKey"
                              },
                              "parameters": [
                                "Object",
                                "TopDownMovement"
                              ]
                            }
                          ]
                        },
                        {
                          "type": "BuiltinCommonInstructions::Standard",
                          "conditions": [
                            {
                              "type": {
                                "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way"
                              },
                              "parameters": [
                                "",
                                "ControllerIdentifier",
                                "JoystickIdentifier",
                                "\"Up\"",
                                ""
                              ]
                            }
                          ],
                          "actions": [
                            {
                              "type": {
                                "value": "TopDownMovementBehavior::SimulateUpKey"
                              },
                              "parameters": [
                                "Object",
                                "TopDownMovement"
                              ]
                            }
                          ]
                        },
                        {
                          "type": "BuiltinCommonInstructions::Standard",
                          "conditions": [
                            {
                              "type": {
                                "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way"
                              },
                              "parameters": [
                                "",
                                "ControllerIdentifier",
                                "JoystickIdentifier",
                                "\"Down\"",
                                ""
                              ]
                            }
                          ],
                          "actions": [
                            {
                              "type": {
                                "value": "TopDownMovementBehavior::SimulateDownKey"
                              },
                              "parameters": [
                                "Object",
                                "TopDownMovement"
                              ]
                            }
                          ]
                        }
                      ]
                    },
                    {
                      "type": "BuiltinCommonInstructions::Standard",
                      "conditions": [
                        {
                          "type": {
                            "value": "TopDownMovementBehavior::DiagonalsAllowed"
                          },
                          "parameters": [
                            "Object",
                            "TopDownMovement"
                          ]
                        }
                      ],
                      "actions": [],
                      "events": [
                        {
                          "type": "BuiltinCommonInstructions::Standard",
                          "conditions": [
                            {
                              "type": {
                                "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way"
                              },
                              "parameters": [
                                "",
                                "ControllerIdentifier",
                                "JoystickIdentifier",
                                "\"Left\"",
                                ""
                              ]
                            }
                          ],
                          "actions": [
                            {
                              "type": {
                                "value": "TopDownMovementBehavior::SimulateLeftKey"
                              },
                              "parameters": [
                                "Object",
                                "TopDownMovement"
                              ]
                            }
                          ]
                        },
                        {
                          "type": "BuiltinCommonInstructions::Standard",
                          "conditions": [
                            {
                              "type": {
                                "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way"
                              },
                              "parameters": [
                                "",
                                "ControllerIdentifier",
                                "JoystickIdentifier",
                                "\"Right\"",
                                ""
                              ]
                            }
                          ],
                          "actions": [
                            {
                              "type": {
                                "value": "TopDownMovementBehavior::SimulateRightKey"
                              },
                              "parameters": [
                                "Object",
                                "TopDownMovement"
                              ]
                            }
                          ]
                        },
                        {
                          "type": "BuiltinCommonInstructions::Standard",
                          "conditions": [
                            {
                              "type": {
                                "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way"
                              },
                              "parameters": [
                                "",
                                "ControllerIdentifier",
                                "JoystickIdentifier",
                                "\"Up\"",
                                ""
                              ]
                            }
                          ],
                          "actions": [
                            {
                              "type": {
                                "value": "TopDownMovementBehavior::SimulateUpKey"
                              },
                              "parameters": [
                                "Object",
                                "TopDownMovement"
                              ]
                            }
                          ]
                        },
                        {
                          "type": "BuiltinCommonInstructions::Standard",
                          "conditions": [
                            {
                              "type": {
                                "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way"
                              },
                              "parameters": [
                                "",
                                "ControllerIdentifier",
                                "JoystickIdentifier",
                                "\"Down\"",
                                ""
                              ]
                            }
                          ],
                          "actions": [
                            {
                              "type": {
                                "value": "TopDownMovementBehavior::SimulateDownKey"
                              },
                              "parameters": [
                                "Object",
                                "TopDownMovement"
                              ]
                            }
                          ]
                        },
                        {
                          "type": "BuiltinCommonInstructions::Standard",
                          "conditions": [
                            {
                              "type": {
                                "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way"
                              },
                              "parameters": [
                                "",
                                "ControllerIdentifier",
                                "JoystickIdentifier",
                                "\"UpLeft\"",
                                ""
                              ]
                            }
                          ],
                          "actions": [
                            {
                              "type": {
                                "value": "TopDownMovementBehavior::SimulateUpKey"
                              },
                              "parameters": [
                                "Object",
                                "TopDownMovement"
                              ]
                            },
                            {
                              "type": {
                                "value": "TopDownMovementBehavior::SimulateLeftKey"
                              },
                              "parameters": [
                                "Object",
                                "TopDownMovement"
                              ]
                            }
                          ]
                        },
                        {
                          "type": "BuiltinCommonInstructions::Standard",
                          "conditions": [
                            {
                              "type": {
                                "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way"
                              },
                              "parameters": [
                                "",
                                "ControllerIdentifier",
                                "JoystickIdentifier",
                                "\"UpRight\"",
                                ""
                              ]
                            }
                          ],
                          "actions": [
                            {
                              "type": {
                                "value": "TopDownMovementBehavior::SimulateUpKey"
                              },
                              "parameters": [
                                "Object",
                                "TopDownMovement"
                              ]
                            },
                            {
                              "type": {
                                "value": "TopDownMovementBehavior::SimulateRightKey"
                              },
                              "parameters": [
                                "Object",
                                "TopDownMovement"
                              ]
                            }
                          ]
                        },
                        {
                          "type": "BuiltinCommonInstructions::Standard",
                          "conditions": [
                            {
                              "type": {
                                "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way"
                              },
                              "parameters": [
                                "",
                                "ControllerIdentifier",
                                "JoystickIdentifier",
                                "\"DownLeft\"",
                                ""
                              ]
                            }
                          ],
                          "actions": [
                            {
                              "type": {
                                "value": "TopDownMovementBehavior::SimulateDownKey"
                              },
                              "parameters": [
                                "Object",
                                "TopDownMovement"
                              ]
                            },
                            {
                              "type": {
                                "value": "TopDownMovementBehavior::SimulateLeftKey"
                              },
                              "parameters": [
                                "Object",
                                "TopDownMovement"
                              ]
                            }
                          ]
                        },
                        {
                          "type": "BuiltinCommonInstructions::Standard",
                          "conditions": [
                            {
                              "type": {
                                "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way"
                              },
                              "parameters": [
                                "",
                                "ControllerIdentifier",
                                "JoystickIdentifier",
                                "\"DownRight\"",
                                ""
                              ]
                            }
                          ],
                          "actions": [
                            {
                              "type": {
                                "value": "TopDownMovementBehavior::SimulateDownKey"
                              },
                              "parameters": [
                                "Object",
                                "TopDownMovement"
                              ]
                            },
                            {
                              "type": {
                                "value": "TopDownMovementBehavior::SimulateRightKey"
                              },
                              "parameters": [
                                "Object",
                                "TopDownMovement"
                              ]
                            }
                          ]
                        }
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteMultitouchJoystick::TopDownMultitouchMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            }
          ],
          "eventsFunctionsFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "functionName": "doStepPreEvents"
              }
            ]
          },
          "propertyDescriptors": [
            {
              "value": "",
              "type": "Behavior",
              "label": "Top-down movement behavior",
              "extraInformation": [
                "TopDownMovementBehavior::TopDownMovementBehavior"
              ],
              "choices": [],
              "name": "TopDownMovement"
            },
            {
              "value": "1",
              "type": "Number",
              "label": "Controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier"
            },
            {
              "value": "Primary",
              "type": "Choice",
              "label": "Joystick name",
              "choices": [
                {
                  "label": "Primary",
                  "value": "Primary"
                },
                {
                  "label": "Secondary",
                  "value": "Secondary"
                }
              ],
              "name": "JoystickIdentifier"
            },
            {
              "value": "Analog",
              "type": "Choice",
              "label": "Stick mode",
              "group": "Controls",
              "choices": [
                {
                  "label": "Analog",
                  "value": "Analog"
                },
                {
                  "label": "360°",
                  "value": "360°"
                },
                {
                  "label": "8 Directions",
                  "value": "8 Directions"
                }
              ],
              "name": "StickMode"
            }
          ],
          "propertiesFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "propertyName": "TopDownMovement"
              },
              {
                "propertyName": "ControllerIdentifier"
              },
              {
                "propertyName": "JoystickIdentifier"
              },
              {
                "folderName": "Controls",
                "children": [
                  {
                    "propertyName": "StickMode"
                  }
                ]
              }
            ]
          }
        }
      ],
      "eventsBasedObjects": [
        {
          "areaMaxX": 64,
          "areaMaxY": 64,
          "areaMaxZ": 64,
          "areaMinX": 0,
          "areaMinY": 0,
          "areaMinZ": 0,
          "defaultName": "Joystick",
          "description": "Joystick for touchscreens.",
          "fullName": "Multitouch Joystick",
          "isUsingLegacyInstancesRenderer": true,
          "name": "SpriteMultitouchJoystick",
          "objects": [
            {
              "adaptCollisionMaskAutomatically": false,
              "assetStoreId": "",
              "name": "Thumb",
              "type": "Sprite",
              "updateIfNotVisible": false,
              "variables": [],
              "effects": [],
              "behaviors": [],
              "animations": [
                {
                  "name": "Idle",
                  "useMultipleDirections": false,
                  "directions": [
                    {
                      "looping": false,
                      "timeBetweenFrames": 0.08,
                      "sprites": []
                    }
                  ]
                }
              ]
            },
            {
              "adaptCollisionMaskAutomatically": false,
              "assetStoreId": "",
              "name": "Border",
              "type": "Sprite",
              "updateIfNotVisible": false,
              "variables": [],
              "effects": [],
              "behaviors": [
                {
                  "name": "MultitouchJoystick",
                  "type": "SpriteMultitouchJoystick::MultitouchJoystick",
                  "ControllerIdentifier": 1,
                  "JoystickIdentifier": "Primary",
                  "FloatingEnabled": false,
                  "DeadZoneRadius": 0.4,
                  "JoystickAngle": 0,
                  "JoystickForce": 0,
                  "TouchId": 0,
                  "TouchIndex": 0
                }
              ],
              "animations": [
                {
                  "name": "Idle",
                  "useMultipleDirections": false,
                  "directions": [
                    {
                      "looping": false,
                      "timeBetweenFrames": 0.08,
                      "sprites": []
                    }
                  ]
                }
              ]
            }
          ],
          "objectsFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "objectName": "Thumb"
              },
              {
                "objectName": "Border"
              }
            ]
          },
          "objectsGroups": [],
          "layers": [
            {
              "ambientLightColorB": 200,
              "ambientLightColorG": 200,
              "ambientLightColorR": 200,
              "camera2DPlaneMaxDrawingDistance": 5000,
              "camera3DFarPlaneDistance": 10000,
              "camera3DFieldOfView": 45,
              "camera3DNearPlaneDistance": 3,
              "cameraType": "",
              "followBaseLayerCamera": false,
              "isLightingLayer": false,
              "isLocked": false,
              "name": "",
              "renderingType": "",
              "visibility": true,
              "cameras": [
                {
                  "defaultSize": true,
                  "defaultViewport": true,
                  "height": 0,
                  "viewportBottom": 1,
                  "viewportLeft": 0,
                  "viewportRight": 1,
                  "viewportTop": 0,
                  "width": 0
                }
              ],
              "effects": []
            }
          ],
          "instances": [],
          "editionSettings": [],
          "eventsFunctions": [
            {
              "fullName": "",
              "functionType": "Action",
              "name": "onCreated",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "Create"
                      },
                      "parameters": [
                        "",
                        "Border",
                        "0",
                        "0",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "Create"
                      },
                      "parameters": [
                        "",
                        "Thumb",
                        "0",
                        "0",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "ChangePlan"
                      },
                      "parameters": [
                        "Border",
                        "=",
                        "1"
                      ]
                    },
                    {
                      "type": {
                        "value": "ChangePlan"
                      },
                      "parameters": [
                        "Thumb",
                        "=",
                        "2"
                      ]
                    },
                    {
                      "type": {
                        "value": "SetCenter"
                      },
                      "parameters": [
                        "Border",
                        "=",
                        "0",
                        "=",
                        "0"
                      ]
                    },
                    {
                      "type": {
                        "value": "SetCenter"
                      },
                      "parameters": [
                        "Thumb",
                        "=",
                        "0",
                        "=",
                        "0"
                      ]
                    },
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::UpdateConfiguration"
                      },
                      "parameters": [
                        "Object",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "SetIncludedInParentCollisionMask"
                      },
                      "parameters": [
                        "Thumb",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "Action",
              "name": "doStepPostEvents",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "inverted": true,
                        "value": "SpriteMultitouchJoystick::IsInGameEdition"
                      },
                      "parameters": [
                        "",
                        ""
                      ]
                    }
                  ],
                  "actions": [],
                  "events": [
                    {
                      "type": "BuiltinCommonInstructions::Standard",
                      "conditions": [],
                      "actions": [
                        {
                          "type": {
                            "value": "MettreAutour"
                          },
                          "parameters": [
                            "Thumb",
                            "Border",
                            "Border.MultitouchJoystick::JoystickForce() * Border.Width() / 2",
                            "Border.MultitouchJoystick::JoystickAngle()"
                          ]
                        }
                      ]
                    },
                    {
                      "type": "BuiltinCommonInstructions::Standard",
                      "conditions": [
                        {
                          "type": {
                            "value": "BooleanVariable"
                          },
                          "parameters": [
                            "ShouldBeHiddenWhenReleased",
                            "True",
                            ""
                          ]
                        },
                        {
                          "type": {
                            "inverted": true,
                            "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::IsPressed"
                          },
                          "parameters": [
                            "Object",
                            ""
                          ]
                        }
                      ],
                      "actions": [
                        {
                          "type": {
                            "value": "Cache"
                          },
                          "parameters": [
                            "Object"
                          ]
                        },
                        {
                          "type": {
                            "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::ActivateControl"
                          },
                          "parameters": [
                            "Object",
                            "no",
                            ""
                          ]
                        },
                        {
                          "type": {
                            "value": "SetBooleanVariable"
                          },
                          "parameters": [
                            "ShouldBeHiddenWhenReleased",
                            "False",
                            ""
                          ]
                        }
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "Action",
              "name": "onHotReloading",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::UpdateConfiguration"
                      },
                      "parameters": [
                        "Object",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Pass the object property values to the behavior.",
              "fullName": "Update configuration",
              "functionType": "Action",
              "name": "UpdateConfiguration",
              "private": true,
              "sentence": "Update the configuration of _PARAM0_",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetControllerIdentifier"
                      },
                      "parameters": [
                        "Border",
                        "MultitouchJoystick",
                        "=",
                        "ControllerIdentifier",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickIdentifier"
                      },
                      "parameters": [
                        "Border",
                        "MultitouchJoystick",
                        "=",
                        "JoystickIdentifier",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetDeadZoneRadius"
                      },
                      "parameters": [
                        "Border",
                        "MultitouchJoystick",
                        "=",
                        "DeadZoneRadius",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Show the joystick until it is released.",
              "fullName": "Show and start pressing",
              "functionType": "Action",
              "name": "TeleportAndPress",
              "sentence": "Show _PARAM0_ at the cursor position and start pressing",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "HasAnyTouchOrMouseStarted"
                      },
                      "parameters": [
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "MettreXY"
                      },
                      "parameters": [
                        "Object",
                        "=",
                        "Object.ParentTouchX(StartedTouchOrMouseId(0))",
                        "=",
                        "Object.ParentTouchY(StartedTouchOrMouseId(0))"
                      ]
                    },
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::ActivateControl"
                      },
                      "parameters": [
                        "Object",
                        "yes",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "Montre"
                      },
                      "parameters": [
                        "Object",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "SetBooleanVariable"
                      },
                      "parameters": [
                        "ShouldBeHiddenWhenReleased",
                        "True",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::MultitouchJoystick::ForceStartPressing"
                      },
                      "parameters": [
                        "Border",
                        "MultitouchJoystick",
                        "StartedTouchOrMouseId(0)",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Return the X position of a specified touch",
              "fullName": "Touch X position (on parent)",
              "functionType": "Expression",
              "name": "ParentTouchX",
              "private": true,
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": []
                },
                {
                  "type": "BuiltinCommonInstructions::JsCode",
                  "inlineCode": [
                    "const object = objects[0];",
                    "const touchId = eventsFunctionContext.getArgument(\"TouchId\");",
                    "eventsFunctionContext.returnValue = gdjs.evtTools.input.getTouchX(object.getInstanceContainer(), touchId, object.getLayer());"
                  ],
                  "parameterObjects": "Object",
                  "useStrict": true,
                  "eventsSheetExpanded": false
                }
              ],
              "expressionType": {
                "type": "expression"
              },
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                },
                {
                  "description": "Touch identifier",
                  "name": "TouchId",
                  "type": "expression"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Return the X position of a specified touch",
              "fullName": "Touch X position (on parent)",
              "functionType": "Expression",
              "name": "ParentTouchY",
              "private": true,
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": []
                },
                {
                  "type": "BuiltinCommonInstructions::JsCode",
                  "inlineCode": [
                    "const object = objects[0];",
                    "const touchId = eventsFunctionContext.getArgument(\"TouchId\");",
                    "eventsFunctionContext.returnValue = gdjs.evtTools.input.getTouchY(object.getInstanceContainer(), touchId, object.getLayer());"
                  ],
                  "parameterObjects": "Object",
                  "useStrict": true,
                  "eventsSheetExpanded": false
                }
              ],
              "expressionType": {
                "type": "expression"
              },
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                },
                {
                  "description": "Touch identifier",
                  "name": "TouchId",
                  "type": "expression"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "De/activate control of the joystick.",
              "fullName": "De/activate control",
              "functionType": "Action",
              "name": "ActivateControl",
              "sentence": "Activate control of _PARAM0_: _PARAM1_",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "inverted": true,
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "ShouldActivate",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "ActivateBehavior"
                      },
                      "parameters": [
                        "Border",
                        "MultitouchJoystick",
                        "no"
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "ShouldActivate",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "ActivateBehavior"
                      },
                      "parameters": [
                        "Border",
                        "MultitouchJoystick",
                        "yes"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                },
                {
                  "description": "Activate",
                  "name": "ShouldActivate",
                  "type": "yesorno"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check if a stick is pressed.",
              "fullName": "Stick pressed",
              "functionType": "Condition",
              "name": "IsPressed",
              "sentence": "Stick _PARAM0_ is pressed",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::MultitouchJoystick::IsPressed"
                      },
                      "parameters": [
                        "Border",
                        "MultitouchJoystick",
                        "!="
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the joystick force (from 0 to 1).",
              "fullName": "Joystick force (deprecated)",
              "functionType": "ExpressionAndCondition",
              "name": "JoystickForce",
              "private": true,
              "sentence": "the joystick force",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnNumber"
                      },
                      "parameters": [
                        "Border.MultitouchJoystick::JoystickForce()"
                      ]
                    }
                  ]
                }
              ],
              "expressionType": {
                "type": "expression"
              },
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the strick force (from 0 to 1).",
              "fullName": "Stick force",
              "functionType": "ExpressionAndCondition",
              "name": "StickForce",
              "sentence": "the stick force",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnNumber"
                      },
                      "parameters": [
                        "Border.MultitouchJoystick::JoystickForce()"
                      ]
                    }
                  ]
                }
              ],
              "expressionType": {
                "type": "expression"
              },
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the stick force on X axis (from -1 at the left to 1 at the right).",
              "fullName": "Stick X force",
              "functionType": "ExpressionAndCondition",
              "name": "StickForceX",
              "sentence": "the stick X force",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnNumber"
                      },
                      "parameters": [
                        "Border.MultitouchJoystick::StickForceX()"
                      ]
                    }
                  ]
                }
              ],
              "expressionType": {
                "type": "expression"
              },
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the stick force on Y axis (from -1 at the top to 1 at the bottom).",
              "fullName": "Stick Y force",
              "functionType": "ExpressionAndCondition",
              "name": "StickForceY",
              "sentence": "the stick Y force",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnNumber"
                      },
                      "parameters": [
                        "Border.MultitouchJoystick::StickForceY()"
                      ]
                    }
                  ]
                }
              ],
              "expressionType": {
                "type": "expression"
              },
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Return the angle the joystick is pointing towards (from -180 to 180).",
              "fullName": "Joystick angle (deprecated)",
              "functionType": "Expression",
              "name": "JoystickAngle",
              "private": true,
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnNumber"
                      },
                      "parameters": [
                        "Border.MultitouchJoystick::JoystickAngle()"
                      ]
                    }
                  ]
                }
              ],
              "expressionType": {
                "type": "expression"
              },
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Return the angle the stick is pointing towards (from -180 to 180).",
              "fullName": "Stick angle",
              "functionType": "Expression",
              "name": "StickAngle",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnNumber"
                      },
                      "parameters": [
                        "Border.MultitouchJoystick::JoystickAngle()"
                      ]
                    }
                  ]
                }
              ],
              "expressionType": {
                "type": "expression"
              },
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check if joystick is pushed in a given direction.",
              "fullName": "Joystick pushed in a direction (4-way movement)",
              "functionType": "Condition",
              "name": "IsDirectionPushed4Way",
              "sentence": "_PARAM0_ is pushed in direction _PARAM1_",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::MultitouchJoystick::IsDirectionPushed4Way"
                      },
                      "parameters": [
                        "Border",
                        "MultitouchJoystick",
                        "Direction",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                },
                {
                  "description": "Direction",
                  "name": "Direction",
                  "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]",
                  "type": "stringWithSelector"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check if joystick is pushed in a given direction.",
              "fullName": "Joystick pushed in a direction (8-way movement)",
              "functionType": "Condition",
              "name": "IsDirectionPushed8Way",
              "sentence": "_PARAM0_ is pushed in direction _PARAM1_",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::MultitouchJoystick::IsDirectionPushed8Way"
                      },
                      "parameters": [
                        "Border",
                        "MultitouchJoystick",
                        "Direction",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                },
                {
                  "description": "Direction",
                  "name": "Direction",
                  "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]",
                  "type": "stringWithSelector"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the multitouch controller identifier (1, 2, 3, 4...).",
              "fullName": "Multitouch controller identifier",
              "functionType": "ExpressionAndCondition",
              "group": "Multitouch Joystick configuration",
              "name": "ControllerIdentifier",
              "sentence": "the multitouch controller identifier",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnNumber"
                      },
                      "parameters": [
                        "Border.MultitouchJoystick::PropertyControllerIdentifier()"
                      ]
                    }
                  ]
                }
              ],
              "expressionType": {
                "type": "expression"
              },
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "ActionWithOperator",
              "getterName": "ControllerIdentifier",
              "group": "Multitouch Joystick configuration",
              "name": "SetControllerIdentifier",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetControllerIdentifier"
                      },
                      "parameters": [
                        "Border",
                        "MultitouchJoystick",
                        "=",
                        "Value",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the joystick name of the object.",
              "fullName": "Joystick name",
              "functionType": "ExpressionAndCondition",
              "group": "Multitouch Joystick configuration",
              "name": "JoystickIdentifier",
              "sentence": "the joystick name",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnString"
                      },
                      "parameters": [
                        "Border.MultitouchJoystick::PropertyJoystickIdentifier()"
                      ]
                    }
                  ]
                }
              ],
              "expressionType": {
                "type": "string"
              },
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "ActionWithOperator",
              "getterName": "JoystickIdentifier",
              "group": "Multitouch Joystick configuration",
              "name": "SetJoystickIdentifier",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickIdentifier"
                      },
                      "parameters": [
                        "Border",
                        "MultitouchJoystick",
                        "=",
                        "Value",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the dead zone radius of the joystick (range: 0 to 1). 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).",
              "fullName": "Dead zone radius",
              "functionType": "ExpressionAndCondition",
              "group": "Multitouch Joystick configuration",
              "name": "DeadZoneRadius",
              "sentence": "the dead zone radius",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnNumber"
                      },
                      "parameters": [
                        "Border.MultitouchJoystick::PropertyDeadZoneRadius()"
                      ]
                    }
                  ]
                }
              ],
              "expressionType": {
                "type": "expression"
              },
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "ActionWithOperator",
              "getterName": "DeadZoneRadius",
              "group": "Multitouch Joystick configuration",
              "name": "SetDeadZoneRadius",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetDeadZoneRadius"
                      },
                      "parameters": [
                        "Border",
                        "MultitouchJoystick",
                        "=",
                        "Value",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick",
                  "type": "object"
                }
              ],
              "objectGroups": []
            }
          ],
          "eventsFunctionsFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "functionName": "onCreated"
              },
              {
                "functionName": "doStepPostEvents"
              },
              {
                "functionName": "onHotReloading"
              },
              {
                "functionName": "UpdateConfiguration"
              },
              {
                "functionName": "TeleportAndPress"
              },
              {
                "functionName": "ParentTouchX"
              },
              {
                "functionName": "ParentTouchY"
              },
              {
                "functionName": "ActivateControl"
              },
              {
                "functionName": "IsPressed"
              },
              {
                "functionName": "JoystickForce"
              },
              {
                "functionName": "StickForce"
              },
              {
                "functionName": "StickForceX"
              },
              {
                "functionName": "StickForceY"
              },
              {
                "functionName": "JoystickAngle"
              },
              {
                "functionName": "StickAngle"
              },
              {
                "functionName": "IsDirectionPushed4Way"
              },
              {
                "functionName": "IsDirectionPushed8Way"
              },
              {
                "folderName": "Multitouch Joystick configuration",
                "children": [
                  {
                    "functionName": "ControllerIdentifier"
                  },
                  {
                    "functionName": "SetControllerIdentifier"
                  },
                  {
                    "functionName": "JoystickIdentifier"
                  },
                  {
                    "functionName": "SetJoystickIdentifier"
                  },
                  {
                    "functionName": "DeadZoneRadius"
                  },
                  {
                    "functionName": "SetDeadZoneRadius"
                  }
                ]
              }
            ]
          },
          "propertyDescriptors": [
            {
              "value": "1",
              "type": "Number",
              "label": "Multitouch controller identifier (1, 2, 3, 4...)",
              "name": "ControllerIdentifier"
            },
            {
              "value": "Primary",
              "type": "Choice",
              "label": "Joystick name",
              "choices": [
                {
                  "label": "Primary",
                  "value": "Primary"
                },
                {
                  "label": "Secondary",
                  "value": "Secondary"
                }
              ],
              "name": "JoystickIdentifier"
            },
            {
              "value": "0.4",
              "type": "Number",
              "label": "Dead zone radius (range: 0 to 1)",
              "description": "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)",
              "name": "DeadZoneRadius"
            },
            {
              "value": "Center-center",
              "type": "String",
              "label": "",
              "description": "Only used by the scene editor.",
              "extraInformation": [
                "Thumb"
              ],
              "choices": [],
              "hidden": true,
              "name": "ThumbAnchorOrigin"
            },
            {
              "value": "Center-center",
              "type": "Number",
              "label": "",
              "description": "Only used by the scene editor.",
              "hidden": true,
              "name": "ThumbAnchorTarget"
            },
            {
              "value": "true",
              "type": "Boolean",
              "label": "",
              "description": "Only used by the scene editor.",
              "extraInformation": [
                "Thumb"
              ],
              "choices": [],
              "hidden": true,
              "name": "ThumbIsScaledProportionally"
            },
            {
              "value": "Center-center",
              "type": "String",
              "label": "",
              "description": "Only used by the scene editor.",
              "hidden": true,
              "name": "ParentOrigin"
            },
            {
              "value": "",
              "type": "Boolean",
              "label": "",
              "hidden": true,
              "name": "ShouldBeHiddenWhenReleased"
            }
          ],
          "propertiesFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "propertyName": "ControllerIdentifier"
              },
              {
                "propertyName": "JoystickIdentifier"
              },
              {
                "propertyName": "DeadZoneRadius"
              },
              {
                "propertyName": "ThumbAnchorOrigin"
              },
              {
                "propertyName": "ThumbAnchorTarget"
              },
              {
                "propertyName": "ThumbIsScaledProportionally"
              },
              {
                "propertyName": "ParentOrigin"
              },
              {
                "propertyName": "ShouldBeHiddenWhenReleased"
              }
            ]
          },
          "variants": []
        }
      ]
    },
    {
      "author": "",
      "category": "Camera",
      "dimension": "",
      "extensionNamespace": "",
      "fullName": "First person 3D camera",
      "gdevelopVersion": ">=5.5.222",
      "helpPath": "",
      "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQoJLnN0MXtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwO30NCjwvc3R5bGU+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjcsMTZjMCwwLTQuOSw3LTExLDdTNSwxNiw1LDE2czQuOS03LDExLTdTMjcsMTYsMjcsMTZ6Ii8+DQo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxNiIgY3k9IjE2IiByPSIzIi8+DQo8cG9seWxpbmUgY2xhc3M9InN0MCIgcG9pbnRzPSIzLDkgMywzIDksMyAiLz4NCjxwb2x5bGluZSBjbGFzcz0ic3QwIiBwb2ludHM9IjksMjkgMywyOSAzLDIzICIvPg0KPHBvbHlsaW5lIGNsYXNzPSJzdDAiIHBvaW50cz0iMjksMjMgMjksMjkgMjMsMjkgIi8+DQo8cG9seWxpbmUgY2xhc3M9InN0MCIgcG9pbnRzPSIyMywzIDI5LDMgMjksOSAiLz4NCjwvc3ZnPg0K",
      "name": "FirstPersonCamera",
      "previewIconUrl": "https://asset-resources.gdevelop.io/public-resources/Icons/Line Hero Pack/Master/SVG/Security and Protection/e8248ffd504c314e6a9d9d560c3a0fdad3398a5f125ae6a4c0654d4e68c86376_Security and Protection_security_protection_eye_scan_lock.svg",
      "shortDescription": "Move the camera to look though objects eyes.",
      "version": "1.0.4",
      "description": [
        "Move the camera to look though objects eyes.",
        "",
        "This extension can be used with the \"Mouse pointer lock\" or \"Gamepad\" extension to build a first person camera.",
        "",
        "The first person example uses this extension ([open the project online](https://editor.gdevelop.io/?project=example://3d-first-person))."
      ],
      "origin": {
        "identifier": "FirstPersonCamera",
        "name": "gdevelop-extension-store"
      },
      "tags": [
        "3d",
        "camera",
        "fps"
      ],
      "authorIds": [
        "IWykYNRvhCZBN3vEgKEbBPOR3Oc2",
        "m8kleQHonagHWsvILDhyJhgVhuF2"
      ],
      "dependencies": [],
      "globalVariables": [],
      "sceneVariables": [],
      "eventsFunctions": [
        {
          "description": "Move the camera to look though the object 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 of _PARAM2_ to look though _PARAM1_ eyes",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [],
              "actions": [
                {
                  "type": {
                    "value": "CentreCamera"
                  },
                  "parameters": [
                    "",
                    "Object",
                    "",
                    "Layer",
                    ""
                  ]
                },
                {
                  "type": {
                    "value": "Scene3D::SetCameraZ"
                  },
                  "parameters": [
                    "",
                    "=",
                    "Object.Z()",
                    "Layer",
                    ""
                  ]
                },
                {
                  "type": {
                    "value": "Scene3D::SetCameraRotationX"
                  },
                  "parameters": [
                    "",
                    "=",
                    "- Object.RotationY() + 90",
                    "Layer",
                    ""
                  ]
                },
                {
                  "type": {
                    "value": "Scene3D::SetCameraRotationY"
                  },
                  "parameters": [
                    "",
                    "=",
                    "Object.RotationX()",
                    "Layer",
                    ""
                  ]
                },
                {
                  "type": {
                    "value": "SetCameraAngle"
                  },
                  "parameters": [
                    "",
                    "=",
                    "Object.Angle() + 90",
                    "Layer",
                    ""
                  ]
                }
              ]
            }
          ],
          "parameters": [
            {
              "description": "Object",
              "name": "Object",
              "supplementaryInformation": "Scene3D::Cube3DObject",
              "type": "objectList"
            },
            {
              "description": "Layer",
              "name": "Layer",
              "type": "layer"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "Move the camera to look though the object 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": "LookFrom3DObjectEyes",
          "sentence": "Move the camera of _PARAM3_ to look though _PARAM1_ eyes",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [],
              "actions": [
                {
                  "type": {
                    "value": "CentreCamera"
                  },
                  "parameters": [
                    "",
                    "Object",
                    "",
                    "Layer",
                    ""
                  ]
                },
                {
                  "type": {
                    "value": "Scene3D::SetCameraZ"
                  },
                  "parameters": [
                    "",
                    "=",
                    "Object.Object3D::Z()",
                    "Layer",
                    ""
                  ]
                },
                {
                  "type": {
                    "value": "Scene3D::SetCameraRotationX"
                  },
                  "parameters": [
                    "",
                    "=",
                    "- Object.Object3D::RotationY() + 90",
                    "Layer",
                    ""
                  ]
                },
                {
                  "type": {
                    "value": "Scene3D::SetCameraRotationY"
                  },
                  "parameters": [
                    "",
                    "=",
                    "Object.Object3D::RotationX()",
                    "Layer",
                    ""
                  ]
                },
                {
                  "type": {
                    "value": "SetCameraAngle"
                  },
                  "parameters": [
                    "",
                    "=",
                    "Object.Angle() + 90",
                    "Layer",
                    ""
                  ]
                }
              ]
            }
          ],
          "parameters": [
            {
              "description": "3D Object",
              "name": "Object",
              "type": "objectList"
            },
            {
              "description": "3D capability",
              "name": "Object3D",
              "supplementaryInformation": "Scene3D::Base3DBehavior",
              "type": "behavior"
            },
            {
              "description": "Layer",
              "name": "Layer",
              "type": "layer"
            }
          ],
          "objectGroups": []
        }
      ],
      "eventsFunctionsFolderStructure": {
        "folderName": "__ROOT",
        "children": [
          {
            "folderName": "Layers and cameras",
            "children": [
              {
                "functionName": "LookFromObjectEyes"
              },
              {
                "functionName": "LookFrom3DObjectEyes"
              }
            ]
          }
        ]
      },
      "eventsBasedBehaviors": [],
      "eventsBasedObjects": []
    },
    {
      "author": "PANDAKO-GitHub",
      "category": "Input",
      "dimension": "",
      "extensionNamespace": "",
      "fullName": "Mouse Pointer Lock",
      "gdevelopVersion": ">=5.5.222",
      "helpPath": "",
      "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPHBvbHlsaW5lIGNsYXNzPSJzdDAiIHBvaW50cz0iMTksMTkgMjQsMTkgMjQsMjQgIi8+DQo8cG9seWxpbmUgY2xhc3M9InN0MCIgcG9pbnRzPSI2LDIzIDExLDIzIDExLDE4ICIvPg0KPHBhdGggY2xhc3M9InN0MCIgZD0iTTI0LDE5LjRjLTAuNywwLjgtMS40LDEuNi0yLjIsMi40Yy03LDctMTUuMywxMC4yLTE4LjUsN3MtMC4xLTExLjUsNy0xOC41czE1LjMtMTAuMiwxOC41LTcNCgljMS40LDEuNCwxLjYsMy42LDAuOCw2LjMiLz4NCjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMSwyMi41Yy0wLjMtMC4yLTAuNS0wLjUtMC44LTAuOGMtNy03LTEwLjItMTUuMy03LTE4LjVzMTEuNS0wLjEsMTguNSw3czEwLjIsMTUuMyw3LDE4LjUNCgljLTEuNywxLjctNC44LDEuNi04LjQsMC4xIi8+DQo8L3N2Zz4NCg==",
      "name": "MousePointerLock",
      "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Virtual Reality/Virtual Reality_360_rotate_vr_movement.svg",
      "shortDescription": "This behavior removes the limit on the distance the mouse can move and hides the cursor.",
      "version": "0.3.0",
      "description": [
        "This behavior removes the limit on the distance the mouse can move and hides the cursor.",
        "",
        "For example, a user can rotate or continue to manipulate an object by moving the mouse endlessly ([open the project online](https://editor.gdevelop.io/?project=example://mouse-pointer-lock)).",
        "Without the pointer lock, the rotation or operation will stop the moment the pointer reaches the edge of the browser or screen.",
        "",
        "Game players don't have to worry about leaving the gameplay area or accidentally clicking on another application that moves the mouse focus away from the game.",
        "",
        "Locking the pointer locks `CursorX()` and `CursorY()` expressions.",
        "Use `MovementX()` and `MovementY()` instead.",
        ""
      ],
      "origin": {
        "identifier": "MousePointerLock",
        "name": "gdevelop-extension-store"
      },
      "tags": [
        "mouse",
        "lock",
        "cursor",
        "pointer"
      ],
      "authorIds": [
        "Zu55H5hcb9YmZTltIVOTAFDJQyB2",
        "IWykYNRvhCZBN3vEgKEbBPOR3Oc2"
      ],
      "dependencies": [],
      "globalVariables": [],
      "sceneVariables": [
        {
          "name": "TouchId",
          "type": "number",
          "value": -1
        },
        {
          "name": "OldX",
          "type": "number",
          "value": 0
        },
        {
          "name": "OldY",
          "type": "number",
          "value": 0
        },
        {
          "name": "TouchSpeedFactor",
          "type": "number",
          "value": 4
        }
      ],
      "eventsFunctions": [
        {
          "fullName": "",
          "functionType": "Action",
          "name": "onFirstSceneLoaded",
          "sentence": "",
          "events": [
            {
              "type": "BuiltinCommonInstructions::JsCode",
              "inlineCode": [
                "class PointerLockHandler {",
                "    movementX = 0;",
                "    movementY = 0;",
                "    retried = false;",
                "    /**",
                "     * @type {gdjs.RuntimeGame}",
                "     */",
                "    game;",
                "",
                "    /**",
                "     * @param {gdjs.RuntimeGame} game",
                "     */",
                "    constructor(game) {",
                "        this.game = game;",
                "        const canvas = game.getRenderer().getCanvas();",
                "",
                "        canvas.addEventListener(\"pointermove\", event => {",
                "            if (!!document.pointerLockElement) {",
                "                this.movementX += event.movementX || 0;",
                "                this.movementY += event.movementY || 0;",
                "            }",
                "        }, false);",
                "",
                "        document.addEventListener(\"pointerlockerror\", event => {",
                "            if (!this.retried) {",
                "                canvas.requestPointerLock();",
                "                this.retried = true;",
                "            }",
                "        });",
                "    }",
                "",
                "    requestPointerLock() {",
                "        const canvas = this.game.getRenderer().getCanvas();",
                "        if (canvas.requestPointerLock && !document.pointerLockElement) {",
                "            this.retried = false;",
                "            canvas.requestPointerLock({ unadjustedMovement: true });",
                "        }",
                "    }",
                "",
                "    exitPointerLock() {",
                "        if (document.exitPointerLock) {",
                "            document.exitPointerLock();",
                "        }",
                "    }",
                "",
                "    isPointerLocked() {",
                "        return !!document.pointerLockElement;",
                "    }",
                "",
                "    resetMovement() {",
                "        this.movementX = 0;",
                "        this.movementY = 0;",
                "    }",
                "};",
                "",
                "gdjs._MousePointerLockExtension = { handler: new PointerLockHandler(runtimeScene.getGame()) };",
                ""
              ],
              "parameterObjects": "",
              "useStrict": true,
              "eventsSheetExpanded": true
            }
          ],
          "parameters": [],
          "objectGroups": []
        },
        {
          "fullName": "",
          "functionType": "Action",
          "name": "onScenePostEvents",
          "sentence": "",
          "events": [
            {
              "type": "BuiltinCommonInstructions::JsCode",
              "inlineCode": [
                "const { handler } = gdjs._MousePointerLockExtension;\r",
                "\r",
                "handler.resetMovement();\r",
                ""
              ],
              "parameterObjects": "",
              "useStrict": true,
              "eventsSheetExpanded": false
            },
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "MousePointerLock::isEmulatingPointerLock"
                  },
                  "parameters": [
                    "",
                    ""
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "MousePointerLock::SetMovementX"
                  },
                  "parameters": [
                    "",
                    "=",
                    "(MousePointerLock::TouchX(TouchId) - OldX) * TouchSpeedFactor",
                    ""
                  ]
                },
                {
                  "type": {
                    "value": "MousePointerLock::SetMovementY"
                  },
                  "parameters": [
                    "",
                    "=",
                    "(MousePointerLock::TouchY(TouchId) - OldY) * TouchSpeedFactor",
                    ""
                  ]
                },
                {
                  "type": {
                    "value": "SetNumberVariable"
                  },
                  "parameters": [
                    "OldX",
                    "=",
                    "MousePointerLock::TouchX(TouchId)"
                  ]
                },
                {
                  "type": {
                    "value": "SetNumberVariable"
                  },
                  "parameters": [
                    "OldY",
                    "=",
                    "MousePointerLock::TouchY(TouchId)"
                  ]
                }
              ]
            },
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "HasTouchEnded"
                  },
                  "parameters": [
                    "",
                    "TouchId"
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetNumberVariable"
                  },
                  "parameters": [
                    "TouchId",
                    "=",
                    "-1"
                  ]
                }
              ]
            }
          ],
          "parameters": [],
          "objectGroups": []
        },
        {
          "description": "Lock the mouse pointer to hide it.",
          "fullName": "Request Pointer Lock",
          "functionType": "Action",
          "name": "RequestPointerLock",
          "sentence": "Request Pointer Lock",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "HasAnyTouchOrMouseStarted"
                  },
                  "parameters": [
                    ""
                  ]
                },
                {
                  "type": {
                    "value": "NumberVariable"
                  },
                  "parameters": [
                    "TouchId",
                    "=",
                    "-1"
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetNumberVariable"
                  },
                  "parameters": [
                    "TouchId",
                    "=",
                    "StartedTouchOrMouseId(0)"
                  ]
                },
                {
                  "type": {
                    "value": "SetNumberVariable"
                  },
                  "parameters": [
                    "OldX",
                    "=",
                    "MousePointerLock::TouchX(TouchId)"
                  ]
                },
                {
                  "type": {
                    "value": "SetNumberVariable"
                  },
                  "parameters": [
                    "OldY",
                    "=",
                    "MousePointerLock::TouchY(TouchId)"
                  ]
                }
              ]
            },
            {
              "type": "BuiltinCommonInstructions::JsCode",
              "inlineCode": [
                "const { handler } = gdjs._MousePointerLockExtension;\r",
                "\r",
                "handler.requestPointerLock();\r",
                ""
              ],
              "parameterObjects": "",
              "useStrict": true,
              "eventsSheetExpanded": false
            }
          ],
          "parameters": [],
          "objectGroups": []
        },
        {
          "description": "Unlocks the mouse pointer and show it.",
          "fullName": "Exit pointer lock",
          "functionType": "Action",
          "name": "ExitPointerLock",
          "sentence": "Exit pointer lock",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [],
              "actions": [
                {
                  "type": {
                    "value": "SetNumberVariable"
                  },
                  "parameters": [
                    "TouchId",
                    "=",
                    "-1"
                  ]
                }
              ]
            },
            {
              "type": "BuiltinCommonInstructions::JsCode",
              "inlineCode": [
                "\r",
                "const { handler } = gdjs._MousePointerLockExtension;\r",
                "\r",
                "handler.exitPointerLock();\r",
                ""
              ],
              "parameterObjects": "",
              "useStrict": true,
              "eventsSheetExpanded": false
            }
          ],
          "parameters": [],
          "objectGroups": []
        },
        {
          "description": "Check if the mouse pointer is locked.",
          "fullName": "Pointer is locked",
          "functionType": "Condition",
          "name": "isPointerLocked",
          "sentence": "The mouse pointer is locked",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "NumberVariable"
                  },
                  "parameters": [
                    "TouchId",
                    ">=",
                    "0"
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnBoolean"
                  },
                  "parameters": [
                    "True"
                  ]
                }
              ]
            },
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "NumberVariable"
                  },
                  "parameters": [
                    "TouchId",
                    "<",
                    "0"
                  ]
                },
                {
                  "type": {
                    "value": "MousePointerLock::isPointerActuallyLocked"
                  },
                  "parameters": [
                    "",
                    ""
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnBoolean"
                  },
                  "parameters": [
                    "True"
                  ]
                }
              ]
            }
          ],
          "parameters": [],
          "objectGroups": []
        },
        {
          "description": "Check if the mouse pointer is actually locked.",
          "fullName": "Pointer is actually locked",
          "functionType": "Condition",
          "name": "isPointerActuallyLocked",
          "private": true,
          "sentence": "The mouse pointer actually is locked",
          "events": [
            {
              "type": "BuiltinCommonInstructions::JsCode",
              "inlineCode": [
                "\r",
                "const { handler } = gdjs._MousePointerLockExtension;\r",
                "\r",
                "eventsFunctionContext.returnValue = handler.isPointerLocked();\r",
                ""
              ],
              "parameterObjects": "",
              "useStrict": true,
              "eventsSheetExpanded": false
            }
          ],
          "parameters": [],
          "objectGroups": []
        },
        {
          "description": "Check if the mouse pointer lock is emulated.",
          "fullName": "Pointer lock is emulated",
          "functionType": "Condition",
          "name": "isEmulatingPointerLock",
          "private": true,
          "sentence": "The mouse pointer is lock is emulated",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "inverted": true,
                    "value": "MousePointerLock::isPointerActuallyLocked"
                  },
                  "parameters": [
                    "",
                    ""
                  ]
                },
                {
                  "type": {
                    "value": "NumberVariable"
                  },
                  "parameters": [
                    "TouchId",
                    ">=",
                    "0"
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnBoolean"
                  },
                  "parameters": [
                    "True"
                  ]
                }
              ]
            }
          ],
          "parameters": [],
          "objectGroups": []
        },
        {
          "description": "Check if the locked pointer is moving.",
          "fullName": "Locked pointer is moving",
          "functionType": "Condition",
          "name": "IsMoving",
          "sentence": "Locked pointer is moving",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [
                {
                  "type": {
                    "value": "BuiltinCommonInstructions::Or"
                  },
                  "parameters": [],
                  "subInstructions": [
                    {
                      "type": {
                        "value": "MousePointerLock::MovementX"
                      },
                      "parameters": [
                        "",
                        "!=",
                        "0",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "MousePointerLock::MovementY"
                      },
                      "parameters": [
                        "",
                        "!=",
                        "0",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnBoolean"
                  },
                  "parameters": [
                    "True"
                  ]
                }
              ]
            }
          ],
          "parameters": [],
          "objectGroups": []
        },
        {
          "description": "the movement of the locked pointer on the X axis.",
          "fullName": "Pointer X movement",
          "functionType": "ExpressionAndCondition",
          "name": "MovementX",
          "sentence": "the movement of the locked pointer on the X axis",
          "events": [
            {
              "type": "BuiltinCommonInstructions::JsCode",
              "inlineCode": [
                "\r",
                "eventsFunctionContext.returnValue = gdjs._MousePointerLockExtension.handler.movementX || 0;\r",
                ""
              ],
              "parameterObjects": "",
              "useStrict": true,
              "eventsSheetExpanded": false
            }
          ],
          "expressionType": {
            "type": "expression"
          },
          "parameters": [],
          "objectGroups": []
        },
        {
          "description": "the movement of the locked pointer on the X axis.",
          "fullName": "Pointer X movement",
          "functionType": "ActionWithOperator",
          "getterName": "MovementX",
          "name": "SetMovementX",
          "private": true,
          "sentence": "the movement of the locked pointer on the X axis",
          "events": [
            {
              "type": "BuiltinCommonInstructions::JsCode",
              "inlineCode": [
                "\r",
                "const value = eventsFunctionContext.getArgument(\"Value\");\r",
                "gdjs._MousePointerLockExtension.handler.movementX = value;\r",
                ""
              ],
              "parameterObjects": "",
              "useStrict": true,
              "eventsSheetExpanded": false
            }
          ],
          "parameters": [],
          "objectGroups": []
        },
        {
          "description": "the movement of the pointer on the Y axis.",
          "fullName": "Pointer Y movement",
          "functionType": "ExpressionAndCondition",
          "name": "MovementY",
          "sentence": "the movement of the pointer on the Y axis",
          "events": [
            {
              "type": "BuiltinCommonInstructions::JsCode",
              "inlineCode": [
                "\r",
                "eventsFunctionContext.returnValue = gdjs._MousePointerLockExtension.handler.movementY || 0;\r",
                ""
              ],
              "parameterObjects": "",
              "useStrict": true,
              "eventsSheetExpanded": false
            }
          ],
          "expressionType": {
            "type": "expression"
          },
          "parameters": [],
          "objectGroups": []
        },
        {
          "description": "the movement of the locked pointer on the X axis.",
          "fullName": "Pointer X movement",
          "functionType": "ActionWithOperator",
          "getterName": "MovementY",
          "name": "SetMovementY",
          "private": true,
          "sentence": "the movement of the locked pointer on the X axis",
          "events": [
            {
              "type": "BuiltinCommonInstructions::JsCode",
              "inlineCode": [
                "\r",
                "const value = eventsFunctionContext.getArgument(\"Value\");\r",
                "gdjs._MousePointerLockExtension.handler.movementY = value;\r",
                ""
              ],
              "parameterObjects": "",
              "useStrict": true,
              "eventsSheetExpanded": false
            }
          ],
          "parameters": [],
          "objectGroups": []
        },
        {
          "description": "Return the X position of a specific touch",
          "fullName": "Touch X position",
          "functionType": "Expression",
          "name": "TouchX",
          "private": true,
          "sentence": "",
          "events": [
            {
              "type": "BuiltinCommonInstructions::JsCode",
              "inlineCode": [
                "const touchId = eventsFunctionContext.getArgument(\"NewTouchId\");",
                "eventsFunctionContext.returnValue = runtimeScene.getGame().getInputManager().getTouchX(touchId);",
                ""
              ],
              "parameterObjects": "",
              "useStrict": true,
              "eventsSheetExpanded": false
            }
          ],
          "expressionType": {
            "type": "expression"
          },
          "parameters": [
            {
              "description": "Touch identifier",
              "name": "NewTouchId",
              "type": "expression"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "Return the Y position of a specific touch",
          "fullName": "Touch Y position",
          "functionType": "Expression",
          "name": "TouchY",
          "private": true,
          "sentence": "",
          "events": [
            {
              "type": "BuiltinCommonInstructions::JsCode",
              "inlineCode": [
                "const touchId = eventsFunctionContext.getArgument(\"NewTouchId\");",
                "eventsFunctionContext.returnValue = runtimeScene.getGame().getInputManager().getTouchY(touchId);",
                ""
              ],
              "parameterObjects": "",
              "useStrict": true,
              "eventsSheetExpanded": false
            }
          ],
          "expressionType": {
            "type": "expression"
          },
          "parameters": [
            {
              "description": "Touch identifier",
              "name": "NewTouchId",
              "type": "expression"
            }
          ],
          "objectGroups": []
        },
        {
          "description": "the speed factor for touch movement.",
          "fullName": "Speed factor for touch movement",
          "functionType": "ExpressionAndCondition",
          "name": "TouchSpeedFactor",
          "sentence": "the speed factor for touch movement",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [],
              "actions": [
                {
                  "type": {
                    "value": "SetReturnNumber"
                  },
                  "parameters": [
                    "TouchSpeedFactor"
                  ]
                }
              ]
            }
          ],
          "expressionType": {
            "type": "expression"
          },
          "parameters": [],
          "objectGroups": []
        },
        {
          "fullName": "",
          "functionType": "ActionWithOperator",
          "getterName": "TouchSpeedFactor",
          "name": "SetTouchSpeedFactor",
          "sentence": "",
          "events": [
            {
              "type": "BuiltinCommonInstructions::Standard",
              "conditions": [],
              "actions": [
                {
                  "type": {
                    "value": "SetNumberVariable"
                  },
                  "parameters": [
                    "TouchSpeedFactor",
                    "=",
                    "Value"
                  ]
                }
              ]
            }
          ],
          "parameters": [],
          "objectGroups": []
        }
      ],
      "eventsFunctionsFolderStructure": {
        "folderName": "__ROOT",
        "children": [
          {
            "functionName": "onFirstSceneLoaded"
          },
          {
            "functionName": "onScenePostEvents"
          },
          {
            "functionName": "RequestPointerLock"
          },
          {
            "functionName": "ExitPointerLock"
          },
          {
            "functionName": "isPointerLocked"
          },
          {
            "functionName": "isPointerActuallyLocked"
          },
          {
            "functionName": "isEmulatingPointerLock"
          },
          {
            "functionName": "IsMoving"
          },
          {
            "functionName": "MovementX"
          },
          {
            "functionName": "SetMovementX"
          },
          {
            "functionName": "MovementY"
          },
          {
            "functionName": "SetMovementY"
          },
          {
            "functionName": "TouchX"
          },
          {
            "functionName": "TouchY"
          },
          {
            "functionName": "TouchSpeedFactor"
          },
          {
            "functionName": "SetTouchSpeedFactor"
          }
        ]
      },
      "eventsBasedBehaviors": [
        {
          "description": "Control camera rotations with a mouse.",
          "fullName": "First person camera mouse mapper",
          "name": "FirstPersonPointerMapper",
          "objectType": "",
          "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": [
                    {
                      "type": {
                        "value": "MousePointerLock::isPointerLocked"
                      },
                      "parameters": [
                        "",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetAngle"
                      },
                      "parameters": [
                        "Object",
                        "+",
                        "MousePointerLock::MovementX() * HorizontalSpeed / SceneWindowWidth()"
                      ]
                    },
                    {
                      "type": {
                        "value": "Scene3D::Base3DBehavior::SetRotationY"
                      },
                      "parameters": [
                        "Object",
                        "Object3D",
                        "+",
                        "MousePointerLock::MovementY() * VerticalSpeed / SceneWindowHeight()"
                      ]
                    },
                    {
                      "type": {
                        "value": "Scene3D::Base3DBehavior::SetRotationY"
                      },
                      "parameters": [
                        "Object",
                        "Object3D",
                        "=",
                        "clamp(Object.Object3D::RotationY(), VerticalAngleMin, VerticalAngleMax)"
                      ]
                    },
                    {
                      "type": {
                        "value": "MousePointerLock::FirstPersonPointerMapper::LookFromObjectEyes"
                      },
                      "parameters": [
                        "Object",
                        "Behavior",
                        ""
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "MouseButtonReleased"
                      },
                      "parameters": [
                        "",
                        "Left"
                      ]
                    },
                    {
                      "type": {
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "ShouldLock",
                        "True",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "inverted": true,
                        "value": "MousePointerLock::isPointerLocked"
                      },
                      "parameters": [
                        "",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "MousePointerLock::RequestPointerLock"
                      },
                      "parameters": [
                        "",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "MousePointerLock::FirstPersonPointerMapper",
                  "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": "MousePointerLock::FirstPersonPointerMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the horizontal rotation speed factor of the object.",
              "fullName": "Horizontal rotation speed factor",
              "functionType": "ExpressionAndCondition",
              "group": "First person camera mouse mapper configuration",
              "name": "HorizontalSpeed",
              "sentence": "the horizontal rotation speed factor",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnNumber"
                      },
                      "parameters": [
                        "HorizontalSpeed"
                      ]
                    }
                  ]
                }
              ],
              "expressionType": {
                "type": "expression"
              },
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "MousePointerLock::FirstPersonPointerMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "ActionWithOperator",
              "getterName": "HorizontalSpeed",
              "group": "First person camera mouse mapper configuration",
              "name": "SetHorizontalSpeed",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "HorizontalSpeed",
                        "=",
                        "Value"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "MousePointerLock::FirstPersonPointerMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the vertical rotation speed factor of the object.",
              "fullName": "Vertical rotation speed factor",
              "functionType": "ExpressionAndCondition",
              "group": "First person camera mouse mapper configuration",
              "name": "VerticalSpeed",
              "sentence": "the vertical rotation speed factor",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnNumber"
                      },
                      "parameters": [
                        "VerticalSpeed"
                      ]
                    }
                  ]
                }
              ],
              "expressionType": {
                "type": "expression"
              },
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "MousePointerLock::FirstPersonPointerMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "ActionWithOperator",
              "getterName": "VerticalSpeed",
              "group": "First person camera mouse mapper configuration",
              "name": "SetVerticalSpeed",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "VerticalSpeed",
                        "=",
                        "Value"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "MousePointerLock::FirstPersonPointerMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the minimum vertical camera angle of the object.",
              "fullName": "Minimum vertical camera angle",
              "functionType": "ExpressionAndCondition",
              "group": "First person camera mouse mapper 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": "MousePointerLock::FirstPersonPointerMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "ActionWithOperator",
              "getterName": "VerticalAngleMin",
              "group": "First person camera mouse mapper configuration",
              "name": "SetVerticalAngleMin",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "VerticalAngleMin",
                        "=",
                        "Value"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "MousePointerLock::FirstPersonPointerMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the maximum vertical camera angle of the object.",
              "fullName": "Maximum vertical camera angle",
              "functionType": "ExpressionAndCondition",
              "group": "First person camera mouse mapper 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": "MousePointerLock::FirstPersonPointerMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "ActionWithOperator",
              "getterName": "VerticalAngleMax",
              "group": "First person camera mouse mapper configuration",
              "name": "SetVerticalAngleMax",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "VerticalAngleMax",
                        "=",
                        "Value"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "MousePointerLock::FirstPersonPointerMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "the z position offset of the object.",
              "fullName": "Z position offset",
              "functionType": "ExpressionAndCondition",
              "group": "First person camera mouse mapper 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": "MousePointerLock::FirstPersonPointerMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "ActionWithOperator",
              "getterName": "OffsetZ",
              "group": "First person camera mouse mapper configuration",
              "name": "SetOffsetZ",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetNumberVariable"
                      },
                      "parameters": [
                        "OffsetZ",
                        "=",
                        "Value"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "MousePointerLock::FirstPersonPointerMapper",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            }
          ],
          "eventsFunctionsFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "functionName": "doStepPreEvents"
              },
              {
                "folderName": "Layers and cameras",
                "children": [
                  {
                    "functionName": "LookFromObjectEyes"
                  }
                ]
              },
              {
                "folderName": "First person camera mouse mapper configuration",
                "children": [
                  {
                    "functionName": "HorizontalSpeed"
                  },
                  {
                    "functionName": "SetHorizontalSpeed"
                  },
                  {
                    "functionName": "VerticalSpeed"
                  },
                  {
                    "functionName": "SetVerticalSpeed"
                  },
                  {
                    "functionName": "VerticalAngleMin"
                  },
                  {
                    "functionName": "SetVerticalAngleMin"
                  },
                  {
                    "functionName": "VerticalAngleMax"
                  },
                  {
                    "functionName": "SetVerticalAngleMax"
                  },
                  {
                    "functionName": "OffsetZ"
                  },
                  {
                    "functionName": "SetOffsetZ"
                  }
                ]
              }
            ]
          },
          "propertyDescriptors": [
            {
              "value": "",
              "type": "Behavior",
              "label": "3D capability",
              "extraInformation": [
                "Scene3D::Base3DBehavior"
              ],
              "choices": [],
              "name": "Object3D"
            },
            {
              "value": "200",
              "type": "Number",
              "unit": "Dimensionless",
              "label": "Horizontal rotation speed factor",
              "name": "HorizontalSpeed"
            },
            {
              "value": "100",
              "type": "Number",
              "unit": "Dimensionless",
              "label": "Vertical rotation speed factor",
              "name": "VerticalSpeed"
            },
            {
              "value": "-90",
              "type": "Number",
              "unit": "DegreeAngle",
              "label": "Minimum vertical camera angle",
              "name": "VerticalAngleMin"
            },
            {
              "value": "90",
              "type": "Number",
              "unit": "DegreeAngle",
              "label": "Maximum vertical camera angle",
              "name": "VerticalAngleMax"
            },
            {
              "value": "0",
              "type": "Number",
              "unit": "Pixel",
              "label": "Z position offset",
              "name": "OffsetZ"
            },
            {
              "value": "true",
              "type": "Boolean",
              "label": "Lock the pointer on click",
              "name": "ShouldLock"
            }
          ],
          "propertiesFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "propertyName": "Object3D"
              },
              {
                "propertyName": "HorizontalSpeed"
              },
              {
                "propertyName": "VerticalSpeed"
              },
              {
                "propertyName": "VerticalAngleMin"
              },
              {
                "propertyName": "VerticalAngleMax"
              },
              {
                "propertyName": "OffsetZ"
              },
              {
                "propertyName": "ShouldLock"
              }
            ]
          }
        }
      ],
      "eventsBasedObjects": []
    },
    {
      "author": "",
      "category": "User interface",
      "dimension": "",
      "extensionNamespace": "",
      "fullName": "Toggle switch",
      "gdevelopVersion": ">=5.5.230",
      "helpPath": "/objects/toggle-switch",
      "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPHBhdGggY2xhc3M9InN0MCIgZD0iTTIzLDIzSDljLTMuOSwwLTctMy4xLTctN3YwYzAtMy45LDMuMS03LDctN2gxNGMzLjksMCw3LDMuMSw3LDd2MEMzMCwxOS45LDI2LjksMjMsMjMsMjN6Ii8+DQo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSI5IiBjeT0iMTYiIHI9IjQiLz4NCjwvc3ZnPg0K",
      "name": "SpriteToggleSwitch",
      "previewIconUrl": "https://asset-resources.gdevelop.io/public-resources/Icons/Line Hero Pack/Master/SVG/Interface Elements/8d0cd8cd0c9318f4f6efde6ee6b4c192bd19306467f80c9970387a259300f895_Interface Elements_interface_ui_toggle_switch_on_off.svg",
      "shortDescription": "Toggle switch that users can click or touch.",
      "version": "2.0.2",
      "description": [
        "Toggle switch that users can click or touch. The switch can be customized with sprites.",
        "",
        "There are ready-to-use toggle switches in the asset-store [settings UI pack](https://editor.gdevelop.io/?initial-dialog=asset-store&asset-pack=settings-ui-settings-ui)."
      ],
      "origin": {
        "identifier": "SpriteToggleSwitch",
        "name": "gdevelop-extension-store"
      },
      "tags": [
        "ui",
        "widget",
        "toggle",
        "switch",
        "check box"
      ],
      "authorIds": [
        "IWykYNRvhCZBN3vEgKEbBPOR3Oc2",
        "gqDaZjCfevOOxBYkK6zlhtZnXCg1"
      ],
      "changelog": [
        {
          "version": "2.0.0",
          "breaking": "- Toggle switches now use \"variants\", allowing easy swapping of their visual aspect. You will have to make some adjustments to existing toggle switches in your project. Follow this [migration documentation](https://wiki.gdevelop.io/gdevelop5/objects/custom-objects-prefab-template/migrate-to-variants/) to do these changes."
        }
      ],
      "dependencies": [],
      "globalVariables": [],
      "sceneVariables": [],
      "eventsFunctions": [
        {
          "description": "Check if the events are running for the editor.",
          "fullName": "Editor is running",
          "functionType": "Condition",
          "name": "IsInGameEdition",
          "private": true,
          "sentence": "Events are running for the editor",
          "events": [
            {
              "type": "BuiltinCommonInstructions::JsCode",
              "inlineCode": [
                "const game = runtimeScene.getGame();\r",
                "eventsFunctionContext.returnValue = game.isInGameEdition && game.isInGameEdition();"
              ],
              "parameterObjects": "",
              "useStrict": true,
              "eventsSheetExpanded": false
            }
          ],
          "parameters": [],
          "objectGroups": []
        }
      ],
      "eventsFunctionsFolderStructure": {
        "folderName": "__ROOT",
        "children": [
          {
            "functionName": "IsInGameEdition"
          }
        ]
      },
      "eventsBasedBehaviors": [
        {
          "description": "The finite state machine used internally by the switch object.",
          "fullName": "Switch finite state machine",
          "name": "SwitchFSM",
          "objectType": "",
          "private": true,
          "eventsFunctions": [
            {
              "fullName": "",
              "functionType": "Action",
              "name": "doStepPreEvents",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetBooleanVariable"
                      },
                      "parameters": [
                        "WasChecked",
                        "False",
                        ""
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::SwitchFSM::IsChecked"
                      },
                      "parameters": [
                        "Object",
                        "Behavior",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetBooleanVariable"
                      },
                      "parameters": [
                        "WasChecked",
                        "True",
                        ""
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::ButtonFSM::IsClicked"
                      },
                      "parameters": [
                        "Object",
                        "ButtonFSM",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetBooleanVariable"
                      },
                      "parameters": [
                        "IsChecked",
                        "Toggle",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteToggleSwitch::SwitchFSM",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check if the toggle switch is checked.",
              "fullName": "Is checked",
              "functionType": "Condition",
              "name": "IsChecked",
              "sentence": "_PARAM0_ is checked",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "IsChecked",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteToggleSwitch::SwitchFSM",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check if the toggle switch was checked in the current frame.",
              "fullName": "Has just been checked",
              "functionType": "Condition",
              "name": "HasJustBeenChecked",
              "sentence": "_PARAM0_ has just been checked",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "IsChecked",
                        "True",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "inverted": true,
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "WasChecked",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteToggleSwitch::SwitchFSM",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check if the toggle switch was unchecked in the current frame.",
              "fullName": "Has just been unchecked",
              "functionType": "Condition",
              "name": "HasJustBeenUnchecked",
              "sentence": "_PARAM0_ has just been unchecked",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "inverted": true,
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "IsChecked",
                        "True",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "WasChecked",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteToggleSwitch::SwitchFSM",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check if the toggle switch was toggled in the current frame.",
              "fullName": "Has just been toggled",
              "functionType": "Condition",
              "name": "HasJustBeenToggled",
              "sentence": "_PARAM0_ has just been toggled",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::SwitchFSM::HasJustBeenChecked"
                      },
                      "parameters": [
                        "Object",
                        "Behavior",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::SwitchFSM::HasJustBeenUnchecked"
                      },
                      "parameters": [
                        "Object",
                        "Behavior",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteToggleSwitch::SwitchFSM",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check (or uncheck) the toggle switch.",
              "fullName": "Check (or uncheck)",
              "functionType": "Action",
              "name": "SetChecked",
              "sentence": "Check _PARAM0_: _PARAM2_",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "Value",
                        "False",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetBooleanVariable"
                      },
                      "parameters": [
                        "IsChecked",
                        "False",
                        ""
                      ]
                    }
                  ],
                  "events": [
                    {
                      "type": "BuiltinCommonInstructions::Comment",
                      "color": {
                        "b": 109,
                        "g": 230,
                        "r": 255,
                        "textB": 0,
                        "textG": 0,
                        "textR": 0
                      },
                      "comment": "Avoid a started touch to interfere with a state change from events."
                    },
                    {
                      "type": "BuiltinCommonInstructions::Standard",
                      "conditions": [
                        {
                          "type": {
                            "value": "SpriteToggleSwitch::SwitchFSM::IsChecked"
                          },
                          "parameters": [
                            "Object",
                            "Behavior",
                            ""
                          ]
                        }
                      ],
                      "actions": [
                        {
                          "type": {
                            "value": "SpriteToggleSwitch::ButtonFSM::ResetState"
                          },
                          "parameters": [
                            "Object",
                            "ButtonFSM",
                            ""
                          ]
                        }
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "Value",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetBooleanVariable"
                      },
                      "parameters": [
                        "IsChecked",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "events": [
                    {
                      "type": "BuiltinCommonInstructions::Standard",
                      "conditions": [
                        {
                          "type": {
                            "inverted": true,
                            "value": "SpriteToggleSwitch::SwitchFSM::IsChecked"
                          },
                          "parameters": [
                            "Object",
                            "Behavior",
                            ""
                          ]
                        }
                      ],
                      "actions": [
                        {
                          "type": {
                            "value": "SpriteToggleSwitch::ButtonFSM::ResetState"
                          },
                          "parameters": [
                            "Object",
                            "ButtonFSM",
                            ""
                          ]
                        }
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteToggleSwitch::SwitchFSM",
                  "type": "behavior"
                },
                {
                  "defaultValue": "yes",
                  "description": "IsChecked",
                  "name": "Value",
                  "optional": true,
                  "type": "yesorno"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Toggle the switch.",
              "fullName": "Toggle",
              "functionType": "Action",
              "name": "ToggleChecked",
              "sentence": "Toggle _PARAM0_",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SetBooleanVariable"
                      },
                      "parameters": [
                        "PreviousIsChecked",
                        "False",
                        ""
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::SwitchFSM::IsChecked"
                      },
                      "parameters": [
                        "Object",
                        "Behavior",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetBooleanVariable"
                      },
                      "parameters": [
                        "PreviousIsChecked",
                        "True",
                        ""
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "PreviousIsChecked",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::SwitchFSM::SetChecked"
                      },
                      "parameters": [
                        "Object",
                        "Behavior",
                        "no",
                        ""
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "inverted": true,
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "PreviousIsChecked",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::SwitchFSM::SetChecked"
                      },
                      "parameters": [
                        "Object",
                        "Behavior",
                        "yes",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteToggleSwitch::SwitchFSM",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            }
          ],
          "eventsFunctionsFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "functionName": "doStepPreEvents"
              },
              {
                "functionName": "IsChecked"
              },
              {
                "functionName": "HasJustBeenChecked"
              },
              {
                "functionName": "HasJustBeenUnchecked"
              },
              {
                "functionName": "HasJustBeenToggled"
              },
              {
                "functionName": "SetChecked"
              },
              {
                "functionName": "ToggleChecked"
              }
            ]
          },
          "propertyDescriptors": [
            {
              "value": "",
              "type": "Behavior",
              "label": "Button finite state machine",
              "extraInformation": [
                "SpriteToggleSwitch::ButtonFSM"
              ],
              "choices": [],
              "name": "ButtonFSM"
            },
            {
              "value": "false",
              "type": "Boolean",
              "label": "Is checked",
              "name": "IsChecked"
            },
            {
              "value": "",
              "type": "Boolean",
              "label": "",
              "hidden": true,
              "name": "PreviousIsChecked"
            },
            {
              "value": "",
              "type": "Boolean",
              "label": "",
              "hidden": true,
              "name": "WasChecked"
            }
          ],
          "propertiesFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "propertyName": "ButtonFSM"
              },
              {
                "propertyName": "IsChecked"
              },
              {
                "propertyName": "PreviousIsChecked"
              },
              {
                "propertyName": "WasChecked"
              }
            ]
          }
        },
        {
          "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": "SpriteToggleSwitch::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": "SpriteToggleSwitch::ButtonFSM::PropertyState"
                                                  },
                                                  "parameters": [
                                                    "Object",
                                                    "Behavior",
                                                    "=",
                                                    "\"Hovered\""
                                                  ]
                                                },
                                                {
                                                  "type": {
                                                    "value": "SpriteToggleSwitch::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": "SpriteToggleSwitch::ButtonFSM",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "Action",
              "name": "onDeActivate",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::ButtonFSM::ResetState"
                      },
                      "parameters": [
                        "Object",
                        "Behavior",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "type": "object"
                },
                {
                  "description": "Behavior",
                  "name": "Behavior",
                  "supplementaryInformation": "SpriteToggleSwitch::ButtonFSM",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Reset the state of the button.",
              "fullName": "Reset state",
              "functionType": "Action",
              "name": "ResetState",
              "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": "SpriteToggleSwitch::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": "SpriteToggleSwitch::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": "SpriteToggleSwitch::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": "SpriteToggleSwitch::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": "SpriteToggleSwitch::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": "SpriteToggleSwitch::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": "SpriteToggleSwitch::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": "SpriteToggleSwitch::ButtonFSM",
                  "type": "behavior"
                }
              ],
              "objectGroups": []
            }
          ],
          "eventsFunctionsFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "functionName": "doStepPostEvents"
              },
              {
                "functionName": "onDeActivate"
              },
              {
                "functionName": "ResetState"
              },
              {
                "functionName": "IsIdle"
              },
              {
                "functionName": "IsClicked"
              },
              {
                "functionName": "IsHovered"
              },
              {
                "functionName": "IsFocused"
              },
              {
                "functionName": "IsPressed"
              },
              {
                "functionName": "IsPressedOutside"
              },
              {
                "functionName": "TouchId"
              }
            ]
          },
          "propertyDescriptors": [
            {
              "value": "true",
              "type": "Boolean",
              "label": "",
              "description": "Should check hovering",
              "hidden": true,
              "name": "ShouldCheckHovering"
            },
            {
              "value": "Idle",
              "type": "Choice",
              "label": "State",
              "choices": [
                {
                  "label": "Idle",
                  "value": "Idle"
                },
                {
                  "label": "Hovered",
                  "value": "Hovered"
                },
                {
                  "label": "PressedInside",
                  "value": "PressedInside"
                },
                {
                  "label": "PressedOutside",
                  "value": "PressedOutside"
                },
                {
                  "label": "Validated",
                  "value": "Validated"
                }
              ],
              "hidden": true,
              "name": "State"
            },
            {
              "value": "0",
              "type": "Number",
              "label": "Touch id",
              "hidden": true,
              "name": "TouchId"
            },
            {
              "value": "",
              "type": "Boolean",
              "label": "Touch is inside",
              "hidden": true,
              "name": "TouchIsInside"
            },
            {
              "value": "",
              "type": "Boolean",
              "label": "Mouse is inside",
              "hidden": true,
              "name": "MouseIsInside"
            },
            {
              "value": "",
              "type": "Number",
              "label": "",
              "hidden": true,
              "name": "Index"
            }
          ],
          "propertiesFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "propertyName": "ShouldCheckHovering"
              },
              {
                "propertyName": "State"
              },
              {
                "propertyName": "TouchId"
              },
              {
                "propertyName": "TouchIsInside"
              },
              {
                "propertyName": "MouseIsInside"
              },
              {
                "propertyName": "Index"
              }
            ]
          }
        }
      ],
      "eventsBasedObjects": [
        {
          "areaMaxX": 64,
          "areaMaxY": 64,
          "areaMaxZ": 64,
          "areaMinX": 0,
          "areaMinY": 0,
          "areaMinZ": 0,
          "defaultName": "ToggleSwitch",
          "description": "A toggle switch that users can click or touch.",
          "fullName": "Toggle switch",
          "isUsingLegacyInstancesRenderer": false,
          "name": "SpriteToggleSwitch",
          "objects": [
            {
              "adaptCollisionMaskAutomatically": true,
              "assetStoreId": "",
              "name": "State",
              "type": "Sprite",
              "updateIfNotVisible": false,
              "variables": [],
              "effects": [],
              "behaviors": [
                {
                  "name": "ButtonFSM",
                  "type": "SpriteToggleSwitch::ButtonFSM",
                  "ShouldCheckHovering": true,
                  "State": "Idle",
                  "TouchId": 0,
                  "TouchIsInside": false,
                  "MouseIsInside": false,
                  "Index": 0
                },
                {
                  "name": "SwitchFSM",
                  "type": "SpriteToggleSwitch::SwitchFSM",
                  "ButtonFSM": "ButtonFSM",
                  "IsChecked": false,
                  "WasChecked": false
                }
              ],
              "animations": [
                {
                  "name": "Unchecked",
                  "useMultipleDirections": false,
                  "directions": [
                    {
                      "looping": false,
                      "timeBetweenFrames": 0.08,
                      "sprites": []
                    }
                  ]
                },
                {
                  "name": "Checked",
                  "useMultipleDirections": false,
                  "directions": [
                    {
                      "looping": false,
                      "timeBetweenFrames": 0.08,
                      "sprites": []
                    }
                  ]
                }
              ]
            }
          ],
          "objectsFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "objectName": "State"
              }
            ]
          },
          "objectsGroups": [],
          "layers": [
            {
              "ambientLightColorB": 200,
              "ambientLightColorG": 200,
              "ambientLightColorR": 200,
              "camera2DPlaneMaxDrawingDistance": 5000,
              "camera3DFarPlaneDistance": 10000,
              "camera3DFieldOfView": 45,
              "camera3DNearPlaneDistance": 3,
              "cameraType": "",
              "followBaseLayerCamera": false,
              "isLightingLayer": false,
              "isLocked": false,
              "name": "",
              "renderingType": "",
              "visibility": true,
              "cameras": [
                {
                  "defaultSize": true,
                  "defaultViewport": true,
                  "height": 0,
                  "viewportBottom": 1,
                  "viewportLeft": 0,
                  "viewportRight": 1,
                  "viewportTop": 0,
                  "width": 0
                }
              ],
              "effects": []
            }
          ],
          "instances": [
            {
              "angle": 0,
              "customSize": true,
              "depth": 0,
              "height": 64,
              "layer": "",
              "name": "State",
              "persistentUuid": "bda60bb1-c312-4710-baf7-ec7a3887c076",
              "width": 64,
              "x": 0,
              "y": 0,
              "zOrder": 1,
              "numberProperties": [],
              "stringProperties": [],
              "initialVariables": []
            }
          ],
          "editionSettings": [],
          "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": "Pass the configuration to the behavior.\nThe PreviousIsChecked property allows to detect a change of \"intial value\" on hot reload."
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "IsChecked",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::SwitchFSM::SetChecked"
                      },
                      "parameters": [
                        "State",
                        "SwitchFSM",
                        "",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "SetBooleanVariable"
                      },
                      "parameters": [
                        "PreviousIsChecked",
                        "True",
                        ""
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "IsChecked",
                        "False",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::SwitchFSM::SetChecked"
                      },
                      "parameters": [
                        "State",
                        "SwitchFSM",
                        "no",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "SetBooleanVariable"
                      },
                      "parameters": [
                        "PreviousIsChecked",
                        "False",
                        ""
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::SpriteToggleSwitch::UpdateStateAnimation"
                      },
                      "parameters": [
                        "Object",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "ChangeSprite"
                      },
                      "parameters": [
                        "State",
                        "=",
                        "State.AnimationFrameCount() - 1"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteToggleSwitch::SpriteToggleSwitch",
                  "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": "BooleanVariable"
                      },
                      "parameters": [
                        "IsChecked",
                        "True",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "PreviousIsChecked",
                        "False",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::SpriteToggleSwitch::SetChecked"
                      },
                      "parameters": [
                        "Object",
                        "yes",
                        "no"
                      ]
                    },
                    {
                      "type": {
                        "value": "SetBooleanVariable"
                      },
                      "parameters": [
                        "PreviousIsChecked",
                        "True",
                        ""
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "IsChecked",
                        "False",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "PreviousIsChecked",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::SpriteToggleSwitch::SetChecked"
                      },
                      "parameters": [
                        "Object",
                        "SwitchFSM",
                        "no"
                      ]
                    },
                    {
                      "type": {
                        "value": "SetBooleanVariable"
                      },
                      "parameters": [
                        "PreviousIsChecked",
                        "False",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteToggleSwitch::SpriteToggleSwitch",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "fullName": "",
              "functionType": "Action",
              "name": "doStepPostEvents",
              "sentence": "",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::SpriteToggleSwitch::UpdateStateAnimation"
                      },
                      "parameters": [
                        "Object",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteToggleSwitch::SpriteToggleSwitch",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check if the toggle switch is checked.",
              "fullName": "Is checked",
              "functionType": "Condition",
              "name": "IsChecked",
              "sentence": "_PARAM0_ is checked",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::SwitchFSM::IsChecked"
                      },
                      "parameters": [
                        "State",
                        "SwitchFSM",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteToggleSwitch::SpriteToggleSwitch",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check if the toggle switch was checked in the current frame.",
              "fullName": "Has just been checked",
              "functionType": "Condition",
              "name": "HasJustBeenChecked",
              "sentence": "_PARAM0_ has just been checked",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::SwitchFSM::HasJustBeenChecked"
                      },
                      "parameters": [
                        "State",
                        "SwitchFSM",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteToggleSwitch::SpriteToggleSwitch",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check if the toggle switch was unchecked in the current frame.",
              "fullName": "Has just been unchecked",
              "functionType": "Condition",
              "name": "HasJustBeenUnchecked",
              "sentence": "_PARAM0_ has just been unchecked",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::SwitchFSM::HasJustBeenUnchecked"
                      },
                      "parameters": [
                        "State",
                        "SwitchFSM",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteToggleSwitch::SpriteToggleSwitch",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check if the toggle switch was checked or unchecked in the current frame.",
              "fullName": "Has just been toggled",
              "functionType": "Condition",
              "name": "HasJustBeenToggled",
              "sentence": "_PARAM0_ has just been toggled",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::SwitchFSM::HasJustBeenToggled"
                      },
                      "parameters": [
                        "State",
                        "SwitchFSM",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteToggleSwitch::SpriteToggleSwitch",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check (or uncheck) the toggle switch.",
              "fullName": "Check (or uncheck)",
              "functionType": "Action",
              "name": "SetChecked",
              "sentence": "Check _PARAM0_: _PARAM1_",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "inverted": true,
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "Value",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::SwitchFSM::SetChecked"
                      },
                      "parameters": [
                        "State",
                        "SwitchFSM",
                        "no",
                        ""
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "Value",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::SwitchFSM::SetChecked"
                      },
                      "parameters": [
                        "State",
                        "SwitchFSM",
                        "yes",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteToggleSwitch::SpriteToggleSwitch",
                  "type": "object"
                },
                {
                  "defaultValue": "yes",
                  "description": "IsChecked",
                  "name": "Value",
                  "optional": true,
                  "type": "yesorno"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Toggle the switch.",
              "fullName": "Toggle",
              "functionType": "Action",
              "name": "ToggleChecked",
              "sentence": "Toggle _PARAM0_",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [],
                  "actions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::SwitchFSM::ToggleChecked"
                      },
                      "parameters": [
                        "State",
                        "SwitchFSM",
                        ""
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteToggleSwitch::SpriteToggleSwitch",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check if the button is not used.",
              "fullName": "Is idle",
              "functionType": "Condition",
              "name": "IsIdle",
              "private": true,
              "sentence": "_PARAM0_ is idle",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::ButtonFSM::IsIdle"
                      },
                      "parameters": [
                        "State",
                        "ButtonFSM",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteToggleSwitch::SpriteToggleSwitch",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check if the button was just clicked.",
              "fullName": "Is clicked",
              "functionType": "Condition",
              "name": "IsClicked",
              "private": true,
              "sentence": "_PARAM0_ is clicked",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::ButtonFSM::IsClicked"
                      },
                      "parameters": [
                        "State",
                        "ButtonFSM",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteToggleSwitch::SpriteToggleSwitch",
                  "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": "SpriteToggleSwitch::ButtonFSM::IsHovered"
                      },
                      "parameters": [
                        "State",
                        "ButtonFSM",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteToggleSwitch::SpriteToggleSwitch",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Check if the button is either hovered or pressed but not hovered.",
              "fullName": "Is focused",
              "functionType": "Condition",
              "name": "IsFocused",
              "private": true,
              "sentence": "_PARAM0_ is focused",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::ButtonFSM::IsFocused"
                      },
                      "parameters": [
                        "State",
                        "ButtonFSM",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteToggleSwitch::SpriteToggleSwitch",
                  "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": "SpriteToggleSwitch::ButtonFSM::IsPressed"
                      },
                      "parameters": [
                        "State",
                        "ButtonFSM",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteToggleSwitch::SpriteToggleSwitch",
                  "type": "object"
                }
              ],
              "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": "SpriteToggleSwitch::ButtonFSM::IsPressedOutside"
                      },
                      "parameters": [
                        "State",
                        "ButtonFSM",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteToggleSwitch::SpriteToggleSwitch",
                  "type": "object"
                }
              ],
              "objectGroups": []
            },
            {
              "description": "Update the state animation.",
              "fullName": "Update state animation",
              "functionType": "Action",
              "name": "UpdateStateAnimation",
              "private": true,
              "sentence": "Update the state animation of _PARAM0_",
              "events": [
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "value": "SpriteToggleSwitch::SpriteToggleSwitch::IsChecked"
                      },
                      "parameters": [
                        "Object",
                        "ButtonFSM",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "AnimationName"
                      },
                      "parameters": [
                        "State",
                        "\"Unchecked\""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetAnimationName"
                      },
                      "parameters": [
                        "State",
                        "\"Checked\""
                      ]
                    },
                    {
                      "type": {
                        "value": "PlayAnimation"
                      },
                      "parameters": [
                        "State"
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "inverted": true,
                        "value": "SpriteToggleSwitch::SpriteToggleSwitch::IsChecked"
                      },
                      "parameters": [
                        "Object",
                        "ButtonFSM",
                        ""
                      ]
                    },
                    {
                      "type": {
                        "value": "AnimationName"
                      },
                      "parameters": [
                        "State",
                        "\"Checked\""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetAnimationName"
                      },
                      "parameters": [
                        "State",
                        "\"Unchecked\""
                      ]
                    },
                    {
                      "type": {
                        "value": "PlayAnimation"
                      },
                      "parameters": [
                        "State"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteToggleSwitch::SpriteToggleSwitch",
                  "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": [
                        "State",
                        "ButtonFSM",
                        "yes"
                      ]
                    }
                  ]
                },
                {
                  "type": "BuiltinCommonInstructions::Standard",
                  "conditions": [
                    {
                      "type": {
                        "inverted": true,
                        "value": "BooleanVariable"
                      },
                      "parameters": [
                        "ShouldActivate",
                        "True",
                        ""
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "ActivateBehavior"
                      },
                      "parameters": [
                        "State",
                        "ButtonFSM",
                        "no"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteToggleSwitch::SpriteToggleSwitch",
                  "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": [
                        "State",
                        "ButtonFSM"
                      ]
                    }
                  ],
                  "actions": [
                    {
                      "type": {
                        "value": "SetReturnBoolean"
                      },
                      "parameters": [
                        "True"
                      ]
                    }
                  ]
                }
              ],
              "parameters": [
                {
                  "description": "Object",
                  "name": "Object",
                  "supplementaryInformation": "SpriteToggleSwitch::SpriteToggleSwitch",
                  "type": "object"
                }
              ],
              "objectGroups": []
            }
          ],
          "eventsFunctionsFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "functionName": "onCreated"
              },
              {
                "functionName": "onHotReloading"
              },
              {
                "functionName": "doStepPostEvents"
              },
              {
                "functionName": "IsChecked"
              },
              {
                "functionName": "HasJustBeenChecked"
              },
              {
                "functionName": "HasJustBeenUnchecked"
              },
              {
                "functionName": "HasJustBeenToggled"
              },
              {
                "functionName": "SetChecked"
              },
              {
                "functionName": "ToggleChecked"
              },
              {
                "functionName": "IsIdle"
              },
              {
                "functionName": "IsClicked"
              },
              {
                "functionName": "IsHovered"
              },
              {
                "functionName": "IsFocused"
              },
              {
                "functionName": "IsPressed"
              },
              {
                "functionName": "IsPressedOutside"
              },
              {
                "functionName": "UpdateStateAnimation"
              },
              {
                "functionName": "Activate"
              },
              {
                "functionName": "IsActivated"
              }
            ]
          },
          "propertyDescriptors": [
            {
              "value": "true",
              "type": "Boolean",
              "label": "Is checked",
              "name": "IsChecked"
            },
            {
              "value": "",
              "type": "Boolean",
              "label": "",
              "description": "It's used to detect a change at hot reload.",
              "hidden": true,
              "name": "PreviousIsChecked"
            }
          ],
          "propertiesFolderStructure": {
            "folderName": "__ROOT",
            "children": [
              {
                "propertyName": "IsChecked"
              },
              {
                "propertyName": "PreviousIsChecked"
              }
            ]
          },
          "variants": [
            {
              "areaMaxX": 202,
              "areaMaxY": 64,
              "areaMaxZ": 64,
              "areaMinX": 0,
              "areaMinY": 0,
              "areaMinZ": 0,
              "name": "Controls toggle",
              "objects": [
                {
                  "adaptCollisionMaskAutomatically": true,
                  "assetStoreId": "",
                  "name": "State",
                  "type": "Sprite",
                  "updateIfNotVisible": false,
                  "variables": [],
                  "effects": [],
                  "behaviors": [
                    {
                      "name": "ButtonFSM",
                      "type": "SpriteToggleSwitch::ButtonFSM",
                      "ShouldCheckHovering": true,
                      "State": "Idle",
                      "TouchId": 0,
                      "TouchIsInside": false,
                      "MouseIsInside": false,
                      "Index": 0
                    },
                    {
                      "name": "SwitchFSM",
                      "type": "SpriteToggleSwitch::SwitchFSM",
                      "ButtonFSM": "ButtonFSM",
                      "IsChecked": false,
                      "WasChecked": false
                    }
                  ],
                  "animations": [
                    {
                      "name": "Unchecked",
                      "useMultipleDirections": false,
                      "directions": [
                        {
                          "looping": false,
                          "timeBetweenFrames": 0.08,
                          "sprites": [
                            {
                              "hasCustomCollisionMask": true,
                              "image": "assets\\assets\\StarterToggle_Keyboard.png",
                              "points": [],
                              "originPoint": {
                                "name": "origine",
                                "x": 0,
                                "y": 0
                              },
                              "centerPoint": {
                                "automatic": true,
                                "name": "centre",
                                "x": 0,
                                "y": 0
                              },
                              "customCollisionMask": [
                                [
                                  {
                                    "x": 2,
                                    "y": 1
                                  },
                                  {
                                    "x": 201,
                                    "y": 1
                                  },
                                  {
                                    "x": 201,
                                    "y": 63
                                  },
                                  {
                                    "x": 2,
                                    "y": 63
                                  }
                                ]
                              ]
                            }
                          ]
                        }
                      ]
                    },
                    {
                      "name": "Checked",
                      "useMultipleDirections": false,
                      "directions": [
                        {
                          "looping": false,
                          "timeBetweenFrames": 0.08,
                          "sprites": [
                            {
                              "hasCustomCollisionMask": true,
                              "image": "assets\\assets\\StarterToggle_Touch.png",
                              "points": [],
                              "originPoint": {
                                "name": "origine",
                                "x": 0,
                                "y": 0
                              },
                              "centerPoint": {
                                "automatic": true,
                                "name": "centre",
                                "x": 0,
                                "y": 0
                              },
                              "customCollisionMask": [
                                [
                                  {
                                    "x": 2,
                                    "y": 1
                                  },
                                  {
                                    "x": 201,
                                    "y": 1
                                  },
                                  {
                                    "x": 201,
                                    "y": 63
                                  },
                                  {
                                    "x": 2,
                                    "y": 63
                                  }
                                ]
                              ]
                            }
                          ]
                        }
                      ]
                    }
                  ]
                }
              ],
              "objectsFolderStructure": {
                "folderName": "__ROOT",
                "children": [
                  {
                    "objectName": "State"
                  }
                ]
              },
              "objectsGroups": [],
              "layers": [
                {
                  "ambientLightColorB": 200,
                  "ambientLightColorG": 200,
                  "ambientLightColorR": 200,
                  "camera2DPlaneMaxDrawingDistance": 5000,
                  "camera3DFarPlaneDistance": 10000,
                  "camera3DFieldOfView": 45,
                  "camera3DNearPlaneDistance": 3,
                  "cameraType": "",
                  "followBaseLayerCamera": false,
                  "isLightingLayer": false,
                  "isLocked": false,
                  "name": "",
                  "renderingType": "",
                  "visibility": true,
                  "cameras": [
                    {
                      "defaultSize": true,
                      "defaultViewport": true,
                      "height": 0,
                      "viewportBottom": 1,
                      "viewportLeft": 0,
                      "viewportRight": 1,
                      "viewportTop": 0,
                      "width": 0
                    }
                  ],
                  "effects": []
                }
              ],
              "instances": [
                {
                  "angle": 0,
                  "customSize": true,
                  "depth": 0,
                  "height": 64,
                  "layer": "",
                  "name": "State",
                  "persistentUuid": "bda60bb1-c312-4710-baf7-ec7a3887c076",
                  "width": 202,
                  "x": 0,
                  "y": 0,
                  "zOrder": 1,
                  "numberProperties": [],
                  "stringProperties": [],
                  "initialVariables": []
                }
              ],
              "editionSettings": {
                "grid": false,
                "gridType": "rectangular",
                "gridWidth": 32,
                "gridHeight": 32,
                "gridDepth": 32,
                "gridOffsetX": 0,
                "gridOffsetY": 0,
                "gridOffsetZ": 0,
                "gridColor": 10401023,
                "gridAlpha": 0.8,
                "snap": false,
                "zoomFactor": 3.4653465346534653,
                "windowMask": false,
                "selectedLayer": "",
                "gameEditorMode": "instances-editor"
              }
            }
          ]
        }
      ]
    }
  ],
  "externalLayouts": []
}