From 11496c4c82eaafd70a212b613c58bd603d32e247 Mon Sep 17 00:00:00 2001 From: HelperWesley <72082749+HelperWesley@users.noreply.github.com> Date: Mon, 21 Nov 2022 16:35:52 -0330 Subject: [PATCH 1/2] Pokemon-like example Top down rpg example based off of the pokemon-like overview concept video. This example has different art, because this new art is CC0, whereas the other art was not. --- examples/top-down-rpg/README.md | 1 + examples/top-down-rpg/Top-down-rpg.json | 26777 ++++++++++++++++ .../8BitOperatorPlus8Regular_Edited.fnt | 95 + .../8BitOperatorPlus8Regular_Edited.png | Bin 0 -> 4731 bytes examples/top-down-rpg/assets/ACgarRight1.png | Bin 0 -> 375 bytes examples/top-down-rpg/assets/ACgarRight2.png | Bin 0 -> 348 bytes examples/top-down-rpg/assets/ACgarRight3.png | Bin 0 -> 372 bytes examples/top-down-rpg/assets/ACgarRight4.png | Bin 0 -> 350 bytes examples/top-down-rpg/assets/ACharDown1.png | Bin 0 -> 377 bytes examples/top-down-rpg/assets/ACharDown2.png | Bin 0 -> 379 bytes examples/top-down-rpg/assets/ACharDown3.png | Bin 0 -> 392 bytes examples/top-down-rpg/assets/ACharDown4.png | Bin 0 -> 388 bytes examples/top-down-rpg/assets/ACharLeft1.png | Bin 0 -> 356 bytes examples/top-down-rpg/assets/ACharLeft2.png | Bin 0 -> 330 bytes examples/top-down-rpg/assets/ACharLeft3.png | Bin 0 -> 364 bytes examples/top-down-rpg/assets/ACharLeft4.png | Bin 0 -> 353 bytes examples/top-down-rpg/assets/ACharUp1.png | Bin 0 -> 254 bytes examples/top-down-rpg/assets/ACharUp2.png | Bin 0 -> 282 bytes examples/top-down-rpg/assets/ACharUp3.png | Bin 0 -> 254 bytes examples/top-down-rpg/assets/ACharUp4.png | Bin 0 -> 274 bytes examples/top-down-rpg/assets/Attack.wav | Bin 0 -> 39736 bytes examples/top-down-rpg/assets/Border.png | Bin 0 -> 400 bytes examples/top-down-rpg/assets/Border2.png | Bin 0 -> 405 bytes examples/top-down-rpg/assets/Bush1.png | Bin 0 -> 315 bytes .../top-down-rpg/assets/Creature_Enemy.png | Bin 0 -> 1490 bytes .../top-down-rpg/assets/Creature_Player.png | Bin 0 -> 2465 bytes examples/top-down-rpg/assets/Dock1.png | Bin 0 -> 633 bytes .../assets/Enemy_Spawn_Location.png | Bin 0 -> 99 bytes examples/top-down-rpg/assets/Grass1.png | Bin 0 -> 99 bytes examples/top-down-rpg/assets/Healthbar.png | Bin 0 -> 163 bytes .../top-down-rpg/assets/HealthbarBorder.png | Bin 0 -> 226 bytes examples/top-down-rpg/assets/House1.png | Bin 0 -> 1146 bytes examples/top-down-rpg/assets/House2.png | Bin 0 -> 1151 bytes examples/top-down-rpg/assets/HoverSound.wav | Bin 0 -> 3738 bytes examples/top-down-rpg/assets/Road1.png | Bin 0 -> 205 bytes examples/top-down-rpg/assets/RoadEdge1.png | Bin 0 -> 188 bytes examples/top-down-rpg/assets/Talk.wav | Bin 0 -> 26030 bytes examples/top-down-rpg/assets/Tree1.png | Bin 0 -> 603 bytes examples/top-down-rpg/assets/Tree2.png | Bin 0 -> 606 bytes examples/top-down-rpg/assets/Water1.png | Bin 0 -> 99 bytes examples/top-down-rpg/assets/WaterCorner.png | Bin 0 -> 250 bytes examples/top-down-rpg/assets/WaterCorner2.png | Bin 0 -> 240 bytes .../top-down-rpg/assets/WaterEdgeRight.png | Bin 0 -> 259 bytes examples/top-down-rpg/assets/WaterEdgeUp.png | Bin 0 -> 240 bytes examples/top-down-rpg/thumbnail.png | Bin 0 -> 292505 bytes 45 files changed, 26873 insertions(+) create mode 100644 examples/top-down-rpg/README.md create mode 100644 examples/top-down-rpg/Top-down-rpg.json create mode 100644 examples/top-down-rpg/assets/8BitOperatorPlus8Regular_Edited.fnt create mode 100644 examples/top-down-rpg/assets/8BitOperatorPlus8Regular_Edited.png create mode 100644 examples/top-down-rpg/assets/ACgarRight1.png create mode 100644 examples/top-down-rpg/assets/ACgarRight2.png create mode 100644 examples/top-down-rpg/assets/ACgarRight3.png create mode 100644 examples/top-down-rpg/assets/ACgarRight4.png create mode 100644 examples/top-down-rpg/assets/ACharDown1.png create mode 100644 examples/top-down-rpg/assets/ACharDown2.png create mode 100644 examples/top-down-rpg/assets/ACharDown3.png create mode 100644 examples/top-down-rpg/assets/ACharDown4.png create mode 100644 examples/top-down-rpg/assets/ACharLeft1.png create mode 100644 examples/top-down-rpg/assets/ACharLeft2.png create mode 100644 examples/top-down-rpg/assets/ACharLeft3.png create mode 100644 examples/top-down-rpg/assets/ACharLeft4.png create mode 100644 examples/top-down-rpg/assets/ACharUp1.png create mode 100644 examples/top-down-rpg/assets/ACharUp2.png create mode 100644 examples/top-down-rpg/assets/ACharUp3.png create mode 100644 examples/top-down-rpg/assets/ACharUp4.png create mode 100644 examples/top-down-rpg/assets/Attack.wav create mode 100644 examples/top-down-rpg/assets/Border.png create mode 100644 examples/top-down-rpg/assets/Border2.png create mode 100644 examples/top-down-rpg/assets/Bush1.png create mode 100644 examples/top-down-rpg/assets/Creature_Enemy.png create mode 100644 examples/top-down-rpg/assets/Creature_Player.png create mode 100644 examples/top-down-rpg/assets/Dock1.png create mode 100644 examples/top-down-rpg/assets/Enemy_Spawn_Location.png create mode 100644 examples/top-down-rpg/assets/Grass1.png create mode 100644 examples/top-down-rpg/assets/Healthbar.png create mode 100644 examples/top-down-rpg/assets/HealthbarBorder.png create mode 100644 examples/top-down-rpg/assets/House1.png create mode 100644 examples/top-down-rpg/assets/House2.png create mode 100644 examples/top-down-rpg/assets/HoverSound.wav create mode 100644 examples/top-down-rpg/assets/Road1.png create mode 100644 examples/top-down-rpg/assets/RoadEdge1.png create mode 100644 examples/top-down-rpg/assets/Talk.wav create mode 100644 examples/top-down-rpg/assets/Tree1.png create mode 100644 examples/top-down-rpg/assets/Tree2.png create mode 100644 examples/top-down-rpg/assets/Water1.png create mode 100644 examples/top-down-rpg/assets/WaterCorner.png create mode 100644 examples/top-down-rpg/assets/WaterCorner2.png create mode 100644 examples/top-down-rpg/assets/WaterEdgeRight.png create mode 100644 examples/top-down-rpg/assets/WaterEdgeUp.png create mode 100644 examples/top-down-rpg/thumbnail.png diff --git a/examples/top-down-rpg/README.md b/examples/top-down-rpg/README.md new file mode 100644 index 000000000..3d478cc31 --- /dev/null +++ b/examples/top-down-rpg/README.md @@ -0,0 +1 @@ +A monster tamer style top down rpg game example. Including top down movement, scrolling text during chat, camera controls, and a simple battle sequence. \ No newline at end of file diff --git a/examples/top-down-rpg/Top-down-rpg.json b/examples/top-down-rpg/Top-down-rpg.json new file mode 100644 index 000000000..759b64c6a --- /dev/null +++ b/examples/top-down-rpg/Top-down-rpg.json @@ -0,0 +1,26777 @@ +{ + "firstLayout": "", + "gdVersion": { + "build": 99, + "major": 4, + "minor": 0, + "revision": 0 + }, + "properties": { + "adaptGameResolutionAtRuntime": false, + "folderProject": false, + "orientation": "landscape", + "packageName": "com.example.topdownrpg", + "pixelsRounding": false, + "projectUuid": "247f11a2-f6aa-4ab8-94bd-afb11dd8f3f9", + "scaleMode": "nearest", + "sizeOnStartupMode": "adaptWidth", + "templateSlug": "", + "useExternalSourceFiles": false, + "version": "1.0.0", + "name": "Top Down Rpg", + "description": "A monster tamer style top down rpg game example. Including top down movement, scrolling text during chat, camera controls, and a simple battle sequence.", + "author": "", + "windowWidth": 1920, + "windowHeight": 1080, + "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": "", + "liluo-thumbnail": "thumbnail.png" + }, + "loadingScreen": { + "backgroundColor": 0, + "backgroundFadeInDuration": 0.2, + "backgroundImageResourceName": "", + "gdevelopLogoStyle": "light", + "logoAndProgressFadeInDuration": 0.2, + "logoAndProgressLogoFadeInDelay": 0.2, + "minDuration": 1.5, + "progressBarColor": 16777215, + "progressBarHeight": 20, + "progressBarMaxWidth": 200, + "progressBarMinWidth": 40, + "progressBarWidthPercent": 30, + "showGDevelopSplash": true, + "showProgressBar": true + }, + "authorIds": [ + "9MGDlUQAh8QUilno4JPycekjRCJ3" + ], + "categories": [ + "rpg" + ], + "playableDevices": [ + "keyboard" + ], + "extensionProperties": [], + "platforms": [ + { + "name": "GDevelop JS platform" + } + ], + "currentPlatform": "GDevelop JS platform" + }, + "resources": { + "resources": [ + { + "alwaysLoaded": false, + "file": "assets/ACharDown1.png", + "kind": "image", + "metadata": "", + "name": "ACharDown1.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/ACharDown2.png", + "kind": "image", + "metadata": "", + "name": "ACharDown2.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/ACharDown3.png", + "kind": "image", + "metadata": "", + "name": "ACharDown3.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/ACharDown4.png", + "kind": "image", + "metadata": "", + "name": "ACharDown4.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/ACgarRight1.png", + "kind": "image", + "metadata": "", + "name": "ACgarRight1.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/ACgarRight2.png", + "kind": "image", + "metadata": "", + "name": "ACgarRight2.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/ACgarRight3.png", + "kind": "image", + "metadata": "", + "name": "ACgarRight3.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/ACgarRight4.png", + "kind": "image", + "metadata": "", + "name": "ACgarRight4.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/ACharLeft1.png", + "kind": "image", + "metadata": "", + "name": "ACharLeft1.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/ACharLeft2.png", + "kind": "image", + "metadata": "", + "name": "ACharLeft2.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/ACharLeft3.png", + "kind": "image", + "metadata": "", + "name": "ACharLeft3.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/ACharLeft4.png", + "kind": "image", + "metadata": "", + "name": "ACharLeft4.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/ACharUp1.png", + "kind": "image", + "metadata": "", + "name": "ACharUp1.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/ACharUp2.png", + "kind": "image", + "metadata": "", + "name": "ACharUp2.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/ACharUp3.png", + "kind": "image", + "metadata": "", + "name": "ACharUp3.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/ACharUp4.png", + "kind": "image", + "metadata": "", + "name": "ACharUp4.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/Dock1.png", + "kind": "image", + "metadata": "", + "name": "Dock1.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/Tree1.png", + "kind": "image", + "metadata": "", + "name": "Tree1.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/Tree2.png", + "kind": "image", + "metadata": "", + "name": "Tree2.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/Bush1.png", + "kind": "image", + "metadata": "", + "name": "Bush1.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/House1.png", + "kind": "image", + "metadata": "", + "name": "House1.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/House2.png", + "kind": "image", + "metadata": "", + "name": "House2.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/WaterCorner.png", + "kind": "image", + "metadata": "", + "name": "WaterCorner.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/Grass1.png", + "kind": "image", + "metadata": "", + "name": "Grass1.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/WaterEdgeRight.png", + "kind": "image", + "metadata": "", + "name": "WaterEdgeRight.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/WaterEdgeUp.png", + "kind": "image", + "metadata": "", + "name": "WaterEdgeUp.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/Water1.png", + "kind": "image", + "metadata": "", + "name": "Water1.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/RoadEdge1.png", + "kind": "image", + "metadata": "", + "name": "RoadEdge1.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/Enemy_Spawn_Location.png", + "kind": "image", + "metadata": "", + "name": "Enemy_Spawn_Location.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/8BitOperatorPlus8Regular_Edited.fnt", + "kind": "bitmapFont", + "metadata": "", + "name": "8BitOperatorPlus8Regular_Edited.fnt", + "userAdded": false + }, + { + "alwaysLoaded": false, + "file": "assets/8BitOperatorPlus8Regular_Edited.png", + "kind": "image", + "metadata": "", + "name": "8BitOperatorPlus8Regular_Edited.png", + "smoothed": false, + "userAdded": false + }, + { + "alwaysLoaded": false, + "file": "assets/Border.png", + "kind": "image", + "metadata": "", + "name": "Border.png", + "smoothed": false, + "userAdded": false + }, + { + "alwaysLoaded": false, + "file": "assets/Border2.png", + "kind": "image", + "metadata": "", + "name": "Border2.png", + "smoothed": false, + "userAdded": false + }, + { + "alwaysLoaded": false, + "file": "assets/Healthbar.png", + "kind": "image", + "metadata": "", + "name": "Healthbar.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/HealthbarBorder.png", + "kind": "image", + "metadata": "", + "name": "HealthbarBorder.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Attack.wav", + "kind": "audio", + "metadata": "{\"jfxr\":{\"data\":\"{\\\"_version\\\":1,\\\"_name\\\":\\\"Jump 1\\\",\\\"_locked\\\":[],\\\"sampleRate\\\":44100,\\\"attack\\\":0,\\\"sustain\\\":0.1,\\\"sustainPunch\\\":50,\\\"decay\\\":0.35000000000000003,\\\"tremoloDepth\\\":19,\\\"tremoloFrequency\\\":27,\\\"frequency\\\":10000,\\\"frequencySweep\\\":-4800,\\\"frequencyDeltaSweep\\\":-4100,\\\"repeatFrequency\\\":0,\\\"frequencyJump1Onset\\\":33,\\\"frequencyJump1Amount\\\":0,\\\"frequencyJump2Onset\\\":66,\\\"frequencyJump2Amount\\\":0,\\\"harmonics\\\":0,\\\"harmonicsFalloff\\\":0.5,\\\"waveform\\\":\\\"brownnoise\\\",\\\"interpolateNoise\\\":true,\\\"vibratoDepth\\\":0,\\\"vibratoFrequency\\\":10,\\\"squareDuty\\\":50,\\\"squareDutySweep\\\":0,\\\"flangerOffset\\\":0,\\\"flangerOffsetSweep\\\":0,\\\"bitCrush\\\":16,\\\"bitCrushSweep\\\":0,\\\"lowPassCutoff\\\":22050,\\\"lowPassCutoffSweep\\\":0,\\\"highPassCutoff\\\":0,\\\"highPassCutoffSweep\\\":0,\\\"compression\\\":1,\\\"normalization\\\":true,\\\"amplification\\\":100}\",\"name\":\"Attack\"}}", + "name": "Attack.wav", + "preloadAsMusic": false, + "preloadAsSound": true, + "preloadInCache": false, + "userAdded": true + }, + { + "file": "assets/Talk.wav", + "kind": "audio", + "metadata": "{\"jfxr\":{\"data\":\"{\\\"_version\\\":1,\\\"_name\\\":\\\"Jump 1\\\",\\\"_locked\\\":[],\\\"sampleRate\\\":44100,\\\"attack\\\":0.03461516912647311,\\\"sustain\\\":0.06,\\\"sustainPunch\\\":0,\\\"decay\\\":0.2,\\\"tremoloDepth\\\":0,\\\"tremoloFrequency\\\":10,\\\"frequency\\\":399.07212207604067,\\\"frequencySweep\\\":9999.999999999698,\\\"frequencyDeltaSweep\\\":0.8611028349862437,\\\"repeatFrequency\\\":0,\\\"frequencyJump1Onset\\\":33,\\\"frequencyJump1Amount\\\":0,\\\"frequencyJump2Onset\\\":66,\\\"frequencyJump2Amount\\\":0,\\\"harmonics\\\":0,\\\"harmonicsFalloff\\\":0.5,\\\"waveform\\\":\\\"square\\\",\\\"interpolateNoise\\\":true,\\\"vibratoDepth\\\":370,\\\"vibratoFrequency\\\":572,\\\"squareDuty\\\":10,\\\"squareDutySweep\\\":-30,\\\"flangerOffset\\\":0,\\\"flangerOffsetSweep\\\":0,\\\"bitCrush\\\":16,\\\"bitCrushSweep\\\":0,\\\"lowPassCutoff\\\":22050,\\\"lowPassCutoffSweep\\\":0,\\\"highPassCutoff\\\":0,\\\"highPassCutoffSweep\\\":0,\\\"compression\\\":1,\\\"normalization\\\":true,\\\"amplification\\\":100}\",\"name\":\"Talk\"}}", + "name": "Talk.wav", + "preloadAsMusic": false, + "preloadAsSound": true, + "preloadInCache": false, + "userAdded": true + }, + { + "file": "assets/HoverSound.wav", + "kind": "audio", + "metadata": "{\"jfxr\":{\"data\":\"{\\\"_version\\\":1,\\\"_name\\\":\\\"Jump 1\\\",\\\"_locked\\\":[],\\\"sampleRate\\\":44100,\\\"attack\\\":0.011876134915122183,\\\"sustain\\\":0.01,\\\"sustainPunch\\\":0,\\\"decay\\\":0.02,\\\"tremoloDepth\\\":0,\\\"tremoloFrequency\\\":10,\\\"frequency\\\":1012.4426242250636,\\\"frequencySweep\\\":9999.999999999698,\\\"frequencyDeltaSweep\\\":995.5111583241919,\\\"repeatFrequency\\\":0,\\\"frequencyJump1Onset\\\":33,\\\"frequencyJump1Amount\\\":0,\\\"frequencyJump2Onset\\\":66,\\\"frequencyJump2Amount\\\":0,\\\"harmonics\\\":0,\\\"harmonicsFalloff\\\":0.71,\\\"waveform\\\":\\\"triangle\\\",\\\"interpolateNoise\\\":true,\\\"vibratoDepth\\\":0,\\\"vibratoFrequency\\\":10,\\\"squareDuty\\\":70,\\\"squareDutySweep\\\":0,\\\"flangerOffset\\\":0,\\\"flangerOffsetSweep\\\":0,\\\"bitCrush\\\":16,\\\"bitCrushSweep\\\":0,\\\"lowPassCutoff\\\":22050,\\\"lowPassCutoffSweep\\\":0,\\\"highPassCutoff\\\":0,\\\"highPassCutoffSweep\\\":0,\\\"compression\\\":1,\\\"normalization\\\":true,\\\"amplification\\\":100}\",\"name\":\"HoverSound\"}}", + "name": "HoverSound.wav", + "preloadAsMusic": false, + "preloadAsSound": false, + "preloadInCache": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/Road1.png", + "kind": "image", + "metadata": "", + "name": "Road1.png", + "smoothed": false, + "userAdded": false + }, + { + "alwaysLoaded": false, + "file": "assets/WaterCorner2.png", + "kind": "image", + "metadata": "", + "name": "WaterCorner2.png", + "smoothed": false, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/Creature_Player.png", + "kind": "image", + "metadata": "", + "name": "Creature_Player.png", + "smoothed": true, + "userAdded": true + }, + { + "alwaysLoaded": false, + "file": "assets/Creature_Enemy.png", + "kind": "image", + "metadata": "", + "name": "Creature_Enemy.png", + "smoothed": true, + "userAdded": false + }, + { + "alwaysLoaded": false, + "file": "thumbnail.png", + "kind": "image", + "metadata": "", + "name": "thumbnail.png", + "smoothed": false, + "userAdded": true + } + ], + "resourceFolders": [] + }, + "objects": [ + { + "assetStoreId": "", + "name": "Transition", + "tags": "", + "type": "PrimitiveDrawing::Drawer", + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "FlashTransitionPainter", + "type": "FlashTransitionPainter::FlashTransitionPainter", + "Timer": 1, + "Color": "255;255;255", + "Type": "", + "Direction": "", + "MaxOpacity": 255 + } + ], + "fillOpacity": 255, + "outlineSize": 1, + "outlineOpacity": 255, + "fillColor": { + "b": 255, + "g": 255, + "r": 255 + }, + "outlineColor": { + "b": 0, + "g": 0, + "r": 0 + }, + "absoluteCoordinates": false, + "clearBetweenFrames": true + }, + { + "assetStoreId": "", + "bottomMargin": 16, + "height": 48, + "leftMargin": 16, + "name": "TextBorder", + "rightMargin": 16, + "tags": "", + "texture": "Border.png", + "tiled": true, + "topMargin": 16, + "type": "PanelSpriteObject::PanelSprite", + "width": 48, + "variables": [], + "effects": [], + "behaviors": [] + } + ], + "objectsGroups": [], + "variables": [], + "layouts": [ + { + "b": 209, + "disableInputWhenNotFocused": true, + "mangledName": "Overworld", + "name": "Overworld", + "r": 209, + "standardSortMethod": true, + "stopSoundsOnStartup": true, + "title": "", + "v": 209, + "uiSettings": { + "grid": false, + "gridType": "rectangular", + "gridWidth": 8, + "gridHeight": 8, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.2, + "snap": false, + "zoomFactor": 0.8900000000000297, + "windowMask": false + }, + "objectsGroups": [ + { + "name": "PhysicalObject", + "objects": [ + { + "name": "Tree1" + }, + { + "name": "Bush1" + }, + { + "name": "Tree2" + }, + { + "name": "House1" + }, + { + "name": "House2" + }, + { + "name": "NPC" + } + ] + } + ], + "variables": [], + "instances": [ + { + "angle": 0, + "customSize": true, + "height": 400, + "layer": "", + "locked": true, + "name": "Grass", + "persistentUuid": "15a3b7f4-f78f-4898-9037-58d9fc07eab8", + "sealed": true, + "width": 444, + "x": 816, + "y": 336, + "zOrder": -200, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "locked": true, + "name": "CornerWater", + "persistentUuid": "c4db8498-f834-4193-851a-6edf548d92a7", + "sealed": true, + "width": 0, + "x": 1248, + "y": 632, + "zOrder": -100, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 88, + "layer": "", + "locked": true, + "name": "WaterEdgeRight", + "persistentUuid": "06e0d51e-cafa-4f12-80ad-c7e158682e81", + "sealed": true, + "width": 16, + "x": 1248, + "y": 648, + "zOrder": -100, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 16, + "layer": "", + "locked": true, + "name": "NewTiledSprite", + "persistentUuid": "e7946e06-fbb2-4d69-a4de-8257e68caf91", + "sealed": true, + "width": 174, + "x": 1264, + "y": 632, + "zOrder": -100, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 160, + "layer": "", + "locked": true, + "name": "Water1", + "persistentUuid": "fb607f81-0e83-43a2-94c2-3c67a797f7d3", + "sealed": true, + "width": 432, + "x": 832, + "y": 736, + "zOrder": -10000, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 320, + "layer": "", + "locked": true, + "name": "Road1", + "persistentUuid": "b8a2b635-b626-4392-be21-6fa6fc7377fb", + "sealed": true, + "width": 32, + "x": 1200, + "y": 384, + "zOrder": 8, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 180, + "customSize": true, + "height": 5, + "layer": "", + "locked": true, + "name": "RoadEdge1", + "persistentUuid": "d0d4b9a5-3ba0-4ffb-a30c-d5c9b19b58aa", + "sealed": true, + "width": 304, + "x": 925, + "y": 704, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "locked": true, + "name": "Road1", + "persistentUuid": "859ff938-47b0-4884-a81b-647e4e158ae7", + "sealed": true, + "width": 336, + "x": 864, + "y": 672, + "zOrder": 8, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 5, + "layer": "", + "locked": true, + "name": "RoadEdge1", + "persistentUuid": "23e1b8be-0d93-433c-b724-582f9e59c65f", + "sealed": true, + "width": 304, + "x": 894, + "y": 672, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 90, + "customSize": true, + "height": 5, + "layer": "", + "locked": true, + "name": "RoadEdge1", + "persistentUuid": "eec3ba6d-5a91-4a21-b913-71d066e57200", + "sealed": true, + "width": 304, + "x": 1077.5, + "y": 550.5, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 270, + "customSize": true, + "height": 5, + "layer": "", + "locked": true, + "name": "RoadEdge1", + "persistentUuid": "2ef1961f-419f-44d7-8ca4-49b9aa5e0e58", + "sealed": true, + "width": 304, + "x": 1045.5, + "y": 521.5, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "locked": true, + "name": "Dock1", + "persistentUuid": "6d1893bf-7a30-4d60-9821-9367ab6b28ef", + "sealed": true, + "width": 0, + "x": 1248, + "y": 656, + "zOrder": -90, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 16, + "layer": "", + "locked": true, + "name": "NewTiledSprite", + "persistentUuid": "9a418a0e-ca5b-43c6-bc5a-47dd3e7c9395", + "sealed": true, + "width": 432, + "x": 816, + "y": 736, + "zOrder": -100, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 144, + "layer": "", + "locked": true, + "name": "Water1", + "persistentUuid": "22e45ac6-7fa4-4192-b80b-2627af6c404c", + "sealed": true, + "width": 176, + "x": 1264, + "y": 640, + "zOrder": -10000, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 264, + "layer": "", + "locked": true, + "name": "Grass", + "persistentUuid": "753fd074-6b60-4410-b871-257718ecbb5a", + "sealed": true, + "width": 224, + "x": 1248, + "y": 368, + "zOrder": -5200, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 112, + "layer": "", + "locked": true, + "name": "Water1", + "persistentUuid": "8f0fb863-d7c1-44e3-a76f-3325dc44a9bd", + "sealed": true, + "width": 176, + "x": 1264, + "y": 784, + "zOrder": 16, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "House2", + "persistentUuid": "50cf5a76-1b21-413d-b097-4006410e19a0", + "width": 0, + "x": 1163.75732421875, + "y": 516.7144165039062, + "zOrder": 18, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "House1", + "persistentUuid": "257f2fba-4cf0-4939-a27a-8a1be20a6360", + "width": 0, + "x": 1266.7686767578125, + "y": 469.999755859375, + "zOrder": 19, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 12, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "e64d3c30-d571-4270-9762-7e17f6d82e79", + "width": 128, + "x": 1304, + "y": 602, + "zOrder": 20, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 47, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "0166d221-c908-425d-8c2d-85f710145da4", + "width": 408, + "x": 856, + "y": 736, + "zOrder": 2000, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 43, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "33480495-66c7-4e10-8299-dbf261c66d0c", + "width": 27, + "x": 1295, + "y": 650, + "zOrder": 20, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 108, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "402ede23-0a65-43d9-a6ff-05b6c96e110c", + "width": 71, + "x": 1248, + "y": 684, + "zOrder": 20, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "0942d96b-64e0-4177-80d6-af792be074c8", + "width": 0, + "x": 1001.8545532226562, + "y": 573.4091186523438, + "zOrder": 17, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "087e6b10-ccad-4510-9f5f-21825814a4ea", + "width": 0, + "x": 966.8545532226562, + "y": 573.4091186523438, + "zOrder": 17, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "d03f44fb-f22e-4e9b-b668-e3048c3b85d9", + "width": 0, + "x": 1415.8544921875, + "y": 611.4091186523438, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "bfe14f18-e0c6-4601-9065-b47cf52b2741", + "width": 0, + "x": 1319.8544921875, + "y": 611.4091186523438, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "cd424d52-7fef-4947-ae1e-5d54718d6e49", + "width": 0, + "x": 1351.8544921875, + "y": 611.4091186523438, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "2f21620f-2352-48de-9ff8-f6c9a14d0fca", + "width": 0, + "x": 1383.8544921875, + "y": 611.4091186523438, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "cf41b047-35d9-47ee-a51a-7124aca7963b", + "width": 0, + "x": 1001.8545532226562, + "y": 669.4091186523438, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "0936ab8d-457e-4cff-b951-a81d2c3c2620", + "width": 0, + "x": 966.8545532226562, + "y": 669.4091186523438, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "320bae1c-a256-47d8-9ceb-e72ff29bfe19", + "width": 0, + "x": 1001.8545532226562, + "y": 637.4091186523438, + "zOrder": 21, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "856a2a60-357f-4227-a285-adba47f6661e", + "width": 0, + "x": 966.8545532226562, + "y": 637.4091186523438, + "zOrder": 21, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "727cb41f-dab9-417d-b21d-7468092e1cfb", + "width": 0, + "x": 1001.8545532226562, + "y": 605.4091186523438, + "zOrder": 19, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "ef1e1b3b-9249-45b8-b101-5e7317161cfd", + "width": 0, + "x": 966.8545532226562, + "y": 605.4091186523438, + "zOrder": 19, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "0c32cdf5-e064-4911-98f8-94e88d9a0dd4", + "width": 0, + "x": 1378.8544921875, + "y": 419.4090881347656, + "zOrder": 6, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "8cb20257-5d72-4286-8b9a-d708ce475792", + "width": 0, + "x": 1343.8544921875, + "y": 419.4090881347656, + "zOrder": 6, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "5e6e182a-d068-419f-be1d-90e7b6ae5bfb", + "width": 0, + "x": 1378.8544921875, + "y": 515.4090576171875, + "zOrder": 15, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "f3663d36-a4b0-4764-bc23-67cf0e52c427", + "width": 0, + "x": 1343.8544921875, + "y": 515.4090576171875, + "zOrder": 15, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "52a8a411-1129-4fde-8199-9fc4a2e109c2", + "width": 0, + "x": 1378.8544921875, + "y": 483.4090881347656, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "492d21f8-6bc5-43eb-a253-afb8fd9e1b15", + "width": 0, + "x": 1343.8544921875, + "y": 483.4090881347656, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "190ecd12-c376-44e0-8596-4f248869c9b2", + "width": 0, + "x": 1378.8544921875, + "y": 451.4090881347656, + "zOrder": 8, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "661388eb-93d3-4e91-b524-375e2e2bf730", + "width": 0, + "x": 1343.8544921875, + "y": 451.4090881347656, + "zOrder": 8, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree2", + "persistentUuid": "b0b0e407-1b28-4598-a1a3-b7458b78470c", + "width": 0, + "x": 936, + "y": 726, + "zOrder": 23, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree2", + "persistentUuid": "8bcb22b5-1be4-45c9-9474-329399ea1572", + "width": 0, + "x": 968, + "y": 726, + "zOrder": 24, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree2", + "persistentUuid": "fc36ad56-0594-41f2-ab03-f3636f37de58", + "width": 0, + "x": 1000, + "y": 726, + "zOrder": 25, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree2", + "persistentUuid": "e8b62d84-9066-4c1f-9cac-bb2ed23fcdc3", + "width": 0, + "x": 1032, + "y": 726, + "zOrder": 26, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree2", + "persistentUuid": "d0c7cbf9-cb86-47b6-8028-358a382a6d5a", + "width": 0, + "x": 1064, + "y": 726, + "zOrder": 27, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree2", + "persistentUuid": "0e8dcf9b-f190-43a7-b7bc-9f55299de48d", + "width": 0, + "x": 1096, + "y": 726, + "zOrder": 28, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree2", + "persistentUuid": "02a38c85-e098-42db-a61d-e500721d813f", + "width": 0, + "x": 1128, + "y": 726, + "zOrder": 29, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree2", + "persistentUuid": "97d673e0-9de6-4e77-920c-0f5eeea955c8", + "width": 0, + "x": 1160, + "y": 726, + "zOrder": 30, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree2", + "persistentUuid": "a59168c4-6668-42ad-addb-9597be75e3ed", + "width": 0, + "x": 1192, + "y": 726, + "zOrder": 31, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree2", + "persistentUuid": "f136c286-969a-41e3-ac47-14e650ec4a14", + "width": 0, + "x": 1224, + "y": 726, + "zOrder": 32, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree2", + "persistentUuid": "dfc9c297-d934-47bc-bf78-13cf5a0cae91", + "width": 0, + "x": 904, + "y": 726, + "zOrder": 33, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Bush1", + "persistentUuid": "13224ec5-4c04-4ac0-82b6-3bbd1662b56d", + "width": 0, + "x": 1119.3182373046875, + "y": 666.963623046875, + "zOrder": 34, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Bush1", + "persistentUuid": "f7b90ea5-457c-4587-b5ae-35f7525277bd", + "width": 0, + "x": 1191.3182373046875, + "y": 587.963623046875, + "zOrder": 34, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Bush1", + "persistentUuid": "ce36e224-ec14-4612-ba11-42d08115b6ba", + "width": 0, + "x": 1135.3182373046875, + "y": 666.963623046875, + "zOrder": 34, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Bush1", + "persistentUuid": "f26ea0bd-2b9b-4ed4-9841-f24f79223808", + "width": 0, + "x": 1176.3182373046875, + "y": 667.963623046875, + "zOrder": 34, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Bush1", + "persistentUuid": "ac22b506-432b-439f-87f7-c09fe2728baf", + "width": 0, + "x": 1191.3182373046875, + "y": 571.963623046875, + "zOrder": 34, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Bush1", + "persistentUuid": "cf8c62f1-95e8-4a2b-b30f-e6efe6da1f27", + "width": 0, + "x": 1191.3182373046875, + "y": 603.963623046875, + "zOrder": 34, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Bush1", + "persistentUuid": "d9e26baa-9441-49d3-a4d9-4751a12e41f7", + "width": 0, + "x": 1191.3182373046875, + "y": 587.963623046875, + "zOrder": 34, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 25, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "24c436a0-65e1-4cf5-a41d-a4576f8396e0", + "width": 192, + "x": 1248, + "y": 632, + "zOrder": 20, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 28, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "063f50b1-819e-48f0-83d8-6b9d823382b0", + "width": 64, + "x": 1232, + "y": 444, + "zOrder": 37, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 43, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "23d1aa3d-fbb9-4b47-9e79-de909e6e3734", + "width": 16, + "x": 1183, + "y": 566, + "zOrder": 42, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 12, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "e75bccdf-d800-4ac4-a6c6-16f7e625cbb4", + "width": 32, + "x": 1111, + "y": 660, + "zOrder": 42, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 12, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "d8010b2f-02ab-4edc-9132-c60fac7a68a5", + "width": 16, + "x": 1168, + "y": 660, + "zOrder": 42, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 10, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "9f305444-9017-4b48-af59-9cb928f521d8", + "width": 16, + "x": 896, + "y": 718, + "zOrder": 43, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 10, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "3eb63f6f-44ba-497f-8011-fbcf112f7fb2", + "width": 16, + "x": 1216, + "y": 718, + "zOrder": 43, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 10, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "3ee1a74f-1112-4a54-93a7-2a0ea71c6f5d", + "width": 16, + "x": 1184, + "y": 718, + "zOrder": 43, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 10, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "acf9a04b-9ff9-4881-8a10-1883d7e0ca0e", + "width": 16, + "x": 1152, + "y": 718, + "zOrder": 43, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 10, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "b8e70c7e-6547-44f3-b67e-96440b6fa347", + "width": 16, + "x": 1120, + "y": 718, + "zOrder": 43, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 10, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "dd91a27e-5ad7-4052-87aa-c36b2c4efb82", + "width": 16, + "x": 1088, + "y": 718, + "zOrder": 43, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 10, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "7b6e8dcb-846e-43d5-9765-a1bb3cec5f90", + "width": 16, + "x": 1056, + "y": 718, + "zOrder": 43, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 10, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "d7e15cb8-a299-43ca-9a78-f6492dc5d17b", + "width": 16, + "x": 1024, + "y": 718, + "zOrder": 43, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 10, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "15b5ed89-fa9a-463d-86bf-19e9904cd5bc", + "width": 16, + "x": 992, + "y": 718, + "zOrder": 43, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 10, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "4c16228c-d6f4-4d79-a2bc-a9d26c3119e1", + "width": 16, + "x": 960, + "y": 718, + "zOrder": 43, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 10, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "579eedd4-39ef-4e52-b76b-eb38318a82d5", + "width": 16, + "x": 928, + "y": 718, + "zOrder": 43, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "NPC", + "persistentUuid": "196cafb9-af98-435d-8107-4675c15d4990", + "width": 0, + "x": 1175.92724609375, + "y": 527.2363891601562, + "zOrder": 44, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "Dialogue", + "name": "Dialogue", + "persistentUuid": "caf097a8-67e7-4d4e-b372-23ef93794341", + "width": 0, + "x": 326, + "y": 827, + "zOrder": 45, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 247, + "layer": "Dialogue", + "name": "TextBorder", + "persistentUuid": "e12d230a-0da4-42e4-b9a3-34cd6b21804b", + "width": 1344, + "x": 288, + "y": 800, + "zOrder": 43, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 16, + "layer": "", + "name": "E", + "persistentUuid": "f3745d28-ecfe-4aa1-ad5d-c3d0ed30886e", + "width": 16, + "x": 1173, + "y": 504, + "zOrder": 600, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "Transition", + "name": "Transition", + "persistentUuid": "f51be381-f77f-4bdb-a630-df379ad3f9f6", + "width": 0, + "x": 1552, + "y": 640, + "zOrder": 503, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 48, + "layer": "Dialogue", + "name": "YesButton", + "persistentUuid": "550f652b-972c-4c6b-93fd-5c0dfaabeba8", + "width": 144, + "x": 1280, + "y": 976, + "zOrder": 509, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 48, + "layer": "Dialogue", + "name": "NoButton", + "persistentUuid": "c1137197-ee6a-430b-9055-699dbb70a65e", + "width": 144, + "x": 1456, + "y": 976, + "zOrder": 510, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Player", + "persistentUuid": "eb3eb9c8-9e76-4d2e-89c0-600889f54713", + "width": 0, + "x": 1216, + "y": 624, + "zOrder": 511, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 14, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "6e019a57-fd94-42ab-ad44-c926536191b4", + "width": 18, + "x": 1167, + "y": 518, + "zOrder": 40, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "e6e9a3f5-84bd-450b-b6b2-a52fa872e4bd", + "width": 0, + "x": 1071.8544921875, + "y": 573.4091186523438, + "zOrder": 17, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "bd164f8c-0c89-42c2-a0cd-614f4c2e6b0b", + "width": 0, + "x": 1036.8544921875, + "y": 573.4091186523438, + "zOrder": 17, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "73e6c36d-2f81-41c4-b21c-aa9c9455d192", + "width": 0, + "x": 1071.8544921875, + "y": 669.4091186523438, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "ef6ea253-f38d-4c4e-9ae5-09c93459771b", + "width": 0, + "x": 1036.8544921875, + "y": 669.4091186523438, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "023cda18-5694-4b46-ba3c-d4cdc103e5e2", + "width": 0, + "x": 1071.8544921875, + "y": 637.4091186523438, + "zOrder": 21, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "304e1062-cadb-4912-9831-4fed4c49a40d", + "width": 0, + "x": 1036.8544921875, + "y": 637.4091186523438, + "zOrder": 21, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "f87da9e9-3ef2-4e48-b86b-c4bc37409488", + "width": 0, + "x": 1071.8544921875, + "y": 605.4091186523438, + "zOrder": 19, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "45fa6d46-1082-4242-a07d-2c76b5f2816e", + "width": 0, + "x": 1036.8544921875, + "y": 605.4091186523438, + "zOrder": 19, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "c19ef060-41f0-4c8f-b929-9b51eb321703", + "width": 0, + "x": 1448.8544921875, + "y": 419.4090881347656, + "zOrder": 6, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "3a07c208-86c3-46aa-8606-b001850e0b81", + "width": 0, + "x": 1413.8544921875, + "y": 419.4090881347656, + "zOrder": 6, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "0f0ebe6a-2d67-427a-b4f0-d10bef2f4dbd", + "width": 0, + "x": 1448.8544921875, + "y": 515.4090576171875, + "zOrder": 15, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "e2bcbcf9-5558-47e6-996f-9d7b8092c128", + "width": 0, + "x": 1413.8544921875, + "y": 515.4090576171875, + "zOrder": 15, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "535dac12-efa0-4ea3-b2b7-316ed2bbe745", + "width": 0, + "x": 1448.8544921875, + "y": 483.4090881347656, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "bff93b18-8272-4ca8-b075-0c57b853201e", + "width": 0, + "x": 1413.8544921875, + "y": 483.4090881347656, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "e8ad3e5d-dfe5-4000-bde3-611a7c393593", + "width": 0, + "x": 1448.8544921875, + "y": 451.4090881347656, + "zOrder": 8, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "cf9ec7f8-4c76-44e4-8d77-36c4d4c0b2e8", + "width": 0, + "x": 1413.8544921875, + "y": 451.4090881347656, + "zOrder": 8, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 106, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "96df7b17-0bdf-4beb-974e-1b72a5880a9c", + "width": 137, + "x": 1328, + "y": 411, + "zOrder": 39, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "locked": true, + "name": "WaterCorner2", + "persistentUuid": "35b1989e-4eec-45cf-95f5-0e883f81f798", + "sealed": true, + "width": 0, + "x": 1248, + "y": 736, + "zOrder": 512, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 28, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "8256bb0e-129f-40a9-a043-6d00aa892d9e", + "width": 64, + "x": 1128, + "y": 492, + "zOrder": 37, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "House1", + "persistentUuid": "1617e46b-73cf-4a15-83a5-6d73899c0a54", + "width": 0, + "x": 1266.7686767578125, + "y": 565.999755859375, + "zOrder": 19, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 28, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "748e3900-a1ad-46bd-bf07-fbaa23fa3a92", + "width": 64, + "x": 1232, + "y": 540, + "zOrder": 37, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "5ce48746-120f-4f67-a544-11f33773ede8", + "width": 0, + "x": 1001.8545532226562, + "y": 445.4090881347656, + "zOrder": 6, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "4f21966d-7793-4fd3-9aed-6e5f8e432c25", + "width": 0, + "x": 966.8545532226562, + "y": 445.4090881347656, + "zOrder": 6, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "bb26eca6-bd33-48a5-a751-fb3e32cd1fec", + "width": 0, + "x": 1001.8545532226562, + "y": 541.4090576171875, + "zOrder": 15, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "ffa5f4d1-195f-4a64-b0fa-d71620a422ba", + "width": 0, + "x": 966.8545532226562, + "y": 541.4090576171875, + "zOrder": 15, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "a69cb3c7-2d40-4b46-8251-5753a776acbb", + "width": 0, + "x": 1001.8545532226562, + "y": 509.4090881347656, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "e8b6cde7-34e3-4b4c-8763-fe13d91e4925", + "width": 0, + "x": 966.8545532226562, + "y": 509.4090881347656, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "15d6116b-1d15-41fc-8d58-b91ffdf478e9", + "width": 0, + "x": 1001.8545532226562, + "y": 477.4090881347656, + "zOrder": 8, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "869d4cf7-05f9-4956-80cd-090ca1394379", + "width": 0, + "x": 966.8545532226562, + "y": 477.4090881347656, + "zOrder": 8, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "f26dc266-d8af-474e-b549-c1554f3cfa3c", + "width": 0, + "x": 1071.8544921875, + "y": 445.4090881347656, + "zOrder": 6, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "af98ae35-6a68-4cdb-aea1-efb8592d85fd", + "width": 0, + "x": 1036.8544921875, + "y": 445.4090881347656, + "zOrder": 6, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "c1a05778-f419-4983-baad-24c8510dbced", + "width": 0, + "x": 1071.8544921875, + "y": 541.4090576171875, + "zOrder": 15, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "ecbfa823-a2e1-4fe0-9a1f-eab29699b012", + "width": 0, + "x": 1036.8544921875, + "y": 541.4090576171875, + "zOrder": 15, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "19c30ee7-1c1f-4394-a5cb-1c553d97d44e", + "width": 0, + "x": 1071.8544921875, + "y": 509.4090881347656, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "7c8e320b-62ba-4887-b6eb-a11855c20bac", + "width": 0, + "x": 1036.8544921875, + "y": 509.4090881347656, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "1bc000dc-d9aa-4158-a36a-41f9bd6577fe", + "width": 0, + "x": 1071.8544921875, + "y": 477.4090881347656, + "zOrder": 8, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "fcde295b-5629-4144-ace7-b701b1238529", + "width": 0, + "x": 1036.8544921875, + "y": 477.4090881347656, + "zOrder": 8, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 238, + "layer": "", + "name": "CollisionDetect", + "persistentUuid": "22eec5f2-dd86-44d1-aabc-12329e6b3671", + "width": 137, + "x": 950.9864501953125, + "y": 434, + "zOrder": 39, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "objects": [ + { + "assetStoreId": "", + "name": "Player", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "TopDownMovement", + "type": "TopDownMovementBehavior::TopDownMovementBehavior", + "acceleration": 900000, + "allowDiagonals": false, + "angleOffset": 0, + "angularMaxSpeed": 180, + "customIsometryAngle": 30, + "deceleration": 900000, + "ignoreDefaultControls": false, + "maxSpeed": 50, + "movementAngleOffset": 0, + "rotateObject": false, + "viewpoint": "TopDown" + } + ], + "animations": [ + { + "name": "Down", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.20000000298023224, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "ACharDown1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 8, + "y": 16 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 2, + "y": 13 + }, + { + "x": 14, + "y": 13 + }, + { + "x": 14, + "y": 16 + }, + { + "x": 2, + "y": 16 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "ACharDown2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 8, + "y": 16 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 2, + "y": 13 + }, + { + "x": 14, + "y": 13 + }, + { + "x": 14, + "y": 16 + }, + { + "x": 2, + "y": 16 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "ACharDown3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 8, + "y": 16 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 2, + "y": 13 + }, + { + "x": 14, + "y": 13 + }, + { + "x": 14, + "y": 16 + }, + { + "x": 2, + "y": 16 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "ACharDown4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 8, + "y": 16 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 2, + "y": 13 + }, + { + "x": 14, + "y": 13 + }, + { + "x": 14, + "y": 16 + }, + { + "x": 2, + "y": 16 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Right", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.20000000298023224, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "ACgarRight1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 8, + "y": 16 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 2, + "y": 13 + }, + { + "x": 14, + "y": 13 + }, + { + "x": 14, + "y": 16 + }, + { + "x": 2, + "y": 16 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "ACgarRight2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 8, + "y": 16 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 2, + "y": 13 + }, + { + "x": 14, + "y": 13 + }, + { + "x": 14, + "y": 16 + }, + { + "x": 2, + "y": 16 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "ACgarRight3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 8, + "y": 16 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 2, + "y": 13 + }, + { + "x": 14, + "y": 13 + }, + { + "x": 14, + "y": 16 + }, + { + "x": 2, + "y": 16 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "ACgarRight4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 8, + "y": 16 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 2, + "y": 13 + }, + { + "x": 14, + "y": 13 + }, + { + "x": 14, + "y": 16 + }, + { + "x": 2, + "y": 16 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Left", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.20000000298023224, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "ACharLeft1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 8, + "y": 16 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 2, + "y": 13 + }, + { + "x": 14, + "y": 13 + }, + { + "x": 14, + "y": 16 + }, + { + "x": 2, + "y": 16 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "ACharLeft2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 8, + "y": 16 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 2, + "y": 13 + }, + { + "x": 14, + "y": 13 + }, + { + "x": 14, + "y": 16 + }, + { + "x": 2, + "y": 16 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "ACharLeft3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 8, + "y": 16 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 2, + "y": 13 + }, + { + "x": 14, + "y": 13 + }, + { + "x": 14, + "y": 16 + }, + { + "x": 2, + "y": 16 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "ACharLeft4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 8, + "y": 16 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 2, + "y": 13 + }, + { + "x": 14, + "y": 13 + }, + { + "x": 14, + "y": 16 + }, + { + "x": 2, + "y": 16 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Up", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.20000000298023224, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "ACharUp1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 8, + "y": 16 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 2, + "y": 13 + }, + { + "x": 14, + "y": 13 + }, + { + "x": 14, + "y": 16 + }, + { + "x": 2, + "y": 16 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "ACharUp2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 8, + "y": 16 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 2, + "y": 13 + }, + { + "x": 14, + "y": 13 + }, + { + "x": 14, + "y": 16 + }, + { + "x": 2, + "y": 16 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "ACharUp3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 8, + "y": 16 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 2, + "y": 13 + }, + { + "x": 14, + "y": 13 + }, + { + "x": 14, + "y": 16 + }, + { + "x": 2, + "y": 16 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "ACharUp4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 8, + "y": 16 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 2, + "y": 13 + }, + { + "x": 14, + "y": 13 + }, + { + "x": 14, + "y": 16 + }, + { + "x": 2, + "y": 16 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "name": "NPC", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Down", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.20000000298023224, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "ACharDown1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 7.927276611328125, + "y": 15.236364364624023 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 17 + }, + { + "x": 15, + "y": 17 + }, + { + "x": 15, + "y": 20 + }, + { + "x": 9, + "y": 20 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "name": "Dock1", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Dock1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "name": "Tree1", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Tree1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 15.854545593261719, + "y": 27.40909194946289 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "name": "Tree2", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Tree2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16.000001907348633, + "y": 30.618200302124023 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "name": "Bush1", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Bush1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 8.318181991577148, + "y": 11.963641166687012 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "name": "House1", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "House1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 34.76862716674805, + "y": 45.99976348876953 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "name": "House2", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "House2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 35.75733947753906, + "y": 44.714439392089844 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "name": "CornerWater", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "WaterCorner.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "name": "WaterCorner2", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "WaterCorner2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "height": 32, + "name": "Grass", + "tags": "", + "texture": "Grass1.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "height": 16, + "name": "WaterEdgeRight", + "tags": "", + "texture": "WaterEdgeRight.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "height": 32, + "name": "NewTiledSprite", + "tags": "", + "texture": "WaterEdgeUp.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 16, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "height": 32, + "name": "Water1", + "tags": "", + "texture": "Water1.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "height": 16, + "name": "Road1", + "tags": "", + "texture": "Road1.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 16, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "height": 5, + "name": "RoadEdge1", + "tags": "", + "texture": "RoadEdge1.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 36, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "name": "CollisionDetect", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Enemy_Spawn_Location.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "name": "Dialogue", + "tags": "", + "type": "BitmapText::BitmapTextObject", + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "BitmapText_AutoTyping", + "type": "AutoTyping::BitmapText_AutoTyping", + "Interval": 0.05, + "CharacterJustAdded": false, + "CurrentCharacter": "" + } + ], + "content": { + "text": "Do you want to battle?\nI have the best creatures in town!", + "opacity": 255, + "scale": 3, + "fontSize": 20, + "tint": "255;255;255", + "bitmapFontResourceName": "8BitOperatorPlus8Regular_Edited.fnt", + "textureAtlasResourceName": "8BitOperatorPlus8Regular_Edited.png", + "align": "left", + "wordWrap": true + } + }, + { + "assetStoreId": "", + "name": "E", + "tags": "", + "type": "BitmapText::BitmapTextObject", + "variables": [], + "effects": [ + { + "effectType": "Outline", + "name": "Effect", + "doubleParameters": { + "padding": 2, + "thickness": 2 + }, + "stringParameters": { + "color": "0;0;0" + }, + "booleanParameters": {} + } + ], + "behaviors": [ + { + "name": "ShakeObject_PositionAngle", + "type": "ShakeObject::ShakeObject_PositionAngle" + } + ], + "content": { + "text": "E", + "opacity": 255, + "scale": 0.5, + "fontSize": 20, + "tint": "255;255;255", + "bitmapFontResourceName": "8BitOperatorPlus8Regular_Edited.fnt", + "textureAtlasResourceName": "8BitOperatorPlus8Regular_Edited.png", + "align": "left", + "wordWrap": true + } + }, + { + "assetStoreId": "", + "name": "E2", + "tags": "", + "type": "BitmapText::BitmapTextObject", + "variables": [], + "effects": [ + { + "effectType": "Outline", + "name": "Effect", + "doubleParameters": { + "padding": 2, + "thickness": 2 + }, + "stringParameters": { + "color": "0;0;0" + }, + "booleanParameters": {} + } + ], + "behaviors": [ + { + "name": "ShakeObject_PositionAngle", + "type": "ShakeObject::ShakeObject_PositionAngle" + } + ], + "content": { + "text": "E", + "opacity": 255, + "scale": 0.5, + "fontSize": 20, + "tint": "255;255;255", + "bitmapFontResourceName": "8BitOperatorPlus8Regular_Edited.fnt", + "textureAtlasResourceName": "8BitOperatorPlus8Regular_Edited.png", + "align": "left", + "wordWrap": true + } + }, + { + "assetStoreId": "90d94b6e3a23c34948e59eaaef4679740f8ab588696d59b21e0c0c2ef106b94d", + "name": "YesButton", + "tags": "", + "type": "PanelSpriteButton::PanelSpriteButton", + "variables": [], + "effects": [], + "behaviors": [], + "content": { + "LeftPadding": 16, + "RightPadding": 16, + "PressedLabelOffsetY": 0, + "IdleLabelOffsetY": -8, + "BottomPadding": 16, + "TopPadding": 16, + "MinimalWidth": 300 + }, + "childrenContent": { + "Hovered": { + "bottomMargin": 32, + "height": 106, + "leftMargin": 16, + "rightMargin": 16, + "texture": "Border2.png", + "tiled": true, + "topMargin": 16, + "width": 256 + }, + "Idle": { + "bottomMargin": 32, + "height": 106, + "leftMargin": 16, + "rightMargin": 16, + "texture": "Border.png", + "tiled": true, + "topMargin": 16, + "width": 256 + }, + "Label": { + "bold": false, + "italic": false, + "smoothed": true, + "underlined": false, + "string": "Yes", + "font": "", + "characterSize": 40, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + }, + "Pressed": { + "bottomMargin": 16, + "height": 106, + "leftMargin": 16, + "rightMargin": 16, + "texture": "Border2.png", + "tiled": true, + "topMargin": 32, + "width": 256 + } + } + }, + { + "assetStoreId": "90d94b6e3a23c34948e59eaaef4679740f8ab588696d59b21e0c0c2ef106b94d", + "name": "NoButton", + "tags": "", + "type": "PanelSpriteButton::PanelSpriteButton", + "variables": [], + "effects": [], + "behaviors": [], + "content": { + "LeftPadding": 16, + "RightPadding": 16, + "PressedLabelOffsetY": 0, + "IdleLabelOffsetY": -8, + "BottomPadding": 16, + "TopPadding": 16, + "MinimalWidth": 300 + }, + "childrenContent": { + "Hovered": { + "bottomMargin": 32, + "height": 106, + "leftMargin": 16, + "rightMargin": 16, + "texture": "Border2.png", + "tiled": true, + "topMargin": 16, + "width": 256 + }, + "Idle": { + "bottomMargin": 32, + "height": 106, + "leftMargin": 16, + "rightMargin": 16, + "texture": "Border.png", + "tiled": true, + "topMargin": 16, + "width": 256 + }, + "Label": { + "bold": false, + "italic": false, + "smoothed": true, + "underlined": false, + "string": "No", + "font": "", + "characterSize": 40, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + }, + "Pressed": { + "bottomMargin": 16, + "height": 106, + "leftMargin": 16, + "rightMargin": 16, + "texture": "Border2.png", + "tiled": true, + "topMargin": 32, + "width": 256 + } + } + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ZoomCamera" + }, + "parameters": [ + "", + "6", + "", + "" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "PhysicalObject", + "=", + "PhysicalObject.Y()" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "CollisionDetect" + ] + }, + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngle::ShakeObject_PositionAngle" + }, + "parameters": [ + "E", + "ShakeObject_PositionAngle", + "0.5", + "0", + "2", + "10", + "1", + "yes", + "" + ] + }, + { + "type": { + "value": "ZoomCamera" + }, + "parameters": [ + "", + "1.5", + "\"Transition\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "Player", + "=", + "Player.Y()" + ] + }, + { + "type": { + "value": "SeparateFromObjects" + }, + "parameters": [ + "Player", + "CollisionDetect", + "" + ] + }, + { + "type": { + "value": "CentreCamera" + }, + "parameters": [ + "", + "Player", + "", + "", + "" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "PlayerMovement", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "LayerVisible" + }, + "parameters": [ + "", + "\"Dialogue\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Player", + "TopDownMovement", + "yes" + ] + }, + { + "type": { + "value": "Montre" + }, + "parameters": [ + "E", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "YesButton" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "NoButton" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TopDownMovementBehavior::TopDownMovementBehavior::IsUsingControl" + }, + "parameters": [ + "Player", + "TopDownMovement", + "\"Up\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAnimationName" + }, + "parameters": [ + "Player", + "\"Up\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TopDownMovementBehavior::TopDownMovementBehavior::IsUsingControl" + }, + "parameters": [ + "Player", + "TopDownMovement", + "\"Down\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAnimationName" + }, + "parameters": [ + "Player", + "\"Down\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TopDownMovementBehavior::TopDownMovementBehavior::IsUsingControl" + }, + "parameters": [ + "Player", + "TopDownMovement", + "\"Right\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAnimationName" + }, + "parameters": [ + "Player", + "\"Right\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TopDownMovementBehavior::TopDownMovementBehavior::IsUsingControl" + }, + "parameters": [ + "Player", + "TopDownMovement", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAnimationName" + }, + "parameters": [ + "Player", + "\"Left\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "TopDownMovementBehavior::IsMoving" + }, + "parameters": [ + "Player", + "TopDownMovement" + ] + } + ], + "actions": [ + { + "type": { + "value": "PauseAnimation" + }, + "parameters": [ + "Player" + ] + }, + { + "type": { + "value": "ChangeSprite" + }, + "parameters": [ + "Player", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TopDownMovementBehavior::IsMoving" + }, + "parameters": [ + "Player", + "TopDownMovement" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlayAnimation" + }, + "parameters": [ + "Player" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Dialogue", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Distance" + }, + "parameters": [ + "Player", + "NPC", + "20", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "", + "e" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ShowLayer" + }, + "parameters": [ + "", + "\"Dialogue\"" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "E" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "LayerVisible" + }, + "parameters": [ + "", + "\"Dialogue\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AutoTyping::BitmapText_AutoTyping::StartAtBeginning" + }, + "parameters": [ + "Dialogue", + "BitmapText_AutoTyping", + "" + ] + }, + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Player", + "TopDownMovement", + "" + ] + }, + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "Talk.wav", + "", + "50", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "AutoTyping::BitmapText_AutoTyping::TypingFinished" + }, + "parameters": [ + "Dialogue", + "BitmapText_AutoTyping", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Montre" + }, + "parameters": [ + "YesButton", + "" + ] + }, + { + "type": { + "value": "Montre" + }, + "parameters": [ + "NoButton", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Visible" + }, + "parameters": [ + "YesButton" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::IsClicked" + }, + "parameters": [ + "YesButton", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PaintEffect" + }, + "parameters": [ + "Transition", + "FlashTransitionPainter", + "\"0;0;0\"", + "1", + "\"Circular\"", + "\"Forward\"", + "255", + "" + ] + }, + { + "type": { + "value": "Wait" + }, + "parameters": [ + "1" + ] + }, + { + "type": { + "value": "PushScene" + }, + "parameters": [ + "", + "\"Battle\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::IsClicked" + }, + "parameters": [ + "NoButton", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "HideLayer" + }, + "parameters": [ + "", + "\"Dialogue\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::IsHovered" + }, + "parameters": [ + "NoButton", + "" + ] + }, + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::IsHovered" + }, + "parameters": [ + "YesButton", + "" + ] + } + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "HoverSound.wav", + "", + "20", + "RandomFloatInRange(0.8,0.9)" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "layers": [ + { + "ambientLightColorB": 0, + "ambientLightColorG": 19942824, + "ambientLightColorR": 16, + "followBaseLayerCamera": false, + "isLightingLayer": false, + "name": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + }, + { + "ambientLightColorB": 13920576, + "ambientLightColorG": 6050880, + "ambientLightColorR": 11874240, + "followBaseLayerCamera": false, + "isLightingLayer": false, + "name": "Dialogue", + "visibility": false, + "cameras": [], + "effects": [] + }, + { + "ambientLightColorB": 8799112, + "ambientLightColorG": 6050880, + "ambientLightColorR": 12506048, + "followBaseLayerCamera": false, + "isLightingLayer": false, + "name": "Transition", + "visibility": true, + "cameras": [], + "effects": [] + } + ], + "behaviorsSharedData": [ + { + "name": "BitmapText_AutoTyping", + "type": "AutoTyping::BitmapText_AutoTyping" + }, + { + "name": "FlashTransitionPainter", + "type": "FlashTransitionPainter::FlashTransitionPainter" + }, + { + "name": "ShakeObject_PositionAngle", + "type": "ShakeObject::ShakeObject_PositionAngle" + }, + { + "name": "TopDownMovement", + "type": "TopDownMovementBehavior::TopDownMovementBehavior" + } + ] + }, + { + "b": 146, + "disableInputWhenNotFocused": true, + "mangledName": "Battle", + "name": "Battle", + "r": 156, + "standardSortMethod": true, + "stopSoundsOnStartup": true, + "title": "", + "v": 146, + "uiSettings": { + "grid": false, + "gridType": "rectangular", + "gridWidth": 32, + "gridHeight": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.2, + "snap": false, + "zoomFactor": 0.2299999999999997, + "windowMask": false + }, + "objectsGroups": [], + "variables": [], + "instances": [ + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "UI", + "name": "Transition", + "persistentUuid": "767cf046-bd7e-46a6-a0de-9e463bf21835", + "width": 0, + "x": 2104, + "y": 596, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 400, + "layer": "", + "name": "Enemy", + "persistentUuid": "c09519df-6e7e-41f3-8c2e-05be52194d06", + "width": 400, + "x": 1241, + "y": 136, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 600, + "layer": "", + "name": "Player", + "persistentUuid": "9176821a-39ac-48bf-a647-1af51f1cf6b8", + "width": 600, + "x": 203, + "y": 252, + "zOrder": 3, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 320, + "layer": "Dialogue", + "name": "TextBorder", + "persistentUuid": "3eda7dbd-af4a-4a6f-a7d9-d9e294bbc3aa", + "width": 1792, + "x": 64, + "y": 704, + "zOrder": 4, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 68, + "layer": "", + "name": "Player_HealthBar", + "persistentUuid": "a8733f20-e9a2-4f82-a152-caf9c12703de", + "width": 448, + "x": 288, + "y": 192, + "zOrder": 5, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 68, + "layer": "", + "name": "HealthBorder", + "persistentUuid": "dd99757b-c891-495b-90f1-ce12f42d12d1", + "width": 448, + "x": 1216, + "y": 540, + "zOrder": 6, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 68, + "layer": "", + "name": "HealthBorder", + "persistentUuid": "3ab5fea9-bffc-4e4a-ad20-968e26ddcfef", + "width": 448, + "x": 288, + "y": 192, + "zOrder": 6, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 68, + "layer": "", + "name": "Enemy_HealthBar", + "persistentUuid": "33f86b74-e137-45b3-97f5-9a456a8936cc", + "width": 448, + "x": 1216, + "y": 540, + "zOrder": 4, + "numberProperties": [ + { + "name": "animation", + "value": 0 + } + ], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 64, + "layer": "Dialogue", + "name": "Attack1", + "persistentUuid": "7dc38f8a-b2d4-4716-96cc-cfda55183779", + "width": 256, + "x": 160, + "y": 736, + "zOrder": 7, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 64, + "layer": "Dialogue", + "name": "Attack2", + "persistentUuid": "be19237c-cdfd-46d6-9f03-ac226e9a3f61", + "width": 256, + "x": 160, + "y": 832, + "zOrder": 8, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 64, + "layer": "Dialogue", + "name": "Run", + "persistentUuid": "d0d0038e-afed-4b66-afad-9eb83d409837", + "width": 256, + "x": 160, + "y": 928, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 256, + "layer": "Dialogue", + "name": "Dialogue", + "persistentUuid": "1d6dd4c3-a14e-4637-b8ba-6dad23785fdd", + "width": 1248, + "x": 512, + "y": 736, + "zOrder": 10, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 128, + "layer": "Background", + "name": "Grass", + "persistentUuid": "51b4918b-fb97-491c-8070-567de75dafb1", + "width": 256, + "x": 2560, + "y": 800, + "zOrder": -100, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 133, + "layer": "Background", + "name": "Background", + "persistentUuid": "a759a552-ce69-4fb4-bf22-05ee11499324", + "width": 250, + "x": 2567, + "y": 708, + "zOrder": 11, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "objects": [ + { + "assetStoreId": "", + "name": "Enemy", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Flash", + "type": "Flash::Flash", + "HalfPeriodTime": 0.1, + "IsFlashing": false, + "FlashDuration": 0 + }, + { + "name": "Health", + "type": "Health::Health", + "Health": 100, + "CurrentHealth": 0, + "MaxHealth": 100, + "DamageCooldown": 0, + "IsHealthJustDamaged": false, + "HealthRegenRate": 0, + "HealthRegenDelay": 0, + "AllowOverHealing": false, + "HitAtLeastOnce": false, + "IsJustHealed": false, + "CurrentShieldPoints": 0, + "MaxShieldPoints": 0, + "ShieldDuration": 5, + "ShieldRegenRate": 0, + "BlockExcessDamage": false, + "ShieldRegenDelay": 0, + "IsShieldJustDamaged": false, + "ChanceToDodge": 0, + "DamageToBeApplied": 0, + "FlatDamageReduction": 0, + "PercentDamageReduction": 0, + "IsJustDodged": false, + "ShieldDamageTaken": 0, + "HealToBeApplied": 0 + }, + { + "name": "ShakeObject_PositionAngle", + "type": "ShakeObject::ShakeObject_PositionAngle" + }, + { + "name": "ShakeObject_PositionAngleScale", + "type": "ShakeObject::ShakeObject_PositionAngleScale" + }, + { + "name": "Tween", + "type": "Tween::TweenBehavior" + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Creature_Enemy.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "name": "Player", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Flash", + "type": "Flash::Flash", + "HalfPeriodTime": 0.1, + "IsFlashing": false, + "FlashDuration": 0 + }, + { + "name": "Health", + "type": "Health::Health", + "Health": 100, + "CurrentHealth": 0, + "MaxHealth": 100, + "DamageCooldown": 0, + "IsHealthJustDamaged": false, + "HealthRegenRate": 0, + "HealthRegenDelay": 0, + "AllowOverHealing": false, + "HitAtLeastOnce": false, + "IsJustHealed": false, + "CurrentShieldPoints": 0, + "MaxShieldPoints": 0, + "ShieldDuration": 5, + "ShieldRegenRate": 0, + "BlockExcessDamage": false, + "ShieldRegenDelay": 0, + "IsShieldJustDamaged": false, + "ChanceToDodge": 0, + "DamageToBeApplied": 0, + "FlatDamageReduction": 0, + "PercentDamageReduction": 0, + "IsJustDodged": false, + "ShieldDamageTaken": 0, + "HealToBeApplied": 0 + }, + { + "name": "ShakeObject_PositionAngle", + "type": "ShakeObject::ShakeObject_PositionAngle" + }, + { + "name": "ShakeObject_PositionAngleScale", + "type": "ShakeObject::ShakeObject_PositionAngleScale" + }, + { + "name": "Tween", + "type": "Tween::TweenBehavior" + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Creature_Player.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "name": "Player_HealthBar", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Healthbar.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "name": "Enemy_HealthBar", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Healthbar.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "name": "HealthBorder", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "HealthbarBorder.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "name": "Dialogue", + "tags": "", + "type": "BitmapText::BitmapTextObject", + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "BitmapText_AutoTyping", + "type": "AutoTyping::BitmapText_AutoTyping", + "Interval": 0.02, + "CharacterJustAdded": false, + "CurrentCharacter": "" + } + ], + "content": { + "text": "The battle begins.", + "opacity": 255, + "scale": 3, + "fontSize": 20, + "tint": "255;255;255", + "bitmapFontResourceName": "8BitOperatorPlus8Regular_Edited.fnt", + "textureAtlasResourceName": "8BitOperatorPlus8Regular_Edited.png", + "align": "left", + "wordWrap": true + } + }, + { + "assetStoreId": "", + "name": "NewButton", + "tags": "", + "type": "PanelSpriteButton::PanelSpriteButton", + "variables": [], + "effects": [], + "behaviors": [], + "content": {}, + "childrenContent": { + "Hovered": { + "bottomMargin": 16, + "height": 48, + "leftMargin": 16, + "rightMargin": 16, + "texture": "Border-export.png", + "tiled": false, + "topMargin": 16, + "width": 48 + }, + "Idle": { + "bottomMargin": 0, + "height": 32, + "leftMargin": 0, + "rightMargin": 0, + "texture": "", + "tiled": false, + "topMargin": 0, + "width": 32 + }, + "Label": { + "bold": false, + "italic": false, + "smoothed": true, + "underlined": false, + "string": "Text", + "font": "", + "characterSize": 20, + "color": { + "b": 0, + "g": 0, + "r": 0 + } + }, + "Pressed": { + "bottomMargin": 0, + "height": 32, + "leftMargin": 0, + "rightMargin": 0, + "texture": "", + "tiled": false, + "topMargin": 0, + "width": 32 + } + } + }, + { + "assetStoreId": "", + "height": 32, + "name": "Grass", + "tags": "", + "texture": "Grass1.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "name": "House2", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [ + { + "effectType": "KawaseBlur", + "name": "Effect", + "doubleParameters": { + "blur": 0.5, + "padding": 0, + "pixelizeX": 1, + "pixelizeY": 1, + "quality": 3 + }, + "stringParameters": {}, + "booleanParameters": {} + } + ], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "House2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 36.8875617980957, + "y": 58.29928970336914 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "90d94b6e3a23c34948e59eaaef4679740f8ab588696d59b21e0c0c2ef106b94d", + "name": "Attack1", + "tags": "", + "type": "PanelSpriteButton::PanelSpriteButton", + "variables": [], + "effects": [], + "behaviors": [], + "content": { + "LeftPadding": 16, + "RightPadding": 16, + "PressedLabelOffsetY": 0, + "IdleLabelOffsetY": -8, + "BottomPadding": 16, + "TopPadding": 16, + "MinimalWidth": 300 + }, + "childrenContent": { + "Hovered": { + "bottomMargin": 32, + "height": 106, + "leftMargin": 16, + "rightMargin": 16, + "texture": "Border2.png", + "tiled": true, + "topMargin": 16, + "width": 256 + }, + "Idle": { + "bottomMargin": 32, + "height": 106, + "leftMargin": 16, + "rightMargin": 16, + "texture": "Border.png", + "tiled": true, + "topMargin": 16, + "width": 256 + }, + "Label": { + "bold": false, + "italic": false, + "smoothed": true, + "underlined": false, + "string": "Attack", + "font": "", + "characterSize": 40, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + }, + "Pressed": { + "bottomMargin": 16, + "height": 106, + "leftMargin": 16, + "rightMargin": 16, + "texture": "Border2.png", + "tiled": true, + "topMargin": 32, + "width": 256 + } + } + }, + { + "assetStoreId": "90d94b6e3a23c34948e59eaaef4679740f8ab588696d59b21e0c0c2ef106b94d", + "name": "Attack2", + "tags": "", + "type": "PanelSpriteButton::PanelSpriteButton", + "variables": [], + "effects": [], + "behaviors": [], + "content": { + "LeftPadding": 16, + "RightPadding": 16, + "PressedLabelOffsetY": 0, + "IdleLabelOffsetY": -8, + "BottomPadding": 16, + "TopPadding": 16, + "MinimalWidth": 300 + }, + "childrenContent": { + "Hovered": { + "bottomMargin": 32, + "height": 106, + "leftMargin": 16, + "rightMargin": 16, + "texture": "Border2.png", + "tiled": true, + "topMargin": 16, + "width": 256 + }, + "Idle": { + "bottomMargin": 32, + "height": 106, + "leftMargin": 16, + "rightMargin": 16, + "texture": "Border.png", + "tiled": true, + "topMargin": 16, + "width": 256 + }, + "Label": { + "bold": false, + "italic": false, + "smoothed": true, + "underlined": false, + "string": "Skill", + "font": "", + "characterSize": 40, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + }, + "Pressed": { + "bottomMargin": 16, + "height": 106, + "leftMargin": 16, + "rightMargin": 16, + "texture": "Border2.png", + "tiled": true, + "topMargin": 32, + "width": 256 + } + } + }, + { + "assetStoreId": "90d94b6e3a23c34948e59eaaef4679740f8ab588696d59b21e0c0c2ef106b94d", + "name": "Run", + "tags": "", + "type": "PanelSpriteButton::PanelSpriteButton", + "variables": [], + "effects": [], + "behaviors": [], + "content": { + "LeftPadding": 16, + "RightPadding": 16, + "PressedLabelOffsetY": 0, + "IdleLabelOffsetY": -8, + "BottomPadding": 16, + "TopPadding": 16, + "MinimalWidth": 300 + }, + "childrenContent": { + "Hovered": { + "bottomMargin": 32, + "height": 106, + "leftMargin": 16, + "rightMargin": 16, + "texture": "Border2.png", + "tiled": true, + "topMargin": 16, + "width": 256 + }, + "Idle": { + "bottomMargin": 32, + "height": 106, + "leftMargin": 16, + "rightMargin": 16, + "texture": "Border.png", + "tiled": true, + "topMargin": 16, + "width": 256 + }, + "Label": { + "bold": false, + "italic": false, + "smoothed": true, + "underlined": false, + "string": "Run", + "font": "", + "characterSize": 40, + "color": { + "b": 255, + "g": 255, + "r": 255 + } + }, + "Pressed": { + "bottomMargin": 16, + "height": 106, + "leftMargin": 16, + "rightMargin": 16, + "texture": "Border2.png", + "tiled": true, + "topMargin": 32, + "width": 256 + } + } + }, + { + "assetStoreId": "", + "name": "Background", + "tags": "", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [ + { + "effectType": "KawaseBlur", + "name": "Effect", + "doubleParameters": { + "blur": 10, + "padding": 0, + "pixelizeX": 1, + "pixelizeY": 1, + "quality": 3 + }, + "stringParameters": {}, + "booleanParameters": {} + } + ], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "House1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PaintEffect" + }, + "parameters": [ + "Transition", + "FlashTransitionPainter", + "\"0;0;0\"", + "0.5", + "\"Circular\"", + "\"Backward\"", + "255", + "" + ] + }, + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngle::ShakeObject_PositionAngle" + }, + "parameters": [ + "Player", + "ShakeObject_PositionAngle", + "", + "5", + "5", + "0", + "2", + "yes", + "yes" + ] + }, + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngle::ShakeObject_PositionAngle" + }, + "parameters": [ + "Enemy", + "ShakeObject_PositionAngle", + "", + "-4", + "-4", + "0", + "2", + "yes", + "yes" + ] + }, + { + "type": { + "value": "ZoomCamera" + }, + "parameters": [ + "", + "10", + "\"Background\"", + "" + ] + }, + { + "type": { + "value": "CentreCamera" + }, + "parameters": [ + "", + "Grass", + "", + "\"Background\"", + "" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Health display", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ChangeWidth" + }, + "parameters": [ + "Player_HealthBar", + "=", + "448*(Player.Health::Health()/Player.Health::MaxHealth())" + ] + }, + { + "type": { + "value": "ChangeWidth" + }, + "parameters": [ + "Enemy_HealthBar", + "=", + "448*(Enemy.Health::Health()/Enemy.Health::MaxHealth())" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Your turn", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::IsHovered" + }, + "parameters": [ + "Attack1", + "" + ] + }, + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::IsHovered" + }, + "parameters": [ + "Attack2", + "" + ] + }, + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::IsHovered" + }, + "parameters": [ + "Run", + "" + ] + } + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "HoverSound.wav", + "", + "20", + "RandomFloatInRange(0.8,0.9)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SceneVariableAsBoolean" + }, + "parameters": [ + "Turn", + "False" + ] + }, + { + "type": { + "value": "SceneVariableAsBoolean" + }, + "parameters": [ + "Clickable", + "False" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::IsClicked" + }, + "parameters": [ + "Attack1", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ToggleSceneVariableAsBoolean" + }, + "parameters": [ + "Clickable" + ] + }, + { + "type": { + "value": "Tween::AddObjectPositionTween" + }, + "parameters": [ + "Player", + "Tween", + "\"BackUp\"", + "Player.X()-100", + "Player.Y()", + "\"easeOutQuad\"", + "500", + "" + ] + }, + { + "type": { + "value": "Wait" + }, + "parameters": [ + "0.5" + ] + }, + { + "type": { + "value": "Tween::AddObjectPositionTween" + }, + "parameters": [ + "Player", + "Tween", + "\"BackUp\"", + "Player.X()+100", + "Player.Y()", + "\"easeInQuad\"", + "100", + "" + ] + }, + { + "type": { + "value": "Wait" + }, + "parameters": [ + "0.1" + ] + }, + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "Attack.wav", + "", + "90", + "RandomFloatInRange(0.9,1)" + ] + }, + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngle::StopShaking" + }, + "parameters": [ + "Enemy", + "ShakeObject_PositionAngle", + "" + ] + }, + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngleScale::ShakeObject_PositionAngleScale" + }, + "parameters": [ + "Enemy", + "ShakeObject_PositionAngleScale", + "0.6", + "10", + "10", + "5", + "10", + "0.2", + "", + "" + ] + }, + { + "type": { + "value": "Flash::Flash::Flash" + }, + "parameters": [ + "Enemy", + "Flash", + "0.3", + "" + ] + }, + { + "type": { + "value": "Health::Health::Hit" + }, + "parameters": [ + "Enemy", + "Health", + "10", + "", + "", + "" + ] + }, + { + "type": { + "value": "BitmapText::BitmapTextObject::SetText" + }, + "parameters": [ + "Dialogue", + "=", + "\"You attacked your enemy.\"" + ] + }, + { + "type": { + "value": "Wait" + }, + "parameters": [ + "1" + ] + }, + { + "type": { + "value": "ToggleSceneVariableAsBoolean" + }, + "parameters": [ + "Turn" + ] + }, + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngle::ShakeObject_PositionAngle" + }, + "parameters": [ + "Enemy", + "ShakeObject_PositionAngle", + "", + "-4", + "-4", + "0", + "2", + "yes", + "yes" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Their turn", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SceneVariableAsBoolean" + }, + "parameters": [ + "Turn", + "True" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Wait" + }, + "parameters": [ + "0.5" + ] + }, + { + "type": { + "value": "Tween::AddObjectPositionTween" + }, + "parameters": [ + "Enemy", + "Tween", + "\"BackUp\"", + "Enemy.X()+100", + "Enemy.Y()", + "\"easeOutQuad\"", + "500", + "" + ] + }, + { + "type": { + "value": "Wait" + }, + "parameters": [ + "0.5" + ] + }, + { + "type": { + "value": "Tween::AddObjectPositionTween" + }, + "parameters": [ + "Enemy", + "Tween", + "\"BackUp\"", + "Enemy.X()-100", + "Enemy.Y()", + "\"easeInQuad\"", + "100", + "" + ] + }, + { + "type": { + "value": "Wait" + }, + "parameters": [ + "0.1" + ] + }, + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "Attack.wav", + "", + "90", + "RandomFloatInRange(0.9,1)" + ] + }, + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngleScale::ShakeObject_PositionAngleScale" + }, + "parameters": [ + "Player", + "ShakeObject_PositionAngleScale", + "0.6", + "10", + "10", + "5", + "10", + "0.2", + "", + "" + ] + }, + { + "type": { + "value": "Flash::Flash::Flash" + }, + "parameters": [ + "Player", + "Flash", + "0.3", + "" + ] + }, + { + "type": { + "value": "Health::Health::Hit" + }, + "parameters": [ + "Player", + "Health", + "10", + "", + "", + "" + ] + }, + { + "type": { + "value": "BitmapText::BitmapTextObject::SetText" + }, + "parameters": [ + "Dialogue", + "=", + "\"Your enemy attacked you.\"" + ] + }, + { + "type": { + "value": "Wait" + }, + "parameters": [ + "1" + ] + }, + { + "type": { + "value": "ToggleSceneVariableAsBoolean" + }, + "parameters": [ + "Turn" + ] + }, + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngle::ShakeObject_PositionAngle" + }, + "parameters": [ + "Player", + "ShakeObject_PositionAngle", + "", + "5", + "5", + "0", + "2", + "yes", + "yes" + ] + }, + { + "type": { + "value": "ToggleSceneVariableAsBoolean" + }, + "parameters": [ + "Clickable" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Battle End", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "Health::Health::IsDead" + }, + "parameters": [ + "Enemy", + "Health", + "" + ] + }, + { + "type": { + "value": "Health::Health::IsDead" + }, + "parameters": [ + "Player", + "Health", + "" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "PopScene" + }, + "parameters": [ + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "layers": [ + { + "ambientLightColorB": 22078880, + "ambientLightColorG": 6050880, + "ambientLightColorR": 14081096, + "followBaseLayerCamera": false, + "isLightingLayer": false, + "name": "Background", + "visibility": true, + "cameras": [], + "effects": [] + }, + { + "ambientLightColorB": 0, + "ambientLightColorG": 0, + "ambientLightColorR": 0, + "followBaseLayerCamera": false, + "isLightingLayer": false, + "name": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + }, + { + "ambientLightColorB": 11858072, + "ambientLightColorG": 6050880, + "ambientLightColorR": 21777048, + "followBaseLayerCamera": false, + "isLightingLayer": false, + "name": "Dialogue", + "visibility": true, + "cameras": [], + "effects": [] + }, + { + "ambientLightColorB": 21829640, + "ambientLightColorG": 6050880, + "ambientLightColorR": 22048576, + "followBaseLayerCamera": false, + "isLightingLayer": false, + "name": "UI", + "visibility": true, + "cameras": [], + "effects": [] + } + ], + "behaviorsSharedData": [ + { + "name": "BitmapText_AutoTyping", + "type": "AutoTyping::BitmapText_AutoTyping" + }, + { + "name": "Flash", + "type": "Flash::Flash" + }, + { + "name": "FlashTransitionPainter", + "type": "FlashTransitionPainter::FlashTransitionPainter" + }, + { + "name": "Health", + "type": "Health::Health" + }, + { + "name": "ShakeObject_PositionAngle", + "type": "ShakeObject::ShakeObject_PositionAngle" + }, + { + "name": "ShakeObject_PositionAngleScale", + "type": "ShakeObject::ShakeObject_PositionAngleScale" + }, + { + "name": "Tween", + "type": "Tween::TweenBehavior" + } + ] + } + ], + "externalEvents": [], + "eventsFunctionsExtensions": [ + { + "author": "@4ian", + "category": "Visual effect", + "extensionNamespace": "", + "fullName": "Flash (blink)", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWZsYXNoLW91dGxpbmUiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNNywySDE3TDEzLjUsOUgxN0wxMCwyMlYxNEg3VjJNOSw0VjEySDEyVjE0LjY2TDE0LDExSDEwLjI0TDEzLjc2LDRIOVoiIC8+PC9zdmc+", + "name": "Flash", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/flash-outline.svg", + "shortDescription": "Make the object flash (blink) for a period of time, so that it is alternately visible and invisible.\nTrigger the effect by using the Flash action.", + "version": "1.0.0", + "description": "Make the object flash (blink) for a period of time, so that it is alternately visible and invisible.\nAfter adding this to an object, you have to **trigger the effect** by using the **Flash action**.", + "origin": { + "identifier": "Flash", + "name": "gdevelop-extension-store" + }, + "tags": [ + "flash", + "blink", + "visible", + "invisible", + "hit", + "damage" + ], + "authorIds": [ + "wWP8BSlAW0UP4NeaHa2LcmmDzmH2" + ], + "dependencies": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Make the object flash (blink) for a period of time, so that it is alternately visible and invisible.\nTrigger the effect by using the Flash action.", + "fullName": "Flash (blink)", + "name": "Flash", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Flash::Flash::PropertyIsFlashing" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"FlashTimer\"", + "Object.Behavior::PropertyHalfPeriodTime()" + ] + }, + { + "type": { + "value": "Visible" + }, + "parameters": [ + "Object" + ] + } + ], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Object" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"FlashTimer\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"FlashTimer\"", + "Object.Behavior::PropertyHalfPeriodTime()" + ] + }, + { + "type": { + "inverted": true, + "value": "Visible" + }, + "parameters": [ + "Object" + ] + } + ], + "actions": [ + { + "type": { + "value": "Montre" + }, + "parameters": [ + "Object", + "" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"FlashTimer\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"FlashDurationTimer\"", + "Object.Behavior::PropertyFlashDuration()" + ] + } + ], + "actions": [ + { + "type": { + "value": "Flash::Flash::Stop" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::Flash", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Make the specified object(s) blink for the given duration.", + "fullName": "Flash (blink)", + "functionType": "Action", + "name": "Flash", + "sentence": "Make _PARAM0_ blink for _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "GetArgumentAsNumber(\"FlashDuration\")", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"FlashDurationTimer\"" + ] + }, + { + "type": { + "value": "Flash::Flash::SetPropertyFlashDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"FlashDuration\")" + ] + }, + { + "type": { + "value": "Flash::Flash::SetPropertyIsFlashing" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::Flash", + "type": "behavior" + }, + { + "description": "Duration of the blinking, in seconds", + "name": "FlashDuration", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the specified objects are flashing.", + "fullName": "Is object flashing", + "functionType": "Condition", + "name": "IsFlashing", + "sentence": "_PARAM0_ is flashing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Flash::Flash::PropertyIsFlashing" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::Flash", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onOwnerRemovedFromScene", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Flash::Flash::Stop" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::Flash", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Flash::Flash::Stop" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::Flash", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Stop the flashing of the specified object.", + "fullName": "Stop flashing", + "functionType": "Action", + "name": "Stop", + "sentence": "Stop flashing _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Flash::Flash::PropertyIsFlashing" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "Montre" + }, + "parameters": [ + "Object", + "" + ] + }, + { + "type": { + "value": "Flash::Flash::SetPropertyIsFlashing" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::Flash", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0.1", + "type": "Number", + "label": "Half period (time during which object is invisible), in seconds", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "HalfPeriodTime" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "IsFlashing" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "FlashDuration" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "@4ian", + "category": "Game mechanic", + "extensionNamespace": "", + "fullName": "Health points and damage", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWhlYXJ0LWhhbGYtZnVsbCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNi41LDVDMTUsNSAxMy41OCw1LjkxIDEzLDcuMlYxNy43NEMxNy4yNSwxMy44NyAyMCwxMS4yIDIwLDguNUMyMCw2LjUgMTguNSw1IDE2LjUsNU0xNi41LDNDMTkuNTgsMyAyMiw1LjQxIDIyLDguNUMyMiwxMi4yNyAxOC42LDE1LjM2IDEzLjQ1LDIwLjAzTDEyLDIxLjM1TDEwLjU1LDIwLjAzQzUuNCwxNS4zNiAyLDEyLjI3IDIsOC41QzIsNS40MSA0LjQyLDMgNy41LDNDOS4yNCwzIDEwLjkxLDMuODEgMTIsNS4wOEMxMy4wOSwzLjgxIDE0Ljc2LDMgMTYuNSwzWiIgLz48L3N2Zz4=", + "name": "Health", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/heart-half-full.svg", + "shortDescription": "Manage health points and damage, including a protective shield and armor.", + "version": "0.1.0", + "description": "Manage health points including a protective shield and armor. Health can be assigned to players, enemies, NPCs, or even inanimate objects such as breaking doors and mining rocks.\n\nDamage calculations are performed in this order:\n\nIncoming Damage -> Is Damage Cooldown active? -> Chance to Dodge -> Flat Damage Reduction -> Percent Damage Reduction -> Damage to Shield -> Damage to Health\n\nHow to use:\n\n- Set desired values in behavior properties\n- To apply damage use “Apply damage to an object”\n- To heal health, use “Heal object” action\n- To activate the shield, use “Activate shield” action\n- Health and shield regeneration will happen automatically based on properties\n \nTips:\n\n- While damage cooldown is active, no damage will be applied to health or shield (the object is invincible)\n- Try using the “Blink” extension while damage cooldown is active\n- Use the “Is just damaged” or \"Is just healed\" conditions to trigger sound and visual effects\n\nHealth properties:\n\n- Starting health points\n- Maximum health points. Use \"0\" for no maximum\n- Damage cooldown (seconds) Use \"0\" for no cooldown\n- Rate of health regeneration (points per second)\n- Delay before health regeneration starts after being hit (seconds)\n- Allow heals to increase health above max health (regen will never exceed max health)\n\nShield properties:\n\n- Max shield points. Use \"0\" for no maximum\n- Duration of shield (seconds) Use \"0\" to make shield permanent\n- Rate of shield regeneration (points per second)\n- Delay before shield regeneration starts after being hit (seconds)\n- Block excess damage when shield is broken (yes/no)", + "origin": { + "identifier": "Health", + "name": "gdevelop-extension-store" + }, + "tags": [ + "health", + "life", + "damage", + "hit", + "heal", + "shield", + "regeneration", + "armor" + ], + "authorIds": [ + "wWP8BSlAW0UP4NeaHa2LcmmDzmH2", + "xpwUwByyImTDcHEqDUqfyg0oRBt1", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Manage health (life) points including a protective shield and armor.", + "fullName": "Health", + "name": "Health", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"" + ] + }, + { + "type": { + "value": "Health::Health::SetCurrentHealth" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyHealth()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 224, + "colorG": 16, + "colorR": 189, + "creationTime": 0, + "name": "Health", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Regeneration", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Health", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyHealthRegenRate" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "Health::Health::PropertyCurrentHealth" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::MaxHealth()" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"", + ">", + "Object.Behavior::PropertyHealthRegenDelay()" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyCurrentHealth" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Behavior::PropertyHealthRegenRate() * TimeDelta()" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Correct any values above maximum limits", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyCurrentHealth" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::MaxHealth()" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyCurrentHealth" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyMaxHealth()" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reset triggers", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyIsHealthJustDamaged" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + }, + { + "type": { + "value": "Health::Health::SetPropertyIsJustHealed" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + }, + { + "type": { + "value": "Health::Health::SetPropertyIsJustDodged" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + }, + { + "colorB": 224, + "colorG": 16, + "colorR": 189, + "creationTime": 0, + "name": "Shield", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Regeneration", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Shield", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyShieldRegenRate" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "Health::Health::PropertyCurrentShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "Object.Behavior::PropertyMaxShieldPoints()" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"", + ">", + "Object.Behavior::PropertyShieldRegenDelay()" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyCurrentShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::RenewShieldDuration" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyCurrentShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Behavior::PropertyShieldRegenRate() * TimeDelta()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Correct any values above maximum limits", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyCurrentShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::PropertyMaxShieldPoints()" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyCurrentShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyMaxShieldPoints()" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Remove shield points if shield expired", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Health::IsShieldActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyCurrentShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reset damage trigger", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyIsShieldJustDamaged" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Apply damage to the object. Shield and armor can reduce this damage if enabled.", + "fullName": "Apply damage to an object", + "functionType": "Action", + "group": "Health", + "name": "Hit", + "sentence": "Apply _PARAM2_ points of damage to _PARAM0_ (Damage can be reduced by Shield: _PARAM3_, Armor: _PARAM4_)", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Incoming damage", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Only consider incoming damage when damage cooldown is not active", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Health::IsDamageCooldownActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyDamageToBeApplied" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"DamageValue\")" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Chance to dodge", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "No damage will be applied when dodged", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "RandomFloatInRange(0,1)", + "<", + "Object.Behavior::PropertyChanceToDodge()" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyIsJustDodged" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "Health::Health::SetPropertyDamageToBeApplied" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Damage reduction from Armor", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"UseArmor\"" + ] + }, + { + "type": { + "value": "Health::Health::PropertyDamageToBeApplied" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Flat damage reduction", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyDamageToBeApplied" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0,Object.Behavior::PropertyDamageToBeApplied() - Object.Behavior::PropertyFlatDamageReduction())" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Percent damage reduction", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyPercentDamageReduction" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "value": "Health::Health::PropertyDamageToBeApplied" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyDamageToBeApplied" + }, + "parameters": [ + "Object", + "Behavior", + "*", + "1 - min(1, Object.Behavior::PropertyPercentDamageReduction())" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Apply damage to shield", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If shield is active, damage the shield first", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"UseShield\"" + ] + }, + { + "type": { + "value": "Health::Health::IsShieldActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "Health::Health::PropertyDamageToBeApplied" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyIsShieldJustDamaged" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "Health::Health::TriggerDamageCooldown" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If damage is less than shield, subtract damage from shield.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyDamageToBeApplied" + }, + "parameters": [ + "Object", + "Behavior", + "<=", + "Object.Behavior::PropertyCurrentShieldPoints()" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyCurrentShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "-", + "Object.Behavior::PropertyDamageToBeApplied()" + ] + }, + { + "type": { + "value": "Health::Health::SetPropertyShieldDamageTaken" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyDamageToBeApplied()" + ] + }, + { + "type": { + "value": "Health::Health::SetPropertyDamageToBeApplied" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If damage is greater than shield, conditionally apply excess damage based on property", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyDamageToBeApplied" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::PropertyCurrentShieldPoints()" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyShieldDamageTaken" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyCurrentShieldPoints()" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyBlockExcessDamage" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyDamageToBeApplied" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "Health::Health::SetPropertyCurrentShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Apply excess damage only if shield does not block excess damage", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Health::PropertyBlockExcessDamage" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyDamageToBeApplied" + }, + "parameters": [ + "Object", + "Behavior", + "-", + "Object.Behavior::PropertyCurrentShieldPoints()" + ] + }, + { + "type": { + "value": "Health::Health::SetPropertyCurrentShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Apply damage to health", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyDamageToBeApplied" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetJustDamaged" + }, + "parameters": [ + "Object", + "Behavior", + "yes", + "" + ] + }, + { + "type": { + "value": "Health::Health::TriggerDamageCooldown" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetCurrentHealth" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyCurrentHealth() - Object.Behavior::PropertyDamageToBeApplied()", + "" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Points of damage", + "name": "DamageValue", + "type": "expression" + }, + { + "defaultValue": "yes", + "description": "Shield can reduce damage taken", + "name": "UseShield", + "optional": true, + "type": "yesorno" + }, + { + "defaultValue": "yes", + "description": "Armor can reduce damage taken", + "name": "UseArmor", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Change the health points of the object. Will not trigger damage cooldown.", + "fullName": "Change health points", + "functionType": "Action", + "group": "Health configuration", + "name": "SetCurrentHealth", + "sentence": "Change the health of _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyCurrentHealth" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If MaxHealth is set, prevent health from going above it", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyMaxHealth" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyCurrentHealth" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(Object.Behavior::PropertyCurrentHealth(), Object.Behavior::PropertyMaxHealth())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "New health value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Heal the object by increasing its health points.", + "fullName": "Heal object", + "functionType": "Action", + "group": "Health", + "name": "Heal", + "sentence": "Heal _PARAM0_ with _PARAM2_ health points", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Heal", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If Max Health is not set, do not enforce Max Health", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyMaxHealth" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHealToBeApplied" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"HealValue\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If Max Health is set and Overhealing is not allowed", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyMaxHealth" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "inverted": true, + "value": "Health::Health::PropertyAllowOverHealing" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHealToBeApplied" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(GetArgumentAsNumber(\"HealValue\"),Object.Behavior::PropertyMaxHealth() - Object.Behavior::PropertyCurrentHealth())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Perform heal", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyCurrentHealth" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Behavior::PropertyHealToBeApplied()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update healing trigger", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyIsJustHealed" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Points to heal (will be added to object health)", + "name": "HealValue", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the object maximum health points.", + "fullName": "Maximum health points", + "functionType": "Action", + "group": "Health configuration", + "name": "SetMaxHealth", + "sentence": "Change the maximum health of _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyMaxHealth" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure Current Health does not exceed new Max Health", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyCurrentHealth" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::MaxHealth()" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyCurrentHealth" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::MaxHealth()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Maximum health", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the rate of health regeneration.", + "fullName": "Rate of health regeneration", + "functionType": "Action", + "group": "Health configuration", + "name": "SetHealthRegenRate", + "sentence": "Change the rate of health regen of _PARAM0_ to _PARAM2_ points per second", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHealthRegenRate" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Rate of regen", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the duration of damage cooldown (seconds).", + "fullName": "Damage cooldown", + "functionType": "Action", + "group": "Health configuration", + "name": "SetCooldownDuration", + "sentence": "Change the duration of damage cooldown on _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyDamageCooldown" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Duration of damage cooldown (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the delay before health regeneration starts after being hit.", + "fullName": "Health regeneration delay", + "functionType": "Action", + "group": "Health configuration", + "name": "SetHealthRegenDelay", + "sentence": "Change the health regeneration delay on _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHealthRegenDelay" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Delay (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the chance to dodge incoming damage.", + "fullName": "Chance to dodge incoming damage", + "functionType": "Action", + "group": "Health configuration", + "name": "SetChanceToDodge", + "sentence": "Change the chance to dodge on _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyChanceToDodge" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Chance to dodge (Range: 0 to 1)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the flat damage reduction from armor. Incoming damage is reduced by this value.", + "fullName": "Flat damage reduction from armor", + "functionType": "Action", + "group": "Health configuration", + "name": "SetFlatDamageReduction", + "sentence": "Change the flat damage reduction from armor on _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyFlatDamageReduction" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Flat reduction from armor", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the percent damage reduction from armor. Range: 0 to 1.", + "fullName": "Percent damage reduction from armor", + "functionType": "Action", + "group": "Health configuration", + "name": "SetPercentDamageReduction", + "sentence": "Change the percent damage reduction from armor on _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyPercentDamageReduction" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Percent damage reduction from armor", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Allow heals to increase health above max health. Regeneration will not exceed max health.", + "fullName": "Allow over-healing", + "functionType": "Action", + "group": "Health configuration", + "name": "AllowOverHealing", + "sentence": "Allow over-healing on _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyAllowOverHealing" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyAllowOverHealing" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Allow over-healing", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Mark object as hit at least once.", + "fullName": "Mark object as hit at least once", + "functionType": "Action", + "group": "Health configuration", + "name": "SetHitAtLeastOnce", + "private": true, + "sentence": "Mark _PARAM0_ as hit at least once: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyHitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Hit at least once", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Mark object as just damaged.", + "fullName": "Mark object as just damaged", + "functionType": "Action", + "group": "Health configuration", + "name": "SetJustDamaged", + "private": true, + "sentence": "Mark _PARAM0_ as just damaged: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyIsHealthJustDamaged" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyIsHealthJustDamaged" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Just damaged", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Trigger damage cooldown.", + "fullName": "Trigger damage cooldown", + "functionType": "Action", + "group": "Health", + "name": "TriggerDamageCooldown", + "sentence": "Trigger the damage cooldown on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Mark that the object was hit at least once (used for initial state of damage cooldown)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Health::HitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetHitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior", + "yes", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object has been hit at least once.", + "fullName": "Object has been hit at least once", + "functionType": "Condition", + "group": "Health", + "name": "HitAtLeastOnce", + "private": true, + "sentence": "_PARAM0_ has been hit at least once", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "This condition is used to prevent \"damage cooldown\" from being active when the game starts.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyHitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if health was just damaged previously in the events.", + "fullName": "Is health just damaged", + "functionType": "Condition", + "group": "Health", + "name": "IsJustDamaged", + "sentence": "Health has just been damaged on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyIsHealthJustDamaged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object was just healed previously in the events.", + "fullName": "Is just healed", + "functionType": "Condition", + "group": "Health", + "name": "IsJustHealed", + "sentence": "_PARAM0_ has just been healed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyIsJustHealed" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if damage cooldown is active. Object and shield cannot be damaged while this is active.", + "fullName": "Is damage cooldown active", + "functionType": "Condition", + "group": "Health", + "name": "IsDamageCooldownActive", + "sentence": "Damage cooldown on _PARAM0_ is active", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyHitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "Health::Health::PropertyDamageCooldown" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"", + "<", + "Object.Behavior::PropertyDamageCooldown()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object is considered dead (no health points).", + "fullName": "Is dead", + "functionType": "Condition", + "group": "Health", + "name": "IsDead", + "sentence": "_PARAM0_ is dead", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyCurrentHealth" + }, + "parameters": [ + "Object", + "Behavior", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Maximum health points of the object.", + "fullName": "Maximum health points", + "functionType": "Expression", + "group": "Health", + "name": "MaxHealth", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyMaxHealth()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Duration of damage cooldown (seconds).", + "fullName": "Damage cooldown", + "functionType": "Expression", + "group": "Health", + "name": "DamageCooldownDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyDamageCooldown()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Current health points of the object.", + "fullName": "Health points", + "functionType": "Expression", + "group": "Health", + "name": "Health", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyCurrentHealth()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Delay before health regeneration starts after last being hit (seconds).", + "fullName": "Health regeneration delay", + "functionType": "Expression", + "group": "Health", + "name": "HealthRegenDelay", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyHealthRegenDelay()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Rate of health regeneration (points per second).", + "fullName": "Rate of health regeneration", + "functionType": "Expression", + "group": "Health", + "name": "HealthRegenRate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyHealthRegenRate()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Time before damage cooldown ends (seconds).", + "fullName": "Time remaining in damage cooldown", + "functionType": "Expression", + "group": "Health", + "name": "DamageCooldownRemaining", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::IsDamageCooldownActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "max(0,Object.Behavior::PropertyDamageCooldown() - Object.ObjectTimerElapsedTime(\"__Health.TimeSinceLastHit\"))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Time since last hit (seconds).", + "fullName": "Time since last hit", + "functionType": "Expression", + "group": "Health", + "name": "TimeSinceLastHit", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.ObjectTimerElapsedTime(\"__Health.TimeSinceLastHit\")" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Chance to dodge incoming damage.", + "fullName": "Chance to dodge incoming damage", + "functionType": "Expression", + "group": "Health", + "name": "ChanceToDodge", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyChanceToDodge()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Flat damage reduction from armor. Incoming damage is reduced by this value.", + "fullName": "Flat damage reduction from armor", + "functionType": "Expression", + "group": "Health", + "name": "FlatDamageReduction", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyFlatDamageReduction()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Percent damage reduction from armor. Range: 0 to 1.", + "fullName": "Percent damage reduction from armor", + "functionType": "Expression", + "group": "Health", + "name": "PercentDamageReduction", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyPercentDamageReduction()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Health damage taken from most recent hit.", + "fullName": "Health damage taken from most recent hit", + "functionType": "Expression", + "group": "Health", + "name": "PreviousDamageTaken", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyDamageToBeApplied()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the maximum shield points of the object.", + "fullName": "Maximum shield points", + "functionType": "Action", + "group": "Shield configuration", + "name": "SetMaxShield", + "sentence": "Change the maximum shield of _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyMaxShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Maximum shield", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change current shield points. Will not trigger damage cooldown.", + "fullName": "Shield points", + "functionType": "Action", + "group": "Shield configuration", + "name": "SetShieldPoints", + "sentence": "Change current shield points on _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyCurrentShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Shield points", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change rate of shield regeneration.", + "fullName": "Shield regeneration rate", + "functionType": "Action", + "group": "Shield configuration", + "name": "SetShieldRegenRate", + "sentence": "Change the shield regeneration rate of _PARAM0_ to _PARAM2_ points per second", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyShieldRegenRate" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Regeneration rate (points per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change delay before shield regeneration starts after being hit.", + "fullName": "Shield regeneration delay", + "functionType": "Action", + "group": "Shield configuration", + "name": "SetShieldRegenDelay", + "sentence": "Change the shield regeneration delay on _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyShieldRegenDelay" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Regeneration delay (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change duration of shield. Use \"0\" to make shield permanent.", + "fullName": "Duration of shield", + "functionType": "Action", + "group": "Shield configuration", + "name": "SetShieldDuration", + "sentence": "Change the duration of shield on _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyShieldDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Shield duration (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Renew shield duration to it's full value.", + "fullName": "Renew shield duration", + "functionType": "Action", + "group": "Shield configuration", + "name": "RenewShieldDuration", + "sentence": "Renew the shield duration on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.ShieldDuration\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Activate the shield by setting the shield points and renewing the shield duration (optional).", + "fullName": "Activate shield", + "functionType": "Action", + "group": "Shield", + "name": "ActivateShield", + "sentence": "Activate the shield on _PARAM0_ with _PARAM2_ points (Renew shield duration: _PARAM3_)", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyCurrentShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"ShieldPoints\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyMaxShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyCurrentShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(GetArgumentAsNumber(\"ShieldPoints\"),Object.Behavior::MaxShield())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"RenewShieldDuration\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::RenewShieldDuration" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Shield points", + "name": "ShieldPoints", + "type": "expression" + }, + { + "defaultValue": "yes", + "description": "Renew shield duration", + "name": "RenewShieldDuration", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Change maximum shield points.", + "fullName": "Max shield points ", + "functionType": "Action", + "group": "Shield configuration", + "name": "SetMaxShieldPoints", + "sentence": "Change the maximum shield points on _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyMaxShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Shield points", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Enable (or disable) blocking excess damage when shield breaks.", + "fullName": "Block excess damage when shield breaks", + "functionType": "Action", + "group": "Shield configuration", + "name": "SetShieldBlockExcessDamage", + "sentence": "Shield on _PARAM0_ blocks excess damage when it breaks: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyBlockExcessDamage" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetPropertyBlockExcessDamage" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Block excess damage", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the shield was just damaged previously in the events.", + "fullName": "Is shield just damaged", + "functionType": "Condition", + "group": "Shield", + "name": "IsShieldJustDamaged", + "sentence": "Shield on _PARAM0_ has just been damaged", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyIsShieldJustDamaged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if incoming damage was just dodged.", + "fullName": "Damage was just dodged", + "functionType": "Condition", + "group": "Health", + "name": "IsJustDodged", + "sentence": "_PARAM0_ just dodged incoming damage", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyIsJustDodged" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the shield is active (based on shield points and duration).", + "fullName": "Is shield active", + "functionType": "Condition", + "group": "Shield", + "name": "IsShieldActive", + "sentence": "Shield on _PARAM0_ is active", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "To be considered \"active\", a shield must have positive points AND not exceed duration", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyCurrentShieldPoints" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Don't check the timer when duration is zero (or negative)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyShieldDuration" + }, + "parameters": [ + "Object", + "Behavior", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyShieldDuration" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.ShieldDuration\"", + "<", + "Object.Behavior::PropertyShieldDuration()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Maximum shield points of the object.", + "fullName": "Maximum shield points", + "functionType": "Expression", + "group": "Shield", + "name": "MaxShield", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyMaxShieldPoints()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Duration of the shield (seconds).", + "fullName": "Duration of shield", + "functionType": "Expression", + "group": "Shield", + "name": "ShieldDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyShieldDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Delay before shield regeneration starts after being hit (seconds).", + "fullName": "Shield regeneration delay", + "functionType": "Expression", + "group": "Shield", + "name": "ShieldRegenDelay", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyShieldRegenDelay()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Rate of shield regeneration (points per second).", + "fullName": "Rate of shield regeneration", + "functionType": "Expression", + "group": "Shield", + "name": "ShieldRegenRate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyShieldRegenRate()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Time before the shield duration ends (seconds).", + "fullName": "Time before shield duration ends", + "functionType": "Expression", + "group": "Shield", + "name": "ShieldTimeRemaining", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::PropertyShieldDuration" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "max(0,Object.Behavior::PropertyShieldDuration() - Object.ObjectTimerElapsedTime(\"__Health.ShieldDuration\"))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Current shield points of the object.", + "fullName": "Shield points", + "functionType": "Expression", + "group": "Shield", + "name": "ShieldPoints", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyCurrentShieldPoints()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Shield damage taken from most recent hit.", + "fullName": "Shield damage taken from most recent hit", + "functionType": "Expression", + "group": "Health", + "name": "PreviousDamageToShield", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyShieldDamageTaken()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Health points gained from previous heal.", + "fullName": "Health points gained from previous heal", + "functionType": "Expression", + "group": "Health", + "name": "PreviousHealAmount", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyHealToBeApplied()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "100", + "type": "Number", + "label": "Starting health (life) points", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": false, + "name": "Health" + }, + { + "value": "0", + "type": "Number", + "label": "Current health (life) points", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": true, + "name": "CurrentHealth" + }, + { + "value": "100", + "type": "Number", + "label": "Maximum health (points) Use \"0\" for no maximum", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": false, + "name": "MaxHealth" + }, + { + "value": "0", + "type": "Number", + "label": "Damage cooldown (seconds) Use \"0\" for no cooldown", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": false, + "name": "DamageCooldown" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": true, + "name": "IsHealthJustDamaged" + }, + { + "value": "0", + "type": "Number", + "label": "Rate of health regeneration (points per second)", + "description": "", + "group": "Health regeneration", + "extraInformation": [], + "hidden": false, + "name": "HealthRegenRate" + }, + { + "value": "0", + "type": "Number", + "label": "Delay before health regeneration starts after being hit (seconds)", + "description": "", + "group": "Health regeneration", + "extraInformation": [], + "hidden": false, + "name": "HealthRegenDelay" + }, + { + "value": "", + "type": "Boolean", + "label": "Allow heals to increase health above max health (regen will never exceed max health)", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": false, + "name": "AllowOverHealing" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": true, + "name": "HitAtLeastOnce" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "IsJustHealed" + }, + { + "value": "", + "type": "Number", + "label": "Current shield points", + "description": "", + "group": "Shield", + "extraInformation": [], + "hidden": true, + "name": "CurrentShieldPoints" + }, + { + "value": "0", + "type": "Number", + "label": "Maximum shield (points) Use \"0\" for no maximum", + "description": "", + "group": "Shield", + "extraInformation": [], + "hidden": false, + "name": "MaxShieldPoints" + }, + { + "value": "5", + "type": "Number", + "label": "Duration of shield (seconds) Use \"0\" to make shield permanent", + "description": "", + "group": "Shield", + "extraInformation": [], + "hidden": false, + "name": "ShieldDuration" + }, + { + "value": "0", + "type": "Number", + "label": "Rate of shield regeneration (points per second)", + "description": "", + "group": "Shield regeneration", + "extraInformation": [], + "hidden": false, + "name": "ShieldRegenRate" + }, + { + "value": "", + "type": "Boolean", + "label": "Block excess damage when shield is broken", + "description": "", + "group": "Shield", + "extraInformation": [], + "hidden": false, + "name": "BlockExcessDamage" + }, + { + "value": "", + "type": "Number", + "label": "Delay before shield regeneration starts after being hit (seconds)", + "description": "", + "group": "Shield regeneration", + "extraInformation": [], + "hidden": false, + "name": "ShieldRegenDelay" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "Shield", + "extraInformation": [], + "hidden": true, + "name": "IsShieldJustDamaged" + }, + { + "value": "0", + "type": "Number", + "label": "Chance to dodge incoming damage (Range: 0 to 1) If damage is dodged, no damage is applied", + "description": "", + "group": "Health configuration", + "extraInformation": [], + "hidden": false, + "name": "ChanceToDodge" + }, + { + "value": "0", + "type": "Number", + "label": "Damage to health from the previous incoming damage", + "description": "", + "group": "Health", + "extraInformation": [], + "hidden": true, + "name": "DamageToBeApplied" + }, + { + "value": "0", + "type": "Number", + "label": "Flat damage reduction from armor (incoming damage is reduced by this value)", + "description": "", + "group": "Armor", + "extraInformation": [], + "hidden": false, + "name": "FlatDamageReduction" + }, + { + "value": "0", + "type": "Number", + "label": "Percentage damage reduction from armor (Range: 0 to 1)", + "description": "", + "group": "Armor", + "extraInformation": [], + "hidden": false, + "name": "PercentDamageReduction" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "IsJustDodged" + }, + { + "value": "", + "type": "Number", + "label": "Damage to shield from the previous incoming damage", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ShieldDamageTaken" + }, + { + "value": "0", + "type": "Number", + "label": "Health points gained from the previous heal", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "HealToBeApplied" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "Westboy31", + "category": "Visual effect", + "extensionNamespace": "", + "fullName": "Flash and transition painter", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLW1vdmllLWZpbHRlciIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xOCA0TDIwIDdIMTdMMTUgNEgxM0wxNSA3SDEyTDEwIDRIOEwxMCA3SDdMNSA0SDRDMi45IDQgMiA0LjkgMiA2TDIgMThDMiAxOS4xIDIuOSAyMCA0IDIwSDIwQzIxLjEgMjAgMjIgMTkuMSAyMiAxOFY0SDE4TTExLjI1IDE1LjI1TDEwIDE4TDguNzUgMTUuMjVMNiAxNEw4Ljc1IDEyLjc1TDEwIDEwTDExLjI1IDEyLjc1TDE0IDE0TDExLjI1IDE1LjI1TTE2Ljk0IDExLjk0TDE2IDE0TDE1LjA2IDExLjk0TDEzIDExTDE1LjA2IDEwLjA2TDE2IDhMMTYuOTQgMTAuMDZMMTkgMTFMMTYuOTQgMTEuOTRaIiAvPjwvc3ZnPg==", + "name": "FlashTransitionPainter", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/movie-filter.svg", + "shortDescription": "Behavior for shape painter allows you to paint a color all over the screen for period of time with an effect (useful for simulate flash and transition effect).", + "version": "0.1.0", + "description": "* __Paint effect:__Action to paint a color all over the screen for a period of time with specific effect.\neffect type:\n * __Flash:__ is a monochrome color appear with fade then disappear with fade out.\n * __Vertical:__ is a monochrome color comes from right side then comes back.\n * __Horizontal:__ is a monochrome color come from top side then comes back.\n * __Circular:__ is a circle which increases from the center and narrows.\n* __Paint effect ended:__ event when the paint effect ends.", + "origin": { + "identifier": "FlashTransitionPainter", + "name": "gdevelop-extension-store" + }, + "tags": [ + "shape painter", + "flash", + "transition", + "effect" + ], + "authorIds": [], + "dependencies": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Paint all over the screen a color for a period of time.", + "fullName": "Flash and transition painter", + "name": "FlashTransitionPainter", + "objectType": "PrimitiveDrawing::Drawer", + "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": "Disable effect when the game starts.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "PauseObjectTimer" + }, + "parameters": [ + "Object", + "\"__FlashTransitionPainter_timerEffect\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FlashTransitionPainter::FlashTransitionPainter", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Avoid default parameter of painter that could make the extension doesn't work.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::ClearBetweenFrames" + }, + "parameters": [ + "Object", + "yes" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::OutlineSize" + }, + "parameters": [ + "Object", + "=", + "0" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__FlashTransitionPainter_timerEffect\"" + ] + }, + { + "type": { + "value": "UnPauseObjectTimer" + }, + "parameters": [ + "Object", + "\"__FlashTransitionPainter_timerEffect\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Initialise position of painter. \nIncrement or decrement \"_TimeProgressionEffect\" depending on direction.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "MettreXY" + }, + "parameters": [ + "Object", + "=", + "CameraX(Object.Layer(),0) - SceneWindowWidth()/2", + "=", + "CameraY(Object.Layer(),0) - SceneWindowHeight()/2" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyColor()" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_TimeProgressionEffect", + "+", + "(TimeDelta() / Object.Behavior::PropertyTimer())*Object.Variable(__FlashTransitionPainter_ReverseDirection)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Here this the paints functions of different effect depending on the type chosen by the user.\nDetect the direction of the animation and its end.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Type 1 : flash effect. ", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyType" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"\"" + ] + }, + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyType" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Flash\"" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_OpacityFlash", + ">=", + "Object.Behavior::PropertyMaxOpacity()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ReverseDirection", + "=", + "-1" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Forward\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_OpacityFlash", + "<", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_OpacityFlash", + "=", + "lerp(0, Object.Behavior::PropertyMaxOpacity(), Object.Variable(__FlashTransitionPainter_TimeProgressionEffect))" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Variable(__FlashTransitionPainter_OpacityFlash)" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "CameraX(Object.Layer(),0) - SceneWindowWidth()/2", + "CameraY(Object.Layer(),0) - SceneWindowHeight()/2", + "SceneWindowWidth()", + "SceneWindowHeight()" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Type 2 : screen come from top then return.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyType" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Horizontal\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ProgressiveWidth", + ">=", + "SceneWindowWidth()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ReverseDirection", + "=", + "-1" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Forward\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ProgressiveWidth", + "<", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdge", + "=", + "10" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdgeOpacity", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ProgressiveWidth", + "=", + "lerp(0,SceneWindowWidth(),Object.Variable(__FlashTransitionPainter_TimeProgressionEffect))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "5", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdge", + "-", + "2" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdgeOpacity", + "+", + "51" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Variable(__FlashTransitionPainter_SmoothEdgeOpacity)" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "0", + "0", + "Object.Variable(__FlashTransitionPainter_ProgressiveWidth) + Object.Variable(__FlashTransitionPainter_SmoothEdge)", + "SceneWindowHeight()" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Type 3 : screen come from left then return.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyType" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Vertical\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ProgressiveHeight", + ">=", + "SceneWindowHeight()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ReverseDirection", + "=", + "-1" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Forward\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ProgressiveHeight", + "<", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdge", + "=", + "10" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdgeOpacity", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ProgressiveHeight", + "=", + "lerp(0,SceneWindowHeight(),Object.Variable(__FlashTransitionPainter_TimeProgressionEffect))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "5", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdge", + "-", + "2" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdgeOpacity", + "+", + "51" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Variable(__FlashTransitionPainter_SmoothEdgeOpacity)" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "0", + "0", + "SceneWindowWidth()", + "Object.Variable(__FlashTransitionPainter_ProgressiveHeight) + Object.Variable(__FlashTransitionPainter_SmoothEdge)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Type 4 : a circle scale up from the middle then scale down.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyType" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Circular\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ProgressiveWidth", + ">=", + "(sqrt (pow(SceneWindowHeight(),2) + pow(SceneWindowWidth(),2) )) /2 " + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ReverseDirection", + "=", + "-1" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Forward\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ProgressiveWidth", + "<", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdge", + "=", + "1" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdgeOpacity", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ProgressiveWidth", + "=", + "lerp(0,(sqrt (pow(SceneWindowHeight(),2) + pow(SceneWindowWidth(),2) ))/2 ,Object.Variable(__FlashTransitionPainter_TimeProgressionEffect))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "5", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdge", + "-", + "0.2" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdgeOpacity", + "+", + "51" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Variable(__FlashTransitionPainter_SmoothEdgeOpacity)" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Circle" + }, + "parameters": [ + "Object", + "SceneWindowWidth()/2", + "SceneWindowHeight()/2", + "Object.Variable(__FlashTransitionPainter_ProgressiveWidth) + Object.Variable(__FlashTransitionPainter_SmoothEdge)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The repeat 5 times is used to have clean and smooth edges , especially for circle.\n", + "comment2": "" + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FlashTransitionPainter::FlashTransitionPainter", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset variables.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_OpacityFlash", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ReverseDirection", + "=", + "1" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_TimeProgressionEffect", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FlashTransitionPainter::FlashTransitionPainter", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Paint Effect.", + "fullName": "Paint Effect", + "functionType": "Action", + "name": "PaintEffect", + "sentence": "Paint effect type _PARAM4_ of _PARAM0_ with direction _PARAM5_ and color _PARAM2_ for _PARAM3_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Initialise all variables and then activate the behavior.\nIf user doesn't assign value to color and type , we take the last value registred.\nIf user doesn't assign value to timer we take a default value (0.2).", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + }, + { + "type": { + "inverted": true, + "value": "BehaviorActivated" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::SetPropertyTimer" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Timer\") + (3*TimeDelta())" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__FlashTransitionPainter_timerEffect\"" + ] + }, + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::SetPropertyDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Direction\")" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StrEqual" + }, + "parameters": [ + "GetArgumentAsString(\"Type\")", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::SetPropertyType" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Type\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StrEqual" + }, + "parameters": [ + "GetArgumentAsString(\"Color\")", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::SetPropertyColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Color\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyTimer" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::SetPropertyTimer" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0.2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Both\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::SetPropertyTimer" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Timer\")/2 + (3*TimeDelta())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StrEqual" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Backward\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ReverseDirection", + "=", + "-1" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_TimeProgressionEffect", + "=", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "GetArgumentAsNumber(\"MaxOpacity\")", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::SetPropertyMaxOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"MaxOpacity\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FlashTransitionPainter::FlashTransitionPainter", + "type": "behavior" + }, + { + "description": "Color", + "name": "Color", + "type": "color" + }, + { + "description": "Duration", + "name": "Timer", + "type": "expression" + }, + { + "description": "Type of effect ", + "name": "Type", + "supplementaryInformation": "[\"Flash\",\"Horizontal\",\"Vertical\",\"Circular\"]", + "type": "stringWithSelector" + }, + { + "description": "Direction transition", + "name": "Direction", + "supplementaryInformation": "[\"Both\",\"Forward\",\"Backward\"]", + "type": "stringWithSelector" + }, + { + "description": "End opacity (only for flash)", + "name": "MaxOpacity", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Paint effect ended.", + "fullName": "Paint effect ended ", + "functionType": "Condition", + "name": "PaintEffectIsEnd", + "sentence": "When paint effect of _PARAM0_ ends", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect when the animation ends with a timer which is initialised in PaintEffect function.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Backward\"" + ] + }, + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Forward\"" + ] + } + ] + }, + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__FlashTransitionPainter_timerEffect\"", + "Object.Behavior::PropertyTimer() - (3*TimeDelta())" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Both\"" + ] + }, + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__FlashTransitionPainter_timerEffect\"", + "Object.Behavior::PropertyTimer()*2 - (3*TimeDelta())" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FlashTransitionPainter::FlashTransitionPainter", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Timer", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Timer" + }, + { + "value": "255;255;255", + "type": "String", + "label": "Color", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Color" + }, + { + "value": "", + "type": "String", + "label": "Type of effect ", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Type" + }, + { + "value": "", + "type": "String", + "label": "Direction of transition", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Direction" + }, + { + "value": "255", + "type": "Number", + "label": "The maximum of the opacity only for flash", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "MaxOpacity" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "", + "category": "User interface", + "extensionNamespace": "", + "fullName": "Panel sprite button", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPHBhdGggY2xhc3M9InN0MCIgZD0iTTI5LDIzSDNjLTEuMSwwLTItMC45LTItMlYxMWMwLTEuMSwwLjktMiwyLTJoMjZjMS4xLDAsMiwwLjksMiwydjEwQzMxLDIyLjEsMzAuMSwyMywyOSwyM3oiLz4NCjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMywxOUwxMywxOWMtMS4xLDAtMi0wLjktMi0ydi0yYzAtMS4xLDAuOS0yLDItMmgwYzEuMSwwLDIsMC45LDIsMnYyQzE1LDE4LjEsMTQuMSwxOSwxMywxOXoiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIxOCIgeTE9IjEzIiB4Mj0iMTgiIHkyPSIxOSIvPg0KPGxpbmUgY2xhc3M9InN0MCIgeDE9IjIxIiB5MT0iMTMiIHgyPSIxOCIgeTI9IjE3Ii8+DQo8bGluZSBjbGFzcz0ic3QwIiB4MT0iMjEiIHkxPSIxOSIgeDI9IjE5IiB5Mj0iMTYiLz4NCjwvc3ZnPg0K", + "name": "PanelSpriteButton", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Interface Elements/Interface Elements_interface_ui_button_ok_cta_clock_tap.svg", + "shortDescription": "A button that can be customized.", + "version": "1.0.0", + "description": "The button can be customized with a background for each state and a label. It handles user interactions and a simple condition can be used to check if it is clicked.", + "origin": { + "identifier": "PanelSpriteButton", + "name": "gdevelop-extension-store" + }, + "tags": [ + "button", + "ui" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" + ], + "dependencies": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [], + "eventsBasedObjects": [ + { + "defaultName": "Button", + "description": "A button that can be customized.", + "fullName": "Panel sprite button", + "name": "PanelSpriteButton", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Create one background instance for of each state.\nOnly the instance for the current state is shown.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "Idle", + "0", + "0", + "" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "Hovered", + "0", + "0", + "" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "Pressed", + "0", + "0", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Hovered" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Pressed" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Place the label over the backgrounds.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "Label", + "0", + "0", + "" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "Label", + "=", + "1" + ] + }, + { + "type": { + "value": "TextObject::SetTextAlignment" + }, + "parameters": [ + "Label", + "\"center\"" + ] + }, + { + "type": { + "value": "TextObject::SetWrapping" + }, + "parameters": [ + "Label", + "yes" + ] + }, + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::CenterLabel" + }, + "parameters": [ + "Object", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Touch devices can't do hovering. As it's heavy to check that the cursor is over the button, we disable it.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SystemInfo::HasTouchScreen" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::SetPropertyShouldCheckHovering" + }, + "parameters": [ + "Object", + "no" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [ + { + "name": "Background", + "objects": [ + { + "name": "Idle" + }, + { + "name": "Hovered" + }, + { + "name": "Pressed" + } + ] + } + ] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onHotReloading", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::CenterLabel" + }, + "parameters": [ + "Object", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The property can't be set in onCreate for some reson.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SystemInfo::HasTouchScreen" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::SetPropertyShouldCheckHovering" + }, + "parameters": [ + "Object", + "no" + ] + } + ] + }, + { + "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": "Make sure the cursor position is only checked once per frame", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Idle", + "ContainsCursor", + "=" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::PropertyShouldCheckHovering" + }, + "parameters": [ + "Object" + ] + }, + { + "type": { + "value": "MouseButtonPressed" + }, + "parameters": [ + "", + "Left" + ] + } + ] + }, + { + "type": { + "value": "AjoutObjConcern" + }, + "parameters": [ + "", + "Idle" + ] + }, + { + "type": { + "value": "SourisSurObjet" + }, + "parameters": [ + "Idle", + "", + "no", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Idle", + "ContainsCursor", + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The \"Validated\" state only last one frame.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The trigger once must be before the state condition to detect a new press.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "MouseButtonPressed" + }, + "parameters": [ + "", + "Left" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "Idle", + "ContainsCursor", + "True" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"Hovered\"" + ] + }, + { + "type": { + "value": "VarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"Idle\"" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"PressedInside\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "MouseButtonReleased" + }, + "parameters": [ + "", + "Left" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"Validated\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"Idle\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "Idle", + "ContainsCursor", + "True" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"PressedOutside\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "Idle", + "ContainsCursor", + "True" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"PressedInside\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "MouseButtonPressed" + }, + "parameters": [ + "", + "Left" + ] + }, + { + "type": { + "value": "VarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"Hovered\"" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Apply states", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Show the right background accordingly to the new state.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "SetCenterY" + }, + "parameters": [ + "Label", + "=", + "Object.CenterWithPaddingY()" + ] + }, + { + "type": { + "value": "Montre" + }, + "parameters": [ + "Idle", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Hovered" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Pressed" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"Hovered\"" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "SetCenterY" + }, + "parameters": [ + "Label", + "=", + "Object.CenterWithPaddingY()" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Idle" + ] + }, + { + "type": { + "value": "Montre" + }, + "parameters": [ + "Hovered", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Pressed" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"PressedInside\"" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "SetCenterY" + }, + "parameters": [ + "Label", + "=", + "Object.CenterWithPaddingY() + Object.PropertyPressedLabelOffsetY()" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Idle" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Hovered" + ] + }, + { + "type": { + "value": "Montre" + }, + "parameters": [ + "Pressed", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"PressedOutside\"" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "SetCenterY" + }, + "parameters": [ + "Label", + "=", + "Object.CenterWithPaddingY()" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Idle" + ] + }, + { + "type": { + "value": "Montre" + }, + "parameters": [ + "Hovered", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Pressed" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Resize", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Children instances must be resized when the button size change:\n- backgrounds for each state are resized to take the full dimensions of the button\n- the label is put back at the center of the button\n\nThe scale is set back to 1 because it means that the parent instance has the same dimensions as the union of its children instances.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Width()", + "!=", + "max(Idle.Width(), Label.Width())" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Height()", + "!=", + "max(Idle.Height(), Label.Height())" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Idle", + "Width", + "=", + "Object.Width()" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Idle", + "Height", + "=", + "Object.Height()" + ] + }, + { + "type": { + "value": "PanelSpriteButton::Scale" + }, + "parameters": [ + "Object", + "=", + "1" + ] + }, + { + "type": { + "value": "PanelSpriteObject::Width" + }, + "parameters": [ + "Background", + "=", + "Idle.Variable(Width)" + ] + }, + { + "type": { + "value": "PanelSpriteObject::Height" + }, + "parameters": [ + "Background", + "=", + "Idle.Variable(Height)" + ] + }, + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::CenterLabel" + }, + "parameters": [ + "Object", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [ + { + "name": "Background", + "objects": [ + { + "name": "Idle" + }, + { + "name": "Hovered" + }, + { + "name": "Pressed" + } + ] + } + ] + }, + { + "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": "VarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the cursor is hovered over the button.", + "fullName": "Is hovered", + "functionType": "Condition", + "name": "IsHovered", + "sentence": "_PARAM0_ is hovered", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is either hovered or pressed but not hovered.", + "fullName": "Is focused", + "functionType": "Condition", + "name": "IsFocused", + "sentence": "_PARAM0_ is focused", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed with mouse or touch.", + "fullName": "Is pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "_PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjetTxt" + }, + "parameters": [ + "Idle", + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Change the text of the button label.", + "fullName": "Label text", + "functionType": "Action", + "name": "SetLabelText", + "sentence": "Change the text of _PARAM0_ to _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "TextObject::String" + }, + "parameters": [ + "Label", + "=", + "GetArgumentAsString(\"LabelText\")" + ] + }, + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::CenterLabel" + }, + "parameters": [ + "Object", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + }, + { + "description": "", + "name": "LabelText", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Return the label text.", + "fullName": "Label text", + "functionType": "StringExpression", + "name": "LabelText", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Label.String()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Return the label center Y according to the button configuration. This expression is used in doStepPostEvents when the button is pressed or released.", + "fullName": "", + "functionType": "Expression", + "name": "CenterWithPaddingY", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Idle.CenterY() + (Object.PropertyTopPadding() - Object.PropertyBottomPadding()) / 2" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Center the label according to the button configuration. This is used in doStepPostEvents when the button is resized.", + "fullName": "", + "functionType": "Action", + "name": "CenterLabel", + "private": true, + "sentence": "Center the label of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "MettreXY" + }, + "parameters": [ + "Label", + "=", + "Object.PropertyLeftPadding()", + "=", + "Object.PropertyTopPadding()" + ] + }, + { + "type": { + "value": "TextObject::WrappingWidth" + }, + "parameters": [ + "Label", + "=", + "Idle.Width() - Object.PropertyLeftPadding() - Object.PropertyRightPadding()" + ] + }, + { + "type": { + "value": "TextObject::WrappingWidth" + }, + "parameters": [ + "Label", + "=", + "Idle.Width() - Object.PropertyLeftPadding() - Object.PropertyRightPadding()" + ] + }, + { + "type": { + "value": "SetCenterY" + }, + "parameters": [ + "Label", + "=", + "Object.CenterWithPaddingY()" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetCenterX" + }, + "parameters": [ + "Label", + "=", + "Background.CenterX() + (Object.PropertyLeftPadding() - Object.PropertyRightPadding()) / 2" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::IsPressed" + }, + "parameters": [ + "Object", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Label", + "+", + "Object.PropertyPressedLabelOffsetY()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [ + { + "name": "Background", + "objects": [ + { + "name": "Idle" + }, + { + "name": "Hovered" + }, + { + "name": "Pressed" + } + ] + } + ] + } + ], + "propertyDescriptors": [ + { + "value": "0", + "type": "Number", + "label": "Label offset on Y axis when pressed", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "PressedLabelOffsetY" + }, + { + "value": "0", + "type": "Number", + "label": "Left padding", + "description": "", + "group": "Padding", + "extraInformation": [], + "hidden": false, + "name": "LeftPadding" + }, + { + "value": "0", + "type": "Number", + "label": "Right padding", + "description": "", + "group": "Padding", + "extraInformation": [], + "hidden": false, + "name": "RightPadding" + }, + { + "value": "0", + "type": "Number", + "label": "Top padding", + "description": "", + "group": "Padding", + "extraInformation": [], + "hidden": false, + "name": "TopPadding" + }, + { + "value": "0", + "type": "Number", + "label": "Bottom padding", + "description": "", + "group": "Padding", + "extraInformation": [], + "hidden": false, + "name": "BottomPadding" + }, + { + "value": "true", + "type": "Boolean", + "label": "Should check hovering", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ShouldCheckHovering" + } + ], + "objects": [ + { + "assetStoreId": "", + "bold": false, + "italic": false, + "name": "Label", + "smoothed": true, + "tags": "", + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Text", + "font": "", + "characterSize": 20, + "color": { + "b": 0, + "g": 0, + "r": 0 + } + }, + { + "assetStoreId": "", + "bottomMargin": 0, + "height": 32, + "leftMargin": 0, + "name": "Idle", + "rightMargin": 0, + "tags": "", + "texture": "", + "tiled": false, + "topMargin": 0, + "type": "PanelSpriteObject::PanelSprite", + "width": 32, + "variables": [ + { + "folded": true, + "name": "State", + "type": "string", + "value": "Idle" + } + ], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "bottomMargin": 0, + "height": 32, + "leftMargin": 0, + "name": "Hovered", + "rightMargin": 0, + "tags": "", + "texture": "", + "tiled": false, + "topMargin": 0, + "type": "PanelSpriteObject::PanelSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "bottomMargin": 0, + "height": 32, + "leftMargin": 0, + "name": "Pressed", + "rightMargin": 0, + "tags": "", + "texture": "", + "tiled": false, + "topMargin": 0, + "type": "PanelSpriteObject::PanelSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [] + } + ] + } + ] + }, + { + "author": "Tristan Rhodes (https://victrisgames.itch.io/)", + "category": "Visual effect", + "extensionNamespace": "", + "fullName": "Shake Object (position, angle, scale)", + "helpPath": "https://victrisgames.itch.io/gdevelop-camera-shake-example", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWFycm93LWFsbCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMywxMUgxOEwxNi41LDkuNUwxNy45Miw4LjA4TDIxLjg0LDEyTDE3LjkyLDE1LjkyTDE2LjUsMTQuNUwxOCwxM0gxM1YxOEwxNC41LDE2LjVMMTUuOTIsMTcuOTJMMTIsMjEuODRMOC4wOCwxNy45Mkw5LjUsMTYuNUwxMSwxOFYxM0g2TDcuNSwxNC41TDYuMDgsMTUuOTJMMi4xNiwxMkw2LjA4LDguMDhMNy41LDkuNUw2LDExSDExVjZMOS41LDcuNUw4LjA4LDYuMDhMMTIsMi4xNkwxNS45Miw2LjA4TDE0LjUsNy41TDEzLDZWMTFaIiAvPjwvc3ZnPg==", + "name": "ShakeObject", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/arrow-all.svg", + "shortDescription": "Shake an object, using one or more ways to shake (position, angle, scale).", + "version": "1.5.5", + "description": "Select one or more methods of shaking:\n- Position: Shake the X and/or Y position of the object \n- Angle: Shake the angle (rotation) of the object \n- Scale: Shake the scale of the object (must be a sprite)\n\nControl how the object shakes:\n- Amplitude: How far the object moves during each shake\n- Duration: Amount of time to shake the object\n- Time between shakes: Amount of time between each movement of the object\n- Keep shaking until stopped (boolean)\n\nTips:\n- For a single-shake effect, set the \"Time between shakes\" to be equal to \"Duration\" (great for a hit or impact)\n- To make the single-shake move in the opposite direction, use negative numbers \n- To repeat a single-shake effect in a loop, add a condition \"Object is not shaking\" \n- Use a long \"Time between shakes\" to simulate a slow moving object (like a ship rocking back and forth)\n- Make sure to \"Stop shaking\" before starting a new shake if it uses different parameters. \n- Use \"Shake until stopped\" to simulate engine vibration, earthquake, or pulsing", + "origin": { + "identifier": "ShakeObject", + "name": "gdevelop-extension-store" + }, + "tags": [ + "shaking", + "object", + "effect", + "shake", + "scale", + "position", + "rotate", + "angle" + ], + "authorIds": [ + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Shake an object, using one or more ways to shake (position, angle).\nThis behavior can be used on any type of object.", + "fullName": "Shake object (position, angle)", + "name": "ShakeObject_PositionAngle", + "objectType": "", + "eventsFunctions": [ + { + "description": "Shake an object, using one or more ways to shake (position, angle).", + "fullName": "Shake object (position, angle)", + "functionType": "Action", + "name": "ShakeObject_PositionAngle", + "sentence": "Shake object _PARAM0_ for _PARAM2_ seconds. Modify position amplitude _PARAM3_ on X axis and _PARAM4_ on Y axis, angle rotation amplitude _PARAM5_. Wait _PARAM6_ seconds between shakes. Keep shaking until stopped: _PARAM7_", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Shake Object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Start/Reset duration timer", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Pass input parameters to global variables so that onScenePostEvents can use them", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "GetArgumentAsNumber(\"Duration\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "=", + "GetArgumentAsNumber(\"PowerX\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "=", + "GetArgumentAsNumber(\"PowerY\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "=", + "GetArgumentAsNumber(\"PowerAngle\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "GetArgumentAsNumber(\"TimeBetweenShakes\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Determine if the shake should keep going until stopped", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"ShakeForever\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add default values if none were provided", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "0.5" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "0.08" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If duration is less than a single shake, increase duration to make 1 full shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "<", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect initial shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Initiate the onScenePostEvents function", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", + "type": "behavior" + }, + { + "description": "Duration of shake (in seconds) (Default: 0.5) ", + "name": "Duration", + "type": "expression" + }, + { + "description": "Amplitude of postion shake in X direction (in pixels) (For example: 5)", + "name": "PowerX", + "type": "expression" + }, + { + "description": "Amplitude of position shake in Y direction (in pixels) (For example: 5)", + "name": "PowerY", + "type": "expression" + }, + { + "description": "Amplitude of angle rotation shake (in degrees) (For example: 5)", + "name": "PowerAngle", + "type": "expression" + }, + { + "description": "Amount of time between shakes (in seconds) (Default: 0.08)", + "name": "TimeBetweenShakes", + "type": "expression" + }, + { + "description": "Keep shaking until stopped", + "longDescription": "Duration value will be ignored", + "name": "ShakeForever", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Shake Object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Start shaking", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Keep object shaking forever (if desired)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "True" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "100" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Calculate movement of the shake", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Run once before every shake movement", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + }, + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeCounter", + "+", + "1" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Correct for drift and reset drift tracking variables", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to correct any drift from previous shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledX)" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledY)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_AngleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset drift detection variables", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Position Shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "PositionDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * [-1 or 1]", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make initial shake NOT random so users can set a direction for a one-shake effect", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementX", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementY", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "After initial shake pick a random direction", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementX", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX) * RandomWithStep(-1, 1, 2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementY", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY) * RandomWithStep(-1, 1, 2)" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Rotation (angle) shake ", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"even\" shake, rotate clockwise", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementAngle", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"odd\" shake, rotate counter-clockwise", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementAngle", + "=", + "-1 *(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save that initial shake has been processed", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "0" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate the fraction of shake that occured during this frame", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PercentTimeElapsedThisFrame", + "=", + "min(1,TimeDelta()/Object.Variable(__ShakeObject_TimeBetweenShakes))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Increase change for the first half of the shake (move away from original values)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change position", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change angle", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerAngle)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Decrease change the second half of the shake (return to original position)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change position", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change angle", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerAngle)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Stop shaking", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Stop shaking when the duration has been reached (or if the stop shaking function was called)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"", + "Object.Variable(__ShakeObject_Duration)" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "-1" + ] + } + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeCounter", + "=", + "0" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Correct for drift and reset drift tracking variables", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to correct any drift from previous shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledX)" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledY)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_AngleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset drift detection variables", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Stop any shaking of object that was initiated by the Shake Object extension.", + "fullName": "Stop shaking the object", + "functionType": "Action", + "name": "StopShaking", + "sentence": "Stop shaking _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngle::IsShaking" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "-1" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if an object is shaking.", + "fullName": "Check if an object is shaking", + "functionType": "Condition", + "name": "IsShaking", + "sentence": "_PARAM0_ is shaking", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [], + "sharedPropertyDescriptors": [] + }, + { + "description": "Shake an object, using one or more ways to shake (position, angle, scale)\nThis behavior can only be used on sprite objects.", + "fullName": "Shake object (position, angle, scale)", + "name": "ShakeObject_PositionAngleScale", + "objectType": "Sprite", + "eventsFunctions": [ + { + "description": "Shake an object, using one or more ways to shake (position, angle, scale).", + "fullName": "Shake object (position, angle, scale)", + "functionType": "Action", + "name": "ShakeObject_PositionAngleScale", + "sentence": "Shake object _PARAM0_ for _PARAM2_ seconds. Modify position amplitude _PARAM3_ on X axis and _PARAM4_ on Y axis, angle rotation amplitude _PARAM5_, and scale amplitude _PARAM6_. Wait _PARAM7_ seconds between shakes. Keep shaking until stopped: _PARAM8_", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Shake Object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Start/Reset duration timer", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Pass input parameters to global variables so that onScenePostEvents can use them", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "GetArgumentAsNumber(\"Duration\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "=", + "GetArgumentAsNumber(\"PowerX\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "=", + "GetArgumentAsNumber(\"PowerY\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "=", + "GetArgumentAsNumber(\"PowerAngle\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerScale", + "=", + "GetArgumentAsNumber(\"PowerScale\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "GetArgumentAsNumber(\"TimeBetweenShakes\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Determine if the shake should keep going until stopped", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"ShakeForever\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add default values if none were provided", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "0.5" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "0.08" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If duration is less than a single shake, increase duration to make 1 full shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "<", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect initial shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Initiate the onScenePostEvents function", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", + "type": "behavior" + }, + { + "description": "Duration of shake (in seconds) (Default: 0.5)", + "name": "Duration", + "type": "expression" + }, + { + "description": "Amplitude of postion shake in X direction (in pixels) (For example: 5)", + "name": "PowerX", + "type": "expression" + }, + { + "description": "Amplitude of position shake in Y direction (in pixels) (For example: 5)", + "name": "PowerY", + "type": "expression" + }, + { + "description": "Amplitude of angle rotation shake (in degrees) (For example: 5)", + "name": "PowerAngle", + "type": "expression" + }, + { + "description": "Amplitude of scale shake (in percent change) (For example: 5)", + "name": "PowerScale", + "type": "expression" + }, + { + "description": "Amount of time between shakes (in seconds) (Default: 0.08)", + "name": "TimeBetweenShakes", + "type": "expression" + }, + { + "description": "Keep shaking until stopped", + "longDescription": "Duration value will be ignored", + "name": "ShakeForever", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Shake Object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Start shaking", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Keep object shaking forever (if desired)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "True" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "100" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Calculate movement of the shake", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Run once before every shake movement", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + }, + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeCounter", + "+", + "1" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Correct for drift and reset drift tracking variables", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to correct any drift from previous shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledX)" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledY)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_AngleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerScale", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_ScaleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset drift detection variables", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ScaleTravelled", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Position Shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "PositionDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * [-1 or 1]", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make initial shake NOT random so users can set a direction for a one-shake effect", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementX", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementY", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "After initial shake pick a random direction", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementX", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX) * RandomWithStep(-1, 1, 2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementY", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY) * RandomWithStep(-1, 1, 2)" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Rotation (angle) shake ", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"even\" shake, rotate clockwise", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementAngle", + "=", + "-1 * (Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"odd\" shake, rotate counter-clockwise", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementAngle", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Scale shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerScale", + "!=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate object scale displacement, with linear decay over time", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "ScaleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * 1/100", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every even shake, increase scale", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementScale", + "=", + "-1 * (Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerScale) * (1/100)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"odd\" shake, decrease scale", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "ScaleDisplacement = -1 * (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * 1/100", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementScale", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerScale) * (1/100)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save that initial shake has been processed", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "0" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate the fraction of shake that occured during this frame", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PercentTimeElapsedThisFrame", + "=", + "min(1,TimeDelta()/Object.Variable(__ShakeObject_TimeBetweenShakes))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Increase change for the first half of the shake (move away from original values)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change position", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change angle", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerAngle)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change scale", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerScale)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ScaleTravelled", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Decrease change the second half of the shake (return to original position)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change position", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change angle", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerAngle)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change scale", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerScale)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ScaleTravelled", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Stop shaking", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Stop shaking when the duration has been reached (or if the stop shaking function was called)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"", + "Object.Variable(__ShakeObject_Duration)" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "-1" + ] + } + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeCounter", + "=", + "0" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Correct for drift and reset drift tracking variables", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to correct any drift from previous shake", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledX)" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledY)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_AngleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerScale", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_ScaleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset drift detection variables", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ScaleTravelled", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Stop shaking an object.", + "fullName": "Stop shaking an object", + "functionType": "Action", + "name": "StopShaking", + "sentence": "Stop shaking _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngleScale::IsShaking" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "-1" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if an object is shaking.", + "fullName": "Check if an object is shaking", + "functionType": "Condition", + "name": "IsShaking", + "sentence": "_PARAM0_ is shaking", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "", + "category": "Camera", + "extensionNamespace": "", + "fullName": "Smooth Camera", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQoJLnN0MXtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwO30NCjwvc3R5bGU+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjQsMTNoLTZjLTEuMSwwLTItMC45LTItMlY1YzAtMS4xLDAuOS0yLDItMmg2YzEuMSwwLDIsMC45LDIsMnY2QzI2LDEyLjEsMjUuMSwxMywyNCwxM3oiLz4NCjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0yNiw4djEwYzAsMS4xLTAuOSwyLTIsMkg4Yy0xLjEsMC0yLTAuOS0yLTJWOGMwLTEuMSwwLjktMiwyLTJoOCIvPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjEiIGN5PSI4IiByPSIyIi8+DQo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxMSIgY3k9IjE2IiByPSIxIi8+DQo8cmVjdCB4PSI5IiB5PSI5IiBjbGFzcz0ic3QwIiB3aWR0aD0iNCIgaGVpZ2h0PSIzIi8+DQo8cG9seWxpbmUgY2xhc3M9InN0MCIgcG9pbnRzPSIyMSwyOSAyMSwyOSAxMSwyOSAxMSwyOSAiLz4NCjxwb2x5bGluZSBjbGFzcz0ic3QwIiBwb2ludHM9IjE4LDIwIDE4LDI5IDE0LDI5IDE0LDIwICIvPg0KPHJlY3QgeD0iNyIgeT0iMyIgY2xhc3M9InN0MCIgd2lkdGg9IjQiIGhlaWdodD0iMyIvPg0KPC9zdmc+DQo=", + "name": "SmoothCamera", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Computers and Hardware/Computers and Hardware_camcoder_gopro_go_pro_camera.svg", + "shortDescription": "Smoothly scroll to follow an object.", + "version": "0.2.2", + "description": "The camera follows an object according to:\n- a frame rate independent catch-up speed to make the scrolling from smooth to strong\n- a maximum speed to do linear following ([open the project online](https://editor.gdevelop.io/?project=example://platformer-with-tilemap)) or slow down the camera when teleporting the object\n- a follow-free zone to avoid scrolling on small movements\n- an offset to see further in one direction\n- an extra delay and catch-up speed to give an impression of speed (useful for dash)\n- position forecasting and delay to simulate a cameraman response time\n\nA platformer dedicated behavior allows to switch of settings when the character is in air or on the floor. This can be used to stabilize the camera when jumping.", + "origin": { + "identifier": "SmoothCamera", + "name": "gdevelop-extension-store" + }, + "tags": [ + "camera", + "scrolling", + "follow", + "smooth" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" + ], + "dependencies": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Smoothly scroll to follow an object.", + "fullName": "Smooth Camera", + "name": "SmoothCamera", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update private properties through setters to check their values and initialize state.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetLeftwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyLeftwardSpeed()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetRightwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyRightwardSpeed()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyUpwardSpeed()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyDownwardSpeed()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetLeftwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyLeftwardSpeedMax()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetRightwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyRightwardSpeedMax()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyUpwardSpeedMax()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyDownwardSpeedMax()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaLeft" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFollowFreeAreaLeft()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaRight" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFollowFreeAreaRight()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFollowFreeAreaTop()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFollowFreeAreaBottom()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraDelay" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyCameraDelay()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::PropertyIsCalledManually" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::DoMoveCameraCloser" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Move the camera closer to the object. This action must be called after the object has moved for the frame.", + "fullName": "Move the camera closer", + "functionType": "Action", + "name": "MoveCameraCloser", + "sentence": "Move the camera closer to _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The camera following is called with an action, the call from doStepPreEvents must be disabled to avoid to do it twice.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIsCalledManually" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::DoMoveCameraCloser" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Move the camera closer to the object.", + "fullName": "Do move the camera closer", + "functionType": "Action", + "name": "DoMoveCameraCloser", + "private": true, + "sentence": "Do move the camera closer _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Delaying and forecasting can be used at the same time.\nForecasting only use the positions that are older than the one used for delaying.\nThe behavior uses a position history that is split in 2 arrays:\n- one for delaying the position (from TimeFromStart to TimeFromStart - CamearDelay)\n- one for forecasting the position (from TimeFromStart - CamearDelay to TimeFromStart - CamearDelay - ForecastHistoryDuration", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::UpdateDelayedPosition" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::UpdateForecastedPosition" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "At each frame, the camera must catchup the target by a given ratio (speed)\ncameraX(t) - targetX = (cameraX(t - 1) - targetX) * speed\n\nThe frame rate must not impact on the catch-up speed, we don't want a speed in ratio per frame but a speed ratio per second, like this:\ncameraX(t) - targetX = (cameraX(t - 1s) - targetX) * speed\n\nOk, but we still need to process each frame, we can use a exponent for this:\ncameraX(t) - targetX = (cameraX(t - timeDelta) - targetX) * speed^timeDelta\ncameraX(t) = targetX + (cameraX(t - timeDelta) - targetX) * exp(timeDelta * ln(speed))\n\npow is probably more efficient than precalculated log if the speed is changed continuously but this might be rare enough.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowOnX" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyOldX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "CameraX(Object.Layer(), 0)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraX" + }, + "parameters": [ + "", + ">", + "Object.Behavior::FreeAreaRight()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraX" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaRight()\n+ (CameraX(Object.Layer(), 0) - Object.Behavior::FreeAreaRight())\n* exp(TimeDelta() * Object.Behavior::PropertyLogLeftwardSpeed())", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraX" + }, + "parameters": [ + "", + "<", + "Object.Behavior::PropertyOldX() - Object.Behavior::PropertyLeftwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraX" + }, + "parameters": [ + "", + "=", + "Object.Behavior::PropertyOldX() - Object.Behavior::PropertyLeftwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraX" + }, + "parameters": [ + "", + "<", + "Object.Behavior::FreeAreaLeft()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraX" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaLeft()\n+ (CameraX(Object.Layer(), 0) - Object.Behavior::FreeAreaLeft())\n* exp(TimeDelta() * Object.Behavior::PropertyLogRightwardSpeed())", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraX" + }, + "parameters": [ + "", + ">", + "Object.Behavior::PropertyOldX() + Object.Behavior::PropertyRightwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraX" + }, + "parameters": [ + "", + "=", + "Object.Behavior::PropertyOldX() + Object.Behavior::PropertyRightwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowOnY" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyOldY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "CameraY(Object.Layer(), 0)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraY" + }, + "parameters": [ + "", + ">", + "Object.Behavior::FreeAreaBottom()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraY" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaBottom()\n+ (CameraY(Object.Layer(), 0) - Object.Behavior::FreeAreaBottom())\n* exp(TimeDelta() * Object.Behavior::PropertyLogUpwardSpeed())", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraY" + }, + "parameters": [ + "", + "<", + "Object.Behavior::PropertyOldY() - Object.Behavior::PropertyUpwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraY" + }, + "parameters": [ + "", + "=", + "Object.Behavior::PropertyOldY() - Object.Behavior::PropertyUpwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraY" + }, + "parameters": [ + "", + "<", + "Object.Behavior::FreeAreaTop()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraY" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaTop()\n+ (CameraY(Object.Layer(), 0) - Object.Behavior::FreeAreaTop())\n* exp(TimeDelta() * Object.Behavior::PropertyLogDownwardSpeed())", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraY" + }, + "parameters": [ + "", + ">", + "Object.Behavior::PropertyOldY() + Object.Behavior::PropertyDownwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraY" + }, + "parameters": [ + "", + "=", + "Object.Behavior::PropertyOldY() + Object.Behavior::PropertyDownwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Delay the camera according to a maximum speed and catch up the delay.", + "fullName": "Wait and catch up", + "functionType": "Action", + "name": "WaitAndCatchUp", + "sentence": "Delay the camera of _PARAM0_ during: _PARAM2_ seconds according to the maximum speed _PARAM3_;_PARAM4_ seconds and catch up in _PARAM5_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Maybe the catch-up show be done in constant pixel speed instead of constant time speed.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyWaitingEnd" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "TimeFromStart() + GetArgumentAsNumber(\"WaitingDuration\")" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyWaitingSpeedXMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"WaitingSpeedXMax\")" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyWaitingSpeedYMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"WaitingSpeedYMax\")" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraDelayCatchUpDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"CatchUpDuration\")" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Wait and catch up\"", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Waiting duration (in seconds)", + "name": "WaitingDuration", + "type": "expression" + }, + { + "description": "Waiting maximum camera target speed X", + "name": "WaitingSpeedXMax", + "type": "expression" + }, + { + "description": "Waiting maximum camera target speed Y", + "name": "WaitingSpeedYMax", + "type": "expression" + }, + { + "description": "Catch up duration (in seconds)", + "name": "CatchUpDuration", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Draw the targeted and actual camera position.", + "fullName": "Draw debug", + "functionType": "Action", + "name": "DrawDebug", + "sentence": "Draw targeted and actual camera position for _PARAM0_ on _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "ShapePainter", + "=", + "0" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Path used by the forecasting", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::OutlineColor" + }, + "parameters": [ + "ShapePainter", + "\"245;166;35\"" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::BeginFillPath" + }, + "parameters": [ + "ShapePainter", + "Object.Variable(__SmoothCamera.ForecastHistoryX[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[0])" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::PathLineTo" + }, + "parameters": [ + "ShapePainter", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Object.Behavior::PropertyIndex()])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Object.Behavior::PropertyIndex()])" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::EndFillPath" + }, + "parameters": [ + "ShapePainter" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Follow-free area.", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowFreeAreaLeft" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowFreeAreaRight" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::OutlineColor" + }, + "parameters": [ + "ShapePainter", + "\"126;211;33\"" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "ShapePainter", + "Object.Behavior::FreeAreaLeft() - 1", + "Object.Behavior::FreeAreaTop() - 1", + "Object.Behavior::FreeAreaRight() + 1", + "Object.Behavior::FreeAreaBottom() + 1" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Linear regression vector used by the forcasting.", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::OutlineColor" + }, + "parameters": [ + "ShapePainter", + "\"208;2;27\"" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::LineV2" + }, + "parameters": [ + "ShapePainter", + "Object.Behavior::PropertyProjectedOldestX()", + "Object.Behavior::PropertyProjectedOldestY()", + "Object.Behavior::PropertyProjectedNewestX()", + "Object.Behavior::PropertyProjectedNewestY()", + "1" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Targeted and actual camera position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Circle" + }, + "parameters": [ + "ShapePainter", + "Object.Behavior::PropertyForecastedX()", + "Object.Behavior::PropertyForecastedY()", + "3" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::LineV2" + }, + "parameters": [ + "ShapePainter", + "CameraX(Object.Layer(), 0)", + "CameraY(Object.Layer(), 0) - 4", + "CameraX(Object.Layer(), 0)", + "CameraY(Object.Layer(), 0) + 4", + "1" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::LineV2" + }, + "parameters": [ + "ShapePainter", + "CameraX(Object.Layer(), 0) - 4", + "CameraY(Object.Layer(), 0)", + "CameraX(Object.Layer(), 0) + 4", + "CameraY(Object.Layer(), 0)", + "1" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Shape painter", + "name": "ShapePainter", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Enable or disable the following on X axis.", + "fullName": "Follow on X", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowOnX", + "sentence": "The camera follows _PARAM0_ on X axis: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowOnX" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"FollowOnX\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowOnX" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow on X axis", + "name": "FollowOnX", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Enable or disable the following on Y axis.", + "fullName": "Follow on Y", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowOnY", + "sentence": "The camera follows _PARAM0_ on Y axis: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowOnY" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"FollowOnY\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowOnY" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow on Y axis", + "name": "FollowOnY", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area right border.", + "fullName": "Follow free area right border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaRight", + "sentence": "Change the camera follow free area right border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"SetFollowFreeAreaRight\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area right border", + "name": "SetFollowFreeAreaRight", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area left border.", + "fullName": "Follow free area left border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaLeft", + "sentence": "Change the camera follow free area left border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"SetFollowFreeAreaLeft\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area left border", + "name": "SetFollowFreeAreaLeft", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area top border.", + "fullName": "Follow free area top border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaTop", + "sentence": "Change the camera follow free area top border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"FollowFreeAreaTop\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area top border", + "name": "FollowFreeAreaTop", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area bottom border.", + "fullName": "Follow free area bottom border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaBottom", + "sentence": "Change the camera follow free area bottom border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"SetFollowFreeAreaBottom\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area bottom border", + "name": "SetFollowFreeAreaBottom", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera leftward maximum speed (in pixels per second).", + "fullName": "Leftward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetLeftwardSpeedMax", + "sentence": "Change the camera leftward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLeftwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"Speed\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Leftward maximum speed (in ratio per second)", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera rightward maximum speed (in pixels per second).", + "fullName": "Rightward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetRightwardSpeedMax", + "sentence": "Change the camera rightward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLeftwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"Speed\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Rightward maximum speed (in pixels per second)", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera upward maximum speed (in pixels per second).", + "fullName": "Upward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetUpwardSpeedMax", + "sentence": "Change the camera upward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyUpwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"Speed\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Upward maximum speed (in pixels per second)", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera downward maximum speed (in pixels per second).", + "fullName": "Downward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetDownwardSpeedMax", + "sentence": "Change the camera downward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDownwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"Speed\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Downward maximum speed (in pixels per second)", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera leftward catch-up speed (in ratio per second).", + "fullName": "Leftward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetLeftwardSpeed", + "sentence": "Change the camera leftward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLeftwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(0, 1, GetArgumentAsNumber(\"LeftwardSpeed\"))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLogLeftwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "log(1 - Object.Behavior::PropertyLeftwardSpeed())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Leftward catch-up speed (in ratio per second)", + "name": "LeftwardSpeed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera rightward catch-up speed (in ratio per second).", + "fullName": "Rightward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetRightwardSpeed", + "sentence": "Change the camera rightward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyRightwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(0, 1, GetArgumentAsNumber(\"RightwardSpeed\"))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLogRightwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "log(1 - Object.Behavior::PropertyRightwardSpeed())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Rightward catch-up speed (in ratio per second)", + "name": "RightwardSpeed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera downward catch-up speed (in ratio per second).", + "fullName": "Downward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetDownwardSpeed", + "sentence": "Change the camera downward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDownwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(0, 1, GetArgumentAsNumber(\"DownwardSpeed\"))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLogDownwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "log(1 - Object.Behavior::PropertyDownwardSpeed())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Downward catch-up speed (in ratio per second)", + "name": "DownwardSpeed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera upward catch-up speed (in ratio per second).", + "fullName": "Upward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetUpwardSpeed", + "sentence": "Change the camera upward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyUpwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(0, 1, GetArgumentAsNumber(\"UpwardSpeed\"))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLogUpwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "log(1 - Object.Behavior::PropertyUpwardSpeed())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Upward catch-up speed (in ratio per second)", + "name": "UpwardSpeed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera offset on X axis of an object.", + "fullName": "Camera Offset X", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetOffsetX", + "sentence": "Change the camera offset on X axis of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraOffsetX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"CameraOffsetX\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Camera offset X", + "name": "CameraOffsetX", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera offset on Y axis of an object.", + "fullName": "Camera Offset Y", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetOffsetY", + "sentence": "Change the camera offset on Y axis of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraOffsetY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"CameraOffsetY\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Camera offset Y", + "name": "CameraOffsetY", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera forecast time (in seconds).", + "fullName": "Forecast time", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetForecastTime", + "sentence": "Change the camera forecast time of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastTime" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(0, GetArgumentAsNumber(\"ForecastTime\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Forecast time", + "name": "ForecastTime", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera delay (in seconds).", + "fullName": "Camera delay", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetCameraDelay", + "sentence": "Change the camera delay of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraDelay" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(0, GetArgumentAsNumber(\"CameraDelay\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Camera delay", + "name": "CameraDelay", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area left border X.", + "fullName": "Free area left", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaLeft", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyForecastedX() + Object.Behavior::PropertyCameraOffsetX() - Object.Behavior::PropertyFollowFreeAreaLeft()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area right border X.", + "fullName": "Free area right", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaRight", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyForecastedX() + Object.Behavior::PropertyCameraOffsetX() + Object.Behavior::PropertyFollowFreeAreaRight()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area bottom border Y.", + "fullName": "Free area bottom", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaBottom", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyForecastedY() + Object.Behavior::PropertyCameraOffsetY() + Object.Behavior::PropertyFollowFreeAreaBottom()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area top border Y.", + "fullName": "Free area top", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaTop", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyForecastedY() + Object.Behavior::PropertyCameraOffsetY() - Object.Behavior::PropertyFollowFreeAreaTop()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Update delayed position and delayed history. This is called in doStepPreEvents.", + "fullName": "Update delayed position", + "functionType": "Action", + "group": "Private", + "name": "UpdateDelayedPosition", + "private": true, + "sentence": "Update delayed position and delayed history of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add the previous position to have enough (2) positions to evaluate the extra delay for waiting mode.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ObjectTime)", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime", + "TimeFromStart()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX", + "Object.Behavior::PropertyDelayedCenterX()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY", + "Object.Behavior::PropertyDelayedCenterY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Use the object center when no delay is asked.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.CenterX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.CenterY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsDelayed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::AddForecastHistoryPosition" + }, + "parameters": [ + "Object", + "Behavior", + "TimeFromStart()", + "Object.CenterX()", + "Object.CenterY()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsDelayed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime", + "TimeFromStart()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX", + "Object.CenterX()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY", + "Object.CenterY()" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Remove history entries that are too old to be useful for delaying and pass it to the history for forecasting.", + "comment2": "" + }, + { + "infiniteLoopWarning": true, + "type": "BuiltinCommonInstructions::While", + "whileConditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ObjectTime)", + ">=", + "2" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime[1]", + "<", + "TimeFromStart() - Object.Behavior::CurrentDelay()" + ] + } + ], + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::AddForecastHistoryPosition" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Variable(__SmoothCamera.ObjectTime[0])", + "Object.Variable(__SmoothCamera.ObjectX[0])", + "Object.Variable(__SmoothCamera.ObjectY[0])", + "" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Don't move the camera if there is not enough history.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Variable(__SmoothCamera.ObjectX[0])" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Variable(__SmoothCamera.ObjectY[0])" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ObjectTime)", + ">=", + "2" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime[0]", + "<", + "TimeFromStart() - Object.Behavior::CurrentDelay()" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add the extra delay that could be needed to respect the speed limit in waiting mode.\n\nspeedRatio = min(speedMaxX / historySpeedX, speedMaxY / historySpeedY)\ndelay += min(0, timeDelta * (1 - speedRatio))", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraExtraDelay" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "max(0, TimeDelta() * (1 - min(Object.Behavior::PropertyWaitingSpeedXMax() * abs(Object.Variable(__SmoothCamera.ObjectX[1]) - Object.Variable(__SmoothCamera.ObjectX[0])), Object.Behavior::PropertyWaitingSpeedYMax() * abs(Object.Variable(__SmoothCamera.ObjectY[1]) - Object.Variable(__SmoothCamera.ObjectY[0]))) / (Object.Variable(__SmoothCamera.ObjectTime[1]) - Object.Variable(__SmoothCamera.ObjectTime[0]))))" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Extra delay: \" + ToString(Object.Behavior::PropertyCameraExtraDelay())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The time with delay is now between the first 2 indexes", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "lerp(Object.Variable(__SmoothCamera.ObjectX[1]), Object.Variable(__SmoothCamera.ObjectX[0]), ((TimeFromStart() - Object.Behavior::CurrentDelay()) - Object.Variable(__SmoothCamera.ObjectTime[1])) / (Object.Variable(__SmoothCamera.ObjectTime[0]) - Object.Variable(__SmoothCamera.ObjectTime[1])))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "lerp(Object.Variable(__SmoothCamera.ObjectY[1]), Object.Variable(__SmoothCamera.ObjectY[0]), ((TimeFromStart() - Object.Behavior::CurrentDelay()) - Object.Variable(__SmoothCamera.ObjectTime[1])) / (Object.Variable(__SmoothCamera.ObjectTime[0]) - Object.Variable(__SmoothCamera.ObjectTime[1])))" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsDelayed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariableClearChildren" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime" + ] + }, + { + "type": { + "value": "ObjectVariableClearChildren" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX" + ] + }, + { + "type": { + "value": "ObjectVariableClearChildren" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraDelayCatchUpSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyCameraExtraDelay() / Object.Behavior::PropertyCameraDelayCatchUpDuration()" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Start to catch up\"", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyCameraExtraDelay" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraExtraDelay" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, Object.Behavior::PropertyCameraExtraDelay() -Object.Behavior::PropertyCameraDelayCatchUpSpeed() * TimeDelta())" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Catching up delay: \" + ToString(Object.Behavior::PropertyCameraExtraDelay())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the camera following target is delayed from the object.", + "fullName": "Camera is delayed", + "functionType": "Condition", + "name": "IsDelayed", + "private": true, + "sentence": "The camera of _PARAM0_ is delayed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::CurrentDelay()", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the current camera delay.", + "fullName": "Current delay", + "functionType": "Expression", + "name": "CurrentDelay", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyCameraDelay() + Object.Behavior::PropertyCameraExtraDelay()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the camera following is waiting at a reduced speed.", + "fullName": "Camera is waiting", + "functionType": "Condition", + "name": "IsWaiting", + "private": true, + "sentence": "The camera of _PARAM0_ is waiting", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyWaitingEnd" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "TimeFromStart()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Add a position to the history for forecasting. This is called 2 times in UpadteDelayedPosition.", + "fullName": "Add forecast history position", + "functionType": "Action", + "group": "Private", + "name": "AddForecastHistoryPosition", + "private": true, + "sentence": "Add the time:_PARAM2_ and position: _PARAM3_; _PARAM4_ to the forecast history of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyForecastHistoryDuration" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyForecastTime" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryTime", + "GetArgumentAsNumber(\"Time\")" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryX", + "GetArgumentAsNumber(\"ObjectX\")" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryY", + "GetArgumentAsNumber(\"ObjectY\")" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Remove history entries that are too old to be useful.\nKeep at least 2 positions because no forecast can be done with less positions.", + "comment2": "" + }, + { + "infiniteLoopWarning": true, + "type": "BuiltinCommonInstructions::While", + "whileConditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)", + ">=", + "3" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryTime[0]", + "<", + "TimeFromStart() - Object.Behavior::PropertyCameraDelay() - Object.Behavior::PropertyCameraExtraDelay() - Object.Behavior::PropertyForecastHistoryDuration()" + ] + } + ], + "conditions": [], + "actions": [ + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryTime", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryX", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryY", + "0" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Time", + "name": "Time", + "type": "expression" + }, + { + "description": "Object X", + "name": "ObjectX", + "type": "expression" + }, + { + "description": "Object Y", + "name": "ObjectY", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Update forecasted position. This is called in doStepPreEvents.", + "fullName": "Update forecasted position", + "functionType": "Action", + "group": "Private", + "name": "UpdateForecastedPosition", + "private": true, + "sentence": "Update forecasted position of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyDelayedCenterX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyDelayedCenterY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Simple linear regression\ny = A * x + B\n\nA = Covariance / VarianceX\nB = MeanY - A * MeanX\n\nNote than we could use only one position every N positions to reduce the process time,\nbut if we really need efficient process JavaScript and circular queues are a must.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)", + ">=", + "2" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyForecastHistoryDuration" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyForecastTime" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Mean X", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanX" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Object.Behavior::PropertyIndex()])" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanX" + }, + "parameters": [ + "Object", + "Behavior", + "/", + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Mean Y", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryY)", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanY" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Object.Behavior::PropertyIndex()])" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanY" + }, + "parameters": [ + "Object", + "Behavior", + "/", + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryY)" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Mean: \" + ToString(Object.Behavior::PropertyForecastHistoryMeanX()) + \" \" + ToString(Object.Behavior::PropertyForecastHistoryMeanY())", + "", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Variance and Covariance", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "VarianceX = sum((X[i] - MeanX)²)\nVarianceY = sum((Y[i] - MeanY)²)\nCovariance = sum((X[i] - MeanX) * (Y[i] - MeanY))", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryVarianceX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryVarianceY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryCovariance" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryVarianceX" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "pow(Object.Variable(__SmoothCamera.ForecastHistoryX[Object.Behavior::PropertyIndex()]) - Object.Behavior::PropertyForecastHistoryMeanX(), 2)" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryVarianceY" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "pow(Object.Variable(__SmoothCamera.ForecastHistoryY[Object.Behavior::PropertyIndex()]) - Object.Behavior::PropertyForecastHistoryMeanY(), 2)" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryCovariance" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "(Object.Variable(__SmoothCamera.ForecastHistoryX[Object.Behavior::PropertyIndex()]) - Object.Behavior::PropertyForecastHistoryMeanX())\n*\n(Object.Variable(__SmoothCamera.ForecastHistoryY[Object.Behavior::PropertyIndex()]) - Object.Behavior::PropertyForecastHistoryMeanY())" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Variances: \" + ToString(Object.Behavior::PropertyForecastHistoryVarianceX()) + \" \" + ToString(Object.Behavior::PropertyForecastHistoryVarianceY()) + \" \" + ToString(Object.Behavior::PropertyForecastHistoryCovariance())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceX())", + "<", + "1" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceY())", + "<", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyDelayedCenterX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyDelayedCenterY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceX())", + ">=", + "1" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceY())", + ">=", + "1" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Linear function parameters", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "y = A * x + B\n\nA = Covariance / VarianceX\nB = MeanY - A * MeanX", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceX())", + ">=", + "abs(Object.Behavior::PropertyForecastHistoryVarianceY())" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryLinearA" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyForecastHistoryCovariance() / Object.Behavior::PropertyForecastHistoryVarianceX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryLinearB" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyForecastHistoryMeanY() - Object.Behavior::PropertyForecastHistoryLinearA() * Object.Behavior::PropertyForecastHistoryMeanX()" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Linear: \" + ToString(Object.Behavior::PropertyForecastHistoryLinearA()) + \" \" + ToString(Object.Behavior::PropertyForecastHistoryLinearB())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Projection", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::ProjectHistoryEnds" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Variable(__SmoothCamera.ForecastHistoryX[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Object.VariableChildCount(__SmoothCamera.ForecastHistoryX) - 1])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Object.VariableChildCount(__SmoothCamera.ForecastHistoryY) - 1])", + "" + ] + } + ] + } + ], + "parameters": [] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Axis permutation to avoid a ratio between 2 numbers near 0.", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceX())", + "<", + "abs(Object.Behavior::PropertyForecastHistoryVarianceY())" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryLinearA" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyForecastHistoryCovariance() / Object.Behavior::PropertyForecastHistoryVarianceY()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryLinearB" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyForecastHistoryMeanX() - Object.Behavior::PropertyForecastHistoryLinearA() * Object.Behavior::PropertyForecastHistoryMeanY()" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Linear: \" + ToString(Object.Behavior::PropertyForecastHistoryLinearA()) + \" \" + ToString(Object.Behavior::PropertyForecastHistoryLinearB())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Projection", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::ProjectHistoryEnds" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Variable(__SmoothCamera.ForecastHistoryY[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryX[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Object.VariableChildCount(__SmoothCamera.ForecastHistoryY) - 1])", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Object.VariableChildCount(__SmoothCamera.ForecastHistoryX) - 1])", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Permute back axis", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedOldestX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedOldestX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedOldestY()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedOldestY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyIndex()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedNewestX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedNewestX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedNewestY()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedNewestY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyIndex()" + ] + } + ] + } + ], + "parameters": [] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Oldest: \" + ToString(Object.Behavior::PropertyProjectedOldestX()) + \" \" + ToString(Object.Behavior::PropertyProjectedOldestY())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Newest: \" + ToString(Object.Behavior::PropertyProjectedNewestX()) + \" \" + ToString(Object.Behavior::PropertyProjectedNewestY())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Forcasted position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedNewestX() + ( Object.Behavior::PropertyProjectedNewestX() - Object.Behavior::PropertyProjectedOldestX()) * Object.Behavior::ForecastTimeRatio()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedNewestY() + ( Object.Behavior::PropertyProjectedNewestY() - Object.Behavior::PropertyProjectedOldestY()) * Object.Behavior::ForecastTimeRatio()" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Forecasted: \" + ToString(Object.Behavior::PropertyForecastedX()) + \" \" + ToString(Object.Behavior::PropertyForecastedY())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Project history ends position to have the vector on the line from linear regression. This function is only called by UpdateForecastedPosition.", + "fullName": "Project history ends", + "functionType": "Action", + "group": "Private", + "name": "ProjectHistoryEnds", + "private": true, + "sentence": "Project history oldest: _PARAM2_;_PARAM3_ and newest position: _PARAM4_;_PARAM5_ of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Perpendicular line:\npA = -1/a; \npB = -pA * x + y\n\nIntersection:\n/ ProjectedY = a * ProjectedX + b\n\\ ProjectedY = pA * ProjectedX + b\n\nSolution that is cleaned out from indeterminism (like 0 / 0 or infinity / infinity):\nProjectedX= (x + (y - b) * a) / (a² + 1)\nProjectedY = y + (x * a - y + b) / (a² + 1)", + "comment2": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedNewestX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "(GetArgumentAsNumber(\"NewestX\") + (GetArgumentAsNumber(\"NewestY\") - Object.Behavior::PropertyForecastHistoryLinearB()) * Object.Behavior::PropertyForecastHistoryLinearA()) / (1 + pow(Object.Behavior::PropertyForecastHistoryLinearA(), 2))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedNewestY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"NewestY\") + (GetArgumentAsNumber(\"NewestX\") * Object.Behavior::PropertyForecastHistoryLinearA() - GetArgumentAsNumber(\"NewestY\") \n+ Object.Behavior::PropertyForecastHistoryLinearB()) / (1 + pow(Object.Behavior::PropertyForecastHistoryLinearA(), 2))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedOldestX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "(GetArgumentAsNumber(\"OldestX\") + (GetArgumentAsNumber(\"OldestY\") - Object.Behavior::PropertyForecastHistoryLinearB()) * Object.Behavior::PropertyForecastHistoryLinearA()) / (1 + pow(Object.Behavior::PropertyForecastHistoryLinearA(), 2))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedOldestY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"OldestY\") + (GetArgumentAsNumber(\"OldestX\") * Object.Behavior::PropertyForecastHistoryLinearA() - GetArgumentAsNumber(\"OldestY\") \n+ Object.Behavior::PropertyForecastHistoryLinearB()) / (1 + pow(Object.Behavior::PropertyForecastHistoryLinearA(), 2))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "OldestX", + "name": "OldestX", + "type": "expression" + }, + { + "description": "OldestY", + "name": "OldestY", + "type": "expression" + }, + { + "description": "Newest X", + "name": "NewestX", + "type": "expression" + }, + { + "description": "Newest Y", + "name": "NewestY", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the ratio between forecast time and the duration of the history. This function is only called by UpdateForecastedPosition.", + "fullName": "Forecast time ratio", + "functionType": "Expression", + "group": "Private", + "name": "ForecastTimeRatio", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "- Object.Behavior::PropertyForecastTime() / (Object.Variable(__SmoothCamera.ForecastHistoryTime[0]) - Object.Variable(__SmoothCamera.ForecastHistoryTime[Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime) - 1]))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0.9", + "type": "Number", + "label": "Leftward catch-up speed (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "hidden": false, + "name": "LeftwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Rightward catch-up speed (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "hidden": false, + "name": "RightwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Upward catch-up speed (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "hidden": false, + "name": "UpwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Downward catch-up speed (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "hidden": false, + "name": "DownwardSpeed" + }, + { + "value": "true", + "type": "Boolean", + "label": "Follow on X axis", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "FollowOnX" + }, + { + "value": "true", + "type": "Boolean", + "label": "Follow on Y axis", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "FollowOnY" + }, + { + "value": "0", + "type": "Number", + "label": "Follow free area left border", + "description": "", + "group": "Position", + "extraInformation": [], + "hidden": false, + "name": "FollowFreeAreaLeft" + }, + { + "value": "0", + "type": "Number", + "label": "Follow free area right border", + "description": "", + "group": "Position", + "extraInformation": [], + "hidden": false, + "name": "FollowFreeAreaRight" + }, + { + "value": "0", + "type": "Number", + "label": "Follow free area top border", + "description": "", + "group": "Position", + "extraInformation": [], + "hidden": false, + "name": "FollowFreeAreaTop" + }, + { + "value": "0", + "type": "Number", + "label": "Follow free area bottom border", + "description": "", + "group": "Position", + "extraInformation": [], + "hidden": false, + "name": "FollowFreeAreaBottom" + }, + { + "value": "0", + "type": "Number", + "label": "Camera offset X", + "description": "", + "group": "Position", + "extraInformation": [], + "hidden": false, + "name": "CameraOffsetX" + }, + { + "value": "0", + "type": "Number", + "label": "Camera offset Y", + "description": "", + "group": "Position", + "extraInformation": [], + "hidden": false, + "name": "CameraOffsetY" + }, + { + "value": "0", + "type": "Number", + "label": "Camera delay (in seconds)", + "description": "", + "group": "Timing", + "extraInformation": [], + "hidden": false, + "name": "CameraDelay" + }, + { + "value": "0", + "type": "Number", + "label": "Forcast time (in seconds)", + "description": "", + "group": "Timing", + "extraInformation": [], + "hidden": false, + "name": "ForecastTime" + }, + { + "value": "0", + "type": "Number", + "label": "Forecast history duration (in second)", + "description": "", + "group": "Timing", + "extraInformation": [], + "hidden": false, + "name": "ForecastHistoryDuration" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "LogLeftwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "LogRightwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "LogDownwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "LogUpwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "DelayedCenterX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "DelayedCenterY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryMeanX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryMeanY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryVarianceX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryCovariance" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryLinearA" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryLinearB" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastedX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastedY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ProjectedNewestX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ProjectedNewestY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ProjectedOldestX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ProjectedOldestY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryVarianceY" + }, + { + "value": "", + "type": "Number", + "label": "Index (local variable)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Index" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CameraDelayCatchUpSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CameraExtraDelay" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "WaitingSpeedXMax" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "WaitingSpeedYMax" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "WaitingEnd" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CameraDelayCatchUpDuration" + }, + { + "value": "9000", + "type": "Number", + "label": "Leftward maximum speed (in pixels per second)", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "hidden": false, + "name": "LeftwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "label": "Rightward maximum speed (in pixels per second)", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "hidden": false, + "name": "RightwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "label": "Upward maximum speed (in pixels per second)", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "hidden": false, + "name": "UpwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "label": "Downward maximum speed (in pixels per second)", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "hidden": false, + "name": "DownwardSpeedMax" + }, + { + "value": "", + "type": "Number", + "label": "OldX (local variable)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "OldX" + }, + { + "value": "", + "type": "Number", + "label": "OldY (local variable)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "OldY" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "IsCalledManually" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly scroll to follow a character and stabilize the camera when jumping.", + "fullName": "Smooth platformer camera", + "name": "SmoothPlatformerCamera", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::IsJumping" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorFollowFreeAreaTop()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorFollowFreeAreaBottom()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorUpwardSpeed()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorDownwardSpeed()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorUpwardSpeedMax()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorDownwardSpeedMax()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "PlatformBehavior::IsJumping" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + }, + { + "type": { + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirFollowFreeAreaTop()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirFollowFreeAreaBottom()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirUpwardSpeed()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirDownwardSpeed()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirUpwardSpeedMax()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirDownwardSpeedMax()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothPlatformerCamera", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Platformer character behavior", + "description": "", + "group": "", + "extraInformation": [ + "PlatformBehavior::PlatformerObjectBehavior" + ], + "hidden": false, + "name": "PlatformerCharacter" + }, + { + "value": "", + "type": "Behavior", + "label": "Smooth camera behavior", + "description": "", + "group": "", + "extraInformation": [ + "SmoothCamera::SmoothCamera" + ], + "hidden": false, + "name": "SmoothCamera" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "JumpOriginY" + }, + { + "value": "0", + "type": "Number", + "label": "Follow free area top in the air", + "description": "", + "group": "Position", + "extraInformation": [], + "hidden": false, + "name": "AirFollowFreeAreaTop" + }, + { + "value": "0", + "type": "Number", + "label": "Follow free area bottom in the air", + "description": "", + "group": "Position", + "extraInformation": [], + "hidden": false, + "name": "AirFollowFreeAreaBottom" + }, + { + "value": "0", + "type": "Number", + "label": "Follow free area top on the floor", + "description": "", + "group": "Position", + "extraInformation": [], + "hidden": false, + "name": "FloorFollowFreeAreaTop" + }, + { + "value": "0", + "type": "Number", + "label": "Follow free area bottom on the floor", + "description": "", + "group": "Position", + "extraInformation": [], + "hidden": false, + "name": "FloorFollowFreeAreaBottom" + }, + { + "value": "0.95", + "type": "Number", + "label": "Upward speed in the air (in ratio persecond)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "hidden": false, + "name": "AirUpwardSpeed" + }, + { + "value": "0.95", + "type": "Number", + "label": "Downward speed in the air (in ratio persecond)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "hidden": false, + "name": "AirDownwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Upward speed on the floor (in ratio persecond)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "hidden": false, + "name": "FloorUpwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Downward speed on the floor (in ratio persecond)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "hidden": false, + "name": "FloorDownwardSpeed" + }, + { + "value": "9000", + "type": "Number", + "label": "Upward maximum speed in the air (in pixels per second)", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "hidden": false, + "name": "AirUpwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "label": "Downward maximum speed in the air (in pixels per second)", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "hidden": false, + "name": "AirDownwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "label": "Upward maximum speed on the floor (in pixels per second)", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "hidden": false, + "name": "FloorUpwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "label": "Downward maximum speed on the floor (in pixels per second)", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "hidden": false, + "name": "FloorDownwardSpeedMax" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "westboy, daliyoucefmedakram@gmail.com, @bouh", + "category": "User interface", + "extensionNamespace": "", + "fullName": "Auto typing animation for text (\"typewriter\" effect)", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLXR5cGV3cml0ZXIiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMjAgMTNIMTZDMTYgMTQuMSAxNS4xIDE1IDE0IDE1SDEwQzguOSAxNSA4IDE0LjEgOCAxM0g0TDIgMThWMjBDMiAyMS4xIDIuOSAyMiA0IDIySDIwQzIxLjEgMjIgMjIgMjEuMSAyMiAyMFYxOE02IDIwQzUuMTEgMjAgNC42NiAxOC45MiA1LjI5IDE4LjI5QzUuOTIgMTcuNjYgNyAxOC4xMSA3IDE5QzcgMTkuNTUgNi41NSAyMCA2IDIwTTEwIDIwQzkuMTEgMjAgOC42NiAxOC45MiA5LjI5IDE4LjI5QzkuOTIgMTcuNjYgMTEgMTguMTEgMTEgMTlDMTEgMTkuNTUgMTAuNTUgMjAgMTAgMjBNMTQgMjBDMTMuMTEgMjAgMTIuNjYgMTguOTIgMTMuMjkgMTguMjlDMTMuOTIgMTcuNjYgMTUgMTguMTEgMTUgMTlDMTUgMTkuNTUgMTQuNTUgMjAgMTQgMjBNMTggMjBDMTcuMTEgMjAgMTYuNjYgMTguOTIgMTcuMjkgMTguMjlDMTcuOTIgMTcuNjYgMTkgMTguMTEgMTkgMTlDMTkgMTkuNTUgMTguNTUgMjAgMTggMjBNMTggMTBWM0g2VjEwSDNWMTJIMjFWMTBNOCA1SDE2VjZIOE04IDdIMTRWOEg4IiAvPjwvc3ZnPg==", + "name": "AutoTyping", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/typewriter.svg", + "shortDescription": "Animate text to simulate it being written one character at at time (a \"typewriter\" effect).", + "version": "1.1.0", + "description": "Animate text to simulate it being written one character at at time (a \"typewriter\" effect), with a customizable time between each character. Useful for dialogue scenes or visual novels.\n\nHow to use:\n- Add the behavior to a Text object (BBText, Bitmap Text object) and choose the interval between characters.\n\nTips:\n- Change the typing speed with the \"Change interval\" action.\n- Pause the typing and resume it at any time.\n- Use the \"Skip to end of text\" action to give users a way to skip text they don't want to read \n- If the text changes, the automatic typing starts again from the beginning with the new text.\n- Use a condition to check if the typing finished.\n- Use a condition to check if a new text character was added. This is useful to trigger audio effects.\n- Use the \"CurrentCharacter\" expression to know when a specific character was displayed.\n", + "origin": { + "identifier": "AutoTyping", + "name": "gdevelop-extension-store" + }, + "tags": [ + "text", + "bbtext", + "dialogue", + "visual novel", + "autotyping", + "bitmap" + ], + "authorIds": [ + "2OwwM8ToR9dx9RJ2sAKTcrLmCB92", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Animate text to simulate it being written one character at at time (a \"typewriter\" effect).", + "fullName": "Auto typing text", + "name": "Text_AutoTyping", + "objectType": "TextObject::Text", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Initialize object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjetTxt" + }, + "parameters": [ + "Object", + "__AutoTyping.txt_buffer", + "=", + "Object.String()" + ] + }, + { + "type": { + "value": "AutoTyping::Text_AutoTyping::StartAtBeginning" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TextObject::Text", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::Text_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reset trigger", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "AutoTyping::Text_AutoTyping::SetPropertyCharacterJustAdded" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update text based on timer", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + "<=", + "StrLength(Object.VariableString(__AutoTyping.txt_buffer))" + ] + } + ], + "actions": [ + { + "type": { + "value": "TextObject::String" + }, + "parameters": [ + "Object", + "=", + "SubStr(Object.VariableString(__AutoTyping.txt_buffer), 0, Object.Variable(__AutoTyping.write_index))" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__AutoTyping.WriteTimer\"", + "Object.Behavior::PropertyInterval()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__AutoTyping.WriteTimer\"" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + "+", + "1" + ] + }, + { + "type": { + "value": "AutoTyping::Text_AutoTyping::SetPropertyCharacterJustAdded" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "AutoTyping::Text_AutoTyping::SetPropertyCurrentCharacter" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "StrAt(Object.VariableString(__AutoTyping.txt_buffer), Object.Variable(__AutoTyping.write_index))" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + ">", + "StrLength(Object.VariableString(__AutoTyping.txt_buffer))" + ] + } + ], + "actions": [ + { + "type": { + "value": "RemoveTimer" + }, + "parameters": [ + "", + "\"__AutoTyping.WriteTimer\"" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TextObject::String" + }, + "parameters": [ + "Object", + "!=", + "Object.VariableString(__AutoTyping.txt_buffer)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjetTxt" + }, + "parameters": [ + "Object", + "__AutoTyping.txt_buffer", + "=", + "Object.String()" + ] + }, + { + "type": { + "value": "TextObject::String" + }, + "parameters": [ + "Object", + "=", + "\"\"" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__AutoTyping.WriteTimer\"" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TextObject::Text", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::Text_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Execute actions when the auto typing text ends.", + "fullName": "Auto typing finished", + "functionType": "Condition", + "name": "TypingFinished", + "sentence": "When _PARAM0_ finished auto typing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + ">=", + "StrLength(Object.VariableString(__AutoTyping.txt_buffer))" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TextObject::Text", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::Text_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Detect if the auto typing is on pause.", + "fullName": "Typing on pause", + "functionType": "Condition", + "name": "TypingPause", + "sentence": "_PARAM0_ is on pause", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectTimerPaused" + }, + "parameters": [ + "Object", + "\"__AutoTyping.WriteTimer\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TextObject::Text", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::Text_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Detect when a new text character is displayed. Useful for triggering sound effects.", + "fullName": "New text character was just displayed", + "functionType": "Condition", + "name": "IsCharacterJustAdded", + "sentence": "Text character was just displayed on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "AutoTyping::Text_AutoTyping::PropertyCharacterJustAdded" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TextObject::Text", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::Text_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Pause animation auto typing.", + "fullName": "Pause auto typing", + "functionType": "Action", + "name": "Pause", + "sentence": "Pause auto typing of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PauseObjectTimer" + }, + "parameters": [ + "Object", + "\"__AutoTyping.WriteTimer\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TextObject::Text", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::Text_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Resume auto typing after pause.", + "fullName": "Resume after pause", + "functionType": "Action", + "name": "Resume", + "sentence": "Resume auto typing of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "UnPauseObjectTimer" + }, + "parameters": [ + "Object", + "\"__AutoTyping.WriteTimer\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TextObject::Text", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::Text_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Skip to the end of the text.", + "fullName": "Skip to the end of the text", + "functionType": "Action", + "name": "SkipToEnd", + "sentence": "Skip to the end of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + "=", + "StrLength(Object.VariableString(__AutoTyping.txt_buffer))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TextObject::Text", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::Text_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Jump to a specific position in the text. Positions start at \"0\" and increase by one for every character.", + "fullName": "Jump to a specific position in the text", + "functionType": "Action", + "name": "JumpToPosition", + "sentence": "Jump to position _PARAM2_ in the text _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + "=", + "GetArgumentAsNumber(\"CharacterIndex\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TextObject::Text", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::Text_AutoTyping", + "type": "behavior" + }, + { + "description": "Character position", + "name": "CharacterIndex", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Start at the beginning of text.", + "fullName": "Start at the beginning of the text", + "functionType": "Action", + "name": "StartAtBeginning", + "sentence": "Start at the beginning of _PARAM0_", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Start at beginning", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + "=", + "0" + ] + }, + { + "type": { + "value": "TextObject::String" + }, + "parameters": [ + "Object", + "=", + "\"\"" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__AutoTyping.WriteTimer\"" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TextObject::Text", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::Text_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the time between characters being typed. ", + "fullName": "Time between characters", + "functionType": "Action", + "name": "ChangeInterval", + "sentence": "Change the interval between characters of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AutoTyping::Text_AutoTyping::SetPropertyInterval" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"interval\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TextObject::Text", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::Text_AutoTyping", + "type": "behavior" + }, + { + "description": "Interval time", + "name": "interval", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the text character that was last displayed.", + "fullName": "Current text character", + "functionType": "StringExpression", + "name": "CurrentCharacter", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyCurrentCharacter()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TextObject::Text", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::Text_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the index of the text character that was last displayed.", + "fullName": "Index of current text character", + "functionType": "Expression", + "name": "CurrentCharacterIndex", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Variable(__AutoTyping.write_index)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TextObject::Text", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::Text_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0.05", + "type": "Number", + "label": "Interval between characters in seconds.", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "Interval" + }, + { + "value": "", + "type": "Boolean", + "label": "Detect if a new text character was just displayed", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CharacterJustAdded" + }, + { + "value": "", + "type": "String", + "label": "Text character that was most recently displayed", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CurrentCharacter" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Animate text to simulate it being written one character at at time (a \"typewriter\" effect).", + "fullName": "Auto typing text", + "name": "BitmapText_AutoTyping", + "objectType": "BitmapText::BitmapTextObject", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Initialize object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjetTxt" + }, + "parameters": [ + "Object", + "__AutoTyping.txt_buffer", + "=", + "Object.Text()" + ] + }, + { + "type": { + "value": "AutoTyping::BitmapText_AutoTyping::StartAtBeginning" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BitmapText::BitmapTextObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BitmapText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reset trigger", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "AutoTyping::BitmapText_AutoTyping::SetPropertyCharacterJustAdded" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update text based on timer", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + "<=", + "StrLength(Object.VariableString(__AutoTyping.txt_buffer))" + ] + } + ], + "actions": [ + { + "type": { + "value": "BitmapText::BitmapTextObject::SetText" + }, + "parameters": [ + "Object", + "=", + "SubStr(Object.VariableString(__AutoTyping.txt_buffer), 0, Object.Variable(__AutoTyping.write_index))" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__AutoTyping.WriteTimer\"", + "Object.Behavior::PropertyInterval()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__AutoTyping.WriteTimer\"" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + "+", + "1" + ] + }, + { + "type": { + "value": "AutoTyping::BitmapText_AutoTyping::SetPropertyCharacterJustAdded" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "AutoTyping::BitmapText_AutoTyping::SetPropertyCurrentCharacter" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "StrAt(Object.VariableString(__AutoTyping.txt_buffer), Object.Variable(__AutoTyping.write_index))" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + ">", + "StrLength(Object.VariableString(__AutoTyping.txt_buffer))" + ] + } + ], + "actions": [ + { + "type": { + "value": "RemoveTimer" + }, + "parameters": [ + "", + "\"__AutoTyping.WriteTimer\"" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BitmapText::BitmapTextObject::Text" + }, + "parameters": [ + "Object", + "!=", + "Object.VariableString(__AutoTyping.txt_buffer)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjetTxt" + }, + "parameters": [ + "Object", + "__AutoTyping.txt_buffer", + "=", + "Object.Text()" + ] + }, + { + "type": { + "value": "BitmapText::BitmapTextObject::SetText" + }, + "parameters": [ + "Object", + "=", + "\"\"" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__AutoTyping.WriteTimer\"" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BitmapText::BitmapTextObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BitmapText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Execute actions when the auto typing text ends.", + "fullName": "Auto typing finished", + "functionType": "Condition", + "name": "TypingFinished", + "sentence": "When _PARAM0_ finished auto typing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + ">=", + "StrLength(Object.VariableString(__AutoTyping.txt_buffer))" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BitmapText::BitmapTextObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BitmapText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Detect if the auto typing is on pause.", + "fullName": "Typing on pause", + "functionType": "Condition", + "name": "TypingPause", + "sentence": "_PARAM0_ is on pause", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectTimerPaused" + }, + "parameters": [ + "Object", + "\"__AutoTyping.WriteTimer\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BitmapText::BitmapTextObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BitmapText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Detect when a new text character is displayed. Useful for triggering sound effects.", + "fullName": "New text character was just displayed", + "functionType": "Condition", + "name": "IsCharacterJustAdded", + "sentence": "Text character was just displayed on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "AutoTyping::BitmapText_AutoTyping::PropertyCharacterJustAdded" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BitmapText::BitmapTextObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BitmapText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Pause animation auto typing.", + "fullName": "Pause auto typing", + "functionType": "Action", + "name": "Pause", + "sentence": "Pause auto typing of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PauseObjectTimer" + }, + "parameters": [ + "Object", + "\"__AutoTyping.WriteTimer\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BitmapText::BitmapTextObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BitmapText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Resume auto typing after pause.", + "fullName": "Resume after pause", + "functionType": "Action", + "name": "Resume", + "sentence": "Resume auto typing of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "UnPauseObjectTimer" + }, + "parameters": [ + "Object", + "\"__AutoTyping.WriteTimer\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BitmapText::BitmapTextObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BitmapText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Skip to the end of the text.", + "fullName": "Skip to the end of the text", + "functionType": "Action", + "name": "SkipToEnd", + "sentence": "Skip to the end of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + "=", + "StrLength(Object.VariableString(__AutoTyping.txt_buffer))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BitmapText::BitmapTextObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BitmapText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Jump to a specific position in the text. Positions start at \"0\" and increase by one for every character.", + "fullName": "Jump to a specific position in the text", + "functionType": "Action", + "name": "JumpToPosition", + "sentence": "Jump to position _PARAM2_ in the text _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + "=", + "GetArgumentAsNumber(\"CharacterIndex\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BitmapText::BitmapTextObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BitmapText_AutoTyping", + "type": "behavior" + }, + { + "description": "Character position", + "name": "CharacterIndex", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Start at the beginning of text.", + "fullName": "Start at the beginning of the text", + "functionType": "Action", + "name": "StartAtBeginning", + "sentence": "Start at the beginning of _PARAM0_", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Start at beginning", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + "=", + "0" + ] + }, + { + "type": { + "value": "BitmapText::BitmapTextObject::SetText" + }, + "parameters": [ + "Object", + "=", + "\"\"" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__AutoTyping.WriteTimer\"" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BitmapText::BitmapTextObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BitmapText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the time between characters being typed. ", + "fullName": "Time between characters", + "functionType": "Action", + "name": "ChangeInterval", + "sentence": "Set the interval between characters of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AutoTyping::BitmapText_AutoTyping::SetPropertyInterval" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"interval\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BitmapText::BitmapTextObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BitmapText_AutoTyping", + "type": "behavior" + }, + { + "description": "Interval tme", + "name": "interval", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the text character that was last displayed.", + "fullName": "Current character", + "functionType": "StringExpression", + "name": "CurrentCharacter", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyCurrentCharacter()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BitmapText::BitmapTextObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BitmapText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the index of the text character that was last displayed.", + "fullName": "Index of current text character", + "functionType": "Expression", + "name": "CurrentCharacterIndex", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Variable(__AutoTyping.write_index)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BitmapText::BitmapTextObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BitmapText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0.05", + "type": "Number", + "label": "Interval between characters in seconds.", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "Interval" + }, + { + "value": "", + "type": "Boolean", + "label": "Detect if a new text character was just displayed", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CharacterJustAdded" + }, + { + "value": "", + "type": "String", + "label": "Text character that was most recently displayed", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CurrentCharacter" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Animate text to simulate it being written one character at at time (a \"typewriter\" effect).", + "fullName": "Auto typing text", + "name": "BBText_AutoTyping", + "objectType": "BBText::BBText", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Initialize object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjetTxt" + }, + "parameters": [ + "Object", + "__AutoTyping.txt_buffer", + "=", + "Object.GetBBText()" + ] + }, + { + "type": { + "value": "AutoTyping::BBText_AutoTyping::StartAtBeginning" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BBText::BBText", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BBText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reset trigger", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "AutoTyping::BBText_AutoTyping::SetPropertyCharacterJustAdded" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update text based on timer", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + "<=", + "StrLength(Object.VariableString(__AutoTyping.txt_buffer))" + ] + } + ], + "actions": [ + { + "type": { + "value": "BBText::SetBBText" + }, + "parameters": [ + "Object", + "=", + "SubStr(Object.VariableString(__AutoTyping.txt_buffer), 0, Object.Variable(__AutoTyping.write_index))" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__AutoTyping.WriteTimer\"", + "Object.Behavior::PropertyInterval()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__AutoTyping.WriteTimer\"" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + "+", + "1" + ] + }, + { + "type": { + "value": "AutoTyping::BBText_AutoTyping::SetPropertyCharacterJustAdded" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "AutoTyping::BBText_AutoTyping::SetPropertyCurrentCharacter" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "StrAt(Object.VariableString(__AutoTyping.txt_buffer), Object.Variable(__AutoTyping.write_index))" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + ">", + "StrLength(Object.VariableString(__AutoTyping.txt_buffer))" + ] + } + ], + "actions": [ + { + "type": { + "value": "RemoveTimer" + }, + "parameters": [ + "", + "\"__AutoTyping.WriteTimer\"" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BBText::IsBBText" + }, + "parameters": [ + "Object", + "!=", + "Object.VariableString(__AutoTyping.txt_buffer)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjetTxt" + }, + "parameters": [ + "Object", + "__AutoTyping.txt_buffer", + "=", + "Object.GetBBText()" + ] + }, + { + "type": { + "value": "BBText::SetBBText" + }, + "parameters": [ + "Object", + "=", + "\"\"" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__AutoTyping.WriteTimer\"" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BBText::BBText", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BBText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Execute actions when the auto typing text ends.", + "fullName": "Auto typing finished", + "functionType": "Condition", + "name": "TypingFinished", + "sentence": "When _PARAM0_ finished auto typing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + ">=", + "StrLength(Object.VariableString(__AutoTyping.txt_buffer))" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BBText::BBText", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BBText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Detect if the auto typing is on pause.", + "fullName": "Typing on pause", + "functionType": "Condition", + "name": "TypingPause", + "sentence": "_PARAM0_ is on pause", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectTimerPaused" + }, + "parameters": [ + "Object", + "\"__AutoTyping.WriteTimer\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BBText::BBText", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BBText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Detect when a new text character is displayed. Useful for triggering sound effects.", + "fullName": "New text character was just displayed", + "functionType": "Condition", + "name": "IsCharacterJustAdded", + "sentence": "Text character was just displayed on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "AutoTyping::BBText_AutoTyping::PropertyCharacterJustAdded" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BBText::BBText", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BBText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Pause animation auto typing.", + "fullName": "Pause auto typing", + "functionType": "Action", + "name": "Pause", + "sentence": "Pause auto typing of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PauseObjectTimer" + }, + "parameters": [ + "Object", + "\"__AutoTyping.WriteTimer\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BBText::BBText", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BBText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Resume auto typing after pause.", + "fullName": "Resume after pause", + "functionType": "Action", + "name": "Resume", + "sentence": "Resume auto typing of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "UnPauseObjectTimer" + }, + "parameters": [ + "Object", + "\"__AutoTyping.WriteTimer\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BBText::BBText", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BBText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Skip to the end of the text.", + "fullName": "Skip to the end of the text", + "functionType": "Action", + "name": "SkipToEnd", + "sentence": "Skip to the end of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + "=", + "StrLength(Object.VariableString(__AutoTyping.txt_buffer))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BBText::BBText", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BBText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Jump to a specific position in the text. Positions start at \"0\" and increase by one for every character.", + "fullName": "Jump to a specific position in the text", + "functionType": "Action", + "name": "JumpToPosition", + "sentence": "Jump to position _PARAM2_ in the text _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + "=", + "GetArgumentAsNumber(\"CharacterIndex\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BBText::BBText", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BBText_AutoTyping", + "type": "behavior" + }, + { + "description": "Character position", + "name": "CharacterIndex", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Start at the beginning of text.", + "fullName": "Start at the beginning of the text", + "functionType": "Action", + "name": "StartAtBeginning", + "sentence": "Start at the beginning of _PARAM0_", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Start at beginning", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__AutoTyping.write_index", + "=", + "0" + ] + }, + { + "type": { + "value": "BBText::SetBBText" + }, + "parameters": [ + "Object", + "=", + "\"\"" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__AutoTyping.WriteTimer\"" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BBText::BBText", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BBText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the time between characters being typed. ", + "fullName": "Time between characters", + "functionType": "Action", + "name": "ChangeInterval", + "sentence": "Set the interval between characters of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AutoTyping::BBText_AutoTyping::SetPropertyInterval" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"interval\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BBText::BBText", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BBText_AutoTyping", + "type": "behavior" + }, + { + "description": "Interval tme", + "name": "interval", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the text character that was last displayed.", + "fullName": "Current character", + "functionType": "StringExpression", + "name": "CurrentCharacter", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyCurrentCharacter()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BBText::BBText", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BBText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the index of the text character that was last displayed.", + "fullName": "Index of current text character", + "functionType": "Expression", + "name": "CurrentCharacterIndex", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Variable(__AutoTyping.write_index)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "BBText::BBText", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "AutoTyping::BBText_AutoTyping", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0.05", + "type": "Number", + "label": "Interval between characters in seconds.", + "description": "", + "group": "", + "extraInformation": [], + "hidden": false, + "name": "Interval" + }, + { + "value": "", + "type": "Boolean", + "label": "Detect if a new text character was just displayed", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CharacterJustAdded" + }, + { + "value": "", + "type": "String", + "label": "Text character that was most recently displayed", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CurrentCharacter" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + } + ], + "externalLayouts": [], + "externalSourceFiles": [] +} \ No newline at end of file diff --git a/examples/top-down-rpg/assets/8BitOperatorPlus8Regular_Edited.fnt b/examples/top-down-rpg/assets/8BitOperatorPlus8Regular_Edited.fnt new file mode 100644 index 000000000..def784a82 --- /dev/null +++ b/examples/top-down-rpg/assets/8BitOperatorPlus8Regular_Edited.fnt @@ -0,0 +1,95 @@ +info face="8-bitOperatorPlus8-Regular" size=23 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=10,10,10,10 spacing=5,5 +common lineHeight=23 base=14 scaleW=392 scaleH=387 pages=1 packed=0 +page id=0 file="8BitOperatorPlus8Regular_Edited.png" +chars count=91 +char id=32 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15 +char id=33 x=364 y=111 width=26 height=38 xoffset=-10 yoffset=-11.98 xadvance=6 page=0 chnl=15 +char id=34 x=288 y=152 width=34 height=30 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=35 x=52 y=0 width=36 height=36 xoffset=-10 yoffset=-9.98 xadvance=16 page=0 chnl=15 +char id=36 x=210 y=86 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=37 x=0 y=339 width=36 height=36 xoffset=-10 yoffset=-9.98 xadvance=16 page=0 chnl=15 +char id=38 x=210 y=129 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=39 x=364 y=76 width=28 height=30 xoffset=-10 yoffset=-11.98 xadvance=8 page=0 chnl=15 +char id=40 x=327 y=203 width=30 height=38 xoffset=-10 yoffset=-11.98 xadvance=10 page=0 chnl=15 +char id=41 x=327 y=246 width=30 height=38 xoffset=-10 yoffset=-11.98 xadvance=10 page=0 chnl=15 +char id=42 x=0 y=210 width=38 height=34 xoffset=-10 yoffset=-9.98 xadvance=18 page=0 chnl=15 +char id=43 x=288 y=78 width=34 height=34 xoffset=-10 yoffset=-9.98 xadvance=14 page=0 chnl=15 +char id=44 x=364 y=41 width=28 height=30 xoffset=-10 yoffset=-1.99 xadvance=8 page=0 chnl=15 +char id=45 x=327 y=0 width=32 height=26 xoffset=-10 yoffset=-5.99 xadvance=12 page=0 chnl=15 +char id=46 x=364 y=236 width=26 height=26 xoffset=-10 yoffset=0 xadvance=6 page=0 chnl=15 +char id=47 x=288 y=222 width=32 height=40 xoffset=-10 yoffset=-11.98 xadvance=12 page=0 chnl=15 +char id=48 x=52 y=86 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=49 x=327 y=31 width=30 height=38 xoffset=-10 yoffset=-11.98 xadvance=10 page=0 chnl=15 +char id=50 x=52 y=129 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=51 x=52 y=172 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=52 x=52 y=215 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=53 x=52 y=258 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=54 x=52 y=301 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=55 x=52 y=344 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=56 x=93 y=0 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=57 x=93 y=43 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=58 x=364 y=197 width=26 height=34 xoffset=-10 yoffset=-7.98 xadvance=6 page=0 chnl=15 +char id=59 x=364 y=0 width=28 height=36 xoffset=-10 yoffset=-7.98 xadvance=8 page=0 chnl=15 +char id=61 x=288 y=117 width=34 height=30 xoffset=-10 yoffset=-7.98 xadvance=14 page=0 chnl=15 +char id=63 x=210 y=43 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=64 x=0 y=294 width=36 height=40 xoffset=-10 yoffset=-11.98 xadvance=16 page=0 chnl=15 +char id=65 x=93 y=258 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=66 x=93 y=301 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=67 x=93 y=344 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=68 x=132 y=0 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=69 x=132 y=43 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=70 x=132 y=86 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=71 x=132 y=129 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=72 x=132 y=172 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=73 x=327 y=160 width=30 height=38 xoffset=-10 yoffset=-11.98 xadvance=10 page=0 chnl=15 +char id=74 x=132 y=215 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=75 x=132 y=258 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=76 x=132 y=301 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=77 x=0 y=46 width=38 height=38 xoffset=-10 yoffset=-11.98 xadvance=18 page=0 chnl=15 +char id=78 x=132 y=344 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=79 x=171 y=0 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=80 x=171 y=43 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=81 x=0 y=249 width=36 height=40 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=82 x=171 y=86 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=83 x=171 y=129 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=84 x=171 y=172 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=85 x=171 y=215 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=86 x=171 y=258 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=87 x=0 y=89 width=38 height=38 xoffset=-10 yoffset=-11.98 xadvance=18 page=0 chnl=15 +char id=88 x=171 y=301 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=89 x=171 y=344 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=90 x=210 y=0 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=91 x=327 y=289 width=30 height=38 xoffset=-10 yoffset=-11.98 xadvance=10 page=0 chnl=15 +char id=93 x=327 y=332 width=30 height=38 xoffset=-10 yoffset=-11.98 xadvance=10 page=0 chnl=15 +char id=94 x=288 y=187 width=34 height=30 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=95 x=288 y=353 width=32 height=26 xoffset=-12 yoffset=2 xadvance=8 page=0 chnl=15 +char id=97 x=249 y=41 width=34 height=34 xoffset=-10 yoffset=-7.98 xadvance=14 page=0 chnl=15 +char id=98 x=93 y=86 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=99 x=249 y=80 width=34 height=34 xoffset=-10 yoffset=-7.98 xadvance=14 page=0 chnl=15 +char id=100 x=93 y=129 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=101 x=249 y=119 width=34 height=34 xoffset=-10 yoffset=-7.98 xadvance=14 page=0 chnl=15 +char id=102 x=288 y=267 width=32 height=38 xoffset=-10 yoffset=-11.98 xadvance=12 page=0 chnl=15 +char id=103 x=210 y=258 width=34 height=36 xoffset=-10 yoffset=-7.98 xadvance=14 page=0 chnl=15 +char id=104 x=93 y=172 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=105 x=327 y=74 width=30 height=38 xoffset=-10 yoffset=-11.98 xadvance=10 page=0 chnl=15 +char id=106 x=52 y=41 width=34 height=40 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=107 x=93 y=215 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=108 x=327 y=117 width=30 height=38 xoffset=-10 yoffset=-11.98 xadvance=10 page=0 chnl=15 +char id=109 x=0 y=132 width=38 height=34 xoffset=-10 yoffset=-7.98 xadvance=18 page=0 chnl=15 +char id=110 x=249 y=158 width=34 height=34 xoffset=-10 yoffset=-7.98 xadvance=14 page=0 chnl=15 +char id=111 x=249 y=197 width=34 height=34 xoffset=-10 yoffset=-7.98 xadvance=14 page=0 chnl=15 +char id=112 x=210 y=299 width=34 height=36 xoffset=-10 yoffset=-7.98 xadvance=14 page=0 chnl=15 +char id=113 x=210 y=340 width=34 height=36 xoffset=-10 yoffset=-7.98 xadvance=14 page=0 chnl=15 +char id=114 x=249 y=236 width=34 height=34 xoffset=-10 yoffset=-7.98 xadvance=14 page=0 chnl=15 +char id=115 x=249 y=275 width=34 height=34 xoffset=-10 yoffset=-7.98 xadvance=14 page=0 chnl=15 +char id=116 x=288 y=310 width=32 height=38 xoffset=-10 yoffset=-11.98 xadvance=12 page=0 chnl=15 +char id=117 x=249 y=314 width=34 height=34 xoffset=-10 yoffset=-7.98 xadvance=14 page=0 chnl=15 +char id=118 x=249 y=353 width=34 height=34 xoffset=-10 yoffset=-7.98 xadvance=14 page=0 chnl=15 +char id=119 x=0 y=171 width=38 height=34 xoffset=-10 yoffset=-7.98 xadvance=18 page=0 chnl=15 +char id=120 x=288 y=0 width=34 height=34 xoffset=-10 yoffset=-7.98 xadvance=14 page=0 chnl=15 +char id=121 x=249 y=0 width=34 height=36 xoffset=-10 yoffset=-7.98 xadvance=14 page=0 chnl=15 +char id=122 x=288 y=39 width=34 height=34 xoffset=-10 yoffset=-7.98 xadvance=14 page=0 chnl=15 +char id=123 x=210 y=172 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=124 x=364 y=154 width=26 height=38 xoffset=-10 yoffset=-11.98 xadvance=6 page=0 chnl=15 +char id=125 x=210 y=215 width=34 height=38 xoffset=-10 yoffset=-11.98 xadvance=14 page=0 chnl=15 +char id=8470 x=0 y=0 width=47 height=41 xoffset=-13 yoffset=-8 xadvance=22 page=0 chnl=15 diff --git a/examples/top-down-rpg/assets/8BitOperatorPlus8Regular_Edited.png b/examples/top-down-rpg/assets/8BitOperatorPlus8Regular_Edited.png new file mode 100644 index 0000000000000000000000000000000000000000..ec300c462571ad8c2f1f364a66e9442e5ccd4af9 GIT binary patch literal 4731 zcmZu#2T)Vny56Bk4kFbcy(Gwyrbb0N5(rHJ0TmFG>J=#>9YPlnLJ^EeQ;Z@3X(2}G zNICQ(gc_+L5aggj4vBz~_IA#>Z|2@NZ_Q*fd#~ARueHAaD{H4%TbUl=mEZ*c;E1^y z+7_4*S8jifMjEysR< zt(wM^u~lurlPBCSRy$peV7t{S7M~(C}9)BD5lcN*jmkydu^Dn6F z?c&%2jMpAt-H{>JOuzQrG0spsw&18p+)*=ZT3&<6m-N=wQmVADv-H*r$Lycu`Xhk- z`2~U1VkV!>7X)>yT*!Wj5a6)1`)xmzGRY8wXB2)^&WCP0eR5_MBy#G0)}v-qC9odeLKL5|Pptw0`-rwXQ!|PNg;WzgFsU1zI1R zax4;1OSTtGNkPPs=k$E?SHhcKUm6v=jn5y~k0nG!sULG2jIyLmn)uZzv^yu<==4s0 z+e{%fT@xIuj(M#P1o#ed<=7pvu~T`D>P)Z7=0ewRA!?n33-{`)2D8SUF3sC|>9q?U z1rCerb7yLlb!&fICj&9NnOy{=`!FS!fuB9s%ace~1%achasdBd zTMT4#bJP$1C2MUc0Mu(#b@&9B{%Gb&im3Y|=h4{&o}J z`e0hQ&?Pn|YG-faZgfW3KmF)_Gx+UbTu-7C*|?M!;XFnNrEgc3#~$oqm>O49m8iQr zrv0R4aT8hg+sovX8NM$)g&%pE*U%9eM@$9Db0+mAUN zFYp?Jwq;kYhkU$!Ug%7r8XJ7CU%#iNo*r^ZlQ&e9+W3_*>nG&yLljHZBt1dDmyI-| zkclwr7x|K64Nbt~43Eu5anIVPkz$LJfv+Vo>Q-oCLo$A8YW1FJK>}8DNOtN|L;j#N zdVlz$K>Y5Z%|pY$KVl}bw$pXYYbQ?RP?IWoX$dT{!OAS_GnOIzx**J(O;8uC|Y*nGv3cqCtXn0 zc2Hw6Ct3OK-W3^RD@T(&&ZS2FZ*uShD8zxzfT4Z5OcFCr1*Qv?=RWNvA4hcdhG-4K z;yg4f1wKpI2_T7TDcQr|syey;Kg?$-`OX2K&)Ea1ClC5<;tEnxOkNPIq z1F0=;KGe-=2~Pg@>Dq}%g8GjJJaWS!c@R~46c}1&1PM0izDo

NoRPHSg?)$5Z!U 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 literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/ACgarRight1.png b/examples/top-down-rpg/assets/ACgarRight1.png new file mode 100644 index 0000000000000000000000000000000000000000..473d08d6e3927d2d01d305937f82a803273467f3 GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D%z4Lw~PLo9le z6C^SYbm%E4>HeKRVVSxA{6k+CN`QFxt*#3oKa5fR_Qzr;azD-4dpYm z?=1B(I2*R>7tj0k`Px$7D+@wR5*>*k}+$-P!xr~#`*(<;PM(;ga{pKhdPLK=;9#mt_8uZICkvd=p?qY zQ0UZM90YOfkSU9xP$<+z3R&EW#6fbK#5{HFnI8AubI!e&1OFZ;@q($8e~9$6SO_m7 zU@GO;>J*_#?pm@Rzsd4FI`TAArwZL%+g4goy!+gg$Ww z#667lw<~YSfvJ=~e=Hs~iQRD|2RlK!duSz+`uP>Gy+b&OasyK-zg@Dy83HgaRsop2 u^tKHN`|qsKF4>XKr;oX~1<4D$18e}V$y^rehf~G?0000Px$E=fc|R5*>rl0QqsP!z>~M*RT7!{r(jp@M@I(McRip@VejpmY@kH|f~jN$k`r zI0}L|xR(qret;}yDOC^zvlJojBF~|`XObqG%>xhKyWDf`pLgKDF_jJ|5&akGJq#@` zA)rKby;-BYvY1N_o?hwS-CGeSO)i3Zvt~PW40(HPooFz!Rr0ELm!d>$CY=-wM$E0w zXNp|xxPVKSfPS8U5lQ2EcNTB~m|iFYe!jpD0S>%RZjLqqSZ-Yb@N#~bKf-T_6Ahe< zJX;yC)#Lbj3+&zcK#Az*_Ew=zN*&+&V8Te1770R literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/ACgarRight4.png b/examples/top-down-rpg/assets/ACgarRight4.png new file mode 100644 index 0000000000000000000000000000000000000000..e2a19f9a0628e139bccfeb3c0e48098b7c36a50b GIT binary patch literal 350 zcmV-k0iphhP)Px$7)eAyR5*>*k}*pIK@f$%ocaTV!)84c@dS%RL=g$LDKvfBKp?GUN#LSw-uGsffq$<;w%{t2{AKzWjl^dF zT&0p~twL#Q&1#NbUg_OF2*k;n=TWs*kx3nGE*E!*`(sJ5rMK5(qqdlBiu+@hw^wo@ zS4SS;(I%p2187KA*T+kM2f)H=2?*_gnE~qeU)(hJ0N6O~0x-O6*jM;XX`_~t(OV literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/ACharDown1.png b/examples/top-down-rpg/assets/ACharDown1.png new file mode 100644 index 0000000000000000000000000000000000000000..2dbe93e6eb833045586b8629791e28f53428a112 GIT binary patch literal 377 zcmV-<0fzpGP)Px$Gf6~2R5*>rl08VnKorM+(R6VWx<#-Er&AgP2MIVj6jyPOLP6*%P8}UOW-6`$ zp;8>&MWLe*93ny;3Jr*YS)`E7MI;XKj(nIn`lgrn^8dL19sGA``9a+<;wr#A3^SO_ zN8K>uy@TCK#p|nahD6VUo9n9u&}8b zG$Kx3mdWq)rRN8OM)YeB(3uw9D1u?DM(5^}#g%5M^-&kv?gPVC4e?as;OlLIaC`us z&yE0CJ3a>>=xr59HAq5~%PI#_06;iC^DxxZeWpqNDhVzeq5EO0-d*x2+kvk-J+1C+ zB(E@d9HZ^`v$7Yrh|Og0_B@1>JSLTa3~Y3HS82a}xC11?7BT?nZwvMF>3u-iOlI&6 XX!3Co2)DGP00000NkvXXu0mjf(3GRg literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/ACharDown2.png b/examples/top-down-rpg/assets/ACharDown2.png new file mode 100644 index 0000000000000000000000000000000000000000..0593358f1c7a3d515e6c5d9354f1c92bf3a4abe1 GIT binary patch literal 379 zcmV->0fhdEP)Px$HAzH4R5*>*lRrqqKop0+XgWCw-6B|oxTRS#lz^jP5eF9sDHhahQk*(EbP+n0 z;uaAqPVS=M;#3^s5{H5TQD_z^Wa}al2hEv(&F-7tz2o=2-`%}~e;-o1P*#+%NHFpJ zgeI{lD@wSzvtHQo=K4MXk<;Sp>T*WpzPyXv)O3arMv%EkY-)O8=XjW!E{-b4H-gaz z?r+|!1RTFDlHN~;oG$b#L2eGv9A(`Iz@T2DdHc!yQgx>FD+?O-6N7pQ^?8Paud$2T zbpUwn?*p*Xx&Xjy8yTnse{b)#jY0=e0|2$_F!6m!IPlsA*3`rv4+{a-)a2o;FJ?gi zer!8fM=b!(_cjv3!^^u|U}h3KHC3!n9z6g$HI>Hh8UUvY+t>$N!a?p|h(jV!{6gcS Z{0&uKXp~&GQ<(q&002ovPDHLkV1hN|qP_qC literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/ACharDown3.png b/examples/top-down-rpg/assets/ACharDown3.png new file mode 100644 index 0000000000000000000000000000000000000000..f07205e18a0426f08d8bf740bc0fefbab3100b9b GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D%zojhF}Lo9le z6C^SYbm%E4>Hd|U-)8PVf6)uahaDc?|G)DUAI*MzEp&GvPom@XHOtld7rwl-w!L86 z)OB`;4cXfM8#vEMn6&II?JZnn6K8#CsoK{i)SM;!|Ms?Gn>b55KCY~3cUNo@A zCIGo>a@g3|+J3yAv93{i!-dIH73+TIv!zMe&hd+%bn1YB@o$~OPX1wRS5I5SeE5D+ zmF?;}V;&IruBK{e00bIO&n71T!H(FprbG>8W@Z(E#7RG57&bRFHa0qLea&-t_Huv8 zhaWY89=Wfm-k)f8-Ea@vlDf@F76z$8Ho6Nc9IsxOs`%BW#a8_svupCHMY0jRM?N@B zud?HPx$K1oDDR5*>*lQBrcP!NW{XuEV1G8w5wNVc?#L&+q9U=gH~lUNYDNpy0|(6Lh~ zZjnNzle;LmbSfF@5{H5TQ80@XvWSaF985!#G}*oB-hcf6{qNp8`1c{i0a23tEW*@v zBb>-Vlq7%eU?;QV?af0(Bo`-_mGuP4etrvcO|38jeZB@di`Z6~gxvCCT49)iDdBRC4o61HdedklW*= zz-qCGvR?<_>S#AYKDoXJV0hULv8n3{i5c{iPXGq`8HVKm(5lL82lXK={)qt??tx)B iw5oDM+_0R)F8l(l_-p;ngWdW70000HprtF_K@dJSoiDSMpl%@U_t0fjo&$*L-+B z@D;ljY6@?9!qWPkXL_FPkxXl5X6D1cU$2)~Q}Xp;+XjW~v}qTUXXqS0Frk`dx8nQt z`ws~;OCQi#-2Q0NkGK0fKM8e-Pxzd{V~&_$ z`CUy_FjYHD{7-EWr?b#Au9|y}p6uIC`*dsy-TIoxMmNE?6UdX;b>;QOta)?abWfTP zaOlC=%gcK}PM36^B_W~rKXu03H>Vkjr)FK3WYe^?A!9WQJT zPf$F1F5r6yhkcia_y74~Z$8AkL`n4})|6~zSo}R9Hk~os78q;{p00i_>zopr0ETFs Ai~s-t literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/ACharLeft2.png b/examples/top-down-rpg/assets/ACharLeft2.png new file mode 100644 index 0000000000000000000000000000000000000000..124bb9b013ab52ee572010e61d6d01c2c7c28f3c GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D%zSv*}FLo9le z6C^%02+mYi()~MsLYuk&{6#Msi(Qs1{a@X_)9A&@laH^|yu9Yzwsv*dVu?d7Yi3G3 zkbTzmC`c{kBq!HUynD8c=_ruZ=&P1Gdhcp8$`A>Dt_lEbG{c} z->S%F-Vo`=e^mA3?Rw#-sv`OtPtPU?oSJ?708r%ym8&xvfgo|Ay7plw|FAi18x)G) z`Fbgx3R|Q1(*pQy_J9)^*8>r~@9I2Kg#?A01rv^S~5O4bD#1 z)mkf@fDU16pJM}}*p?gLR@~C6<$Ra3?SDipLoq8ev(nja5AXl^n*v+|gUcV8#mF(N YlZ_GHYqHprtF_K@dJSoiDSMpl%@U_t0fjo&$*L-+B z@D;ljY6@?9!qWPkXL_FPkxXl5X6D1cU$2)~Q}Xp;+XjW~v}qTUXXqS0Frk`dx8nQt z`ws~;OCQi#-2Q0NkGK0fKM8e-Pxzd{V~&_$ z`CUy_FjYHD{7-EWr?b#Au9|y}p6uIC`*dsy-TIoxMmNE?6UdX;b>(%S$z8ksvm1fn z;ejch5-SB+J3PGq|Nrpi(f> z1d9U=GJDe{=A6q(w{Yl@cU`jdzdv``4}B$F-s1*#yP_DP`*QZmPx$8%ab#R5*>*lfO&DKorM6X<7v5OkPAOL?`252XXIEx|XhjQ0QXEjukp)5*>v? z!O6WibQS3!2w4gZ2!-BK0{H`q#3@IPB%0N?y?gilb-aUrUq-sIgoytFgi>l4)mTEr z?QRqI74=upK}17_TMvP+8cyY8kP{T(HS%A z^a1D}>~RQ;76Ifq%>0G%rIWcdS_Fzb5lUu1Px#xJg7oR5*=eU>In?h%O)^E&U&#hBr^2qUb^4h)7HS_YQN#Yva~cyHN~*GlchRtM6@m(0L6g!*IyCTfUbsxkOHDzu+Wp0Xidm!nQ%!E zqnUvLEgEl^nGody)vhz}Xhbo9fq{X+Atw*7<^xkEF)%P7QX~ty?Wy1J+YVEw+Qsny z&C{oh7_s1VW;=cp?D$c*7+z?yP=!m@ow&__OAO`(09YwS%%S0*w*UYD07*qoM6N<$ Ef@FPX@c;k- literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/ACharUp2.png b/examples/top-down-rpg/assets/ACharUp2.png new file mode 100644 index 0000000000000000000000000000000000000000..25680e880dc5a6c73fdb2f9685bcc475027a5f5e GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|u6VjQhFJ6_ zCoB*!Sj64o;r;*k@`qHprtF&}U3D7~5|;{1Ro$t2mhg>%_WukiUA zXL*1iY}c=X^+tkgx!D~IAN>6q&SJV?b)w>uh756?FDa@~!kePhVuX%lq$N0XAG@8Z z=Cada>uVlnW@eSZg%SsV;K78+?ctwu)+HA>-?OPb)gjdJT}{={z@R44W7kpVDQ|gr zB9a<`;NgKOo*?^pe8pDHDB|I{G1+L7c>Px#xJg7oR5*=eU>In?h%O)^E&U&#hBr^2qUb^4h)7HS_YQN#Yva~cyHN~*GlchRtM6@m(0L6g!*IyCTfUbsxkOHDzu+Wp0Xidm!nQ%!E zqnUvLEgEl^nGody)vhz}Xhbo9fq{X+Atw*7<^xkEF)%P7QX~ty?Wy1J+YVEw+Qsny z&C{oh7_s1VW;=cp?D$c*7+z?yP=!m@ow&__OAO`(09YwS%%S0*w*UYD07*qoM6N<$ Ef@FPX@c;k- literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/ACharUp4.png b/examples/top-down-rpg/assets/ACharUp4.png new file mode 100644 index 0000000000000000000000000000000000000000..1d794fb696a782a46832af94e4ae720fafd97b13 GIT binary patch literal 274 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 literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/Border2.png b/examples/top-down-rpg/assets/Border2.png new file mode 100644 index 0000000000000000000000000000000000000000..50f8bff817477b7e8fdd296b230face2f54ae1af GIT binary patch literal 405 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-D%z{XJbALn`LH zy|~fSnNg(eqV!3jrdlJ%EXDPk3p#tA3TeJkO6lPdDCmjkc)+&2;{M8aZ|i=T?Y{fa zFmao)vA+KK;+-`wbXRZES-$iB{(9yZJ^9V|_rLUAU9`LQT;2a~(htu6{{4Eo)E2ep zpTGVnw?C<<$q>%4h9QD+15*O)0j>s725pA0AtG@5U;Vk~uLF4_SHC@TX49N!WxuaP phowgP85?iD`Ie7=PwLe=hE>0%6u!OicL9bogQu&X%Q~loCIIwjjI96w literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/Bush1.png b/examples/top-down-rpg/assets/Bush1.png new file mode 100644 index 0000000000000000000000000000000000000000..28baa92e1fbfa098af8e2d777ccbc91078e50ba8 GIT binary patch literal 315 zcmV-B0mS}^P)Px#^+`lQR5*>LQ!xs{KoFcwB#o^pf&t6CKp}5PXB|i>*xUGkH0gzu0l(lI0_Fvl z!a<7EHi57fl6YP&df;?7yEC)L?E!y+n0Z9HzCR`bG(wQd&2+-NSZUMxx@<(uj3^Co zJw13zsA8AgvDwe*a=g6^T;Deq%O;HwWXWV%w?Bny4=t8U&Wjbwx<%+YM(KU;F1f>+ zYB1pdybR>x)Fh$jjQR$HUZAFwb*trM%}h=GCenpjy6p-*=i?gcxkn=e4Xb=OuUSse zjVp6mT#;?t?^np;YBb3dvbdrs4bXMn`!7Uk005N5w_zGx>ee*H6i@D!gAud9WljJ9 N002ovPDHLkV1g|dhrj>; literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/Creature_Enemy.png b/examples/top-down-rpg/assets/Creature_Enemy.png new file mode 100644 index 0000000000000000000000000000000000000000..fb2a436169c0f082bb738535e1b71970023e40fa GIT binary patch literal 1490 zcmeAS@N?(olHy`uVBq!ia0vp^2Y`4z2OE%FU3akqNHG=%xjQkeJ16s!fq}Kh)5S5Q zV$R#U8@ofoC5}Bb-o2Xpu$XqvDnUUpT@j|kdKx!Qc4Vu#I$SxXle*V|?>CMw~t&P7w-Jt(` zo+l^JY6zI&H20SHhkD(wRnLAb*qzar-&?M(y8ifPqx}NE*392q8~oIY{jTe0tL?{j zKl`}eZSkV(!MA+gax-KpF-&k{Q0QfFkYa4ua&3#l&Rg@AyZ`#Brv+lG?{)y&Sjf{+g%a#WuJ244FXzj_}z|-GHL9zrEXR19LOm zZE`D>*68N?Pr1&gntoRrJ@g;fY3`erp9biYrEd%TdykaSHCoMl1oF1Nl>JJ5Kg>Uo3<`~Pg-C8o4wp~muFr}=fAeErGCb> z^PjKXo$vho<2QFN8$q@|;>a!*jpu&ySN#1}=XsZO-M3ur+$OyAV`ZHbn&~Fxx)*kS z&VKfz`Szva>?d&*wq z{GVd^ui(d#oc6rDJ4XHSzaKqv*XOe`tKXg7SHHdPu8jR{`_y~8`P==^JdW>mduD+a zT(fqIWn73gISx$uX}3TB{WS9ew|-5rW{J((z}*#V`<|cm-{01^f8*a1GV&$jXUj6O z_hieRM@tgdc2>Pv@{@i2+sdjX^Pjffjdv<{iC(O+b(-d_OD?X_b7S^*Zrf#SavV!? z*nH)+Xm0hQMQ;Q2mPRjI*164O=aa1JMSCz4&X4>S*GgT-mt`x$w2jtgZM6+N1IutI zNd-A4-nw(@Pt(r$Q?Jf#2=woIDipi;(OSoh>l;hJy4Qv0g>%}APJ&Xn?L_gZud8M-LW=}w3SCxK{vvAam0xcTE_#0d zMs@g?Kl8TL>%ZaSm4M_*NZQYR*S>V|v&lx9s+(m`EzQjKF8UZXE5kZu^;^xg*P@Kx z+ohvr=GoFE{FU{eZ!Mey`{fjZ`1Er70)YgZruF$X3GAI-CO5cJ$wG`XNrB5 zTyc%1Z&%#^)8~4A9$LCz|GVAHH?8O1e|%Srn&e<5B8U!tV*8J=^5S!j*w-Mgr>mdK II;Vst0CA*{*Z=?k literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/Creature_Player.png b/examples/top-down-rpg/assets/Creature_Player.png new file mode 100644 index 0000000000000000000000000000000000000000..88c17da66a82c644295801748a56d0001610e75e GIT binary patch literal 2465 zcmZuzZBSEZ77kcIuxV>&Ty~*K-2tox#4Q39!-p1^Y5PS0`)!^mWzuQS7d{F}`XwB?xw{KkEMQ9yJ|5xZRvBkM zmxCYAcwc&!@!x!`2qgu6f(2uWE2p;cvx4rw@B7Lt9F)h|U&AQx`>)g`k#v7-dV6XAR2oYz>_0b+xai^e zz;q&+Efc~UIUgZ9`3fzsAsw1#xJp}KgFPE)OI%_-0c)IJJlF5f-KR{}C%S%AuO>=1 zvKKM2ywo5n-0sF-JaU4F9S8#Ceub>aa%hgJcEJ0ypJUX`*Jn4-#%}cy;ncmNSRN*< zgNRMQ^DS})7t?=cpfl0AP|$6nAyF8uk30?TD2C^ytLks73_rSd9EQ#3!jW1CWO+c* z!k!b{)Lm3)wqsxiB%D$mlfhTufL|IvwT)|CE*>qz2&GJIWh#Hh_1j><>sR zNX0r3r)s2@p)0^N*OJvVR>@kw7Z|^<=bEal#7w)U9Z?9qC3g{A_Qg0tAf<76dFXxY zOXPo;wN0B6x<fof#OR7w~fWa1WWX6}|@D-sm) z;Vlz8#|b4lSK)c6gJ;yRGvY>0Y`An|`pFSC%cL078>eN_l@j%^TModYSy{iyeDuXs zf6TJziJUVVXP-JC&e}s9yDY<*BN@@Zhm+?7*tJNRnR!(e*T= z*@`y~!U7$Fs9U2QV=3?y`QN0Y1SsF>oIE#>n^jy({mv2A0E5~KJp;LWef|hhaeYE| zl|DC`jx9le^3%ktMN&(Y#dH8;|oZ@u_GR_h+jeTH&_a_UQER2T3Fl5yKF+hwI2?TfIY4k4`%#JVA^ z&BET(#I`kXR~=FQS2Ws@w%D0nOke+%yMs+B#M>5}@xl_5z;vpOBX}3aW##v`&meUC z5Ja;L8v1cQUs%dspXXjufDnTp{dWRWwx*sk^e%1CiwxFj;Lrt8XXB`il|?Y)8=S50 zH8}Be6=8gt^HJBBHSPZgy7vA+uKl2xPCpS!&yb7SN?H>f3i)w%^)g_9z(|_kc@RoC)*}4GcU`Am&_K@b8^rAswY)>!Gh!xrr2@|9 z34sVmNG@U+3L$esBMF<(tLY^0i7l%(nP^3)b^7EEQxROI@@lJFz&(2|k?#@6ZxZ-a z7zg3OUPe55X1gZ9WGXI8vrPArzb4G^dr1j6evjGq8w8Dc{1{2=nTRaD97G3^$J1A& zg@g8hmX{+CD!VlrQ(dIgHU|;N62XR1J@w=yWC4(l4)9uW^a^FO1?IrBgkmW{Fk65y zgxW5OSSj)8es@n+&D<>_6>quLU(Flc|_G+W+FJqNJaUK{?5!39- z`46F3UyJE966H_=c&Z5ggf>OO{`2&*Zj;sF@~Mcpja!IgpLD;uP{)p@C-aWv)%^#k C{ZT>y literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/Dock1.png b/examples/top-down-rpg/assets/Dock1.png new file mode 100644 index 0000000000000000000000000000000000000000..2f4dbafac4f20ddbe4784b07d9ff31264bcf76af GIT binary patch literal 633 zcmeAS@N?(olHy`uVBq!ia0vp^rXbA01|%OoTU-F77>k44ofy`glX=O&z+~*{;uwvK3$*5*h` z;Z=#RA4}6eU*KaDa zJ`Ll;(_;KzH+=cCS5!#hzRb-h(VO2cNxSX2M@A`*@3KYo{L;S~cc0bA+Iwx)lFGm1 zv`6My8k48Lp|Q<6dB!_upFGrhF(b`RmVx2XQ-RX-$sXa);~(C;kSXi2npLju>DIL{~SR)?MPk8U;oNrqQtN?Xj8ytJpXA2&XmDf=YLV|9sWvXAns z*wEfL{wWh?Jkr-Y_5HpLN8D8gmgHA5ZDIMXN0={FX4=UnY`bBX@jlpXiqmqxvkpWCg44$rj JF6*2UngBhp8^Ztq literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/Enemy_Spawn_Location.png b/examples/top-down-rpg/assets/Enemy_Spawn_Location.png new file mode 100644 index 0000000000000000000000000000000000000000..b466cec3aa69af3157f4db28268515d3443b8b50 GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|WIbIRLo9le v|C~Q?;fw=g!XlT?D;O8E^+*}a;9+1$s%KneQE~q%P$7e-tDnm{r-UW|mtPzV literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/Grass1.png b/examples/top-down-rpg/assets/Grass1.png new file mode 100644 index 0000000000000000000000000000000000000000..09e00952365aca8904ee3fc9668fa1703a0e24fe GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|WIbIRLo9le vV|E{ZWzWpo&?$6wFK-bP0l+XkKbVD1C literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/Healthbar.png b/examples/top-down-rpg/assets/Healthbar.png new file mode 100644 index 0000000000000000000000000000000000000000..dd61c6aeee78319bff9d70b14f2fb9c1ceb9eafb GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^H-K1-gAGV7IuxV{q!^2X+?^QKos)S95YR%5yNN4E$YQ<2OX22oIsUCLSQxnkfRu;=hX9L)g8-01 z$0s;0oLT16kT#c@zopr E05E$Px(G)Y83RA_&8~Qj20GKljx9;l(oe%)Pk-FU&`Z#I%I%gP~ zS6{~mSn|oSar`l!008!0YNvx)Lii1q_{4M5zYw{G>Vx||MQ{}WKsq@#ZnaSnfK?%a z0!kb($y0cV5Rx_Ogy86*!x$VLRvM7S_GBM^R-g3tI3Or-`eAT%n2SDOl2gIJ56kfGwcrvR#kf(BKe zU6+6#)1Nw?>)5KxfSUn+uJ_nXDd%XUu_iB-rpQs#3E_5u)Z4GVCBJ+YS(Fnia(P>? zeF^xP`SV#-isUJzNw5%;o)?@rIqm|*B!Y4h1cF=rMH*|e^2e(xlx~ATs{X{+-AH3i zMz7&sTtf7rAVr%+Q^ksPz`?fV3M!0k8)Sc6Z>&`jL**7-WD+f-TLJTq4@HH{xjQ`oliXSTvr% z<6D`1`pVTt#{J_7>))2aXq77+_wK zI=gEVUVmRqXLBY%->+qFTQblh$dB^}@w!|IVBY$E{e2O4>UL_enbNGz<5bCK`s`YP z^0Hl%yLa^zKFu#6T(%WEwroPJ9>#{{C44h}I$kd=MBIM*PI_VbF9uEr{mV)nO8@`> M07*qoM6N<$f`PywsQ>@~ literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/House2.png b/examples/top-down-rpg/assets/House2.png new file mode 100644 index 0000000000000000000000000000000000000000..e7d164d9d612e1fb3c3664ff2045d402f38cd665 GIT binary patch literal 1151 zcmV-_1c3XAP)Px(IY~r8RA_sIevsh$aLhV0J9E4DV{h;D0pXmToq3<< zednEbXIFs*xK%Ylez!K&DRYbK0D!orS-IVIxK$MZ(Ardoxy5ze*86wvD(^miNNJ~H zVerJ-{1X0YV*r4Lju4ql7s6@K#Fr*OMS)Sf7BZ6C1SpjJB1hlf_+hvRhLnBdr5~pBh z6CbIx2mloUBJzMSw0N%7C`~z zPYlm?ZmY|Hi2x_p`}lSlW2iS6u%*)EIV$`vur;;nSn{*8$ReC*kv+X(;}UQ(^V?Zf z^5hAGNw64`o*87Eq`Saz62Wp31PZtM^9BPM*<)4}3b(;Rs{Z)LU2iau)?>ICmr~NH zki1Q!tNKts;Go;G1rf%u4bm6$ja(H$X5$lhdc(;a;PiQ4K8hfo6X9&g0Zw?|t}v%T zc=1B$CqfIIwYG<#)1dh^Pi!ErX^JiY0Fa~b&Rm1fDSeR@ z#5GM3)&YHy6@U|@*wGhR0q28-sf?Yz$!u}w-E4(IamyMJ5Hh5A{3M8M38ahG=*|&fBz(JHPyyys%MH}6o zPU0kGFktd-P&R=bdBCjbvJ1KZq9~9V;qq4rMG!r0iO?5WN!QMtf%ZPYML=BBl+pg- z1OVK8+Lm%4m%oZBg{_h&ee*5CX#X$(Fyw(0A4|V{cw72;X))sYn@>Wn{{gzo|6l8n Rn_&O|002ovPDHLkV1ll!9asPW literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/HoverSound.wav b/examples/top-down-rpg/assets/HoverSound.wav new file mode 100644 index 0000000000000000000000000000000000000000..6fdc8f3dfc9eb2f368d1316b658cdf320f450b53 GIT binary patch literal 3738 zcmV;L4rTFDNk&GJ4gdgGK~_a(ZFC?I000010096*tN;LrSOEY601yCVVRT_`4gdfE z01N;l07U?F0IvY`07wC-0TTjS0#yP+0wMzS0lWcq0U-gw08;?i|4{$B{ucga{ipoe z`~UhE`XKo?`ONuo`Xl@1`?ma){eu2~|BC>p0nh>p1XBg81{4U32@?y{3aJTi2qg!~ z1z!Z?0#^aL{|)|6{D1nN_^$S=^q2B-@bvM&^PBaF_lo(O`@sG7|33nn1P2F(2^b8$ z4s{Xf5{M8L4vq`-2uB8n1F`_i{m=Tq_nq`+@f+^D>Nx5`?P2hi^WOG5`mOyl0nh}2 z2uBPf5EB#{7$g~R6{Zo!4bTb11)>3I{TunU^f~aS>;C3G;$-I3>Rj*p^RW1S{bK@P z2XhRc5#ts<9Ah9<8!i^_5SI%l2A=@_`b70{?}h1s<73@q;5X(Y>?!g|_=5h|1VjtV z5p5VKAO0m{A=Vl#6l)EQ29^JT_*3x;>ZIZ&+r!xW-%{tp?ojsl{k;XA4Vx9U9qJ|8 zD(NEI8n6;+3Iqa!`Q-2?=uY2Q)BHn(yH7D=Y{bi{N4t;5x5-HClfO?FES($8O{xA0_OHW>v`Xi(}~9! z(&*jT>FMPz?ik*X z&EmZK#(CEs=<4|03HKT}ETBEJL3uD2ACC>*`vvL+*xbdZx1!0%+Y|1H03{RbCE7Uh zO9DC;Cjb<|09ftD*$c)dvdP4S*lO%~0J9VqDWyFxPRcnsC4LZ>`-kRB(d4@~wRpIBpVy;rU>#W~z=^Uw-kA{#mcQl3TDE#eiw{cq** z%tf?tvHQui;+*@l6!|S|M}<`}Jgp-82paDR)yTT1rOCe<+MM)E4=yS{MeSVqLDVLH z3;FLt)LXdXqOQKG+Sv9t6UQ%#Ow3v&K1v}#1On%h$?~f#s

(K0rB0vxlxrVu7=VZ_vahyKqqE@SWq+S z4NK^B!epG=qTR?D?~WBbJR)PaU)wmx5qawI!Z4fSpPI*t@3t2kK)Yx}Uad9V4AJ9? zx(Si%rDe|=`3fU7O`CUnQyVFM{-@KFsFI4Gwd&w-3^O=0WUFeiK6nxX=2E$0jK89+ z&(-`pD&SYFdg@FTA2abi!#9t{r@b|T&HufL#q>%<7=}rgS@O4-GmJSK9O!KVR|sQ|K!dA zo|%%L!?*O{B^p=vcbY~n6|dtTvVVZru$kg+6jMe?cnenYBgyfOze0__q%PO32|hgF zZpmH+EHL>=#!{18pLNop1>86)Y}8<5E#vu6#;ua9pmEel2rxV;a41|1DB$y=zfy~` zs3YB`5jsZTdd5)x8ztvEvSosCw~y?;A^uhkbgDi!39-`~o-vo|%(McJIDBs7Tht}9 z?}E8MgSoOF>69NGR;P3PJU|9?&z6|}o&VGj3^PM$dah1a7w_M8sJV_+#sdDqHIZ%V zTKFRK>fW;Kge1Lf^~WtUW~^ZzDSq(Hx0!%#xl!^+D^FzgV#+Cx@Itr1fiJtT^g=G> zXTo0lBqi%Sv0{jB!i)U5Hu-Q9Rk0d9;JBrNlq%2T39dwmf96H!3fRxKlp&^M;kg_k zSi@{OF`xDGxo?3!y&w4yH573)QwCAeMPUS} z!{36Ry^Q{fKf`~bK5zXjyv~F*#;ylANr-jaGaT|vusM+}(=ruESLAoSb&mb0zU^8PnIea$^;`1P_ilFiq59WrBGSAP+Y%Z-I9 zz)uE;OpR?bC&=JRn(3>F@;o{Je}_4r@}{c^nb>)yy1-WCm0x z3^&AYgM`bf6X9DjT-Ot7%j|+k#p(^6R{CHg7&*^BhH=7<3%*obVhS0h&n|}k!k7$1 zR$E|<7OTv-g7C%$5ieWxTBs09#>az5&f6G(V<%Ey2Zg)}jtAKmBsXvJMXvf-ue6&j z=eROeepEJ|>I9z?t;6_QM73@TBY4*WjQPQY4fI$zShEaB!DNo&*+nIdaKAod^CGBe zsl4>{KdEhAA}-e(j7`UL5`A4pPAUT_xagev=kPKqcOfh{;b@kCz+ej^Rw7bQ2bsL~ zo4w{|F*tR9D&pT{mHfnu5BpivN>c#wwGpO)@YOn6X!sqp)9r~q)N&q&Xx%uw?zW_~ zy2b>#P7hHK2QR(Wqr>f!H=Jg{90t>vk6+mcBam#|FG%LooQ%f{5o%g&Kmzx-tvk4o z0mVvxPC*4Dyke`0^pQOxS`rZ=$nv1;>B2H%V}csO(chS-;Y}(_YMmhv*&UOy+ax4( zY;h(T-s6@1*Et|lXbLIm;Odxs)_@*kW_2lz;mDaH*XNG=X!awA z+&-7G-T@|gWhNf?)=r*)<&P|GU0fD#&r+vD?hZ9`Q>G02#Xz#__;Np&M-Bn2x(UB+ z1+7cvIi>T7t)R`k6S7%rDs<$dp84I%BL!bJ8I03jst53jHPlN|2KT^XzPtnQNB}p^ z@x!bG)C?K!U6vrW+gPSG>*+63O`!-D#9_bZ14l@WGcxb}s^QrY9)Mg{7*f>FvCQ?O zIf_5I`x3Zx&lVGpRy!fb-TkU-?yoW3M4$nRzM0FW4vSHuBgNpFs&DNZFxEpe0lB^c z&U6sGQrsV&-Bz%S@|ZNpJjVL%xLwvP82?u~7NFGNyKnu}J_0bQ?s=_RUOTj?dvRTIam5`yWHNj9eYQ!2pP&*(c}+7POKGR*Ehv-1AswFAx`6Mx>xuTHk2#r z?enmU?({2>G&=VZx(DVQBT76-|8>H`-hvy(LK_C2$+p-Y6%I(c3zpB?)9DY$ODzy$ z)F;r}3t>lm6Asvw&F%;mM6VT{+8oRn2jfA^78%^N%TfltK;0IJ+*r(%2A@Fb753Zy z&DaNkLH849+Mdu93RpuA5#-k})Itp)MmY_1)UMcA5eq?l2p`Z7-cc3@JK+ND%1h)U z94j<${N}`5>&YU1EH3pCzBltXDhMPc?Gwe>`)V@L8eQbz&Nc;BJKzxA+GE*A4+A_s z2CdMPP6G#wCX-H_fN5q2^P0M*SK?<^s8A&Bot&Jh5jF$)l%-X!2_5o0ew z{#eaj@*yL<93Jd*)a(Q*HN*+3+12OB7fU99_T0;V`{^n@68hp!;As!!Eb;v~&-wI; zBia{o>6hEq3AQky0>;!U@!KBC8ba-a+2986F}(!E*XHlC961}9?&jHC2E8zH1Y+3! z@ZlU+8K3Qu+#Co@E$#u#)Q&+I3(O~A{V>yt`HLe}4}s+b=&2EFAoliL z*P;NcDUk=a-g5998CDnF?iS%*2}>q2{#e#<`WPa-3`FHi?2!|G8ff$E-p&PjC&~a> z+RXS1A8rj|=ZEZI5>^?p^ZVdz28Sd{|4Z5|`}Q9(3Z3Pg@ck5O6hH8}=B^6+9XtAb z-30+pB#{Gu;Q#mC8b=JG>6q^Z5@8f7^2+DS3F8|Z`jp@#0?{IR0b}3}`|BG>2&3nP z^zjso4qEPo?tKnP6pQo<>5d4489Mq8;>ZJ7w z6E+ME?+fzw4w?_^^4#uC3zQOJ_7&_32r3nG`LO9J1zr~<{Hy1t0yP{P{9h1+ z0%Y$8{@@U20oCp@|9cTI0CDbg0G|-#{#NkH0k95*{Y~;O1GEeq{803u1gr|C`djuF z2A&8l`Dyr)2aX1^_jvjW34#PV_JjO?3VQ;}^o9QE3w{7*^LhYV3y}Wd^0>Jm`{`UwO03Y|-0I3H&{)YLZ0#*fz{K5M^1Tq5$ z`_28R1wa9}`KAB428I7&`a=Pf1OxtP{H6k}0>S(){>K9c0m1vS|CR)(|5Nd+zMj_g~HbCe%NC_3V=0oj}$_H(7+3Dr~-go#d1|H!QG7=^KaYa!s>q z*RFL6270Kf2Txh6P_(G9?dHKw(|0C^)(MM!mA&MzU^V+(;9_)*#xa zESMhBAT!r#%f6LI7RfAL7Z$VsVYnN|^o+TAIX@UDhkN-76f9l|bP|K7tDnm{r-UW| Dygp9Y literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/RoadEdge1.png b/examples/top-down-rpg/assets/RoadEdge1.png new file mode 100644 index 0000000000000000000000000000000000000000..676982cbd6e0c405a91510c50c7ddb9de68c556f GIT binary patch literal 188 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 literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/Tree1.png b/examples/top-down-rpg/assets/Tree1.png new file mode 100644 index 0000000000000000000000000000000000000000..26ac721ef9965a1bab469375317837ef7000a1f7 GIT binary patch literal 603 zcmV-h0;K(kP)Px%6-h)vR7i=KC=SIB&{C(0PzrVt451~1LZ=#tL%s8Ixx|ZYs?U;t@4e6O-Z!}<3M7>=3{N)J zu`ES4HYICXZR)Z)(Q1H>`w2#Pkr-cI=cG-;bb9ha_eC(i6RR|if?+}EPR202q>M!% z1VSa|aeBP0s!g3%TV*fw?0I6QJ$o+9PoILao=(i1&Cf$9r2I((@aoxfv>LX*1%DwG z09p+@(f;!yv!?*-Zb4a3)0LIBV4W3U^*`|)!VZU#&VBmfL5ITUZ<37-NY)_fIWtH%RUfH=QXB8i{_Z4-Ef pn!cVLNdF5G@v~!9zquEBeFEW)36bBC?SudT002ovPDHLkV1gW52220| literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/Tree2.png b/examples/top-down-rpg/assets/Tree2.png new file mode 100644 index 0000000000000000000000000000000000000000..098b838c90b84b980abd78f6f33f9f13c1467bd5 GIT binary patch literal 606 zcmV-k0-^nhP)Px%7)eAyR9J<*mp@CxKp4iK#FEv)&=78L(WQboRVxmTPEzm#=ui;)2|9J?)K4G? z4)p^Fx;Z)swN5T}v5P|tfsRf^jYE0Q%O$zo*+0+H%k{nY`Q3ZT6oM2>_R|coD`~AOvAA z+Z>qQOH^r_%+I<$`r%|@ru}e|ncpISWzAlM=(R%FH2Y<#<~ykQ4!^b)u}cvLSmgR^ z0W1lwrC!G};XEamKLtP#K)O`(HqHf* zL1uwb85aWN!N@?RL5#0mD`7~|IUN_CiseKuV{vKl$8)s$h5JD%Gge1N!7gKQ=U_`2 z(|&w4f-pW09G5>)U;E7LKQ5>Hi=<8JG8T9CHc|JITkX#ZV1G~Bw~>RoH^KJZyLJ@{ zgXjkA>}~Qs8R9l_AglfK24IFSBhtmmVd4pp&GP_A&6|hW07QK>_fsFIdFDmN#sH$Z sXet^}wRFw30mz(;RR$L)hp`F3FCwTLfj^2n`Tzg`07*qoM6N<$g6-E70RR91 literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/Water1.png b/examples/top-down-rpg/assets/Water1.png new file mode 100644 index 0000000000000000000000000000000000000000..464ad954a6126b41b295308188bdcb68868ed044 GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|WIbIRLo9le vb@u#zXV1*q&?$6wFNdW{cWUi>kn&%){a$cyA!V*XufGK9$@9fRmeL*Ub5xuipJ%+ikELZVfcH( zCqkb&BsZ34<}o&gf`VAyE33TMG6-F$o-mJ(=|F0Q9)tdZ?p9;wG83~U%?t&5_lq64 yHYd))_=5EJlG1>#xJMuV+~YZ4+rIPt2iC1Mh04)t!9RfRXYh3Ob6Mw<&;$Ulo@Ao{ literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/WaterCorner2.png b/examples/top-down-rpg/assets/WaterCorner2.png new file mode 100644 index 0000000000000000000000000000000000000000..094f332d2ac2777dbab9fc72411029d9d22a4040 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|R(ZNOhFJ8j zowSknkb!_}{2~Je6U~f_O)SnE*tHFWOy}i*=dJ7yisTt8%-Xl_3OabU?zLZ^7weS_$@J;-QYMI|OSXJY zm;ABeUiotOU5*y-uUvb^b}dBniTA;Phg@?Vd3u&Iizq2wTg<mdKI;Vst05fS|ga7~l literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/assets/WaterEdgeRight.png b/examples/top-down-rpg/assets/WaterEdgeRight.png new file mode 100644 index 0000000000000000000000000000000000000000..3132c041c1295e15020ce58e645aa0342623c43a GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|_IkQFhFJ6_ z$Lv1-%AT2-`SAPY?KZZ`s+5`}o8EE7 uv_0_cJi;)=K}B7`&`9`Vz$99!31YT|kE>H*sUlLwn5WffNc1}PCXOaEK< zOKzRy^s@!x0*g6fd1jt(^8UQr_t6a*c6O&aeMPoCw^jI_3oI6lmF3o)wSiHrr16aD zZ%?C!kN<&yQ(O5UYpC^k;k7%@-ks36vFNzvt6dF^jg1f6S1~#E%50Zc;8Ad6*7Kfm h;$jcahG(ompNKj}{%%@+I|=A&22WQ%mvv4FO#r)jUF!e< literal 0 HcmV?d00001 diff --git a/examples/top-down-rpg/thumbnail.png b/examples/top-down-rpg/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..671d74797a7fc4f37baf787b059ccb3811d7df33 GIT binary patch literal 292505 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

(|yNY9}NxCqIV9uGa&zdC1I^T@AV!I&TLzQ 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

6!#-xy@1~pqngd8Q;aOXRYCiz2|7R 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

{d1p=*FERyr%rZqJl&|J}iT7n( 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

3s^kD!DUj!mK|y^1o_0vAj94mN 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

1To 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 literal 0 HcmV?d00001 From b3c70f5990f9c7712c4699665088cae4f6a62451 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 21 Nov 2022 20:14:06 +0000 Subject: [PATCH 2/2] Optimised images with calibre/image-actions --- .../8BitOperatorPlus8Regular_Edited.png | Bin 4731 -> 3551 bytes examples/top-down-rpg/assets/ACgarRight1.png | Bin 375 -> 233 bytes examples/top-down-rpg/assets/ACgarRight2.png | Bin 348 -> 214 bytes examples/top-down-rpg/assets/ACgarRight3.png | Bin 372 -> 235 bytes examples/top-down-rpg/assets/ACgarRight4.png | Bin 350 -> 231 bytes examples/top-down-rpg/assets/ACharDown1.png | Bin 377 -> 238 bytes examples/top-down-rpg/assets/ACharDown2.png | Bin 379 -> 235 bytes examples/top-down-rpg/assets/ACharDown3.png | Bin 392 -> 242 bytes examples/top-down-rpg/assets/ACharDown4.png | Bin 388 -> 230 bytes examples/top-down-rpg/assets/ACharLeft1.png | Bin 356 -> 239 bytes examples/top-down-rpg/assets/ACharLeft2.png | Bin 330 -> 225 bytes examples/top-down-rpg/assets/ACharLeft3.png | Bin 364 -> 241 bytes examples/top-down-rpg/assets/ACharLeft4.png | Bin 353 -> 238 bytes examples/top-down-rpg/assets/ACharUp1.png | Bin 254 -> 193 bytes examples/top-down-rpg/assets/ACharUp2.png | Bin 282 -> 201 bytes examples/top-down-rpg/assets/ACharUp3.png | Bin 254 -> 193 bytes examples/top-down-rpg/assets/ACharUp4.png | Bin 274 -> 198 bytes examples/top-down-rpg/assets/Border.png | Bin 400 -> 291 bytes examples/top-down-rpg/assets/Border2.png | Bin 405 -> 292 bytes examples/top-down-rpg/assets/Bush1.png | Bin 315 -> 230 bytes .../top-down-rpg/assets/Creature_Enemy.png | Bin 1490 -> 1162 bytes .../top-down-rpg/assets/Creature_Player.png | Bin 2465 -> 2324 bytes examples/top-down-rpg/assets/Dock1.png | Bin 633 -> 399 bytes examples/top-down-rpg/assets/Healthbar.png | Bin 163 -> 153 bytes examples/top-down-rpg/assets/House1.png | Bin 1146 -> 725 bytes examples/top-down-rpg/assets/House2.png | Bin 1151 -> 704 bytes examples/top-down-rpg/assets/Road1.png | Bin 205 -> 169 bytes examples/top-down-rpg/assets/RoadEdge1.png | Bin 188 -> 171 bytes examples/top-down-rpg/assets/Tree1.png | Bin 603 -> 366 bytes examples/top-down-rpg/assets/Tree2.png | Bin 606 -> 390 bytes examples/top-down-rpg/assets/WaterCorner.png | Bin 250 -> 210 bytes examples/top-down-rpg/assets/WaterCorner2.png | Bin 240 -> 193 bytes .../top-down-rpg/assets/WaterEdgeRight.png | Bin 259 -> 182 bytes examples/top-down-rpg/assets/WaterEdgeUp.png | Bin 240 -> 192 bytes 34 files changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/top-down-rpg/assets/8BitOperatorPlus8Regular_Edited.png b/examples/top-down-rpg/assets/8BitOperatorPlus8Regular_Edited.png index ec300c462571ad8c2f1f364a66e9442e5ccd4af9..84c5b5f000d9a0875deb359adee18a2dfb0a4dad 100644 GIT binary patch literal 3551 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

NoRPHSg?)$5Z!U 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 diff --git a/examples/top-down-rpg/assets/ACgarRight1.png b/examples/top-down-rpg/assets/ACgarRight1.png index 473d08d6e3927d2d01d305937f82a803273467f3..c0532533ae69fe6fc3601343e1d09ab41f66ae07 100644 GIT binary patch delta 205 zcmV;;05bpg0_g#eB!3BTNLh0L01FZT01FZU(%pXi0001+NklGe1UY%K(@m=zn0LCo2O3gDe9B0|NuI zj2;66!x`KLAT%&A#Bcx2uq4%(fq{X6K`Cz@0|NsC!@WsKxV?Z6AZvsHCM@dUHZw3V zz->ncf1g}}v*GDLL|Xd)?J^UhT%y`_2A&Qu5>o2i%~&;+-E3q~?Scdxa!N!2BGS_T z^(-y_i%3iVe^o!x|Nr}m{{Ka!rT3kE2afI{1=gyhGQ5Xn|c5cfo$d^bPqKE0000Ge1At56otRW`U8aE@)}x% z2pwvNI*4@W;vnv>1;MR2cI@EjB(}3q=+s>t1aa(;DT|;`DAYv?S=@@mL2{eKJaz4v z9{1gI&b^ld{~jmtf~k~$i1f2q2rnXFD&^Pe6$<%tE!mxYF@Ja;iHH#=AA?%GB9j^c zxqNkvH(iR0&b@o#MQW$*_#?pm z@Rzsd4FI`TAArwZL%+g4goy!+gg$Ww#667lw<~YSfvJ=~e=Hs~iQRD|2RlK!duSz+ z`uP>Gy+b&OaykQ3DZgE^!5IQDE>;1Uy!5sW3H$G?&@S1L&!>;MxCO}zy8~xWau00000NkvXXu0mjf1sago diff --git a/examples/top-down-rpg/assets/ACgarRight3.png b/examples/top-down-rpg/assets/ACgarRight3.png index 301b595a9d0163f9356abb34972533e6e7b9d166..9403bea79be575c173ce57bbdc57e5de32228e3c 100644 GIT binary patch delta 207 zcmV;=05Jdb0_y>gB!3BTNLh0L01FZT01FZU(%pXi0001;NklGe13u@6r#;@1o_U|O&PJfvZP1rmda6P1}@ieVU^W&p`nV*uU*P6z-1002ov JPDHLkV1mSvPQCyD delta 345 zcmV-f0jB=z0rUcpB!2;OQb$4nuFf3k0003lNklDb*#?9?ha3W7Memkcg`fGlPyRS*QT6d~>+&!N0$k|vtX z0}tN2+;i@qci_J$CY=-wM$E0wXNp|xxPVKSfPS8U5lQ2EcNTB~m|iFYe!jpD z0S>%RZjLqqSZ-Yb@N#~bKf-T_6AheGe1-`U8Z+W<3<~ z1dBvO5ec>_G=17YAgyIeLCdRxHmL%FmDmOgJ1dK;t_d0l2*x4^*9Ao6EW%E1k6TUa ztCnHj_hy!Xf3HHe;3}2;W%?M6#Ag6prIKo`LTPKwYK~rB>3`im2*k;n=TWs*kx3nG zE*E!*`(sJ5rMK5(qqdlBiu+@hw^wo@S4SS;(I%p2187KA*T+kM2f)H=2?*_gnE~qe zU)(hJ0N6O~0x-O6*jM;XX`_~t(ueE>S|p8!1Gb=W*OG0X-)Lv(_xRH7kiojnZ<$Pa0x VVTgw=GF$)v002ovPDHLkV1mEhl2`x$ diff --git a/examples/top-down-rpg/assets/ACharDown1.png b/examples/top-down-rpg/assets/ACharDown1.png index 2dbe93e6eb833045586b8629791e28f53428a112..43ae72be7fe2f1cbe587b0b2dbc4c1651b97f9b7 100644 GIT binary patch delta 210 zcmV;@04@Ld0`38jB!3BTNLh0L01FZT01FZU(%pXi0001>Nkl_7y!bATmVytH74-+A4?fyO$#8wkoHbEM%RQa zhtu}T9p}Ipr0B!bizpZ*29w7c1~5NP3wFSZkpmWMCPG$>PYk9H0I)6-)uB!2;OQb$4nuFf3k0003qNkl#-;Bo6V8e3&@; zrkD5f|G57h{C8>jLESLoD!@DpGnmXr-7w<4gWXES>#K2wM1RkNo9n9u&}8bG$Kx3mdWq)rRN8OM)YeB(3uw9D1u?DM(5^} z#g%5M^-&kv?gPVC4e?as;OlLIaC`us&yE0CJ3a>>=xr59HAq5~%PI#_06;iC^DxxZ zeWpqNDhVzep;!B1tKMDmDBFRrIz6rKY$UHRcpRhc_p`DWw}{PT@Af=|lRPGsfedVP wc~@z_eYgW8!4@(A=x+=4^XYv+*-U2e4QTRl5D2%lqyPW_07*qoM6N<$f{Rw7K>z>% diff --git a/examples/top-down-rpg/assets/ACharDown2.png b/examples/top-down-rpg/assets/ACharDown2.png index 0593358f1c7a3d515e6c5d9354f1c92bf3a4abe1..d9fd12b9169d1bdebfd1133cfb03c8fbe9990286 100644 GIT binary patch delta 207 zcmV;=05Jdi0_y>gB!3BTNLh0L01FZT01FZU(%pXi0001;Nkl_#63uYkPBem!RmsL_DD{=VE|KuH5y?UqyU6J zJiUm5Vd7W~KsIPvumc>!3mm{d&6$7A z?wj7dT*WpzPyXv z)O3arMv%EkY-)O8=XjW!E{-b4H-gaz?r+|!1RTFDlHN~;oG$b#L2eGv9A(`Iz@T2D zdHc!yQgx>FD+?O-6N7pQ^?8Paud$2TbpUwn?*p*Xx&Xjy8yTnse{b)#jY0=e0|2$_ zF!6m!IPlsA)>+iV9uErv*3{(TtS@Fk0Df#cSVt`Y&i6JF!o$nETwrDrJ2h3TPaZu0 yIyIHX?iv863)|QSTf#x^Ux-5@Q2avUqx=n3UucwEwo{n^0000_7y!bATmVytH6}vZJ5TY30SJTCU`-1k!O9)y zzzRV4!_$i>7$%O@0Aw$K48e!7dI34WrUg5|F)Z+q#gGFQYbGLO0D7hZ0Dec2HJ}=z Q)Bpeg07*qoM6N<$f*JZwYybcN delta 365 zcmV-z0h0dm0f+;TB!2;OQb$4nuFf3k0003(Nkl0*Q}=|kD=+(t%q>7m99R+F$RYJFhiJNnyqy8@!E_G ztaSC^US&a+cz^vB!zCztg2H=-f(L>O=(3K(eJcKMDYUL1u(zM&Mty0 zt~+s?fq{X6p~*rOF2)>X3uQq9nuUP@l0lU6=KV)kj19nI1QrGW;pu7Bi;_7y!bAT!3r=MofgXcSGV01CTsS4ORp6EG^-R zK0LjMf??t~Qzgs*m{X?(JHQo!*f5MYIim+0vPN8*0dMeNO)oJ)ZOhc12 z*}duBfBgUb@7_E3_aVdqQIh;D!qjymoXA0xB!BNZB@di`Z z6~gxvCCT49)nYLVqf~P9O9Q|xjF8*oq`+#ih_YV?;Ob~MLO!{^2Vi*F4Y8@~3W*u? zlurN#`Wc4h0MM$+YzOrrEdGfB818{#Ikc*BMBK2P#4h{-toUpF&V$|h00000NkvXX Hu0mjf7ci#A diff --git a/examples/top-down-rpg/assets/ACharLeft1.png b/examples/top-down-rpg/assets/ACharLeft1.png index 494a40d938f3d0280d9bbfbbd9b03770c4fc6c79..97ffe9895d1c74db248666e136b3adb28f80d525 100644 GIT binary patch delta 211 zcmV;^04)FH0`CEkB!3BTNLh0L01FZT01FZU(%pXi0001?NklGe1c{mWDT;vTr2

1)=UiW4s%6uDHF2f1cmnumu@}8X*&Z0 z1H=34uNbU!_2GuFAZuop(PNk_!@!Vx1iK;cufM_&gB!psqko6ulKAbviSiPP7nJhm zF(~EDV_=riV_1@E%)r3Fz_8Ghm0_VLD^3GgkU94zB@tySRu}wzatT8c<_dh?K}iR< z%S?!}RkiC3JS|{NiMPv47`oK!v1*>3?2D3+P{QEN)2ECg($fDKLz);EF8^hio$Sj1 zbCqh>83rjiIYJBrSujKx7#No2Ge1cb6TLDtMHqsK5=hJhjX2zEo>Uw?%m1~-6NMt={*CGp#T6XhioFDT{B zV^GSQ$G|M3$FL;Tn1O+TfnlL1E5kxhR-6W~Aam|bN+QZutSGe10qg>hB!2;OQb$4nuFf3k0003dNkl1)=UiW4s%6uDHF2f1cmnumu@}8X*&Z0 z1H=34uNbU!_2GuFAZuop(PNk_!@!Vx1iK;cufM_&gB!psqko6ulKAbviSiPP7nJhm zF(~EDV_=riV_1@E%)r3Fz_8Ghm0_VLD^3GgkU94zB@tySRu}wzatT8c<_dh?K}iR< z%S?!}RkiC3JS|{NiMPv47`oK!Q8e8?zng)9fq~(`lt~z=5e0}yOaK4y^y2@J_Rjwz z($fFmPxSx)eoCVMe-UYExEQi}7Hozr%gbkQVqjo6zNklGe1@xPv>B^XZ&b^v2!7vgmROan58X~32r0Q!?!dJ|%G#{d8T M07*qoM6N<$f(6@8vH$=8 delta 326 zcmV-M0lEI}0pS9WB!2;OQb$4nuFf3k0003SNkl74=upK}17_CMb+}KWAM9}mj1~dpIL!Qo@uicwG+G3TJP}G} YKjZ;jS*vfQ_5c6?07*qoM6N<$f|~4-dH?_b diff --git a/examples/top-down-rpg/assets/ACharUp1.png b/examples/top-down-rpg/assets/ACharUp1.png index 6ba85664471c1943d663d4cdeabb8c9ca995621c..a03a9cfc0c3a34ba2fdc2d646c5af5f36259cd58 100644 GIT binary patch delta 165 zcmeyzc#v^|N0-{~8(36#DO~`7Qa7hrOnSlW<8gG}G5aj~Zu3IzkXhbo9fq{X+Atw*7 z<^xkEF)%P7QX~ty?Wy1J+YVEw+Qsny&C{oh7_s1VW;=cp?D$c*7+z?yP=!m@ow&__ cOAO`(09YwS%%S0*w*UYD07*qoM6N<$f4>Lfr-=p_45l~k%^zt zApY2-MdGXlFC*uV$_l|;1`pjX#Sr5L3Fm}Y1yT+=#|$3)b*W!u+I%I+6fC&m7>my& zfn&2)Bs3|$om*iTCted3&3)_#&w-gsCh|6D&Jug0*3kIz8GFg)jgn3V&WXk%^V1lr X|Hk^n9xpr&bO(c{tDnm{r-UW|f`3AY delta 254 zcmV`sK%?u0-3|6}OaIZ2EtqTW0G2s36 zR|GYnt6?FefM^#i^kgMk6S7(+ToS}+W?(>z#@l5kM7cn<>vs$T0|O*cp%}oxz`)>; zlZRLHY_4N)L*6`n%7_w(_a-GVFfe>!NV>&Cl3=9lS7OI$X z3=G(lGO{;d3Phx(|DzjHcj7i~1F!*PL(nxdFfcFx0Ok`>By?6r!vFvP07*qoM6N<$ Eg5DZv4*&oF diff --git a/examples/top-down-rpg/assets/ACharUp3.png b/examples/top-down-rpg/assets/ACharUp3.png index 6ba85664471c1943d663d4cdeabb8c9ca995621c..a03a9cfc0c3a34ba2fdc2d646c5af5f36259cd58 100644 GIT binary patch delta 165 zcmeyzc#v^|N0-{~8(36#DO~`7Qa7hrOnSlW<8gG}G5aj~Zu3IzkXhbo9fq{X+Atw*7 z<^xkEF)%P7QX~ty?Wy1J+YVEw+Qsny&C{oh7_s1VW;=cp?D$c*7+z?yP=!m@ow&__ cOAO`(09YwS%%S0*w*UYD07*qoM6N<$f4>Lfr-=p_45l~k%^zt zApY2-MdGXlFC*uV$_l|;1`pjX#Sr5L3Fm}Y1yT+=#|$3)b*W!u+I%I+6f9`K<6zbz za7?P#;N*mFetRU+yIMRST>g`pt1I!?xA$_Btbu{@nSxC`4q-keZHJagiZd`&Uy1d( T_Obf}&=Cxtu6{1-oD!M`sK%?u0-3|6}OaIZ2EtqTW0G2s36 zR|GYnt6?FefM^#i^kgMk6S7(+ToS}+W?+CuBP>L3mzfad0&mr>Gw^7HhXG7;>NhLA znh#8wgy{lgS2*P4;nX}&?F$0~0|SFn-aJefym|VRQAAq$ztfrR7#izN+=ehFC1J>6 wL?brMFx!;!=KY6RhT#QduQXYxVra$%0Eiw>L9-4dNB{r;07*qoM6N<$g4pM1jQ{`u diff --git a/examples/top-down-rpg/assets/Border.png b/examples/top-down-rpg/assets/Border.png index 1665418fb46101d3f92203f10eac1b0ac1840a03..ce7120f54b5f70d4e2fd2dd52f3d3e7b77e11e8c 100644 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9GGLLkg|>2BR0px{+c z7srr_TW>FIXA5X291of?}UHb9Lt*ZCa znWSg?Hxz!5POdhOXDB+id>=p1AZ$Q_gMopOL4kpRg`t6gL4bjQiNS$^fh0j}#xh8- sqnO+9pFv|C>w;_FWJIptsA0;8H$SHB{^G50XC_Fur>mdKI;Vst0HS<6*8l(j literal 400 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-D%zy*ynULn`LH zy}U8=umeNe#o`Y_j9<-md}n#Jr|sA$sh3;a4lr{VwFOH!tDVsPviH@x-w$_N&+)td zoTFGKxhM0N%o-|0j>s725p8ghBXWkj2oB|hKj)B`=?D}#Y|Jy_a*ljoS?ESklB$^h8tU3z}Vg^rFKbLh*2~7Zur;26( diff --git a/examples/top-down-rpg/assets/Border2.png b/examples/top-down-rpg/assets/Border2.png index 50f8bff817477b7e8fdd296b230face2f54ae1af..8f7e8ba82f684ca93e1b518ea82233996fc89cd3 100644 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9GGLLkg|>2BR0px`x6 z7srr_TW>Ep@*YqSaCN-%U;$egLta3*yQrh{%4h9QD+15*O)0j>s725pA0AtG@5U;Vk~uLF4_SHC@TX49N!WxuaP phowgP85?iD`Ie7=PwLe=hE>0%6u!OicL9bogQu&X%Q~loCIIwjjI96w diff --git a/examples/top-down-rpg/assets/Bush1.png b/examples/top-down-rpg/assets/Bush1.png index 28baa92e1fbfa098af8e2d777ccbc91078e50ba8..95119d6fae797d3094f017202aa0c309570fa680 100644 GIT binary patch delta 202 zcmV;*05$)+0_FjbB!3BTNLh0L01FZT01FZU(%pXi0001(NklNkl4lU5zu+4J<^`6*L5kEifv^^mcwR1g;B+^;GqcC-0e^y+c|^Lt zKPCY*LXgVMbi%w?Y18_;Y(&hAC=GBuJ$Oo}Vwc>p+0W^6ynnq6T;Deq%O;HwWXWV% zw?Bny4=t8U&Wjbwx<%+YM(KU;F1f>+YB1pdybR>x)Fh$jjQR$HUZAFwb*trM%}h=G zCenpjy6p-*=i?gcxkn=e4Xb=OuUSsejVp6mT#;?t?^np;YBb3dvbdrs4bXMn`!7Uk m005N5w_zGx>KWEF#S~BOmV*(qz-3MV00004nJa0`Jj~)y=$E(;wZv;A(CaLvG+7)_LdX!mZeE{QWs9JsBB=`c7SaU!- zlV%fRU|8~I0Y7iTmuE~2%xJO<3_M?oylY)AT-dgEM*c&Y>#U$aK?Td01AeoGF6I05 z{qcOIx4910zhhSKRuo571myX!CrptJab=fTn=T@;^xDkb{COu>F;s14>bUpd?(6iE z-^v1`-Zrk_U3_)H_iyRj@>V=pFIOHDQdcvt21w)wBl?)g}h=rwGAZ?6(9?Y5Fx zu6DuO=ZVex47Ova+fc-?(|^MKyLpp)#lHM}?Yt>l+9Ed3MEzon?wQ1U3z!!$Fd)!s zMuESF?w*X?bg`)@|G8{!Lc%k-7b|vt7C!s%(4A+0Av?GzhkN|EVjfF8%6oe_oN%bUU#x>33>bf zQx&Gw4IB;j<tkJ;n%?P1pJH+9CFr1qXW-z|Rf+PxR~&(E8$tlL#H_3De# xto8P{w%>X#de-ypPZo6N08J4PLe*V|?>CMw~t&P7w-Jt(` zo+l^JY6zI&H20SHhkD(wRnLAb*qzar-&?M(y8ifPqx}NE*392q8~oIY{jTe0tL?{j zKl`}eZSkV(!MA+gax-KpF-&k{Q0QfFkYa4ua&3#l&Rg@AyZ`#Brv+lG?{)y&Sjf{+g%a#WuJ244FXzj_}z|-GHL9zrEXR19LOm zZE`D>*68N?Pr1&gntoRrJ@g;fY3`erp9biYrEd%TdykaSHCoMl1oF1Nl>JJ5Kg>Uo3<`~Pg-C8o4wp~muFr}=fAeErGCb> z^PjKXo$vho<2QFN8$q@|;>a!*jpu&ySN#1}=XsZO-M3ur+$OyAV`ZHbn&~Fxx)*kS z&VKfz`Szva>?d&*wq z{GVd^ui(d#oc6rDJ4XHSzaKqv*XOe`tKXg7SHHdPu8jR{`_y~8`P==^JdW>mduD+a zT(fqIWn73gISx$uX}3TB{WS9ew|-5rW{J((z}*#V`<|cm-{01^f8*a1GV&$jXUj6O z_hieRM@tgdc2>Pv@{@i2+sdjX^Pjffjdv<{iC(O+b(-d_OD?X_b7S^*Zrf#SavV!? z*nH)+Xm0hQMQ;Q2mPRjI*164O=aa1JMSCz4&X4>S*GgT-mt`x$w2jtgZM6+N1IutI zNd-A4-nw(@Pt(r$Q?Jf#2=woIDipi;(OSoh>l;hJy4Qv0g>%}APJ&Xn?L_gZud8M-LW=}w3SCxK{vvAam0xcTE_#0d zMs@g?Kl8TL>%ZaSm4M_*NZQYR*S>V|v&lx9s+(m`EzQjKF8UZXE5kZu^;^xg*P@Kx z+ohvr=GoFE{FU{eZ!Mey`{fjZ`1Er70)YgZruF$X3GAI-CO5cJ$wG`XNrB5 zTyc%1Z&%#^)8~4A9$LCz|GVAHH?8O1e|%Srn&e<5B8U!tV*8J=^5S!j*w-Mgr>mdK II;Vst0CA*{*Z=?k diff --git a/examples/top-down-rpg/assets/Creature_Player.png b/examples/top-down-rpg/assets/Creature_Player.png index 88c17da66a82c644295801748a56d0001610e75e..d1ba0f54af5d89819642ad9a3bcf7156abd1d0a3 100644 GIT binary patch literal 2324 zcmai02~bm46b)q&5>a4ifv`Fh6#ESosa3$nP#|Cw34`zvqEIUo#-WlxBeFSRXC$b# zp~ZnX!6=k1z!VJ8Dp-pe5fepl31~rqAVDQI8n(Wlumq!ZChz^9_wGIS-gEDL?-v9G z5{=PVGzx_>4)FI0Mxk^_U^p8ZfR#~6BNjZ24*G}FP$-NUGIYd}j42e#@b3U0Ldc;9 zW0Hm)kz|uxa^XQgYo_D~jo$Rtc@%o9H^;KYTeq1u0r}mOc+!T_#BA*Hro6#8#S?<^ z`@MGdne<=#Pks)!2b)3BE=DZgNj(z0%?xrPj1HuxUi`!Ij8mH#>qL|hDS(&F1#)IA zAZSFYa->pjmu?*1#&d_4j%+80``epcsfn}7neLf7&(=K!3@1bd-~b4K1dJgoF37@3 zDp{{+m!*$BX#Mxn`?s61dh8fXJtbHpNyF61@DW$HPgNiY`KQB4|X$sJjQ#f> zP7r%+*F8*K37j)t@DOm~ga~2PQ*_E&7XH$-f4Dq9^wKrdUCh<^*$nv%5)5!&Jq=Hb?;0)3a~`6$39V?U15_vIDq10h>Yk%R-gfDJHd6@f{ouc+n|P7okK z#fNG_(m&5`%0?EY@7TTv)_Io!oA0%WP=a_Ag5%uTlO}5XhPA4-W}JrQ1kF`|re_)+ zICxBu&EfLt%95~FbxD4}fWB}R&saY;fZ^cTEj#F>4O8rz>@Dn`t*<%0OeHnX2*MX22d$yHyQsgeWvD)PxQ@tf z&75klE3So${*m^(M!utjSf0~wS2JHld6V2m#qPe-JSsXDPuCCAEG?~f;Y5(v>)z^% z1Yd1xkUEL%4;Fli>JjB z{FL=YOmex{V7ge1}U zxk+-W-gQU3;x9L)vJi*i3r-t;v?PSz@*d^Lr1cnKsr{+j)06Dn{d9X3gYPk>fhOF1 z=t`sWTAr7#?~=n$?W*RIfR|lK%yZ7%u4e_VKadsehE@gWQfyfEk~1=sYZFdeZRf(^ zTIe86rU|8%Qw48szWTzZvz_aVL~W6U@`(!h)GJx&tS6Ji<_}Tmqvh&&m>7fuTMOiBK(nY_;LfrwiK>bx(v!_a z`wC_}nf|hHrZDmP7C~&s)ANJnlBNM_B(+O+KXEgTAFF^moD|Q?lV>X;w%}9vv72$= qKeR+JoJo@1-y%#5ki89@)`?16rkk~5ohA6pK?V2*`qX(xG5!PFDeP|m literal 2465 zcmZuzZBSEZ77kcIuxV>&Ty~*K-2tox#4Q39!-p1^Y5PS0`)!^mWzuQS7d{F}`XwB?xw{KkEMQ9yJ|5xZRvBkM zmxCYAcwc&!@!x!`2qgu6f(2uWE2p;cvx4rw@B7Lt9F)h|U&AQx`>)g`k#v7-dV6XAR2oYz>_0b+xai^e zz;q&+Efc~UIUgZ9`3fzsAsw1#xJp}KgFPE)OI%_-0c)IJJlF5f-KR{}C%S%AuO>=1 zvKKM2ywo5n-0sF-JaU4F9S8#Ceub>aa%hgJcEJ0ypJUX`*Jn4-#%}cy;ncmNSRN*< zgNRMQ^DS})7t?=cpfl0AP|$6nAyF8uk30?TD2C^ytLks73_rSd9EQ#3!jW1CWO+c* z!k!b{)Lm3)wqsxiB%D$mlfhTufL|IvwT)|CE*>qz2&GJIWh#Hh_1j><>sR zNX0r3r)s2@p)0^N*OJvVR>@kw7Z|^<=bEal#7w)U9Z?9qC3g{A_Qg0tAf<76dFXxY zOXPo;wN0B6x<fof#OR7w~fWa1WWX6}|@D-sm) z;Vlz8#|b4lSK)c6gJ;yRGvY>0Y`An|`pFSC%cL078>eN_l@j%^TModYSy{iyeDuXs zf6TJziJUVVXP-JC&e}s9yDY<*BN@@Zhm+?7*tJNRnR!(e*T= z*@`y~!U7$Fs9U2QV=3?y`QN0Y1SsF>oIE#>n^jy({mv2A0E5~KJp;LWef|hhaeYE| zl|DC`jx9le^3%ktMN&(Y#dH8;|oZ@u_GR_h+jeTH&_a_UQER2T3Fl5yKF+hwI2?TfIY4k4`%#JVA^ z&BET(#I`kXR~=FQS2Ws@w%D0nOke+%yMs+B#M>5}@xl_5z;vpOBX}3aW##v`&meUC z5Ja;L8v1cQUs%dspXXjufDnTp{dWRWwx*sk^e%1CiwxFj;Lrt8XXB`il|?Y)8=S50 zH8}Be6=8gt^HJBBHSPZgy7vA+uKl2xPCpS!&yb7SN?H>f3i)w%^)g_9z(|_kc@RoC)*}4GcU`Am&_K@b8^rAswY)>!Gh!xrr2@|9 z34sVmNG@U+3L$esBMF<(tLY^0i7l%(nP^3)b^7EEQxROI@@lJFz&(2|k?#@6ZxZ-a z7zg3OUPe55X1gZ9WGXI8vrPArzb4G^dr1j6evjGq8w8Dc{1{2=nTRaD97G3^$J1A& zg@g8hmX{+CD!VlrQ(dIgHU|;N62XR1J@w=yWC4(l4)9uW^a^FO1?IrBgkmW{Fk65y zgxW5OSSj)8es@n+&D<>_6>quLU(Flc|_G+W+FJqNJaUK{?5!39- z`46F3UyJE966H_=c&Z5ggf>OO{`2&*Zj;sF@~Mcpja!IgpLD;uP{)p@C-aWv)%^#k C{ZT>y diff --git a/examples/top-down-rpg/assets/Dock1.png b/examples/top-down-rpg/assets/Dock1.png index 2f4dbafac4f20ddbe4784b07d9ff31264bcf76af..c4f469d5c37153d02abf4aaa27712bd435134cca 100644 GIT binary patch delta 372 zcmey#($73WrJl3EBeIx*fm;ZK886+f`@_J%=;-O<7?N@C?aYI`hYWaJty#?1`5bKY zjcAaS=-g^i(9GIYWMDMy?GnX8%^L5pm2W55?A$6`dMjsp=2@%ENwU{3+buo)(bsf# zYJ8T>0tQwM2S%=d1||_K%=(D|k>}g*zBUg(8<#C@YPXtusww{yt^Im6tLrx%k=i0= z&+>_1=$EAlSKF`7urB+H0T#1-vL{{1-Z6LG9`>t8CgfU3v@1?ky%GIkj)dKD0|U+{ zZ^gE}?VqlxpJp*7#%3kk($p=cYAV4(t4z6<&Ukch{rAVq_j*T(J^6h}$oS94Td^yrJk`k$lZxy-8q?;3=B-ho-U3d8I5me*>@ds5IMHLqqq0=3I$D;w<&@; zxnCLP9ag({;E;62Cpso_%#LzeB+Fg`pj#{YFg{g*#`MTHdZ%iMet zz4`5uwA-G0WR&9gE?Y#;Fa4`=_gQ_cz1LPPsr)-mdt{!aF?sqM8r!UsXS{Rv$wRFd zGt%s285kZt6(~)g>=FJv{^7j~nX(?MS>@`U&dm%p*?iQ@RIPc*@*jnV^L)Z?b=WEY z=vL#OWO!Akw8dP>OM5E&apU^4nX*r^JXV*8Ci^JAiVf|3Wu~2M!nPZB8SjJLrZ}B9IWH%~5a@bv|KyLE2kYHS{;!>Q>bpnf z@#}MYOPJI=_s_p)wM=~ZIwgjbRg-O;84_of+<1HOUHQQ(ow@7t-u~H^5g!^{9%*Lr z=GzK0yCvV9(pKI2v0>ds)y(g^879nH+?0CgY{0t>noGQ%pY^qx>T~pf|A{~Q*7TY) qKUk@_;6QkPc8OyB*8szm3!VAyayg}n(Ht2JK;Y@>=d#Wzp$Py{%o;2J diff --git a/examples/top-down-rpg/assets/Healthbar.png b/examples/top-down-rpg/assets/Healthbar.png index dd61c6aeee78319bff9d70b14f2fb9c1ceb9eafb..e4a52ca8fda7224f35bbedb81471e5a645e171b6 100644 GIT binary patch delta 124 zcmZ3?IFoULN-1Z7M`SSr1Gf+eGhVt|_lJRj!Q0ctF{I+w+slT$3=BMnH#AAtd&zda z{glWwaZ(!Boequ!0|N;Vmf!(l9ySnWV+P@7Mj&oH=)wRb7@7}GXMJ|)b;qwK)9wI` OW$<+Mb6Mw<&;$S<(I+PW literal 163 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 delta 177 zcmV;i08am@0nGuBB!2;OQb$4nuFf3k0001oNklVZAuk4NDHU@mQH%!`L zu=1DW1l5n4N0#;l{pC5bOXir`(W0a;#t(vedM+OA;N(pDYOLU$bh(Fn@$asfzdSoc vV)D9=cXLKMtf^xwIn0r%@ delta 160 zcmV;R0AK&B0lWc_B!2;OQb$4nuFf3k0001XNkl*c^ zFSw&%7XSaM^eLh>Vi`4z0{s9j--I|^P;dhZrpfO9wKINhU_kt`YKJ8=l16zK~k82^V8NN5`8v1{9pSIts~ zOnMvkZWY7u&Cgd?tSp!%jbkvTc`aiE5}4E2tp&jIBmk%hA%F8jfHj|f0asb}YJY%^`w2#Pkr-cI=cG-; zbb9ha_eC(i6RR|if?+}EPR202q>M!%1VSa|aeBP0s!g3%TV*fw?0I6QJ$o+9PoILa zo=(i1&Cf$9r2I((@aoxfv>LX*1%DwG09p+@(f;!yv!?*-Zb4a3)0LIBV4W3U^*`Ov4S&Eu546jrxVmQtQ414z6cXNth;sCO- zWI6V=fQ49Q=KT1mTnh008ZOm}0DwY%5@{e>R>PKBR>N@?h5UrB0gh!UzSnUah`1uv zeYhG>bAWpah&ele-xno~iW`ozzVoa{03d2G47JtJ^_({f6rurV-ed&+fNb%(t z0-PW20RTGhksr(fs8rvBskyk@-Jr)Jb)O!60HH3X=HhsJ1^}o(Z^6`Df4~S7)YM#b zzET~HJ{A|W;3Q1VMVIrT5gEhq29+Fu8QRlLY7PJwJ8xl}07&d&+n#O)ObH|a3@SMk zZ{Z1_0y`qsd=+A=#{*J;IKNXOiJ${*6L^K1zMdUO{|gfFvtw1ixfgnU0^yAbk>8Q+ Qga7~l07*qoM6N<$f@7TpfB*mh diff --git a/examples/top-down-rpg/assets/Tree2.png b/examples/top-down-rpg/assets/Tree2.png index 098b838c90b84b980abd78f6f33f9f13c1467bd5..5b7164fa162d1b2741c45cf52f6062da4e39ed5b 100644 GIT binary patch delta 363 zcmV-x0hIpU1cn2UB!3BTNLh0L01FZT01FZU(%pXi0003vNklq8|t^KS*EJ!2$*CAbmM3UD7H3gG{LNkWpE zx<>=G**zgwA~#T1+>q#0Upvrf^9BVmb{uaPuCJpxkJ=!8L$ffj9laKAS=8dF=oI002ov JPDHLkV1grPn4$mx delta 581 zcmV-L0=oT%1KtFXB!2;OQb$4nuFf3k0006QNkleM zrGhwBD-MoMQt$)lP!ReFI(6vOPap^m^#cgHIXVcnPA+z_i$e^7j!s35LwV23CAr+$ zKhM(3^}YA`-FwO9V!=QzW3f)$I0!7=oFx;}v#zg|wATV3Q-1`L`zIM+UaxDJ=IQ+O zowu`KQXTU$R>6oM2>_R|coD`~AOvAA+Z>qQOH^r_%+I<$`r%|@ru}e|ncpISWzAlM z=(R%FH2Y<#<~ykQ4!^b)u}cvLSmgR^0W1T6m;j2gv==0nK!liO=JI$|F1`-{K((<00H|z4N&~8j zm^iCX)^OyZvJrund>jN8e;1fSn2M_VeD%W30qH3qb8&#&&Pu9^8;-n0zvz(yPz{!W zbfEHLM5SKGGT}TWmp=tS5J0+A^ES=}kU?gFQ5hEk_mW%f&kA6FPusVVgSt1t_T9U76$*ps2JGx@@;({jHgX`V{qzQ4hA$)1#mQmf z36Rb606s{~n}^u|M13^(Qy-^!=0(QF0HV2QDjHF>bj`H^$efH-1{WuXu?fI0BB&dI TKZ-m000000NkvXXu0mjfaH$g1 diff --git a/examples/top-down-rpg/assets/WaterCorner.png b/examples/top-down-rpg/assets/WaterCorner.png index c371bb0e3e39effce85ae2d3639025b5af7e316e..2dc109d91cba2c9b2f9018e086dc1a33e64f6e5a 100644 GIT binary patch delta 182 zcmV;n07?J)0n!1GB!3BTNLh0L01FZT01FZU(%pXi0001lNklXL14#NOa z3;}5-$^dj*ku_sA0G}bq8bKHY7|5{|rWwTmeE!6y5dZG@}?m$gk)c kaT?Y Y1+{!}BU>g@_y7O^07*qoM6N<$f}kp5egFUf diff --git a/examples/top-down-rpg/assets/WaterCorner2.png b/examples/top-down-rpg/assets/WaterCorner2.png index 094f332d2ac2777dbab9fc72411029d9d22a4040..764390c6970b3f7da81151c6689a218a897382b7 100644 GIT binary patch delta 165 zcmV;W09ya>0l@)~B!3BTNLh0L01FZT01FZU(%pXi0001UNklG!0=5B=B!3BTNLh0L01FZT01FZU(%pXi0001JNkl0mztS13((EX+}2yT{DUc$Zl3W!#uiQopa1{>07*qo IM6N<$f_|4a?*IS* delta 231 zcmdnS*vvFRrJk`k$lZxy-8q?;3=9l=JzX3_EP9h;b{~Ib&&~t?5))qYb}>)noV{SeeQ!1( zXnU#H*TU;iW~CRtWv8?e$j*X0bq$#eRZ2~gP4Bp3+8+3J9$}c`prWo|Xe4|_AV!i) bmVsftnOo4ds()-ipD=j3`njxgN@xNAIxkrk diff --git a/examples/top-down-rpg/assets/WaterEdgeUp.png b/examples/top-down-rpg/assets/WaterEdgeUp.png index 2976a7fd8f47fedad138e0ecdad60d21716c41cf..c71d55a3a3ab9100dcbc43120339a180a0dfcc75 100644 GIT binary patch delta 164 zcmeyscz|(&NVZAuk4NDHU@mQH%u}( z)1cGouc%kbbL19J^5Sm82SGhO7mph799SwK-zMGQeQ-+x`yPp9eT*}md)!LSIILo8 zVw=Dv@h_OefM>;>!oCb1vj!2~8wO#_T<`ZOcLee%xG~G>opI<)TP4B3P*?ikJd4}O QaG>=Jp00i_>zopr0FKBz@c;k- delta 212 zcmV;_04x8%0q_BkB!2;OQb$4nuFf3k00020Nkl*c^ zF&JR_{q#LSg{;zo4Cw0M2Ea7nvKbv9tNZ=*Jp&UqXZ?Qq906)x