{ "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, "minDuration": 1.5, "progressBarColor": 16777215, "progressBarHeight": 20, "progressBarMaxWidth": 200, "progressBarMinWidth": 40, "progressBarWidthPercent": 30, "showGDevelopSplash": true, "showProgressBar": true }, "watermark": { "placement": "bottom-left", "showWatermark": true }, "authorIds": [], "authorUsernames": [], "categories": [], "playableDevices": [], "extensionProperties": [], "platforms": [ { "name": "GDevelop JS platform" } ], "currentPlatform": "GDevelop JS platform" }, "resources": { "resources": [ { "file": "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": 255, "disableInputWhenNotFocused": true, "mangledName": "Game", "name": "Game", "r": 247, "standardSortMethod": true, "stopSoundsOnStartup": true, "title": "", "v": 249, "uiSettings": { "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.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 } ], "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", "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, "camera3DFarPlaneDistance": 10000, "camera3DFieldOfView": 45, "camera3DNearPlaneDistance": 3, "cameraType": "", "followBaseLayerCamera": false, "isLightingLayer": false, "isLocked": false, "name": "", "renderingType": "", "visibility": true, "cameras": [ { "defaultSize": true, "defaultViewport": true, "height": 0, "viewportBottom": 1, "viewportLeft": 0, "viewportRight": 1, "viewportTop": 0, "width": 0 } ], "effects": [ { "effectType": "Scene3D::HemisphereLight", "name": "3D Ambient Hemisphere Light", "doubleParameters": { "elevation": 40, "intensity": 0.33, "rotation": 300 }, "stringParameters": { "groundColor": "127;127;127", "skyColor": "255;255;255", "top": "Z+" }, "booleanParameters": {} }, { "effectType": "Scene3D::DirectionalLight", "name": "3D Sun Light", "doubleParameters": { "distanceFromCamera": 1500, "elevation": 40, "frustumSize": 4000, "intensity": 0.75, "minimumShadowBias": 0, "rotation": 300 }, "stringParameters": { "color": "255;255;255", "shadowQuality": "medium", "top": "Z+" }, "booleanParameters": { "isCastingShadow": true } } ] }, { "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": [ { "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, "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" } } ] }