From 8b80d7cf03a5ccd851f5df7341d15f488b6b6bf0 Mon Sep 17 00:00:00 2001 From: Jesse Howard Date: Sun, 2 Aug 2026 08:19:42 -0400 Subject: [PATCH] Added random room generation --- MiniDungeonMultiplayerDev.json | 15637 +++++++++++++++++++++- MiniDungeonMultiplayerDev.json.autosave | 1 + TestRoom01.png | Bin 0 -> 13612 bytes TestRoom010.png | Bin 0 -> 15570 bytes TestRoom011.png | Bin 0 -> 15671 bytes TestRoom012.png | Bin 0 -> 15790 bytes TestRoom013.png | Bin 0 -> 16379 bytes TestRoom02.png | Bin 0 -> 15584 bytes TestRoom03.png | Bin 0 -> 16153 bytes TestRoom04.png | Bin 0 -> 15318 bytes TestRoom05.png | Bin 0 -> 16405 bytes TestRoom06.png | Bin 0 -> 16044 bytes TestRoom07.png | Bin 0 -> 14964 bytes TestRoom08.png | Bin 0 -> 15677 bytes TestRoom09.png | Bin 0 -> 14767 bytes TestRoom10.png | Bin 0 -> 15441 bytes TestRoom11.png | Bin 0 -> 16020 bytes TestRoom12.png | Bin 0 -> 15401 bytes TestRoom13.png | Bin 0 -> 15827 bytes TestRoom4Way.png | Bin 0 -> 16266 bytes TestRoomDeadD.png | Bin 0 -> 15919 bytes TestRoomDeadL.png | Bin 0 -> 15440 bytes TestRoomDeadR.png | Bin 0 -> 15582 bytes TestRoomDeadU.png | Bin 0 -> 15979 bytes TestRoomLR.png | Bin 0 -> 15713 bytes TestRoomUD.png | Bin 0 -> 16458 bytes Tile Dungeon2x.png | Bin 0 -> 7039 bytes assets/03Idle.png | Bin 0 -> 565 bytes assets/03Idle10.png | Bin 0 -> 513 bytes assets/03Idle11.png | Bin 0 -> 520 bytes assets/03Idle12.png | Bin 0 -> 542 bytes assets/03Idle13.png | Bin 0 -> 565 bytes assets/03Idle14.png | Bin 0 -> 561 bytes assets/03Idle15.png | Bin 0 -> 535 bytes assets/03Idle16.png | Bin 0 -> 513 bytes assets/03Idle17.png | Bin 0 -> 520 bytes assets/03Idle18.png | Bin 0 -> 542 bytes assets/03Idle19.png | Bin 0 -> 565 bytes assets/03Idle2.png | Bin 0 -> 561 bytes assets/03Idle20.png | Bin 0 -> 561 bytes assets/03Idle21.png | Bin 0 -> 535 bytes assets/03Idle22.png | Bin 0 -> 513 bytes assets/03Idle23.png | Bin 0 -> 520 bytes assets/03Idle24.png | Bin 0 -> 542 bytes assets/03Idle25.png | Bin 0 -> 565 bytes assets/03Idle26.png | Bin 0 -> 561 bytes assets/03Idle27.png | Bin 0 -> 535 bytes assets/03Idle28.png | Bin 0 -> 513 bytes assets/03Idle29.png | Bin 0 -> 520 bytes assets/03Idle3.png | Bin 0 -> 535 bytes assets/03Idle30.png | Bin 0 -> 542 bytes assets/03Idle31.png | Bin 0 -> 565 bytes assets/03Idle32.png | Bin 0 -> 561 bytes assets/03Idle33.png | Bin 0 -> 535 bytes assets/03Idle34.png | Bin 0 -> 513 bytes assets/03Idle35.png | Bin 0 -> 520 bytes assets/03Idle36.png | Bin 0 -> 542 bytes assets/03Idle4.png | Bin 0 -> 513 bytes assets/03Idle5.png | Bin 0 -> 520 bytes assets/03Idle6.png | Bin 0 -> 542 bytes assets/03Idle7.png | Bin 0 -> 565 bytes assets/03Idle8.png | Bin 0 -> 561 bytes assets/03Idle9.png | Bin 0 -> 535 bytes assets/03Walk.png | Bin 0 -> 557 bytes assets/03Walk10.png | Bin 0 -> 558 bytes assets/03Walk2.png | Bin 0 -> 554 bytes assets/03Walk3.png | Bin 0 -> 527 bytes assets/03Walk4.png | Bin 0 -> 532 bytes assets/03Walk5.png | Bin 0 -> 544 bytes assets/03Walk6.png | Bin 0 -> 562 bytes assets/03Walk7.png | Bin 0 -> 564 bytes assets/03Walk8.png | Bin 0 -> 551 bytes assets/03Walk9.png | Bin 0 -> 538 bytes assets/NewSprite.png | Bin 0 -> 315 bytes assets/NewSprite2.png | Bin 0 -> 139 bytes assets/NewSprite3.png | Bin 0 -> 119 bytes assets/NewSprite4.png | Bin 0 -> 119 bytes assets/NewSprite5.png | Bin 0 -> 118 bytes assets/NewSprite6.png | Bin 0 -> 120 bytes assets/NewSprite7.png | Bin 0 -> 119 bytes 80 files changed, 15616 insertions(+), 22 deletions(-) create mode 100644 MiniDungeonMultiplayerDev.json.autosave create mode 100644 TestRoom01.png create mode 100644 TestRoom010.png create mode 100644 TestRoom011.png create mode 100644 TestRoom012.png create mode 100644 TestRoom013.png create mode 100644 TestRoom02.png create mode 100644 TestRoom03.png create mode 100644 TestRoom04.png create mode 100644 TestRoom05.png create mode 100644 TestRoom06.png create mode 100644 TestRoom07.png create mode 100644 TestRoom08.png create mode 100644 TestRoom09.png create mode 100644 TestRoom10.png create mode 100644 TestRoom11.png create mode 100644 TestRoom12.png create mode 100644 TestRoom13.png create mode 100644 TestRoom4Way.png create mode 100644 TestRoomDeadD.png create mode 100644 TestRoomDeadL.png create mode 100644 TestRoomDeadR.png create mode 100644 TestRoomDeadU.png create mode 100644 TestRoomLR.png create mode 100644 TestRoomUD.png create mode 100644 Tile Dungeon2x.png create mode 100644 assets/03Idle.png create mode 100644 assets/03Idle10.png create mode 100644 assets/03Idle11.png create mode 100644 assets/03Idle12.png create mode 100644 assets/03Idle13.png create mode 100644 assets/03Idle14.png create mode 100644 assets/03Idle15.png create mode 100644 assets/03Idle16.png create mode 100644 assets/03Idle17.png create mode 100644 assets/03Idle18.png create mode 100644 assets/03Idle19.png create mode 100644 assets/03Idle2.png create mode 100644 assets/03Idle20.png create mode 100644 assets/03Idle21.png create mode 100644 assets/03Idle22.png create mode 100644 assets/03Idle23.png create mode 100644 assets/03Idle24.png create mode 100644 assets/03Idle25.png create mode 100644 assets/03Idle26.png create mode 100644 assets/03Idle27.png create mode 100644 assets/03Idle28.png create mode 100644 assets/03Idle29.png create mode 100644 assets/03Idle3.png create mode 100644 assets/03Idle30.png create mode 100644 assets/03Idle31.png create mode 100644 assets/03Idle32.png create mode 100644 assets/03Idle33.png create mode 100644 assets/03Idle34.png create mode 100644 assets/03Idle35.png create mode 100644 assets/03Idle36.png create mode 100644 assets/03Idle4.png create mode 100644 assets/03Idle5.png create mode 100644 assets/03Idle6.png create mode 100644 assets/03Idle7.png create mode 100644 assets/03Idle8.png create mode 100644 assets/03Idle9.png create mode 100644 assets/03Walk.png create mode 100644 assets/03Walk10.png create mode 100644 assets/03Walk2.png create mode 100644 assets/03Walk3.png create mode 100644 assets/03Walk4.png create mode 100644 assets/03Walk5.png create mode 100644 assets/03Walk6.png create mode 100644 assets/03Walk7.png create mode 100644 assets/03Walk8.png create mode 100644 assets/03Walk9.png create mode 100644 assets/NewSprite.png create mode 100644 assets/NewSprite2.png create mode 100644 assets/NewSprite3.png create mode 100644 assets/NewSprite4.png create mode 100644 assets/NewSprite5.png create mode 100644 assets/NewSprite6.png create mode 100644 assets/NewSprite7.png diff --git a/MiniDungeonMultiplayerDev.json b/MiniDungeonMultiplayerDev.json index ca4cd4f..0eabdc6 100644 --- a/MiniDungeonMultiplayerDev.json +++ b/MiniDungeonMultiplayerDev.json @@ -17,19 +17,47 @@ "pixelsRounding": true, "projectUuid": "9386a7f4-fb47-4bec-8bd2-99c1fb11403b", "scaleMode": "nearest", - "sizeOnStartupMode": "adaptWidth", + "sizeOnStartupMode": "", "templateSlug": "", "version": "1.0.0", "name": "MiniDungeonMultiplayerDev", "description": "", "author": "", - "windowWidth": 1280, - "windowHeight": 720, + "windowWidth": 640, + "windowHeight": 480, "latestCompilationDirectory": "", "maxFPS": 60, "minFPS": 20, "verticalSync": false, - "platformSpecificAssets": {}, + "platformSpecificAssets": { + "android-icon-144": "", + "android-icon-192": "", + "android-icon-36": "", + "android-icon-48": "", + "android-icon-72": "", + "android-icon-96": "", + "android-windowSplashScreenAnimatedIcon": "", + "desktop-icon-512": "", + "ios-icon-100": "", + "ios-icon-1024": "", + "ios-icon-114": "", + "ios-icon-120": "", + "ios-icon-144": "", + "ios-icon-152": "", + "ios-icon-167": "", + "ios-icon-180": "", + "ios-icon-20": "", + "ios-icon-29": "", + "ios-icon-40": "", + "ios-icon-50": "", + "ios-icon-57": "", + "ios-icon-58": "", + "ios-icon-60": "", + "ios-icon-72": "", + "ios-icon-76": "", + "ios-icon-80": "", + "ios-icon-87": "" + }, "loadingScreen": { "backgroundColor": 0, "backgroundFadeInDuration": 0.2, @@ -63,7 +91,632 @@ "currentPlatform": "GDevelop JS platform" }, "resources": { - "resources": [] + "resources": [ + { + "file": "Tile Dungeon2x.png", + "kind": "image", + "metadata": "", + "name": "Tile Dungeon2x.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle2.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle2", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle3.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle3", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle4.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle4", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle5.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle5", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle6.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle6", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle7.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle7", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle8.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle8", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle9.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle9", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle10.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle10", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle11.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle11", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle12.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle12", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle13.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle13", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle14.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle14", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle15.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle15", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle16.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle16", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle17.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle17", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle18.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle18", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle19.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle19", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle20.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle20", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle21.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle21", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle22.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle22", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle23.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle23", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle24.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle24", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle25.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle25", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle26.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle26", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle27.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle27", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle28.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle28", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle29.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle29", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle30.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle30", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle31.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle31", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle32.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle32", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle33.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle33", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle34.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle34", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle35.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle35", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Idle36.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Idle36", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/NewSprite.png", + "kind": "image", + "metadata": "{\"extension\":\".png\",\"localFilePath\":\"assets/NewSprite.png\"}", + "name": "NewSprite", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoom01.png", + "kind": "image", + "metadata": "", + "name": "TestRoom01.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoom02.png", + "kind": "image", + "metadata": "", + "name": "TestRoom02.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoom03.png", + "kind": "image", + "metadata": "", + "name": "TestRoom03.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoom05.png", + "kind": "image", + "metadata": "", + "name": "TestRoom05.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/NewSprite2.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "NewSprite2", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Walk.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Walk", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Walk2.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Walk2", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Walk3.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Walk3", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Walk4.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Walk4", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Walk5.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Walk5", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Walk6.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Walk6", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Walk7.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Walk7", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Walk8.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Walk8", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Walk9.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Walk9", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/03Walk10.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "03Walk10", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoom04.png", + "kind": "image", + "metadata": "", + "name": "TestRoom04.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoom06.png", + "kind": "image", + "metadata": "", + "name": "TestRoom06.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoom07.png", + "kind": "image", + "metadata": "", + "name": "TestRoom07.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoom08.png", + "kind": "image", + "metadata": "", + "name": "TestRoom08.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoom09.png", + "kind": "image", + "metadata": "", + "name": "TestRoom09.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoom010.png", + "kind": "image", + "metadata": "", + "name": "TestRoom010.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoom011.png", + "kind": "image", + "metadata": "", + "name": "TestRoom011.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoom012.png", + "kind": "image", + "metadata": "", + "name": "TestRoom012.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoom013.png", + "kind": "image", + "metadata": "", + "name": "TestRoom013.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoom10.png", + "kind": "image", + "metadata": "", + "name": "TestRoom10.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoom11.png", + "kind": "image", + "metadata": "", + "name": "TestRoom11.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoom12.png", + "kind": "image", + "metadata": "", + "name": "TestRoom12.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoom13.png", + "kind": "image", + "metadata": "", + "name": "TestRoom13.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/NewSprite3.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "NewSprite3", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoom4Way.png", + "kind": "image", + "metadata": "", + "name": "TestRoom4Way.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/NewSprite4.png", + "kind": "image", + "metadata": "{\"extension\":\".png\",\"localFilePath\":\"assets/NewSprite4.png\"}", + "name": "NewSprite4", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoomLR.png", + "kind": "image", + "metadata": "", + "name": "TestRoomLR.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoomUD.png", + "kind": "image", + "metadata": "", + "name": "TestRoomUD.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoomDeadL.png", + "kind": "image", + "metadata": "", + "name": "TestRoomDeadL.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoomDeadR.png", + "kind": "image", + "metadata": "", + "name": "TestRoomDeadR.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoomDeadU.png", + "kind": "image", + "metadata": "", + "name": "TestRoomDeadU.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "TestRoomDeadD.png", + "kind": "image", + "metadata": "", + "name": "TestRoomDeadD.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/NewSprite5.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "NewSprite5", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/NewSprite6.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "NewSprite6", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/NewSprite7.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "NewSprite7", + "smoothed": false, + "userAdded": false + } + ] }, "objects": [], "objectsFolderStructure": { @@ -75,38 +728,1784 @@ { "b": 255, "disableInputWhenNotFocused": true, - "mangledName": "Untitled_32scene", - "name": "Untitled scene", + "mangledName": "Game", + "name": "Game", "r": 247, "standardSortMethod": true, "stopSoundsOnStartup": true, "title": "", "v": 249, "uiSettings": { - "grid": false, + "grid": true, "gridType": "rectangular", - "gridWidth": 32, - "gridHeight": 32, + "gridWidth": 640, + "gridHeight": 480, "gridDepth": 32, "gridOffsetX": 0, "gridOffsetY": 0, "gridOffsetZ": 0, "gridColor": 10401023, "gridAlpha": 0.8, - "snap": false, - "zoomFactor": 0.546875, + "snap": true, + "zoomFactor": 0.4335774304702383, "windowMask": false, "selectedLayer": "", "gameEditorMode": "instances-editor" }, - "objectsGroups": [], - "variables": [], - "instances": [], - "objects": [], + "objectsGroups": [ + { + "name": "Rooms", + "objects": [ + { + "name": "spr_4Way" + }, + { + "name": "spr_LR" + }, + { + "name": "spr_UD" + }, + { + "name": "spr_DeadL" + }, + { + "name": "spr_DeadR" + }, + { + "name": "spr_DeadUp" + }, + { + "name": "spr_DeadDown" + } + ] + }, + { + "name": "Checker", + "objects": [ + { + "name": "spr_right" + }, + { + "name": "spr_left" + }, + { + "name": "spr_up" + }, + { + "name": "spr_down" + } + ] + } + ], + "variables": [ + { + "name": "var_roomCount", + "persistentUuid": "c143876b-6251-4aec-a302-41a096a13d9d", + "type": "number", + "value": 1 + } + ], + "instances": [ + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_player", + "persistentUuid": "168f7870-38ea-449a-b480-8a38e037e176", + "width": 0, + "x": 475, + "y": 257, + "zOrder": 30, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_4Way", + "persistentUuid": "346c6f81-2757-45a8-a096-c776d3ab76bc", + "width": 0, + "x": 0, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_right", + "persistentUuid": "e34ef6cd-0335-48e6-8d19-d84d325b8591", + "width": 0, + "x": 640, + "y": 0, + "zOrder": 31, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_left", + "persistentUuid": "a02511d0-68fd-4f90-afe7-4326ed28fd87", + "width": 0, + "x": -640, + "y": 0, + "zOrder": 32, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_up", + "persistentUuid": "bfc88395-d3c8-47c3-bb4e-c2a8d1950bb8", + "width": 0, + "x": 0, + "y": -480, + "zOrder": 33, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_down", + "persistentUuid": "03b1aa00-32fd-48b7-aaea-14d1e7e1196b", + "width": 0, + "x": 0, + "y": 480, + "zOrder": 34, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "objects": [ + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "spr_player", + "persistentUuid": "15baac05-8645-4485-b856-649122e1892c", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "acceleration": 9999, + "allowDiagonals": true, + "angleOffset": 0, + "angularMaxSpeed": 180, + "customIsometryAngle": 30, + "deceleration": 9999, + "ignoreDefaultControls": false, + "maxSpeed": 200, + "movementAngleOffset": 0, + "name": "TopDownMovement", + "rotateObject": false, + "type": "TopDownMovementBehavior::TopDownMovementBehavior", + "useLegacyTurnBack": false, + "viewpoint": "TopDown" + } + ], + "animations": [ + { + "name": "03Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "metadata": "{\"pskl\":{}}", + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "03Idle25", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "03Idle26", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "03Idle27", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "03Idle28", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "03Idle29", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "03Idle30", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "03Idle31", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "03Idle32", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "03Idle33", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "03Idle34", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "03Idle35", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "03Idle36", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + } + ] + } + ] + }, + { + "name": "03Walk", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "metadata": "{\"pskl\":{}}", + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "03Walk", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "03Walk2", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "03Walk3", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "03Walk4", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "03Walk5", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "03Walk6", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "03Walk7", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "03Walk8", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "03Walk9", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "03Walk10", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 28 + }, + { + "x": 32, + "y": 28 + }, + { + "x": 32, + "y": 40 + }, + { + "x": 0, + "y": 40 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "spr_4Way", + "persistentUuid": "0e24c193-6010-4988-84e4-84247e4111a6", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "TestRoom4Way.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 640, + "y": 0 + }, + { + "x": 640, + "y": 480 + }, + { + "x": 0, + "y": 480 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "spr_right", + "persistentUuid": "1e631ce1-545f-451f-9f16-36ae35076ff7", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [ + { + "name": "var_Random", + "persistentUuid": "22df5395-a194-44b8-bc37-bb550d070d01", + "type": "number", + "value": 0 + } + ], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "NewSprite", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "metadata": "{\"pskl\":{}}", + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "NewSprite4", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 32, + "y": 0 + }, + { + "x": 32, + "y": 32 + }, + { + "x": 0, + "y": 32 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "spr_LR", + "persistentUuid": "216f1ec8-083e-4ddc-8ecc-19dfe2b3e31d", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "TestRoomLR.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 640, + "y": 0 + }, + { + "x": 640, + "y": 480 + }, + { + "x": 0, + "y": 480 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "spr_UD", + "persistentUuid": "63a7090f-a6d8-4eb9-93ee-9e076596ce88", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "TestRoomUD.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 640, + "y": 0 + }, + { + "x": 640, + "y": 480 + }, + { + "x": 0, + "y": 480 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "spr_DeadL", + "persistentUuid": "cc600b8e-3783-4703-abe3-426832db2a92", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "TestRoomDeadL.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 640, + "y": 0 + }, + { + "x": 640, + "y": 480 + }, + { + "x": 0, + "y": 480 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "spr_DeadR", + "persistentUuid": "49f00013-44d6-443c-9ffe-0330d4559935", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "TestRoomDeadR.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 640, + "y": 0 + }, + { + "x": 640, + "y": 480 + }, + { + "x": 0, + "y": 480 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "spr_DeadUp", + "persistentUuid": "76f7a08f-18f4-4bf4-a4d2-9db38bad7409", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "TestRoomDeadU.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 640, + "y": 0 + }, + { + "x": 640, + "y": 480 + }, + { + "x": 0, + "y": 480 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "spr_DeadDown", + "persistentUuid": "24006229-fc36-4f86-8b51-c78029706d67", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "TestRoomDeadD.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 640, + "y": 0 + }, + { + "x": 640, + "y": 480 + }, + { + "x": 0, + "y": 480 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "spr_left", + "persistentUuid": "975b00e7-0480-4497-baaf-2030a83377fb", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [ + { + "name": "var_Random", + "persistentUuid": "ce81a637-0f6f-41db-a57b-8decaed70174", + "type": "number", + "value": 0 + } + ], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "NewSprite", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "metadata": "{\"pskl\":{}}", + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "NewSprite5", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 32, + "y": 0 + }, + { + "x": 32, + "y": 32 + }, + { + "x": 0, + "y": 32 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "spr_up", + "persistentUuid": "64de8436-160b-4de7-af7c-2e25f8e83b8b", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [ + { + "name": "var_Random", + "persistentUuid": "297f1f68-b1b2-42fd-90e3-ed8b0e5f8335", + "type": "number", + "value": 0 + } + ], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "NewSprite", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "metadata": "{\"pskl\":{}}", + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "NewSprite6", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 32, + "y": 0 + }, + { + "x": 32, + "y": 32 + }, + { + "x": 0, + "y": 32 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "spr_down", + "persistentUuid": "11b66a89-0299-4709-97bb-fbfd0e05d9ab", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [ + { + "name": "var_Random", + "persistentUuid": "01025634-8159-420e-b49c-09c609ea3e6a", + "type": "number", + "value": 0 + } + ], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "NewSprite", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "metadata": "{\"pskl\":{}}", + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "NewSprite7", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 32, + "y": 0 + }, + { + "x": 32, + "y": 32 + }, + { + "x": 0, + "y": 32 + } + ] + ] + } + ] + } + ] + } + ] + } + ], "objectsFolderStructure": { - "folderName": "__ROOT" + "folderName": "__ROOT", + "children": [ + { + "objectName": "spr_player" + }, + { + "objectName": "spr_4Way" + }, + { + "objectName": "spr_right" + }, + { + "objectName": "spr_left" + }, + { + "objectName": "spr_up" + }, + { + "objectName": "spr_down" + }, + { + "objectName": "spr_LR" + }, + { + "objectName": "spr_DeadUp" + }, + { + "objectName": "spr_DeadDown" + }, + { + "objectName": "spr_UD" + }, + { + "objectName": "spr_DeadL" + }, + { + "objectName": "spr_DeadR" + } + ] }, - "events": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Link", + "include": { + "includeConfig": 0 + }, + "target": "Functions" + } + ], "layers": [ { "ambientLightColorB": 200, @@ -172,12 +2571,13206 @@ } } ] + }, + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera2DPlaneMaxDrawingDistance": 5000, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "UI", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [ + { + "effectType": "Scene3D::HemisphereLight", + "name": "3D Ambient Hemisphere Light", + "doubleParameters": { + "elevation": 40, + "intensity": 0.33, + "rotation": 300 + }, + "stringParameters": { + "groundColor": "127;127;127", + "skyColor": "255;255;255", + "top": "Z+" + }, + "booleanParameters": {} + }, + { + "effectType": "Scene3D::DirectionalLight", + "name": "3D Sun Light", + "doubleParameters": { + "distanceFromCamera": 1500, + "elevation": 40, + "frustumSize": 4000, + "intensity": 0.75, + "minimumShadowBias": 0, + "rotation": 300 + }, + "stringParameters": { + "color": "255;255;255", + "shadowQuality": "medium", + "top": "Z+" + }, + "booleanParameters": { + "isCastingShadow": true + } + } + ] } ], - "behaviorsSharedData": [] + "behaviorsSharedData": [ + { + "name": "Animation", + "type": "AnimatableCapability::AnimatableBehavior" + }, + { + "name": "Effect", + "type": "EffectCapability::EffectBehavior" + }, + { + "name": "Flippable", + "type": "FlippableCapability::FlippableBehavior" + }, + { + "name": "Opacity", + "type": "OpacityCapability::OpacityBehavior" + }, + { + "name": "Resizable", + "type": "ResizableCapability::ResizableBehavior" + }, + { + "name": "Scale", + "type": "ScalableCapability::ScalableBehavior" + }, + { + "name": "TopDownMovement", + "type": "TopDownMovementBehavior::TopDownMovementBehavior" + } + ] } ], - "externalEvents": [], - "eventsFunctionsExtensions": [], - "externalLayouts": [] + "externalEvents": [ + { + "associatedLayout": "Game", + "name": "Functions", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Scene Start", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SceneJustBegins" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ZoomCamera" + }, + "parameters": [ + "", + "0", + "", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Generate Rooms", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Right" + }, + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "spr_right", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PickRandomInstance" + }, + "parameters": [ + "", + "spr_right" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberObjectVariable" + }, + "parameters": [ + "spr_right", + "var_Random", + "=", + "RandomInRange(1,6)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "var_roomCount", + "<=", + "8" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "spr_right", + "var_Random", + ">=", + "1" + ] + }, + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "spr_right", + "var_Random", + "<=", + "3" + ] + } + ], + "actions": [ + { + "type": { + "value": "BuiltinExternalLayouts::CreateObjectsFromExternalLayout" + }, + "parameters": [ + "", + "\"LR\"", + "spr_right.X()", + "spr_right.Y()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "spr_right", + "var_Random", + ">=", + "4" + ] + }, + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "spr_right", + "var_Random", + "<=", + "5" + ] + } + ], + "actions": [ + { + "type": { + "value": "BuiltinExternalLayouts::CreateObjectsFromExternalLayout" + }, + "parameters": [ + "", + "\"DeadR\"", + "spr_right.X()", + "spr_right.Y()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "spr_right", + "var_Random", + "=", + "6" + ] + } + ], + "actions": [ + { + "type": { + "value": "BuiltinExternalLayouts::CreateObjectsFromExternalLayout" + }, + "parameters": [ + "", + "\"4Way\"", + "spr_right.X()", + "spr_right.Y()", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "var_roomCount", + ">", + "8" + ] + } + ], + "actions": [ + { + "type": { + "value": "BuiltinExternalLayouts::CreateObjectsFromExternalLayout" + }, + "parameters": [ + "", + "\"DeadR\"", + "spr_right.X()", + "spr_right.Y()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PickNearest" + }, + "parameters": [ + "spr_left", + "spr_right.X()", + "spr_right.Y()", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "spr_left", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "spr_right", + "" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "var_roomCount", + "+", + "1" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Left" + }, + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "spr_left", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PickRandomInstance" + }, + "parameters": [ + "", + "spr_left" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberObjectVariable" + }, + "parameters": [ + "spr_left", + "var_Random", + "=", + "RandomInRange(1,6)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "var_roomCount", + "<=", + "8" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "spr_left", + "var_Random", + ">=", + "1" + ] + }, + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "spr_left", + "var_Random", + "<=", + "3" + ] + } + ], + "actions": [ + { + "type": { + "value": "BuiltinExternalLayouts::CreateObjectsFromExternalLayout" + }, + "parameters": [ + "", + "\"LR\"", + "spr_left.X()", + "spr_left.Y()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "spr_left", + "var_Random", + ">=", + "4" + ] + }, + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "spr_left", + "var_Random", + "<=", + "5" + ] + } + ], + "actions": [ + { + "type": { + "value": "BuiltinExternalLayouts::CreateObjectsFromExternalLayout" + }, + "parameters": [ + "", + "\"DeadL\"", + "spr_left.X()", + "spr_left.Y()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "spr_left", + "var_Random", + "=", + "6" + ] + } + ], + "actions": [ + { + "type": { + "value": "BuiltinExternalLayouts::CreateObjectsFromExternalLayout" + }, + "parameters": [ + "", + "\"4Way\"", + "spr_left.X()", + "spr_left.Y()", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "var_roomCount", + ">", + "8" + ] + } + ], + "actions": [ + { + "type": { + "value": "BuiltinExternalLayouts::CreateObjectsFromExternalLayout" + }, + "parameters": [ + "", + "\"DeadL\"", + "spr_left.X()", + "spr_left.Y()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PickNearest" + }, + "parameters": [ + "spr_right", + "spr_left.X()", + "spr_left.Y()", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "spr_right", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "spr_left", + "" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "var_roomCount", + "+", + "1" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Up" + }, + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "spr_up", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PickRandomInstance" + }, + "parameters": [ + "", + "spr_up" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberObjectVariable" + }, + "parameters": [ + "spr_up", + "var_Random", + "=", + "RandomInRange(1,6)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "var_roomCount", + "<=", + "8" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "spr_up", + "var_Random", + ">=", + "1" + ] + }, + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "spr_up", + "var_Random", + "<=", + "3" + ] + } + ], + "actions": [ + { + "type": { + "value": "BuiltinExternalLayouts::CreateObjectsFromExternalLayout" + }, + "parameters": [ + "", + "\"UD\"", + "spr_up.X()", + "spr_up.Y()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "spr_up", + "var_Random", + ">=", + "4" + ] + }, + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "spr_up", + "var_Random", + "<=", + "5" + ] + } + ], + "actions": [ + { + "type": { + "value": "BuiltinExternalLayouts::CreateObjectsFromExternalLayout" + }, + "parameters": [ + "", + "\"DeadUp\"", + "spr_up.X()", + "spr_up.Y()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "spr_up", + "var_Random", + "=", + "6" + ] + } + ], + "actions": [ + { + "type": { + "value": "BuiltinExternalLayouts::CreateObjectsFromExternalLayout" + }, + "parameters": [ + "", + "\"4Way\"", + "spr_up.X()", + "spr_up.Y()", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "var_roomCount", + ">", + "8" + ] + } + ], + "actions": [ + { + "type": { + "value": "BuiltinExternalLayouts::CreateObjectsFromExternalLayout" + }, + "parameters": [ + "", + "\"DeadUp\"", + "spr_up.X()", + "spr_up.Y()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PickNearest" + }, + "parameters": [ + "spr_down", + "spr_up.X()", + "spr_up.Y()", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "spr_down", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "spr_up", + "" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "var_roomCount", + "+", + "1" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Down" + }, + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "spr_down", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PickRandomInstance" + }, + "parameters": [ + "", + "spr_down" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberObjectVariable" + }, + "parameters": [ + "spr_down", + "var_Random", + "=", + "RandomInRange(1,6)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "var_roomCount", + "<=", + "8" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "spr_down", + "var_Random", + ">=", + "1" + ] + }, + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "spr_down", + "var_Random", + "<=", + "3" + ] + } + ], + "actions": [ + { + "type": { + "value": "BuiltinExternalLayouts::CreateObjectsFromExternalLayout" + }, + "parameters": [ + "", + "\"UD\"", + "spr_down.X()", + "spr_down.Y()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "spr_down", + "var_Random", + ">=", + "4" + ] + }, + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "spr_down", + "var_Random", + "<=", + "5" + ] + } + ], + "actions": [ + { + "type": { + "value": "BuiltinExternalLayouts::CreateObjectsFromExternalLayout" + }, + "parameters": [ + "", + "\"DeadDown\"", + "spr_down.X()", + "spr_down.Y()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "spr_down", + "var_Random", + "=", + "6" + ] + } + ], + "actions": [ + { + "type": { + "value": "BuiltinExternalLayouts::CreateObjectsFromExternalLayout" + }, + "parameters": [ + "", + "\"4Way\"", + "spr_down.X()", + "spr_down.Y()", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "var_roomCount", + ">", + "8" + ] + } + ], + "actions": [ + { + "type": { + "value": "BuiltinExternalLayouts::CreateObjectsFromExternalLayout" + }, + "parameters": [ + "", + "\"DeadDown\"", + "spr_down.X()", + "spr_down.Y()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PickNearest" + }, + "parameters": [ + "spr_up", + "spr_down.X()", + "spr_down.Y()", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "spr_up", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "spr_down", + "" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "var_roomCount", + "+", + "1" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Movement/Sprite Control", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TopDownMovementBehavior::TopDownMovementBehavior::IsUsingControl" + }, + "parameters": [ + "spr_player", + "TopDownMovement", + "\"Right\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TopDownMovementBehavior::TopDownMovementBehavior::IsMovementAngleAround" + }, + "parameters": [ + "spr_player", + "TopDownMovement", + "0", + "45" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "FlippableCapability::FlippableBehavior::FlipX" + }, + "parameters": [ + "spr_player", + "Flippable", + "no" + ] + }, + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "spr_player", + "Animation", + "=", + "\"03Walk\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TopDownMovementBehavior::TopDownMovementBehavior::IsMovementAngleAround" + }, + "parameters": [ + "spr_player", + "TopDownMovement", + "180", + "45" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "FlippableCapability::FlippableBehavior::FlipX" + }, + "parameters": [ + "spr_player", + "Flippable", + "yes" + ] + }, + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "spr_player", + "Animation", + "=", + "\"03Walk\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "TopDownMovementBehavior::IsMoving" + }, + "parameters": [ + "spr_player", + "TopDownMovement" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "spr_player", + "Animation", + "=", + "\"03Idle\"" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Camera Control", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "spr_player", + "Rooms", + "", + "", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "RoomBasedCameraMovement::MoveCameraToActiveRoom" + }, + "parameters": [ + "", + "Rooms", + "spr_player", + "", + "", + "0", + "", + "", + "0", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "KeyFromTextReleased" + }, + "parameters": [ + "", + "\"Space\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Scene" + }, + "parameters": [ + "", + "\"Game\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "Rooms", + "Rooms", + "", + "", + "yes" + ] + } + ], + "actions": [ + { + "type": { + "value": "Scene" + }, + "parameters": [ + "", + "\"Game\"", + "" + ] + } + ] + } + ] + } + ], + "eventsFunctionsExtensions": [ + { + "author": "", + "category": "Camera", + "dimension": "2D", + "extensionNamespace": "", + "fullName": "Smooth Camera", + "gdevelopVersion": ">=5.5.222", + "helpPath": "/tutorials/follow-player-with-camera/", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQoJLnN0MXtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwO30NCjwvc3R5bGU+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjQsMTNoLTZjLTEuMSwwLTItMC45LTItMlY1YzAtMS4xLDAuOS0yLDItMmg2YzEuMSwwLDIsMC45LDIsMnY2QzI2LDEyLjEsMjUuMSwxMywyNCwxM3oiLz4NCjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0yNiw4djEwYzAsMS4xLTAuOSwyLTIsMkg4Yy0xLjEsMC0yLTAuOS0yLTJWOGMwLTEuMSwwLjktMiwyLTJoOCIvPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjEiIGN5PSI4IiByPSIyIi8+DQo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxMSIgY3k9IjE2IiByPSIxIi8+DQo8cmVjdCB4PSI5IiB5PSI5IiBjbGFzcz0ic3QwIiB3aWR0aD0iNCIgaGVpZ2h0PSIzIi8+DQo8cG9seWxpbmUgY2xhc3M9InN0MCIgcG9pbnRzPSIyMSwyOSAyMSwyOSAxMSwyOSAxMSwyOSAiLz4NCjxwb2x5bGluZSBjbGFzcz0ic3QwIiBwb2ludHM9IjE4LDIwIDE4LDI5IDE0LDI5IDE0LDIwICIvPg0KPHJlY3QgeD0iNyIgeT0iMyIgY2xhc3M9InN0MCIgd2lkdGg9IjQiIGhlaWdodD0iMyIvPg0KPC9zdmc+DQo=", + "name": "SmoothCamera", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Computers and Hardware/Computers and Hardware_camcoder_gopro_go_pro_camera.svg", + "shortDescription": "Smoothly scroll to follow an object.", + "version": "0.4.5", + "description": [ + "The camera follows an object according to:", + "- a frame rate independent catch-up speed to make the scrolling from smooth to strong", + "- a maximum speed to do linear following ([open the project online](https://editor.gdevelop.io/?project=example://platformer-with-tilemap)) or slow down the camera when teleporting the object", + "- a follow-free zone to avoid scrolling on small movements", + "- an offset to see further in one direction", + "- an extra delay and catch-up speed to give an impression of speed (useful for dash)", + "- position forecasting and delay to simulate a cameraman response time", + "", + "A platformer dedicated behavior allows to switch of settings when the character is in air or on the floor. This can be used to stabilize the camera when jumping." + ], + "origin": { + "identifier": "SmoothCamera", + "name": "gdevelop-extension-store" + }, + "tags": [ + "camera", + "scrolling", + "follow", + "smooth", + "platformer", + "platform" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsFunctionsFolderStructure": { + "folderName": "__ROOT" + }, + "eventsBasedBehaviors": [ + { + "description": "Smoothly scroll to follow an object.", + "fullName": "Smooth Camera", + "helpPath": "", + "iconUrl": "", + "name": "SmoothCamera", + "objectType": "", + "previewIconUrl": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update private properties through setters to check their values and initialize state." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetLeftwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "LeftwardSpeed", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetRightwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "RightwardSpeed", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "UpwardSpeed", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "DownwardSpeed", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetLeftwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "LeftwardSpeedMax", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetRightwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "RightwardSpeedMax", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "UpwardSpeedMax", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "DownwardSpeedMax", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaLeft" + }, + "parameters": [ + "Object", + "Behavior", + "FollowFreeAreaLeft", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaRight" + }, + "parameters": [ + "Object", + "Behavior", + "FollowFreeAreaRight", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "FollowFreeAreaTop", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "Behavior", + "FollowFreeAreaBottom", + "log(1 - )" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CameraDelay", + "=", + "CameraDelay" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "IsCalledManually", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::DoMoveCameraCloser" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Move the camera closer to the object. This action must be called after the object has moved for the frame.", + "fullName": "Move the camera closer", + "functionType": "Action", + "name": "MoveCameraCloser", + "sentence": "Move the camera closer to _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The camera following is called with an action, the call from doStepPreEvents must be disabled to avoid to do it twice." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsCalledManually", + "True", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::DoMoveCameraCloser" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Move the camera closer to the object.", + "fullName": "Do move the camera closer", + "functionType": "Action", + "name": "DoMoveCameraCloser", + "private": true, + "sentence": "Do move the camera closer _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Delaying and forecasting can be used at the same time.\nForecasting only use the positions that are older than the one used for delaying.\nThe behavior uses a position history that is split in 2 arrays:\n- one for delaying the position (from TimeFromStart to TimeFromStart - CamearDelay)\n- one for forecasting the position (from TimeFromStart - CamearDelay to TimeFromStart - CamearDelay - ForecastHistoryDuration" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::UpdateDelayedPosition" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::UpdateForecastedPosition" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "At each frame, the camera must catchup the target by a given ratio (speed)\ncameraX(t) - targetX = (cameraX(t - 1) - targetX) * speed\n\nThe frame rate must not impact on the catch-up speed, we don't want a speed in ratio per frame but a speed ratio per second, like this:\ncameraX(t) - targetX = (cameraX(t - 1s) - targetX) * speed\n\nOk, but we still need to process each frame, we can use a exponent for this:\ncameraX(t) - targetX = (cameraX(t - timeDelta) - targetX) * speed^timeDelta\ncameraX(t) = targetX + (cameraX(t - timeDelta) - targetX) * exp(timeDelta * ln(speed))\n\npow is probably more efficient than precalculated log if the speed is changed continuously but this might be rare enough." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "FollowOnX", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "OldX", + "=", + "CameraX(Object.Layer(), 0)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraCenterX" + }, + "parameters": [ + "", + ">", + "Object.Behavior::FreeAreaRight()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraCenterX" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaRight()\n+ (CameraX(Object.Layer(), 0) - Object.Behavior::FreeAreaRight())\n* exp(TimeDelta() * LogLeftwardSpeed)", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraCenterX" + }, + "parameters": [ + "", + "<", + "OldX - LeftwardSpeedMax * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraCenterX" + }, + "parameters": [ + "", + "=", + "OldX - LeftwardSpeedMax * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraCenterX" + }, + "parameters": [ + "", + "<", + "Object.Behavior::FreeAreaLeft()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraCenterX" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaLeft()\n+ (CameraX(Object.Layer(), 0) - Object.Behavior::FreeAreaLeft())\n* exp(TimeDelta() * LogRightwardSpeed)", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraCenterX" + }, + "parameters": [ + "", + ">", + "OldX + RightwardSpeedMax * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraCenterX" + }, + "parameters": [ + "", + "=", + "OldX + RightwardSpeedMax * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "FollowOnY", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "OldY", + "=", + "CameraY(Object.Layer(), 0)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraCenterY" + }, + "parameters": [ + "", + ">", + "Object.Behavior::FreeAreaBottom()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraCenterY" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaBottom()\n+ (CameraY(Object.Layer(), 0) - Object.Behavior::FreeAreaBottom())\n* exp(TimeDelta() * LogUpwardSpeed)", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraCenterY" + }, + "parameters": [ + "", + "<", + "OldY - UpwardSpeedMax * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraCenterY" + }, + "parameters": [ + "", + "=", + "OldY - UpwardSpeedMax * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraCenterY" + }, + "parameters": [ + "", + "<", + "Object.Behavior::FreeAreaTop()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraCenterY" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaTop()\n+ (CameraY(Object.Layer(), 0) - Object.Behavior::FreeAreaTop())\n* exp(TimeDelta() * LogDownwardSpeed)", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraCenterY" + }, + "parameters": [ + "", + ">", + "OldY + DownwardSpeedMax * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraCenterY" + }, + "parameters": [ + "", + "=", + "OldY + DownwardSpeedMax * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Delay the camera according to a maximum speed and catch up the delay.", + "fullName": "Wait and catch up", + "functionType": "Action", + "name": "WaitAndCatchUp", + "sentence": "Delay the camera of _PARAM0_ during: _PARAM2_ seconds according to the maximum speed _PARAM3_;_PARAM4_ seconds and catch up in _PARAM5_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Maybe the catch-up show be done in constant pixel speed instead of constant time speed." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "WaitingEnd", + "=", + "TimeFromStart() + NewWaitingDuration" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "WaitingSpeedXMax", + "=", + "NewWaitingSpeedXMax" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "WaitingSpeedYMax", + "=", + "NewWaitingSpeedYMax" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CameraDelayCatchUpDuration", + "=", + "NewCatchUpDuration" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Wait and catch up\"", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Waiting duration (in seconds)", + "name": "NewWaitingDuration", + "type": "expression" + }, + { + "description": "Waiting maximum camera target speed X", + "name": "NewWaitingSpeedXMax", + "type": "expression" + }, + { + "description": "Waiting maximum camera target speed Y", + "name": "NewWaitingSpeedYMax", + "type": "expression" + }, + { + "description": "Catch up duration (in seconds)", + "name": "NewCatchUpDuration", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Draw the targeted and actual camera position.", + "fullName": "Draw debug", + "functionType": "Action", + "name": "DrawDebug", + "sentence": "Draw targeted and actual camera position for _PARAM0_ on _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "ShapePainter", + "=", + "0" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Path used by the forecasting", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "=", + "0" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::OutlineColor" + }, + "parameters": [ + "ShapePainter", + "\"245;166;35\"" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::BeginFillPath" + }, + "parameters": [ + "ShapePainter", + "Object.Variable(__SmoothCamera.ForecastHistoryX[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[0])" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::PathLineTo" + }, + "parameters": [ + "ShapePainter", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Index])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Index])" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::EndFillPath" + }, + "parameters": [ + "ShapePainter" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Follow-free area.", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "FollowFreeAreaLeft", + "!=", + "0" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "FollowFreeAreaRight", + "!=", + "0" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "FollowFreeAreaTop", + "!=", + "0" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "FollowFreeAreaBottom", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::OutlineColor" + }, + "parameters": [ + "ShapePainter", + "\"126;211;33\"" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "ShapePainter", + "Object.Behavior::FreeAreaLeft() - 1", + "Object.Behavior::FreeAreaTop() - 1", + "Object.Behavior::FreeAreaRight() + 1", + "Object.Behavior::FreeAreaBottom() + 1" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Linear regression vector used by the forecasting.", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::OutlineColor" + }, + "parameters": [ + "ShapePainter", + "\"208;2;27\"" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::LineV2" + }, + "parameters": [ + "ShapePainter", + "ProjectedOldestX", + "ProjectedOldestY", + "ProjectedNewestX", + "ProjectedNewestY", + "1" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Targeted and actual camera position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Circle" + }, + "parameters": [ + "ShapePainter", + "ForecastedX", + "ForecastedY", + "3" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::LineV2" + }, + "parameters": [ + "ShapePainter", + "CameraX(Object.Layer(), 0)", + "CameraY(Object.Layer(), 0) - 4", + "CameraX(Object.Layer(), 0)", + "CameraY(Object.Layer(), 0) + 4", + "1" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::LineV2" + }, + "parameters": [ + "ShapePainter", + "CameraX(Object.Layer(), 0) - 4", + "CameraY(Object.Layer(), 0)", + "CameraX(Object.Layer(), 0) + 4", + "CameraY(Object.Layer(), 0)", + "1" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Shape painter", + "name": "ShapePainter", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Enable or disable the following on X axis.", + "fullName": "Follow on X", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowOnX", + "sentence": "The camera follows _PARAM0_ on X axis: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "FollowOnX", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Value", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "FollowOnX", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow on X axis", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Enable or disable the following on Y axis.", + "fullName": "Follow on Y", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowOnY", + "sentence": "The camera follows _PARAM0_ on Y axis: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "FollowOnY", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Value", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "FollowOnY", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow on Y axis", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area right border.", + "fullName": "Follow free area right border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaRight", + "sentence": "Change the camera follow free area right border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FollowFreeAreaRight", + "=", + "max(0, Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area right border", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area left border.", + "fullName": "Follow free area left border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaLeft", + "sentence": "Change the camera follow free area left border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FollowFreeAreaLeft", + "=", + "max(0, Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area left border", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area top border.", + "fullName": "Follow free area top border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaTop", + "sentence": "Change the camera follow free area top border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FollowFreeAreaTop", + "=", + "max(0, Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area top border", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area bottom border.", + "fullName": "Follow free area bottom border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaBottom", + "sentence": "Change the camera follow free area bottom border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FollowFreeAreaBottom", + "=", + "max(0, Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area bottom border", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera leftward maximum speed (in pixels per second).", + "fullName": "Leftward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetLeftwardSpeedMax", + "sentence": "Change the camera leftward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "LeftwardSpeedMax", + "=", + "max(0, Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Leftward maximum speed (in pixels per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera rightward maximum speed (in pixels per second).", + "fullName": "Rightward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetRightwardSpeedMax", + "sentence": "Change the camera rightward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "RightwardSpeedMax", + "=", + "max(0, Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Rightward maximum speed (in pixels per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera upward maximum speed (in pixels per second).", + "fullName": "Upward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetUpwardSpeedMax", + "sentence": "Change the camera upward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "UpwardSpeedMax", + "=", + "max(0, Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Upward maximum speed (in pixels per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera downward maximum speed (in pixels per second).", + "fullName": "Downward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetDownwardSpeedMax", + "sentence": "Change the camera downward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DownwardSpeedMax", + "=", + "max(0, Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Downward maximum speed (in pixels per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera leftward catch-up speed (in ratio per second).", + "fullName": "Leftward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetLeftwardSpeed", + "sentence": "Change the camera leftward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "LeftwardSpeed", + "=", + "clamp(0, 1, Value)" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "LogLeftwardSpeed", + "=", + "log(1 - Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Leftward catch-up speed (in ratio per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera rightward catch-up speed (in ratio per second).", + "fullName": "Rightward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetRightwardSpeed", + "sentence": "Change the camera rightward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "RightwardSpeed", + "=", + "clamp(0, 1, Value)" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "LogRightwardSpeed", + "=", + "log(1 - Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Rightward catch-up speed (in ratio per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera downward catch-up speed (in ratio per second).", + "fullName": "Downward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetDownwardSpeed", + "sentence": "Change the camera downward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DownwardSpeed", + "=", + "clamp(0, 1, Value)" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "LogDownwardSpeed", + "=", + "log(1 - Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Downward catch-up speed (in ratio per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera upward catch-up speed (in ratio per second).", + "fullName": "Upward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetUpwardSpeed", + "sentence": "Change the camera upward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "UpwardSpeed", + "=", + "clamp(0, 1, Value)" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "LogUpwardSpeed", + "=", + "log(1 - Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Upward catch-up speed (in ratio per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the camera offset on X axis of the object. This is not the current difference between the object and the camera position.", + "fullName": "Camera offset X", + "functionType": "ExpressionAndCondition", + "group": "Camera configuration", + "name": "OffsetX", + "sentence": "the camera offset on X axis", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "CameraOffsetX" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "OffsetX", + "group": "Camera configuration", + "name": "SetOffsetXOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CameraOffsetX", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera offset on X axis of an object.", + "fullName": "Camera Offset X", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetOffsetX", + "private": true, + "sentence": "Change the camera offset on X axis of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Deprecated use SetOffsetXOp instead." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetOffsetXOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Camera offset X", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the camera offset on Y axis of the object. This is not the current difference between the object and the camera position.", + "fullName": "Camera offset Y", + "functionType": "ExpressionAndCondition", + "group": "Camera configuration", + "name": "OffsetY", + "sentence": "the camera offset on Y axis", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "CameraOffsetY" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "OffsetY", + "group": "Camera configuration", + "name": "SetOffsetYOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CameraOffsetY", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera offset on Y axis of an object.", + "fullName": "Camera Offset Y", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetOffsetY", + "private": true, + "sentence": "Change the camera offset on Y axis of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Deprecated use SetOffsetYOp instead." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetOffsetYOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "CameraOffsetY", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Camera offset Y", + "name": "CameraOffsetY", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera forecast time (in seconds).", + "fullName": "Forecast time", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetForecastTime", + "sentence": "Change the camera forecast time of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastTime", + "=", + "min(0, Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Forecast time", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera delay (in seconds).", + "fullName": "Camera delay", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetCameraDelay", + "sentence": "Change the camera delay of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CameraDelay", + "=", + "max(0, Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Camera delay", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area left border X.", + "fullName": "Free area left", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaLeft", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ForecastedX + CameraOffsetX - FollowFreeAreaLeft" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area right border X.", + "fullName": "Free area right", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaRight", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ForecastedX + CameraOffsetX + FollowFreeAreaRight" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area bottom border Y.", + "fullName": "Free area bottom", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaBottom", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ForecastedY + CameraOffsetY + FollowFreeAreaBottom" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area top border Y.", + "fullName": "Free area top", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaTop", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ForecastedY + CameraOffsetY - FollowFreeAreaTop" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Update delayed position and delayed history. This is called in doStepPreEvents.", + "fullName": "Update delayed position", + "functionType": "Action", + "group": "Private", + "name": "UpdateDelayedPosition", + "private": true, + "sentence": "Update delayed position and delayed history of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add the previous position to have enough (2) positions to evaluate the extra delay for waiting mode." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ObjectTime)", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime", + "TimeFromStart()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX", + "DelayedCenterX" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY", + "DelayedCenterY" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Use the object center when no delay is asked." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DelayedCenterX", + "=", + "Object.CenterX()" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DelayedCenterY", + "=", + "Object.CenterY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsDelayed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::AddForecastHistoryPosition" + }, + "parameters": [ + "Object", + "Behavior", + "TimeFromStart()", + "Object.CenterX()", + "Object.CenterY()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsDelayed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime", + "TimeFromStart()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX", + "Object.CenterX()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY", + "Object.CenterY()" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Remove history entries that are too old to be useful for delaying and pass it to the history for forecasting." + }, + { + "infiniteLoopWarning": true, + "type": "BuiltinCommonInstructions::While", + "whileConditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ObjectTime)", + ">=", + "2" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime[1]", + "<", + "TimeFromStart() - Object.Behavior::CurrentDelay()" + ] + } + ], + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::AddForecastHistoryPosition" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Variable(__SmoothCamera.ObjectTime[0])", + "Object.Variable(__SmoothCamera.ObjectX[0])", + "Object.Variable(__SmoothCamera.ObjectY[0])", + "" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Don't move the camera if there is not enough history." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DelayedCenterX", + "=", + "Object.Variable(__SmoothCamera.ObjectX[0])" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DelayedCenterY", + "=", + "Object.Variable(__SmoothCamera.ObjectY[0])" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ObjectTime)", + ">=", + "2" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime[0]", + "<", + "TimeFromStart() - Object.Behavior::CurrentDelay()" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add the extra delay that could be needed to respect the speed limit in waiting mode.\n\nspeedRatio = min(speedMaxX / historySpeedX, speedMaxY / historySpeedY)\ndelay += min(0, timeDelta * (1 - speedRatio))" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CameraExtraDelay", + "+", + "max(0, TimeDelta() * (1 - min(WaitingSpeedXMax * abs(Object.Variable(__SmoothCamera.ObjectX[1]) - Object.Variable(__SmoothCamera.ObjectX[0])), WaitingSpeedYMax * abs(Object.Variable(__SmoothCamera.ObjectY[1]) - Object.Variable(__SmoothCamera.ObjectY[0]))) / (Object.Variable(__SmoothCamera.ObjectTime[1]) - Object.Variable(__SmoothCamera.ObjectTime[0]))))" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Extra delay: \" + ToString(CameraExtraDelay)", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The time with delay is now between the first 2 indexes" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DelayedCenterX", + "=", + "lerp(Object.Variable(__SmoothCamera.ObjectX[1]), Object.Variable(__SmoothCamera.ObjectX[0]), ((TimeFromStart() - Object.Behavior::CurrentDelay()) - Object.Variable(__SmoothCamera.ObjectTime[1])) / (Object.Variable(__SmoothCamera.ObjectTime[0]) - Object.Variable(__SmoothCamera.ObjectTime[1])))" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DelayedCenterY", + "=", + "lerp(Object.Variable(__SmoothCamera.ObjectY[1]), Object.Variable(__SmoothCamera.ObjectY[0]), ((TimeFromStart() - Object.Behavior::CurrentDelay()) - Object.Variable(__SmoothCamera.ObjectTime[1])) / (Object.Variable(__SmoothCamera.ObjectTime[0]) - Object.Variable(__SmoothCamera.ObjectTime[1])))" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsDelayed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariableClearChildren" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime" + ] + }, + { + "type": { + "value": "ObjectVariableClearChildren" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX" + ] + }, + { + "type": { + "value": "ObjectVariableClearChildren" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CameraDelayCatchUpSpeed", + "=", + "CameraExtraDelay / CameraDelayCatchUpDuration" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Start to catch up\"", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CameraExtraDelay", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CameraExtraDelay", + "=", + "max(0, CameraExtraDelay -CameraDelayCatchUpSpeed * TimeDelta())" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Catching up delay: \" + ToString(CameraExtraDelay)", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the camera following target is delayed from the object.", + "fullName": "Camera is delayed", + "functionType": "Condition", + "name": "IsDelayed", + "private": true, + "sentence": "The camera of _PARAM0_ is delayed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentDelay()", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the current camera delay.", + "fullName": "Current delay", + "functionType": "Expression", + "name": "CurrentDelay", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "CameraDelay + CameraExtraDelay" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the camera following is waiting at a reduced speed.", + "fullName": "Camera is waiting", + "functionType": "Condition", + "name": "IsWaiting", + "private": true, + "sentence": "The camera of _PARAM0_ is waiting", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "WaitingEnd", + ">", + "TimeFromStart()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Add a position to the history for forecasting. This is called 2 times in UpadteDelayedPosition.", + "fullName": "Add forecast history position", + "functionType": "Action", + "group": "Private", + "name": "AddForecastHistoryPosition", + "private": true, + "sentence": "Add the time:_PARAM2_ and position: _PARAM3_; _PARAM4_ to the forecast history of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "ForecastHistoryDuration", + ">", + "0" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "ForecastTime", + ">", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryTime", + "Time" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryX", + "ObjectX" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryY", + "ObjectY" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Remove history entries that are too old to be useful.\nKeep at least 2 positions because no forecast can be done with less positions." + }, + { + "infiniteLoopWarning": true, + "type": "BuiltinCommonInstructions::While", + "whileConditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)", + ">=", + "3" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryTime[0]", + "<", + "TimeFromStart() - CameraDelay - CameraExtraDelay - ForecastHistoryDuration" + ] + } + ], + "conditions": [], + "actions": [ + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryTime", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryX", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryY", + "0" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Time", + "name": "Time", + "type": "expression" + }, + { + "description": "Object X", + "name": "ObjectX", + "type": "expression" + }, + { + "description": "Object Y", + "name": "ObjectY", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Update forecasted position. This is called in doStepPreEvents.", + "fullName": "Update forecasted position", + "functionType": "Action", + "group": "Private", + "name": "UpdateForecastedPosition", + "private": true, + "sentence": "Update forecasted position of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastedX", + "=", + "DelayedCenterX" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastedY", + "=", + "DelayedCenterY" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Simple linear regression\ny = A * x + B\n\nA = Covariance / VarianceX\nB = MeanY - A * MeanX\n\nNote than we could use only one position every N positions to reduce the process time,\nbut if we really need efficient process JavaScript and circular queues are a must." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)", + ">=", + "2" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "ForecastHistoryDuration", + ">", + "0" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "ForecastTime", + ">", + "0" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Mean X", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryMeanX", + "=", + "0" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryMeanX", + "+", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Index])" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryMeanX", + "/", + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Mean Y", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryMeanY", + "=", + "0" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryY)", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryMeanY", + "+", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Index])" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryMeanY", + "/", + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryY)" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Mean: \" + ToString(ForecastHistoryMeanX) + \" \" + ToString(ForecastHistoryMeanY)", + "", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Variance and Covariance", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "VarianceX = sum((X[i] - MeanX)²)\nVarianceY = sum((Y[i] - MeanY)²)\nCovariance = sum((X[i] - MeanX) * (Y[i] - MeanY))" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryVarianceX", + "=", + "0" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryVarianceY", + "=", + "0" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryCovariance", + "=", + "0" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryVarianceX", + "+", + "pow(Object.Variable(__SmoothCamera.ForecastHistoryX[Index]) - ForecastHistoryMeanX, 2)" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryVarianceY", + "+", + "pow(Object.Variable(__SmoothCamera.ForecastHistoryY[Index]) - ForecastHistoryMeanY, 2)" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryCovariance", + "+", + "(Object.Variable(__SmoothCamera.ForecastHistoryX[Index]) - ForecastHistoryMeanX)\n*\n(Object.Variable(__SmoothCamera.ForecastHistoryY[Index]) - ForecastHistoryMeanY)" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "+", + "1" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Variances: \" + ToString(ForecastHistoryVarianceX) + \" \" + ToString(ForecastHistoryVarianceY) + \" \" + ToString(ForecastHistoryCovariance)", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "abs(ForecastHistoryVarianceX)", + "<", + "1" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "abs(ForecastHistoryVarianceY)", + "<", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastedX", + "=", + "DelayedCenterX" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastedY", + "=", + "DelayedCenterY" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "abs(ForecastHistoryVarianceX)", + ">=", + "1" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "abs(ForecastHistoryVarianceY)", + ">=", + "1" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Linear function parameters", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "y = A * x + B\n\nA = Covariance / VarianceX\nB = MeanY - A * MeanX" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "abs(ForecastHistoryVarianceX)", + ">=", + "abs(ForecastHistoryVarianceY)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryLinearA", + "=", + "ForecastHistoryCovariance / ForecastHistoryVarianceX" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryLinearB", + "=", + "ForecastHistoryMeanY - ForecastHistoryLinearA * ForecastHistoryMeanX" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Linear: \" + ToString(ForecastHistoryLinearA) + \" \" + ToString(ForecastHistoryLinearB)", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Projection", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::ProjectHistoryEnds" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Variable(__SmoothCamera.ForecastHistoryX[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Object.VariableChildCount(__SmoothCamera.ForecastHistoryX) - 1])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Object.VariableChildCount(__SmoothCamera.ForecastHistoryY) - 1])", + "" + ] + } + ] + } + ], + "parameters": [] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Axis permutation to avoid a ratio between 2 numbers near 0." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "abs(ForecastHistoryVarianceX)", + "<", + "abs(ForecastHistoryVarianceY)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryLinearA", + "=", + "ForecastHistoryCovariance / ForecastHistoryVarianceY" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryLinearB", + "=", + "ForecastHistoryMeanX - ForecastHistoryLinearA * ForecastHistoryMeanY" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Linear: \" + ToString(ForecastHistoryLinearA) + \" \" + ToString(ForecastHistoryLinearB)", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Projection", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::ProjectHistoryEnds" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Variable(__SmoothCamera.ForecastHistoryY[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryX[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Object.VariableChildCount(__SmoothCamera.ForecastHistoryY) - 1])", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Object.VariableChildCount(__SmoothCamera.ForecastHistoryX) - 1])", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Permute back axis" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "=", + "ProjectedOldestX" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ProjectedOldestX", + "=", + "ProjectedOldestY" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ProjectedOldestY", + "=", + "Index" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "=", + "ProjectedNewestX" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ProjectedNewestX", + "=", + "ProjectedNewestY" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ProjectedNewestY", + "=", + "Index" + ] + } + ] + } + ], + "parameters": [] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Oldest: \" + ToString(ProjectedOldestX) + \" \" + ToString(ProjectedOldestY)", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Newest: \" + ToString(ProjectedNewestX) + \" \" + ToString(ProjectedNewestY)", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Forecasted position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastedX", + "=", + "ProjectedNewestX + ( ProjectedNewestX - ProjectedOldestX) * Object.Behavior::ForecastTimeRatio()" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastedY", + "=", + "ProjectedNewestY + ( ProjectedNewestY - ProjectedOldestY) * Object.Behavior::ForecastTimeRatio()" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Forecasted: \" + ToString(ForecastedX) + \" \" + ToString(ForecastedY)", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Project history ends position to have the vector on the line from linear regression. This function is only called by UpdateForecastedPosition.", + "fullName": "Project history ends", + "functionType": "Action", + "group": "Private", + "name": "ProjectHistoryEnds", + "private": true, + "sentence": "Project history oldest: _PARAM2_;_PARAM3_ and newest position: _PARAM4_;_PARAM5_ of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Perpendicular line:\npA = -1/a; \npB = -pA * x + y\n\nIntersection:\n/ ProjectedY = a * ProjectedX + b\n\\ ProjectedY = pA * ProjectedX + b\n\nSolution that is cleaned out from indeterminism (like 0 / 0 or infinity / infinity):\nProjectedX= (x + (y - b) * a) / (a² + 1)\nProjectedY = y + (x * a - y + b) / (a² + 1)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ProjectedNewestX", + "=", + "(NewestX + (NewestY - ForecastHistoryLinearB) * ForecastHistoryLinearA) / (1 + pow(ForecastHistoryLinearA, 2))" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ProjectedNewestY", + "=", + "NewestY + (NewestX * ForecastHistoryLinearA - NewestY \n+ ForecastHistoryLinearB) / (1 + pow(ForecastHistoryLinearA, 2))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ProjectedOldestX", + "=", + "(OldestX + (OldestY - ForecastHistoryLinearB) * ForecastHistoryLinearA) / (1 + pow(ForecastHistoryLinearA, 2))" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ProjectedOldestY", + "=", + "OldestY + (OldestX * ForecastHistoryLinearA - OldestY \n+ ForecastHistoryLinearB) / (1 + pow(ForecastHistoryLinearA, 2))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "OldestX", + "name": "OldestX", + "type": "expression" + }, + { + "description": "OldestY", + "name": "OldestY", + "type": "expression" + }, + { + "description": "Newest X", + "name": "NewestX", + "type": "expression" + }, + { + "description": "Newest Y", + "name": "NewestY", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the ratio between forecast time and the duration of the history. This function is only called by UpdateForecastedPosition.", + "fullName": "Forecast time ratio", + "functionType": "Expression", + "group": "Private", + "name": "ForecastTimeRatio", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "- ForecastTime / (Object.Variable(__SmoothCamera.ForecastHistoryTime[0]) - Object.Variable(__SmoothCamera.ForecastHistoryTime[Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime) - 1]))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "eventsFunctionsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "functionName": "onCreated" + }, + { + "functionName": "doStepPreEvents" + }, + { + "functionName": "MoveCameraCloser" + }, + { + "functionName": "DoMoveCameraCloser" + }, + { + "functionName": "WaitAndCatchUp" + }, + { + "functionName": "DrawDebug" + }, + { + "folderName": "Camera configuration", + "children": [ + { + "functionName": "SetFollowOnX" + }, + { + "functionName": "SetFollowOnY" + }, + { + "functionName": "SetFollowFreeAreaRight" + }, + { + "functionName": "SetFollowFreeAreaLeft" + }, + { + "functionName": "SetFollowFreeAreaTop" + }, + { + "functionName": "SetFollowFreeAreaBottom" + }, + { + "functionName": "SetLeftwardSpeedMax" + }, + { + "functionName": "SetRightwardSpeedMax" + }, + { + "functionName": "SetUpwardSpeedMax" + }, + { + "functionName": "SetDownwardSpeedMax" + }, + { + "functionName": "SetLeftwardSpeed" + }, + { + "functionName": "SetRightwardSpeed" + }, + { + "functionName": "SetDownwardSpeed" + }, + { + "functionName": "SetUpwardSpeed" + }, + { + "functionName": "OffsetX" + }, + { + "functionName": "SetOffsetXOp" + }, + { + "functionName": "SetOffsetX" + }, + { + "functionName": "OffsetY" + }, + { + "functionName": "SetOffsetYOp" + }, + { + "functionName": "SetOffsetY" + }, + { + "functionName": "SetForecastTime" + }, + { + "functionName": "SetCameraDelay" + } + ] + }, + { + "folderName": "Private", + "children": [ + { + "functionName": "FreeAreaLeft" + }, + { + "functionName": "FreeAreaRight" + }, + { + "functionName": "FreeAreaBottom" + }, + { + "functionName": "FreeAreaTop" + }, + { + "functionName": "UpdateDelayedPosition" + }, + { + "functionName": "AddForecastHistoryPosition" + }, + { + "functionName": "UpdateForecastedPosition" + }, + { + "functionName": "ProjectHistoryEnds" + }, + { + "functionName": "ForecastTimeRatio" + } + ] + }, + { + "functionName": "IsDelayed" + }, + { + "functionName": "CurrentDelay" + }, + { + "functionName": "IsWaiting" + } + ] + }, + "propertyDescriptors": [ + { + "value": "0.9", + "type": "Number", + "label": "Leftward catch-up speed (in ratio per second)", + "group": "Catch-up speed", + "name": "LeftwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Rightward catch-up speed (in ratio per second)", + "group": "Catch-up speed", + "name": "RightwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Upward catch-up speed (in ratio per second)", + "group": "Catch-up speed", + "name": "UpwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Downward catch-up speed (in ratio per second)", + "group": "Catch-up speed", + "name": "DownwardSpeed" + }, + { + "value": "true", + "type": "Boolean", + "label": "Follow on X axis", + "name": "FollowOnX" + }, + { + "value": "true", + "type": "Boolean", + "label": "Follow on Y axis", + "name": "FollowOnY" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area left border", + "group": "Position", + "advanced": true, + "name": "FollowFreeAreaLeft" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area right border", + "group": "Position", + "advanced": true, + "name": "FollowFreeAreaRight" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area top border", + "group": "Position", + "advanced": true, + "name": "FollowFreeAreaTop" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area bottom border", + "group": "Position", + "advanced": true, + "name": "FollowFreeAreaBottom" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Camera offset X", + "group": "Position", + "advanced": true, + "name": "CameraOffsetX" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Camera offset Y", + "group": "Position", + "advanced": true, + "name": "CameraOffsetY" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Camera delay", + "group": "Timing", + "deprecated": true, + "name": "CameraDelay" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Forecast time", + "group": "Timing", + "deprecated": true, + "name": "ForecastTime" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Forecast history duration", + "group": "Timing", + "deprecated": true, + "name": "ForecastHistoryDuration" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "LogLeftwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "LogRightwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "LogDownwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "LogUpwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "DelayedCenterX" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "DelayedCenterY" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ForecastHistoryMeanX" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ForecastHistoryMeanY" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ForecastHistoryVarianceX" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ForecastHistoryCovariance" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ForecastHistoryLinearA" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ForecastHistoryLinearB" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ForecastedX" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ForecastedY" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ProjectedNewestX" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ProjectedNewestY" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ProjectedOldestX" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ProjectedOldestY" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ForecastHistoryVarianceY" + }, + { + "value": "", + "type": "Number", + "label": "Index (local variable)", + "hidden": true, + "name": "Index" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "CameraDelayCatchUpSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "CameraExtraDelay" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "WaitingSpeedXMax" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "WaitingSpeedYMax" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "WaitingEnd" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "CameraDelayCatchUpDuration" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Leftward maximum speed", + "group": "Maximum speed", + "advanced": true, + "name": "LeftwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Rightward maximum speed", + "group": "Maximum speed", + "advanced": true, + "name": "RightwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Upward maximum speed", + "group": "Maximum speed", + "advanced": true, + "name": "UpwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Downward maximum speed", + "group": "Maximum speed", + "advanced": true, + "name": "DownwardSpeedMax" + }, + { + "value": "", + "type": "Number", + "label": "OldX (local variable)", + "hidden": true, + "name": "OldX" + }, + { + "value": "", + "type": "Number", + "label": "OldY (local variable)", + "hidden": true, + "name": "OldY" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "hidden": true, + "name": "IsCalledManually" + } + ], + "propertiesFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "folderName": "Catch-up speed", + "children": [ + { + "propertyName": "LeftwardSpeed" + }, + { + "propertyName": "RightwardSpeed" + }, + { + "propertyName": "UpwardSpeed" + }, + { + "propertyName": "DownwardSpeed" + } + ] + }, + { + "propertyName": "FollowOnX" + }, + { + "propertyName": "FollowOnY" + }, + { + "folderName": "Position", + "children": [ + { + "propertyName": "FollowFreeAreaLeft" + }, + { + "propertyName": "FollowFreeAreaRight" + }, + { + "propertyName": "FollowFreeAreaTop" + }, + { + "propertyName": "FollowFreeAreaBottom" + }, + { + "propertyName": "CameraOffsetX" + }, + { + "propertyName": "CameraOffsetY" + } + ] + }, + { + "folderName": "Timing", + "children": [ + { + "propertyName": "CameraDelay" + }, + { + "propertyName": "ForecastTime" + }, + { + "propertyName": "ForecastHistoryDuration" + } + ] + }, + { + "propertyName": "LogLeftwardSpeed" + }, + { + "propertyName": "LogRightwardSpeed" + }, + { + "propertyName": "LogDownwardSpeed" + }, + { + "propertyName": "LogUpwardSpeed" + }, + { + "propertyName": "DelayedCenterX" + }, + { + "propertyName": "DelayedCenterY" + }, + { + "propertyName": "ForecastHistoryMeanX" + }, + { + "propertyName": "ForecastHistoryMeanY" + }, + { + "propertyName": "ForecastHistoryVarianceX" + }, + { + "propertyName": "ForecastHistoryCovariance" + }, + { + "propertyName": "ForecastHistoryLinearA" + }, + { + "propertyName": "ForecastHistoryLinearB" + }, + { + "propertyName": "ForecastedX" + }, + { + "propertyName": "ForecastedY" + }, + { + "propertyName": "ProjectedNewestX" + }, + { + "propertyName": "ProjectedNewestY" + }, + { + "propertyName": "ProjectedOldestX" + }, + { + "propertyName": "ProjectedOldestY" + }, + { + "propertyName": "ForecastHistoryVarianceY" + }, + { + "propertyName": "Index" + }, + { + "propertyName": "CameraDelayCatchUpSpeed" + }, + { + "propertyName": "CameraExtraDelay" + }, + { + "propertyName": "WaitingSpeedXMax" + }, + { + "propertyName": "WaitingSpeedYMax" + }, + { + "propertyName": "WaitingEnd" + }, + { + "propertyName": "CameraDelayCatchUpDuration" + }, + { + "folderName": "Maximum speed", + "children": [ + { + "propertyName": "LeftwardSpeedMax" + }, + { + "propertyName": "RightwardSpeedMax" + }, + { + "propertyName": "UpwardSpeedMax" + }, + { + "propertyName": "DownwardSpeedMax" + } + ] + }, + { + "propertyName": "OldX" + }, + { + "propertyName": "OldY" + }, + { + "propertyName": "IsCalledManually" + } + ] + } + }, + { + "description": "Smoothly scroll to follow a character and stabilize the camera when jumping.", + "fullName": "Smooth platformer camera", + "helpPath": "", + "iconUrl": "", + "name": "SmoothPlatformerCamera", + "objectType": "", + "previewIconUrl": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::IsJumping" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "SmoothCamera", + "FloorFollowFreeAreaTop", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "SmoothCamera", + "FloorFollowFreeAreaBottom", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "FloorUpwardSpeed", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "FloorDownwardSpeed", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "FloorUpwardSpeedMax", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "FloorDownwardSpeedMax", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "PlatformBehavior::IsJumping" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + }, + { + "type": { + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "SmoothCamera", + "AirFollowFreeAreaTop", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "SmoothCamera", + "AirFollowFreeAreaBottom", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "AirUpwardSpeed", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "AirDownwardSpeed", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "AirUpwardSpeedMax", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "AirDownwardSpeedMax", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothPlatformerCamera", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "eventsFunctionsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "functionName": "doStepPreEvents" + } + ] + }, + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Platformer character behavior", + "extraInformation": [ + "PlatformBehavior::PlatformerObjectBehavior" + ], + "choices": [], + "name": "PlatformerCharacter" + }, + { + "value": "", + "type": "Behavior", + "label": "Smooth camera behavior", + "extraInformation": [ + "SmoothCamera::SmoothCamera" + ], + "choices": [], + "name": "SmoothCamera" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "JumpOriginY" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area top in the air", + "group": "Position", + "name": "AirFollowFreeAreaTop" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area bottom in the air", + "group": "Position", + "name": "AirFollowFreeAreaBottom" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area top on the floor", + "group": "Position", + "name": "FloorFollowFreeAreaTop" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area bottom on the floor", + "group": "Position", + "name": "FloorFollowFreeAreaBottom" + }, + { + "value": "0.95", + "type": "Number", + "label": "Upward speed in the air (in ratio per second)", + "group": "Catch-up speed", + "name": "AirUpwardSpeed" + }, + { + "value": "0.95", + "type": "Number", + "label": "Downward speed in the air (in ratio per second)", + "group": "Catch-up speed", + "name": "AirDownwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Upward speed on the floor (in ratio per second)", + "group": "Catch-up speed", + "name": "FloorUpwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Downward speed on the floor (in ratio per second)", + "group": "Catch-up speed", + "name": "FloorDownwardSpeed" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Upward maximum speed in the air", + "group": "Maximum speed", + "name": "AirUpwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Downward maximum speed in the air", + "group": "Maximum speed", + "name": "AirDownwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Upward maximum speed on the floor", + "group": "Maximum speed", + "name": "FloorUpwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Downward maximum speed on the floor", + "group": "Maximum speed", + "name": "FloorDownwardSpeedMax" + } + ], + "propertiesFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "propertyName": "PlatformerCharacter" + }, + { + "propertyName": "SmoothCamera" + }, + { + "propertyName": "JumpOriginY" + }, + { + "folderName": "Position", + "children": [ + { + "propertyName": "AirFollowFreeAreaTop" + }, + { + "propertyName": "AirFollowFreeAreaBottom" + }, + { + "propertyName": "FloorFollowFreeAreaTop" + }, + { + "propertyName": "FloorFollowFreeAreaBottom" + } + ] + }, + { + "folderName": "Catch-up speed", + "children": [ + { + "propertyName": "AirUpwardSpeed" + }, + { + "propertyName": "AirDownwardSpeed" + }, + { + "propertyName": "FloorUpwardSpeed" + }, + { + "propertyName": "FloorDownwardSpeed" + } + ] + }, + { + "folderName": "Maximum speed", + "children": [ + { + "propertyName": "AirUpwardSpeedMax" + }, + { + "propertyName": "AirDownwardSpeedMax" + }, + { + "propertyName": "FloorUpwardSpeedMax" + }, + { + "propertyName": "FloorDownwardSpeedMax" + } + ] + } + ] + } + } + ], + "eventsBasedObjects": [] + }, + { + "author": "", + "category": "Camera", + "dimension": "2D", + "extensionNamespace": "", + "fullName": "Room-based camera movement", + "gdevelopVersion": ">=5.5.222", + "helpPath": "https://victrisgames.itch.io/room-based-camera-movement", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGc+DQoJPHBhdGggZD0iTTE0LDNINEMzLjQsMywzLDMuNCwzLDR2MTBjMCwwLjYsMC40LDEsMSwxaDEwYzAuNiwwLDEtMC40LDEtMVY0QzE1LDMuNCwxNC42LDMsMTQsM3oiLz4NCgk8cGF0aCBkPSJNMTQsMTdINGMtMC42LDAtMSwwLjQtMSwxdjEwYzAsMC42LDAuNCwxLDEsMWgxMGMwLjYsMCwxLTAuNCwxLTFWMThDMTUsMTcuNCwxNC42LDE3LDE0LDE3eiIvPg0KCTxwYXRoIGQ9Ik0yOCwzSDE4Yy0wLjYsMC0xLDAuNC0xLDF2MTBjMCwwLjYsMC40LDEsMSwxaDEwYzAuNiwwLDEtMC40LDEtMVY0QzI5LDMuNCwyOC42LDMsMjgsM3oiLz4NCgk8cGF0aCBkPSJNMjgsMTdIMThjLTAuNiwwLTEsMC40LTEsMXYxMGMwLDAuNiwwLjQsMSwxLDFoMTBjMC42LDAsMS0wLjQsMS0xVjE4QzI5LDE3LjQsMjguNiwxNywyOCwxN3oiLz4NCjwvZz4NCjwvc3ZnPg0K", + "name": "RoomBasedCameraMovement", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Glyphster Pack/Master/SVG/Applications and Programming/Applications and Programming_app_apps_applications_tiles.svg", + "shortDescription": "Move/zoom camera to frame the room object containing the player.", + "version": "1.0.5", + "description": [ + "Move camera to the room that contains the trigger object (usually the player). If desired, change zoom to show the entire room or keep zoom static.", + "", + "How to use:", + "- Place room objects on scene", + "- Select camera zoom limits, how fast the camera should move, and the visible buffer around each room", + "- Run the \"Move and zoom camera\" action on every frame", + "- Move the trigger object (player) between rooms and the camera will center on the room that contains the trigger object.", + "", + "Tips:", + "- Use these conditions for custom logic when changing rooms : \"Camera moving\", \"Camera zooming\", and \"Room changed\"", + "- Set \"Lerp Speed\" to \"1\" to change the camera instantly" + ], + "origin": { + "identifier": "RoomBasedCameraMovement", + "name": "gdevelop-extension-store" + }, + "tags": [ + "camera", + "follow", + "room", + "trigger", + "zoom", + "move", + "smooth" + ], + "authorIds": [ + "gqDaZjCfevOOxBYkK6zlhtZnXCg1", + "8Ih1aa8f5gWUp4UB2BdhQ2iXWxJ3", + "dt0tRnf2kHWJnjkrpnzTzNj9Yc63" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [ + { + "description": "Move and zoom camera to the room object that contains the trigger object (usually the player).", + "fullName": "Move and zoom camera to the room object that contains the trigger object (player)", + "functionType": "Action", + "group": "Layers and cameras", + "name": "MoveCameraToActiveRoom", + "sentence": "Move camera to room object _PARAM1_ that contains trigger object _PARAM2_ (Layer: _PARAM3_, Lerp speed: _PARAM4_, Max zoom: _PARAM5_, Min zoom: _PARAM6_, Border buffer: _PARAM7_px)", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Initialize", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save input values" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.MaxZoom", + "=", + "MaxZoom" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.LerpSpeed", + "=", + "LerpSpeed" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set default values if none provided" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.MaxZoom", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.MaxZoom", + "=", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.LerpSpeed", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.LerpSpeed", + "=", + "0.1" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Main", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Identify the current room", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect which room is the current one" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "RoomObject", + "TriggerObject.CenterX()", + "TriggerObject.CenterY()" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Room has NOT changed" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "TriggerObject", + "__RoomBasedCameraMovement.CurrentRoomID", + "=", + "RoomObject.Variable(__RoomBasedCameraMovement.RoomID)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "TriggerObject", + "__RoomBasedCameraMovement.RoomChanged", + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Room has changed" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "TriggerObject", + "__RoomBasedCameraMovement.CurrentRoomID", + "!=", + "RoomObject.Variable(__RoomBasedCameraMovement.RoomID)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "TriggerObject", + "__RoomBasedCameraMovement.RoomChanged", + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update CurrentRoomID variable" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "TriggerObject", + "__RoomBasedCameraMovement.CurrentRoomID", + "=", + "RoomObject.Variable(__RoomBasedCameraMovement.RoomID)" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move camera", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "RoomObject", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Assign each room a unique ID if they don't have one yet" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "RoomObject", + "__RoomBasedCameraMovement.RoomID", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.MaxRoomID", + "+", + "1" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "RoomObject", + "__RoomBasedCameraMovement.RoomID", + "=", + "Variable(__RoomBasedCameraMovement.MaxRoomID)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Check if this room is the current room" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "RoomObject", + "__RoomBasedCameraMovement.RoomID", + "=", + "TriggerObject.Variable(__RoomBasedCameraMovement.CurrentRoomID)" + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change zoom", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate the camera dimensions" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.CameraWidth", + "=", + "RoomObject.Width()+2*OutsideBuffer" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.CameraHeight", + "=", + "RoomObject.Height()+2*OutsideBuffer" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.CameraZoom", + "=", + "min(SceneWindowHeight() / Variable(__RoomBasedCameraMovement.CameraHeight), SceneWindowWidth() / Variable(__RoomBasedCameraMovement.CameraWidth))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Adjust zoom to stay within min/max values" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.CameraZoom", + "=", + "clamp(Variable(__RoomBasedCameraMovement.CameraZoom),MinZoom,Variable(__RoomBasedCameraMovement.MaxZoom))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change camera zoom" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ZoomCamera" + }, + "parameters": [ + "", + "ceil(lerp(CameraZoom(Layer,Camera),Variable(__RoomBasedCameraMovement.CameraZoom),Variable(__RoomBasedCameraMovement.LerpSpeed))*1000)/1000", + "Layer", + "Camera" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move camera position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "For rooms smaller than the viewable screen, center the camera on the center of the room" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.CameraWidth", + "<=", + "SceneWindowWidth()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraCenterX" + }, + "parameters": [ + "", + "=", + "ceil(lerp(CameraX(Layer,Camera), RoomObject.CenterX(), Variable(__RoomBasedCameraMovement.LerpSpeed))*100)/100", + "Layer", + "Camera" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.CameraHeight", + "<=", + "SceneWindowHeight()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraCenterY" + }, + "parameters": [ + "", + "=", + "ceil(lerp(CameraY(Layer,Camera), RoomObject.CenterY(), Variable(__RoomBasedCameraMovement.LerpSpeed))*100)/100", + "Layer", + "Camera" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "For rooms larger than the viewable screen, center the camera on the TriggerObject and clamp camera so it only shows the room + buffer" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.CameraWidth", + ">", + "SceneWindowWidth()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraCenterX" + }, + "parameters": [ + "", + "=", + "ceil(lerp(CameraX(Layer,Camera), clamp(TriggerObject.CenterX(), \nRoomObject.CenterX() - RoomObject.Width()/2 + SceneWindowWidth()/2 - OutsideBuffer, RoomObject.CenterX() + RoomObject.Width()/2 - SceneWindowWidth()/2 + OutsideBuffer), Variable(__RoomBasedCameraMovement.LerpSpeed))*100)/100", + "Layer", + "Camera" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.CameraHeight", + ">", + "SceneWindowHeight()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraCenterY" + }, + "parameters": [ + "", + "=", + "ceil(lerp(CameraY(Layer,Camera), clamp(TriggerObject.CenterY(), \nRoomObject.CenterY() - RoomObject.Height()/2 + SceneWindowHeight()/2 - OutsideBuffer, RoomObject.CenterY() + RoomObject.Height()/2 - SceneWindowHeight()/2 + OutsideBuffer), Variable(__RoomBasedCameraMovement.LerpSpeed))*100)/100", + "Layer", + "Camera" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Calculate \"IsCameraMoving\" condition", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Initialize", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.PrevCameraX", + "=", + "0" + ] + }, + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.PrevCameraY", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.PrevCameraX", + "=", + "CameraX(Layer, Camera)" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.PrevCameraY", + "=", + "CameraY(Layer, Camera)" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Check if camera position changed", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Camera has NOT moved" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.PrevCameraX", + "=", + "CameraX(Layer,Camera)" + ] + }, + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.PrevCameraY", + "=", + "CameraY(Layer,Camera)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetSceneVariableAsBoolean" + }, + "parameters": [ + "__RoomBasedCameraMovement.CameraMoving", + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Camera has moved" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.PrevCameraX", + "!=", + "CameraX(Layer,Camera)" + ] + }, + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.PrevCameraY", + "!=", + "CameraY(Layer,Camera)" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetSceneVariableAsBoolean" + }, + "parameters": [ + "__RoomBasedCameraMovement.CameraMoving", + "True" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update with current camera position" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.PrevCameraX", + "=", + "CameraX(Layer, Camera)" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.PrevCameraY", + "=", + "CameraY(Layer, Camera)" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Calculate \"IsCameraZooming\" condition", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Initialize", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.PreviousZoom", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.PreviousZoom", + "=", + "CameraZoom(Layer, Camera)" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Check if camera zoom changed", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Camera zoom has NOT changed" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.PreviousZoom", + "=", + "CameraZoom(Layer,Camera)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetSceneVariableAsBoolean" + }, + "parameters": [ + "__RoomBasedCameraMovement.CameraZooming", + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Camera zoom has changed" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.PreviousZoom", + "!=", + "CameraZoom(Layer,Camera)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetSceneVariableAsBoolean" + }, + "parameters": [ + "__RoomBasedCameraMovement.CameraZooming", + "True" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update with current camera zoom" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__RoomBasedCameraMovement.PreviousZoom", + "=", + "CameraZoom(Layer, Camera)" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Room object", + "longDescription": "Room objects are used to mark areas that should be seen by the camera.", + "name": "RoomObject", + "type": "objectList" + }, + { + "description": "Trigger object (player)", + "longDescription": "When the Trigger Object touches a new Room Object, the camera will move to the new room", + "name": "TriggerObject", + "type": "objectList" + }, + { + "description": "Layer", + "name": "Layer", + "type": "layer" + }, + { + "description": "Lerp speed", + "longDescription": "Range: 0 to 1", + "name": "LerpSpeed", + "type": "expression" + }, + { + "description": "Maximum zoom", + "name": "MaxZoom", + "type": "expression" + }, + { + "description": "Minimum zoom", + "name": "MinZoom", + "type": "expression" + }, + { + "description": "Outside buffer (pixels)", + "longDescription": "Minimum extra space displayed around each side the room", + "name": "OutsideBuffer", + "type": "expression" + }, + { + "description": "Camera", + "name": "Camera", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Check if trigger object (usually the player) has entered a new room on this frame.", + "fullName": "Check if trigger object (player) has entered a new room", + "functionType": "Condition", + "name": "ActiveRoomChanged", + "sentence": "_PARAM1_ has just entered a new room", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "TriggerObject", + "__RoomBasedCameraMovement.RoomChanged", + "True" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Trigger object (player)", + "name": "TriggerObject", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Check if camera is zooming (requires the use of \"Move and zoom camera\" action in this extension).", + "fullName": "Check if camera is zooming", + "functionType": "Condition", + "name": "IsCameraZooming", + "sentence": "Camera is zooming", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SceneVariableAsBoolean" + }, + "parameters": [ + "__RoomBasedCameraMovement.CameraZooming", + "True" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if camera is moving (requires the use of \"Move and zoom camera\" action in this extension).", + "fullName": "Check if camera is moving", + "functionType": "Condition", + "name": "IsCameraMoving", + "sentence": "Camera is moving", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SceneVariableAsBoolean" + }, + "parameters": [ + "__RoomBasedCameraMovement.CameraMoving", + "True" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [], + "objectGroups": [] + } + ], + "eventsFunctionsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "folderName": "Layers and cameras", + "children": [ + { + "functionName": "MoveCameraToActiveRoom" + } + ] + }, + { + "functionName": "ActiveRoomChanged" + }, + { + "functionName": "IsCameraZooming" + }, + { + "functionName": "IsCameraMoving" + } + ] + }, + "eventsBasedBehaviors": [], + "eventsBasedObjects": [] + }, + { + "author": "@oscuridad6661, Tristan Rhodes (@VictrisGames)", + "category": "Game mechanic", + "dimension": "", + "extensionNamespace": "", + "fullName": "Dungeon generator", + "gdevelopVersion": ">=5.5.222", + "helpPath": "https://victrisgames.itch.io/extension-dungeon-generator", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLXNpdGVtYXAiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNOSwyVjhIMTFWMTFINUMzLjg5LDExIDMsMTEuODkgMywxM1YxNkgxVjIySDdWMTZINVYxM0gxMVYxNkg5VjIySDE1VjE2SDEzVjEzSDE5VjE2SDE3VjIySDIzVjE2SDIxVjEzQzIxLDExLjg5IDIwLjExLDExIDE5LDExSDEzVjhIMTVWMkg5WiIgLz48L3N2Zz4=", + "name": "DungeonGenerator", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/sitemap.svg", + "shortDescription": "Create a procedurally generated dungeon. Includes two layouts: \"rooms and hallways\" and \"dungeon cave\".", + "version": "1.2.1", + "description": [ + "How to use:", + "- Run the \"Generate Dungeon Cave\" or \"Generate Dungeon with Rooms\" action at the beginning of a scene.", + "", + "Tips:", + "- Keep the amount of space used by room objects to less than ~25% of the total map. If you add too many rooms, they will not be placed correctly and might collide with other rooms.", + "- Try using top-down controls combined with physics behavior (with no gravity) on the player and wall objects", + "- Use external layouts to place pre-designed rooms on randomly created room objects", + "- Use \"Delete Unused Terrain\" option to reduce resources used", + "- Use \"RoomID(object)\" expression to determine the starting and ending room", + "- Use \"NeighborCount(object)\" expression to find good places to place treasure. A high amount of neighbors means that the tile is a nook or cranny.", + "- Use \"IsRoomEntrance\" condition to identify hallway objects that are adjacent to a room", + "", + "An example shows how to procedurally generate dungeons or caves ([open the project online](https://editor.gdevelop.io/?project=example://dungeon-generator))." + ], + "origin": { + "identifier": "DungeonGenerator", + "name": "gdevelop-extension-store" + }, + "tags": [ + "dungeon", + "generator", + "procedural", + "generation", + "automatic", + "build", + "create", + "rogue", + "roguelike", + "hallway", + "entrance", + "floor", + "room", + "cave" + ], + "authorIds": [ + "gqDaZjCfevOOxBYkK6zlhtZnXCg1", + "5iOtaj8yEsam4mIj7TEUDk4LSAe2" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [ + { + "description": "Set the size of hallway objects to be placed on the path created by the pathfinding object.", + "fullName": "Set size of hallway objects", + "functionType": "Action", + "name": "AdjustHallwaySizes", + "private": true, + "sentence": "Set the size of hallway objects _PARAM1_ to be placed on the path created by _PARAM2_ (Tile size: _PARAM4_ pixels, Hallway width: _PARAM5_ tiles)", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Adjust size of hallway objects", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set the default size of hallway object to the tilesize" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ChangeHeight" + }, + "parameters": [ + "HallwayObject", + "=", + "TileSize " + ] + }, + { + "type": { + "value": "ChangeWidth" + }, + "parameters": [ + "HallwayObject", + "=", + "TileSize " + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Skip the first step in the path (so this function doesn't try to evaluate step 0)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__DungeonGenerator.PathCounter", + ">", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Vertical move (previous frame)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "PathfinderObject.PathfindingBehavior::GetNodeX(Variable(__DungeonGenerator.PathCounter))", + "=", + "PathfinderObject.PathfindingBehavior::GetNodeX(Variable(__DungeonGenerator.PathCounter)-1)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeWidth" + }, + "parameters": [ + "HallwayObject", + "=", + "TileSize * max(1,HallwayWidth)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change in direction (this frame)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "PathfinderObject.PathfindingBehavior::GetNodeY(Variable(__DungeonGenerator.PathCounter))", + "=", + "PathfinderObject.PathfindingBehavior::GetNodeY(Variable(__DungeonGenerator.PathCounter)+1)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeHeight" + }, + "parameters": [ + "HallwayObject", + "=", + "TileSize * max(1,HallwayWidth)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Horizontal move (previous frame)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "PathfinderObject.PathfindingBehavior::GetNodeY(Variable(__DungeonGenerator.PathCounter))", + "=", + "PathfinderObject.PathfindingBehavior::GetNodeY(Variable(__DungeonGenerator.PathCounter)-1)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeHeight" + }, + "parameters": [ + "HallwayObject", + "=", + "TileSize * max(1,HallwayWidth)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change in direction (this frame)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "PathfinderObject.PathfindingBehavior::GetNodeX(Variable(__DungeonGenerator.PathCounter))", + "=", + "PathfinderObject.PathfindingBehavior::GetNodeX(Variable(__DungeonGenerator.PathCounter)+1)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeWidth" + }, + "parameters": [ + "HallwayObject", + "=", + "TileSize * max(1,HallwayWidth)" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.PathCounter", + "+", + "1" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Hallway object", + "name": "HallwayObject", + "supplementaryInformation": "Sprite", + "type": "objectList" + }, + { + "description": "Pathfinder object", + "name": "PathfinderObject", + "supplementaryInformation": "Sprite", + "type": "objectList" + }, + { + "description": "Pathfinding behavior", + "name": "PathfindingBehavior", + "supplementaryInformation": "PathfindingBehavior::PathfindingBehavior", + "type": "behavior" + }, + { + "description": "Tile size (pixels)", + "name": "TileSize", + "type": "expression" + }, + { + "description": "Hallway width (tiles)", + "name": "HallwayWidth", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Fill world with terrain", + "fullName": "Fill world with terrain", + "functionType": "Action", + "name": "FillWorld", + "private": true, + "sentence": "Fill world with terrain (Tile size: _PARAM1_ pixels, Columns: _PARAM2_ tiles, Rows: _PARAM3_ tiles, Fill object: _PARAM4_)", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Populate map with terrain objects everywhere", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.CounterX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.CounterY", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "MapHeight", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "MapWidth", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "TerrainObject", + "Variable(__DungeonGenerator.CounterX) * TileSize", + "Variable(__DungeonGenerator.CounterY) * TileSize", + "Layer" + ] + }, + { + "type": { + "value": "ChangeWidth" + }, + "parameters": [ + "TerrainObject", + "=", + "TileSize" + ] + }, + { + "type": { + "value": "ChangeHeight" + }, + "parameters": [ + "TerrainObject", + "=", + "TileSize" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.CounterX", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.CounterX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.CounterY", + "+", + "1" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Tile size (pixels)", + "name": "TileSize", + "type": "expression" + }, + { + "description": "Map width (number of colums)", + "name": "MapWidth", + "type": "expression" + }, + { + "description": "Map height (number of rows)", + "name": "MapHeight", + "type": "expression" + }, + { + "description": "Terrain object", + "name": "TerrainObject", + "supplementaryInformation": "Sprite", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Generate a dungeon cave using a random walk algorithm. When the walker touches an edge of the map, it is moved back to the center of map.", + "fullName": "Generate a dungeon cave", + "functionType": "Action", + "name": "GenerateDungeonCave", + "sentence": "Generate a dungeon cave that has _PARAM8_ percent floor objects (Tile size: _PARAM1_ pixels, Map width: _PARAM2_ tiles, Map height: _PARAM3_ tiles, Terrain object: _PARAM4_, Floor object: _PARAM5_, Wall object: _PARAM12_, Walker object: _PARAM7_, Walker width/height: _PARAM9_ tiles, Minimum border: _PARAM10_ tiles, Create objects on layer: _PARAM6_, Delete unused terrain: _PARAM11_, Calculate neighbors: _PARAM13_)", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Random walk", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate the number of floor objects to be created. Don't include border in calculation. Multiply border by 2 because it needs to exist on both sides (top+bottom, left+right)." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.FloorGoal", + "=", + "round((MapWidth - 2 * MinBorder) * (MapHeight - 2 * MinBorder) * FloorPercentage)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Initialize counters" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.StepsTaken", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.FloorCreated", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.WalkerRestarts", + "=", + "0" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Walk until complete (using a 2D array)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Start with an empty map (array)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "VariableRemoveChild" + }, + "parameters": [ + "__DungeonGenerator", + "\"WalkerMap\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Create walkers", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Initialize walker offsets (these are used to make the walker take up more than one tile)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.WalkerOffsetX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.WalkerOffsetY", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Create (WalkerSize^2) quantity of objects (1x1=1, 2x2=4, 3x3=9, etc0" + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "max(1,WalkerSize)", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "max(1,WalkerSize)", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Create virtual walker objects. Walker objects are ONLY used to store variables and to perform ForEach() loops. Position, size, and appearance DO NOT matter. \nTODO: These could be replaced by structure variables." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "WalkerObject", + "0", + "0", + "Layer" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate the starting position (in the 2D array) and save it so it can be used for restarts" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "WalkerObject", + "__DungeonGenerator.Xpos", + "=", + "round(MapWidth/2 + Variable(__DungeonGenerator.WalkerOffsetX))" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "WalkerObject", + "__DungeonGenerator.Ypos", + "=", + "round(MapHeight/2 + Variable(__DungeonGenerator.WalkerOffsetY))" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "WalkerObject", + "__DungeonGenerator.StartXpos", + "=", + "WalkerObject.Variable(__DungeonGenerator.Xpos)" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "WalkerObject", + "__DungeonGenerator.StartYpos", + "=", + "WalkerObject.Variable(__DungeonGenerator.Ypos)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.WalkerOffsetX", + "+", + "1" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.WalkerOffsetX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.WalkerOffsetY", + "+", + "1" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Process walker movements", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "infiniteLoopWarning": true, + "type": "BuiltinCommonInstructions::While", + "whileConditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__DungeonGenerator.FloorCreated", + "<", + "Variable(__DungeonGenerator.FloorGoal)" + ] + } + ], + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset variables" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetSceneVariableAsBoolean" + }, + "parameters": [ + "__DungeonGenerator.InitiateRestart", + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate chance to go in each direction based on the ratio of width to height" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.ChanceToGoRight", + "=", + "0.5 * (MapWidth / (MapWidth + MapHeight))" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.ChanceToGoLeft", + "=", + "Variable(__DungeonGenerator.ChanceToGoRight)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.ChanceToGoUp", + "=", + "0.5 * (MapHeight / (MapWidth + MapHeight))" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.ChanceToGoDown", + "=", + "Variable(__DungeonGenerator.ChanceToGoUp)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Generate a random number between 0 and 1" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.RandomNumber", + "=", + "RandomFloatInRange(0,1)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move LEFT" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__DungeonGenerator.RandomNumber", + ">=", + "0" + ] + }, + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__DungeonGenerator.RandomNumber", + "<", + "Variable(__DungeonGenerator.ChanceToGoLeft)" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "WalkerObject", + "__DungeonGenerator.Xpos", + "-", + "1" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move RIGHT" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__DungeonGenerator.RandomNumber", + ">=", + "Variable(__DungeonGenerator.ChanceToGoLeft)" + ] + }, + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__DungeonGenerator.RandomNumber", + "<", + "Variable(__DungeonGenerator.ChanceToGoLeft) + Variable(__DungeonGenerator.ChanceToGoRight)" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "WalkerObject", + "__DungeonGenerator.Xpos", + "+", + "1" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move UP" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__DungeonGenerator.RandomNumber", + ">=", + "Variable(__DungeonGenerator.ChanceToGoLeft) + Variable(__DungeonGenerator.ChanceToGoRight)" + ] + }, + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__DungeonGenerator.RandomNumber", + "<", + "Variable(__DungeonGenerator.ChanceToGoLeft) + Variable(__DungeonGenerator.ChanceToGoRight) + Variable(__DungeonGenerator.ChanceToGoUp)" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "WalkerObject", + "__DungeonGenerator.Ypos", + "-", + "1" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move DOWN" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__DungeonGenerator.RandomNumber", + ">=", + "Variable(__DungeonGenerator.ChanceToGoLeft) + Variable(__DungeonGenerator.ChanceToGoRight) + Variable(__DungeonGenerator.ChanceToGoUp)" + ] + }, + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__DungeonGenerator.RandomNumber", + "<=", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "WalkerObject", + "__DungeonGenerator.Ypos", + "+", + "1" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If ANY Walker is outside map boundries, reset ALL of them to their starting positions" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "WalkerObject", + "__DungeonGenerator.Xpos", + "<", + "MinBorder" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "WalkerObject", + "__DungeonGenerator.Xpos", + ">=", + "MapWidth - MinBorder" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "WalkerObject", + "__DungeonGenerator.Ypos", + "<", + "MinBorder" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "WalkerObject", + "__DungeonGenerator.Ypos", + ">=", + "MapHeight - MinBorder" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetSceneVariableAsBoolean" + }, + "parameters": [ + "__DungeonGenerator.InitiateRestart", + "True" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.WalkerRestarts", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Check all Walkers if they are on top of terrain" + }, + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "WalkerObject", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SceneVariableAsBoolean" + }, + "parameters": [ + "__DungeonGenerator.InitiateRestart", + "True" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move back to starting position" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "WalkerObject", + "__DungeonGenerator.Xpos", + "=", + "WalkerObject.Variable(__DungeonGenerator.StartXpos)" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "WalkerObject", + "__DungeonGenerator.Ypos", + "=", + "WalkerObject.Variable(__DungeonGenerator.StartYpos)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If Walker is on Terrain, delete it" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__DungeonGenerator.WalkerMap[WalkerObject.Variable(__DungeonGenerator.Xpos)][WalkerObject.Variable(__DungeonGenerator.Ypos)]", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.WalkerMap[WalkerObject.Variable(__DungeonGenerator.Xpos)][WalkerObject.Variable(__DungeonGenerator.Ypos)]", + "=", + "1" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.FloorCreated", + "+", + "1" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Track how many steps were taken" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.StepsTaken", + "+", + "1" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Draw map based on 2D array", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.CounterX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.CounterY", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Loop through every tile in the map" + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "MapHeight", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "MapWidth", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Create terrain objects when array value is 0" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__DungeonGenerator.WalkerMap[Variable(__DungeonGenerator.CounterX)][Variable(__DungeonGenerator.CounterY)]", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "TerrainObject", + "Variable(__DungeonGenerator.CounterX) * TileSize", + "Variable(__DungeonGenerator.CounterY) * TileSize", + "Layer" + ] + }, + { + "type": { + "value": "ChangeWidth" + }, + "parameters": [ + "TerrainObject", + "=", + "TileSize" + ] + }, + { + "type": { + "value": "ChangeHeight" + }, + "parameters": [ + "TerrainObject", + "=", + "TileSize" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Create floor objects when array value is 1" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__DungeonGenerator.WalkerMap[Variable(__DungeonGenerator.CounterX)][Variable(__DungeonGenerator.CounterY)]", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "FloorObject", + "Variable(__DungeonGenerator.CounterX) * TileSize", + "Variable(__DungeonGenerator.CounterY) * TileSize", + "Layer" + ] + }, + { + "type": { + "value": "ChangeWidth" + }, + "parameters": [ + "FloorObject", + "=", + "TileSize" + ] + }, + { + "type": { + "value": "ChangeHeight" + }, + "parameters": [ + "FloorObject", + "=", + "TileSize" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.CounterX", + "+", + "1" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.CounterX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.CounterY", + "+", + "1" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Add walls", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add walls" + }, + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "TerrainObject", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Create walls where terrain touches floor" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "TerrainObject", + "FloorObject", + "", + "", + "no" + ] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "WallObject", + "TerrainObject.X()", + "TerrainObject.Y()", + "Layer" + ] + }, + { + "type": { + "value": "Delete" + }, + "parameters": [ + "TerrainObject", + "" + ] + }, + { + "type": { + "value": "ChangeWidth" + }, + "parameters": [ + "WallObject", + "=", + "TileSize" + ] + }, + { + "type": { + "value": "ChangeHeight" + }, + "parameters": [ + "WallObject", + "=", + "TileSize" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Calculate neighbors", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "CalculateNeighbors", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "DungeonGenerator::CalculateGridNeighbors" + }, + "parameters": [ + "", + "FloorObject", + "WallObject", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Cleanup", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Delete walkers" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "WalkerObject", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Delete unused terrain (if desired)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "DeleteUnused", + "True", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "CollisionNP" + }, + "parameters": [ + "TerrainObject", + "FloorObject", + "", + "", + "no" + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "TerrainObject", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Tile size (pixels)", + "longDescription": "All objects are based on this size", + "name": "TileSize", + "type": "expression" + }, + { + "description": "Map width (tiles)", + "name": "MapWidth", + "type": "expression" + }, + { + "description": "Map height (tiles)", + "name": "MapHeight", + "type": "expression" + }, + { + "description": "Terrain object", + "longDescription": "Terrain object is used to fill the map that is not covered by floors, hallways, or walls.", + "name": "TerrainObject", + "supplementaryInformation": "Sprite", + "type": "objectList" + }, + { + "description": "Floor object", + "longDescription": "Floor objects are created on every tile that a walker has travelled to.", + "name": "FloorObject", + "supplementaryInformation": "Sprite", + "type": "objectList" + }, + { + "description": "Layer", + "name": "Layer", + "type": "layer" + }, + { + "description": "Walker object", + "longDescription": "Use a random walk algorithm to turn terrain objects into floor objects", + "name": "WalkerObject", + "supplementaryInformation": "Sprite", + "type": "objectList" + }, + { + "description": "Floor percentage (Range: 0-1)", + "longDescription": "Percentage of map that will be convered by floor objects", + "name": "FloorPercentage", + "type": "expression" + }, + { + "description": "Size of walker sides (tiles)", + "longDescription": "The number of tiles for each side of the square walker object. For example, 2=2x2, 3=3x3, 4=4x4.", + "name": "WalkerSize", + "type": "expression" + }, + { + "description": "Minimum border", + "longDescription": "Can be used to provide a border of terrain around the map", + "name": "MinBorder", + "type": "expression" + }, + { + "description": "Delete unused terrain objects", + "name": "DeleteUnused", + "type": "trueorfalse" + }, + { + "description": "Wall object", + "longDescription": "Wall objects are placed between floor and terrain objects.", + "name": "WallObject", + "supplementaryInformation": "Sprite", + "type": "objectList" + }, + { + "description": "Calculate neighbors", + "longDescription": "May take a few seconds to calculate neighbors on a large map, so disable this if you are not using it.", + "name": "CalculateNeighbors", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Generate a dungeon by placing rooms in random locations and moving them if they collide with each other. Rooms are connected with hallways.", + "fullName": "Generate a dungeon with room and hallways", + "functionType": "Action", + "name": "GenerateDungeonRooms", + "sentence": "Generate a dungeon with rooms (Room Qty: _PARAM7_, Tile size: _PARAM1_ pixels, Map width: _PARAM2_ tiles, Map height: _PARAM3_ tiles, Terrain object: _PARAM4_, Room object: _PARAM5_, Wall object: _PARAM20_, Hallway object: _PARAM6_, Pathfinding object: _PARAM13_, Min room width: _PARAM9_ tiles, Max room width: _PARAM10_ tiles, Min room height: _PARAM11_ tiles, Max room height: _PARAM12_ tiles, Hallway width: _PARAM17_ tiles, Create objects on layer: _PARAM8_, Max separation attempts: _PARAM15_, Connect rooms in a loop: _PARAM16_, Additional paths: _PARAM18_, Delete unused terrain: _PARAM19_)", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Populate map with terrain objects everywhere", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DungeonGenerator::FillWorld" + }, + "parameters": [ + "", + "TileSize", + "MapWidth", + "MapHeight", + "TerrainObject", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Create rooms at random locations", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "infiniteLoopWarning": true, + "type": "BuiltinCommonInstructions::While", + "whileConditions": [ + { + "type": { + "value": "NbObjet" + }, + "parameters": [ + "RoomObject", + "<", + "RoomQty" + ] + } + ], + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Create a new room in a random location on map" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "RoomObject", + "RandomInRange(HallwayWidth, MapWidth - MaxRoomWidth - HallwayWidth) * TileSize", + "RandomInRange(HallwayWidth, MapHeight - MaxRoomHeight - HallwayWidth) * TileSize", + "Layer" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change the room to a random size" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "RoomObject", + "__DungeonGenerator.RoomWidth", + "=", + "RandomInRange(MinRoomWidth, MaxRoomWidth) * TileSize" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "RoomObject", + "__DungeonGenerator.RoomHeight", + "=", + "RandomInRange(MinRoomHeight, MaxRoomHeight) * TileSize" + ] + }, + { + "type": { + "value": "ChangeWidth" + }, + "parameters": [ + "RoomObject", + "=", + "RoomObject.Variable(__DungeonGenerator.RoomWidth)" + ] + }, + { + "type": { + "value": "ChangeHeight" + }, + "parameters": [ + "RoomObject", + "=", + "RoomObject.Variable(__DungeonGenerator.RoomHeight)" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Separate rooms", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Estimate starting distance between rooms" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.MinSeparationDistance", + "=", + "ceil((sqrt(pow(MaxRoomWidth,2) + pow(MaxRoomHeight,2)))) * TileSize" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.SeparationCounter", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set a default value for separation attempts" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "MaxSeparationAttempts", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.MaxSeparationAttempts", + "=", + "MaxSeparationAttempts" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "MaxSeparationAttempts", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.MaxSeparationAttempts", + "=", + "10000" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If rooms are close to each other, move them to a new random location" + }, + { + "infiniteLoopWarning": true, + "type": "BuiltinCommonInstructions::While", + "whileConditions": [ + { + "type": { + "value": "Distance" + }, + "parameters": [ + "RoomObject", + "RoomObject", + "Variable(__DungeonGenerator.MinSeparationDistance)", + "" + ] + }, + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__DungeonGenerator.SeparationCounter", + "<", + "Variable(__DungeonGenerator.MaxSeparationAttempts)" + ] + } + ], + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.SeparationCounter", + "+", + "1" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move in a random direction the distance of a room" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetXY" + }, + "parameters": [ + "RoomObject", + "+", + "RandomWithStep(-MaxRoomWidth/2,MaxRoomWidth/2,MaxRoomWidth) * TileSize", + "+", + "RandomWithStep(-MaxRoomHeight/2,MaxRoomHeight/2,MaxRoomHeight) * TileSize" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move object back into the usable part of map" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosY" + }, + "parameters": [ + "RoomObject", + ">", + "(MapHeight - MaxRoomWidth - HallwayWidth)*TileSize" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetY" + }, + "parameters": [ + "RoomObject", + "=", + "(MapHeight - MaxRoomWidth - HallwayWidth)*TileSize" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosX" + }, + "parameters": [ + "RoomObject", + ">", + "(MapWidth - MaxRoomWidth - HallwayWidth)*TileSize" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetX" + }, + "parameters": [ + "RoomObject", + "=", + "(MapWidth - MaxRoomWidth - HallwayWidth)*TileSize" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosX" + }, + "parameters": [ + "RoomObject", + "<", + "HallwayWidth*TileSize" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetX" + }, + "parameters": [ + "RoomObject", + "=", + "HallwayWidth*TileSize" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosY" + }, + "parameters": [ + "RoomObject", + "<", + "HallwayWidth*TileSize" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetY" + }, + "parameters": [ + "RoomObject", + "=", + "HallwayWidth*TileSize" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Draw paths between rooms", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Create pathfinder object if one doesn't exist" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NbObjet" + }, + "parameters": [ + "PathfinderObject", + "<", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "PathfinderObject", + "0", + "0", + "Layer" + ] + }, + { + "type": { + "value": "PathfindingBehavior::AllowDiagonals" + }, + "parameters": [ + "PathfinderObject", + "PathfindingBehavior", + "no" + ] + }, + { + "type": { + "value": "ChangeHeight" + }, + "parameters": [ + "PathfinderObject", + "=", + "TileSize" + ] + }, + { + "type": { + "value": "ChangeWidth" + }, + "parameters": [ + "PathfinderObject", + "=", + "TileSize" + ] + }, + { + "type": { + "value": "SetZOrder" + }, + "parameters": [ + "PathfinderObject", + "=", + "100" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure pathfinding cell size matches tile size" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PathfindingBehavior::CellWidth" + }, + "parameters": [ + "PathfinderObject", + "PathfindingBehavior", + "!=", + "TileSize " + ] + } + ], + "actions": [ + { + "type": { + "value": "PathfindingBehavior::CellWidth" + }, + "parameters": [ + "PathfinderObject", + "PathfindingBehavior", + "=", + "TileSize " + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PathfindingBehavior::CellHeight" + }, + "parameters": [ + "PathfinderObject", + "PathfindingBehavior", + "!=", + "TileSize " + ] + } + ], + "actions": [ + { + "type": { + "value": "PathfindingBehavior::CellHeight" + }, + "parameters": [ + "PathfinderObject", + "PathfindingBehavior", + "=", + "TileSize " + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move the pathfinder object to a random starting room" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PickRandomInstance" + }, + "parameters": [ + "", + "RoomObject" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetXY" + }, + "parameters": [ + "PathfinderObject", + "=", + "RoomObject.CenterX()", + "=", + "RoomObject.CenterY()" + ] + }, + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "RoomObject", + "__DungeonGenerator.Visited", + "True" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset counter (used to assign RoomID to rooms)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.CurrentRoomID", + "=", + "1" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "RoomObject", + "__DungeonGenerator.RoomID", + "=", + "Variable(__DungeonGenerator.CurrentRoomID)" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.CurrentRoomID", + "+", + "1" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Cycle through all rooms, always going to the nearest unvisited room" + }, + { + "infiniteLoopWarning": true, + "type": "BuiltinCommonInstructions::While", + "whileConditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "RoomObject", + "__DungeonGenerator.Visited", + "False" + ] + } + ], + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PickNearest" + }, + "parameters": [ + "RoomObject", + "PathfinderObject.X()", + "PathfinderObject.Y()", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Assign path order if one does not exist" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "RoomObject", + "__DungeonGenerator.RoomID", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "RoomObject", + "__DungeonGenerator.RoomID", + "=", + "Variable(__DungeonGenerator.CurrentRoomID)" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.CurrentRoomID", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set the destination of the pathfinder to the next room" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PathfindingBehavior::SetDestination" + }, + "parameters": [ + "PathfinderObject", + "PathfindingBehavior", + "", + "RoomObject.CenterX()", + "RoomObject.CenterY()" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.PathCounter", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Create a hallway object at every cell along the path to the destination" + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "PathfinderObject.PathfindingBehavior::NodeCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "HallwayObject", + "PathfinderObject.PathfindingBehavior::GetNodeX(Variable(__DungeonGenerator.PathCounter))", + "PathfinderObject.PathfindingBehavior::GetNodeY(Variable(__DungeonGenerator.PathCounter))", + "Layer" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Adjust size of hallway objects" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DungeonGenerator::AdjustHallwaySizes" + }, + "parameters": [ + "", + "HallwayObject", + "PathfinderObject", + "PathfindingBehavior", + "TileSize", + "HallwayWidth", + "" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move the pathfinder object to the room that was just connected with a hallway" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetXY" + }, + "parameters": [ + "PathfinderObject", + "=", + "RoomObject.CenterX()", + "=", + "RoomObject.CenterY()" + ] + }, + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "RoomObject", + "__DungeonGenerator.Visited", + "True" + ] + } + ] + } + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Close loop", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If desired, connect a hallway from the last room to the first room" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "CloseLoop", + "True", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set the destination of the pathfinder to the starting room" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "RoomObject", + "__DungeonGenerator.RoomID", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "PathfindingBehavior::SetDestination" + }, + "parameters": [ + "PathfinderObject", + "PathfindingBehavior", + "", + "RoomObject.CenterX()", + "RoomObject.CenterY()" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.PathCounter", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Create a hallway object at every cell along the path to the destination" + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "PathfinderObject.PathfindingBehavior::NodeCount()", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "HallwayObject", + "PathfinderObject.PathfindingBehavior::GetNodeX(Variable(__DungeonGenerator.PathCounter))", + "PathfinderObject.PathfindingBehavior::GetNodeY(Variable(__DungeonGenerator.PathCounter))", + "Layer" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Adjust size of hallway objects" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DungeonGenerator::AdjustHallwaySizes" + }, + "parameters": [ + "", + "HallwayObject", + "PathfinderObject", + "PathfindingBehavior", + "TileSize", + "HallwayWidth", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move the pathfinder object to the room that was just connected with a hallway" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetXY" + }, + "parameters": [ + "PathfinderObject", + "=", + "RoomObject.CenterX()", + "=", + "RoomObject.CenterY()" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Add additional paths between rooms", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If desired, make additional random connections between rooms" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.AdditionalPathCounter", + "=", + "0" + ] + } + ] + }, + { + "infiniteLoopWarning": true, + "type": "BuiltinCommonInstructions::While", + "whileConditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "__DungeonGenerator.AdditionalPathCounter", + "<", + "AdditionalPaths" + ] + } + ], + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set the destination of the pathfinder to the next room (don't select the room that already has the pathfinder)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PickRandomInstance" + }, + "parameters": [ + "RoomObject", + "RoomObject" + ] + }, + { + "type": { + "inverted": true, + "value": "CollisionNP" + }, + "parameters": [ + "PathfinderObject", + "RoomObject", + "", + "", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PathfindingBehavior::SetDestination" + }, + "parameters": [ + "PathfinderObject", + "PathfindingBehavior", + "", + "RoomObject.CenterX()", + "RoomObject.CenterY()" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.PathCounter", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Create a hallway object at every cell along the path to the destination" + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "PathfinderObject.PathfindingBehavior::NodeCount()", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "HallwayObject", + "PathfinderObject.PathfindingBehavior::GetNodeX(Variable(__DungeonGenerator.PathCounter))", + "PathfinderObject.PathfindingBehavior::GetNodeY(Variable(__DungeonGenerator.PathCounter))", + "Layer" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Adjust size of hallway objects" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DungeonGenerator::AdjustHallwaySizes" + }, + "parameters": [ + "", + "HallwayObject", + "PathfinderObject", + "PathfindingBehavior", + "TileSize", + "HallwayWidth", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move the pathfinder object to the room that was just connected with a hallway" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetXY" + }, + "parameters": [ + "PathfinderObject", + "=", + "RoomObject.CenterX()", + "=", + "RoomObject.CenterY()" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.AdditionalPathCounter", + "+", + "1" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Cleanup", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Remove terrain from rooms and hallways.", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Remove terrain from inside rooms and hallways." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "TerrainObject", + "RoomObject", + "", + "", + "yes" + ] + }, + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "TerrainObject", + "HallwayObject", + "", + "", + "yes" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "TerrainObject", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Place walls", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "TerrainObject", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Create walls where terrain touches hallways but not rooms" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "HallwayObject", + "Deleted", + "False" + ] + }, + { + "type": { + "inverted": true, + "value": "CollisionNP" + }, + "parameters": [ + "TerrainObject", + "HallwayObject", + "", + "", + "yes" + ] + }, + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "TerrainObject", + "HallwayObject", + "", + "", + "no" + ] + }, + { + "type": { + "inverted": true, + "value": "CollisionNP" + }, + "parameters": [ + "TerrainObject", + "RoomObject", + "", + "", + "yes" + ] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "WallObject", + "TerrainObject.X()", + "TerrainObject.Y()", + "Layer" + ] + }, + { + "type": { + "value": "Delete" + }, + "parameters": [ + "TerrainObject", + "" + ] + }, + { + "type": { + "value": "ChangeHeight" + }, + "parameters": [ + "WallObject", + "=", + "TileSize" + ] + }, + { + "type": { + "value": "ChangeWidth" + }, + "parameters": [ + "WallObject", + "=", + "TileSize" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Create walls where terrain touches rooms but not hallways" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "CollisionNP" + }, + "parameters": [ + "TerrainObject", + "RoomObject", + "", + "", + "yes" + ] + }, + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "TerrainObject", + "RoomObject", + "", + "", + "no" + ] + }, + { + "type": { + "inverted": true, + "value": "CollisionNP" + }, + "parameters": [ + "TerrainObject", + "HallwayObject", + "", + "", + "yes" + ] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "WallObject", + "TerrainObject.X()", + "TerrainObject.Y()", + "Layer" + ] + }, + { + "type": { + "value": "Delete" + }, + "parameters": [ + "TerrainObject", + "" + ] + }, + { + "type": { + "value": "ChangeWidth" + }, + "parameters": [ + "WallObject", + "=", + "TileSize" + ] + }, + { + "type": { + "value": "ChangeHeight" + }, + "parameters": [ + "WallObject", + "=", + "TileSize" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Delete hallways that are at least partially inside of rooms " + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "HallwayObject", + "RoomObject", + "", + "", + "yes" + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "HallwayObject", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set boolean flag for hallways that are doorways (adjacent to room but not touching)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "HallwayObject", + "RoomObject", + "", + "", + "no" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "HallwayObject", + "__DungeonGenerator.IsRoomEntrance", + "True" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Cleanup", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Remove extra terrain, if needed" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "DeleteUnused", + "True", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "CollisionNP" + }, + "parameters": [ + "TerrainObject", + "RoomObject", + "", + "", + "no" + ] + }, + { + "type": { + "inverted": true, + "value": "CollisionNP" + }, + "parameters": [ + "TerrainObject", + "HallwayObject", + "", + "", + "no" + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "TerrainObject", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Cleanup pathfinder object" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "PathfinderObject", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Tile size (pixels)", + "longDescription": "All objects are based on this size", + "name": "TileSize", + "type": "expression" + }, + { + "description": "Map width (number of colums)", + "name": "MapWidth", + "type": "expression" + }, + { + "description": "Map height (number of rows)", + "name": "MapHeight", + "type": "expression" + }, + { + "description": "Terrain object", + "longDescription": "Used to fill the map that is not covered by floors, hallways, or walls.", + "name": "TerrainObject", + "supplementaryInformation": "Sprite", + "type": "objectList" + }, + { + "description": "Room object", + "longDescription": "Rooms are placed in random locations and will try to not overlap with other rooms. ", + "name": "RoomObject", + "supplementaryInformation": "Sprite", + "type": "objectList" + }, + { + "description": "Hallway object", + "longDescription": "Used to connect room objects. They follow the path made by the pathfinder object.", + "name": "HallwayObject", + "supplementaryInformation": "Sprite", + "type": "objectList" + }, + { + "description": "Number of rooms", + "longDescription": "Rooms should take less than ~25% of map to ensure non-overlapping rooms. If there are too many rooms, they may end up overlapping each other.", + "name": "RoomQty", + "type": "expression" + }, + { + "description": "Layer", + "name": "Layer", + "type": "layer" + }, + { + "description": "Min room width (tiles)", + "name": "MinRoomWidth", + "type": "expression" + }, + { + "description": "Max room width (tiles)", + "name": "MaxRoomWidth", + "type": "expression" + }, + { + "description": "Min room height (tiles)", + "name": "MinRoomHeight", + "type": "expression" + }, + { + "description": "Max room height (tiles)", + "name": "MaxRoomHeight", + "type": "expression" + }, + { + "description": "Pathfinder object", + "longDescription": "Used to identify where hallways are placed between rooms", + "name": "PathfinderObject", + "supplementaryInformation": "Sprite", + "type": "objectList" + }, + { + "description": "Pathfinding behavior (required)", + "name": "PathfindingBehavior", + "supplementaryInformation": "PathfindingBehavior::PathfindingBehavior", + "type": "behavior" + }, + { + "description": "Max separation attempts", + "longDescription": "Number of attempts to separate overalapping rooms. When this number is reached, rooms are left in current position. (Default: 10,000)", + "name": "MaxSeparationAttempts", + "type": "expression" + }, + { + "description": "Connect rooms in a loop", + "name": "CloseLoop", + "type": "yesorno" + }, + { + "description": "Hallway width (tiles)", + "name": "HallwayWidth", + "type": "expression" + }, + { + "description": "Additional paths between connect rooms", + "name": "AdditionalPaths", + "type": "expression" + }, + { + "description": "Delete unused terrain", + "name": "DeleteUnused", + "type": "trueorfalse" + }, + { + "description": "Wall object", + "name": "WallObject", + "supplementaryInformation": "Sprite", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Calculate the number of grid neighbors around an object. Use \"NeighborCount(Object)\" expression to retrieve this value.", + "fullName": "Calculate the number of grid neighbors around an object", + "functionType": "Action", + "name": "CalculateGridNeighbors", + "sentence": "Calculate the number of grid neighbors (_PARAM2_) around _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "Object", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save center point and size as scene variables (since we can't compare instances of the same object)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.ThisCenterX", + "=", + "Object.CenterX()" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.ThisCenterY", + "=", + "Object.CenterY()" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.ThisObjectWidth", + "=", + "Object.Width()" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.ThisNeighborCount", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Initiate offset to start looking for the top-left neighbor" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.NeighborOffsetX", + "=", + "-1" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.NeighborOffsetY", + "=", + "-1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Search for neighbors (but don't consider the center object)" + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "3", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "3", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Neighbor", + "Variable(__DungeonGenerator.ThisCenterX) + (Variable(__DungeonGenerator.NeighborOffsetX) * Variable(__DungeonGenerator.ThisObjectWidth))", + "Variable(__DungeonGenerator.ThisCenterY) + (Variable(__DungeonGenerator.NeighborOffsetY) * Variable(__DungeonGenerator.ThisObjectWidth))" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.ThisNeighborCount", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.NeighborOffsetX", + "+", + "1" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.NeighborOffsetX", + "=", + "-1" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__DungeonGenerator.NeighborOffsetY", + "+", + "1" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save neighbor count in real object" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__DungeonGenerator.Neighbors", + "=", + "Variable(__DungeonGenerator.ThisNeighborCount)" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Primary object (or object group)", + "name": "Object", + "type": "objectList" + }, + { + "description": "Neighbor object (or object group)", + "name": "Neighbor", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "The numerical order this room was created. (Range: 1 to total number of rooms).", + "fullName": "Creation order of room", + "functionType": "Expression", + "name": "RoomID", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "RoomObject.Variable(__DungeonGenerator.RoomID)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Room object", + "name": "RoomObject", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Number of grid neighbors of an object. Requires running the \"CalculateGridNeighbors\" action before using this expression.", + "fullName": "Number of grid neighbors of an object", + "functionType": "Expression", + "name": "NeighborCount", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Variable(__DungeonGenerator.Neighbors)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Check if hallway is a room entrance.", + "fullName": "Hallway is a room entrance", + "functionType": "Condition", + "name": "IsRoomEntrance", + "sentence": "_PARAM1_ is a room entrance", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__DungeonGenerator.IsRoomEntrance", + "True" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Hallway object", + "name": "Object", + "type": "objectList" + } + ], + "objectGroups": [] + } + ], + "eventsFunctionsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "functionName": "AdjustHallwaySizes" + }, + { + "functionName": "FillWorld" + }, + { + "functionName": "GenerateDungeonCave" + }, + { + "functionName": "GenerateDungeonRooms" + }, + { + "functionName": "CalculateGridNeighbors" + }, + { + "functionName": "RoomID" + }, + { + "functionName": "NeighborCount" + }, + { + "functionName": "IsRoomEntrance" + } + ] + }, + "eventsBasedBehaviors": [], + "eventsBasedObjects": [] + } + ], + "externalLayouts": [ + { + "associatedLayout": "Game", + "name": "4Way", + "instances": [ + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_4Way", + "persistentUuid": "f7878de8-d621-4629-afc8-5fcbb25d688d", + "width": 0, + "x": 0, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_right", + "persistentUuid": "c6ec3658-b64e-4cab-8a8b-98903a65fd27", + "width": 0, + "x": 640, + "y": 0, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_left", + "persistentUuid": "5a72b7c8-fd61-40c0-884e-b69731807160", + "width": 0, + "x": -640, + "y": 0, + "zOrder": 3, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_up", + "persistentUuid": "60748f83-5456-40c3-b8d2-4c527981e015", + "width": 0, + "x": 0, + "y": -480, + "zOrder": 4, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_down", + "persistentUuid": "e779ea46-1b9a-4892-8196-1c9d194e2c41", + "width": 0, + "x": 0, + "y": 480, + "zOrder": 5, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "editionSettings": { + "grid": true, + "gridType": "rectangular", + "gridWidth": 640, + "gridHeight": 480, + "gridDepth": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridOffsetZ": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": true, + "zoomFactor": 0.39122201073538554, + "windowMask": false, + "selectedLayer": "", + "gameEditorMode": "instances-editor" + } + }, + { + "associatedLayout": "Game", + "name": "LR", + "instances": [ + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_LR", + "persistentUuid": "f69d2e29-2b65-4e41-93b2-56269c88fba4", + "width": 0, + "x": 0, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_right", + "persistentUuid": "e1e1e2da-9a5f-4db8-a33a-e6478e381d46", + "width": 0, + "x": 640, + "y": 0, + "zOrder": 3, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_left", + "persistentUuid": "114e4509-29d9-4811-b71f-45fa7072dbef", + "width": 0, + "x": -640, + "y": 0, + "zOrder": 4, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "editionSettings": { + "grid": true, + "gridType": "rectangular", + "gridWidth": 640, + "gridHeight": 480, + "gridDepth": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridOffsetZ": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": true, + "zoomFactor": 0.3426186902248371, + "windowMask": false, + "selectedLayer": "", + "gameEditorMode": "instances-editor" + } + }, + { + "associatedLayout": "Game", + "name": "UD", + "instances": [ + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_UD", + "persistentUuid": "5e458a16-7f67-4530-87d5-c46cf1c70a3a", + "width": 0, + "x": 0, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_up", + "persistentUuid": "3b375ba4-cfd5-4918-9c40-366331322c8f", + "width": 0, + "x": 0, + "y": -480, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_down", + "persistentUuid": "a2d2d1ca-ef1a-402a-92ab-4658aaf19d79", + "width": 0, + "x": 0, + "y": 480, + "zOrder": 3, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "editionSettings": { + "grid": true, + "gridType": "rectangular", + "gridWidth": 640, + "gridHeight": 480, + "gridDepth": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridOffsetZ": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": true, + "zoomFactor": 0.3784602076124576, + "windowMask": false, + "selectedLayer": "", + "gameEditorMode": "instances-editor" + } + }, + { + "associatedLayout": "Game", + "name": "DeadL", + "instances": [ + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_DeadL", + "persistentUuid": "37237183-4a66-4f3a-a60d-0c54a8ca4d90", + "width": 0, + "x": 0, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_right", + "persistentUuid": "7030b988-29fe-410d-989a-7d0c936f4c11", + "width": 0, + "x": 640, + "y": 0, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "editionSettings": { + "grid": true, + "gridType": "rectangular", + "gridWidth": 640, + "gridHeight": 480, + "gridDepth": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridOffsetZ": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": true, + "zoomFactor": 0.43214794647750876, + "windowMask": false, + "selectedLayer": "", + "gameEditorMode": "instances-editor" + } + }, + { + "associatedLayout": "Game", + "name": "DeadR", + "instances": [ + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_DeadR", + "persistentUuid": "d251265b-16fb-4e8b-8721-1a08ff078396", + "width": 0, + "x": 0, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_left", + "persistentUuid": "bd898bf7-4f86-492c-ba74-098d55f1d43e", + "width": 0, + "x": -640, + "y": 0, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "editionSettings": { + "grid": true, + "gridType": "rectangular", + "gridWidth": 640, + "gridHeight": 480, + "gridDepth": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridOffsetZ": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": true, + "zoomFactor": 0.4934517391481253, + "windowMask": false, + "selectedLayer": "", + "gameEditorMode": "instances-editor" + } + }, + { + "associatedLayout": "Game", + "name": "DeadUp", + "instances": [ + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_DeadUp", + "persistentUuid": "d1a66cb2-ae2e-4f1d-8766-d9992d6d18ad", + "width": 0, + "x": 0, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_down", + "persistentUuid": "eddf7615-92c4-4b04-940b-6515e299e940", + "width": 0, + "x": 0, + "y": 480, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "editionSettings": { + "grid": true, + "gridType": "rectangular", + "gridWidth": 640, + "gridHeight": 480, + "gridDepth": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridOffsetZ": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": true, + "zoomFactor": 0.43214794647750876, + "windowMask": false, + "selectedLayer": "", + "gameEditorMode": "instances-editor" + } + }, + { + "associatedLayout": "Game", + "name": "DeadDown", + "instances": [ + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_DeadDown", + "persistentUuid": "552c6a78-2267-41c0-9d12-e4d0e1da2ef8", + "width": 0, + "x": 0, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "spr_up", + "persistentUuid": "1635740f-8b55-4918-afdf-bfd9de2db35d", + "width": 0, + "x": 0, + "y": -480, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "editionSettings": { + "grid": true, + "gridType": "rectangular", + "gridWidth": 640, + "gridHeight": 480, + "gridDepth": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridOffsetZ": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": true, + "zoomFactor": 0.5634519864159119, + "windowMask": false, + "selectedLayer": "", + "gameEditorMode": "instances-editor" + } + } + ] } diff --git a/MiniDungeonMultiplayerDev.json.autosave b/MiniDungeonMultiplayerDev.json.autosave new file mode 100644 index 0000000..cb2dc6d --- /dev/null +++ b/MiniDungeonMultiplayerDev.json.autosave @@ -0,0 +1 @@ +{"firstLayout":"","gdVersion":{"build":274,"major":5,"minor":6,"revision":0},"initialGDVersion":"5.6.274","properties":{"adaptGameResolutionAtRuntime":true,"antialiasingMode":"MSAA","antialisingEnabledOnMobile":false,"folderProject":false,"orientation":"landscape","packageName":"com.example.gamename","pixelsRounding":true,"projectUuid":"9386a7f4-fb47-4bec-8bd2-99c1fb11403b","scaleMode":"nearest","sizeOnStartupMode":"","templateSlug":"","version":"1.0.0","name":"MiniDungeonMultiplayerDev","description":"","author":"","windowWidth":640,"windowHeight":480,"latestCompilationDirectory":"","maxFPS":60,"minFPS":20,"verticalSync":false,"platformSpecificAssets":{"android-icon-144":"","android-icon-192":"","android-icon-36":"","android-icon-48":"","android-icon-72":"","android-icon-96":"","android-windowSplashScreenAnimatedIcon":"","desktop-icon-512":"","ios-icon-100":"","ios-icon-1024":"","ios-icon-114":"","ios-icon-120":"","ios-icon-144":"","ios-icon-152":"","ios-icon-167":"","ios-icon-180":"","ios-icon-20":"","ios-icon-29":"","ios-icon-40":"","ios-icon-50":"","ios-icon-57":"","ios-icon-58":"","ios-icon-60":"","ios-icon-72":"","ios-icon-76":"","ios-icon-80":"","ios-icon-87":""},"loadingScreen":{"backgroundColor":0,"backgroundFadeInDuration":0.2,"backgroundImageResourceName":"","gdevelopLogoStyle":"light","logoAndProgressFadeInDuration":0.2,"logoAndProgressLogoFadeInDelay":0.0,"minDuration":1.5,"progressBarColor":16777215,"progressBarHeight":20.0,"progressBarMaxWidth":200.0,"progressBarMinWidth":40.0,"progressBarWidthPercent":30.0,"showGDevelopSplash":true,"showProgressBar":true},"watermark":{"placement":"bottom-left","showWatermark":true},"authorIds":[],"authorUsernames":[],"categories":[],"playableDevices":[],"extensionProperties":[],"platforms":[{"name":"GDevelop JS platform"}],"currentPlatform":"GDevelop JS platform"},"resources":{"resources":[{"file":"Tile Dungeon2x.png","kind":"image","metadata":"","name":"Tile Dungeon2x.png","smoothed":false,"userAdded":false},{"file":"assets/03Idle.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle","smoothed":false,"userAdded":false},{"file":"assets/03Idle2.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle2","smoothed":false,"userAdded":false},{"file":"assets/03Idle3.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle3","smoothed":false,"userAdded":false},{"file":"assets/03Idle4.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle4","smoothed":false,"userAdded":false},{"file":"assets/03Idle5.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle5","smoothed":false,"userAdded":false},{"file":"assets/03Idle6.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle6","smoothed":false,"userAdded":false},{"file":"assets/03Idle7.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle7","smoothed":false,"userAdded":false},{"file":"assets/03Idle8.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle8","smoothed":false,"userAdded":false},{"file":"assets/03Idle9.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle9","smoothed":false,"userAdded":false},{"file":"assets/03Idle10.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle10","smoothed":false,"userAdded":false},{"file":"assets/03Idle11.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle11","smoothed":false,"userAdded":false},{"file":"assets/03Idle12.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle12","smoothed":false,"userAdded":false},{"file":"assets/03Idle13.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle13","smoothed":false,"userAdded":false},{"file":"assets/03Idle14.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle14","smoothed":false,"userAdded":false},{"file":"assets/03Idle15.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle15","smoothed":false,"userAdded":false},{"file":"assets/03Idle16.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle16","smoothed":false,"userAdded":false},{"file":"assets/03Idle17.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle17","smoothed":false,"userAdded":false},{"file":"assets/03Idle18.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle18","smoothed":false,"userAdded":false},{"file":"assets/03Idle19.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle19","smoothed":false,"userAdded":false},{"file":"assets/03Idle20.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle20","smoothed":false,"userAdded":false},{"file":"assets/03Idle21.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle21","smoothed":false,"userAdded":false},{"file":"assets/03Idle22.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle22","smoothed":false,"userAdded":false},{"file":"assets/03Idle23.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle23","smoothed":false,"userAdded":false},{"file":"assets/03Idle24.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle24","smoothed":false,"userAdded":false},{"file":"assets/03Idle25.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle25","smoothed":false,"userAdded":false},{"file":"assets/03Idle26.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle26","smoothed":false,"userAdded":false},{"file":"assets/03Idle27.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle27","smoothed":false,"userAdded":false},{"file":"assets/03Idle28.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle28","smoothed":false,"userAdded":false},{"file":"assets/03Idle29.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle29","smoothed":false,"userAdded":false},{"file":"assets/03Idle30.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle30","smoothed":false,"userAdded":false},{"file":"assets/03Idle31.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle31","smoothed":false,"userAdded":false},{"file":"assets/03Idle32.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle32","smoothed":false,"userAdded":false},{"file":"assets/03Idle33.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle33","smoothed":false,"userAdded":false},{"file":"assets/03Idle34.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle34","smoothed":false,"userAdded":false},{"file":"assets/03Idle35.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle35","smoothed":false,"userAdded":false},{"file":"assets/03Idle36.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Idle36","smoothed":false,"userAdded":false},{"file":"assets/NewSprite.png","kind":"image","metadata":"{\"extension\":\".png\",\"localFilePath\":\"assets/NewSprite.png\"}","name":"NewSprite","smoothed":false,"userAdded":false},{"file":"TestRoom01.png","kind":"image","metadata":"","name":"TestRoom01.png","smoothed":false,"userAdded":false},{"file":"TestRoom02.png","kind":"image","metadata":"","name":"TestRoom02.png","smoothed":false,"userAdded":false},{"file":"TestRoom03.png","kind":"image","metadata":"","name":"TestRoom03.png","smoothed":false,"userAdded":false},{"file":"TestRoom05.png","kind":"image","metadata":"","name":"TestRoom05.png","smoothed":false,"userAdded":false},{"file":"assets/NewSprite2.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"NewSprite2","smoothed":false,"userAdded":false},{"file":"assets/03Walk.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Walk","smoothed":false,"userAdded":false},{"file":"assets/03Walk2.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Walk2","smoothed":false,"userAdded":false},{"file":"assets/03Walk3.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Walk3","smoothed":false,"userAdded":false},{"file":"assets/03Walk4.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Walk4","smoothed":false,"userAdded":false},{"file":"assets/03Walk5.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Walk5","smoothed":false,"userAdded":false},{"file":"assets/03Walk6.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Walk6","smoothed":false,"userAdded":false},{"file":"assets/03Walk7.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Walk7","smoothed":false,"userAdded":false},{"file":"assets/03Walk8.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Walk8","smoothed":false,"userAdded":false},{"file":"assets/03Walk9.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Walk9","smoothed":false,"userAdded":false},{"file":"assets/03Walk10.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"03Walk10","smoothed":false,"userAdded":false},{"file":"TestRoom04.png","kind":"image","metadata":"","name":"TestRoom04.png","smoothed":false,"userAdded":false},{"file":"TestRoom06.png","kind":"image","metadata":"","name":"TestRoom06.png","smoothed":false,"userAdded":false},{"file":"TestRoom07.png","kind":"image","metadata":"","name":"TestRoom07.png","smoothed":false,"userAdded":false},{"file":"TestRoom08.png","kind":"image","metadata":"","name":"TestRoom08.png","smoothed":false,"userAdded":false},{"file":"TestRoom09.png","kind":"image","metadata":"","name":"TestRoom09.png","smoothed":false,"userAdded":false},{"file":"TestRoom010.png","kind":"image","metadata":"","name":"TestRoom010.png","smoothed":false,"userAdded":false},{"file":"TestRoom011.png","kind":"image","metadata":"","name":"TestRoom011.png","smoothed":false,"userAdded":false},{"file":"TestRoom012.png","kind":"image","metadata":"","name":"TestRoom012.png","smoothed":false,"userAdded":false},{"file":"TestRoom013.png","kind":"image","metadata":"","name":"TestRoom013.png","smoothed":false,"userAdded":false},{"file":"TestRoom10.png","kind":"image","metadata":"","name":"TestRoom10.png","smoothed":false,"userAdded":false},{"file":"TestRoom11.png","kind":"image","metadata":"","name":"TestRoom11.png","smoothed":false,"userAdded":false},{"file":"TestRoom12.png","kind":"image","metadata":"","name":"TestRoom12.png","smoothed":false,"userAdded":false},{"file":"TestRoom13.png","kind":"image","metadata":"","name":"TestRoom13.png","smoothed":false,"userAdded":false},{"file":"assets/NewSprite3.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"NewSprite3","smoothed":false,"userAdded":false},{"file":"TestRoom4Way.png","kind":"image","metadata":"","name":"TestRoom4Way.png","smoothed":false,"userAdded":false},{"file":"assets/NewSprite4.png","kind":"image","metadata":"{\"extension\":\".png\",\"localFilePath\":\"assets/NewSprite4.png\"}","name":"NewSprite4","smoothed":false,"userAdded":false},{"file":"TestRoomLR.png","kind":"image","metadata":"","name":"TestRoomLR.png","smoothed":false,"userAdded":false},{"file":"TestRoomUD.png","kind":"image","metadata":"","name":"TestRoomUD.png","smoothed":false,"userAdded":false},{"file":"TestRoomDeadL.png","kind":"image","metadata":"","name":"TestRoomDeadL.png","smoothed":false,"userAdded":false},{"file":"TestRoomDeadR.png","kind":"image","metadata":"","name":"TestRoomDeadR.png","smoothed":false,"userAdded":false},{"file":"TestRoomDeadU.png","kind":"image","metadata":"","name":"TestRoomDeadU.png","smoothed":false,"userAdded":false},{"file":"TestRoomDeadD.png","kind":"image","metadata":"","name":"TestRoomDeadD.png","smoothed":false,"userAdded":false},{"file":"assets/NewSprite5.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"NewSprite5","smoothed":false,"userAdded":false},{"file":"assets/NewSprite6.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"NewSprite6","smoothed":false,"userAdded":false},{"file":"assets/NewSprite7.png","kind":"image","metadata":"{\"extension\":\".png\"}","name":"NewSprite7","smoothed":false,"userAdded":false}]},"objects":[],"objectsFolderStructure":{"folderName":"__ROOT"},"objectsGroups":[],"variables":[],"layouts":[{"b":0,"disableInputWhenNotFocused":true,"mangledName":"Game","name":"Game","r":0,"standardSortMethod":true,"stopSoundsOnStartup":true,"title":"","v":0,"uiSettings":{"grid":true,"gridType":"rectangular","gridWidth":640.0,"gridHeight":480.0,"gridDepth":32.0,"gridOffsetX":0.0,"gridOffsetY":0.0,"gridOffsetZ":0.0,"gridColor":10401023.0,"gridAlpha":0.8,"snap":true,"zoomFactor":0.4335774304702383,"windowMask":false,"selectedLayer":"","gameEditorMode":"instances-editor"},"objectsGroups":[{"name":"Rooms","objects":[{"name":"spr_4Way"},{"name":"spr_LR"},{"name":"spr_UD"},{"name":"spr_DeadL"},{"name":"spr_DeadR"},{"name":"spr_DeadUp"},{"name":"spr_DeadDown"}]},{"name":"Checker","objects":[{"name":"spr_right"},{"name":"spr_left"},{"name":"spr_up"},{"name":"spr_down"}]}],"variables":[{"name":"var_roomCount","persistentUuid":"c143876b-6251-4aec-a302-41a096a13d9d","type":"number","value":1.0}],"instances":[{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_player","persistentUuid":"168f7870-38ea-449a-b480-8a38e037e176","width":0.0,"x":475.0,"y":257.0,"zOrder":30,"numberProperties":[],"stringProperties":[],"initialVariables":[]},{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_4Way","persistentUuid":"346c6f81-2757-45a8-a096-c776d3ab76bc","width":0.0,"x":0.0,"y":0.0,"zOrder":1,"numberProperties":[],"stringProperties":[],"initialVariables":[]},{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_right","persistentUuid":"e34ef6cd-0335-48e6-8d19-d84d325b8591","width":0.0,"x":640.0,"y":0.0,"zOrder":31,"numberProperties":[],"stringProperties":[],"initialVariables":[]},{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_left","persistentUuid":"a02511d0-68fd-4f90-afe7-4326ed28fd87","width":0.0,"x":-640.0,"y":0.0,"zOrder":32,"numberProperties":[],"stringProperties":[],"initialVariables":[]},{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_up","persistentUuid":"bfc88395-d3c8-47c3-bb4e-c2a8d1950bb8","width":0.0,"x":0.0,"y":-480.0,"zOrder":33,"numberProperties":[],"stringProperties":[],"initialVariables":[]},{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_down","persistentUuid":"03b1aa00-32fd-48b7-aaea-14d1e7e1196b","width":0.0,"x":0.0,"y":480.0,"zOrder":34,"numberProperties":[],"stringProperties":[],"initialVariables":[]}],"objects":[{"adaptCollisionMaskAutomatically":false,"assetStoreId":"","name":"spr_player","persistentUuid":"15baac05-8645-4485-b856-649122e1892c","type":"Sprite","updateIfNotVisible":false,"variables":[],"effects":[],"behaviors":[{"acceleration":9999.0,"allowDiagonals":true,"angleOffset":0,"angularMaxSpeed":180,"customIsometryAngle":30,"deceleration":9999.0,"ignoreDefaultControls":false,"maxSpeed":200,"movementAngleOffset":0,"name":"TopDownMovement","rotateObject":false,"type":"TopDownMovementBehavior::TopDownMovementBehavior","useLegacyTurnBack":false,"viewpoint":"TopDown"}],"animations":[{"name":"03Idle","useMultipleDirections":false,"directions":[{"looping":true,"metadata":"{\"pskl\":{}}","timeBetweenFrames":0.08,"sprites":[{"hasCustomCollisionMask":true,"image":"03Idle25","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]},{"hasCustomCollisionMask":true,"image":"03Idle26","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]},{"hasCustomCollisionMask":true,"image":"03Idle27","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]},{"hasCustomCollisionMask":true,"image":"03Idle28","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]},{"hasCustomCollisionMask":true,"image":"03Idle29","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]},{"hasCustomCollisionMask":true,"image":"03Idle30","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]},{"hasCustomCollisionMask":true,"image":"03Idle31","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]},{"hasCustomCollisionMask":true,"image":"03Idle32","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]},{"hasCustomCollisionMask":true,"image":"03Idle33","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]},{"hasCustomCollisionMask":true,"image":"03Idle34","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]},{"hasCustomCollisionMask":true,"image":"03Idle35","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]},{"hasCustomCollisionMask":true,"image":"03Idle36","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]}]}]},{"name":"03Walk","useMultipleDirections":false,"directions":[{"looping":true,"metadata":"{\"pskl\":{}}","timeBetweenFrames":0.08,"sprites":[{"hasCustomCollisionMask":true,"image":"03Walk","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]},{"hasCustomCollisionMask":true,"image":"03Walk2","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]},{"hasCustomCollisionMask":true,"image":"03Walk3","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]},{"hasCustomCollisionMask":true,"image":"03Walk4","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]},{"hasCustomCollisionMask":true,"image":"03Walk5","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]},{"hasCustomCollisionMask":true,"image":"03Walk6","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]},{"hasCustomCollisionMask":true,"image":"03Walk7","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]},{"hasCustomCollisionMask":true,"image":"03Walk8","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]},{"hasCustomCollisionMask":true,"image":"03Walk9","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]},{"hasCustomCollisionMask":true,"image":"03Walk10","points":[],"originPoint":{"name":"origine","x":0.0,"y":40.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":28.0},{"x":32.0,"y":28.0},{"x":32.0,"y":40.0},{"x":0.0,"y":40.0}]]}]}]}]},{"adaptCollisionMaskAutomatically":true,"assetStoreId":"","name":"spr_4Way","persistentUuid":"0e24c193-6010-4988-84e4-84247e4111a6","type":"Sprite","updateIfNotVisible":false,"variables":[],"effects":[],"behaviors":[],"animations":[{"name":"","useMultipleDirections":false,"directions":[{"looping":false,"timeBetweenFrames":0.08,"sprites":[{"hasCustomCollisionMask":true,"image":"TestRoom4Way.png","points":[],"originPoint":{"name":"origine","x":0.0,"y":0.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":0.0},{"x":640.0,"y":0.0},{"x":640.0,"y":480.0},{"x":0.0,"y":480.0}]]}]}]}]},{"adaptCollisionMaskAutomatically":true,"assetStoreId":"","name":"spr_right","persistentUuid":"1e631ce1-545f-451f-9f16-36ae35076ff7","type":"Sprite","updateIfNotVisible":false,"variables":[{"name":"var_Random","persistentUuid":"22df5395-a194-44b8-bc37-bb550d070d01","type":"number","value":0.0}],"effects":[],"behaviors":[],"animations":[{"name":"NewSprite","useMultipleDirections":false,"directions":[{"looping":false,"metadata":"{\"pskl\":{}}","timeBetweenFrames":0.08,"sprites":[{"hasCustomCollisionMask":true,"image":"NewSprite4","points":[],"originPoint":{"name":"origine","x":0.0,"y":0.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":0.0},{"x":32.0,"y":0.0},{"x":32.0,"y":32.0},{"x":0.0,"y":32.0}]]}]}]}]},{"adaptCollisionMaskAutomatically":true,"assetStoreId":"","name":"spr_LR","persistentUuid":"216f1ec8-083e-4ddc-8ecc-19dfe2b3e31d","type":"Sprite","updateIfNotVisible":false,"variables":[],"effects":[],"behaviors":[],"animations":[{"name":"","useMultipleDirections":false,"directions":[{"looping":false,"timeBetweenFrames":0.08,"sprites":[{"hasCustomCollisionMask":true,"image":"TestRoomLR.png","points":[],"originPoint":{"name":"origine","x":0.0,"y":0.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":0.0},{"x":640.0,"y":0.0},{"x":640.0,"y":480.0},{"x":0.0,"y":480.0}]]}]}]}]},{"adaptCollisionMaskAutomatically":true,"assetStoreId":"","name":"spr_UD","persistentUuid":"63a7090f-a6d8-4eb9-93ee-9e076596ce88","type":"Sprite","updateIfNotVisible":false,"variables":[],"effects":[],"behaviors":[],"animations":[{"name":"","useMultipleDirections":false,"directions":[{"looping":false,"timeBetweenFrames":0.08,"sprites":[{"hasCustomCollisionMask":true,"image":"TestRoomUD.png","points":[],"originPoint":{"name":"origine","x":0.0,"y":0.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":0.0},{"x":640.0,"y":0.0},{"x":640.0,"y":480.0},{"x":0.0,"y":480.0}]]}]}]}]},{"adaptCollisionMaskAutomatically":true,"assetStoreId":"","name":"spr_DeadL","persistentUuid":"cc600b8e-3783-4703-abe3-426832db2a92","type":"Sprite","updateIfNotVisible":false,"variables":[],"effects":[],"behaviors":[],"animations":[{"name":"","useMultipleDirections":false,"directions":[{"looping":false,"timeBetweenFrames":0.08,"sprites":[{"hasCustomCollisionMask":true,"image":"TestRoomDeadL.png","points":[],"originPoint":{"name":"origine","x":0.0,"y":0.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":0.0},{"x":640.0,"y":0.0},{"x":640.0,"y":480.0},{"x":0.0,"y":480.0}]]}]}]}]},{"adaptCollisionMaskAutomatically":true,"assetStoreId":"","name":"spr_DeadR","persistentUuid":"49f00013-44d6-443c-9ffe-0330d4559935","type":"Sprite","updateIfNotVisible":false,"variables":[],"effects":[],"behaviors":[],"animations":[{"name":"","useMultipleDirections":false,"directions":[{"looping":false,"timeBetweenFrames":0.08,"sprites":[{"hasCustomCollisionMask":true,"image":"TestRoomDeadR.png","points":[],"originPoint":{"name":"origine","x":0.0,"y":0.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":0.0},{"x":640.0,"y":0.0},{"x":640.0,"y":480.0},{"x":0.0,"y":480.0}]]}]}]}]},{"adaptCollisionMaskAutomatically":true,"assetStoreId":"","name":"spr_DeadUp","persistentUuid":"76f7a08f-18f4-4bf4-a4d2-9db38bad7409","type":"Sprite","updateIfNotVisible":false,"variables":[],"effects":[],"behaviors":[],"animations":[{"name":"","useMultipleDirections":false,"directions":[{"looping":false,"timeBetweenFrames":0.08,"sprites":[{"hasCustomCollisionMask":true,"image":"TestRoomDeadU.png","points":[],"originPoint":{"name":"origine","x":0.0,"y":0.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":0.0},{"x":640.0,"y":0.0},{"x":640.0,"y":480.0},{"x":0.0,"y":480.0}]]}]}]}]},{"adaptCollisionMaskAutomatically":true,"assetStoreId":"","name":"spr_DeadDown","persistentUuid":"24006229-fc36-4f86-8b51-c78029706d67","type":"Sprite","updateIfNotVisible":false,"variables":[],"effects":[],"behaviors":[],"animations":[{"name":"","useMultipleDirections":false,"directions":[{"looping":false,"timeBetweenFrames":0.08,"sprites":[{"hasCustomCollisionMask":true,"image":"TestRoomDeadD.png","points":[],"originPoint":{"name":"origine","x":0.0,"y":0.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":0.0},{"x":640.0,"y":0.0},{"x":640.0,"y":480.0},{"x":0.0,"y":480.0}]]}]}]}]},{"adaptCollisionMaskAutomatically":true,"assetStoreId":"","name":"spr_left","persistentUuid":"975b00e7-0480-4497-baaf-2030a83377fb","type":"Sprite","updateIfNotVisible":false,"variables":[{"name":"var_Random","persistentUuid":"ce81a637-0f6f-41db-a57b-8decaed70174","type":"number","value":0.0}],"effects":[],"behaviors":[],"animations":[{"name":"NewSprite","useMultipleDirections":false,"directions":[{"looping":false,"metadata":"{\"pskl\":{}}","timeBetweenFrames":0.08,"sprites":[{"hasCustomCollisionMask":true,"image":"NewSprite5","points":[],"originPoint":{"name":"origine","x":0.0,"y":0.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":0.0},{"x":32.0,"y":0.0},{"x":32.0,"y":32.0},{"x":0.0,"y":32.0}]]}]}]}]},{"adaptCollisionMaskAutomatically":true,"assetStoreId":"","name":"spr_up","persistentUuid":"64de8436-160b-4de7-af7c-2e25f8e83b8b","type":"Sprite","updateIfNotVisible":false,"variables":[{"name":"var_Random","persistentUuid":"297f1f68-b1b2-42fd-90e3-ed8b0e5f8335","type":"number","value":0.0}],"effects":[],"behaviors":[],"animations":[{"name":"NewSprite","useMultipleDirections":false,"directions":[{"looping":false,"metadata":"{\"pskl\":{}}","timeBetweenFrames":0.08,"sprites":[{"hasCustomCollisionMask":true,"image":"NewSprite6","points":[],"originPoint":{"name":"origine","x":0.0,"y":0.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":0.0},{"x":32.0,"y":0.0},{"x":32.0,"y":32.0},{"x":0.0,"y":32.0}]]}]}]}]},{"adaptCollisionMaskAutomatically":true,"assetStoreId":"","name":"spr_down","persistentUuid":"11b66a89-0299-4709-97bb-fbfd0e05d9ab","type":"Sprite","updateIfNotVisible":false,"variables":[{"name":"var_Random","persistentUuid":"01025634-8159-420e-b49c-09c609ea3e6a","type":"number","value":0.0}],"effects":[],"behaviors":[],"animations":[{"name":"NewSprite","useMultipleDirections":false,"directions":[{"looping":false,"metadata":"{\"pskl\":{}}","timeBetweenFrames":0.08,"sprites":[{"hasCustomCollisionMask":true,"image":"NewSprite7","points":[],"originPoint":{"name":"origine","x":0.0,"y":0.0},"centerPoint":{"automatic":true,"name":"centre","x":0.0,"y":0.0},"customCollisionMask":[[{"x":0.0,"y":0.0},{"x":32.0,"y":0.0},{"x":32.0,"y":32.0},{"x":0.0,"y":32.0}]]}]}]}]}],"objectsFolderStructure":{"folderName":"__ROOT","children":[{"objectName":"spr_player"},{"objectName":"spr_4Way"},{"objectName":"spr_right"},{"objectName":"spr_left"},{"objectName":"spr_up"},{"objectName":"spr_down"},{"objectName":"spr_LR"},{"objectName":"spr_DeadUp"},{"objectName":"spr_DeadDown"},{"objectName":"spr_UD"},{"objectName":"spr_DeadL"},{"objectName":"spr_DeadR"}]},"events":[{"type":"BuiltinCommonInstructions::Link","include":{"includeConfig":0},"target":"Functions"}],"layers":[{"ambientLightColorB":200,"ambientLightColorG":200,"ambientLightColorR":200,"camera2DPlaneMaxDrawingDistance":5000.0,"camera3DFarPlaneDistance":10000.0,"camera3DFieldOfView":45.0,"camera3DNearPlaneDistance":3.0,"cameraType":"","followBaseLayerCamera":false,"isLightingLayer":false,"isLocked":false,"name":"","renderingType":"","visibility":true,"cameras":[{"defaultSize":true,"defaultViewport":true,"height":0.0,"viewportBottom":1.0,"viewportLeft":0.0,"viewportRight":1.0,"viewportTop":0.0,"width":0.0}],"effects":[{"effectType":"Scene3D::HemisphereLight","name":"3D Ambient Hemisphere Light","doubleParameters":{"elevation":40.0,"intensity":0.33,"rotation":300.0},"stringParameters":{"groundColor":"127;127;127","skyColor":"255;255;255","top":"Z+"},"booleanParameters":{}},{"effectType":"Scene3D::DirectionalLight","name":"3D Sun Light","doubleParameters":{"distanceFromCamera":1500.0,"elevation":40.0,"frustumSize":4000.0,"intensity":0.75,"minimumShadowBias":0.0,"rotation":300.0},"stringParameters":{"color":"255;255;255","shadowQuality":"medium","top":"Z+"},"booleanParameters":{"isCastingShadow":true}}]},{"ambientLightColorB":200,"ambientLightColorG":200,"ambientLightColorR":200,"camera2DPlaneMaxDrawingDistance":5000.0,"camera3DFarPlaneDistance":10000.0,"camera3DFieldOfView":45.0,"camera3DNearPlaneDistance":3.0,"cameraType":"","followBaseLayerCamera":false,"isLightingLayer":false,"isLocked":false,"name":"UI","renderingType":"","visibility":true,"cameras":[],"effects":[{"effectType":"Scene3D::HemisphereLight","name":"3D Ambient Hemisphere Light","doubleParameters":{"elevation":40.0,"intensity":0.33,"rotation":300.0},"stringParameters":{"groundColor":"127;127;127","skyColor":"255;255;255","top":"Z+"},"booleanParameters":{}},{"effectType":"Scene3D::DirectionalLight","name":"3D Sun Light","doubleParameters":{"distanceFromCamera":1500.0,"elevation":40.0,"frustumSize":4000.0,"intensity":0.75,"minimumShadowBias":0.0,"rotation":300.0},"stringParameters":{"color":"255;255;255","shadowQuality":"medium","top":"Z+"},"booleanParameters":{"isCastingShadow":true}}]}],"behaviorsSharedData":[{"name":"Animation","type":"AnimatableCapability::AnimatableBehavior"},{"name":"Effect","type":"EffectCapability::EffectBehavior"},{"name":"Flippable","type":"FlippableCapability::FlippableBehavior"},{"name":"Opacity","type":"OpacityCapability::OpacityBehavior"},{"name":"Resizable","type":"ResizableCapability::ResizableBehavior"},{"name":"Scale","type":"ScalableCapability::ScalableBehavior"},{"name":"TopDownMovement","type":"TopDownMovementBehavior::TopDownMovementBehavior"}]}],"externalEvents":[{"associatedLayout":"Game","name":"Functions","events":[{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Scene Start","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"SceneJustBegins"},"parameters":[""]}],"actions":[{"type":{"value":"ZoomCamera"},"parameters":["","0","",""]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Generate Rooms","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Right"},{"type":"BuiltinCommonInstructions::ForEach","object":"spr_right","conditions":[],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"PickRandomInstance"},"parameters":["","spr_right"]}],"actions":[{"type":{"value":"SetNumberObjectVariable"},"parameters":["spr_right","var_Random","=","RandomInRange(1,6)"]}],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NumberVariable"},"parameters":["var_roomCount","<=","8"]}],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NumberObjectVariable"},"parameters":["spr_right","var_Random",">=","1"]},{"type":{"value":"NumberObjectVariable"},"parameters":["spr_right","var_Random","<=","3"]}],"actions":[{"type":{"value":"BuiltinExternalLayouts::CreateObjectsFromExternalLayout"},"parameters":["","\"LR\"","spr_right.X()","spr_right.Y()",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NumberObjectVariable"},"parameters":["spr_right","var_Random",">=","4"]},{"type":{"value":"NumberObjectVariable"},"parameters":["spr_right","var_Random","<=","5"]}],"actions":[{"type":{"value":"BuiltinExternalLayouts::CreateObjectsFromExternalLayout"},"parameters":["","\"DeadR\"","spr_right.X()","spr_right.Y()",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NumberObjectVariable"},"parameters":["spr_right","var_Random","=","6"]}],"actions":[{"type":{"value":"BuiltinExternalLayouts::CreateObjectsFromExternalLayout"},"parameters":["","\"4Way\"","spr_right.X()","spr_right.Y()",""]}]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NumberVariable"},"parameters":["var_roomCount",">","8"]}],"actions":[{"type":{"value":"BuiltinExternalLayouts::CreateObjectsFromExternalLayout"},"parameters":["","\"DeadR\"","spr_right.X()","spr_right.Y()",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"PickNearest"},"parameters":["spr_left","spr_right.X()","spr_right.Y()",""]}],"actions":[{"type":{"value":"Delete"},"parameters":["spr_left",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"Delete"},"parameters":["spr_right",""]},{"type":{"value":"SetNumberVariable"},"parameters":["var_roomCount","+","1"]}]}]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Left"},{"type":"BuiltinCommonInstructions::ForEach","object":"spr_left","conditions":[],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"PickRandomInstance"},"parameters":["","spr_left"]}],"actions":[{"type":{"value":"SetNumberObjectVariable"},"parameters":["spr_left","var_Random","=","RandomInRange(1,6)"]}],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NumberVariable"},"parameters":["var_roomCount","<=","8"]}],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NumberObjectVariable"},"parameters":["spr_left","var_Random",">=","1"]},{"type":{"value":"NumberObjectVariable"},"parameters":["spr_left","var_Random","<=","3"]}],"actions":[{"type":{"value":"BuiltinExternalLayouts::CreateObjectsFromExternalLayout"},"parameters":["","\"LR\"","spr_left.X()","spr_left.Y()",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NumberObjectVariable"},"parameters":["spr_left","var_Random",">=","4"]},{"type":{"value":"NumberObjectVariable"},"parameters":["spr_left","var_Random","<=","5"]}],"actions":[{"type":{"value":"BuiltinExternalLayouts::CreateObjectsFromExternalLayout"},"parameters":["","\"DeadL\"","spr_left.X()","spr_left.Y()",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NumberObjectVariable"},"parameters":["spr_left","var_Random","=","6"]}],"actions":[{"type":{"value":"BuiltinExternalLayouts::CreateObjectsFromExternalLayout"},"parameters":["","\"4Way\"","spr_left.X()","spr_left.Y()",""]}]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NumberVariable"},"parameters":["var_roomCount",">","8"]}],"actions":[{"type":{"value":"BuiltinExternalLayouts::CreateObjectsFromExternalLayout"},"parameters":["","\"DeadL\"","spr_left.X()","spr_left.Y()",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"PickNearest"},"parameters":["spr_right","spr_left.X()","spr_left.Y()",""]}],"actions":[{"type":{"value":"Delete"},"parameters":["spr_right",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"Delete"},"parameters":["spr_left",""]},{"type":{"value":"SetNumberVariable"},"parameters":["var_roomCount","+","1"]}]}]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Up"},{"type":"BuiltinCommonInstructions::ForEach","object":"spr_up","conditions":[],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"PickRandomInstance"},"parameters":["","spr_up"]}],"actions":[{"type":{"value":"SetNumberObjectVariable"},"parameters":["spr_up","var_Random","=","RandomInRange(1,6)"]}],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NumberVariable"},"parameters":["var_roomCount","<=","8"]}],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NumberObjectVariable"},"parameters":["spr_up","var_Random",">=","1"]},{"type":{"value":"NumberObjectVariable"},"parameters":["spr_up","var_Random","<=","3"]}],"actions":[{"type":{"value":"BuiltinExternalLayouts::CreateObjectsFromExternalLayout"},"parameters":["","\"UD\"","spr_up.X()","spr_up.Y()",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NumberObjectVariable"},"parameters":["spr_up","var_Random",">=","4"]},{"type":{"value":"NumberObjectVariable"},"parameters":["spr_up","var_Random","<=","5"]}],"actions":[{"type":{"value":"BuiltinExternalLayouts::CreateObjectsFromExternalLayout"},"parameters":["","\"DeadUp\"","spr_up.X()","spr_up.Y()",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NumberObjectVariable"},"parameters":["spr_up","var_Random","=","6"]}],"actions":[{"type":{"value":"BuiltinExternalLayouts::CreateObjectsFromExternalLayout"},"parameters":["","\"4Way\"","spr_up.X()","spr_up.Y()",""]}]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NumberVariable"},"parameters":["var_roomCount",">","8"]}],"actions":[{"type":{"value":"BuiltinExternalLayouts::CreateObjectsFromExternalLayout"},"parameters":["","\"DeadUp\"","spr_up.X()","spr_up.Y()",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"PickNearest"},"parameters":["spr_down","spr_up.X()","spr_up.Y()",""]}],"actions":[{"type":{"value":"Delete"},"parameters":["spr_down",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"Delete"},"parameters":["spr_up",""]},{"type":{"value":"SetNumberVariable"},"parameters":["var_roomCount","+","1"]}]}]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Down"},{"type":"BuiltinCommonInstructions::ForEach","object":"spr_down","conditions":[],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"PickRandomInstance"},"parameters":["","spr_down"]}],"actions":[{"type":{"value":"SetNumberObjectVariable"},"parameters":["spr_down","var_Random","=","RandomInRange(1,6)"]}],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NumberVariable"},"parameters":["var_roomCount","<=","8"]}],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NumberObjectVariable"},"parameters":["spr_down","var_Random",">=","1"]},{"type":{"value":"NumberObjectVariable"},"parameters":["spr_down","var_Random","<=","3"]}],"actions":[{"type":{"value":"BuiltinExternalLayouts::CreateObjectsFromExternalLayout"},"parameters":["","\"UD\"","spr_down.X()","spr_down.Y()",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NumberObjectVariable"},"parameters":["spr_down","var_Random",">=","4"]},{"type":{"value":"NumberObjectVariable"},"parameters":["spr_down","var_Random","<=","5"]}],"actions":[{"type":{"value":"BuiltinExternalLayouts::CreateObjectsFromExternalLayout"},"parameters":["","\"DeadDown\"","spr_down.X()","spr_down.Y()",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NumberObjectVariable"},"parameters":["spr_down","var_Random","=","6"]}],"actions":[{"type":{"value":"BuiltinExternalLayouts::CreateObjectsFromExternalLayout"},"parameters":["","\"4Way\"","spr_down.X()","spr_down.Y()",""]}]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NumberVariable"},"parameters":["var_roomCount",">","8"]}],"actions":[{"type":{"value":"BuiltinExternalLayouts::CreateObjectsFromExternalLayout"},"parameters":["","\"DeadDown\"","spr_down.X()","spr_down.Y()",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"PickNearest"},"parameters":["spr_up","spr_down.X()","spr_down.Y()",""]}],"actions":[{"type":{"value":"Delete"},"parameters":["spr_up",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"Delete"},"parameters":["spr_down",""]},{"type":{"value":"SetNumberVariable"},"parameters":["var_roomCount","+","1"]}]}]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Movement/Sprite Control","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"TopDownMovementBehavior::TopDownMovementBehavior::IsUsingControl"},"parameters":["spr_player","TopDownMovement","\"Right\""]}],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"TopDownMovementBehavior::TopDownMovementBehavior::IsMovementAngleAround"},"parameters":["spr_player","TopDownMovement","0","45"]},{"type":{"value":"BuiltinCommonInstructions::Once"},"parameters":[]}],"actions":[{"type":{"value":"FlippableCapability::FlippableBehavior::FlipX"},"parameters":["spr_player","Flippable","no"]},{"type":{"value":"AnimatableCapability::AnimatableBehavior::SetName"},"parameters":["spr_player","Animation","=","\"03Walk\""]}]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"TopDownMovementBehavior::TopDownMovementBehavior::IsMovementAngleAround"},"parameters":["spr_player","TopDownMovement","180","45"]},{"type":{"value":"BuiltinCommonInstructions::Once"},"parameters":[]}],"actions":[{"type":{"value":"FlippableCapability::FlippableBehavior::FlipX"},"parameters":["spr_player","Flippable","yes"]},{"type":{"value":"AnimatableCapability::AnimatableBehavior::SetName"},"parameters":["spr_player","Animation","=","\"03Walk\""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"inverted":true,"value":"TopDownMovementBehavior::IsMoving"},"parameters":["spr_player","TopDownMovement"]},{"type":{"value":"BuiltinCommonInstructions::Once"},"parameters":[]}],"actions":[{"type":{"value":"AnimatableCapability::AnimatableBehavior::SetName"},"parameters":["spr_player","Animation","=","\"03Idle\""]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Camera Control","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"CollisionNP"},"parameters":["spr_player","Rooms","","",""]}],"actions":[{"type":{"value":"RoomBasedCameraMovement::MoveCameraToActiveRoom"},"parameters":["","Rooms","spr_player","","","0","","","0",""]}]}],"parameters":[]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"KeyFromTextReleased"},"parameters":["","\"Space\""]}],"actions":[{"type":{"value":"Scene"},"parameters":["","\"Game\"",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"CollisionNP"},"parameters":["Rooms","Rooms","","","yes"]}],"actions":[{"type":{"value":"Scene"},"parameters":["","\"Game\"",""]}]}]}],"eventsFunctionsExtensions":[{"author":"","category":"Camera","dimension":"2D","extensionNamespace":"","fullName":"Smooth Camera","gdevelopVersion":">=5.5.222","helpPath":"/tutorials/follow-player-with-camera/","iconUrl":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQoJLnN0MXtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwO30NCjwvc3R5bGU+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjQsMTNoLTZjLTEuMSwwLTItMC45LTItMlY1YzAtMS4xLDAuOS0yLDItMmg2YzEuMSwwLDIsMC45LDIsMnY2QzI2LDEyLjEsMjUuMSwxMywyNCwxM3oiLz4NCjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0yNiw4djEwYzAsMS4xLTAuOSwyLTIsMkg4Yy0xLjEsMC0yLTAuOS0yLTJWOGMwLTEuMSwwLjktMiwyLTJoOCIvPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjEiIGN5PSI4IiByPSIyIi8+DQo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxMSIgY3k9IjE2IiByPSIxIi8+DQo8cmVjdCB4PSI5IiB5PSI5IiBjbGFzcz0ic3QwIiB3aWR0aD0iNCIgaGVpZ2h0PSIzIi8+DQo8cG9seWxpbmUgY2xhc3M9InN0MCIgcG9pbnRzPSIyMSwyOSAyMSwyOSAxMSwyOSAxMSwyOSAiLz4NCjxwb2x5bGluZSBjbGFzcz0ic3QwIiBwb2ludHM9IjE4LDIwIDE4LDI5IDE0LDI5IDE0LDIwICIvPg0KPHJlY3QgeD0iNyIgeT0iMyIgY2xhc3M9InN0MCIgd2lkdGg9IjQiIGhlaWdodD0iMyIvPg0KPC9zdmc+DQo=","name":"SmoothCamera","previewIconUrl":"https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Computers and Hardware/Computers and Hardware_camcoder_gopro_go_pro_camera.svg","shortDescription":"Smoothly scroll to follow an object.","version":"0.4.5","description":["The camera follows an object according to:","- a frame rate independent catch-up speed to make the scrolling from smooth to strong","- a maximum speed to do linear following ([open the project online](https://editor.gdevelop.io/?project=example://platformer-with-tilemap)) or slow down the camera when teleporting the object","- a follow-free zone to avoid scrolling on small movements","- an offset to see further in one direction","- an extra delay and catch-up speed to give an impression of speed (useful for dash)","- position forecasting and delay to simulate a cameraman response time","","A platformer dedicated behavior allows to switch of settings when the character is in air or on the floor. This can be used to stabilize the camera when jumping."],"origin":{"identifier":"SmoothCamera","name":"gdevelop-extension-store"},"tags":["camera","scrolling","follow","smooth","platformer","platform"],"authorIds":["IWykYNRvhCZBN3vEgKEbBPOR3Oc2"],"dependencies":[],"globalVariables":[],"sceneVariables":[],"eventsFunctions":[],"eventsFunctionsFolderStructure":{"folderName":"__ROOT"},"eventsBasedBehaviors":[{"description":"Smoothly scroll to follow an object.","fullName":"Smooth Camera","helpPath":"","iconUrl":"","name":"SmoothCamera","objectType":"","previewIconUrl":"","quickCustomizationVisibility":"hidden","eventsFunctions":[{"fullName":"","functionType":"Action","name":"onCreated","sentence":"","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Update private properties through setters to check their values and initialize state."},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SmoothCamera::SmoothCamera::SetLeftwardSpeed"},"parameters":["Object","Behavior","LeftwardSpeed","log(1 - )"]},{"type":{"value":"SmoothCamera::SmoothCamera::SetRightwardSpeed"},"parameters":["Object","Behavior","RightwardSpeed","log(1 - )"]},{"type":{"value":"SmoothCamera::SmoothCamera::SetUpwardSpeed"},"parameters":["Object","Behavior","UpwardSpeed","log(1 - )"]},{"type":{"value":"SmoothCamera::SmoothCamera::SetDownwardSpeed"},"parameters":["Object","Behavior","DownwardSpeed","log(1 - )"]},{"type":{"value":"SmoothCamera::SmoothCamera::SetLeftwardSpeedMax"},"parameters":["Object","Behavior","LeftwardSpeedMax","log(1 - )"]},{"type":{"value":"SmoothCamera::SmoothCamera::SetRightwardSpeedMax"},"parameters":["Object","Behavior","RightwardSpeedMax","log(1 - )"]},{"type":{"value":"SmoothCamera::SmoothCamera::SetUpwardSpeedMax"},"parameters":["Object","Behavior","UpwardSpeedMax","log(1 - )"]},{"type":{"value":"SmoothCamera::SmoothCamera::SetDownwardSpeedMax"},"parameters":["Object","Behavior","DownwardSpeedMax","log(1 - )"]},{"type":{"value":"SmoothCamera::SmoothCamera::SetFollowFreeAreaLeft"},"parameters":["Object","Behavior","FollowFreeAreaLeft","log(1 - )"]},{"type":{"value":"SmoothCamera::SmoothCamera::SetFollowFreeAreaRight"},"parameters":["Object","Behavior","FollowFreeAreaRight","log(1 - )"]},{"type":{"value":"SmoothCamera::SmoothCamera::SetFollowFreeAreaTop"},"parameters":["Object","Behavior","FollowFreeAreaTop","log(1 - )"]},{"type":{"value":"SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom"},"parameters":["Object","Behavior","FollowFreeAreaBottom","log(1 - )"]},{"type":{"value":"SetNumberVariable"},"parameters":["CameraDelay","=","CameraDelay"]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"}],"objectGroups":[]},{"fullName":"","functionType":"Action","name":"doStepPreEvents","sentence":"","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"inverted":true,"value":"BooleanVariable"},"parameters":["IsCalledManually","True",""]}],"actions":[{"type":{"value":"SmoothCamera::SmoothCamera::DoMoveCameraCloser"},"parameters":["Object","Behavior",""]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"}],"objectGroups":[]},{"description":"Move the camera closer to the object. This action must be called after the object has moved for the frame.","fullName":"Move the camera closer","functionType":"Action","name":"MoveCameraCloser","sentence":"Move the camera closer to _PARAM0_","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"The camera following is called with an action, the call from doStepPreEvents must be disabled to avoid to do it twice."},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetBooleanVariable"},"parameters":["IsCalledManually","True",""]},{"type":{"value":"SmoothCamera::SmoothCamera::DoMoveCameraCloser"},"parameters":["Object","Behavior",""]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"}],"objectGroups":[]},{"description":"Move the camera closer to the object.","fullName":"Do move the camera closer","functionType":"Action","name":"DoMoveCameraCloser","private":true,"sentence":"Do move the camera closer _PARAM0_","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Delaying and forecasting can be used at the same time.\nForecasting only use the positions that are older than the one used for delaying.\nThe behavior uses a position history that is split in 2 arrays:\n- one for delaying the position (from TimeFromStart to TimeFromStart - CamearDelay)\n- one for forecasting the position (from TimeFromStart - CamearDelay to TimeFromStart - CamearDelay - ForecastHistoryDuration"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SmoothCamera::SmoothCamera::UpdateDelayedPosition"},"parameters":["Object","Behavior",""]},{"type":{"value":"SmoothCamera::SmoothCamera::UpdateForecastedPosition"},"parameters":["Object","Behavior",""]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"At each frame, the camera must catchup the target by a given ratio (speed)\ncameraX(t) - targetX = (cameraX(t - 1) - targetX) * speed\n\nThe frame rate must not impact on the catch-up speed, we don't want a speed in ratio per frame but a speed ratio per second, like this:\ncameraX(t) - targetX = (cameraX(t - 1s) - targetX) * speed\n\nOk, but we still need to process each frame, we can use a exponent for this:\ncameraX(t) - targetX = (cameraX(t - timeDelta) - targetX) * speed^timeDelta\ncameraX(t) = targetX + (cameraX(t - timeDelta) - targetX) * exp(timeDelta * ln(speed))\n\npow is probably more efficient than precalculated log if the speed is changed continuously but this might be rare enough."},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BooleanVariable"},"parameters":["FollowOnX","True",""]}],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["OldX","=","CameraX(Object.Layer(), 0)"]}],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"CameraCenterX"},"parameters":["",">","Object.Behavior::FreeAreaRight()","Object.Layer()","0"]}],"actions":[{"type":{"value":"SetCameraCenterX"},"parameters":["","=","Object.Behavior::FreeAreaRight()\n+ (CameraX(Object.Layer(), 0) - Object.Behavior::FreeAreaRight())\n* exp(TimeDelta() * LogLeftwardSpeed)","Object.Layer()","0"]}],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"CameraCenterX"},"parameters":["","<","OldX - LeftwardSpeedMax * TimeDelta()","Object.Layer()","0"]}],"actions":[{"type":{"value":"SetCameraCenterX"},"parameters":["","=","OldX - LeftwardSpeedMax * TimeDelta()","Object.Layer()","0"]}]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"CameraCenterX"},"parameters":["","<","Object.Behavior::FreeAreaLeft()","Object.Layer()","0"]}],"actions":[{"type":{"value":"SetCameraCenterX"},"parameters":["","=","Object.Behavior::FreeAreaLeft()\n+ (CameraX(Object.Layer(), 0) - Object.Behavior::FreeAreaLeft())\n* exp(TimeDelta() * LogRightwardSpeed)","Object.Layer()","0"]}],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"CameraCenterX"},"parameters":["",">","OldX + RightwardSpeedMax * TimeDelta()","Object.Layer()","0"]}],"actions":[{"type":{"value":"SetCameraCenterX"},"parameters":["","=","OldX + RightwardSpeedMax * TimeDelta()","Object.Layer()","0"]}]}]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BooleanVariable"},"parameters":["FollowOnY","True",""]}],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["OldY","=","CameraY(Object.Layer(), 0)"]}],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"CameraCenterY"},"parameters":["",">","Object.Behavior::FreeAreaBottom()","Object.Layer()","0"]}],"actions":[{"type":{"value":"SetCameraCenterY"},"parameters":["","=","Object.Behavior::FreeAreaBottom()\n+ (CameraY(Object.Layer(), 0) - Object.Behavior::FreeAreaBottom())\n* exp(TimeDelta() * LogUpwardSpeed)","Object.Layer()","0"]}],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"CameraCenterY"},"parameters":["","<","OldY - UpwardSpeedMax * TimeDelta()","Object.Layer()","0"]}],"actions":[{"type":{"value":"SetCameraCenterY"},"parameters":["","=","OldY - UpwardSpeedMax * TimeDelta()","Object.Layer()","0"]}]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"CameraCenterY"},"parameters":["","<","Object.Behavior::FreeAreaTop()","Object.Layer()","0"]}],"actions":[{"type":{"value":"SetCameraCenterY"},"parameters":["","=","Object.Behavior::FreeAreaTop()\n+ (CameraY(Object.Layer(), 0) - Object.Behavior::FreeAreaTop())\n* exp(TimeDelta() * LogDownwardSpeed)","Object.Layer()","0"]}],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"CameraCenterY"},"parameters":["",">","OldY + DownwardSpeedMax * TimeDelta()","Object.Layer()","0"]}],"actions":[{"type":{"value":"SetCameraCenterY"},"parameters":["","=","OldY + DownwardSpeedMax * TimeDelta()","Object.Layer()","0"]}]}]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"}],"objectGroups":[]},{"description":"Delay the camera according to a maximum speed and catch up the delay.","fullName":"Wait and catch up","functionType":"Action","name":"WaitAndCatchUp","sentence":"Delay the camera of _PARAM0_ during: _PARAM2_ seconds according to the maximum speed _PARAM3_;_PARAM4_ seconds and catch up in _PARAM5_ seconds","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Maybe the catch-up show be done in constant pixel speed instead of constant time speed."},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["WaitingEnd","=","TimeFromStart() + NewWaitingDuration"]},{"type":{"value":"SetNumberVariable"},"parameters":["WaitingSpeedXMax","=","NewWaitingSpeedXMax"]},{"type":{"value":"SetNumberVariable"},"parameters":["WaitingSpeedYMax","=","NewWaitingSpeedYMax"]},{"type":{"value":"SetNumberVariable"},"parameters":["CameraDelayCatchUpDuration","=","NewCatchUpDuration"]}]},{"disabled":true,"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"DebuggerTools::ConsoleLog"},"parameters":["\"Wait and catch up\"","\"info\"","\"SmoothCamera\""]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"Waiting duration (in seconds)","name":"NewWaitingDuration","type":"expression"},{"description":"Waiting maximum camera target speed X","name":"NewWaitingSpeedXMax","type":"expression"},{"description":"Waiting maximum camera target speed Y","name":"NewWaitingSpeedYMax","type":"expression"},{"description":"Catch up duration (in seconds)","name":"NewCatchUpDuration","type":"expression"}],"objectGroups":[]},{"description":"Draw the targeted and actual camera position.","fullName":"Draw debug","functionType":"Action","name":"DrawDebug","sentence":"Draw targeted and actual camera position for _PARAM0_ on _PARAM2_","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"PrimitiveDrawing::FillOpacity"},"parameters":["ShapePainter","=","0"]}]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Path used by the forecasting","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BuiltinCommonInstructions::CompareNumbers"},"parameters":["Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)",">","0"]}],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["Index","=","0"]},{"type":{"value":"PrimitiveDrawing::OutlineColor"},"parameters":["ShapePainter","\"245;166;35\""]},{"type":{"value":"PrimitiveDrawing::BeginFillPath"},"parameters":["ShapePainter","Object.Variable(__SmoothCamera.ForecastHistoryX[0])","Object.Variable(__SmoothCamera.ForecastHistoryY[0])"]}],"events":[{"type":"BuiltinCommonInstructions::Repeat","repeatExpression":"Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)","conditions":[],"actions":[{"type":{"value":"PrimitiveDrawing::PathLineTo"},"parameters":["ShapePainter","Object.Variable(__SmoothCamera.ForecastHistoryX[Index])","Object.Variable(__SmoothCamera.ForecastHistoryY[Index])"]},{"type":{"value":"SetNumberVariable"},"parameters":["Index","+","1"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"PrimitiveDrawing::EndFillPath"},"parameters":["ShapePainter"]}]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Follow-free area.","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BuiltinCommonInstructions::Or"},"parameters":[],"subInstructions":[{"type":{"value":"NumberVariable"},"parameters":["FollowFreeAreaLeft","!=","0"]},{"type":{"value":"NumberVariable"},"parameters":["FollowFreeAreaRight","!=","0"]},{"type":{"value":"NumberVariable"},"parameters":["FollowFreeAreaTop","!=","0"]},{"type":{"value":"NumberVariable"},"parameters":["FollowFreeAreaBottom","!=","0"]}]}],"actions":[{"type":{"value":"PrimitiveDrawing::OutlineColor"},"parameters":["ShapePainter","\"126;211;33\""]},{"type":{"value":"PrimitiveDrawing::Rectangle"},"parameters":["ShapePainter","Object.Behavior::FreeAreaLeft() - 1","Object.Behavior::FreeAreaTop() - 1","Object.Behavior::FreeAreaRight() + 1","Object.Behavior::FreeAreaBottom() + 1"]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Linear regression vector used by the forecasting.","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"PrimitiveDrawing::OutlineColor"},"parameters":["ShapePainter","\"208;2;27\""]},{"type":{"value":"PrimitiveDrawing::LineV2"},"parameters":["ShapePainter","ProjectedOldestX","ProjectedOldestY","ProjectedNewestX","ProjectedNewestY","1"]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Targeted and actual camera position","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"PrimitiveDrawing::Circle"},"parameters":["ShapePainter","ForecastedX","ForecastedY","3"]},{"type":{"value":"PrimitiveDrawing::LineV2"},"parameters":["ShapePainter","CameraX(Object.Layer(), 0)","CameraY(Object.Layer(), 0) - 4","CameraX(Object.Layer(), 0)","CameraY(Object.Layer(), 0) + 4","1"]},{"type":{"value":"PrimitiveDrawing::LineV2"},"parameters":["ShapePainter","CameraX(Object.Layer(), 0) - 4","CameraY(Object.Layer(), 0)","CameraX(Object.Layer(), 0) + 4","CameraY(Object.Layer(), 0)","1"]}]}],"parameters":[]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"Shape painter","name":"ShapePainter","supplementaryInformation":"PrimitiveDrawing::Drawer","type":"objectList"}],"objectGroups":[]},{"description":"Enable or disable the following on X axis.","fullName":"Follow on X","functionType":"Action","group":"Camera configuration","name":"SetFollowOnX","sentence":"The camera follows _PARAM0_ on X axis: _PARAM2_","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetBooleanVariable"},"parameters":["FollowOnX","False",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BooleanVariable"},"parameters":["Value","True",""]}],"actions":[{"type":{"value":"SetBooleanVariable"},"parameters":["FollowOnX","True",""]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"Follow on X axis","name":"Value","type":"yesorno"}],"objectGroups":[]},{"description":"Enable or disable the following on Y axis.","fullName":"Follow on Y","functionType":"Action","group":"Camera configuration","name":"SetFollowOnY","sentence":"The camera follows _PARAM0_ on Y axis: _PARAM2_","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetBooleanVariable"},"parameters":["FollowOnY","False",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BooleanVariable"},"parameters":["Value","True",""]}],"actions":[{"type":{"value":"SetBooleanVariable"},"parameters":["FollowOnY","True",""]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"Follow on Y axis","name":"Value","type":"yesorno"}],"objectGroups":[]},{"description":"Change the camera follow free area right border.","fullName":"Follow free area right border","functionType":"Action","group":"Camera configuration","name":"SetFollowFreeAreaRight","sentence":"Change the camera follow free area right border of _PARAM0_: _PARAM2_","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["FollowFreeAreaRight","=","max(0, Value)"]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"Follow free area right border","name":"Value","type":"expression"}],"objectGroups":[]},{"description":"Change the camera follow free area left border.","fullName":"Follow free area left border","functionType":"Action","group":"Camera configuration","name":"SetFollowFreeAreaLeft","sentence":"Change the camera follow free area left border of _PARAM0_: _PARAM2_","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["FollowFreeAreaLeft","=","max(0, Value)"]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"Follow free area left border","name":"Value","type":"expression"}],"objectGroups":[]},{"description":"Change the camera follow free area top border.","fullName":"Follow free area top border","functionType":"Action","group":"Camera configuration","name":"SetFollowFreeAreaTop","sentence":"Change the camera follow free area top border of _PARAM0_: _PARAM2_","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["FollowFreeAreaTop","=","max(0, Value)"]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"Follow free area top border","name":"Value","type":"expression"}],"objectGroups":[]},{"description":"Change the camera follow free area bottom border.","fullName":"Follow free area bottom border","functionType":"Action","group":"Camera configuration","name":"SetFollowFreeAreaBottom","sentence":"Change the camera follow free area bottom border of _PARAM0_: _PARAM2_","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["FollowFreeAreaBottom","=","max(0, Value)"]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"Follow free area bottom border","name":"Value","type":"expression"}],"objectGroups":[]},{"description":"Change the camera leftward maximum speed (in pixels per second).","fullName":"Leftward maximum speed","functionType":"Action","group":"Camera configuration","name":"SetLeftwardSpeedMax","sentence":"Change the camera leftward maximum speed of _PARAM0_: _PARAM2_","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["LeftwardSpeedMax","=","max(0, Value)"]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"Leftward maximum speed (in pixels per second)","name":"Value","type":"expression"}],"objectGroups":[]},{"description":"Change the camera rightward maximum speed (in pixels per second).","fullName":"Rightward maximum speed","functionType":"Action","group":"Camera configuration","name":"SetRightwardSpeedMax","sentence":"Change the camera rightward maximum speed of _PARAM0_: _PARAM2_","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["RightwardSpeedMax","=","max(0, Value)"]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"Rightward maximum speed (in pixels per second)","name":"Value","type":"expression"}],"objectGroups":[]},{"description":"Change the camera upward maximum speed (in pixels per second).","fullName":"Upward maximum speed","functionType":"Action","group":"Camera configuration","name":"SetUpwardSpeedMax","sentence":"Change the camera upward maximum speed of _PARAM0_: _PARAM2_","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["UpwardSpeedMax","=","max(0, Value)"]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"Upward maximum speed (in pixels per second)","name":"Value","type":"expression"}],"objectGroups":[]},{"description":"Change the camera downward maximum speed (in pixels per second).","fullName":"Downward maximum speed","functionType":"Action","group":"Camera configuration","name":"SetDownwardSpeedMax","sentence":"Change the camera downward maximum speed of _PARAM0_: _PARAM2_","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["DownwardSpeedMax","=","max(0, Value)"]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"Downward maximum speed (in pixels per second)","name":"Value","type":"expression"}],"objectGroups":[]},{"description":"Change the camera leftward catch-up speed (in ratio per second).","fullName":"Leftward catch-up speed","functionType":"Action","group":"Camera configuration","name":"SetLeftwardSpeed","sentence":"Change the camera leftward catch-up speed of _PARAM0_: _PARAM2_","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["LeftwardSpeed","=","clamp(0, 1, Value)"]},{"type":{"value":"SetNumberVariable"},"parameters":["LogLeftwardSpeed","=","log(1 - Value)"]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"Leftward catch-up speed (in ratio per second)","name":"Value","type":"expression"}],"objectGroups":[]},{"description":"Change the camera rightward catch-up speed (in ratio per second).","fullName":"Rightward catch-up speed","functionType":"Action","group":"Camera configuration","name":"SetRightwardSpeed","sentence":"Change the camera rightward catch-up speed of _PARAM0_: _PARAM2_","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["RightwardSpeed","=","clamp(0, 1, Value)"]},{"type":{"value":"SetNumberVariable"},"parameters":["LogRightwardSpeed","=","log(1 - Value)"]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"Rightward catch-up speed (in ratio per second)","name":"Value","type":"expression"}],"objectGroups":[]},{"description":"Change the camera downward catch-up speed (in ratio per second).","fullName":"Downward catch-up speed","functionType":"Action","group":"Camera configuration","name":"SetDownwardSpeed","sentence":"Change the camera downward catch-up speed of _PARAM0_: _PARAM2_","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["DownwardSpeed","=","clamp(0, 1, Value)"]},{"type":{"value":"SetNumberVariable"},"parameters":["LogDownwardSpeed","=","log(1 - Value)"]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"Downward catch-up speed (in ratio per second)","name":"Value","type":"expression"}],"objectGroups":[]},{"description":"Change the camera upward catch-up speed (in ratio per second).","fullName":"Upward catch-up speed","functionType":"Action","group":"Camera configuration","name":"SetUpwardSpeed","sentence":"Change the camera upward catch-up speed of _PARAM0_: _PARAM2_","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["UpwardSpeed","=","clamp(0, 1, Value)"]},{"type":{"value":"SetNumberVariable"},"parameters":["LogUpwardSpeed","=","log(1 - Value)"]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"Upward catch-up speed (in ratio per second)","name":"Value","type":"expression"}],"objectGroups":[]},{"description":"the camera offset on X axis of the object. This is not the current difference between the object and the camera position.","fullName":"Camera offset X","functionType":"ExpressionAndCondition","group":"Camera configuration","name":"OffsetX","sentence":"the camera offset on X axis","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetReturnNumber"},"parameters":["CameraOffsetX"]}]}],"expressionType":{"type":"expression"},"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"}],"objectGroups":[]},{"fullName":"","functionType":"ActionWithOperator","getterName":"OffsetX","group":"Camera configuration","name":"SetOffsetXOp","sentence":"","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["CameraOffsetX","=","Value"]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"}],"objectGroups":[]},{"description":"Change the camera offset on X axis of an object.","fullName":"Camera Offset X","functionType":"Action","group":"Camera configuration","name":"SetOffsetX","private":true,"sentence":"Change the camera offset on X axis of _PARAM0_: _PARAM2_","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Deprecated use SetOffsetXOp instead."},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SmoothCamera::SmoothCamera::SetOffsetXOp"},"parameters":["Object","Behavior","=","Value",""]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"Camera offset X","name":"Value","type":"expression"}],"objectGroups":[]},{"description":"the camera offset on Y axis of the object. This is not the current difference between the object and the camera position.","fullName":"Camera offset Y","functionType":"ExpressionAndCondition","group":"Camera configuration","name":"OffsetY","sentence":"the camera offset on Y axis","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetReturnNumber"},"parameters":["CameraOffsetY"]}]}],"expressionType":{"type":"expression"},"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"}],"objectGroups":[]},{"fullName":"","functionType":"ActionWithOperator","getterName":"OffsetY","group":"Camera configuration","name":"SetOffsetYOp","sentence":"","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["CameraOffsetY","=","Value"]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"}],"objectGroups":[]},{"description":"Change the camera offset on Y axis of an object.","fullName":"Camera Offset Y","functionType":"Action","group":"Camera configuration","name":"SetOffsetY","private":true,"sentence":"Change the camera offset on Y axis of _PARAM0_: _PARAM2_","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Deprecated use SetOffsetYOp instead."},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SmoothCamera::SmoothCamera::SetOffsetYOp"},"parameters":["Object","Behavior","=","CameraOffsetY",""]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"Camera offset Y","name":"CameraOffsetY","type":"expression"}],"objectGroups":[]},{"description":"Change the camera forecast time (in seconds).","fullName":"Forecast time","functionType":"Action","group":"Camera configuration","name":"SetForecastTime","sentence":"Change the camera forecast time of _PARAM0_: _PARAM2_","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["ForecastTime","=","min(0, Value)"]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"Forecast time","name":"Value","type":"expression"}],"objectGroups":[]},{"description":"Change the camera delay (in seconds).","fullName":"Camera delay","functionType":"Action","group":"Camera configuration","name":"SetCameraDelay","sentence":"Change the camera delay of _PARAM0_: _PARAM2_","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["CameraDelay","=","max(0, Value)"]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"Camera delay","name":"Value","type":"expression"}],"objectGroups":[]},{"description":"Return follow free area left border X.","fullName":"Free area left","functionType":"Expression","group":"Private","name":"FreeAreaLeft","private":true,"sentence":"","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetReturnNumber"},"parameters":["ForecastedX + CameraOffsetX - FollowFreeAreaLeft"]}]}],"expressionType":{"type":"expression"},"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"}],"objectGroups":[]},{"description":"Return follow free area right border X.","fullName":"Free area right","functionType":"Expression","group":"Private","name":"FreeAreaRight","private":true,"sentence":"","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetReturnNumber"},"parameters":["ForecastedX + CameraOffsetX + FollowFreeAreaRight"]}]}],"expressionType":{"type":"expression"},"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"}],"objectGroups":[]},{"description":"Return follow free area bottom border Y.","fullName":"Free area bottom","functionType":"Expression","group":"Private","name":"FreeAreaBottom","private":true,"sentence":"","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetReturnNumber"},"parameters":["ForecastedY + CameraOffsetY + FollowFreeAreaBottom"]}]}],"expressionType":{"type":"expression"},"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"}],"objectGroups":[]},{"description":"Return follow free area top border Y.","fullName":"Free area top","functionType":"Expression","group":"Private","name":"FreeAreaTop","private":true,"sentence":"","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetReturnNumber"},"parameters":["ForecastedY + CameraOffsetY - FollowFreeAreaTop"]}]}],"expressionType":{"type":"expression"},"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"}],"objectGroups":[]},{"description":"Update delayed position and delayed history. This is called in doStepPreEvents.","fullName":"Update delayed position","functionType":"Action","group":"Private","name":"UpdateDelayedPosition","private":true,"sentence":"Update delayed position and delayed history of _PARAM0_","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Add the previous position to have enough (2) positions to evaluate the extra delay for waiting mode."},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"SmoothCamera::SmoothCamera::IsWaiting"},"parameters":["Object","Behavior",""]},{"type":{"value":"BuiltinCommonInstructions::CompareNumbers"},"parameters":["Object.VariableChildCount(__SmoothCamera.ObjectTime)","=","0"]}],"actions":[{"type":{"value":"ObjectVariablePushNumber"},"parameters":["Object","__SmoothCamera.ObjectTime","TimeFromStart()"]},{"type":{"value":"ObjectVariablePushNumber"},"parameters":["Object","__SmoothCamera.ObjectX","DelayedCenterX"]},{"type":{"value":"ObjectVariablePushNumber"},"parameters":["Object","__SmoothCamera.ObjectY","DelayedCenterY"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Use the object center when no delay is asked."},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["DelayedCenterX","=","Object.CenterX()"]},{"type":{"value":"SetNumberVariable"},"parameters":["DelayedCenterY","=","Object.CenterY()"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"inverted":true,"value":"SmoothCamera::SmoothCamera::IsDelayed"},"parameters":["Object","Behavior",""]}],"actions":[{"type":{"value":"SmoothCamera::SmoothCamera::AddForecastHistoryPosition"},"parameters":["Object","Behavior","TimeFromStart()","Object.CenterX()","Object.CenterY()",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BuiltinCommonInstructions::Or"},"parameters":[],"subInstructions":[{"type":{"value":"SmoothCamera::SmoothCamera::IsDelayed"},"parameters":["Object","Behavior",""]},{"type":{"value":"SmoothCamera::SmoothCamera::IsWaiting"},"parameters":["Object","Behavior",""]}]}],"actions":[{"type":{"value":"ObjectVariablePushNumber"},"parameters":["Object","__SmoothCamera.ObjectTime","TimeFromStart()"]},{"type":{"value":"ObjectVariablePushNumber"},"parameters":["Object","__SmoothCamera.ObjectX","Object.CenterX()"]},{"type":{"value":"ObjectVariablePushNumber"},"parameters":["Object","__SmoothCamera.ObjectY","Object.CenterY()"]}],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Remove history entries that are too old to be useful for delaying and pass it to the history for forecasting."},{"infiniteLoopWarning":true,"type":"BuiltinCommonInstructions::While","whileConditions":[{"type":{"value":"BuiltinCommonInstructions::CompareNumbers"},"parameters":["Object.VariableChildCount(__SmoothCamera.ObjectTime)",">=","2"]},{"type":{"value":"VarObjet"},"parameters":["Object","__SmoothCamera.ObjectTime[1]","<","TimeFromStart() - Object.Behavior::CurrentDelay()"]}],"conditions":[],"actions":[{"type":{"value":"SmoothCamera::SmoothCamera::AddForecastHistoryPosition"},"parameters":["Object","Behavior","Object.Variable(__SmoothCamera.ObjectTime[0])","Object.Variable(__SmoothCamera.ObjectX[0])","Object.Variable(__SmoothCamera.ObjectY[0])",""]},{"type":{"value":"ObjectVariableRemoveAt"},"parameters":["Object","__SmoothCamera.ObjectTime","0"]},{"type":{"value":"ObjectVariableRemoveAt"},"parameters":["Object","__SmoothCamera.ObjectX","0"]},{"type":{"value":"ObjectVariableRemoveAt"},"parameters":["Object","__SmoothCamera.ObjectY","0"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Don't move the camera if there is not enough history."},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["DelayedCenterX","=","Object.Variable(__SmoothCamera.ObjectX[0])"]},{"type":{"value":"SetNumberVariable"},"parameters":["DelayedCenterY","=","Object.Variable(__SmoothCamera.ObjectY[0])"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BuiltinCommonInstructions::CompareNumbers"},"parameters":["Object.VariableChildCount(__SmoothCamera.ObjectTime)",">=","2"]},{"type":{"value":"VarObjet"},"parameters":["Object","__SmoothCamera.ObjectTime[0]","<","TimeFromStart() - Object.Behavior::CurrentDelay()"]}],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Add the extra delay that could be needed to respect the speed limit in waiting mode.\n\nspeedRatio = min(speedMaxX / historySpeedX, speedMaxY / historySpeedY)\ndelay += min(0, timeDelta * (1 - speedRatio))"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"SmoothCamera::SmoothCamera::IsWaiting"},"parameters":["Object","Behavior",""]}],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["CameraExtraDelay","+","max(0, TimeDelta() * (1 - min(WaitingSpeedXMax * abs(Object.Variable(__SmoothCamera.ObjectX[1]) - Object.Variable(__SmoothCamera.ObjectX[0])), WaitingSpeedYMax * abs(Object.Variable(__SmoothCamera.ObjectY[1]) - Object.Variable(__SmoothCamera.ObjectY[0]))) / (Object.Variable(__SmoothCamera.ObjectTime[1]) - Object.Variable(__SmoothCamera.ObjectTime[0]))))"]}],"events":[{"disabled":true,"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"DebuggerTools::ConsoleLog"},"parameters":["\"Extra delay: \" + ToString(CameraExtraDelay)","\"info\"","\"SmoothCamera\""]}]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"The time with delay is now between the first 2 indexes"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["DelayedCenterX","=","lerp(Object.Variable(__SmoothCamera.ObjectX[1]), Object.Variable(__SmoothCamera.ObjectX[0]), ((TimeFromStart() - Object.Behavior::CurrentDelay()) - Object.Variable(__SmoothCamera.ObjectTime[1])) / (Object.Variable(__SmoothCamera.ObjectTime[0]) - Object.Variable(__SmoothCamera.ObjectTime[1])))"]},{"type":{"value":"SetNumberVariable"},"parameters":["DelayedCenterY","=","lerp(Object.Variable(__SmoothCamera.ObjectY[1]), Object.Variable(__SmoothCamera.ObjectY[0]), ((TimeFromStart() - Object.Behavior::CurrentDelay()) - Object.Variable(__SmoothCamera.ObjectTime[1])) / (Object.Variable(__SmoothCamera.ObjectTime[0]) - Object.Variable(__SmoothCamera.ObjectTime[1])))"]}]}]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"inverted":true,"value":"SmoothCamera::SmoothCamera::IsDelayed"},"parameters":["Object","Behavior",""]},{"type":{"inverted":true,"value":"SmoothCamera::SmoothCamera::IsWaiting"},"parameters":["Object","Behavior",""]}],"actions":[{"type":{"value":"ObjectVariableClearChildren"},"parameters":["Object","__SmoothCamera.ObjectTime"]},{"type":{"value":"ObjectVariableClearChildren"},"parameters":["Object","__SmoothCamera.ObjectX"]},{"type":{"value":"ObjectVariableClearChildren"},"parameters":["Object","__SmoothCamera.ObjectY"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"inverted":true,"value":"SmoothCamera::SmoothCamera::IsWaiting"},"parameters":["Object","Behavior",""]},{"type":{"value":"BuiltinCommonInstructions::Once"},"parameters":[]}],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["CameraDelayCatchUpSpeed","=","CameraExtraDelay / CameraDelayCatchUpDuration"]}],"events":[{"disabled":true,"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"DebuggerTools::ConsoleLog"},"parameters":["\"Start to catch up\"","\"info\"","\"SmoothCamera\""]}]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"inverted":true,"value":"SmoothCamera::SmoothCamera::IsWaiting"},"parameters":["Object","Behavior",""]},{"type":{"value":"NumberVariable"},"parameters":["CameraExtraDelay",">","0"]}],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["CameraExtraDelay","=","max(0, CameraExtraDelay -CameraDelayCatchUpSpeed * TimeDelta())"]}],"events":[{"disabled":true,"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"DebuggerTools::ConsoleLog"},"parameters":["\"Catching up delay: \" + ToString(CameraExtraDelay)","\"info\"","\"SmoothCamera\""]}]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"}],"objectGroups":[]},{"description":"Check if the camera following target is delayed from the object.","fullName":"Camera is delayed","functionType":"Condition","name":"IsDelayed","private":true,"sentence":"The camera of _PARAM0_ is delayed","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BuiltinCommonInstructions::CompareNumbers"},"parameters":["Object.Behavior::CurrentDelay()",">","0"]}],"actions":[{"type":{"value":"SetReturnBoolean"},"parameters":["True"]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"}],"objectGroups":[]},{"description":"Return the current camera delay.","fullName":"Current delay","functionType":"Expression","name":"CurrentDelay","private":true,"sentence":"","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetReturnNumber"},"parameters":["CameraDelay + CameraExtraDelay"]}]}],"expressionType":{"type":"expression"},"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"}],"objectGroups":[]},{"description":"Check if the camera following is waiting at a reduced speed.","fullName":"Camera is waiting","functionType":"Condition","name":"IsWaiting","private":true,"sentence":"The camera of _PARAM0_ is waiting","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NumberVariable"},"parameters":["WaitingEnd",">","TimeFromStart()"]}],"actions":[{"type":{"value":"SetReturnBoolean"},"parameters":["True"]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"}],"objectGroups":[]},{"description":"Add a position to the history for forecasting. This is called 2 times in UpadteDelayedPosition.","fullName":"Add forecast history position","functionType":"Action","group":"Private","name":"AddForecastHistoryPosition","private":true,"sentence":"Add the time:_PARAM2_ and position: _PARAM3_; _PARAM4_ to the forecast history of _PARAM0_","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BuiltinCommonInstructions::Or"},"parameters":[],"subInstructions":[{"type":{"value":"NumberVariable"},"parameters":["ForecastHistoryDuration",">","0"]},{"type":{"value":"NumberVariable"},"parameters":["ForecastTime",">","0"]}]}],"actions":[{"type":{"value":"ObjectVariablePushNumber"},"parameters":["Object","__SmoothCamera.ForecastHistoryTime","Time"]},{"type":{"value":"ObjectVariablePushNumber"},"parameters":["Object","__SmoothCamera.ForecastHistoryX","ObjectX"]},{"type":{"value":"ObjectVariablePushNumber"},"parameters":["Object","__SmoothCamera.ForecastHistoryY","ObjectY"]}],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Remove history entries that are too old to be useful.\nKeep at least 2 positions because no forecast can be done with less positions."},{"infiniteLoopWarning":true,"type":"BuiltinCommonInstructions::While","whileConditions":[{"type":{"value":"BuiltinCommonInstructions::CompareNumbers"},"parameters":["Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)",">=","3"]},{"type":{"value":"VarObjet"},"parameters":["Object","__SmoothCamera.ForecastHistoryTime[0]","<","TimeFromStart() - CameraDelay - CameraExtraDelay - ForecastHistoryDuration"]}],"conditions":[],"actions":[{"type":{"value":"ObjectVariableRemoveAt"},"parameters":["Object","__SmoothCamera.ForecastHistoryTime","0"]},{"type":{"value":"ObjectVariableRemoveAt"},"parameters":["Object","__SmoothCamera.ForecastHistoryX","0"]},{"type":{"value":"ObjectVariableRemoveAt"},"parameters":["Object","__SmoothCamera.ForecastHistoryY","0"]}]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"Time","name":"Time","type":"expression"},{"description":"Object X","name":"ObjectX","type":"expression"},{"description":"Object Y","name":"ObjectY","type":"expression"}],"objectGroups":[]},{"description":"Update forecasted position. This is called in doStepPreEvents.","fullName":"Update forecasted position","functionType":"Action","group":"Private","name":"UpdateForecastedPosition","private":true,"sentence":"Update forecasted position of _PARAM0_","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["ForecastedX","=","DelayedCenterX"]},{"type":{"value":"SetNumberVariable"},"parameters":["ForecastedY","=","DelayedCenterY"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Simple linear regression\ny = A * x + B\n\nA = Covariance / VarianceX\nB = MeanY - A * MeanX\n\nNote than we could use only one position every N positions to reduce the process time,\nbut if we really need efficient process JavaScript and circular queues are a must."},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BuiltinCommonInstructions::CompareNumbers"},"parameters":["Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)",">=","2"]},{"type":{"value":"BuiltinCommonInstructions::Or"},"parameters":[],"subInstructions":[{"type":{"value":"NumberVariable"},"parameters":["ForecastHistoryDuration",">","0"]},{"type":{"value":"NumberVariable"},"parameters":["ForecastTime",">","0"]}]}],"actions":[],"events":[{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Mean X","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["ForecastHistoryMeanX","=","0"]},{"type":{"value":"SetNumberVariable"},"parameters":["Index","=","0"]}]},{"type":"BuiltinCommonInstructions::Repeat","repeatExpression":"Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["ForecastHistoryMeanX","+","Object.Variable(__SmoothCamera.ForecastHistoryX[Index])"]},{"type":{"value":"SetNumberVariable"},"parameters":["Index","+","1"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["ForecastHistoryMeanX","/","Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)"]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Mean Y","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["ForecastHistoryMeanY","=","0"]},{"type":{"value":"SetNumberVariable"},"parameters":["Index","=","0"]}]},{"type":"BuiltinCommonInstructions::Repeat","repeatExpression":"Object.VariableChildCount(__SmoothCamera.ForecastHistoryY)","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["ForecastHistoryMeanY","+","Object.Variable(__SmoothCamera.ForecastHistoryY[Index])"]},{"type":{"value":"SetNumberVariable"},"parameters":["Index","+","1"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["ForecastHistoryMeanY","/","Object.VariableChildCount(__SmoothCamera.ForecastHistoryY)"]}]},{"disabled":true,"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"DebuggerTools::ConsoleLog"},"parameters":["\"Mean: \" + ToString(ForecastHistoryMeanX) + \" \" + ToString(ForecastHistoryMeanY)","",""]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Variance and Covariance","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"VarianceX = sum((X[i] - MeanX)²)\nVarianceY = sum((Y[i] - MeanY)²)\nCovariance = sum((X[i] - MeanX) * (Y[i] - MeanY))"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["ForecastHistoryVarianceX","=","0"]},{"type":{"value":"SetNumberVariable"},"parameters":["ForecastHistoryVarianceY","=","0"]},{"type":{"value":"SetNumberVariable"},"parameters":["ForecastHistoryCovariance","=","0"]},{"type":{"value":"SetNumberVariable"},"parameters":["Index","=","0"]}]},{"type":"BuiltinCommonInstructions::Repeat","repeatExpression":"Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["ForecastHistoryVarianceX","+","pow(Object.Variable(__SmoothCamera.ForecastHistoryX[Index]) - ForecastHistoryMeanX, 2)"]},{"type":{"value":"SetNumberVariable"},"parameters":["ForecastHistoryVarianceY","+","pow(Object.Variable(__SmoothCamera.ForecastHistoryY[Index]) - ForecastHistoryMeanY, 2)"]},{"type":{"value":"SetNumberVariable"},"parameters":["ForecastHistoryCovariance","+","(Object.Variable(__SmoothCamera.ForecastHistoryX[Index]) - ForecastHistoryMeanX)\n*\n(Object.Variable(__SmoothCamera.ForecastHistoryY[Index]) - ForecastHistoryMeanY)"]},{"type":{"value":"SetNumberVariable"},"parameters":["Index","+","1"]}]},{"disabled":true,"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"DebuggerTools::ConsoleLog"},"parameters":["\"Variances: \" + ToString(ForecastHistoryVarianceX) + \" \" + ToString(ForecastHistoryVarianceY) + \" \" + ToString(ForecastHistoryCovariance)","\"info\"","\"SmoothCamera\""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BuiltinCommonInstructions::CompareNumbers"},"parameters":["abs(ForecastHistoryVarianceX)","<","1"]},{"type":{"value":"BuiltinCommonInstructions::CompareNumbers"},"parameters":["abs(ForecastHistoryVarianceY)","<","1"]}],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["ForecastedX","=","DelayedCenterX"]},{"type":{"value":"SetNumberVariable"},"parameters":["ForecastedY","=","DelayedCenterY"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BuiltinCommonInstructions::Or"},"parameters":[],"subInstructions":[{"type":{"value":"BuiltinCommonInstructions::CompareNumbers"},"parameters":["abs(ForecastHistoryVarianceX)",">=","1"]},{"type":{"value":"BuiltinCommonInstructions::CompareNumbers"},"parameters":["abs(ForecastHistoryVarianceY)",">=","1"]}]}],"actions":[],"events":[{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Linear function parameters","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"y = A * x + B\n\nA = Covariance / VarianceX\nB = MeanY - A * MeanX"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BuiltinCommonInstructions::CompareNumbers"},"parameters":["abs(ForecastHistoryVarianceX)",">=","abs(ForecastHistoryVarianceY)"]}],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["ForecastHistoryLinearA","=","ForecastHistoryCovariance / ForecastHistoryVarianceX"]},{"type":{"value":"SetNumberVariable"},"parameters":["ForecastHistoryLinearB","=","ForecastHistoryMeanY - ForecastHistoryLinearA * ForecastHistoryMeanX"]}],"events":[{"disabled":true,"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"DebuggerTools::ConsoleLog"},"parameters":["\"Linear: \" + ToString(ForecastHistoryLinearA) + \" \" + ToString(ForecastHistoryLinearB)","\"info\"","\"SmoothCamera\""]}]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Projection","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SmoothCamera::SmoothCamera::ProjectHistoryEnds"},"parameters":["Object","Behavior","Object.Variable(__SmoothCamera.ForecastHistoryX[0])","Object.Variable(__SmoothCamera.ForecastHistoryY[0])","Object.Variable(__SmoothCamera.ForecastHistoryX[Object.VariableChildCount(__SmoothCamera.ForecastHistoryX) - 1])","Object.Variable(__SmoothCamera.ForecastHistoryY[Object.VariableChildCount(__SmoothCamera.ForecastHistoryY) - 1])",""]}]}],"parameters":[]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Axis permutation to avoid a ratio between 2 numbers near 0."},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BuiltinCommonInstructions::CompareNumbers"},"parameters":["abs(ForecastHistoryVarianceX)","<","abs(ForecastHistoryVarianceY)"]}],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["ForecastHistoryLinearA","=","ForecastHistoryCovariance / ForecastHistoryVarianceY"]},{"type":{"value":"SetNumberVariable"},"parameters":["ForecastHistoryLinearB","=","ForecastHistoryMeanX - ForecastHistoryLinearA * ForecastHistoryMeanY"]}],"events":[{"disabled":true,"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"DebuggerTools::ConsoleLog"},"parameters":["\"Linear: \" + ToString(ForecastHistoryLinearA) + \" \" + ToString(ForecastHistoryLinearB)","\"info\"","\"SmoothCamera\""]}]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Projection","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SmoothCamera::SmoothCamera::ProjectHistoryEnds"},"parameters":["Object","Behavior","Object.Variable(__SmoothCamera.ForecastHistoryY[0])","Object.Variable(__SmoothCamera.ForecastHistoryX[0])","Object.Variable(__SmoothCamera.ForecastHistoryY[Object.VariableChildCount(__SmoothCamera.ForecastHistoryY) - 1])","Object.Variable(__SmoothCamera.ForecastHistoryX[Object.VariableChildCount(__SmoothCamera.ForecastHistoryX) - 1])",""]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Permute back axis"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["Index","=","ProjectedOldestX"]},{"type":{"value":"SetNumberVariable"},"parameters":["ProjectedOldestX","=","ProjectedOldestY"]},{"type":{"value":"SetNumberVariable"},"parameters":["ProjectedOldestY","=","Index"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["Index","=","ProjectedNewestX"]},{"type":{"value":"SetNumberVariable"},"parameters":["ProjectedNewestX","=","ProjectedNewestY"]},{"type":{"value":"SetNumberVariable"},"parameters":["ProjectedNewestY","=","Index"]}]}],"parameters":[]},{"disabled":true,"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"DebuggerTools::ConsoleLog"},"parameters":["\"Oldest: \" + ToString(ProjectedOldestX) + \" \" + ToString(ProjectedOldestY)","\"info\"","\"SmoothCamera\""]}]},{"disabled":true,"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"DebuggerTools::ConsoleLog"},"parameters":["\"Newest: \" + ToString(ProjectedNewestX) + \" \" + ToString(ProjectedNewestY)","\"info\"","\"SmoothCamera\""]}]}]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Forecasted position","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["ForecastedX","=","ProjectedNewestX + ( ProjectedNewestX - ProjectedOldestX) * Object.Behavior::ForecastTimeRatio()"]},{"type":{"value":"SetNumberVariable"},"parameters":["ForecastedY","=","ProjectedNewestY + ( ProjectedNewestY - ProjectedOldestY) * Object.Behavior::ForecastTimeRatio()"]}]},{"disabled":true,"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"DebuggerTools::ConsoleLog"},"parameters":["\"Forecasted: \" + ToString(ForecastedX) + \" \" + ToString(ForecastedY)","\"info\"","\"SmoothCamera\""]}]}],"parameters":[]}],"parameters":[]}]}],"parameters":[]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"}],"objectGroups":[]},{"description":"Project history ends position to have the vector on the line from linear regression. This function is only called by UpdateForecastedPosition.","fullName":"Project history ends","functionType":"Action","group":"Private","name":"ProjectHistoryEnds","private":true,"sentence":"Project history oldest: _PARAM2_;_PARAM3_ and newest position: _PARAM4_;_PARAM5_ of _PARAM0_","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Perpendicular line:\npA = -1/a; \npB = -pA * x + y\n\nIntersection:\n/ ProjectedY = a * ProjectedX + b\n\\ ProjectedY = pA * ProjectedX + b\n\nSolution that is cleaned out from indeterminism (like 0 / 0 or infinity / infinity):\nProjectedX= (x + (y - b) * a) / (a² + 1)\nProjectedY = y + (x * a - y + b) / (a² + 1)"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["ProjectedNewestX","=","(NewestX + (NewestY - ForecastHistoryLinearB) * ForecastHistoryLinearA) / (1 + pow(ForecastHistoryLinearA, 2))"]},{"type":{"value":"SetNumberVariable"},"parameters":["ProjectedNewestY","=","NewestY + (NewestX * ForecastHistoryLinearA - NewestY \n+ ForecastHistoryLinearB) / (1 + pow(ForecastHistoryLinearA, 2))"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetNumberVariable"},"parameters":["ProjectedOldestX","=","(OldestX + (OldestY - ForecastHistoryLinearB) * ForecastHistoryLinearA) / (1 + pow(ForecastHistoryLinearA, 2))"]},{"type":{"value":"SetNumberVariable"},"parameters":["ProjectedOldestY","=","OldestY + (OldestX * ForecastHistoryLinearA - OldestY \n+ ForecastHistoryLinearB) / (1 + pow(ForecastHistoryLinearA, 2))"]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"},{"description":"OldestX","name":"OldestX","type":"expression"},{"description":"OldestY","name":"OldestY","type":"expression"},{"description":"Newest X","name":"NewestX","type":"expression"},{"description":"Newest Y","name":"NewestY","type":"expression"}],"objectGroups":[]},{"description":"Return the ratio between forecast time and the duration of the history. This function is only called by UpdateForecastedPosition.","fullName":"Forecast time ratio","functionType":"Expression","group":"Private","name":"ForecastTimeRatio","private":true,"sentence":"","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetReturnNumber"},"parameters":["- ForecastTime / (Object.Variable(__SmoothCamera.ForecastHistoryTime[0]) - Object.Variable(__SmoothCamera.ForecastHistoryTime[Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime) - 1]))"]}]}],"expressionType":{"type":"expression"},"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothCamera","type":"behavior"}],"objectGroups":[]}],"eventsFunctionsFolderStructure":{"folderName":"__ROOT","children":[{"functionName":"onCreated"},{"functionName":"doStepPreEvents"},{"functionName":"MoveCameraCloser"},{"functionName":"DoMoveCameraCloser"},{"functionName":"WaitAndCatchUp"},{"functionName":"DrawDebug"},{"folderName":"Camera configuration","children":[{"functionName":"SetFollowOnX"},{"functionName":"SetFollowOnY"},{"functionName":"SetFollowFreeAreaRight"},{"functionName":"SetFollowFreeAreaLeft"},{"functionName":"SetFollowFreeAreaTop"},{"functionName":"SetFollowFreeAreaBottom"},{"functionName":"SetLeftwardSpeedMax"},{"functionName":"SetRightwardSpeedMax"},{"functionName":"SetUpwardSpeedMax"},{"functionName":"SetDownwardSpeedMax"},{"functionName":"SetLeftwardSpeed"},{"functionName":"SetRightwardSpeed"},{"functionName":"SetDownwardSpeed"},{"functionName":"SetUpwardSpeed"},{"functionName":"OffsetX"},{"functionName":"SetOffsetXOp"},{"functionName":"SetOffsetX"},{"functionName":"OffsetY"},{"functionName":"SetOffsetYOp"},{"functionName":"SetOffsetY"},{"functionName":"SetForecastTime"},{"functionName":"SetCameraDelay"}]},{"folderName":"Private","children":[{"functionName":"FreeAreaLeft"},{"functionName":"FreeAreaRight"},{"functionName":"FreeAreaBottom"},{"functionName":"FreeAreaTop"},{"functionName":"UpdateDelayedPosition"},{"functionName":"AddForecastHistoryPosition"},{"functionName":"UpdateForecastedPosition"},{"functionName":"ProjectHistoryEnds"},{"functionName":"ForecastTimeRatio"}]},{"functionName":"IsDelayed"},{"functionName":"CurrentDelay"},{"functionName":"IsWaiting"}]},"propertyDescriptors":[{"value":"0.9","type":"Number","label":"Leftward catch-up speed (in ratio per second)","group":"Catch-up speed","name":"LeftwardSpeed"},{"value":"0.9","type":"Number","label":"Rightward catch-up speed (in ratio per second)","group":"Catch-up speed","name":"RightwardSpeed"},{"value":"0.9","type":"Number","label":"Upward catch-up speed (in ratio per second)","group":"Catch-up speed","name":"UpwardSpeed"},{"value":"0.9","type":"Number","label":"Downward catch-up speed (in ratio per second)","group":"Catch-up speed","name":"DownwardSpeed"},{"value":"true","type":"Boolean","label":"Follow on X axis","name":"FollowOnX"},{"value":"true","type":"Boolean","label":"Follow on Y axis","name":"FollowOnY"},{"value":"0","type":"Number","unit":"Pixel","label":"Follow free area left border","group":"Position","advanced":true,"name":"FollowFreeAreaLeft"},{"value":"0","type":"Number","unit":"Pixel","label":"Follow free area right border","group":"Position","advanced":true,"name":"FollowFreeAreaRight"},{"value":"0","type":"Number","unit":"Pixel","label":"Follow free area top border","group":"Position","advanced":true,"name":"FollowFreeAreaTop"},{"value":"0","type":"Number","unit":"Pixel","label":"Follow free area bottom border","group":"Position","advanced":true,"name":"FollowFreeAreaBottom"},{"value":"0","type":"Number","unit":"Pixel","label":"Camera offset X","group":"Position","advanced":true,"name":"CameraOffsetX"},{"value":"0","type":"Number","unit":"Pixel","label":"Camera offset Y","group":"Position","advanced":true,"name":"CameraOffsetY"},{"value":"0","type":"Number","unit":"Second","label":"Camera delay","group":"Timing","deprecated":true,"name":"CameraDelay"},{"value":"0","type":"Number","unit":"Second","label":"Forecast time","group":"Timing","deprecated":true,"name":"ForecastTime"},{"value":"0","type":"Number","unit":"Second","label":"Forecast history duration","group":"Timing","deprecated":true,"name":"ForecastHistoryDuration"},{"value":"","type":"Number","label":"","hidden":true,"name":"LogLeftwardSpeed"},{"value":"","type":"Number","label":"","hidden":true,"name":"LogRightwardSpeed"},{"value":"","type":"Number","label":"","hidden":true,"name":"LogDownwardSpeed"},{"value":"","type":"Number","label":"","hidden":true,"name":"LogUpwardSpeed"},{"value":"","type":"Number","label":"","hidden":true,"name":"DelayedCenterX"},{"value":"","type":"Number","label":"","hidden":true,"name":"DelayedCenterY"},{"value":"","type":"Number","label":"","hidden":true,"name":"ForecastHistoryMeanX"},{"value":"","type":"Number","label":"","hidden":true,"name":"ForecastHistoryMeanY"},{"value":"","type":"Number","label":"","hidden":true,"name":"ForecastHistoryVarianceX"},{"value":"","type":"Number","label":"","hidden":true,"name":"ForecastHistoryCovariance"},{"value":"","type":"Number","label":"","hidden":true,"name":"ForecastHistoryLinearA"},{"value":"","type":"Number","label":"","hidden":true,"name":"ForecastHistoryLinearB"},{"value":"","type":"Number","label":"","hidden":true,"name":"ForecastedX"},{"value":"","type":"Number","label":"","hidden":true,"name":"ForecastedY"},{"value":"","type":"Number","label":"","hidden":true,"name":"ProjectedNewestX"},{"value":"","type":"Number","label":"","hidden":true,"name":"ProjectedNewestY"},{"value":"","type":"Number","label":"","hidden":true,"name":"ProjectedOldestX"},{"value":"","type":"Number","label":"","hidden":true,"name":"ProjectedOldestY"},{"value":"","type":"Number","label":"","hidden":true,"name":"ForecastHistoryVarianceY"},{"value":"","type":"Number","label":"Index (local variable)","hidden":true,"name":"Index"},{"value":"0","type":"Number","label":"","hidden":true,"name":"CameraDelayCatchUpSpeed"},{"value":"","type":"Number","label":"","hidden":true,"name":"CameraExtraDelay"},{"value":"","type":"Number","label":"","hidden":true,"name":"WaitingSpeedXMax"},{"value":"","type":"Number","label":"","hidden":true,"name":"WaitingSpeedYMax"},{"value":"","type":"Number","label":"","hidden":true,"name":"WaitingEnd"},{"value":"","type":"Number","label":"","hidden":true,"name":"CameraDelayCatchUpDuration"},{"value":"9000","type":"Number","unit":"PixelSpeed","label":"Leftward maximum speed","group":"Maximum speed","advanced":true,"name":"LeftwardSpeedMax"},{"value":"9000","type":"Number","unit":"PixelSpeed","label":"Rightward maximum speed","group":"Maximum speed","advanced":true,"name":"RightwardSpeedMax"},{"value":"9000","type":"Number","unit":"PixelSpeed","label":"Upward maximum speed","group":"Maximum speed","advanced":true,"name":"UpwardSpeedMax"},{"value":"9000","type":"Number","unit":"PixelSpeed","label":"Downward maximum speed","group":"Maximum speed","advanced":true,"name":"DownwardSpeedMax"},{"value":"","type":"Number","label":"OldX (local variable)","hidden":true,"name":"OldX"},{"value":"","type":"Number","label":"OldY (local variable)","hidden":true,"name":"OldY"},{"value":"","type":"Boolean","label":"","hidden":true,"name":"IsCalledManually"}],"propertiesFolderStructure":{"folderName":"__ROOT","children":[{"folderName":"Catch-up speed","children":[{"propertyName":"LeftwardSpeed"},{"propertyName":"RightwardSpeed"},{"propertyName":"UpwardSpeed"},{"propertyName":"DownwardSpeed"}]},{"propertyName":"FollowOnX"},{"propertyName":"FollowOnY"},{"folderName":"Position","children":[{"propertyName":"FollowFreeAreaLeft"},{"propertyName":"FollowFreeAreaRight"},{"propertyName":"FollowFreeAreaTop"},{"propertyName":"FollowFreeAreaBottom"},{"propertyName":"CameraOffsetX"},{"propertyName":"CameraOffsetY"}]},{"folderName":"Timing","children":[{"propertyName":"CameraDelay"},{"propertyName":"ForecastTime"},{"propertyName":"ForecastHistoryDuration"}]},{"propertyName":"LogLeftwardSpeed"},{"propertyName":"LogRightwardSpeed"},{"propertyName":"LogDownwardSpeed"},{"propertyName":"LogUpwardSpeed"},{"propertyName":"DelayedCenterX"},{"propertyName":"DelayedCenterY"},{"propertyName":"ForecastHistoryMeanX"},{"propertyName":"ForecastHistoryMeanY"},{"propertyName":"ForecastHistoryVarianceX"},{"propertyName":"ForecastHistoryCovariance"},{"propertyName":"ForecastHistoryLinearA"},{"propertyName":"ForecastHistoryLinearB"},{"propertyName":"ForecastedX"},{"propertyName":"ForecastedY"},{"propertyName":"ProjectedNewestX"},{"propertyName":"ProjectedNewestY"},{"propertyName":"ProjectedOldestX"},{"propertyName":"ProjectedOldestY"},{"propertyName":"ForecastHistoryVarianceY"},{"propertyName":"Index"},{"propertyName":"CameraDelayCatchUpSpeed"},{"propertyName":"CameraExtraDelay"},{"propertyName":"WaitingSpeedXMax"},{"propertyName":"WaitingSpeedYMax"},{"propertyName":"WaitingEnd"},{"propertyName":"CameraDelayCatchUpDuration"},{"folderName":"Maximum speed","children":[{"propertyName":"LeftwardSpeedMax"},{"propertyName":"RightwardSpeedMax"},{"propertyName":"UpwardSpeedMax"},{"propertyName":"DownwardSpeedMax"}]},{"propertyName":"OldX"},{"propertyName":"OldY"},{"propertyName":"IsCalledManually"}]}},{"description":"Smoothly scroll to follow a character and stabilize the camera when jumping.","fullName":"Smooth platformer camera","helpPath":"","iconUrl":"","name":"SmoothPlatformerCamera","objectType":"","previewIconUrl":"","quickCustomizationVisibility":"hidden","eventsFunctions":[{"fullName":"","functionType":"Action","name":"doStepPreEvents","sentence":"","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"inverted":true,"value":"PlatformBehavior::IsJumping"},"parameters":["Object","PlatformerCharacter"]},{"type":{"inverted":true,"value":"PlatformBehavior::IsFalling"},"parameters":["Object","PlatformerCharacter"]}],"actions":[{"type":{"value":"SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom"},"parameters":["Object","SmoothCamera","FloorFollowFreeAreaTop",""]},{"type":{"value":"SmoothCamera::SmoothCamera::SetFollowFreeAreaTop"},"parameters":["Object","SmoothCamera","FloorFollowFreeAreaBottom",""]},{"type":{"value":"SmoothCamera::SmoothCamera::SetUpwardSpeed"},"parameters":["Object","SmoothCamera","FloorUpwardSpeed",""]},{"type":{"value":"SmoothCamera::SmoothCamera::SetDownwardSpeed"},"parameters":["Object","SmoothCamera","FloorDownwardSpeed",""]},{"type":{"value":"SmoothCamera::SmoothCamera::SetUpwardSpeedMax"},"parameters":["Object","SmoothCamera","FloorUpwardSpeedMax",""]},{"type":{"value":"SmoothCamera::SmoothCamera::SetDownwardSpeedMax"},"parameters":["Object","SmoothCamera","FloorDownwardSpeedMax",""]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BuiltinCommonInstructions::Or"},"parameters":[],"subInstructions":[{"type":{"value":"PlatformBehavior::IsJumping"},"parameters":["Object","PlatformerCharacter"]},{"type":{"value":"PlatformBehavior::IsFalling"},"parameters":["Object","PlatformerCharacter"]}]}],"actions":[{"type":{"value":"SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom"},"parameters":["Object","SmoothCamera","AirFollowFreeAreaTop",""]},{"type":{"value":"SmoothCamera::SmoothCamera::SetFollowFreeAreaTop"},"parameters":["Object","SmoothCamera","AirFollowFreeAreaBottom",""]},{"type":{"value":"SmoothCamera::SmoothCamera::SetUpwardSpeed"},"parameters":["Object","SmoothCamera","AirUpwardSpeed",""]},{"type":{"value":"SmoothCamera::SmoothCamera::SetDownwardSpeed"},"parameters":["Object","SmoothCamera","AirDownwardSpeed",""]},{"type":{"value":"SmoothCamera::SmoothCamera::SetUpwardSpeedMax"},"parameters":["Object","SmoothCamera","AirUpwardSpeedMax",""]},{"type":{"value":"SmoothCamera::SmoothCamera::SetDownwardSpeedMax"},"parameters":["Object","SmoothCamera","AirDownwardSpeedMax",""]}]}],"parameters":[{"description":"Object","name":"Object","type":"object"},{"description":"Behavior","name":"Behavior","supplementaryInformation":"SmoothCamera::SmoothPlatformerCamera","type":"behavior"}],"objectGroups":[]}],"eventsFunctionsFolderStructure":{"folderName":"__ROOT","children":[{"functionName":"doStepPreEvents"}]},"propertyDescriptors":[{"value":"","type":"Behavior","label":"Platformer character behavior","extraInformation":["PlatformBehavior::PlatformerObjectBehavior"],"choices":[],"name":"PlatformerCharacter"},{"value":"","type":"Behavior","label":"Smooth camera behavior","extraInformation":["SmoothCamera::SmoothCamera"],"choices":[],"name":"SmoothCamera"},{"value":"","type":"Number","label":"","hidden":true,"name":"JumpOriginY"},{"value":"0","type":"Number","unit":"Pixel","label":"Follow free area top in the air","group":"Position","name":"AirFollowFreeAreaTop"},{"value":"0","type":"Number","unit":"Pixel","label":"Follow free area bottom in the air","group":"Position","name":"AirFollowFreeAreaBottom"},{"value":"0","type":"Number","unit":"Pixel","label":"Follow free area top on the floor","group":"Position","name":"FloorFollowFreeAreaTop"},{"value":"0","type":"Number","unit":"Pixel","label":"Follow free area bottom on the floor","group":"Position","name":"FloorFollowFreeAreaBottom"},{"value":"0.95","type":"Number","label":"Upward speed in the air (in ratio per second)","group":"Catch-up speed","name":"AirUpwardSpeed"},{"value":"0.95","type":"Number","label":"Downward speed in the air (in ratio per second)","group":"Catch-up speed","name":"AirDownwardSpeed"},{"value":"0.9","type":"Number","label":"Upward speed on the floor (in ratio per second)","group":"Catch-up speed","name":"FloorUpwardSpeed"},{"value":"0.9","type":"Number","label":"Downward speed on the floor (in ratio per second)","group":"Catch-up speed","name":"FloorDownwardSpeed"},{"value":"9000","type":"Number","unit":"PixelSpeed","label":"Upward maximum speed in the air","group":"Maximum speed","name":"AirUpwardSpeedMax"},{"value":"9000","type":"Number","unit":"PixelSpeed","label":"Downward maximum speed in the air","group":"Maximum speed","name":"AirDownwardSpeedMax"},{"value":"9000","type":"Number","unit":"PixelSpeed","label":"Upward maximum speed on the floor","group":"Maximum speed","name":"FloorUpwardSpeedMax"},{"value":"9000","type":"Number","unit":"PixelSpeed","label":"Downward maximum speed on the floor","group":"Maximum speed","name":"FloorDownwardSpeedMax"}],"propertiesFolderStructure":{"folderName":"__ROOT","children":[{"propertyName":"PlatformerCharacter"},{"propertyName":"SmoothCamera"},{"propertyName":"JumpOriginY"},{"folderName":"Position","children":[{"propertyName":"AirFollowFreeAreaTop"},{"propertyName":"AirFollowFreeAreaBottom"},{"propertyName":"FloorFollowFreeAreaTop"},{"propertyName":"FloorFollowFreeAreaBottom"}]},{"folderName":"Catch-up speed","children":[{"propertyName":"AirUpwardSpeed"},{"propertyName":"AirDownwardSpeed"},{"propertyName":"FloorUpwardSpeed"},{"propertyName":"FloorDownwardSpeed"}]},{"folderName":"Maximum speed","children":[{"propertyName":"AirUpwardSpeedMax"},{"propertyName":"AirDownwardSpeedMax"},{"propertyName":"FloorUpwardSpeedMax"},{"propertyName":"FloorDownwardSpeedMax"}]}]}}],"eventsBasedObjects":[]},{"author":"","category":"Camera","dimension":"2D","extensionNamespace":"","fullName":"Room-based camera movement","gdevelopVersion":">=5.5.222","helpPath":"https://victrisgames.itch.io/room-based-camera-movement","iconUrl":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGc+DQoJPHBhdGggZD0iTTE0LDNINEMzLjQsMywzLDMuNCwzLDR2MTBjMCwwLjYsMC40LDEsMSwxaDEwYzAuNiwwLDEtMC40LDEtMVY0QzE1LDMuNCwxNC42LDMsMTQsM3oiLz4NCgk8cGF0aCBkPSJNMTQsMTdINGMtMC42LDAtMSwwLjQtMSwxdjEwYzAsMC42LDAuNCwxLDEsMWgxMGMwLjYsMCwxLTAuNCwxLTFWMThDMTUsMTcuNCwxNC42LDE3LDE0LDE3eiIvPg0KCTxwYXRoIGQ9Ik0yOCwzSDE4Yy0wLjYsMC0xLDAuNC0xLDF2MTBjMCwwLjYsMC40LDEsMSwxaDEwYzAuNiwwLDEtMC40LDEtMVY0QzI5LDMuNCwyOC42LDMsMjgsM3oiLz4NCgk8cGF0aCBkPSJNMjgsMTdIMThjLTAuNiwwLTEsMC40LTEsMXYxMGMwLDAuNiwwLjQsMSwxLDFoMTBjMC42LDAsMS0wLjQsMS0xVjE4QzI5LDE3LjQsMjguNiwxNywyOCwxN3oiLz4NCjwvZz4NCjwvc3ZnPg0K","name":"RoomBasedCameraMovement","previewIconUrl":"https://resources.gdevelop-app.com/assets/Icons/Glyphster Pack/Master/SVG/Applications and Programming/Applications and Programming_app_apps_applications_tiles.svg","shortDescription":"Move/zoom camera to frame the room object containing the player.","version":"1.0.5","description":["Move camera to the room that contains the trigger object (usually the player). If desired, change zoom to show the entire room or keep zoom static.","","How to use:","- Place room objects on scene","- Select camera zoom limits, how fast the camera should move, and the visible buffer around each room","- Run the \"Move and zoom camera\" action on every frame","- Move the trigger object (player) between rooms and the camera will center on the room that contains the trigger object.","","Tips:","- Use these conditions for custom logic when changing rooms : \"Camera moving\", \"Camera zooming\", and \"Room changed\"","- Set \"Lerp Speed\" to \"1\" to change the camera instantly"],"origin":{"identifier":"RoomBasedCameraMovement","name":"gdevelop-extension-store"},"tags":["camera","follow","room","trigger","zoom","move","smooth"],"authorIds":["gqDaZjCfevOOxBYkK6zlhtZnXCg1","8Ih1aa8f5gWUp4UB2BdhQ2iXWxJ3","dt0tRnf2kHWJnjkrpnzTzNj9Yc63"],"dependencies":[],"globalVariables":[],"sceneVariables":[],"eventsFunctions":[{"description":"Move and zoom camera to the room object that contains the trigger object (usually the player).","fullName":"Move and zoom camera to the room object that contains the trigger object (player)","functionType":"Action","group":"Layers and cameras","name":"MoveCameraToActiveRoom","sentence":"Move camera to room object _PARAM1_ that contains trigger object _PARAM2_ (Layer: _PARAM3_, Lerp speed: _PARAM4_, Max zoom: _PARAM5_, Min zoom: _PARAM6_, Border buffer: _PARAM7_px)","events":[{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Initialize","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Save input values"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__RoomBasedCameraMovement.MaxZoom","=","MaxZoom"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__RoomBasedCameraMovement.LerpSpeed","=","LerpSpeed"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Set default values if none provided"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarScene"},"parameters":["__RoomBasedCameraMovement.MaxZoom","<=","0"]}],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__RoomBasedCameraMovement.MaxZoom","=","1"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarScene"},"parameters":["__RoomBasedCameraMovement.LerpSpeed","<=","0"]}],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__RoomBasedCameraMovement.LerpSpeed","=","0.1"]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Main","source":"","type":"BuiltinCommonInstructions::Group","events":[{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Identify the current room","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Detect which room is the current one"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"CollisionPoint"},"parameters":["RoomObject","TriggerObject.CenterX()","TriggerObject.CenterY()"]}],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Room has NOT changed"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarObjet"},"parameters":["TriggerObject","__RoomBasedCameraMovement.CurrentRoomID","=","RoomObject.Variable(__RoomBasedCameraMovement.RoomID)"]}],"actions":[{"type":{"value":"SetObjectVariableAsBoolean"},"parameters":["TriggerObject","__RoomBasedCameraMovement.RoomChanged","False"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Room has changed"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarObjet"},"parameters":["TriggerObject","__RoomBasedCameraMovement.CurrentRoomID","!=","RoomObject.Variable(__RoomBasedCameraMovement.RoomID)"]}],"actions":[{"type":{"value":"SetObjectVariableAsBoolean"},"parameters":["TriggerObject","__RoomBasedCameraMovement.RoomChanged","True"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Update CurrentRoomID variable"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarObjet"},"parameters":["TriggerObject","__RoomBasedCameraMovement.CurrentRoomID","=","RoomObject.Variable(__RoomBasedCameraMovement.RoomID)"]}]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Move camera","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::ForEach","object":"RoomObject","conditions":[],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Assign each room a unique ID if they don't have one yet"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarObjet"},"parameters":["RoomObject","__RoomBasedCameraMovement.RoomID","=","0"]}],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__RoomBasedCameraMovement.MaxRoomID","+","1"]},{"type":{"value":"ModVarObjet"},"parameters":["RoomObject","__RoomBasedCameraMovement.RoomID","=","Variable(__RoomBasedCameraMovement.MaxRoomID)"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Check if this room is the current room"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarObjet"},"parameters":["RoomObject","__RoomBasedCameraMovement.RoomID","=","TriggerObject.Variable(__RoomBasedCameraMovement.CurrentRoomID)"]}],"actions":[],"events":[{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Change zoom","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Calculate the camera dimensions"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__RoomBasedCameraMovement.CameraWidth","=","RoomObject.Width()+2*OutsideBuffer"]},{"type":{"value":"ModVarScene"},"parameters":["__RoomBasedCameraMovement.CameraHeight","=","RoomObject.Height()+2*OutsideBuffer"]},{"type":{"value":"ModVarScene"},"parameters":["__RoomBasedCameraMovement.CameraZoom","=","min(SceneWindowHeight() / Variable(__RoomBasedCameraMovement.CameraHeight), SceneWindowWidth() / Variable(__RoomBasedCameraMovement.CameraWidth))"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Adjust zoom to stay within min/max values"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__RoomBasedCameraMovement.CameraZoom","=","clamp(Variable(__RoomBasedCameraMovement.CameraZoom),MinZoom,Variable(__RoomBasedCameraMovement.MaxZoom))"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Change camera zoom"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ZoomCamera"},"parameters":["","ceil(lerp(CameraZoom(Layer,Camera),Variable(__RoomBasedCameraMovement.CameraZoom),Variable(__RoomBasedCameraMovement.LerpSpeed))*1000)/1000","Layer","Camera"]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Move camera position","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"For rooms smaller than the viewable screen, center the camera on the center of the room"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarScene"},"parameters":["__RoomBasedCameraMovement.CameraWidth","<=","SceneWindowWidth()"]}],"actions":[{"type":{"value":"SetCameraCenterX"},"parameters":["","=","ceil(lerp(CameraX(Layer,Camera), RoomObject.CenterX(), Variable(__RoomBasedCameraMovement.LerpSpeed))*100)/100","Layer","Camera"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarScene"},"parameters":["__RoomBasedCameraMovement.CameraHeight","<=","SceneWindowHeight()"]}],"actions":[{"type":{"value":"SetCameraCenterY"},"parameters":["","=","ceil(lerp(CameraY(Layer,Camera), RoomObject.CenterY(), Variable(__RoomBasedCameraMovement.LerpSpeed))*100)/100","Layer","Camera"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"For rooms larger than the viewable screen, center the camera on the TriggerObject and clamp camera so it only shows the room + buffer"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarScene"},"parameters":["__RoomBasedCameraMovement.CameraWidth",">","SceneWindowWidth()"]}],"actions":[{"type":{"value":"SetCameraCenterX"},"parameters":["","=","ceil(lerp(CameraX(Layer,Camera), clamp(TriggerObject.CenterX(), \nRoomObject.CenterX() - RoomObject.Width()/2 + SceneWindowWidth()/2 - OutsideBuffer, RoomObject.CenterX() + RoomObject.Width()/2 - SceneWindowWidth()/2 + OutsideBuffer), Variable(__RoomBasedCameraMovement.LerpSpeed))*100)/100","Layer","Camera"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarScene"},"parameters":["__RoomBasedCameraMovement.CameraHeight",">","SceneWindowHeight()"]}],"actions":[{"type":{"value":"SetCameraCenterY"},"parameters":["","=","ceil(lerp(CameraY(Layer,Camera), clamp(TriggerObject.CenterY(), \nRoomObject.CenterY() - RoomObject.Height()/2 + SceneWindowHeight()/2 - OutsideBuffer, RoomObject.CenterY() + RoomObject.Height()/2 - SceneWindowHeight()/2 + OutsideBuffer), Variable(__RoomBasedCameraMovement.LerpSpeed))*100)/100","Layer","Camera"]}]}],"parameters":[]}]}]}],"parameters":[]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Calculate \"IsCameraMoving\" condition","source":"","type":"BuiltinCommonInstructions::Group","events":[{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Initialize","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarScene"},"parameters":["__RoomBasedCameraMovement.PrevCameraX","=","0"]},{"type":{"value":"VarScene"},"parameters":["__RoomBasedCameraMovement.PrevCameraY","=","0"]}],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__RoomBasedCameraMovement.PrevCameraX","=","CameraX(Layer, Camera)"]},{"type":{"value":"ModVarScene"},"parameters":["__RoomBasedCameraMovement.PrevCameraY","=","CameraY(Layer, Camera)"]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Check if camera position changed","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Camera has NOT moved"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarScene"},"parameters":["__RoomBasedCameraMovement.PrevCameraX","=","CameraX(Layer,Camera)"]},{"type":{"value":"VarScene"},"parameters":["__RoomBasedCameraMovement.PrevCameraY","=","CameraY(Layer,Camera)"]}],"actions":[{"type":{"value":"SetSceneVariableAsBoolean"},"parameters":["__RoomBasedCameraMovement.CameraMoving","False"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Camera has moved"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BuiltinCommonInstructions::Or"},"parameters":[],"subInstructions":[{"type":{"value":"VarScene"},"parameters":["__RoomBasedCameraMovement.PrevCameraX","!=","CameraX(Layer,Camera)"]},{"type":{"value":"VarScene"},"parameters":["__RoomBasedCameraMovement.PrevCameraY","!=","CameraY(Layer,Camera)"]}]}],"actions":[{"type":{"value":"SetSceneVariableAsBoolean"},"parameters":["__RoomBasedCameraMovement.CameraMoving","True"]}],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Update with current camera position"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__RoomBasedCameraMovement.PrevCameraX","=","CameraX(Layer, Camera)"]},{"type":{"value":"ModVarScene"},"parameters":["__RoomBasedCameraMovement.PrevCameraY","=","CameraY(Layer, Camera)"]}]}]}],"parameters":[]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Calculate \"IsCameraZooming\" condition","source":"","type":"BuiltinCommonInstructions::Group","events":[{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Initialize","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarScene"},"parameters":["__RoomBasedCameraMovement.PreviousZoom","=","0"]}],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__RoomBasedCameraMovement.PreviousZoom","=","CameraZoom(Layer, Camera)"]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Check if camera zoom changed","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Camera zoom has NOT changed"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarScene"},"parameters":["__RoomBasedCameraMovement.PreviousZoom","=","CameraZoom(Layer,Camera)"]}],"actions":[{"type":{"value":"SetSceneVariableAsBoolean"},"parameters":["__RoomBasedCameraMovement.CameraZooming","False"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Camera zoom has changed"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarScene"},"parameters":["__RoomBasedCameraMovement.PreviousZoom","!=","CameraZoom(Layer,Camera)"]}],"actions":[{"type":{"value":"SetSceneVariableAsBoolean"},"parameters":["__RoomBasedCameraMovement.CameraZooming","True"]}],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Update with current camera zoom"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__RoomBasedCameraMovement.PreviousZoom","=","CameraZoom(Layer, Camera)"]}]}]}],"parameters":[]}],"parameters":[]}],"parameters":[{"description":"Room object","longDescription":"Room objects are used to mark areas that should be seen by the camera.","name":"RoomObject","type":"objectList"},{"description":"Trigger object (player)","longDescription":"When the Trigger Object touches a new Room Object, the camera will move to the new room","name":"TriggerObject","type":"objectList"},{"description":"Layer","name":"Layer","type":"layer"},{"description":"Lerp speed","longDescription":"Range: 0 to 1","name":"LerpSpeed","type":"expression"},{"description":"Maximum zoom","name":"MaxZoom","type":"expression"},{"description":"Minimum zoom","name":"MinZoom","type":"expression"},{"description":"Outside buffer (pixels)","longDescription":"Minimum extra space displayed around each side the room","name":"OutsideBuffer","type":"expression"},{"description":"Camera","name":"Camera","type":"expression"}],"objectGroups":[]},{"description":"Check if trigger object (usually the player) has entered a new room on this frame.","fullName":"Check if trigger object (player) has entered a new room","functionType":"Condition","name":"ActiveRoomChanged","sentence":"_PARAM1_ has just entered a new room","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"ObjectVariableAsBoolean"},"parameters":["TriggerObject","__RoomBasedCameraMovement.RoomChanged","True"]}],"actions":[{"type":{"value":"SetReturnBoolean"},"parameters":["True"]}]}],"parameters":[{"description":"Trigger object (player)","name":"TriggerObject","type":"objectList"}],"objectGroups":[]},{"description":"Check if camera is zooming (requires the use of \"Move and zoom camera\" action in this extension).","fullName":"Check if camera is zooming","functionType":"Condition","name":"IsCameraZooming","sentence":"Camera is zooming","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"SceneVariableAsBoolean"},"parameters":["__RoomBasedCameraMovement.CameraZooming","True"]}],"actions":[{"type":{"value":"SetReturnBoolean"},"parameters":["True"]}]}],"parameters":[],"objectGroups":[]},{"description":"Check if camera is moving (requires the use of \"Move and zoom camera\" action in this extension).","fullName":"Check if camera is moving","functionType":"Condition","name":"IsCameraMoving","sentence":"Camera is moving","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"SceneVariableAsBoolean"},"parameters":["__RoomBasedCameraMovement.CameraMoving","True"]}],"actions":[{"type":{"value":"SetReturnBoolean"},"parameters":["True"]}]}],"parameters":[],"objectGroups":[]}],"eventsFunctionsFolderStructure":{"folderName":"__ROOT","children":[{"folderName":"Layers and cameras","children":[{"functionName":"MoveCameraToActiveRoom"}]},{"functionName":"ActiveRoomChanged"},{"functionName":"IsCameraZooming"},{"functionName":"IsCameraMoving"}]},"eventsBasedBehaviors":[],"eventsBasedObjects":[]},{"author":"@oscuridad6661, Tristan Rhodes (@VictrisGames)","category":"Game mechanic","dimension":"","extensionNamespace":"","fullName":"Dungeon generator","gdevelopVersion":">=5.5.222","helpPath":"https://victrisgames.itch.io/extension-dungeon-generator","iconUrl":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLXNpdGVtYXAiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNOSwyVjhIMTFWMTFINUMzLjg5LDExIDMsMTEuODkgMywxM1YxNkgxVjIySDdWMTZINVYxM0gxMVYxNkg5VjIySDE1VjE2SDEzVjEzSDE5VjE2SDE3VjIySDIzVjE2SDIxVjEzQzIxLDExLjg5IDIwLjExLDExIDE5LDExSDEzVjhIMTVWMkg5WiIgLz48L3N2Zz4=","name":"DungeonGenerator","previewIconUrl":"https://resources.gdevelop-app.com/assets/Icons/sitemap.svg","shortDescription":"Create a procedurally generated dungeon. Includes two layouts: \"rooms and hallways\" and \"dungeon cave\".","version":"1.2.1","description":["How to use:","- Run the \"Generate Dungeon Cave\" or \"Generate Dungeon with Rooms\" action at the beginning of a scene.","","Tips:","- Keep the amount of space used by room objects to less than ~25% of the total map. If you add too many rooms, they will not be placed correctly and might collide with other rooms.","- Try using top-down controls combined with physics behavior (with no gravity) on the player and wall objects","- Use external layouts to place pre-designed rooms on randomly created room objects","- Use \"Delete Unused Terrain\" option to reduce resources used","- Use \"RoomID(object)\" expression to determine the starting and ending room","- Use \"NeighborCount(object)\" expression to find good places to place treasure. A high amount of neighbors means that the tile is a nook or cranny.","- Use \"IsRoomEntrance\" condition to identify hallway objects that are adjacent to a room","","An example shows how to procedurally generate dungeons or caves ([open the project online](https://editor.gdevelop.io/?project=example://dungeon-generator))."],"origin":{"identifier":"DungeonGenerator","name":"gdevelop-extension-store"},"tags":["dungeon","generator","procedural","generation","automatic","build","create","rogue","roguelike","hallway","entrance","floor","room","cave"],"authorIds":["gqDaZjCfevOOxBYkK6zlhtZnXCg1","5iOtaj8yEsam4mIj7TEUDk4LSAe2"],"dependencies":[],"globalVariables":[],"sceneVariables":[],"eventsFunctions":[{"description":"Set the size of hallway objects to be placed on the path created by the pathfinding object.","fullName":"Set size of hallway objects","functionType":"Action","name":"AdjustHallwaySizes","private":true,"sentence":"Set the size of hallway objects _PARAM1_ to be placed on the path created by _PARAM2_ (Tile size: _PARAM4_ pixels, Hallway width: _PARAM5_ tiles)","events":[{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Adjust size of hallway objects","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Set the default size of hallway object to the tilesize"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ChangeHeight"},"parameters":["HallwayObject","=","TileSize "]},{"type":{"value":"ChangeWidth"},"parameters":["HallwayObject","=","TileSize "]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Skip the first step in the path (so this function doesn't try to evaluate step 0)"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarScene"},"parameters":["__DungeonGenerator.PathCounter",">","1"]}],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Vertical move (previous frame)"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BuiltinCommonInstructions::CompareNumbers"},"parameters":["PathfinderObject.PathfindingBehavior::GetNodeX(Variable(__DungeonGenerator.PathCounter))","=","PathfinderObject.PathfindingBehavior::GetNodeX(Variable(__DungeonGenerator.PathCounter)-1)"]}],"actions":[{"type":{"value":"ChangeWidth"},"parameters":["HallwayObject","=","TileSize * max(1,HallwayWidth)"]}],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Change in direction (this frame)"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BuiltinCommonInstructions::CompareNumbers"},"parameters":["PathfinderObject.PathfindingBehavior::GetNodeY(Variable(__DungeonGenerator.PathCounter))","=","PathfinderObject.PathfindingBehavior::GetNodeY(Variable(__DungeonGenerator.PathCounter)+1)"]}],"actions":[{"type":{"value":"ChangeHeight"},"parameters":["HallwayObject","=","TileSize * max(1,HallwayWidth)"]}]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Horizontal move (previous frame)"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BuiltinCommonInstructions::CompareNumbers"},"parameters":["PathfinderObject.PathfindingBehavior::GetNodeY(Variable(__DungeonGenerator.PathCounter))","=","PathfinderObject.PathfindingBehavior::GetNodeY(Variable(__DungeonGenerator.PathCounter)-1)"]}],"actions":[{"type":{"value":"ChangeHeight"},"parameters":["HallwayObject","=","TileSize * max(1,HallwayWidth)"]}],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Change in direction (this frame)"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BuiltinCommonInstructions::CompareNumbers"},"parameters":["PathfinderObject.PathfindingBehavior::GetNodeX(Variable(__DungeonGenerator.PathCounter))","=","PathfinderObject.PathfindingBehavior::GetNodeX(Variable(__DungeonGenerator.PathCounter)+1)"]}],"actions":[{"type":{"value":"ChangeWidth"},"parameters":["HallwayObject","=","TileSize * max(1,HallwayWidth)"]}]}]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.PathCounter","+","1"]}]}],"parameters":[]}],"parameters":[{"description":"Hallway object","name":"HallwayObject","supplementaryInformation":"Sprite","type":"objectList"},{"description":"Pathfinder object","name":"PathfinderObject","supplementaryInformation":"Sprite","type":"objectList"},{"description":"Pathfinding behavior","name":"PathfindingBehavior","supplementaryInformation":"PathfindingBehavior::PathfindingBehavior","type":"behavior"},{"description":"Tile size (pixels)","name":"TileSize","type":"expression"},{"description":"Hallway width (tiles)","name":"HallwayWidth","type":"expression"}],"objectGroups":[]},{"description":"Fill world with terrain","fullName":"Fill world with terrain","functionType":"Action","name":"FillWorld","private":true,"sentence":"Fill world with terrain (Tile size: _PARAM1_ pixels, Columns: _PARAM2_ tiles, Rows: _PARAM3_ tiles, Fill object: _PARAM4_)","events":[{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Populate map with terrain objects everywhere","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.CounterX","=","0"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.CounterY","=","0"]}]},{"type":"BuiltinCommonInstructions::Repeat","repeatExpression":"MapHeight","conditions":[],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Repeat","repeatExpression":"MapWidth","conditions":[],"actions":[{"type":{"value":"Create"},"parameters":["","TerrainObject","Variable(__DungeonGenerator.CounterX) * TileSize","Variable(__DungeonGenerator.CounterY) * TileSize","Layer"]},{"type":{"value":"ChangeWidth"},"parameters":["TerrainObject","=","TileSize"]},{"type":{"value":"ChangeHeight"},"parameters":["TerrainObject","=","TileSize"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.CounterX","+","1"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.CounterX","=","0"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.CounterY","+","1"]}]}]}],"parameters":[]}],"parameters":[{"description":"Tile size (pixels)","name":"TileSize","type":"expression"},{"description":"Map width (number of colums)","name":"MapWidth","type":"expression"},{"description":"Map height (number of rows)","name":"MapHeight","type":"expression"},{"description":"Terrain object","name":"TerrainObject","supplementaryInformation":"Sprite","type":"objectList"}],"objectGroups":[]},{"description":"Generate a dungeon cave using a random walk algorithm. When the walker touches an edge of the map, it is moved back to the center of map.","fullName":"Generate a dungeon cave","functionType":"Action","name":"GenerateDungeonCave","sentence":"Generate a dungeon cave that has _PARAM8_ percent floor objects (Tile size: _PARAM1_ pixels, Map width: _PARAM2_ tiles, Map height: _PARAM3_ tiles, Terrain object: _PARAM4_, Floor object: _PARAM5_, Wall object: _PARAM12_, Walker object: _PARAM7_, Walker width/height: _PARAM9_ tiles, Minimum border: _PARAM10_ tiles, Create objects on layer: _PARAM6_, Delete unused terrain: _PARAM11_, Calculate neighbors: _PARAM13_)","events":[{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Random walk","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Calculate the number of floor objects to be created. Don't include border in calculation. Multiply border by 2 because it needs to exist on both sides (top+bottom, left+right)."},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.FloorGoal","=","round((MapWidth - 2 * MinBorder) * (MapHeight - 2 * MinBorder) * FloorPercentage)"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Initialize counters"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.StepsTaken","=","0"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.FloorCreated","=","0"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.WalkerRestarts","=","0"]}]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Walk until complete (using a 2D array)","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Start with an empty map (array)"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"VariableRemoveChild"},"parameters":["__DungeonGenerator","\"WalkerMap\""]}]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Create walkers","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Initialize walker offsets (these are used to make the walker take up more than one tile)"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.WalkerOffsetX","=","0"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.WalkerOffsetY","=","0"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Create (WalkerSize^2) quantity of objects (1x1=1, 2x2=4, 3x3=9, etc0"},{"type":"BuiltinCommonInstructions::Repeat","repeatExpression":"max(1,WalkerSize)","conditions":[],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Repeat","repeatExpression":"max(1,WalkerSize)","conditions":[],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Create virtual walker objects. Walker objects are ONLY used to store variables and to perform ForEach() loops. Position, size, and appearance DO NOT matter. \nTODO: These could be replaced by structure variables."},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"Create"},"parameters":["","WalkerObject","0","0","Layer"]}],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Calculate the starting position (in the 2D array) and save it so it can be used for restarts"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarObjet"},"parameters":["WalkerObject","__DungeonGenerator.Xpos","=","round(MapWidth/2 + Variable(__DungeonGenerator.WalkerOffsetX))"]},{"type":{"value":"ModVarObjet"},"parameters":["WalkerObject","__DungeonGenerator.Ypos","=","round(MapHeight/2 + Variable(__DungeonGenerator.WalkerOffsetY))"]},{"type":{"value":"ModVarObjet"},"parameters":["WalkerObject","__DungeonGenerator.StartXpos","=","WalkerObject.Variable(__DungeonGenerator.Xpos)"]},{"type":{"value":"ModVarObjet"},"parameters":["WalkerObject","__DungeonGenerator.StartYpos","=","WalkerObject.Variable(__DungeonGenerator.Ypos)"]}]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.WalkerOffsetX","+","1"]}]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.WalkerOffsetX","=","0"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.WalkerOffsetY","+","1"]}]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Process walker movements","source":"","type":"BuiltinCommonInstructions::Group","events":[{"infiniteLoopWarning":true,"type":"BuiltinCommonInstructions::While","whileConditions":[{"type":{"value":"VarScene"},"parameters":["__DungeonGenerator.FloorCreated","<","Variable(__DungeonGenerator.FloorGoal)"]}],"conditions":[],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Reset variables"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetSceneVariableAsBoolean"},"parameters":["__DungeonGenerator.InitiateRestart","False"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Calculate chance to go in each direction based on the ratio of width to height"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.ChanceToGoRight","=","0.5 * (MapWidth / (MapWidth + MapHeight))"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.ChanceToGoLeft","=","Variable(__DungeonGenerator.ChanceToGoRight)"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.ChanceToGoUp","=","0.5 * (MapHeight / (MapWidth + MapHeight))"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.ChanceToGoDown","=","Variable(__DungeonGenerator.ChanceToGoUp)"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Generate a random number between 0 and 1"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.RandomNumber","=","RandomFloatInRange(0,1)"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Move LEFT"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarScene"},"parameters":["__DungeonGenerator.RandomNumber",">=","0"]},{"type":{"value":"VarScene"},"parameters":["__DungeonGenerator.RandomNumber","<","Variable(__DungeonGenerator.ChanceToGoLeft)"]}],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarObjet"},"parameters":["WalkerObject","__DungeonGenerator.Xpos","-","1"]}]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Move RIGHT"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarScene"},"parameters":["__DungeonGenerator.RandomNumber",">=","Variable(__DungeonGenerator.ChanceToGoLeft)"]},{"type":{"value":"VarScene"},"parameters":["__DungeonGenerator.RandomNumber","<","Variable(__DungeonGenerator.ChanceToGoLeft) + Variable(__DungeonGenerator.ChanceToGoRight)"]}],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarObjet"},"parameters":["WalkerObject","__DungeonGenerator.Xpos","+","1"]}]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Move UP"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarScene"},"parameters":["__DungeonGenerator.RandomNumber",">=","Variable(__DungeonGenerator.ChanceToGoLeft) + Variable(__DungeonGenerator.ChanceToGoRight)"]},{"type":{"value":"VarScene"},"parameters":["__DungeonGenerator.RandomNumber","<","Variable(__DungeonGenerator.ChanceToGoLeft) + Variable(__DungeonGenerator.ChanceToGoRight) + Variable(__DungeonGenerator.ChanceToGoUp)"]}],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarObjet"},"parameters":["WalkerObject","__DungeonGenerator.Ypos","-","1"]}]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Move DOWN"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarScene"},"parameters":["__DungeonGenerator.RandomNumber",">=","Variable(__DungeonGenerator.ChanceToGoLeft) + Variable(__DungeonGenerator.ChanceToGoRight) + Variable(__DungeonGenerator.ChanceToGoUp)"]},{"type":{"value":"VarScene"},"parameters":["__DungeonGenerator.RandomNumber","<=","1"]}],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarObjet"},"parameters":["WalkerObject","__DungeonGenerator.Ypos","+","1"]}]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"If ANY Walker is outside map boundries, reset ALL of them to their starting positions"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BuiltinCommonInstructions::Or"},"parameters":[],"subInstructions":[{"type":{"value":"VarObjet"},"parameters":["WalkerObject","__DungeonGenerator.Xpos","<","MinBorder"]},{"type":{"value":"VarObjet"},"parameters":["WalkerObject","__DungeonGenerator.Xpos",">=","MapWidth - MinBorder"]},{"type":{"value":"VarObjet"},"parameters":["WalkerObject","__DungeonGenerator.Ypos","<","MinBorder"]},{"type":{"value":"VarObjet"},"parameters":["WalkerObject","__DungeonGenerator.Ypos",">=","MapHeight - MinBorder"]}]}],"actions":[{"type":{"value":"SetSceneVariableAsBoolean"},"parameters":["__DungeonGenerator.InitiateRestart","True"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.WalkerRestarts","+","1"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Check all Walkers if they are on top of terrain"},{"type":"BuiltinCommonInstructions::ForEach","object":"WalkerObject","conditions":[],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"SceneVariableAsBoolean"},"parameters":["__DungeonGenerator.InitiateRestart","True"]}],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Move back to starting position"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarObjet"},"parameters":["WalkerObject","__DungeonGenerator.Xpos","=","WalkerObject.Variable(__DungeonGenerator.StartXpos)"]},{"type":{"value":"ModVarObjet"},"parameters":["WalkerObject","__DungeonGenerator.Ypos","=","WalkerObject.Variable(__DungeonGenerator.StartYpos)"]}]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"If Walker is on Terrain, delete it"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarScene"},"parameters":["__DungeonGenerator.WalkerMap[WalkerObject.Variable(__DungeonGenerator.Xpos)][WalkerObject.Variable(__DungeonGenerator.Ypos)]","=","0"]}],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.WalkerMap[WalkerObject.Variable(__DungeonGenerator.Xpos)][WalkerObject.Variable(__DungeonGenerator.Ypos)]","=","1"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.FloorCreated","+","1"]}]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Track how many steps were taken"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.StepsTaken","+","1"]}]}]}],"parameters":[]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Draw map based on 2D array","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.CounterX","=","0"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.CounterY","=","0"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Loop through every tile in the map"},{"type":"BuiltinCommonInstructions::Repeat","repeatExpression":"MapHeight","conditions":[],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Repeat","repeatExpression":"MapWidth","conditions":[],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Create terrain objects when array value is 0"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarScene"},"parameters":["__DungeonGenerator.WalkerMap[Variable(__DungeonGenerator.CounterX)][Variable(__DungeonGenerator.CounterY)]","=","0"]}],"actions":[{"type":{"value":"Create"},"parameters":["","TerrainObject","Variable(__DungeonGenerator.CounterX) * TileSize","Variable(__DungeonGenerator.CounterY) * TileSize","Layer"]},{"type":{"value":"ChangeWidth"},"parameters":["TerrainObject","=","TileSize"]},{"type":{"value":"ChangeHeight"},"parameters":["TerrainObject","=","TileSize"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Create floor objects when array value is 1"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarScene"},"parameters":["__DungeonGenerator.WalkerMap[Variable(__DungeonGenerator.CounterX)][Variable(__DungeonGenerator.CounterY)]","=","1"]}],"actions":[{"type":{"value":"Create"},"parameters":["","FloorObject","Variable(__DungeonGenerator.CounterX) * TileSize","Variable(__DungeonGenerator.CounterY) * TileSize","Layer"]},{"type":{"value":"ChangeWidth"},"parameters":["FloorObject","=","TileSize"]},{"type":{"value":"ChangeHeight"},"parameters":["FloorObject","=","TileSize"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.CounterX","+","1"]}]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.CounterX","=","0"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.CounterY","+","1"]}]}]}],"parameters":[]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Add walls","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Add walls"},{"type":"BuiltinCommonInstructions::ForEach","object":"TerrainObject","conditions":[],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Create walls where terrain touches floor"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"CollisionNP"},"parameters":["TerrainObject","FloorObject","","","no"]}],"actions":[{"type":{"value":"Create"},"parameters":["","WallObject","TerrainObject.X()","TerrainObject.Y()","Layer"]},{"type":{"value":"Delete"},"parameters":["TerrainObject",""]},{"type":{"value":"ChangeWidth"},"parameters":["WallObject","=","TileSize"]},{"type":{"value":"ChangeHeight"},"parameters":["WallObject","=","TileSize"]}]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Calculate neighbors","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BooleanVariable"},"parameters":["CalculateNeighbors","True",""]}],"actions":[{"type":{"value":"DungeonGenerator::CalculateGridNeighbors"},"parameters":["","FloorObject","WallObject",""]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Cleanup","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Delete walkers"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"Delete"},"parameters":["WalkerObject",""]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Delete unused terrain (if desired)"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BooleanVariable"},"parameters":["DeleteUnused","True",""]},{"type":{"inverted":true,"value":"CollisionNP"},"parameters":["TerrainObject","FloorObject","","","no"]}],"actions":[{"type":{"value":"Delete"},"parameters":["TerrainObject",""]}]}],"parameters":[]}],"parameters":[{"description":"Tile size (pixels)","longDescription":"All objects are based on this size","name":"TileSize","type":"expression"},{"description":"Map width (tiles)","name":"MapWidth","type":"expression"},{"description":"Map height (tiles)","name":"MapHeight","type":"expression"},{"description":"Terrain object","longDescription":"Terrain object is used to fill the map that is not covered by floors, hallways, or walls.","name":"TerrainObject","supplementaryInformation":"Sprite","type":"objectList"},{"description":"Floor object","longDescription":"Floor objects are created on every tile that a walker has travelled to.","name":"FloorObject","supplementaryInformation":"Sprite","type":"objectList"},{"description":"Layer","name":"Layer","type":"layer"},{"description":"Walker object","longDescription":"Use a random walk algorithm to turn terrain objects into floor objects","name":"WalkerObject","supplementaryInformation":"Sprite","type":"objectList"},{"description":"Floor percentage (Range: 0-1)","longDescription":"Percentage of map that will be convered by floor objects","name":"FloorPercentage","type":"expression"},{"description":"Size of walker sides (tiles)","longDescription":"The number of tiles for each side of the square walker object. For example, 2=2x2, 3=3x3, 4=4x4.","name":"WalkerSize","type":"expression"},{"description":"Minimum border","longDescription":"Can be used to provide a border of terrain around the map","name":"MinBorder","type":"expression"},{"description":"Delete unused terrain objects","name":"DeleteUnused","type":"trueorfalse"},{"description":"Wall object","longDescription":"Wall objects are placed between floor and terrain objects.","name":"WallObject","supplementaryInformation":"Sprite","type":"objectList"},{"description":"Calculate neighbors","longDescription":"May take a few seconds to calculate neighbors on a large map, so disable this if you are not using it.","name":"CalculateNeighbors","type":"yesorno"}],"objectGroups":[]},{"description":"Generate a dungeon by placing rooms in random locations and moving them if they collide with each other. Rooms are connected with hallways.","fullName":"Generate a dungeon with room and hallways","functionType":"Action","name":"GenerateDungeonRooms","sentence":"Generate a dungeon with rooms (Room Qty: _PARAM7_, Tile size: _PARAM1_ pixels, Map width: _PARAM2_ tiles, Map height: _PARAM3_ tiles, Terrain object: _PARAM4_, Room object: _PARAM5_, Wall object: _PARAM20_, Hallway object: _PARAM6_, Pathfinding object: _PARAM13_, Min room width: _PARAM9_ tiles, Max room width: _PARAM10_ tiles, Min room height: _PARAM11_ tiles, Max room height: _PARAM12_ tiles, Hallway width: _PARAM17_ tiles, Create objects on layer: _PARAM8_, Max separation attempts: _PARAM15_, Connect rooms in a loop: _PARAM16_, Additional paths: _PARAM18_, Delete unused terrain: _PARAM19_)","events":[{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Populate map with terrain objects everywhere","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"DungeonGenerator::FillWorld"},"parameters":["","TileSize","MapWidth","MapHeight","TerrainObject",""]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Create rooms at random locations","source":"","type":"BuiltinCommonInstructions::Group","events":[{"infiniteLoopWarning":true,"type":"BuiltinCommonInstructions::While","whileConditions":[{"type":{"value":"NbObjet"},"parameters":["RoomObject","<","RoomQty"]}],"conditions":[],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Create a new room in a random location on map"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"Create"},"parameters":["","RoomObject","RandomInRange(HallwayWidth, MapWidth - MaxRoomWidth - HallwayWidth) * TileSize","RandomInRange(HallwayWidth, MapHeight - MaxRoomHeight - HallwayWidth) * TileSize","Layer"]}],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Change the room to a random size"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarObjet"},"parameters":["RoomObject","__DungeonGenerator.RoomWidth","=","RandomInRange(MinRoomWidth, MaxRoomWidth) * TileSize"]},{"type":{"value":"ModVarObjet"},"parameters":["RoomObject","__DungeonGenerator.RoomHeight","=","RandomInRange(MinRoomHeight, MaxRoomHeight) * TileSize"]},{"type":{"value":"ChangeWidth"},"parameters":["RoomObject","=","RoomObject.Variable(__DungeonGenerator.RoomWidth)"]},{"type":{"value":"ChangeHeight"},"parameters":["RoomObject","=","RoomObject.Variable(__DungeonGenerator.RoomHeight)"]}]}]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Separate rooms","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Estimate starting distance between rooms"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.MinSeparationDistance","=","ceil((sqrt(pow(MaxRoomWidth,2) + pow(MaxRoomHeight,2)))) * TileSize"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.SeparationCounter","=","0"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Set a default value for separation attempts"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BuiltinCommonInstructions::CompareNumbers"},"parameters":["MaxSeparationAttempts","!=","0"]}],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.MaxSeparationAttempts","=","MaxSeparationAttempts"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BuiltinCommonInstructions::CompareNumbers"},"parameters":["MaxSeparationAttempts","=","0"]}],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.MaxSeparationAttempts","=","10000"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"If rooms are close to each other, move them to a new random location"},{"infiniteLoopWarning":true,"type":"BuiltinCommonInstructions::While","whileConditions":[{"type":{"value":"Distance"},"parameters":["RoomObject","RoomObject","Variable(__DungeonGenerator.MinSeparationDistance)",""]},{"type":{"value":"VarScene"},"parameters":["__DungeonGenerator.SeparationCounter","<","Variable(__DungeonGenerator.MaxSeparationAttempts)"]}],"conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.SeparationCounter","+","1"]}],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Move in a random direction the distance of a room"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetXY"},"parameters":["RoomObject","+","RandomWithStep(-MaxRoomWidth/2,MaxRoomWidth/2,MaxRoomWidth) * TileSize","+","RandomWithStep(-MaxRoomHeight/2,MaxRoomHeight/2,MaxRoomHeight) * TileSize"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Move object back into the usable part of map"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"PosY"},"parameters":["RoomObject",">","(MapHeight - MaxRoomWidth - HallwayWidth)*TileSize"]}],"actions":[{"type":{"value":"SetY"},"parameters":["RoomObject","=","(MapHeight - MaxRoomWidth - HallwayWidth)*TileSize"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"PosX"},"parameters":["RoomObject",">","(MapWidth - MaxRoomWidth - HallwayWidth)*TileSize"]}],"actions":[{"type":{"value":"SetX"},"parameters":["RoomObject","=","(MapWidth - MaxRoomWidth - HallwayWidth)*TileSize"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"PosX"},"parameters":["RoomObject","<","HallwayWidth*TileSize"]}],"actions":[{"type":{"value":"SetX"},"parameters":["RoomObject","=","HallwayWidth*TileSize"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"PosY"},"parameters":["RoomObject","<","HallwayWidth*TileSize"]}],"actions":[{"type":{"value":"SetY"},"parameters":["RoomObject","=","HallwayWidth*TileSize"]}]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Draw paths between rooms","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Create pathfinder object if one doesn't exist"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"NbObjet"},"parameters":["PathfinderObject","<","1"]}],"actions":[{"type":{"value":"Create"},"parameters":["","PathfinderObject","0","0","Layer"]},{"type":{"value":"PathfindingBehavior::AllowDiagonals"},"parameters":["PathfinderObject","PathfindingBehavior","no"]},{"type":{"value":"ChangeHeight"},"parameters":["PathfinderObject","=","TileSize"]},{"type":{"value":"ChangeWidth"},"parameters":["PathfinderObject","=","TileSize"]},{"type":{"value":"SetZOrder"},"parameters":["PathfinderObject","=","100"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Make sure pathfinding cell size matches tile size"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"PathfindingBehavior::CellWidth"},"parameters":["PathfinderObject","PathfindingBehavior","!=","TileSize "]}],"actions":[{"type":{"value":"PathfindingBehavior::CellWidth"},"parameters":["PathfinderObject","PathfindingBehavior","=","TileSize "]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"PathfindingBehavior::CellHeight"},"parameters":["PathfinderObject","PathfindingBehavior","!=","TileSize "]}],"actions":[{"type":{"value":"PathfindingBehavior::CellHeight"},"parameters":["PathfinderObject","PathfindingBehavior","=","TileSize "]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Move the pathfinder object to a random starting room"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"PickRandomInstance"},"parameters":["","RoomObject"]}],"actions":[{"type":{"value":"SetXY"},"parameters":["PathfinderObject","=","RoomObject.CenterX()","=","RoomObject.CenterY()"]},{"type":{"value":"SetObjectVariableAsBoolean"},"parameters":["RoomObject","__DungeonGenerator.Visited","True"]}],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Reset counter (used to assign RoomID to rooms)"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.CurrentRoomID","=","1"]},{"type":{"value":"ModVarObjet"},"parameters":["RoomObject","__DungeonGenerator.RoomID","=","Variable(__DungeonGenerator.CurrentRoomID)"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.CurrentRoomID","+","1"]}]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Cycle through all rooms, always going to the nearest unvisited room"},{"infiniteLoopWarning":true,"type":"BuiltinCommonInstructions::While","whileConditions":[{"type":{"value":"ObjectVariableAsBoolean"},"parameters":["RoomObject","__DungeonGenerator.Visited","False"]}],"conditions":[],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"PickNearest"},"parameters":["RoomObject","PathfinderObject.X()","PathfinderObject.Y()",""]}],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Assign path order if one does not exist"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarObjet"},"parameters":["RoomObject","__DungeonGenerator.RoomID","=","0"]}],"actions":[{"type":{"value":"ModVarObjet"},"parameters":["RoomObject","__DungeonGenerator.RoomID","=","Variable(__DungeonGenerator.CurrentRoomID)"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.CurrentRoomID","+","1"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Set the destination of the pathfinder to the next room"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"PathfindingBehavior::SetDestination"},"parameters":["PathfinderObject","PathfindingBehavior","","RoomObject.CenterX()","RoomObject.CenterY()"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.PathCounter","=","0"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Create a hallway object at every cell along the path to the destination"},{"type":"BuiltinCommonInstructions::Repeat","repeatExpression":"PathfinderObject.PathfindingBehavior::NodeCount()","conditions":[],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"Create"},"parameters":["","HallwayObject","PathfinderObject.PathfindingBehavior::GetNodeX(Variable(__DungeonGenerator.PathCounter))","PathfinderObject.PathfindingBehavior::GetNodeY(Variable(__DungeonGenerator.PathCounter))","Layer"]}],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Adjust size of hallway objects"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"DungeonGenerator::AdjustHallwaySizes"},"parameters":["","HallwayObject","PathfinderObject","PathfindingBehavior","TileSize","HallwayWidth",""]}]}]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Move the pathfinder object to the room that was just connected with a hallway"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetXY"},"parameters":["PathfinderObject","=","RoomObject.CenterX()","=","RoomObject.CenterY()"]},{"type":{"value":"SetObjectVariableAsBoolean"},"parameters":["RoomObject","__DungeonGenerator.Visited","True"]}]}]}]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Close loop","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"If desired, connect a hallway from the last room to the first room"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BooleanVariable"},"parameters":["CloseLoop","True",""]}],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Set the destination of the pathfinder to the starting room"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"VarObjet"},"parameters":["RoomObject","__DungeonGenerator.RoomID","=","1"]}],"actions":[{"type":{"value":"PathfindingBehavior::SetDestination"},"parameters":["PathfinderObject","PathfindingBehavior","","RoomObject.CenterX()","RoomObject.CenterY()"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.PathCounter","=","0"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Create a hallway object at every cell along the path to the destination"},{"type":"BuiltinCommonInstructions::Repeat","repeatExpression":"PathfinderObject.PathfindingBehavior::NodeCount()","conditions":[],"actions":[{"type":{"value":"Create"},"parameters":["","HallwayObject","PathfinderObject.PathfindingBehavior::GetNodeX(Variable(__DungeonGenerator.PathCounter))","PathfinderObject.PathfindingBehavior::GetNodeY(Variable(__DungeonGenerator.PathCounter))","Layer"]}],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Adjust size of hallway objects"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"DungeonGenerator::AdjustHallwaySizes"},"parameters":["","HallwayObject","PathfinderObject","PathfindingBehavior","TileSize","HallwayWidth",""]}]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Move the pathfinder object to the room that was just connected with a hallway"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetXY"},"parameters":["PathfinderObject","=","RoomObject.CenterX()","=","RoomObject.CenterY()"]}]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Add additional paths between rooms","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"If desired, make additional random connections between rooms"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.AdditionalPathCounter","=","0"]}]},{"infiniteLoopWarning":true,"type":"BuiltinCommonInstructions::While","whileConditions":[{"type":{"value":"VarScene"},"parameters":["__DungeonGenerator.AdditionalPathCounter","<","AdditionalPaths"]}],"conditions":[],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Set the destination of the pathfinder to the next room (don't select the room that already has the pathfinder)"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"PickRandomInstance"},"parameters":["RoomObject","RoomObject"]},{"type":{"inverted":true,"value":"CollisionNP"},"parameters":["PathfinderObject","RoomObject","","",""]}],"actions":[{"type":{"value":"PathfindingBehavior::SetDestination"},"parameters":["PathfinderObject","PathfindingBehavior","","RoomObject.CenterX()","RoomObject.CenterY()"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.PathCounter","=","0"]}],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Create a hallway object at every cell along the path to the destination"},{"type":"BuiltinCommonInstructions::Repeat","repeatExpression":"PathfinderObject.PathfindingBehavior::NodeCount()","conditions":[],"actions":[{"type":{"value":"Create"},"parameters":["","HallwayObject","PathfinderObject.PathfindingBehavior::GetNodeX(Variable(__DungeonGenerator.PathCounter))","PathfinderObject.PathfindingBehavior::GetNodeY(Variable(__DungeonGenerator.PathCounter))","Layer"]}],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Adjust size of hallway objects"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"DungeonGenerator::AdjustHallwaySizes"},"parameters":["","HallwayObject","PathfinderObject","PathfindingBehavior","TileSize","HallwayWidth",""]}]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Move the pathfinder object to the room that was just connected with a hallway"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetXY"},"parameters":["PathfinderObject","=","RoomObject.CenterX()","=","RoomObject.CenterY()"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.AdditionalPathCounter","+","1"]}]}]}]}],"parameters":[]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Cleanup","source":"","type":"BuiltinCommonInstructions::Group","events":[{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Remove terrain from rooms and hallways.","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Remove terrain from inside rooms and hallways."},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BuiltinCommonInstructions::Or"},"parameters":[],"subInstructions":[{"type":{"value":"CollisionNP"},"parameters":["TerrainObject","RoomObject","","","yes"]},{"type":{"value":"CollisionNP"},"parameters":["TerrainObject","HallwayObject","","","yes"]}]}],"actions":[{"type":{"value":"Delete"},"parameters":["TerrainObject",""]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Place walls","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::ForEach","object":"TerrainObject","conditions":[],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Create walls where terrain touches hallways but not rooms"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"ObjectVariableAsBoolean"},"parameters":["HallwayObject","Deleted","False"]},{"type":{"inverted":true,"value":"CollisionNP"},"parameters":["TerrainObject","HallwayObject","","","yes"]},{"type":{"value":"CollisionNP"},"parameters":["TerrainObject","HallwayObject","","","no"]},{"type":{"inverted":true,"value":"CollisionNP"},"parameters":["TerrainObject","RoomObject","","","yes"]}],"actions":[{"type":{"value":"Create"},"parameters":["","WallObject","TerrainObject.X()","TerrainObject.Y()","Layer"]},{"type":{"value":"Delete"},"parameters":["TerrainObject",""]},{"type":{"value":"ChangeHeight"},"parameters":["WallObject","=","TileSize"]},{"type":{"value":"ChangeWidth"},"parameters":["WallObject","=","TileSize"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Create walls where terrain touches rooms but not hallways"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"inverted":true,"value":"CollisionNP"},"parameters":["TerrainObject","RoomObject","","","yes"]},{"type":{"value":"CollisionNP"},"parameters":["TerrainObject","RoomObject","","","no"]},{"type":{"inverted":true,"value":"CollisionNP"},"parameters":["TerrainObject","HallwayObject","","","yes"]}],"actions":[{"type":{"value":"Create"},"parameters":["","WallObject","TerrainObject.X()","TerrainObject.Y()","Layer"]},{"type":{"value":"Delete"},"parameters":["TerrainObject",""]},{"type":{"value":"ChangeWidth"},"parameters":["WallObject","=","TileSize"]},{"type":{"value":"ChangeHeight"},"parameters":["WallObject","=","TileSize"]}]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Delete hallways that are at least partially inside of rooms "},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"CollisionNP"},"parameters":["HallwayObject","RoomObject","","","yes"]}],"actions":[{"type":{"value":"Delete"},"parameters":["HallwayObject",""]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Set boolean flag for hallways that are doorways (adjacent to room but not touching)"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"CollisionNP"},"parameters":["HallwayObject","RoomObject","","","no"]}],"actions":[{"type":{"value":"SetObjectVariableAsBoolean"},"parameters":["HallwayObject","__DungeonGenerator.IsRoomEntrance","True"]}]}],"parameters":[]},{"colorB":228,"colorG":176,"colorR":74,"creationTime":0,"name":"Cleanup","source":"","type":"BuiltinCommonInstructions::Group","events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Remove extra terrain, if needed"},{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"BooleanVariable"},"parameters":["DeleteUnused","True",""]},{"type":{"inverted":true,"value":"CollisionNP"},"parameters":["TerrainObject","RoomObject","","","no"]},{"type":{"inverted":true,"value":"CollisionNP"},"parameters":["TerrainObject","HallwayObject","","","no"]}],"actions":[{"type":{"value":"Delete"},"parameters":["TerrainObject",""]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Cleanup pathfinder object"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"Delete"},"parameters":["PathfinderObject",""]}]}],"parameters":[]}],"parameters":[]}],"parameters":[{"description":"Tile size (pixels)","longDescription":"All objects are based on this size","name":"TileSize","type":"expression"},{"description":"Map width (number of colums)","name":"MapWidth","type":"expression"},{"description":"Map height (number of rows)","name":"MapHeight","type":"expression"},{"description":"Terrain object","longDescription":"Used to fill the map that is not covered by floors, hallways, or walls.","name":"TerrainObject","supplementaryInformation":"Sprite","type":"objectList"},{"description":"Room object","longDescription":"Rooms are placed in random locations and will try to not overlap with other rooms. ","name":"RoomObject","supplementaryInformation":"Sprite","type":"objectList"},{"description":"Hallway object","longDescription":"Used to connect room objects. They follow the path made by the pathfinder object.","name":"HallwayObject","supplementaryInformation":"Sprite","type":"objectList"},{"description":"Number of rooms","longDescription":"Rooms should take less than ~25% of map to ensure non-overlapping rooms. If there are too many rooms, they may end up overlapping each other.","name":"RoomQty","type":"expression"},{"description":"Layer","name":"Layer","type":"layer"},{"description":"Min room width (tiles)","name":"MinRoomWidth","type":"expression"},{"description":"Max room width (tiles)","name":"MaxRoomWidth","type":"expression"},{"description":"Min room height (tiles)","name":"MinRoomHeight","type":"expression"},{"description":"Max room height (tiles)","name":"MaxRoomHeight","type":"expression"},{"description":"Pathfinder object","longDescription":"Used to identify where hallways are placed between rooms","name":"PathfinderObject","supplementaryInformation":"Sprite","type":"objectList"},{"description":"Pathfinding behavior (required)","name":"PathfindingBehavior","supplementaryInformation":"PathfindingBehavior::PathfindingBehavior","type":"behavior"},{"description":"Max separation attempts","longDescription":"Number of attempts to separate overalapping rooms. When this number is reached, rooms are left in current position. (Default: 10,000)","name":"MaxSeparationAttempts","type":"expression"},{"description":"Connect rooms in a loop","name":"CloseLoop","type":"yesorno"},{"description":"Hallway width (tiles)","name":"HallwayWidth","type":"expression"},{"description":"Additional paths between connect rooms","name":"AdditionalPaths","type":"expression"},{"description":"Delete unused terrain","name":"DeleteUnused","type":"trueorfalse"},{"description":"Wall object","name":"WallObject","supplementaryInformation":"Sprite","type":"objectList"}],"objectGroups":[]},{"description":"Calculate the number of grid neighbors around an object. Use \"NeighborCount(Object)\" expression to retrieve this value.","fullName":"Calculate the number of grid neighbors around an object","functionType":"Action","name":"CalculateGridNeighbors","sentence":"Calculate the number of grid neighbors (_PARAM2_) around _PARAM1_","events":[{"type":"BuiltinCommonInstructions::ForEach","object":"Object","conditions":[],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Save center point and size as scene variables (since we can't compare instances of the same object)"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.ThisCenterX","=","Object.CenterX()"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.ThisCenterY","=","Object.CenterY()"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.ThisObjectWidth","=","Object.Width()"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.ThisNeighborCount","=","0"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Initiate offset to start looking for the top-left neighbor"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.NeighborOffsetX","=","-1"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.NeighborOffsetY","=","-1"]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Search for neighbors (but don't consider the center object)"},{"type":"BuiltinCommonInstructions::Repeat","repeatExpression":"3","conditions":[],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Repeat","repeatExpression":"3","conditions":[],"actions":[],"events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"CollisionPoint"},"parameters":["Neighbor","Variable(__DungeonGenerator.ThisCenterX) + (Variable(__DungeonGenerator.NeighborOffsetX) * Variable(__DungeonGenerator.ThisObjectWidth))","Variable(__DungeonGenerator.ThisCenterY) + (Variable(__DungeonGenerator.NeighborOffsetY) * Variable(__DungeonGenerator.ThisObjectWidth))"]}],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.ThisNeighborCount","+","1"]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.NeighborOffsetX","+","1"]}]}]},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.NeighborOffsetX","=","-1"]},{"type":{"value":"ModVarScene"},"parameters":["__DungeonGenerator.NeighborOffsetY","+","1"]}]}]},{"type":"BuiltinCommonInstructions::Comment","color":{"b":109,"g":230,"r":255,"textB":0,"textG":0,"textR":0},"comment":"Save neighbor count in real object"},{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"ModVarObjet"},"parameters":["Object","__DungeonGenerator.Neighbors","=","Variable(__DungeonGenerator.ThisNeighborCount)"]}]}]}],"parameters":[{"description":"Primary object (or object group)","name":"Object","type":"objectList"},{"description":"Neighbor object (or object group)","name":"Neighbor","type":"objectList"}],"objectGroups":[]},{"description":"The numerical order this room was created. (Range: 1 to total number of rooms).","fullName":"Creation order of room","functionType":"Expression","name":"RoomID","sentence":"","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetReturnNumber"},"parameters":["RoomObject.Variable(__DungeonGenerator.RoomID)"]}]}],"expressionType":{"type":"expression"},"parameters":[{"description":"Room object","name":"RoomObject","type":"objectList"}],"objectGroups":[]},{"description":"Number of grid neighbors of an object. Requires running the \"CalculateGridNeighbors\" action before using this expression.","fullName":"Number of grid neighbors of an object","functionType":"Expression","name":"NeighborCount","sentence":"","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[],"actions":[{"type":{"value":"SetReturnNumber"},"parameters":["Object.Variable(__DungeonGenerator.Neighbors)"]}]}],"expressionType":{"type":"expression"},"parameters":[{"description":"Object","name":"Object","type":"objectList"}],"objectGroups":[]},{"description":"Check if hallway is a room entrance.","fullName":"Hallway is a room entrance","functionType":"Condition","name":"IsRoomEntrance","sentence":"_PARAM1_ is a room entrance","events":[{"type":"BuiltinCommonInstructions::Standard","conditions":[{"type":{"value":"ObjectVariableAsBoolean"},"parameters":["Object","__DungeonGenerator.IsRoomEntrance","True"]}],"actions":[{"type":{"value":"SetReturnBoolean"},"parameters":["True"]}]}],"parameters":[{"description":"Hallway object","name":"Object","type":"objectList"}],"objectGroups":[]}],"eventsFunctionsFolderStructure":{"folderName":"__ROOT","children":[{"functionName":"AdjustHallwaySizes"},{"functionName":"FillWorld"},{"functionName":"GenerateDungeonCave"},{"functionName":"GenerateDungeonRooms"},{"functionName":"CalculateGridNeighbors"},{"functionName":"RoomID"},{"functionName":"NeighborCount"},{"functionName":"IsRoomEntrance"}]},"eventsBasedBehaviors":[],"eventsBasedObjects":[]}],"externalLayouts":[{"associatedLayout":"Game","name":"4Way","instances":[{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_4Way","persistentUuid":"f7878de8-d621-4629-afc8-5fcbb25d688d","width":0.0,"x":0.0,"y":0.0,"zOrder":1,"numberProperties":[],"stringProperties":[],"initialVariables":[]},{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_right","persistentUuid":"c6ec3658-b64e-4cab-8a8b-98903a65fd27","width":0.0,"x":640.0,"y":0.0,"zOrder":2,"numberProperties":[],"stringProperties":[],"initialVariables":[]},{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_left","persistentUuid":"5a72b7c8-fd61-40c0-884e-b69731807160","width":0.0,"x":-640.0,"y":0.0,"zOrder":3,"numberProperties":[],"stringProperties":[],"initialVariables":[]},{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_up","persistentUuid":"60748f83-5456-40c3-b8d2-4c527981e015","width":0.0,"x":0.0,"y":-480.0,"zOrder":4,"numberProperties":[],"stringProperties":[],"initialVariables":[]},{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_down","persistentUuid":"e779ea46-1b9a-4892-8196-1c9d194e2c41","width":0.0,"x":0.0,"y":480.0,"zOrder":5,"numberProperties":[],"stringProperties":[],"initialVariables":[]}],"editionSettings":{"grid":true,"gridType":"rectangular","gridWidth":640.0,"gridHeight":480.0,"gridDepth":32.0,"gridOffsetX":0.0,"gridOffsetY":0.0,"gridOffsetZ":0.0,"gridColor":10401023.0,"gridAlpha":0.8,"snap":true,"zoomFactor":0.39122201073538556,"windowMask":false,"selectedLayer":"","gameEditorMode":"instances-editor"}},{"associatedLayout":"Game","name":"LR","instances":[{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_LR","persistentUuid":"f69d2e29-2b65-4e41-93b2-56269c88fba4","width":0.0,"x":0.0,"y":0.0,"zOrder":1,"numberProperties":[],"stringProperties":[],"initialVariables":[]},{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_right","persistentUuid":"e1e1e2da-9a5f-4db8-a33a-e6478e381d46","width":0.0,"x":640.0,"y":0.0,"zOrder":3,"numberProperties":[],"stringProperties":[],"initialVariables":[]},{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_left","persistentUuid":"114e4509-29d9-4811-b71f-45fa7072dbef","width":0.0,"x":-640.0,"y":0.0,"zOrder":4,"numberProperties":[],"stringProperties":[],"initialVariables":[]}],"editionSettings":{"grid":true,"gridType":"rectangular","gridWidth":640.0,"gridHeight":480.0,"gridDepth":32.0,"gridOffsetX":0.0,"gridOffsetY":0.0,"gridOffsetZ":0.0,"gridColor":10401023.0,"gridAlpha":0.8,"snap":true,"zoomFactor":0.3426186902248371,"windowMask":false,"selectedLayer":"","gameEditorMode":"instances-editor"}},{"associatedLayout":"Game","name":"UD","instances":[{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_UD","persistentUuid":"5e458a16-7f67-4530-87d5-c46cf1c70a3a","width":0.0,"x":0.0,"y":0.0,"zOrder":1,"numberProperties":[],"stringProperties":[],"initialVariables":[]},{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_up","persistentUuid":"3b375ba4-cfd5-4918-9c40-366331322c8f","width":0.0,"x":0.0,"y":-480.0,"zOrder":2,"numberProperties":[],"stringProperties":[],"initialVariables":[]},{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_down","persistentUuid":"a2d2d1ca-ef1a-402a-92ab-4658aaf19d79","width":0.0,"x":0.0,"y":480.0,"zOrder":3,"numberProperties":[],"stringProperties":[],"initialVariables":[]}],"editionSettings":{"grid":true,"gridType":"rectangular","gridWidth":640.0,"gridHeight":480.0,"gridDepth":32.0,"gridOffsetX":0.0,"gridOffsetY":0.0,"gridOffsetZ":0.0,"gridColor":10401023.0,"gridAlpha":0.8,"snap":true,"zoomFactor":0.3784602076124576,"windowMask":false,"selectedLayer":"","gameEditorMode":"instances-editor"}},{"associatedLayout":"Game","name":"DeadL","instances":[{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_DeadL","persistentUuid":"37237183-4a66-4f3a-a60d-0c54a8ca4d90","width":0.0,"x":0.0,"y":0.0,"zOrder":1,"numberProperties":[],"stringProperties":[],"initialVariables":[]},{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_right","persistentUuid":"7030b988-29fe-410d-989a-7d0c936f4c11","width":0.0,"x":640.0,"y":0.0,"zOrder":2,"numberProperties":[],"stringProperties":[],"initialVariables":[]}],"editionSettings":{"grid":true,"gridType":"rectangular","gridWidth":640.0,"gridHeight":480.0,"gridDepth":32.0,"gridOffsetX":0.0,"gridOffsetY":0.0,"gridOffsetZ":0.0,"gridColor":10401023.0,"gridAlpha":0.8,"snap":true,"zoomFactor":0.43214794647750878,"windowMask":false,"selectedLayer":"","gameEditorMode":"instances-editor"}},{"associatedLayout":"Game","name":"DeadR","instances":[{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_DeadR","persistentUuid":"d251265b-16fb-4e8b-8721-1a08ff078396","width":0.0,"x":0.0,"y":0.0,"zOrder":1,"numberProperties":[],"stringProperties":[],"initialVariables":[]},{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_left","persistentUuid":"bd898bf7-4f86-492c-ba74-098d55f1d43e","width":0.0,"x":-640.0,"y":0.0,"zOrder":2,"numberProperties":[],"stringProperties":[],"initialVariables":[]}],"editionSettings":{"grid":true,"gridType":"rectangular","gridWidth":640.0,"gridHeight":480.0,"gridDepth":32.0,"gridOffsetX":0.0,"gridOffsetY":0.0,"gridOffsetZ":0.0,"gridColor":10401023.0,"gridAlpha":0.8,"snap":true,"zoomFactor":0.4934517391481253,"windowMask":false,"selectedLayer":"","gameEditorMode":"instances-editor"}},{"associatedLayout":"Game","name":"DeadUp","instances":[{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_DeadUp","persistentUuid":"d1a66cb2-ae2e-4f1d-8766-d9992d6d18ad","width":0.0,"x":0.0,"y":0.0,"zOrder":1,"numberProperties":[],"stringProperties":[],"initialVariables":[]},{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_down","persistentUuid":"eddf7615-92c4-4b04-940b-6515e299e940","width":0.0,"x":0.0,"y":480.0,"zOrder":2,"numberProperties":[],"stringProperties":[],"initialVariables":[]}],"editionSettings":{"grid":true,"gridType":"rectangular","gridWidth":640.0,"gridHeight":480.0,"gridDepth":32.0,"gridOffsetX":0.0,"gridOffsetY":0.0,"gridOffsetZ":0.0,"gridColor":10401023.0,"gridAlpha":0.8,"snap":true,"zoomFactor":0.43214794647750878,"windowMask":false,"selectedLayer":"","gameEditorMode":"instances-editor"}},{"associatedLayout":"Game","name":"DeadDown","instances":[{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_DeadDown","persistentUuid":"552c6a78-2267-41c0-9d12-e4d0e1da2ef8","width":0.0,"x":0.0,"y":0.0,"zOrder":1,"numberProperties":[],"stringProperties":[],"initialVariables":[]},{"angle":0.0,"customSize":false,"height":0.0,"keepRatio":true,"layer":"","name":"spr_up","persistentUuid":"1635740f-8b55-4918-afdf-bfd9de2db35d","width":0.0,"x":0.0,"y":-480.0,"zOrder":2,"numberProperties":[],"stringProperties":[],"initialVariables":[]}],"editionSettings":{"grid":true,"gridType":"rectangular","gridWidth":640.0,"gridHeight":480.0,"gridDepth":32.0,"gridOffsetX":0.0,"gridOffsetY":0.0,"gridOffsetZ":0.0,"gridColor":10401023.0,"gridAlpha":0.8,"snap":true,"zoomFactor":0.5634519864159119,"windowMask":false,"selectedLayer":"","gameEditorMode":"instances-editor"}}]} \ No newline at end of file diff --git a/TestRoom01.png b/TestRoom01.png new file mode 100644 index 0000000000000000000000000000000000000000..27d6358d700b3affe11b5a4478a413498dfe05c5 GIT binary patch literal 13612 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 literal 0 HcmV?d00001 diff --git a/TestRoom010.png b/TestRoom010.png new file mode 100644 index 0000000000000000000000000000000000000000..0c915d45a1b3f5ef8d051974b240c95144ff1420 GIT binary patch literal 15570 zcmb_@dtB1z|29^uRqorWWwVp5t)nBGhg@3Hmg!PA(@GN*+Dc8CQfeMRz}B`7rmj4Y zl~NLEDbhhC4@j-dJckF^P@zd4i3kBf4xi6+o7lGR>-T#-&mYeprg6AG_u+kC_w~Ns z*L`;Hcitb&TQ(1YKzy+08_z%lVn!MQVfEtu+29oyLGMfOYwodcLgEpK|2&!evC6go z&vFD}HDZtFSNoH%D*D>fS9({zQ0?1ASXC(~iBVN+AFlOu{V7neb@pLGZQgKwPaE|G z>IW!$1jSf-iZgyQea-@7z@js;KR0dZraYru{%Y&Y$7vCtc&EI+khNxw)0(!%^UBD> zQcQ}v_x$;mE5|=VWqNLNs~!*J&p{y46vT-!>Pj=rhOG9hEZ8hEdO-o`v}CA{8H;{l&?*vaWLiC(gze- z<(V_vspCh!+1|gHu79%LLv_~Q6w(hXVSVYDTIj0x><X!DwbyeiXr zH3ISQNHSs;0&&TDK^ka3`!B1vpWBX@fk62EI%g;7Oye8GW5JbT-Z!Qc_9m(I!$o=rCQq0XFnMxe&; z^Ynxu#aebsD;}%9EUF#Umg7)F{V!+qJE#{XzkI2Mty$hq-!Zc6jUl5aOt%1mxZ}d0 z^QW5p*U<7sK{IT%gy+PMwt$CzUPy%rYx;Gj-BWYM&X}38_qm*KsqIh4L|dVN#-7o78->TD6`e&?kwjUPZzb1tUoH>QAi7Mh6hFNmPs*(6y;K@+ddDa{-Qe7jZ%(r&)?IMTN)R2!o)=W6*?OyTB?+{ zFJhUrLW_~yT=|^YF;ny z@{JmF2-De_HEv=pmop}^J=1&CYsI-BxHd&ZRqF4rehWypI_qnB@?ALx$yT&`gC~48 z^NmV`7;7SZY8^f+@2%ft!A-4J`6!WYk(E~eA

ck$O~;1n)LKkG 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 Wl%4d)5%4~0(}o|{mwvnR$o~Ovo@)94 literal 0 HcmV?d00001 diff --git a/TestRoom013.png b/TestRoom013.png new file mode 100644 index 0000000000000000000000000000000000000000..8d48d6d8e2b177024864ff784223d96146ff6aca GIT binary patch literal 16379 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 literal 0 HcmV?d00001 diff --git a/TestRoom02.png b/TestRoom02.png new file mode 100644 index 0000000000000000000000000000000000000000..1ecac04cde45bc3944502973758efefc15289d62 GIT binary patch literal 15584 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 literal 0 HcmV?d00001 diff --git a/TestRoom03.png b/TestRoom03.png new file mode 100644 index 0000000000000000000000000000000000000000..7ccde4430519964e0e653b136f66d6c75ea5d7bc GIT binary patch literal 16153 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 J|6%_x{|7CPEm{Bo literal 0 HcmV?d00001 diff --git a/TestRoom04.png b/TestRoom04.png new file mode 100644 index 0000000000000000000000000000000000000000..0d5a38010ae2a0156c58de99c7828971ea0542b9 GIT binary patch literal 15318 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 X+rD{PHrNdP9Ja$_mwVZ-2hRL2Ej6R4 literal 0 HcmV?d00001 diff --git a/TestRoom05.png b/TestRoom05.png new file mode 100644 index 0000000000000000000000000000000000000000..95f56f631cab9daeea04524bc41cb2e048e0dd9c GIT binary patch literal 16405 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 literal 0 HcmV?d00001 diff --git a/TestRoom06.png b/TestRoom06.png new file mode 100644 index 0000000000000000000000000000000000000000..9006d16bdeccb183aaf7a9126dbc49d3aaeed0e7 GIT binary patch literal 16044 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 literal 0 HcmV?d00001 diff --git a/TestRoom07.png b/TestRoom07.png new file mode 100644 index 0000000000000000000000000000000000000000..dbb979cb6acf4a3435f17d0afd603ae987a77a92 GIT binary patch literal 14964 zcmch;X;@QN+cu0twGOQVRs{vDRZ%I@f{20;+agp@DJWASi7hfljG{~lVLP-{RNz(_ zM1-_P$`C?S2vJDb*eWPf1R>EN2@)Yf3?YP&dGB{a(Dr`r`#HYj`|-X%I5y2 z=Q^+RyjJ=T`@KJzZ#m!0%1^vyGP8e}f8ra9q$h5_NuQKFd0akR zSX3YwZNxHPozXeKU`#xiQx#|=B`OQW8QmT+^QqZPGqc$zZ$&_3ZeGZLR_v~0d@<`|Gqc65DRaI8zcbWP zU~#s?ac%S5wQI-T4e<~3FQI52*?K6_{ZjkA(_t8raMz9vldUawnVFqFyk)?zwb_8Y z;_#QU`pkuEkavCcYU&+-ee(bGgRQNtoV|F-1ERQ6m4x)CVHYyw&z3lzHZwDOeKX1o z`P1TA(|s<6TSsPHhvtyAy|{}Po}k!3pr>cOapZE-&cUykt7Pfxu;WODRWa=U(j4Mnn-k&ks%O8*Ar z)&4v6uTh?lMxaZkxnW$MS!CaK9(jE6?q)Oe=TlR^(B(ApuMdy^=ZDMsRSg8t?Hcm) zg=q=Qk=0ma4s2CVJ@d9Db^X5zSRQF&Juorh;OY4W1sfh*Xr;LP>%*d%gGmPOMe_8I z?am-?IlNSD(Xg&J9UjoSgx9Z}TGq)nZK2zmsgZt_qeV9`D@F{H3qJLYha&6O|F4xD z@tPr#jxgKVbb3#4oz?pX)BOxD6;Y-DyR7wDlP5ApbW6tEqGkK*65Z&O>A0GFjr=qC z0-RX2ttkdMYcwccm9rVN$w;uDi8$TiDj=Q`acTrF{#!F=iCDVAp z&+x?~kgTk^aA9ZicwYuX1j6#~`uVQ0T81U;0%}(**~DKZQ*jh@HAQm>__AL@HjDaw z(HbOLe;A~m28=zZL&-)uh2y?%M1|*j-hOqKo&k$-MJ^oRpg|xT&lJTH41zJ9FsWLM zyLfHq4tJ}iKo^9;6hqAN42t8{6waPbCAA+T2UQAIO|vRWsvcVoU*e*cEb*FwtoGrh zE_P?$ag5z>LejePE3ElE^&?^zu3u*GwMaLp4*FFSa|lg3 z1A~c9C8&TdRn&5VgyKB4e;%&hFzbGB+?<$GxL@dFa-3z`ua|;Q&{JM6i*NK3*>Zo* zc3hd#_yyTRbnH}__3gdCyG5;j>oV^fTDSutVF!a=ks(?^h5|n7t)*c3Y##PHB2@>JY?F7JC4rz z>gA1jhk9f6n4YM+iP^C+dRk<3d~xe#-uafE)Pqc~h{H9RX+pgRUc0d`z@~CsvoRk$ zk|UPe&$5!~PHz3X9l3O{_%V4ao$AGkjGRbo*DK^XW$lFYSyHbC1I1xV1EXRlmQu6WtjHG`8Kl+SZ|KkkG*qGGR3HJHhbb_v&7{)99g(P|$`kW+fUe+H`8h&!%UNIi9A=0 zMHklxVf8C3f1SskyB=+i$%jD(uO-KeMTBUKpU{i@|T! z|Mf#lkCv6gBG$RmbT+c>)&mCGZc|^9EE)o%$(EUdfYCpFcW_-Hp1v$U3}$|2ULkS* zOPWGw(e9PQtDC~7v87;PUq$PFxt3AWeu-z7M(Y;KjcKa^iXNwbK&P(4vp}@g9A2rw zqr8o%$W*)O0NAl3Me@tQiu)ou3`k7#x3F8uX@jTkaVhN zr}G%8Yu2KA&p60Avg%~$F zdES`wN(}!;UC_cg^3!kDN5S-R4pQD^P=sW{S{2( zm&_16<{m8vp!qBC(ue+Pkt^gcrKl%cbpagW^qkNp(M8i17_?{@XN_j3caCU$?a%uo zT|MA?r|WDBCY8!N{;GwfyLETo3={z#BIxaysP@l4h3cGse!U+F zoOlq}&fQoc#nA&R;Y08b=ROQ(tK~*!NHr+S8kW9^Nb|7c4aj%L4gTh7$6_C1wgz>L z@sG-?vVmhvBX+m+Mzt{WyKyP-r;5-z!R7;hkBAD@FnUuYO1IrEbq3B*_tN(6T>SW$ zoUShQuC_?nW65V}4m(YpAL@HXbs+=~f@(CXaiY$Jc% zdLaJ`b4?`Gn@b!R(Af+a)I{SYG;E@R;tjK|j~|;CP0bjSV4{c)9lW#S!n1ca!^rZ* zP`$i!z8fM3slWshN#qi%7jm5#)jC$fvYH7tOD7r7aaCN2ocmTs_~ma@L+_;b$P%LJ z1?UE328tuL(pIB`@4x*lNvaQ-_vQt$5Wq<9CK&D9Mdhl=2AWjd@(;mQu<$T}qhDH` z+0Q)oG_=PJ{d|G6BL+j)aZVO{gcsLui~cU9URWUoS@BqvYo}fv#WXTZpmF`LNHdb? zF5an;RLJKF{Ly=9BTeO^x+C3}XY-b;bl`AG&9J&?8nY4ntwK+bB(|%ZYxzVNVJe^X zBbY&xqZCb#7{=9npg-%v`(aJ7%R7ddE(G$IYnA$dH%`oHYBb4`xEJBKuQ_EWPEMnW zd{(lmvA66D*BWqjwmz*m_5muyQnegV3iwM}th8eTKoJnL6n4@+S+`}B^#LrD%^Ulo z{6K5V(XpIGTXwd?6IitQDJlA22t=4)p*WfgL1BEAyf$wkp0BJ}3^-gL>t#NE=kZ=w}ZLspkbBbFh?85y-22j5KDmdi^wRFI+R~N_VQvTfJV%!!U9aiTQy9IqAO6<8{E2i&yAlwepiWMtOddK^ooPfWy}&A>JdMK_6h-nLy84v1=R zd8gOZ9B1rZ!-uzVB%m}54$>Q?fA4Nu>(4?#KnOkJu0XwSVq!*UF_dvDLm&-YkKhk&4#*@Hc8%*Ifanqc>V zH&`cZI7LgQv+4dXeB(9@yj3xHZ*u`hJRCe^w>`G{Hj_8TcRaP}uRPuSTp=T38GR7O z7c%_yhEnMwJ{&#*%=NVv*c_$|R7L&R9o{VuD;xZyfhEoVR^IPUb0PcI{dcHYDu~lA|qOa%C!GIRTFu z3KnEdr&lM%qALz1jcw!&HtFBL8ndmB`*+e&+#-hp5YqnINJA2GSyI#i8w$&e(o;SA zz=Fl63wvA$mo7Xx=e=kf=hKSII-8#ERY@g{ZX`q5g?~+Ln5MRkeM{p`1JTD z7VJ+wU5O(-*bou>FoyhTg_wIU3C8ewhl&lF=#3L2u#g!-%7cF# z1_p3x6%3e~1?K4(FEI|Ucwn=psvSmPDos40u1y^{w;=1odGf+_7JCAsJ3W=hrDUT& zF56wA8n~0m*h9?;xU?R4_ucgAZH^ZTb04g&NGhBDE4>j3Nv~!@<7D ziMWpuufW0;T;M%h(`rdcdnGdrd^N29Q_Ra3vV3~r=RKhL6)k={ujW{%hTrYmT$eWz~c?ohFR}d?D0bf9Sc*jFoy@fwAk^& zv@b6g_%{gH`~MwqWZf>e^LQRRgai2v0ULfi)#yjf$gCh+)%cKqyNV_MepR4*rYCdg zXqe7`v6*0?(J$8NsZb^}caxHNCiaOO@ga6hP0(GU?`D?Ig0~w7$fvX$p9ng#sE#%W zJO0SG$A+A?nh9mqLL`fi-W5aMEwimSgW_uXE#*ad&3@zAC+LJx1T!<_gp4L2zUkj7R#$ikwZ?oh4+D#+4Kk zPk6kr4~7sTc;N{EX-_V($eXv?`66p;?a{4L|D&K(bk|WZo zj#LKk2%0&mdi{RC#VohF@}qnZ+-lBdEk7`%4fUZWpCml(9#EEV1v_iz!g_hY~Nkh$n&szcS$@%PwC0h1=PGYzue zdmP!R2tqzF)F0LQSWMxrjXh+gjgNgb$<#27!1$=J>;5#7AMzoO5qoEd>QgYDp4K~w zqm6vI2u@nEM7vkl$WZw#7=IAw+qF3@b_U`XKhMnizMqDnsS%k!{3h%%_ve#mrR4Z;52Me`$YD=tlp{(#s+Cjs? zPlxVDH`%{Lqhhmwn0<|O{D~1dK;mBF=qa=?Ov*t+&`p@&0bk{bar!jY0Of8a@LcRh z18)4t2m3(q0RpbVabs*4qBs81G|en=^KK`#RAqltUbx5>cdjO3p8!pFdWM&aT(5Bw zQtiWUTQwaj!`_xfljnJJ83!*ihH{p?<-mfJBViCmjK6gg?r0GaVY(Q@N3~T*DJlrl z^!}&{=FQyFfu3D_`N~9U+4>udZwjng?WJKi)FoSIk?*NL#r4z&8oJi{j)`wu@yEB9 z#cdj-NQ<{s?cAJ37b-AL!_*c;Y1}A*g&vi(JQ$0uL}8HkfT8RWFyVd19n)@>JKk(q zueGc$TaS+YX3)O9)3QceNd6BbjSFqPNXde_9n*?EPJ25M_caU0_8yMes@jZv7 zr7Av1>m3ya$5%=7|2d9ci(PcTkg`RgH1^~hYHGGKQ^;4VEbolSw(jt91s5gNa7>JLaObQS()}pz!WfI&%LwC!AA}*?S=mi~7B5b{V%C#Q zcv>+)k#^gD1=Q!{wSMnFrv@q2C!roh-&DK8z7xnPf|iOpDgi`?NieK7(ID*5tnI@D z2t8*L1=rkM>c6wNV>hP|7C|DC^>69mE$^zqTZxF(d?E7(Ut-iuqFNS8H;|e# z(jZp3`=`vN=d}iJKHRA#1j3Udru^T7O}X&5ZL#ISmnyoxjV_F-_rzQZ=&9WHJSo7E zc}?`PM0R`mFEwEfifbKBoSOB*+Fp9kP%(m@jQj>V^$t_w3(UKa2=Qa-HuQXZ+87r+ zKLxd*kMa4t$qoE>z@-!~>U*0Te9vXp!FvhzKC(~UdtaB-&n#Bs?JoxS{<#^d5DRtn zp>}632dv@~tNTkkI_bA4Ftru?kjgZa!46h*h>1<2PwE&)O}lVY=FFOrYuVXeR|eP> zAKd@}`QARB0!o}NeI$n_)ZKJ3fbc%Sz9$4>7YSq zIsy)~nh|5P(M~+|4Mr?)r@NqV@;k5YRSp(0tqJ2wFo(yA?MnH&)fYd&Ftw3keC5xD=>uQ_ zwjqexBC3T#oBV=k03F$#d77%}SbW2iiNM8(67~gUlW_ACz8)fYT+8xYH=?jjd#B+^ zP!ilbO~=$?>QRe8rwqR-a(umiV;|Mm{x^|f5Qn%B529PFP_H(8a8 z>x}xQS3vdM_S0)>genH4Q_I8pWdj3-s!M>Mr)Q<`zMC`jQtY?eq>yg6g~z$@L_dMD zv28W3ZaE&Rm-4Zd=`81SHA$xe;tXBi661-)*C+Q7(+;M#RTx>BBD?)pZJOwcC`5Nw zsL}3e*-{E$QvrFI?03S)exv=Ykb=)gYmpVeVA6_pfz5q99$#>uB!z_< zro0COkuolVYD3i)U|+Tpca8DQtJ)1G?BxiPY%i6Hgz_8!#7Y2ZS~ATf+pa%iiZtv!dzqB!e6%OUEK0S<$NsnMd0ps$l$Mz4P`%t43aY}? zH+(z=6zg#35J%A0g1uAhLi{Ag;T9G~5H=1c>zv4(w(=wv4W>-FTlh39zzxR592^be z=?PX~PU31G^7fNF6|yfns(Cnv0RkBbDgGOTr)tqrhR7ToLn`vm*3GV|A1Q{irq6Wc z!akw4ty+zz*u^FB3X?tN-%qq|@XrSgii+F|2?n}PekgrWRDI+hEFB|`rPgOw*6gfk z5h2QVCJxVBsChdkO)$FM;EiF6A+<@ko{T+SN@6uvHEezjCE6_7Uo@jrcW}H}BeQQZ zXsM6n-JPA8n6yI}?{lHuz|oW0V#MMM-jx{51RF>WX96LzY$g^`3`yb`hUe$IDU;B zw!=tNnaF6BmpImk>ccq%Pek6YmWSz#7<=>UArt^(+Tx9EK5M95jaI$=RX_Cx|L%<7 z-<^bID-itqvDbUJbO01+MN&Pp@}r|+@R8MmUdJ$)l-(0TD}?vNEF&C~LMb$$ihM%-?E<&Zr zBxrAS%`sH0)?Aciw3(i5Th=ic`URne%d~rC@2zS?p7ZZV5t9iBK{OqR?Rqoe2SO-t z$;INr#*ODQ+{Ol4;GJ;iIw)%F%AP}J-`|2EEMlC;va6aX7eAhQ_V|8ihyu$Vi#)E3 zR8yv@AAd{g8h6p=xRO(Iac=WV6860mXlU=?QVp*nb6(F5Gc!xe$yxw4kZ8cU!{OZ$ z23y7ZrO6L4C^EQs3Kut-y3#J9E~&IQv^i0VZkS{Sp?M%PuoCD<1H8LI2M^fOGp*Td z(m7bg0{H`WHWy4ix`X(mLz#hf;{9BFQXezviJ)+lm+L27`f?S(G!nW6OWXN8V zoVtt0UDWG9al4$&bW;eHKjML}@d2*{7Bxx@O%Bj_8m;9`M54Mp$Wv}vPi+R|3a)-U zM>iH1D3~ru;H*%r;gc+LY0JH$aC;9a43xfo%5rL$MF7Igfh^wlQ$=6UIe| zpz>OUUtwJWcxSD}4rmDOFdoFo)v6k`uEc_D;N-!ZRU$z-2nwa5ji$g%iCA`AwsWV@ z3CEti)#}tXE zg)nn^?1+_3Np}PPDl)PrLT|~zJne&^?%EB1s1#huj5iwaCC}reR#K5ww?U`Ck>TJv z=nWf&tc?a+lVa#P|Go<&so_Dip28*kQXi{dmtpxBV;R<}u)*W!{FwW;34W``k&KG| zXr%w#X@3E!grH;QcZe}BU7wQ?v!D@gQ_w-3>x&K^--wX9c9wKNgP{N%@BBfZd^4I+ z9dDo~zXYUG?&e8u=`R7NjXrkg+&k*R``fZIS-GR78oHiPobZPpu^RUh^o7qe0Y*w& zwU|L4zmm-xZF3^UxNV}A##Iedyl87PHFuxjUOX zCU6B`i+b2t+GhHT4!8YwnXs>S%RBzXGy_!*$9fe~yxpeF7Nv)*bL zc&A}jYl=U+aFv74$*U2S*Sxw$E&6a&#?3i?it@2s5k-sJld*Y)RCD^5)bZbQPi$0u zGjrmz$=W=0#l3`P*v!1^E|g1PsGQQ2G~J z{x9B&7(3~t@S7Tk1>d~W+aUb;FDZY^&i(L+Y}E_jA%{K1e0n=-S_MVCzAmqX_U1>S zP3P$Xk1v?iY~LP6?-qsRkxlU_;}h@CWAo4N6hCuQ9u9*ZiMHt<3e`*>3zR$-U~p~% z(>W}n36{nbD(Y@C2g0pvYS5DWP7jvqzPV@{6vR|K-}q=ejZWxzSD%)ip!LoIwsIsh zUbX18E|$|8dz9HVEO~oSMwWA2+nU9wNQ4_*3VI3j_pF?f@m>^A3xV|}#0*6o#wyEh z$@+Sxz-Z-6tW7cqsqd=gzmp05j3t1bRI{Fz4f~5R_^=MDCk7MJGqPC)N1I@>3Muu7 z>Ya-e0DMWeFBaOu$s6P<|x zUj9AD+Fi|~K2$hd|LcgEGmosQ5R-o7h>A7X;F)WnR~jC5H@!w$Y)FR(WtrG{o-NOc z7vhHPLWp3lf0tuAvXt)y=+rr1Ns5bqEL_r4uF|VVR_$=BU(V?29O)kW0%=ExdB-HG zA}%HxIFHqTOd(2f&aTXWV?442{)2tBm>f+;M>3Nu`Z26`7eKETf#9vyg=&rH3)EKh z-M?Ba8>sXElxg_LGHrJ|_npB58FdxQ$G~YiufaEo@G1>&z{VZI7T0qH^R4%kEy5Lj zQ_-gRXX3l#pS2B3v@d(W>y~NK zrstayw`VwbV$lk$jq`koj+uvFnmf|xYv+A5?9vHBs{MXhBC(0!Y?n4wV?_=(F{eak zM;wzXtnN4o5cNqbtiA1Ep~6?xqKC4ODbQ?seg%-Pb4P8ikK{oZB^st9uH0iv82q2L z5#C(z+Q=&=IFNNi6mu{&F2g6zt!e@|Wf0{4#yk7GnVv8wRc6FQb!K6q4mIw%wDv_U zJVe6luOP|YjZi&f54k(Q=7Hga0}Y0(?CbM%sP{YKh*{K2or~eBAeW2)qQx&AdX#JZ z@{+Ef4q)QdxQQ8GwwR|jQ#y(@?b}PX^PoNB;_kNc<*S2)Yu*CkyP)FGjJjw<%LWI{Pql+i*=FJ~HAUg%YsfSl32j=iB}cw3HI4&5F-9Iz)7m z+Vneyx63$Ch5$}YLp>TqoRn#&+3_^cP0IGK%uc^!Evrcw=fzgbr#;p?HN728BHs;y za)=~?gE-KmGF5!D|Ptc%XkS#~x(E9o8v984hk`K;?h&fMq1O@tBogex?uz9vT&rrSdrm|2cz)zYHU*klX;q2IXhq#g6TTkhZ*6#}2So~1r?(>c1URiq*;o93I71=W9!EqKLN z-M!E%_r1dH+Hbi2?-)5%^^w-4$+8v}Sh{$dv@fN{=?^sPfOz)_{b1aZB`KqCAFje7 zHe><6-Z~?1;cDG)(5#S*{~yqJFE;-S^^xC+tF|R22gG^x!JF#;2!1dwK&B`h$@#ye zb-|s{^{H+&KFq=2t;E8SGLWxZ(OasNPZgfl=^dsyNdDYAd;?LC7_ecN^owdA1nr`W zv`@ru?7x>H^+C-StOhh$7a33ayW+yknY>t}+{ev-80Kj#2`U0jIDn!-ZJQBAEvoPz z^x=N6tdLl1j&rVGZX4lR-Fki^m4PTYT7GB0TqX|Zz|?*T{B?(aI>75k9_Ul zvLCz0e$st2(8!hg#cYj{P257{&`?D98dGB?D^fN}Y)stbiP@Gda(y-mH@wQ(N4hg* zPn>UJ_C|X!D8-lEb+)Kbp$ve1^WX6JQQb|v%X=B>Zp$#3EeGfvm0vg+;$9>e^-ilk zw6(t_^^HZ=PUY8lk6VJ=>}}=Se0-07CUjhbmBPH%Bq%w^$dEY&x%t#1$gT=MXzX#- z0dl>UMIf#M$w`_}&GJR2#&Wr4HJO7J-7XOX1J*uc=NDI_zU>r;+CN(sg=Y)x@>a)< zi-bB!L|O&48^%^3&3lA1C5Yv|A}2wMX>z#h0ehKXsddbvVW|{+&1$q!k?E0ZL^r;9 zR&%YZ<_Vj5KhmzdBsI+*?@fa_6=>L306+u{AEaRVpX8u_rYmjfSLd~|3RdNOy{fz9c{#*vug2Y?KMt+?_MyKN z-pJvn_3G<8?Dl0>^H2_UXOf@JMo+FH=j~*6dwM-mN1ADAU+ZJQQW(9*HqA;|hSkM( zweu0bhnT|^GPjec5O}aI;QR#CVRt5^8-*Yjy9*^%A{i9{n+8l*_#$L^uMasd(;DSc z=l3L*OhL=yVpwVQOu_}0F0VTCmbAMQ(Gi(UD3ApD3-#xs4=M9t{yIOkHI2170kvX#Cf2uga>k_V?i#d{3g zH(y-4FYMy2k|nUK1={m@AIi;6{;##Ex>En`Q#EJt3$AJi*atsJ(buacP>=T@=I8zl zoDQ1}GREL;B`SyvHDd^2$%gSJ80SH9-elPvvF41r`6yZ;4aV>r=YohUA#~b)t;H#aGB%i%hW~BFQ zn#QVJmX0!<5tK!2;wRey3<*W0A|x7k@vqSDx5{OtG8oHD8pY`Um7Imck3;;(nd-); zIgWD#N)Gxb|4b067cG_n!V*ST9)Z?5aZ+npiilblXHq5ZJ!trV*E+zx+nkOa=&?wE zQtV)ViAdUF|8WKFuSJzv1UbMdiG zz@GX!vCW=2j^C#=K8^i^fA!#^fDJ#iAeHZCnfK6IM16{N3Z?3X(M=*d7%G0bn*E_* z>l?IW)4iY`$01`qr`qG2Vh>L$(;8?N<^G3~MaqKO2J%Zg6{;HwyRt&qkCsGDwugnt z)W~y?(g&aXR)o`0-yf}ghiOM<;`Lv4Wp-|k1A`ZoW?MYdEpEG!RW_j^SQ%^7WKxO) zEDUJmUSusC#ZFbz*Nnf2-CE2V%Swdkf9mDrX=#7J=`@}CYb3LE3{){X*K*@zRnKZ+ zj$?7krI402mp!a$R!9jO7_8lSnktd3ij%8cB7W=CS9`>99Me)#9R|4CxeKOKMvqw` zKOtFPPbuXkS`Bn5?hQLt3lu1{mTx(gUv8)1MxxQu=cUA3g@CXbHLRVx%Je9*<8QhX zPv8x7cGOv7mSbDWOTa#DT#UNJHxf(<=62BtFJ}WHyB`xIW~CYJA2YYWp+qZCAiL~Z z#1UiQ;%9%~t}vJFPnB*wC`)nthQY@d(XiBCNmg^E9v9LR4fNodiU266I>+N`r)7Og zq(hu-#4@IA108|2Xne;ps|;{h63naFI{cs^I)B#(u$XAR9LG7S zF3Mlk)`Cd$P6TwSR4k8JznC_r{`Q}#=$8>oNjbh!bTzgTu%%MFuS1y7={(1Dg8 zn%huZ|3#33x>=QPL1ss)pY~~R%jkZ4_aO4JRbkWjT9B(kS*ziWzeq^pYJ%sJ zMKjp{_1YKPasKvR3*sbH$MXmq)-`spvYt*k;yB1-d=1Z<17ZGlxeU99Y8c&$e99XjCfnmhqgKvrg zJZbS{O{NQ4zOn!ChDA? zKbSFH0y$;bh^DX7VMFJwQ&+Ko&)2SnwG!^`Bhbz>|L}Ak$ya@-AUk|@#B;Ki@^{>Y zzn71q2^X8nk^XR(?pVZz5y!;Yof;5)(-QR~UQepH~_J(2-+*|kP zxLi@4vQcZMbn}*d%3K#$qEh~&Yu=YY6={It=hLI5$Wd<7R&x6u$a9nVB&T8iy#(;0 ZnB(cnrYcGZGP7oTcJKGB{PytK{{wc9Ef@d* literal 0 HcmV?d00001 diff --git a/TestRoom08.png b/TestRoom08.png new file mode 100644 index 0000000000000000000000000000000000000000..647143c8499eb8bb1038babb19ee0729f09e45f8 GIT binary patch literal 15677 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 q0Cu;}K<a#M} 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 ULG2h0PYz=Djy>B;wg#X3KU}DUi2wiq literal 0 HcmV?d00001 diff --git a/TestRoom10.png b/TestRoom10.png new file mode 100644 index 0000000000000000000000000000000000000000..fe6b7122f78cf5b90976730f4efa47edf666e67f GIT binary patch literal 15441 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 N^$# zEQ;~+QHPth)uFA-V*fDi>c1M$pTi{hrt9_syvugFv&FC{VGzZo-69k8AsDAP9P*f& zXt>lY0MBgcbQ#BM%5N3(r&OWZ5kKV>sqx!~1I0|hQ?*ZD`A~E1Nf@!x5C>-$aJh$g zR|)~eCJ!-@_FXNLU;f$6qc|@xALYO-kzyyUbENVg zlXX!sV2fNw0?A-`MMGPtBO4p2lWJ{eo^i1czdY8#(tPJ|k_OOTyfHc@uBQQ!wKAio zF1Ic{JH3OOUSElCy4rKa-)GP2znapR;tfUo4UYzr%+g=gTDu2<#Z{nCo3+VMcqjOO zN;GMU)5~YZ+!jY?^)craV&fcEJ>uv&mxY>XN#uxCpY*NogB zg9im#>AFw!+0}Koh}OV#1;flmKDGLW`LB96-NX5Lw~-T1+3o=HdIdWhuZXvZtZLZQ ztikaS*?!i)T(-U!MPnnni~F8k97~4D#)cQ=XebPGAi0bshVBfgr%o>EjEj_Ibn%}2 zhv7cC#utAM1A2LV#g`Wtob-KgNefsrG1XUm_@!h~7>5VIvRrG=ffW4fINmklK6`SA zFC0?^5yOIrK^cv`$iaGRSjLSTll9u|owiRa@Y7$J+&AOT(jk$KwqGGaNlp2cgd#1^ z%#4e=K*JZQLHOnpG0}1td&(0NBFW#KR$3;tIrV=EHBpPuBb2WSlicM?*4I_qs0y)? zMP!jYUUm4UPFf+}E$)mH;#ytzk@SZY%3`;1FMubTuFt6-22}f$jZvF_59a^2fiRkD zrEmGEe(;?8=UH?~$YAhSxwi7=kTodFIdHgwZh^av*8tWFpw%m?{Z5A>p{@hyQDFoyHk&^*n+h>97{kQ^*zR^xifT}%f^u-J@Eu#;Q9gnsoEhL) z59d9)4sR#F9{nyd+%PWAsXB-W<}Cm;z?0Io86HD86qi`$@#7EhV<>auBP#b{+8*U$1u_2vutvu@ftGM(L?A=;Y=1N)P)#38H7t!qN6YP~6D$fK4wnP_Y51 z*_cs52oi^TN>v4A9j`o(p)hnk(!?8weahE)xRfNQ0T`vbcwv0R9f6T?^mR)Gp_yk< z1)iW!0D@>vpq?k>byK#vS~P0{J(IM;Ky9~n_q3G=p%V5nIJyjy@M|NIN^zz+r>ckT1gK&^68D0ZS$TGatZ^{N{f6@e zSsPV{>6flibEE7OjYdGc1uoo+gPKF!31u0mZ7>hna43GSD0g;Oa?jo}Twy-I#eIQm z1bpT`>X0F(%y~JU!e92SAc_jF)N7qBp0Odt?r>ZlX?+!Sdam+qi_QY01y+~fMAzBn zLYuag2@61NLuk!&3*o0Cd4D4F`g`SzMLBakQl1I{o51-ktZw%|!(l|(!Be)WJcSrX zW;E%vq--CRfM@N+>A2s|NIAmV)MmrTe+`+bhtFsh((c6W1tJ@Dq)0{0z4n-^y?cqF z7sGJUS`A+lLK14X)&WHhilI?rT3?CkB1+i5J?qw2(Ck}iZ+VMa5v-T*1hsgu5VV&~ zG*PqqNm#5tFehxa^(7H5?d~9CdNv)*f&=Zl7`Qwl8yA}kJ%MMcNcoFM9whPc5}GbZ ze3!5W7^G;txYH1H131Q$T`jHdgInuoF6tookG)@j;nGQ32Z$$NA%Kw$#?=MG2`SQ^ zFij7YZytDs#p}f17!~co5r5MG1^2j}jkA|;i?5PGE)pLwPjTLdPuajyV}w2IjwhKi z;>Vu z@0oGA>(Oj^aGX8(uo+bGo&`KNLI%N{0CWHcE^MALb0@o)OVeZ<}H=SZnpt!dsdB#?> zzf%U(1g??AF-DUfpT=z{Z~jEk8vR?#N<>6Noada;7t@FPGR2j%tHyC;{Hr+XNZms% znto?O1sG}Q>Uub&I-lY%RAvjA?iX$hBWyL41$59X8NaWn>vaso?)ffHhSN+0TMbfy z@d99k>)ECZ0v{bK(VjT29W}>KMV(cU5Xn|}4yh82^?P?Ya~2CTyx$`lH<6i&QKBY`BJDB=GM#O1nJqj63)I#5$d9LOhX`DS^r$uSiJoW)Q% zbW!aq{(+r#VPmiJU+uHnd+&)`2&s2Cv?}*nC?wuy6(;isT(m|@K8uNgH2I}u`(RZ% zRi>wD0lq4zvdK)d53_pWHl&JZ#~#zQHV@|S++urhMeD3xLY%px6{DAF)Z3h8%8Lj~ z&(XBeI!#*Dfwt(J@gB4f^x6io0mr}nXw7)FJ1vt^R?(=6c!h1<2&z@a zInWLDN<@2!=N>dbcQpb^w4xFJwTFbUto?9qV`e(_%;=>;+5?A}eI4mJFoE`gQcF=XFwsldq z&pU`JKt5<{m~bbve+VF-M)4NNmhHAITqFv3q;WR1qEg+(9quQjNMrzvQ=@R1dVB3@ zMyY2U?A+I2P-OS|&`XUyt9(tU8^KZodqp4@Vwnrd5vwD2iQq~5Mo?c|w8Kz~MXf08S zVGSwM<))u4VE}tY#*MfQQ6|$wi%Kk@5(5uA9kmeI+9N{s3R1s-OdkAFHvku!m_r(Z z4?z>u+RLQ3V(J=D$=bfB_w}lE_-OwIm7+m?d6b^;k+GP0;ohz`(QrbBhM4U!b+6%4 z7F$xWB({Sn1=~6skxIy&tvvt1_@Z$oG>tWOaW5$?22iF@!(ubHf7>y&@6^VIhoc&D)JZtgfpjFK@t+ z&v=wIsVcP8fBUR5VEP+3p@f?Ey02!vmh0#3EkAN7WiUyfa?*b`pCF2Ek^ERvR7Mcy z^LdJGS(vRMYjhtzU!`{Z6LI=D+Wi&w&93}d2t25a8S^qXYgsvMdj%&8k%*!y z5}Ats@l~BmwkOkXkRnp!ckgHGH!WB#x z>LVkZ?bQb$K6^wp&(kQM;j&PIONg=M1JMqTU?s3w`2*RvMWbbIws;R%bDh9aoc_%x z^f|XKs#tyafh=~|D4sN3 z-ByDv;rXS?sAV(1#;YW_AC)OoUp)=nGqZ$vs4HhFYX)VwfE1(r#CRDOGN&_uuuof6&|OsiUDLiri(0S*b^6QG@xKbX z&gSgadhE#%8C*_G$O=f|b4LDRDSxR<1{^Jc==aW(D7WE&Wpb9QF;vY*ddl`qPx~Ti zO)5*`dib@dsjaBSz>k#R8FKq~a>ha=&Y(d_K2auj#5|9(b0bzkEe3#SY}Nl!4gzq= zTf5`qXV0Ep1kypZ!QKAkgAw^|)*l~CLLl+gWD^@h#!30+_W=mOJ4Q?DrA zf#SP5t;oUGa;klZ^&23YeklR@?X8P5W&cNSnjD!)tCI1*-5oQKY+!W$a$GR5K7ZC4 zHr0e8B1G#xNB>%{2P4_gSY(fhBh9oz3yZn0n-bT&SUJ? zhrD$am4}+8>sal2c4W&U&VL}>YmW$~?~-^<)>@CLF@{T}f-sSyt5?srf@z1WL@VLIjN^ z+o!L2sQJZ3dc+W^fXo8T3~(g#d#-E?u`G8@=KQUVp3$ZW4ka6xijtUlqTwFp>1D44 zUyS+zi-YVGMx?|657-+)rUyRK-4+LIow*sS1Bh6UxaHf3vwV^;cOZXS?=f)leRD%v zr(Q9hQVgHCg6Mq_2I;gfU~asRFYt6N>_7vkJpF=5j=W)nkbyEFq=VETbRmxaugsw0 zgEp1;kHH(Atq&j-*GiSaeNN@=gHpzs$MI7tDgu2@fLjpv0vsU;dRHH#?`@Kah4)dh z4X8W96}bS_mk$iZm%de50rjPm`>W=qG@FK&(oF{z?ZrRaEObtsbd6u`npVDE4t<&5 zsO2>bb10x8{P)|P^?Ndm1Bz_ipQYj)wuR^YGykRO*r(3;oFWE4Ie~xj-N(mc)ETIV z&SykPSaCKse^+gc$0NU!a-w8Ehbhq*s3(FsNB5PB!|RK*;|8Q~GO~&bWtwFKBt8Ns zB<6BrjrAT|2kZ8WJ9Z^lq+gi%gFdfUrlwZ38lRaE(JsDmvzA(NXoE;vfNq@*T7asy zp$1eD!olSY3WaK`y-(~6X5MQ-*ER2ku-MOQQSrKW$VXQOR_qjFk_3y*=dJHW;~B+= zNOoL-CWLs{i?m~S6AYTgyMYR*K@V&wPKXT6{7-;N@OcS-Hv8RhnT7l^Ur^74 zrDY*{L$8ErXl5+WT~=AHW~Y7OR*o7oRy>+KpVSH`ZGsQTk_BfTap+2Qj*6?K|0fIjTp8y2XJ$TskR^LOGvMmn$mo~Cz`{D#R^Z%!G z88-}udFJ}!zrCZR^bn^Y_H7AwomxyB8@&IdqP1X9etbkk{{MJKPxikw{tCD)C>d(f zN-HWX+1+f1?w!^?Xw;-@OfOn)r@*G(JU)s3ZV@T`n z)~6ahxxr%l=ij#&)=gUxLiOO;=8s`Gt>kd z#D@X9q^A$Z8&wmqhoCC}h1QHPIV4R4h_eh&vvqarITIx;EPUp*rGM-AEjogwijUG4 zIKK~qE?i-p@mi&qY94k}a`msAbD!(1oWo2f8H&U1Mg}uhx(61_;m731QbJwQB-*wf3=x{Hm>=rWv2#~YWfnPxtJ+bC=_ z?f6$2gyihC-S*Y8L%06;Uvs;r7ZWuvgM9jC{UC;aO~Pg4VAp+j;qbzu<&$=K_tu5Q zULTq#o=eGLJhb0gY!mt&GNt`dg_too(gp)9TSf;rf0`iFST|Ix$d=g0bG}@qF?3WC zz@^p%Txv_20a>P_6=YVoV=0bYiGoRMBTI0ueT*sBEP9=@dNP0Kmu=bJt30NCsXn&S z!#ICimhE~M4I+!~mPAo~3qJiGAmqF+&rjs9zx@z&6`HIou0qO~MvTppAMUC#>yR*p7x zSaA{_7$)I0b`3`bi1chJ*^;t|EUO<5bVk;d=ClFnA>b#VFXd>pqPFEa!g2CS8L+^r zfG(K$n#s;$-nU&i$Q_d>;he z$-#78j5r5Y`BGpKFT|g(TYnvBK#3_FfB5{|{ASR4I*5!Az_C)rT)n*k&7HVAbI|En z07cTCy}1~!Udckb3iD2eD7Y{vm-Vy-d0}ipJ4T!XM8&gu;R)7QEvRvgW$?}vF;r^I z)tAgO45`e_e!TVb6;WcZ%^i+PUrm*sp3is~%JJRIVZhj~lk2{J5ZFEA?}h1yFPSYn z;}CcrDKx=#!PJ}ko@|Nd^d172Hg2c1fcBWKkCQ1ifjV_Q_c11bg^N1qm18@lRHRl% zo7bh8HmN_nb-~4IM|Xj1k6llaPB0~tc-L@b!Y*$ztEE6A05=pkLCKqhkr zPMNTBECJBzQM!8E=TBljuqj%wv|h&#VcXwr*C&D^>{{0~=fRyQaIXh&6qq^EUF|-g z91vu#^YiUCsv3eCBOD;rkix_?dD>78yt}kOiM+OUw4@(=)_fNZTun=@+^v-{#BF}& zt8132<_rSJr-Qi{EtaBgATQ#zV<6=0Jxn@cUEWw>yo8fM(SJGdpcAjTN zG1KKBt*$xUkhbuleJbC49G~T#WK!qMOc{Az43gRr^i#Es)t*JvN??Tka{c^dc+ls@|X(m zEQ#}9%x>vP{%}uL)|kWO27$W%pxf75)1JfRn{zcAyFbgQ+{jo|Lti{}u7+=KW^Z12 zf-9uG@+8^j7aDNaqIG2au11l2>rPJMrWtRytos5IcbBrp7ck8p6-Rzl$i};i!LM!4 zWp390anGOne(JMpL!OgKWp|y`+25@!=XT9ejCpzgtt`KIapqDVo}Nm+@d7T-!Gfe4 z8s08+(fD=8qNoj&KeOc~%gHEW%%AcYFQ+{JHEUS#%Ec_ijNirTO8&6g>^Hq_^D*Uz zULdeced0St`PiJvz;=6GZCsjh&&KP}Nf&wCATwddP;<#|QXwB$HFj_b_m4iwsvPlmbTmW1B&RHvs%UJiyxl8kby`U h1Mhi>-kq~ivLfRq^JYTIObYnpv&rAP_^UlX{XhF#IspIx literal 0 HcmV?d00001 diff --git a/TestRoom12.png b/TestRoom12.png new file mode 100644 index 0000000000000000000000000000000000000000..8a483c4305013f4ae2e9eb78371774b32de607b4 GIT binary patch literal 15401 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 Qk{EVy-yzScZ$p3mKb{t7bpQYW literal 0 HcmV?d00001 diff --git a/TestRoomDeadD.png b/TestRoomDeadD.png new file mode 100644 index 0000000000000000000000000000000000000000..791ebe06a17532aff86f053ca0c5cbc47c3455cc GIT binary patch literal 15919 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 gO2Y`a_MqcF8KnOtQY|Ne7CP%J5J2k={h0RR91 literal 0 HcmV?d00001 diff --git a/TestRoomDeadR.png b/TestRoomDeadR.png new file mode 100644 index 0000000000000000000000000000000000000000..962cfe84ac6c5de6c8a28cb8e426d6383b155648 GIT binary patch literal 15582 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 TvqfeMwRQ7$&x#*+AOHUV&Yw#j literal 0 HcmV?d00001 diff --git a/TestRoomDeadU.png b/TestRoomDeadU.png new file mode 100644 index 0000000000000000000000000000000000000000..c720a75c0c2cfcd41104d1aab82258a7fed53f7b GIT binary patch literal 15979 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�#InqIPq4> ziv1&CW(dfes+|mwe#fD68Lqg3xX@DDBmlJ&3P(a%IrItC-JND^^l2#PC*!ni$<)+n z1Sp%~l~I=$U-dXh?(EK#2}ZbS6ZR}4C%5X-O^>gL)isD{k={6D?BSaBxykCXs8DOt zWy`BFF3wDK$&TcW*U``TsQ+sSBi>wnl173$7P0ZeDzx9O*hVRY$-q znF=)dbOMW8?@*?nvwg1-Og)R|oJ{ib2L8m;-IQ4-RRjC-yhhbj!}^J#O;2Vh8<{1l zF%va9`%yvc-O{KkVZ@@F$;SP*DDS$)Eg9^B_YB?*JeDDH0O}thRr8gZRgdkGMlxka zQ=z~owJ&x>cbNuhJBq}Z`2-E4H{=_1T`kBKCA;YyL=qUnm!^~dhKyS%6H}65buGg= zh3yio&{1L^2;&x{+MMrA>rkflZ0=)+>H@uvP^V4fQ6ZufApUtqA9ZqJ40d&&DV0!PWhyz_LTt|U2K{Wh!i~UX z^;+kIgPjW($11U`@-Z0Njos^O0A&QUwqafce`}G*Cr#$;XF_@em}qMS;U<{yJ=Eow zYLq~zk!6V}{o<>?+1&1oDPc6X8oPYnxx7H-y0-lBbNr6#Xo8%dwAa^{e>^^Q0zT)0 z#~#b^Y44XPB6YS@FXvHa6P=1m1O3E6M(dnwZOVN( zV~_PwSHTdh&E+N zHY7Ko83o%1JkEs%K3RK4qyX})k8d5d-+*C5m_fOxJ{9I6YrL0#F%y($S`m^EPvKQ9 zuh-{4WZc3XZqFmPH9o#B<(6X}epnyb8@qP5lXhC+&{?LpkEB*PbVA*5OX3!Jz=#sC z;M^NJH}6&${Z#K_|4ROsIiG{*APZ>TvRZZVdF0l3BH7kb7$g#2ktq5ghi*1#)tCmnb3LU$kg=(*PPX>rmgs>waxUVSnWC z_Ist2xqIna*9`o|W1VWYHkp_U)N*3VfwS*(K{ES52o@ZE(+b)WWS16SwT)|S45izV z0HXE-TNXY9JC-tny)&gQ&)pqW867;Pcd>iG#RhhlfV9XQy-RE8AlQOwb{Hg$IcTB% zmU-Gg?`R^=Exx+;ivVqdG{cT1MXdE3Q$NIge4sOxSAvF`T(KrHr5jITKW@cNk| z9OQA)u1C)vE3%^6W-pMamk?Wcq%@!@q1ptNl?~XNj1~}m&NvzOvQ+GF#cN0?{ZYK> zxXVCd&UE*8sqv}%RtWOjCzKJ3eoKbqC~ha&q@;JUYlYtLkrj~~gHSSE zEYYx)WNjeNfS+}8z4e|+p7XzCI6r1hqOsZr$+Pf8eBxJ@=hWPh|*(Ri2wrSqY&Ol5in01rls zCg$k1=Rt#8w@IK?(JXI?M)H!7iEHmbx)jJ^y-C_Q);H^r9a8+AN*2uVO%x=)`$f?L zexkp+voR27NPcD7f5e!BahsrpK%5cKjOD>Hmxz%_r#?_AH)@DTX$3wj8R}Xi@2Cge zKV-x!>H0L%33r2uq*Mln>KHT#E-s`r)K_KzXbN#sm%g(7<#Kv}=F@7MQVj8n ztly{N_GCu2Z~{y{kBcc3gXGJlOLhH^1|P|JTJJjI=i0Wj&qLXIE(6I6!c;6-U0i80 zbYLe{w7>YXztzDt?BE~b>Rx0;O*{<>bvzw<`B-!77h-UKTsd08WZVo>=-I5A;Akbb0uS@hl)yGM}BS+p8&rt4tYVv&$GKwN<;nj;&FXI;U9*dDbjW zEDfwtg&m4}^Kg+=oLkH4-yD&hRP*>;g}9yL zyn;P-FYZ3pWETis&B_`0jf-oA1O+eC_hcFZ1(OiR;h_TmhS^YH*$ zfE4*7LDt(k*~S8^&RoyLhofk>Q^j5WYECzSJ@?>H{^tY~8+wDGK)L8aUG3Db8EuJh zo3Rg+VGzqdDa+I8l-Qt+-p;UtBtpW>4$FRwh_&B9Sr+FW8>txnGUt|to5V~HNt2!L zZgO_q>l$FFR1L*k3%K0i5B0w>j2h&7N;t&#?; ztLu@+Dg!>MuA1ZCtvT=~cJCha{+I@S)Yt65$PPfM{G%_{W>iH7v-S2IV{^;&AeEoE z;g{}^g4$sNA<-yFi>xOKf#Fu!6aDeb34>eVzR^rem9iNz+MQ65`0|j!#Ok@5z^GZ* zxYEhLNUDsO>L1(BP7(%>0bgC}P$zzT$~0dH%n)#Tyv|D5;=S3P%QY(gg2DvN%gVss*O> z^f4{nQrdJoiKCy03tY!3YR`)qv%auOP%}6{!E@=&2XZ7hR_ZSygTb5wjf;cE!7&!Z zJA9%QQHwwIS*pz)-XJ>+5;Y+`K@53-oYn`23oRb%sqgDG=*r+sPYDe-2@(y}M$nQR z1QMb34HYm!fmv_u>#35_-2 z;#kn|fW4g{4?Z`~%BQAFsq<;cpvnOC-Vi`DyRzDAcG=;;0}AYkWOB8Q=8>FX__bg) zd&5C36mvLA$mdfO*WvR}^_T6{jPE+k#EOAKCmNQ0 zp$NiPrXm6}&5Kwm)8_9RH)DvFF_}<4jnj6(*&D9FncAsx`CGr0v%e{nMqiaY9-K1q zoUICfeeJrMF}d`X^M71A+8x!uUG7#R@~R#kLfTW{R=M9Pakzo0dMMKti5=OMBGY1X z$x01v2xBsBnkmY_^@muJ{pI~EedBpgtSFX4XVe_u#nOXJ|5aQ}nh)yDnB!X4rS_m% z;{f9!J&ZLV5O1kIbpAWe+daHo@3oYinW9A!dp4Aj<-%+u`-BdUjXJHhM{Z*8p3XQp^6iV!G!7>0ohC6uY9iNIgU>x$YWMrwWu# zwq~+}|A65um|r?+3aL|hlWBotdSrl+u*(!DftdlXjzQ&#?g;?3bQ3#JXcj#}sKJvu zL5g!5en^laxXd();Nz5+nQTHyp;xLvwqZjkFH^o^IH$EX>tPO5saq!Fk zQ+l{X@-Ki}%N{H&{Pa)~-Zx*~Z-=|7hg=2@|vjllx4M$G7_!5&umOkP8q*ct)HU*u<}6gA5Y zMq%qaVz3u4qd17qblLKZJC^5lQxhMur*u8_M#g@K;|o!zG6Y(^1yNp75Dd3do0C@@ z9p815e2#>&_*a9Ayn?m9V@KxTrGzboz?mM-q|6414&N;0kmiJiBD z8Mg7JWGJ9D89E1=4#Od?u~ai#T~F4|MFyOE{G0OurM#0EX$(-@RaAdN9L(VbpjcC$ zOZ>f|lA*ijFj!C|gs`!Z3mXl2JocdE^O0RJzBVek#dMeE(LwEGJp?0o-~cM(?bI|b zc_y*`9?k=PQaS^U*?B!@O1Z;6tLugcmFUCeq9n#@p0TbW;NZCO^^3cn_oum)0uQgjYCK+5%m0-|ezRT9Y!@v^OB z_i|lvI)*;4?TFHpqDUHz0C3^;4ou2e}Y7md|WZG0Mba`f$p!PxavvHV$otL*-7AOr=ZixFH;Gf& z9MNct@*-O9&9#CNaj{K zZ1;S9Rk$CdupZ}2OAjhiJ#f14kGm-!Ies|8x^!%klMtquNHEdLHA((6 z`Dq_!)~#cWS{ND6PB$0c#WVFcpIRp#IhR7zaoZLR7qE;>IKZOP1u0PN)R)!j7h`?J zT+^^2c$Ca)X5R*-8J0ke)^4S$gRTLDg1H7l^vURr-*x=8#tD-3I5r1ImbVNpJxs*@)2yq@w=(tnQXf7>T23$QF}JO5Agd z%9~dOVTPbBs=!RW(NYhQ!cv!813CD2v`Vv}QL}isxdjoc+w1%Zd+wE<_1!qA{F7uP zZ{n%-q~x(oVydKoc05o!p5G_fr;wlHdhko9D91Xdt9zlw+jTuVn>7T3k?u^51>y%# zNMOcd5u{ywwW8?MQ(HN>=EO+Q5N>1&lAnPLFHE5=&f;ZlVGUpcu6T+Pw?Na3=oXfD z2_cDw&=aGfH`sHcUI`=a{u;(RzYK1Fiem;l#i zqKA6~cBrfh-Wm*!^OU!Or@Ci#Lh8=AC>gm4}$qU zt5{RrJc;Zvp;KpXhlJI(`7>wnFIFe+7KWoDDA4J%XB&Yb;|mVRl?Ymg+JLZ1m&bS+ z^=V#1_}1JW*D6yTCRP)+r#uWoRdYaw+hQiemSzpq8tA#r-w#IB$BX%(xvsxl^LFaL zM=Tmyp5mOmV*mIs7mekY=haEiG*#`h@m_d4S5lCJ)c~RBf*T>pP+D|9tSM6=^`xg9 zj?oZW*a*g#j)>o$JJpltR8PYbcbvZHsD!J7p0RA{F&7qu zPNh7IW$j-IOTq?1%|5tbnVANupT3>I4`xq)R>_$TVUTZND7XNWP%?hcHH}_`2|$_b zSRljjOuRP9W<&0t7;oi%_OwVVh(R@g;rZlUjAEq4>azIRBBonx>C;Wh&g|of*RSQH zas4a>kQ3A?^SR2J0&4X%e4s}?2|Z^1{qQvJ{Xrw!4heJ0zs(BabyPPd`Cac8pM8qt z$#hvyRanD@QH^*HPo9PhfMlZyGHqIP30!)n9wGhQ)T0dDcw{o@zzFEqIuJd;#W+zr zP3$n^e)w3c>q+;7a7{G$tnju3<6@iL_gbEeEUyJ|6gZ7u&eMJ*uVjBcCM5M88EO2E z6+X*`Ny8_al+KXEWX}X~>5kGZl(`Hgz_IyyI~(R;wc{udgr_@ZNmpmZzwhsinuLQ>P+Ru)wJ?>MO8X(J7}zXMxl{Nl zj;Vj$wQ0KdJRwnMHs|Cw$vuVNu%?-3gN>JAoz-j-@h5{8pHnq?l^}KF`iVCtnb-7U zDrLgc@gJHE@YZ}2ejYA0THu1Ti#nNp_G~Xz$*4NT<{LwOePP+>HnEq{aGU(W`t?if zktfFF_PeI_xd82=Ih*FzA35cnc_{tRyxV#EXi!B~GHB%nZ(wjx#9hBk`?iMZ(mH$k zPYYErz6T(a+!qeD>D2D3?QZdQ9_mN(H4)ifqYu~cIx38pN8sA#=Jo8&0uc`+Jkjz@ zvIgLN=oSq)WbEa52M%amM|DG8Wc*_)I2Lj4#MA`MT9DW|UZw>qwQr^L#no{7rc2qr zykB#{vFKEf!6+$cByvxL*ldSc887N+1<13m4$taV?F0|nK{@U5*ZRqcHN{bjUn#I9 zLS!(@5I;6R()d6DXz*4Ga#SO=oq-Lw{Qk-hHwzOx?+8b`0LgVZ*+hJP%{5A9;P{JQ z);>FIf)#8qLfhe#-`6IY&KM8~WqSD<5Amj>MB_hfH3Q|HjR&i*0A#Tb=s0S0^3xIQ z0Fr%6*f_+oBqH%PyJ?i)xc}0wOEuYm^05$~Jju>~6ri!{JvV^#C|nQ(E7wdqx8P2w z{q90lhmvggxLYT!4_^H`Ki*BpYHJZy3GjbyW?7@pKPe@e0W|s?EB8rc<+gQP3!yyC z2_I*D0w%?IgJh=b0w!f%ZtI-ue0uZrK6ty-6?BSn$ANL(*M@{oRwnT?<4qdNLH!2& zAcv5GkJ(EiDmh84(7@iTSzl?s?U14wU7vuFC2prUe$gkfMS!fVIn4DG4n-d~z5mj+ z+XPr#cd)`z;IZUuR$guEJE=A`66dcAKYiVQXkGwPsX0`ct2%ciHNn_)@iJW*6EO5a zB`-dRtv-;aCb8Sm)hO1PecP6-gRNwrU9dXwtJtBqb9jAa7`?E}CxI0n`$ukuP(?bZ zDC@z$GE&k0JE2|WK_RTvRm3$WBQb8u=L+vU)x@#XlD~&TR=Q%b3tpkD?ug#O5@xw!eF@B_Ih_Ky%N&X|&nO^mwS_RvB=J1En_Xm#-Za`)? zd}7tx#i5V)gvrV{Sm*wBT}#%*1rvJ5F6~aRl8x;qBZ3pgg=`KYJ z8dKBm`B+xKG0)aEWW(qfkR1Hpen zEG}-}1YoH>Ig&L^_Ur-H>JTFT4qAvj;ER{Hv$QQ?Y~;+mz@D|ImF&Hva*$`!7&a<@ z9k=Ma8a`eGEA6&~V@BzDx`D@HkQ0u9OX<^tJx)cdo-9u?`TcJSjfvy2H!)QHmoDAk z%*JF2Rjc~vKO8bHhy6WW3MFAJWsU9InwtS3dkb_m#9cxM=L7ejO@G+#FeLw*M~ANW zy7?e!-Z-3XZw2)RU*G;>i}Uj(6MY9s)rNJP^pH`tFOrm-l%c&C#?|pFNW${3aZk{L z80Mh7!8+=Q4wX5>+4x>qV+bRkAeRQovs+rSmAT`DLq=W?d!@V@=5m_>?Q}r_l9U)X zUWOx0RXS*{cua+ zhji)mXr+$Jr47DPk!@JU%NK3}@G|5tsOd>JI}z&~pvr+#%(Jh_($O#DfXaQN^1o~{ z$?tyE`Xkfzn;iqw&kTIZuTM-!!KXHMng1gO{G{x zN4wn;H65(%nvxevga5(kQb_VU-BIP13Pr)j*<~0Zg5wBDL}$pbUT$PuW^Tw>oxI{^ zzOLFvz=#50DZ1G7F0H)%ynKuQ+foB;Y{_y(_FNZ`1DAi?0^R$74b$h%7wyesdAwz5g7N za$QD^mE!qMxqBvS?J0e&@us&*^6=ZV`nk;=mQzGdJ3m>L%TtfjFj9+O^}vMdY3cjwS2exNCNqC7EoESjvzLf2^c5 z@P;Q)?E5fhT*2V_25Q;KsU-s_Vg!h33S_nk$_z?8M~}#&nz;S{5|<^hZ#!o;@3A%w zv~!LUy$h6aJK<`_y?}LbnG)9<&h`7@RT|@g+~&S<2d%t2-mL&7025MeJX>EMBHT4Q zY)bO??0?(EsN0LLmL{%HNH*z0kWM5`WQDQ4C_mSvD;*9`Z&hmPuQ7M^C)RiV1~{-O@MP*S6Z;S>9yu^_ke;(`ok#y>AvgZXqdX|WHGME?YFguc&3Q>& z7cmfeG{}VM+fF1>XOy5ntGCM>;2aNe(~=?~Bw)+}% zydg-YZqK9_=weLFYDbP*Ostl9mC((uC68pj&0}jQ#uw(Vh3xzxCVN!EaGesxugBzwYYXhIutn zv-aBTDpV0UKTp2OiZ}HH9f;kYG-@dSgr&(~lu&_C*c6lxZ089D4wi5Un)jqI{EL5M z%bdYXeKnM<)XeR6^!RYEA>q<#m?LE=58DXPZBUs)kQcgfvsQ_QW1j;nZOg+Tcu}#P zfA8(fc54)zC|;FLaGgO6L$`~JN>8QV+n;sWs%@;gR?}E3?-0W5O1cC0^7l1jPwd9) zQ%d3CEG)RMP0(#IUeqsshEHC*-fnJL@HAdtETfoyDNXF`jnN>RjVBn6MMG_dVlAZ# zx|LgX{Nl0*i1qSrq2Jg9mk-&G8LKUgTv~jf675?q`Vv#g_hxwO*xyb1yq`=(c7_p| z=Xtk5?ViZ^fFbW1f1N2kzH>ra4{?2H%JJHFt@`L4e%M8U=DDglSOe8%B728|;Qob)FOVZ4BWjb73q~dT~S?9;q10;=_a} zudA#edp{?uwMScAE|fRknd*N%b6G{UDABC~b& zrI7A3zf<|rpjQm-piNkX@?ixm#AZp_dmY8m$(`y*Wy~NtH!9X&v4-Q(vBG3n4tLd@ zSL|}HEPn~vpYjp;WY5O^VOC%0~x=^vnWH>#)X$w%UuzuZfDeq=6gvPi4ar=Ru7qHf8 z5ZG>*y)sfWL0kX7<6bbH*z!3pxx1Zg&Jx$d&gfv+a+i~J1T}Enxwu^vT1SVg4i74u zLXCLXE6rNPH5L@OkP>m@Wgeu-E37l)L-LQz%xr3l6fPd0g*CI{c0F7vlDCvKy#Yu& z!Cz^l+mfr&?rZc+N086?7U34k!0)*`l4cPk(d32h|{%+Uv~3iIe&z}wV2s_ zm}t3;py)t#J~DDr;i8`=MO1&neV?f!%OP(bEFU(>s{?efBy8cZFemU?>eSP(#{Qtk z4*J~fQI_*4=cgVD2OsR=T;gf>IxlUQ$1*$ocBRQS42pr+c_%n2tRRvBCi00oa>1Cs zr-2}mO^}ZzDCh409khUOix$~zp8(R9y|qTe#2JT zXTzn~yIt0V5!+gxqARNQ-+WBvN_g`gT1m=F(uyhLmzggyj9$natrehe;6aAPM+=Vv zjz2~te;qlq_<40>+83H%H%H=rD7WsFSQCzH{B;Kj@AYpF;6Nyhf^c-I8B;@3qe-UR zQHrT7bfcF>J8UrP<)qNce5h;&nPB!3gF403KN(ht{5yR2aL)65w&R9AjLkiz^5^(R zy6(EH!iH5&knBv2+61zO4+i)}&)ORWqe|YX@i@(d{kt;pwP zK{px)BziEvd5*svVD!U6zrs7M?+8geL0k5BcOVD%1D zgAC`D-&b10^}3U?fK{-6MI2R|=ye&buEkY|&5L0+^RbbJovx=SN(f%)#tCInxR@WT zYiWbNA!ECSDtU zDO0$3x@`+E4#UC;6f1^gY5O@wn9%)oaCBoek(=W-zZxsF?%RYiU+!SiPII`-@a{80 zDpeV_;D4~sfC@_ffQvKe2eO>U;UqVMGVWH7Br^| zqW&iCehr2Rk>=W);vrxh&aOJOg`Euz6_zumA`p@AC zPMKn~CD_mR#lu$mxp&^|;lV4WNr@?X{d&OA7PnNFuo0H25KUJLkQT!v>8Z!$0<_x? z@)P6-Ggmrans0Y1W;bGHnA|_Es6JjJ6TAywLwfejWF5`o#tEN={(csGWiQLm4X{{{ z@t5a6@%aG0L;36*OR40)Ut_(vdys@KzPmBVlVM#8F#yZ$c>-xcmL6^%G*;!4x n=6VWVf=lP3z!ftnYXq{pBUT`GzD|R`N9^(Y%D3vX13&y9R|mz{ literal 0 HcmV?d00001 diff --git a/TestRoomUD.png b/TestRoomUD.png new file mode 100644 index 0000000000000000000000000000000000000000..5bc199f8c12aa2e473e2ec5036ffa196497ce0d7 GIT binary patch literal 16458 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 literal 0 HcmV?d00001 diff --git a/Tile Dungeon2x.png b/Tile Dungeon2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7a8ac4e7efed64244f5133dbbc770030e7a5f4bf GIT binary patch literal 7039 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 U>GWqL3XGA5>oFI~p;K4>3yo}cga7~l literal 0 HcmV?d00001 diff --git a/assets/03Idle.png b/assets/03Idle.png new file mode 100644 index 0000000000000000000000000000000000000000..3231df4a3b9eb135b468a5d470495cc16bf4c7bd GIT binary patch literal 565 zcmV-50?Pe~P)Px$?@2^KR9Hu2WEiA?age%;Vbo!y#>{Al(JaIiC8YloWBC0SPpJ|ML>n^b97e2z z&_k2bkRupkL(XAcmZIQ5Dm(rfOr!G$EW`%PVYs3Y=Ab3P9pI3PSz7_7Vf;%a$tcN< z+>pbW#)hoJU}+0IH^M?RgwY*uvB$Ws6K}>NJH!UeVb5GGQA&F2%a5>z0D304XBC5@ zuJZH^6n?v@1_~cn$l(mJLFX`Z2cZWOu8@O;)br1WP_#_CA%?=w(|85uOY+)*X`(}H z&^e4y)pJx=4#nrVLJnOWt`LJ6Cbj!G*5m{i9CQvtk2;tSSN=XjO!JE&oYe%Z4yK-J zAvWk8c9iEkN(jLU(5C+7VDX>`H88CsX$+=eAqCS!vk)6}4uko4b)W%CNk8?6GgvA) z&L1TtVIkKnmyRNio+e>w4Ogzjl^bD(!gJ-Ibr^aUgcTq1h7ou}4wmMK%EAl`48*q2 z2(~T;t;1j;LCAqoaw%8?ZR6uD1Uo#~G!hK4LGLhh2g3MUx0QmKxI*mG@AF`JV$&8z zuEdr2(Zyj=N_U45s?2faK0Q`LuoNtWaH)Iw{+49JCID`5fjzqJoVAMI@)O!QwCg5vWi&aQRE?00000NkvXXu0mjf DF5LHS literal 0 HcmV?d00001 diff --git a/assets/03Idle10.png b/assets/03Idle10.png new file mode 100644 index 0000000000000000000000000000000000000000..086810e9953c1696ea14e2ab6d3209decdbe9a01 GIT binary patch literal 513 zcmV+c0{;DpP)Px$yGcYrR9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa77(KI$1Vx)!usp^SNV~P^e z|A{gD{)?wXn~Bdnq74~vhY{-lLZL@#$YF%okat*@r6@Si%8tJV)9CyG3$a1xFqngu z1b2W#DrRj3n1=B$l_aAizk60OSd$~;x=y?qkK{Bq;0`;gD~IA!>&uU@rX}>?Ko6nH z(>G9*w3}+6@NtD4&JY`P4twTmiMND@g&fS=u&51TbO#GP|9l7~L?+!3L*eIXyaMwj zdF{Y7(IGbI97d>M#TB*aX$)N*t`LLiliGb8Ywm;#4myXSM;*+ED}SFMR2_ol!&yzh zG)z6!LTu1G>?qH7ln{c|fld9(!Qw#?YGArqE*)z~(k#RVox@<>Uma+GQhrVS;S82a zj`K$eAzUGco+e>w4Ogzjl^bD}!E@!Hbr^cWffXO}h7m-C9I?5W*mfGurpKUj7_Ner zP{>8erGP{B((m(l%fFXj{(Px$!bwCyR9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa77(KJT$5L1+p{*TX+`!AkS zB^F3FWY9T`kb}@ekZKz!w5N~%Tg2^NM*-ggK2a=%|dL@IgD5bEeY-bhg8hk z3NQ`hUn)rk^Qj(UgWh3Bb>&bpn)T&JSkn@rg7cnL3|1wK>pJmfJPb)#hz&Z2J#)3h zTe8DK4i*gPxe+~tDo@`)39)ul4HQ1Eki!VELFX_+i5^$f!n_X)spp>$p@hh!8)7K@ zJdIaiz9g?5m?juvgU(^-Q3vzk%HL-QWjL^WII9VmhN(vnSzI9oGhAx-ajdzManL*L zD9?A45Q5c#P5sNk;z1E=U|L7g7$u}&nrIecgU(?vAFmEHKq{jg7?wM6Px$*hxe|R9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa5nqSKh7g!F%648Q;4DbZ%) zGmmIP2A#u*br8DmDGfP-AvWk7M#w>3mZIQ5Dm(rfOr!H@7GgurVX%-{65Ig}shG7D zU>e51RFVwl(>=rn++ojLEm6uX>&uU@rX@mU+dZootV$Tyb>huw zbQE!_huENZ7R07*qoM6N<$g3nRwlK=n! literal 0 HcmV?d00001 diff --git a/assets/03Idle13.png b/assets/03Idle13.png new file mode 100644 index 0000000000000000000000000000000000000000..3231df4a3b9eb135b468a5d470495cc16bf4c7bd GIT binary patch literal 565 zcmV-50?Pe~P)Px$?@2^KR9Hu2WEiA?age%;Vbo!y#>{Al(JaIiC8YloWBC0SPpJ|ML>n^b97e2z z&_k2bkRupkL(XAcmZIQ5Dm(rfOr!G$EW`%PVYs3Y=Ab3P9pI3PSz7_7Vf;%a$tcN< z+>pbW#)hoJU}+0IH^M?RgwY*uvB$Ws6K}>NJH!UeVb5GGQA&F2%a5>z0D304XBC5@ zuJZH^6n?v@1_~cn$l(mJLFX`Z2cZWOu8@O;)br1WP_#_CA%?=w(|85uOY+)*X`(}H z&^e4y)pJx=4#nrVLJnOWt`LJ6Cbj!G*5m{i9CQvtk2;tSSN=XjO!JE&oYe%Z4yK-J zAvWk8c9iEkN(jLU(5C+7VDX>`H88CsX$+=eAqCS!vk)6}4uko4b)W%CNk8?6GgvA) z&L1TtVIkKnmyRNio+e>w4Ogzjl^bD(!gJ-Ibr^aUgcTq1h7ou}4wmMK%EAl`48*q2 z2(~T;t;1j;LCAqoaw%8?ZR6uD1Uo#~G!hK4LGLhh2g3MUx0QmKxI*mG@AF`JV$&8z zuEdr2(Zyj=N_U45s?2faK0Q`LuoNtWaH)Iw{+49JCID`5fjzqJoVAMI@)O!QwCg5vWi&aQRE?00000NkvXXu0mjf DF5LHS literal 0 HcmV?d00001 diff --git a/assets/03Idle14.png b/assets/03Idle14.png new file mode 100644 index 0000000000000000000000000000000000000000..908cb954ffb7c72482924b5f2bd4ea092e929653 GIT binary patch literal 561 zcmV-10?z%3P)Px$>q$gGR9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa5nqSKh7g!F%648Q;4DbZ%) zGmmIP2A#u*br8DmDGfP-AvWk7M#w>3mZIQ5Dm(rfOr!H@7Gi_WVZ=IUNpJ@^q+-@q zfN2>2Qb{sOa=T|0gEjLpuIt2`j4&hzy~B>`%Axqw`tl>JX$d_z&_k&5^bHgx?WP(i zd|V-iGsFg+!=AZX;w|A}AqVp|EH{QQx`TzDe?Ei~B9m^2q44uGUV-_Nymnxk=nxxp z4kMK4aYZe98beoyE5u;>q;?<2nmgfwgU(^-Q3vzk%HL;*X-qJLvzma_!PHYN#0I^? zj`Dm*2_aY=*wnuqEFKi02Bvi+jlnc5q+pt87Gi_WVK5)B4m3b1zo!0h21_N!`J;p+ zEaaNy(ow|G(fiV8oZKYr)t`NKQ`#e~l*tCU_D{&=$ zba7ae(%oT%Dsx=9Pmk3QECmZ8TPx$(Md!>R9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa77(KJT05L1+p{!fhI_g_4v zN-Pj<$e?i;u@1o%ij;;N&JY`P4kOk+9wuC#MG=Sj941JvK3pLO56(gBFqqF_4kRkrC{RRl8XGJQ Z0|1d1KsfB}W^e!i002ovPDHLkV1lbG;hX>f literal 0 HcmV?d00001 diff --git a/assets/03Idle16.png b/assets/03Idle16.png new file mode 100644 index 0000000000000000000000000000000000000000..b56e2451468197da908e85625f0b83bb958d2e1a GIT binary patch literal 513 zcmV+c0{;DpP)Px$yGcYrR9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa77(KI$1Vx)!usp^SNV~P^e z|A{gD{)?wXn~Bdnq74~vhY{-lLZL@#$YF%okat*@r6@Si%8tJV)9CyG3$a1xFqng8 zUFQLZRGQ`&Fb(71`EVa4`Q5XM!I~Ty*LC8}cqFH>0e9F@T{#q=T3>#IH7%hB2YLuq zp1y&iq}@~lg^w%baE92RbJ#OiOS~mKEaYI`hDB`%qdQpW`R79@Au{QP7z#g6;}w`M z$!iCui4L(r=P*JAE3T+TPh;rnaD^C5pVaQ-SaT;_aL_pnJ?daST>1M9q3RGUAI@q5 zreW%-7Gi_mVMlqsql6Hw4s7aQ4i*oJPy^G=a_Lw@l4c<`=o|*~{^~#jl=5rp4`;Ac za-2U(2;mAj^fU=eYq)YHuG|Q-44x|ot;5h04y^c)H;f=E{r<^z}miSj-LibzglgT-M05oazqY5$Yd00000NkvXXu0mjf DW}x4D literal 0 HcmV?d00001 diff --git a/assets/03Idle17.png b/assets/03Idle17.png new file mode 100644 index 0000000000000000000000000000000000000000..7f8016eca11f0e9bbf76ec525218f57785c3a869 GIT binary patch literal 520 zcmV+j0{8uiP)Px$!bwCyR9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa77(KJT$5L1+p{*TX+`!AkS zB^F3FWY9T`kb}@ekZKz!w5N~%Tg2^NM*-ggK2a=%|dL@IgD5bEeY-bhg8hk z3NQ`hUn)rk^Qj(UgWh3Bb>&bpn)T&JSkn@rg7cnL3|1wK>pJmfJPb)#hz&Z2J#)3h zTe8DK4i*gPxe+~tDo@`)39)ul4HQ1Eki!VELFX_+i5^$f!n_X)spp>$p@hh!8)7K@ zJdIaiz9g?5m?juvgU(^-Q3vzk%HL-QWjL^WII9VmhN(vnSzI9oGhAx-ajdzManL*L zD9?A45Q5c#P5sNk;z1E=U|L7g7$u}&nrIecgU(?vAFmEHKq{jg7?wM6Px$*hxe|R9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa5nqSKh7g!F%648Q;4DbZ%) zGmmIP2A#u*br8DmDGfP-AvWk7M#w>3mZIQ5Dm(rfOr!H@7GgurVX%-{65Ig}shG7D zU>e51RFVwl(>=rn++ojLEm6uX>&uU@rX@mU+dZootV$Tyb>huw zbQE!_huENZ7R07*qoM6N<$g3nRwlK=n! literal 0 HcmV?d00001 diff --git a/assets/03Idle19.png b/assets/03Idle19.png new file mode 100644 index 0000000000000000000000000000000000000000..3231df4a3b9eb135b468a5d470495cc16bf4c7bd GIT binary patch literal 565 zcmV-50?Pe~P)Px$?@2^KR9Hu2WEiA?age%;Vbo!y#>{Al(JaIiC8YloWBC0SPpJ|ML>n^b97e2z z&_k2bkRupkL(XAcmZIQ5Dm(rfOr!G$EW`%PVYs3Y=Ab3P9pI3PSz7_7Vf;%a$tcN< z+>pbW#)hoJU}+0IH^M?RgwY*uvB$Ws6K}>NJH!UeVb5GGQA&F2%a5>z0D304XBC5@ zuJZH^6n?v@1_~cn$l(mJLFX`Z2cZWOu8@O;)br1WP_#_CA%?=w(|85uOY+)*X`(}H z&^e4y)pJx=4#nrVLJnOWt`LJ6Cbj!G*5m{i9CQvtk2;tSSN=XjO!JE&oYe%Z4yK-J zAvWk8c9iEkN(jLU(5C+7VDX>`H88CsX$+=eAqCS!vk)6}4uko4b)W%CNk8?6GgvA) z&L1TtVIkKnmyRNio+e>w4Ogzjl^bD(!gJ-Ibr^aUgcTq1h7ou}4wmMK%EAl`48*q2 z2(~T;t;1j;LCAqoaw%8?ZR6uD1Uo#~G!hK4LGLhh2g3MUx0QmKxI*mG@AF`JV$&8z zuEdr2(Zyj=N_U45s?2faK0Q`LuoNtWaH)Iw{+49JCID`5fjzqJoVAMI@)O!QwCg5vWi&aQRE?00000NkvXXu0mjf DF5LHS literal 0 HcmV?d00001 diff --git a/assets/03Idle2.png b/assets/03Idle2.png new file mode 100644 index 0000000000000000000000000000000000000000..908cb954ffb7c72482924b5f2bd4ea092e929653 GIT binary patch literal 561 zcmV-10?z%3P)Px$>q$gGR9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa5nqSKh7g!F%648Q;4DbZ%) zGmmIP2A#u*br8DmDGfP-AvWk7M#w>3mZIQ5Dm(rfOr!H@7Gi_WVZ=IUNpJ@^q+-@q zfN2>2Qb{sOa=T|0gEjLpuIt2`j4&hzy~B>`%Axqw`tl>JX$d_z&_k&5^bHgx?WP(i zd|V-iGsFg+!=AZX;w|A}AqVp|EH{QQx`TzDe?Ei~B9m^2q44uGUV-_Nymnxk=nxxp z4kMK4aYZe98beoyE5u;>q;?<2nmgfwgU(^-Q3vzk%HL;*X-qJLvzma_!PHYN#0I^? zj`Dm*2_aY=*wnuqEFKi02Bvi+jlnc5q+pt87Gi_WVK5)B4m3b1zo!0h21_N!`J;p+ zEaaNy(ow|G(fiV8oZKYr)t`NKQ`#e~l*tCU_D{&=$ zba7ae(%oT%Dsx=9Pmk3QECmZ8TPx$>q$gGR9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa5nqSKh7g!F%648Q;4DbZ%) zGmmIP2A#u*br8DmDGfP-AvWk7M#w>3mZIQ5Dm(rfOr!H@7Gi_WVZ=IUNpJ@^q+-@q zfN2>2Qb{sOa=T|0gEjLpuIt2`j4&hzy~B>`%Axqw`tl>JX$d_z&_k&5^bHgx?WP(i zd|V-iGsFg+!=AZX;w|A}AqVp|EH{QQx`TzDe?Ei~B9m^2q44uGUV-_Nymnxk=nxxp z4kMK4aYZe98beoyE5u;>q;?<2nmgfwgU(^-Q3vzk%HL;*X-qJLvzma_!PHYN#0I^? zj`Dm*2_aY=*wnuqEFKi02Bvi+jlnc5q+pt87Gi_WVK5)B4m3b1zo!0h21_N!`J;p+ zEaaNy(ow|G(fiV8oZKYr)t`NKQ`#e~l*tCU_D{&=$ zba7ae(%oT%Dsx=9Pmk3QECmZ8TPx$(Md!>R9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa77(KJT05L1+p{!fhI_g_4v zN-Pj<$e?i;u@1o%ij;;N&JY`P4kOk+9wuC#MG=Sj941JvK3pLO56(gBFqqF_4kRkrC{RRl8XGJQ Z0|1d1KsfB}W^e!i002ovPDHLkV1lbG;hX>f literal 0 HcmV?d00001 diff --git a/assets/03Idle22.png b/assets/03Idle22.png new file mode 100644 index 0000000000000000000000000000000000000000..086810e9953c1696ea14e2ab6d3209decdbe9a01 GIT binary patch literal 513 zcmV+c0{;DpP)Px$yGcYrR9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa77(KI$1Vx)!usp^SNV~P^e z|A{gD{)?wXn~Bdnq74~vhY{-lLZL@#$YF%okat*@r6@Si%8tJV)9CyG3$a1xFqngu z1b2W#DrRj3n1=B$l_aAizk60OSd$~;x=y?qkK{Bq;0`;gD~IA!>&uU@rX}>?Ko6nH z(>G9*w3}+6@NtD4&JY`P4twTmiMND@g&fS=u&51TbO#GP|9l7~L?+!3L*eIXyaMwj zdF{Y7(IGbI97d>M#TB*aX$)N*t`LLiliGb8Ywm;#4myXSM;*+ED}SFMR2_ol!&yzh zG)z6!LTu1G>?qH7ln{c|fld9(!Qw#?YGArqE*)z~(k#RVox@<>Uma+GQhrVS;S82a zj`K$eAzUGco+e>w4Ogzjl^bD}!E@!Hbr^cWffXO}h7m-C9I?5W*mfGurpKUj7_Ner zP{>8erGP{B((m(l%fFXj{(Px$!bwCyR9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa77(KJT$5L1+p{*TX+`!AkS zB^F3FWY9T`kb}@ekZKz!w5N~%Tg2^NM*-ggK2a=%|dL@IgD5bEeY-bhg8hk z3NQ`hUn)rk^Qj(UgWh3Bb>&bpn)T&JSkn@rg7cnL3|1wK>pJmfJPb)#hz&Z2J#)3h zTe8DK4i*gPxe+~tDo@`)39)ul4HQ1Eki!VELFX_+i5^$f!n_X)spp>$p@hh!8)7K@ zJdIaiz9g?5m?juvgU(^-Q3vzk%HL-QWjL^WII9VmhN(vnSzI9oGhAx-ajdzManL*L zD9?A45Q5c#P5sNk;z1E=U|L7g7$u}&nrIecgU(?vAFmEHKq{jg7?wM6Px$*hxe|R9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa5nqSKh7g!F%648Q;4DbZ%) zGmmIP2A#u*br8DmDGfP-AvWk7M#w>3mZIQ5Dm(rfOr!H@7GgurVX%-{65Ig}shG7D zU>e51RFVwl(>=rn++ojLEm6uX>&uU@rX@mU+dZootV$Tyb>huw zbQE!_huENZ7R07*qoM6N<$g3nRwlK=n! literal 0 HcmV?d00001 diff --git a/assets/03Idle25.png b/assets/03Idle25.png new file mode 100644 index 0000000000000000000000000000000000000000..3231df4a3b9eb135b468a5d470495cc16bf4c7bd GIT binary patch literal 565 zcmV-50?Pe~P)Px$?@2^KR9Hu2WEiA?age%;Vbo!y#>{Al(JaIiC8YloWBC0SPpJ|ML>n^b97e2z z&_k2bkRupkL(XAcmZIQ5Dm(rfOr!G$EW`%PVYs3Y=Ab3P9pI3PSz7_7Vf;%a$tcN< z+>pbW#)hoJU}+0IH^M?RgwY*uvB$Ws6K}>NJH!UeVb5GGQA&F2%a5>z0D304XBC5@ zuJZH^6n?v@1_~cn$l(mJLFX`Z2cZWOu8@O;)br1WP_#_CA%?=w(|85uOY+)*X`(}H z&^e4y)pJx=4#nrVLJnOWt`LJ6Cbj!G*5m{i9CQvtk2;tSSN=XjO!JE&oYe%Z4yK-J zAvWk8c9iEkN(jLU(5C+7VDX>`H88CsX$+=eAqCS!vk)6}4uko4b)W%CNk8?6GgvA) z&L1TtVIkKnmyRNio+e>w4Ogzjl^bD(!gJ-Ibr^aUgcTq1h7ou}4wmMK%EAl`48*q2 z2(~T;t;1j;LCAqoaw%8?ZR6uD1Uo#~G!hK4LGLhh2g3MUx0QmKxI*mG@AF`JV$&8z zuEdr2(Zyj=N_U45s?2faK0Q`LuoNtWaH)Iw{+49JCID`5fjzqJoVAMI@)O!QwCg5vWi&aQRE?00000NkvXXu0mjf DF5LHS literal 0 HcmV?d00001 diff --git a/assets/03Idle26.png b/assets/03Idle26.png new file mode 100644 index 0000000000000000000000000000000000000000..908cb954ffb7c72482924b5f2bd4ea092e929653 GIT binary patch literal 561 zcmV-10?z%3P)Px$>q$gGR9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa5nqSKh7g!F%648Q;4DbZ%) zGmmIP2A#u*br8DmDGfP-AvWk7M#w>3mZIQ5Dm(rfOr!H@7Gi_WVZ=IUNpJ@^q+-@q zfN2>2Qb{sOa=T|0gEjLpuIt2`j4&hzy~B>`%Axqw`tl>JX$d_z&_k&5^bHgx?WP(i zd|V-iGsFg+!=AZX;w|A}AqVp|EH{QQx`TzDe?Ei~B9m^2q44uGUV-_Nymnxk=nxxp z4kMK4aYZe98beoyE5u;>q;?<2nmgfwgU(^-Q3vzk%HL;*X-qJLvzma_!PHYN#0I^? zj`Dm*2_aY=*wnuqEFKi02Bvi+jlnc5q+pt87Gi_WVK5)B4m3b1zo!0h21_N!`J;p+ zEaaNy(ow|G(fiV8oZKYr)t`NKQ`#e~l*tCU_D{&=$ zba7ae(%oT%Dsx=9Pmk3QECmZ8TPx$(Md!>R9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa77(KJT05L1+p{!fhI_g_4v zN-Pj<$e?i;u@1o%ij;;N&JY`P4kOk+9wuC#MG=Sj941JvK3pLO56(gBFqqF_4kRkrC{RRl8XGJQ Z0|1d1KsfB}W^e!i002ovPDHLkV1lbG;hX>f literal 0 HcmV?d00001 diff --git a/assets/03Idle28.png b/assets/03Idle28.png new file mode 100644 index 0000000000000000000000000000000000000000..b56e2451468197da908e85625f0b83bb958d2e1a GIT binary patch literal 513 zcmV+c0{;DpP)Px$yGcYrR9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa77(KI$1Vx)!usp^SNV~P^e z|A{gD{)?wXn~Bdnq74~vhY{-lLZL@#$YF%okat*@r6@Si%8tJV)9CyG3$a1xFqng8 zUFQLZRGQ`&Fb(71`EVa4`Q5XM!I~Ty*LC8}cqFH>0e9F@T{#q=T3>#IH7%hB2YLuq zp1y&iq}@~lg^w%baE92RbJ#OiOS~mKEaYI`hDB`%qdQpW`R79@Au{QP7z#g6;}w`M z$!iCui4L(r=P*JAE3T+TPh;rnaD^C5pVaQ-SaT;_aL_pnJ?daST>1M9q3RGUAI@q5 zreW%-7Gi_mVMlqsql6Hw4s7aQ4i*oJPy^G=a_Lw@l4c<`=o|*~{^~#jl=5rp4`;Ac za-2U(2;mAj^fU=eYq)YHuG|Q-44x|ot;5h04y^c)H;f=E{r<^z}miSj-LibzglgT-M05oazqY5$Yd00000NkvXXu0mjf DW}x4D literal 0 HcmV?d00001 diff --git a/assets/03Idle29.png b/assets/03Idle29.png new file mode 100644 index 0000000000000000000000000000000000000000..7f8016eca11f0e9bbf76ec525218f57785c3a869 GIT binary patch literal 520 zcmV+j0{8uiP)Px$!bwCyR9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa77(KJT$5L1+p{*TX+`!AkS zB^F3FWY9T`kb}@ekZKz!w5N~%Tg2^NM*-ggK2a=%|dL@IgD5bEeY-bhg8hk z3NQ`hUn)rk^Qj(UgWh3Bb>&bpn)T&JSkn@rg7cnL3|1wK>pJmfJPb)#hz&Z2J#)3h zTe8DK4i*gPxe+~tDo@`)39)ul4HQ1Eki!VELFX_+i5^$f!n_X)spp>$p@hh!8)7K@ zJdIaiz9g?5m?juvgU(^-Q3vzk%HL-QWjL^WII9VmhN(vnSzI9oGhAx-ajdzManL*L zD9?A45Q5c#P5sNk;z1E=U|L7g7$u}&nrIecgU(?vAFmEHKq{jg7?wM6Px$(Md!>R9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa77(KJT05L1+p{!fhI_g_4v zN-Pj<$e?i;u@1o%ij;;N&JY`P4kOk+9wuC#MG=Sj941JvK3pLO56(gBFqqF_4kRkrC{RRl8XGJQ Z0|1d1KsfB}W^e!i002ovPDHLkV1lbG;hX>f literal 0 HcmV?d00001 diff --git a/assets/03Idle30.png b/assets/03Idle30.png new file mode 100644 index 0000000000000000000000000000000000000000..a2478a86add83f870c2d8f7111e75a64af683737 GIT binary patch literal 542 zcmV+(0^$9MP)Px$*hxe|R9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa5nqSKh7g!F%648Q;4DbZ%) zGmmIP2A#u*br8DmDGfP-AvWk7M#w>3mZIQ5Dm(rfOr!H@7GgurVX%-{65Ig}shG7D zU>e51RFVwl(>=rn++ojLEm6uX>&uU@rX@mU+dZootV$Tyb>huw zbQE!_huENZ7R07*qoM6N<$g3nRwlK=n! literal 0 HcmV?d00001 diff --git a/assets/03Idle31.png b/assets/03Idle31.png new file mode 100644 index 0000000000000000000000000000000000000000..3231df4a3b9eb135b468a5d470495cc16bf4c7bd GIT binary patch literal 565 zcmV-50?Pe~P)Px$?@2^KR9Hu2WEiA?age%;Vbo!y#>{Al(JaIiC8YloWBC0SPpJ|ML>n^b97e2z z&_k2bkRupkL(XAcmZIQ5Dm(rfOr!G$EW`%PVYs3Y=Ab3P9pI3PSz7_7Vf;%a$tcN< z+>pbW#)hoJU}+0IH^M?RgwY*uvB$Ws6K}>NJH!UeVb5GGQA&F2%a5>z0D304XBC5@ zuJZH^6n?v@1_~cn$l(mJLFX`Z2cZWOu8@O;)br1WP_#_CA%?=w(|85uOY+)*X`(}H z&^e4y)pJx=4#nrVLJnOWt`LJ6Cbj!G*5m{i9CQvtk2;tSSN=XjO!JE&oYe%Z4yK-J zAvWk8c9iEkN(jLU(5C+7VDX>`H88CsX$+=eAqCS!vk)6}4uko4b)W%CNk8?6GgvA) z&L1TtVIkKnmyRNio+e>w4Ogzjl^bD(!gJ-Ibr^aUgcTq1h7ou}4wmMK%EAl`48*q2 z2(~T;t;1j;LCAqoaw%8?ZR6uD1Uo#~G!hK4LGLhh2g3MUx0QmKxI*mG@AF`JV$&8z zuEdr2(Zyj=N_U45s?2faK0Q`LuoNtWaH)Iw{+49JCID`5fjzqJoVAMI@)O!QwCg5vWi&aQRE?00000NkvXXu0mjf DF5LHS literal 0 HcmV?d00001 diff --git a/assets/03Idle32.png b/assets/03Idle32.png new file mode 100644 index 0000000000000000000000000000000000000000..908cb954ffb7c72482924b5f2bd4ea092e929653 GIT binary patch literal 561 zcmV-10?z%3P)Px$>q$gGR9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa5nqSKh7g!F%648Q;4DbZ%) zGmmIP2A#u*br8DmDGfP-AvWk7M#w>3mZIQ5Dm(rfOr!H@7Gi_WVZ=IUNpJ@^q+-@q zfN2>2Qb{sOa=T|0gEjLpuIt2`j4&hzy~B>`%Axqw`tl>JX$d_z&_k&5^bHgx?WP(i zd|V-iGsFg+!=AZX;w|A}AqVp|EH{QQx`TzDe?Ei~B9m^2q44uGUV-_Nymnxk=nxxp z4kMK4aYZe98beoyE5u;>q;?<2nmgfwgU(^-Q3vzk%HL;*X-qJLvzma_!PHYN#0I^? zj`Dm*2_aY=*wnuqEFKi02Bvi+jlnc5q+pt87Gi_WVK5)B4m3b1zo!0h21_N!`J;p+ zEaaNy(ow|G(fiV8oZKYr)t`NKQ`#e~l*tCU_D{&=$ zba7ae(%oT%Dsx=9Pmk3QECmZ8TPx$(Md!>R9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa77(KJT05L1+p{!fhI_g_4v zN-Pj<$e?i;u@1o%ij;;N&JY`P4kOk+9wuC#MG=Sj941JvK3pLO56(gBFqqF_4kRkrC{RRl8XGJQ Z0|1d1KsfB}W^e!i002ovPDHLkV1lbG;hX>f literal 0 HcmV?d00001 diff --git a/assets/03Idle34.png b/assets/03Idle34.png new file mode 100644 index 0000000000000000000000000000000000000000..086810e9953c1696ea14e2ab6d3209decdbe9a01 GIT binary patch literal 513 zcmV+c0{;DpP)Px$yGcYrR9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa77(KI$1Vx)!usp^SNV~P^e z|A{gD{)?wXn~Bdnq74~vhY{-lLZL@#$YF%okat*@r6@Si%8tJV)9CyG3$a1xFqngu z1b2W#DrRj3n1=B$l_aAizk60OSd$~;x=y?qkK{Bq;0`;gD~IA!>&uU@rX}>?Ko6nH z(>G9*w3}+6@NtD4&JY`P4twTmiMND@g&fS=u&51TbO#GP|9l7~L?+!3L*eIXyaMwj zdF{Y7(IGbI97d>M#TB*aX$)N*t`LLiliGb8Ywm;#4myXSM;*+ED}SFMR2_ol!&yzh zG)z6!LTu1G>?qH7ln{c|fld9(!Qw#?YGArqE*)z~(k#RVox@<>Uma+GQhrVS;S82a zj`K$eAzUGco+e>w4Ogzjl^bD}!E@!Hbr^cWffXO}h7m-C9I?5W*mfGurpKUj7_Ner zP{>8erGP{B((m(l%fFXj{(Px$!bwCyR9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa77(KJT$5L1+p{*TX+`!AkS zB^F3FWY9T`kb}@ekZKz!w5N~%Tg2^NM*-ggK2a=%|dL@IgD5bEeY-bhg8hk z3NQ`hUn)rk^Qj(UgWh3Bb>&bpn)T&JSkn@rg7cnL3|1wK>pJmfJPb)#hz&Z2J#)3h zTe8DK4i*gPxe+~tDo@`)39)ul4HQ1Eki!VELFX_+i5^$f!n_X)spp>$p@hh!8)7K@ zJdIaiz9g?5m?juvgU(^-Q3vzk%HL-QWjL^WII9VmhN(vnSzI9oGhAx-ajdzManL*L zD9?A45Q5c#P5sNk;z1E=U|L7g7$u}&nrIecgU(?vAFmEHKq{jg7?wM6Px$*hxe|R9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa5nqSKh7g!F%648Q;4DbZ%) zGmmIP2A#u*br8DmDGfP-AvWk7M#w>3mZIQ5Dm(rfOr!H@7GgurVX%-{65Ig}shG7D zU>e51RFVwl(>=rn++ojLEm6uX>&uU@rX@mU+dZootV$Tyb>huw zbQE!_huENZ7R07*qoM6N<$g3nRwlK=n! literal 0 HcmV?d00001 diff --git a/assets/03Idle4.png b/assets/03Idle4.png new file mode 100644 index 0000000000000000000000000000000000000000..b56e2451468197da908e85625f0b83bb958d2e1a GIT binary patch literal 513 zcmV+c0{;DpP)Px$yGcYrR9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa77(KI$1Vx)!usp^SNV~P^e z|A{gD{)?wXn~Bdnq74~vhY{-lLZL@#$YF%okat*@r6@Si%8tJV)9CyG3$a1xFqng8 zUFQLZRGQ`&Fb(71`EVa4`Q5XM!I~Ty*LC8}cqFH>0e9F@T{#q=T3>#IH7%hB2YLuq zp1y&iq}@~lg^w%baE92RbJ#OiOS~mKEaYI`hDB`%qdQpW`R79@Au{QP7z#g6;}w`M z$!iCui4L(r=P*JAE3T+TPh;rnaD^C5pVaQ-SaT;_aL_pnJ?daST>1M9q3RGUAI@q5 zreW%-7Gi_mVMlqsql6Hw4s7aQ4i*oJPy^G=a_Lw@l4c<`=o|*~{^~#jl=5rp4`;Ac za-2U(2;mAj^fU=eYq)YHuG|Q-44x|ot;5h04y^c)H;f=E{r<^z}miSj-LibzglgT-M05oazqY5$Yd00000NkvXXu0mjf DW}x4D literal 0 HcmV?d00001 diff --git a/assets/03Idle5.png b/assets/03Idle5.png new file mode 100644 index 0000000000000000000000000000000000000000..7f8016eca11f0e9bbf76ec525218f57785c3a869 GIT binary patch literal 520 zcmV+j0{8uiP)Px$!bwCyR9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa77(KJT$5L1+p{*TX+`!AkS zB^F3FWY9T`kb}@ekZKz!w5N~%Tg2^NM*-ggK2a=%|dL@IgD5bEeY-bhg8hk z3NQ`hUn)rk^Qj(UgWh3Bb>&bpn)T&JSkn@rg7cnL3|1wK>pJmfJPb)#hz&Z2J#)3h zTe8DK4i*gPxe+~tDo@`)39)ul4HQ1Eki!VELFX_+i5^$f!n_X)spp>$p@hh!8)7K@ zJdIaiz9g?5m?juvgU(^-Q3vzk%HL-QWjL^WII9VmhN(vnSzI9oGhAx-ajdzManL*L zD9?A45Q5c#P5sNk;z1E=U|L7g7$u}&nrIecgU(?vAFmEHKq{jg7?wM6Px$*hxe|R9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa5nqSKh7g!F%648Q;4DbZ%) zGmmIP2A#u*br8DmDGfP-AvWk7M#w>3mZIQ5Dm(rfOr!H@7GgurVX%-{65Ig}shG7D zU>e51RFVwl(>=rn++ojLEm6uX>&uU@rX@mU+dZootV$Tyb>huw zbQE!_huENZ7R07*qoM6N<$g3nRwlK=n! literal 0 HcmV?d00001 diff --git a/assets/03Idle7.png b/assets/03Idle7.png new file mode 100644 index 0000000000000000000000000000000000000000..3231df4a3b9eb135b468a5d470495cc16bf4c7bd GIT binary patch literal 565 zcmV-50?Pe~P)Px$?@2^KR9Hu2WEiA?age%;Vbo!y#>{Al(JaIiC8YloWBC0SPpJ|ML>n^b97e2z z&_k2bkRupkL(XAcmZIQ5Dm(rfOr!G$EW`%PVYs3Y=Ab3P9pI3PSz7_7Vf;%a$tcN< z+>pbW#)hoJU}+0IH^M?RgwY*uvB$Ws6K}>NJH!UeVb5GGQA&F2%a5>z0D304XBC5@ zuJZH^6n?v@1_~cn$l(mJLFX`Z2cZWOu8@O;)br1WP_#_CA%?=w(|85uOY+)*X`(}H z&^e4y)pJx=4#nrVLJnOWt`LJ6Cbj!G*5m{i9CQvtk2;tSSN=XjO!JE&oYe%Z4yK-J zAvWk8c9iEkN(jLU(5C+7VDX>`H88CsX$+=eAqCS!vk)6}4uko4b)W%CNk8?6GgvA) z&L1TtVIkKnmyRNio+e>w4Ogzjl^bD(!gJ-Ibr^aUgcTq1h7ou}4wmMK%EAl`48*q2 z2(~T;t;1j;LCAqoaw%8?ZR6uD1Uo#~G!hK4LGLhh2g3MUx0QmKxI*mG@AF`JV$&8z zuEdr2(Zyj=N_U45s?2faK0Q`LuoNtWaH)Iw{+49JCID`5fjzqJoVAMI@)O!QwCg5vWi&aQRE?00000NkvXXu0mjf DF5LHS literal 0 HcmV?d00001 diff --git a/assets/03Idle8.png b/assets/03Idle8.png new file mode 100644 index 0000000000000000000000000000000000000000..908cb954ffb7c72482924b5f2bd4ea092e929653 GIT binary patch literal 561 zcmV-10?z%3P)Px$>q$gGR9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa5nqSKh7g!F%648Q;4DbZ%) zGmmIP2A#u*br8DmDGfP-AvWk7M#w>3mZIQ5Dm(rfOr!H@7Gi_WVZ=IUNpJ@^q+-@q zfN2>2Qb{sOa=T|0gEjLpuIt2`j4&hzy~B>`%Axqw`tl>JX$d_z&_k&5^bHgx?WP(i zd|V-iGsFg+!=AZX;w|A}AqVp|EH{QQx`TzDe?Ei~B9m^2q44uGUV-_Nymnxk=nxxp z4kMK4aYZe98beoyE5u;>q;?<2nmgfwgU(^-Q3vzk%HL;*X-qJLvzma_!PHYN#0I^? zj`Dm*2_aY=*wnuqEFKi02Bvi+jlnc5q+pt87Gi_WVK5)B4m3b1zo!0h21_N!`J;p+ zEaaNy(ow|G(fiV8oZKYr)t`NKQ`#e~l*tCU_D{&=$ zba7ae(%oT%Dsx=9Pmk3QECmZ8TPx$(Md!>R9Hu2WEiA?age%;Vbo!y#>{AljfNPhAwa77(KJT05L1+p{!fhI_g_4v zN-Pj<$e?i;u@1o%ij;;N&JY`P4kOk+9wuC#MG=Sj941JvK3pLO56(gBFqqF_4kRkrC{RRl8XGJQ Z0|1d1KsfB}W^e!i002ovPDHLkV1lbG;hX>f literal 0 HcmV?d00001 diff --git a/assets/03Walk.png b/assets/03Walk.png new file mode 100644 index 0000000000000000000000000000000000000000..de79d575894855cb19503d33fe66afd036d2a68f GIT binary patch literal 557 zcmV+|0@D47P)Px$=Sf6CR9Hu2WEiA?age%;Vbo!y#thLRrYIr(pBTgMzj#WtnfS~j+K@r#Fk&5q z?t4l@j$nulIfr#wih={F?D%Uijm{si5F0Ru;fg|-gO&t$fI})~Z3UQy@h_Dmqa-(S zLk?#e8?p|Ar7iT_2n*2=Mt8i$9^<-Bycv(|5F0RuJ#)20De0{*Kf)RU=$YW2RSb%{ z%F{Pc`0b_|D12NYhcmo8a`aa30hZ?3`>a_IVSg&53msolr1CMOKRLF+JBRN@K|^k58UH318){Cx&Y(=5aW zy~AK30}DA=$lywNbPKUT=djg*1}G&ytm;8eOL(&^Qd+~6D{r7E(?9 z%fX%qicka7I+DgPx$=t)FDR9Hu2WEiA?age%;Vbo!y#>{Al(JaIiC8YloWBC0SPpJ|ML>n^b97e2z z&_k2bkRupkgU(@u9Mokg3J#>QpbW#&Ct$pm!K7ZK3BzYNa)@Lu|kt_RQ51rKGpM{0M8oj~+rWMfa>?@KzLz>pJlk zRX8OFox{)_gzjxzA%`oZDo@`)F{0g61BH((ef_;4H_jweb!_w6A z&xcUNC*2T3;pb_*0`nz#?Z7n2AvWk71}j*P>dK+`H1mcq3SX0f8HK;{_ZcuBT_3Ix zgK3u9eH?2B#1I^`4nt4;M|r-Zgbb`;4QDl>Z-@B`P=p%R5QK#su3U*LH^K}f*ybO!4uko?!Lt~pwUHd> zk2eI-(;iGQu`ODHAvWk8Rw3(;5@IKGRIr8^|CO6y@r{qS5bbGf1`(}!z#YcLBZ+s6 zLY#*Q>_POB|2o586p!zIe->+q!UVs4c}`jjcF;MDkb_`8g@qWd;CT7vAKs8cm&6rv w@ZcP@4ukoGSO=06ELap%J&jT7AYv0g0HvKiICAwIPyhe`07*qoM6N<$f>`SFxBvhE literal 0 HcmV?d00001 diff --git a/assets/03Walk2.png b/assets/03Walk2.png new file mode 100644 index 0000000000000000000000000000000000000000..85b187f8438639638e9f520378efe9488a869117 GIT binary patch literal 554 zcmV+_0@eMAP)Px${Al(JaIiC8YloWBC0SPpJ|ML>n^b97e2z z&_k2bkRupkgU(@u9Mokg3J#>QpbW#&Ct$pm!K7ZK3Bzn8QOD-SHNCjO#k_W<0V(Y``4$%+(U5q_@8O2x|zS=f-ZK@!*CT3M|I_}rY&3{hprx1h`|h%+I<{ra)JvET8E)WAuT-gXc>0 z5F0cObMPz%r?KQXf3Ty2BGkY%H=_jD@&2+tV0ldjX1vLbP%b96eFhJ)A>%Muu)snt zN-hN@qzHvv$K#CzJ39D+9%qOR8i&Cgf*z&BIuJc=5u289g&Ib14_b$D@koMmpP6kG z*fZ$46jxfql^b7v`G+-7zI}O4TAP2+ISl3?bnl7tFcDi#VpWGL#9)eXg&aIM2d%?k sKEUNbih>P`X0p>5wH<z%m4rY literal 0 HcmV?d00001 diff --git a/assets/03Walk3.png b/assets/03Walk3.png new file mode 100644 index 0000000000000000000000000000000000000000..a67f706213376fa0174853f3fa1d40847b9f0856 GIT binary patch literal 527 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 cRZqxa00pHOIJG@~07*qoM6N<$g6x#!W&i*H literal 0 HcmV?d00001 diff --git a/assets/NewSprite.png b/assets/NewSprite.png new file mode 100644 index 0000000000000000000000000000000000000000..002532562b5f835a54447e51d301fe59b579b832 GIT binary patch literal 315 zcmV-B0mS}^P)Px#^+`lQR9HvVmt7KtAP9wZGk5>%X*1oi85$#q1E}5Gi#-_U<44H4?PV`7K9vAI zwbYdyqBIJ`Y zJIYf4e5ysF5C+f&ix(mUVD)wngc|^ld zBRrS7CO@KL1ZIe9>9_&R6qg__04u~f#0iiYsnNS6P15sr95s~v?hDRuS1`7N>}3D| N002ovPDHLkV1l!^b};|| literal 0 HcmV?d00001 diff --git a/assets/NewSprite2.png b/assets/NewSprite2.png new file mode 100644 index 0000000000000000000000000000000000000000..185248b61e4ee588c4e6d80106c8d28cd67b9ce3 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}uAVNAArbCx zuW#gKP~c%Us4|*fP!u`gm*eRNHWN-nC(S)$I^#$Bfxe8^ichKu42(=H90Cds4PZtO h_ZGRsTGI8$#pgFIJy_VgdkxS)22WQ%mvv4FO#ns?D*ONd literal 0 HcmV?d00001 diff --git a/assets/NewSprite3.png b/assets/NewSprite3.png new file mode 100644 index 0000000000000000000000000000000000000000..8be35c107928f5d0baaa28ac38e637e193acc3ca GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}hMq2tArbCx zFE|P^FmN2+aCX1AP7{ya%BDE0lg~CvDL6DRFfy@l2tXP8Sox|SnI6n-;n)S#%;4$j K=d#Wzp$Pzsjvrb8 literal 0 HcmV?d00001 diff --git a/assets/NewSprite4.png b/assets/NewSprite4.png new file mode 100644 index 0000000000000000000000000000000000000000..f34f36fe1ef86181072462aec9134d8be07351ff GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}hMq2tArbCx zFBl3kFmN0(xM!=}=g8*0YQgj`SFR-+Iy5jaGO=(7C_ouC+%mmeoEbefrwRi#GkCiC KxvX@GSA20v_ literal 0 HcmV?d00001 diff --git a/assets/NewSprite6.png b/assets/NewSprite6.png new file mode 100644 index 0000000000000000000000000000000000000000..1c8a40b12bd5deea8ded70175927b26e4fc3bcd5 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}MxHK?ArbCx zFE|P^FmN0;SSBp}gI%&Fh;{Fhs%>)Jj7%&X0tyZd3{b{{=m!jQ3oIWd%UWy)>SpkC L^>bP0l+XkKU`ZZs literal 0 HcmV?d00001 diff --git a/assets/NewSprite7.png b/assets/NewSprite7.png new file mode 100644 index 0000000000000000000000000000000000000000..8962af91b14b9a0aa966d2342399a8baee851803 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}hMq2tArbCx zFBl3kFmN0(s5@+S%8|``)q?3?u3SqtbZB5;WMbhEP=GROxMhBxG*rB}{dWpbGlQqA KpUXO@geCx`fgp$g literal 0 HcmV?d00001