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 0000000..27d6358 Binary files /dev/null and b/TestRoom01.png differ diff --git a/TestRoom010.png b/TestRoom010.png new file mode 100644 index 0000000..0c915d4 Binary files /dev/null and b/TestRoom010.png differ diff --git a/TestRoom011.png b/TestRoom011.png new file mode 100644 index 0000000..6bc95b6 Binary files /dev/null and b/TestRoom011.png differ diff --git a/TestRoom012.png b/TestRoom012.png new file mode 100644 index 0000000..77ed853 Binary files /dev/null and b/TestRoom012.png differ diff --git a/TestRoom013.png b/TestRoom013.png new file mode 100644 index 0000000..8d48d6d Binary files /dev/null and b/TestRoom013.png differ diff --git a/TestRoom02.png b/TestRoom02.png new file mode 100644 index 0000000..1ecac04 Binary files /dev/null and b/TestRoom02.png differ diff --git a/TestRoom03.png b/TestRoom03.png new file mode 100644 index 0000000..7ccde44 Binary files /dev/null and b/TestRoom03.png differ diff --git a/TestRoom04.png b/TestRoom04.png new file mode 100644 index 0000000..0d5a380 Binary files /dev/null and b/TestRoom04.png differ diff --git a/TestRoom05.png b/TestRoom05.png new file mode 100644 index 0000000..95f56f6 Binary files /dev/null and b/TestRoom05.png differ diff --git a/TestRoom06.png b/TestRoom06.png new file mode 100644 index 0000000..9006d16 Binary files /dev/null and b/TestRoom06.png differ diff --git a/TestRoom07.png b/TestRoom07.png new file mode 100644 index 0000000..dbb979c Binary files /dev/null and b/TestRoom07.png differ diff --git a/TestRoom08.png b/TestRoom08.png new file mode 100644 index 0000000..647143c Binary files /dev/null and b/TestRoom08.png differ diff --git a/TestRoom09.png b/TestRoom09.png new file mode 100644 index 0000000..972b5c0 Binary files /dev/null and b/TestRoom09.png differ diff --git a/TestRoom10.png b/TestRoom10.png new file mode 100644 index 0000000..fe6b712 Binary files /dev/null and b/TestRoom10.png differ diff --git a/TestRoom11.png b/TestRoom11.png new file mode 100644 index 0000000..3b2dcd4 Binary files /dev/null and b/TestRoom11.png differ diff --git a/TestRoom12.png b/TestRoom12.png new file mode 100644 index 0000000..8a483c4 Binary files /dev/null and b/TestRoom12.png differ diff --git a/TestRoom13.png b/TestRoom13.png new file mode 100644 index 0000000..f48861f Binary files /dev/null and b/TestRoom13.png differ diff --git a/TestRoom4Way.png b/TestRoom4Way.png new file mode 100644 index 0000000..d3701d0 Binary files /dev/null and b/TestRoom4Way.png differ diff --git a/TestRoomDeadD.png b/TestRoomDeadD.png new file mode 100644 index 0000000..791ebe0 Binary files /dev/null and b/TestRoomDeadD.png differ diff --git a/TestRoomDeadL.png b/TestRoomDeadL.png new file mode 100644 index 0000000..45936bb Binary files /dev/null and b/TestRoomDeadL.png differ diff --git a/TestRoomDeadR.png b/TestRoomDeadR.png new file mode 100644 index 0000000..962cfe8 Binary files /dev/null and b/TestRoomDeadR.png differ diff --git a/TestRoomDeadU.png b/TestRoomDeadU.png new file mode 100644 index 0000000..c720a75 Binary files /dev/null and b/TestRoomDeadU.png differ diff --git a/TestRoomLR.png b/TestRoomLR.png new file mode 100644 index 0000000..79132a9 Binary files /dev/null and b/TestRoomLR.png differ diff --git a/TestRoomUD.png b/TestRoomUD.png new file mode 100644 index 0000000..5bc199f Binary files /dev/null and b/TestRoomUD.png differ diff --git a/Tile Dungeon2x.png b/Tile Dungeon2x.png new file mode 100644 index 0000000..7a8ac4e Binary files /dev/null and b/Tile Dungeon2x.png differ diff --git a/assets/03Idle.png b/assets/03Idle.png new file mode 100644 index 0000000..3231df4 Binary files /dev/null and b/assets/03Idle.png differ diff --git a/assets/03Idle10.png b/assets/03Idle10.png new file mode 100644 index 0000000..086810e Binary files /dev/null and b/assets/03Idle10.png differ diff --git a/assets/03Idle11.png b/assets/03Idle11.png new file mode 100644 index 0000000..7f8016e Binary files /dev/null and b/assets/03Idle11.png differ diff --git a/assets/03Idle12.png b/assets/03Idle12.png new file mode 100644 index 0000000..a2478a8 Binary files /dev/null and b/assets/03Idle12.png differ diff --git a/assets/03Idle13.png b/assets/03Idle13.png new file mode 100644 index 0000000..3231df4 Binary files /dev/null and b/assets/03Idle13.png differ diff --git a/assets/03Idle14.png b/assets/03Idle14.png new file mode 100644 index 0000000..908cb95 Binary files /dev/null and b/assets/03Idle14.png differ diff --git a/assets/03Idle15.png b/assets/03Idle15.png new file mode 100644 index 0000000..1de3c7f Binary files /dev/null and b/assets/03Idle15.png differ diff --git a/assets/03Idle16.png b/assets/03Idle16.png new file mode 100644 index 0000000..b56e245 Binary files /dev/null and b/assets/03Idle16.png differ diff --git a/assets/03Idle17.png b/assets/03Idle17.png new file mode 100644 index 0000000..7f8016e Binary files /dev/null and b/assets/03Idle17.png differ diff --git a/assets/03Idle18.png b/assets/03Idle18.png new file mode 100644 index 0000000..a2478a8 Binary files /dev/null and b/assets/03Idle18.png differ diff --git a/assets/03Idle19.png b/assets/03Idle19.png new file mode 100644 index 0000000..3231df4 Binary files /dev/null and b/assets/03Idle19.png differ diff --git a/assets/03Idle2.png b/assets/03Idle2.png new file mode 100644 index 0000000..908cb95 Binary files /dev/null and b/assets/03Idle2.png differ diff --git a/assets/03Idle20.png b/assets/03Idle20.png new file mode 100644 index 0000000..908cb95 Binary files /dev/null and b/assets/03Idle20.png differ diff --git a/assets/03Idle21.png b/assets/03Idle21.png new file mode 100644 index 0000000..1de3c7f Binary files /dev/null and b/assets/03Idle21.png differ diff --git a/assets/03Idle22.png b/assets/03Idle22.png new file mode 100644 index 0000000..086810e Binary files /dev/null and b/assets/03Idle22.png differ diff --git a/assets/03Idle23.png b/assets/03Idle23.png new file mode 100644 index 0000000..7f8016e Binary files /dev/null and b/assets/03Idle23.png differ diff --git a/assets/03Idle24.png b/assets/03Idle24.png new file mode 100644 index 0000000..a2478a8 Binary files /dev/null and b/assets/03Idle24.png differ diff --git a/assets/03Idle25.png b/assets/03Idle25.png new file mode 100644 index 0000000..3231df4 Binary files /dev/null and b/assets/03Idle25.png differ diff --git a/assets/03Idle26.png b/assets/03Idle26.png new file mode 100644 index 0000000..908cb95 Binary files /dev/null and b/assets/03Idle26.png differ diff --git a/assets/03Idle27.png b/assets/03Idle27.png new file mode 100644 index 0000000..1de3c7f Binary files /dev/null and b/assets/03Idle27.png differ diff --git a/assets/03Idle28.png b/assets/03Idle28.png new file mode 100644 index 0000000..b56e245 Binary files /dev/null and b/assets/03Idle28.png differ diff --git a/assets/03Idle29.png b/assets/03Idle29.png new file mode 100644 index 0000000..7f8016e Binary files /dev/null and b/assets/03Idle29.png differ diff --git a/assets/03Idle3.png b/assets/03Idle3.png new file mode 100644 index 0000000..1de3c7f Binary files /dev/null and b/assets/03Idle3.png differ diff --git a/assets/03Idle30.png b/assets/03Idle30.png new file mode 100644 index 0000000..a2478a8 Binary files /dev/null and b/assets/03Idle30.png differ diff --git a/assets/03Idle31.png b/assets/03Idle31.png new file mode 100644 index 0000000..3231df4 Binary files /dev/null and b/assets/03Idle31.png differ diff --git a/assets/03Idle32.png b/assets/03Idle32.png new file mode 100644 index 0000000..908cb95 Binary files /dev/null and b/assets/03Idle32.png differ diff --git a/assets/03Idle33.png b/assets/03Idle33.png new file mode 100644 index 0000000..1de3c7f Binary files /dev/null and b/assets/03Idle33.png differ diff --git a/assets/03Idle34.png b/assets/03Idle34.png new file mode 100644 index 0000000..086810e Binary files /dev/null and b/assets/03Idle34.png differ diff --git a/assets/03Idle35.png b/assets/03Idle35.png new file mode 100644 index 0000000..7f8016e Binary files /dev/null and b/assets/03Idle35.png differ diff --git a/assets/03Idle36.png b/assets/03Idle36.png new file mode 100644 index 0000000..a2478a8 Binary files /dev/null and b/assets/03Idle36.png differ diff --git a/assets/03Idle4.png b/assets/03Idle4.png new file mode 100644 index 0000000..b56e245 Binary files /dev/null and b/assets/03Idle4.png differ diff --git a/assets/03Idle5.png b/assets/03Idle5.png new file mode 100644 index 0000000..7f8016e Binary files /dev/null and b/assets/03Idle5.png differ diff --git a/assets/03Idle6.png b/assets/03Idle6.png new file mode 100644 index 0000000..a2478a8 Binary files /dev/null and b/assets/03Idle6.png differ diff --git a/assets/03Idle7.png b/assets/03Idle7.png new file mode 100644 index 0000000..3231df4 Binary files /dev/null and b/assets/03Idle7.png differ diff --git a/assets/03Idle8.png b/assets/03Idle8.png new file mode 100644 index 0000000..908cb95 Binary files /dev/null and b/assets/03Idle8.png differ diff --git a/assets/03Idle9.png b/assets/03Idle9.png new file mode 100644 index 0000000..1de3c7f Binary files /dev/null and b/assets/03Idle9.png differ diff --git a/assets/03Walk.png b/assets/03Walk.png new file mode 100644 index 0000000..de79d57 Binary files /dev/null and b/assets/03Walk.png differ diff --git a/assets/03Walk10.png b/assets/03Walk10.png new file mode 100644 index 0000000..29d72f1 Binary files /dev/null and b/assets/03Walk10.png differ diff --git a/assets/03Walk2.png b/assets/03Walk2.png new file mode 100644 index 0000000..85b187f Binary files /dev/null and b/assets/03Walk2.png differ diff --git a/assets/03Walk3.png b/assets/03Walk3.png new file mode 100644 index 0000000..a67f706 Binary files /dev/null and b/assets/03Walk3.png differ diff --git a/assets/03Walk4.png b/assets/03Walk4.png new file mode 100644 index 0000000..5c3fdc2 Binary files /dev/null and b/assets/03Walk4.png differ diff --git a/assets/03Walk5.png b/assets/03Walk5.png new file mode 100644 index 0000000..307e023 Binary files /dev/null and b/assets/03Walk5.png differ diff --git a/assets/03Walk6.png b/assets/03Walk6.png new file mode 100644 index 0000000..86bd386 Binary files /dev/null and b/assets/03Walk6.png differ diff --git a/assets/03Walk7.png b/assets/03Walk7.png new file mode 100644 index 0000000..16a176a Binary files /dev/null and b/assets/03Walk7.png differ diff --git a/assets/03Walk8.png b/assets/03Walk8.png new file mode 100644 index 0000000..511dc34 Binary files /dev/null and b/assets/03Walk8.png differ diff --git a/assets/03Walk9.png b/assets/03Walk9.png new file mode 100644 index 0000000..112582d Binary files /dev/null and b/assets/03Walk9.png differ diff --git a/assets/NewSprite.png b/assets/NewSprite.png new file mode 100644 index 0000000..0025325 Binary files /dev/null and b/assets/NewSprite.png differ diff --git a/assets/NewSprite2.png b/assets/NewSprite2.png new file mode 100644 index 0000000..185248b Binary files /dev/null and b/assets/NewSprite2.png differ diff --git a/assets/NewSprite3.png b/assets/NewSprite3.png new file mode 100644 index 0000000..8be35c1 Binary files /dev/null and b/assets/NewSprite3.png differ diff --git a/assets/NewSprite4.png b/assets/NewSprite4.png new file mode 100644 index 0000000..f34f36f Binary files /dev/null and b/assets/NewSprite4.png differ diff --git a/assets/NewSprite5.png b/assets/NewSprite5.png new file mode 100644 index 0000000..03b7981 Binary files /dev/null and b/assets/NewSprite5.png differ diff --git a/assets/NewSprite6.png b/assets/NewSprite6.png new file mode 100644 index 0000000..1c8a40b Binary files /dev/null and b/assets/NewSprite6.png differ diff --git a/assets/NewSprite7.png b/assets/NewSprite7.png new file mode 100644 index 0000000..8962af9 Binary files /dev/null and b/assets/NewSprite7.png differ