From e9a66c6f3df4100ab6a1a8209e93c37bf5f3b380 Mon Sep 17 00:00:00 2001 From: Aurora Aquir Date: Mon, 18 Sep 2023 20:07:10 +0200 Subject: [PATCH 1/3] Attempt at better loenn support --- .vscode/settings.json | 12 + Loenn/entities/fancy_condition_block.lua | 7 + Loenn/entities/fancy_coverup_wall.lua | 10 + .../entities/fancy_crumble_wall_on_rumble.lua | 11 + Loenn/entities/fancy_dash_block.lua | 11 + Loenn/entities/fancy_exit_block.lua | 11 + Loenn/entities/fancy_fake_wall.lua | 11 + Loenn/entities/fancy_falling_block.lua | 15 ++ .../fancy_final_boss_moving_block.lua | 16 +- Loenn/entities/fancy_floaty_space_block.lua | 10 + Loenn/entities/fancy_intro_crusher.lua | 10 + Loenn/entities/fancy_ridge_gate.lua | 15 +- Loenn/entities/fancy_solid_tiles.lua | 13 +- Loenn/lang/en_gb.lang | 16 +- .../libraries/fancy_tile_entities_helper.lua | 49 ++++ .../fancy_tile_entities_button_field.lua | 182 +++++++++++++++ .../ui/widgets/fancy_tile_entities_editor.lua | 216 ++++++++++++++++++ 17 files changed, 602 insertions(+), 13 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 Loenn/libraries/fancy_tile_entities_helper.lua create mode 100644 Loenn/ui/forms/fields/fancy_tile_entities_button_field.lua create mode 100644 Loenn/ui/widgets/fancy_tile_entities_editor.lua diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..fe91e68 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,12 @@ +{ + "Lua.runtime.version": "LuaJIT", + "Lua.runtime.special": { + "love.filesystem.load": "loadfile" + }, + "Lua.workspace.library": [ + "${3rd}/love2d/library" + ], + "Lua.diagnostics.disable": [ + "unused-function" + ] +} \ No newline at end of file diff --git a/Loenn/entities/fancy_condition_block.lua b/Loenn/entities/fancy_condition_block.lua index 0716057..df021e2 100644 --- a/Loenn/entities/fancy_condition_block.lua +++ b/Loenn/entities/fancy_condition_block.lua @@ -1,4 +1,7 @@ local enums = require("consts.celeste_enums") +local mods = require("mods") +local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_entities_helper") + local conditionBlock = {} @@ -18,7 +21,11 @@ conditionBlock.placements = { conditionBlock.fieldInformation = { condition = { options = enums.condition_block_conditions + }, + tileData = { + fieldType = "FancyTileEntities.buttonStringField" } } +conditionBlock.sprite = fancyTileEntitieshelper.getEntitySpriteFunction("blendEdges", "tilesFg", {1, 1, 1, 1}) return conditionBlock \ No newline at end of file diff --git a/Loenn/entities/fancy_coverup_wall.lua b/Loenn/entities/fancy_coverup_wall.lua index 8ecb4d8..d1b1667 100644 --- a/Loenn/entities/fancy_coverup_wall.lua +++ b/Loenn/entities/fancy_coverup_wall.lua @@ -1,4 +1,6 @@ local coverupWall = {} +local mods = require("mods") +local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_entities_helper") coverupWall.name = "FancyTileEntities/FancyCoverupWall" coverupWall.depth = -13000 @@ -12,4 +14,12 @@ coverupWall.placements = { } } +coverupWall.fieldInformation = { + tileData = { + fieldType = "FancyTileEntities.buttonStringField" + } +} + +coverupWall.sprite = fancyTileEntitieshelper.getEntitySpriteFunction("blendEdges", "tilesFg", {1, 1, 1, 1}) + return coverupWall \ No newline at end of file diff --git a/Loenn/entities/fancy_crumble_wall_on_rumble.lua b/Loenn/entities/fancy_crumble_wall_on_rumble.lua index b8d951b..ce49834 100644 --- a/Loenn/entities/fancy_crumble_wall_on_rumble.lua +++ b/Loenn/entities/fancy_crumble_wall_on_rumble.lua @@ -1,5 +1,8 @@ local crumbleWall = {} +local mods = require("mods") +local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_entities_helper") + crumbleWall.name = "FancyTileEntities/FancyCrumbleWallOnRumble" crumbleWall.placements = { name = "crumble_wall", @@ -16,4 +19,12 @@ function crumbleWall.depth(room, entity) return entity.blendin and -10501 or -12999 end +crumbleWall.fieldInformation = { + tileData = { + fieldType = "FancyTileEntities.buttonStringField" + } +} + +crumbleWall.sprite = fancyTileEntitieshelper.getEntitySpriteFunction("blendEdges", "tilesFg", {1, 1, 1, 1}) + return crumbleWall \ No newline at end of file diff --git a/Loenn/entities/fancy_dash_block.lua b/Loenn/entities/fancy_dash_block.lua index 25c10ce..ecaf6ca 100644 --- a/Loenn/entities/fancy_dash_block.lua +++ b/Loenn/entities/fancy_dash_block.lua @@ -1,5 +1,8 @@ local dashBlock = {} +local mods = require("mods") +local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_entities_helper") + dashBlock.name = "FancyTileEntities/FancyDashBlock" dashBlock.depth = 0 dashBlock.placements = { @@ -14,4 +17,12 @@ dashBlock.placements = { } } +dashBlock.fieldInformation = { + tileData = { + fieldType = "FancyTileEntities.buttonStringField" + } +} + +dashBlock.sprite = fancyTileEntitieshelper.getEntitySpriteFunction("blendEdges", "tilesFg", {1, 1, 1, 1}) + return dashBlock \ No newline at end of file diff --git a/Loenn/entities/fancy_exit_block.lua b/Loenn/entities/fancy_exit_block.lua index 6bcd7b5..1737fde 100644 --- a/Loenn/entities/fancy_exit_block.lua +++ b/Loenn/entities/fancy_exit_block.lua @@ -1,5 +1,8 @@ local exitBlock = {} +local mods = require("mods") +local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_entities_helper") + exitBlock.name = "FancyTileEntities/FancyExitBlock" exitBlock.depth = -13000 exitBlock.placements = { @@ -12,4 +15,12 @@ exitBlock.placements = { } } +exitBlock.fieldInformation = { + tileData = { + fieldType = "FancyTileEntities.buttonStringField" + } +} + +exitBlock.sprite = fancyTileEntitieshelper.getEntitySpriteFunction("blendEdges", "tilesFg", {1, 1, 1, 1}) + return exitBlock \ No newline at end of file diff --git a/Loenn/entities/fancy_fake_wall.lua b/Loenn/entities/fancy_fake_wall.lua index f520618..df8335f 100644 --- a/Loenn/entities/fancy_fake_wall.lua +++ b/Loenn/entities/fancy_fake_wall.lua @@ -1,5 +1,8 @@ local fakeWall = {} +local mods = require("mods") +local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_entities_helper") + fakeWall.name = "FancyTileEntities/FancyFakeWall" fakeWall.depth = -13000 fakeWall.placements = { @@ -11,4 +14,12 @@ fakeWall.placements = { } } +fakeWall.fieldInformation = { + tileData = { + fieldType = "FancyTileEntities.buttonStringField" + } +} + +fakeWall.sprite = fancyTileEntitieshelper.getEntitySpriteFunction("blendEdges", "tilesFg", {1, 1, 1, 1}) + return fakeWall \ No newline at end of file diff --git a/Loenn/entities/fancy_falling_block.lua b/Loenn/entities/fancy_falling_block.lua index c9ca537..67164c2 100644 --- a/Loenn/entities/fancy_falling_block.lua +++ b/Loenn/entities/fancy_falling_block.lua @@ -1,3 +1,6 @@ +local mods = require("mods") +local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_entities_helper") + local fallingBlock = {} fallingBlock.name = "FancyTileEntities/FancyFallingBlock" @@ -27,6 +30,18 @@ fallingBlock.placements = { } } + +fallingBlock.fieldInformation = { + tileData = { + fieldType = "FancyTileEntities.buttonStringField" + }, + tileDataHighlight = { + fieldType = "FancyTileEntities.buttonStringField" + } +} + +fallingBlock.sprite = fancyTileEntitieshelper.getEntitySpriteFunction("blendEdges", "tilesFg", {1, 1, 1, 1}) + fallingBlock.ignoredFields = { "finalBoss" } diff --git a/Loenn/entities/fancy_final_boss_moving_block.lua b/Loenn/entities/fancy_final_boss_moving_block.lua index 296e799..770d880 100644 --- a/Loenn/entities/fancy_final_boss_moving_block.lua +++ b/Loenn/entities/fancy_final_boss_moving_block.lua @@ -1,6 +1,8 @@ local utils = require("utils") local movingBlock = {} +local mods = require("mods") +local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_entities_helper") movingBlock.name = "FancyTileEntities/FancyFinalBossMovingBlock" movingBlock.depth = 0 @@ -22,8 +24,16 @@ movingBlock.placements = { } } -function movingBlock.nodeRectangle(room, entity, node) - return utils.rectangle(node.x or 0, node.y or 0, entity.width or 8, entity.height or 8) -end +movingBlock.fieldInformation = { + tileData = { + fieldType = "FancyTileEntities.buttonStringField" + }, + tileDataHighlight = { + fieldType = "FancyTileEntities.buttonStringField" + } +} + +movingBlock.sprite = fancyTileEntitieshelper.getEntitySpriteFunction("blendEdges", "tilesFg", {1, 1, 1, 1}) + return movingBlock \ No newline at end of file diff --git a/Loenn/entities/fancy_floaty_space_block.lua b/Loenn/entities/fancy_floaty_space_block.lua index 4aaa0c1..1c62e17 100644 --- a/Loenn/entities/fancy_floaty_space_block.lua +++ b/Loenn/entities/fancy_floaty_space_block.lua @@ -1,4 +1,6 @@ local fakeTilesHelper = require("helpers.fake_tiles") +local mods = require("mods") +local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_entities_helper") local floatySpaceBlock = {} @@ -16,6 +18,14 @@ floatySpaceBlock.placements = { } } +floatySpaceBlock.fieldInformation = { + tileData = { + fieldType = "FancyTileEntities.buttonStringField" + } +} + +floatySpaceBlock.sprite = fancyTileEntitieshelper.getEntitySpriteFunction("blendEdges", "tilesFg", {1, 1, 1, 1}) + floatySpaceBlock.fieldInformation = fakeTilesHelper.getFieldInformation("connectsTo") return floatySpaceBlock \ No newline at end of file diff --git a/Loenn/entities/fancy_intro_crusher.lua b/Loenn/entities/fancy_intro_crusher.lua index 67f8b4e..0817b09 100644 --- a/Loenn/entities/fancy_intro_crusher.lua +++ b/Loenn/entities/fancy_intro_crusher.lua @@ -1,4 +1,6 @@ local introCrusher = {} +local mods = require("mods") +local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_entities_helper") introCrusher.name = "FancyTileEntities/FancyIntroCrusher" introCrusher.depth = 0 @@ -16,4 +18,12 @@ introCrusher.placements = { } } +introCrusher.fieldInformation = { + tileData = { + fieldType = "FancyTileEntities.buttonStringField" + } +} + +introCrusher.sprite = fancyTileEntitieshelper.getEntitySpriteFunction("blendEdges", "tilesFg", {1, 1, 1, 1}) + return introCrusher \ No newline at end of file diff --git a/Loenn/entities/fancy_ridge_gate.lua b/Loenn/entities/fancy_ridge_gate.lua index fe5baca..737d089 100644 --- a/Loenn/entities/fancy_ridge_gate.lua +++ b/Loenn/entities/fancy_ridge_gate.lua @@ -1,4 +1,6 @@ local ridgeGate = {} +local mods = require("mods") +local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_entities_helper") ridgeGate.name = "FancyTileEntities/FancyRidgeGate" ridgeGate.depth = 0 @@ -8,8 +10,19 @@ ridgeGate.placements = { name = "ridge_gate", data = { tileData = "", - flag = "" + flag = "", + width = 8, + height = 8 } } +ridgeGate.fieldInformation = { + tileData = { + fieldType = "FancyTileEntities.buttonStringField" + } +} + +ridgeGate.sprite = fancyTileEntitieshelper.getEntitySpriteFunction("blendEdges", "tilesFg", {1, 1, 1, 1}) + + return ridgeGate \ No newline at end of file diff --git a/Loenn/entities/fancy_solid_tiles.lua b/Loenn/entities/fancy_solid_tiles.lua index c7de824..38d45ef 100644 --- a/Loenn/entities/fancy_solid_tiles.lua +++ b/Loenn/entities/fancy_solid_tiles.lua @@ -1,10 +1,13 @@ +local mods = require("mods") +local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_entities_helper") + local solidTiles = {} solidTiles.name = "FancyTileEntities/FancySolidTiles" solidTiles.placements = { name = "solid_tiles", data = { - tileData = "", + tileData = "0", randomSeed = 0, blendEdges = true, width = 8, @@ -12,4 +15,12 @@ solidTiles.placements = { } } +solidTiles.fieldInformation = { + tileData = { + fieldType = "FancyTileEntities.buttonStringField" + } +} + +solidTiles.sprite = fancyTileEntitieshelper.getEntitySpriteFunction("blendEdges", "tilesFg", {1, 1, 1, 1}) + return solidTiles \ No newline at end of file diff --git a/Loenn/lang/en_gb.lang b/Loenn/lang/en_gb.lang index 271068e..a943c3b 100644 --- a/Loenn/lang/en_gb.lang +++ b/Loenn/lang/en_gb.lang @@ -5,18 +5,18 @@ mods.FancyTileEntities.name=Fancy Tile Entities entities.FancyTileEntities/FancyConditionBlock.placements.name.condition_block=Fancy Condition Block entities.FancyTileEntities/FancyConditionBlock.attributes.description.conditionID=Links the condition block to the ID of a key, strawberry, or button.\nFormat: (room:id)\nExample: "a-01:4" entities.FancyTileEntities/FancyConditionBlock.attributes.description.condition=Ties the activation to the collection or activation of a key, strawberry, or button. -entities.FancyTileEntities/FancyConditionBlock.attributes.description.tileData=A {width} by {height} grid of characters that correspond to tileset IDs.\nEach row should be separated by a newline character. +entities.FancyTileEntities/FancyConditionBlock.attributes.description.tileData=A {width} by {height} grid of characters that correspond to tileset IDs.\nEach row should be separated by a newline character.\nYou may also paste a selection of foreground tiles into this field. # Fancy Crumble Wall On Rumble entities.FancyTileEntities/FancyCrumbleWallOnRumble.placements.name.crumble_wall=Fancy Crumble Wall On Rumble entities.FancyTileEntities/FancyCrumbleWallOnRumble.attributes.description.blendin=Blends the block in with the walls it touches, making it less apparent. -entities.FancyTileEntities/FancyCrumbleWallOnRumble.attributes.description.tileData=A {width} by {height} grid of characters that correspond to tileset IDs.\nEach row should be separated by a newline character. +entities.FancyTileEntities/FancyCrumbleWallOnRumble.attributes.description.tileData=A {width} by {height} grid of characters that correspond to tileset IDs.\nEach row should be separated by a newline character.\nYou may also paste a selection of foreground tiles into this field. entities.FancyTileEntities/FancyCrumbleWallOnRumble.attributes.description.persistent=Once broken, the block will remain that way, even if the player dies. # Fancy Dash Block entities.FancyTileEntities/FancyDashBlock.placements.name.dash_block=Fancy Dash Block entities.FancyTileEntities/FancyDashBlock.attributes.description.blendin=Blends the block in with the walls it touches, making it less apparent. -entities.FancyTileEntities/FancyDashBlock.attributes.description.tileData=A {width} by {height} grid of characters that correspond to tileset IDs.\nEach row should be separated by a newline character. +entities.FancyTileEntities/FancyDashBlock.attributes.description.tileData=A {width} by {height} grid of characters that correspond to tileset IDs.\nEach row should be separated by a newline character.\nYou may also paste a selection of foreground tiles into this field. entities.FancyTileEntities/FancyDashBlock.attributes.description.persistent=Once broken, the block will remain that way, even if the player dies. # Fancy Exit Block @@ -33,19 +33,19 @@ entities.FancyTileEntities/FancyFakeWall.attributes.description.tileData=$tileDa entities.FancyTileEntities/FancyFallingBlock.placements.name.falling_block=Fancy Falling Block entities.FancyTileEntities/FancyFallingBlock.attributes.description.climbFall=After a delay, the block will physically fall down until it comes into contact with another block. entities.FancyTileEntities/FancyFallingBlock.attributes.description.behind=Whether the block should visually be further behind in the scene or not. -entities.FancyTileEntities/FancyFallingBlock.attributes.description.tileData=A {width} by {height} grid of characters that correspond to tileset IDs.\nEach row should be separated by a newline character. +entities.FancyTileEntities/FancyFallingBlock.attributes.description.tileData=A {width} by {height} grid of characters that correspond to tileset IDs.\nEach row should be separated by a newline character.\nYou may also paste a selection of foreground tiles into this field. entities.FancyTileEntities/FancyFallingBlock.attributes.description.tileDataHighlight=Tile Data used while the block is moving. entities.FancyTileEntities/FancyFallingBlock.attributes.description.manualTrigger=For use with an EntityTrigger. # Badeline Boss Moving Block entities.FancyTileEntities/FancyFinalBossMovingBlock.placements.name.moving_block=Fancy Final Boss Moving Block entities.FancyTileEntities/FancyFinalBossMovingBlock.attributes.description.nodeIndex=The node index of the Badeline boss this should fall down on. -entities.FancyTileEntities/FancyFinalBossMovingBlock.attributes.description.tileData=A {width} by {height} grid of characters that correspond to tileset IDs.\nEach row should be separated by a newline character. +entities.FancyTileEntities/FancyFinalBossMovingBlock.attributes.description.tileData=A {width} by {height} grid of characters that correspond to tileset IDs.\nEach row should be separated by a newline character.\nYou may also paste a selection of foreground tiles into this field. entities.FancyTileEntities/FancyFinalBossMovingBlock.attributes.description.tileDataHighlight=Tile Data used while the block is moving. # Floaty Space Block entities.FancyTileEntities/FancyFloatySpaceBlock.placements.name.floaty_space_block=Fancy Floaty Space Block -entities.FancyTileEntities/FancyFloatySpaceBlock.attributes.description.tileData=A {width} by {height} grid of characters that correspond to tileset IDs.\nEach row should be separated by a newline character. +entities.FancyTileEntities/FancyFloatySpaceBlock.attributes.description.tileData=A {width} by {height} grid of characters that correspond to tileset IDs.\nEach row should be separated by a newline character.\nYou may also paste a selection of foreground tiles into this field. entities.FancyTileEntities/FancyFloatySpaceBlock.attributes.description.connectsTo=Blocks with the same connect index will connect to eachother. entities.FancyTileEntities/FancyFloatySpaceBlock.attributes.description.disableSpawnOffset=Whether or not the entity should spawn without the random offset. entities.FancyTileEntities/FancyFloatySpaceBlock.attributes.description.randomSeed=The seed used to select the random textures. 0 will use a random seed.\nOnly compatible with non-grouped blocks. @@ -60,13 +60,13 @@ entities.FancyTileEntities/BetterIntroCrusher.attributes.description.tiletype=De entities.FancyTileEntities/FancyIntroCrusher.placements.name.intro_crusher=Fancy Intro Crusher entities.FancyTileEntities/FancyIntroCrusher.attributes.description.flags=If any of the flags are set, the entity will rest at its end node instead. entities.FancyTileEntities/FancyIntroCrusher.attributes.description.manualTrigger=For use with an EntityTrigger. -entities.FancyTileEntities/FancyIntroCrusher.attributes.description.tileData=A {width} by {height} grid of characters that correspond to tileset IDs.\nEach row should be separated by a newline character. +entities.FancyTileEntities/FancyIntroCrusher.attributes.description.tileData=A {width} by {height} grid of characters that correspond to tileset IDs.\nEach row should be separated by a newline character.\nYou may also paste a selection of foreground tiles into this field. # Solid Tiles entities.FancyTileEntities/FancySolidTiles.placements.name.solid_tiles=Fancy Solid Tiles entities.FancyTileEntities/FancySolidTiles.attributes.description.blendEdges=Blends the block in with the walls it touches. entities.FancyTileEntities/FancySolidTiles.attributes.description.randomSeed=The seed used to select the random textures. 0 will use a random seed. -entities.FancyTileEntities/FancySolidTiles.attributes.description.tileData=A {width} by {height} grid of characters that correspond to tileset IDs.\nEach row should be separated by a newline character. +entities.FancyTileEntities/FancySolidTiles.attributes.description.tileData=A {width} by {height} grid of characters that correspond to tileset IDs.\nEach row should be separated by a newline character.\nYou may also paste a selection of foreground tiles into this field. # Ridge Gate entities.FancyTileEntities/FancyRidgeGate.placements.name.ridge_gate=Fancy Ridge Gate diff --git a/Loenn/libraries/fancy_tile_entities_helper.lua b/Loenn/libraries/fancy_tile_entities_helper.lua new file mode 100644 index 0000000..9f0ffe9 --- /dev/null +++ b/Loenn/libraries/fancy_tile_entities_helper.lua @@ -0,0 +1,49 @@ +local matrix = require("utils.matrix") +local fakeTilesHelper = require("helpers.fake_tiles") +local utils = require("utils") +local drawableRectangle = require("structs.drawable_rectangle") + +local fancyTileEntitiesHelper = {} + + +function fancyTileEntitiesHelper.getEntitySpriteFunction(blendKey, layer, color) + + return function(room, entity, node) + local tileX, tileY = math.floor((entity.x or node.x or 0) / 8) + 1, math.floor((entity.y or node.y or 0) / 8) + 1 + local tileWidth, tileHeight = math.floor((entity.width or 8) / 8), math.floor((entity.height or 8) / 8) + + local tileTable = {} + + local data = entity.tileData:split("\n") + + for ty = 1, tileHeight do + local row = data[ty] + for tx = 1, tileWidth do + local tile = "0" + if row then + tile = row:sub(tx, tx) or "0" + end + + if not tile or tile == "" or tile == "\r" then tile = "0" end + + tileTable[((ty-1)*tileWidth)+tx] = tile + end + end + + local tileMatrix = matrix.fromTable(tileTable, tileWidth, tileHeight) + -- this kinda remakes the matrix so idk if this makes sense + local fakeTiles = fakeTilesHelper.generateFakeTiles(room, tileX, tileY, tileMatrix, layer, entity[blendKey]) + + local fakeTilesSprites = fakeTilesHelper.generateFakeTilesSprites(room, tileX, tileY, fakeTiles, layer, entity.x, entity.y, color) + + local drawableSprite + drawableSprite = drawableRectangle.fromRectangle("bordered", utils.rectangle(entity.x, entity.y, entity.width or 8, entity.height or 8), {0, 0, 0, 0}, {0, 0, 0}) + drawableSprite.depth = entity.depth + + --table.insert(drawables, drawableSprite) + table.insert(fakeTilesSprites, 1, drawableSprite) + return fakeTilesSprites + end +end + +return fancyTileEntitiesHelper \ No newline at end of file diff --git a/Loenn/ui/forms/fields/fancy_tile_entities_button_field.lua b/Loenn/ui/forms/fields/fancy_tile_entities_button_field.lua new file mode 100644 index 0000000..2fd5ae9 --- /dev/null +++ b/Loenn/ui/forms/fields/fancy_tile_entities_button_field.lua @@ -0,0 +1,182 @@ +local uiElements = require("ui.elements") +local serialize = require("utils.serialize") +local mods = require("mods") +local TileEditor = mods.requireFromPlugin("ui.widgets.fancy_tile_entities_editor") +local contextMenu = require("ui.context_menu") +local configs = require("configs") + +local buttonField = {} + +buttonField.fieldType = "FancyTileEntities.buttonStringField" + +buttonField._MT = {} +buttonField._MT.__index = {} + +local invalidStyle = { + normalBorder = {0.65, 0.2, 0.2, 0.9, 2.0}, + focusedBorder = {0.9, 0.2, 0.2, 1.0, 2.0} +} + +function buttonField._MT.__index:setValue(value) + self.currentText = self.displayTransformer(value) + self.field:setText(self.currentText) + self.currentValue = value +end + +function buttonField._MT.__index:getValue() + return self.currentValue +end + +function buttonField._MT.__index:getCurrentText() + return self.name +end + +function buttonField._MT.__index:fieldValid() + return self.validator(self:getValue(), self:getCurrentText()) +end + +local function updateFieldStyle(formField, wasValid, valid) + if wasValid ~= valid then + if valid then + -- Reset to default + formField.field.style = nil + else + formField.field.style = invalidStyle + end + + formField.field:repaint() + end +end + +local function fieldChanged(formField) + return function(element, new, old) + local wasValid = formField:fieldValid() + + formField.currentValue = formField.valueTransformer(new) + formField.currentText = new + + local valid = formField:fieldValid() + + updateFieldStyle(formField, wasValid, valid) + formField:notifyFieldChanged() + end +end + +local function shouldShowMenu(self, x, y, button, istouch) + local menuButton = configs.editor.contextMenuButton + local actionButton = configs.editor.toolActionButton + + if button == menuButton then + return true + elseif button == actionButton then + return x > self.screenX and x < (self.screenX + self.width) and y > self.screenY and y < (self.screenY + self.height) + end + + return false +end + + +function buttonField.getElement(name, value, options) + local formField = {} + + local validator = function(v) + return true + end + + local valueTransformer = options.valueTransformer or function(v) + local success, result = serialize.unserialize(v, true, 3) + + if success and result and type(result) == "table" then + if #result == 1 then + local data = result[1] + if data["_fromLayer"] == "tilesFg" and data["tiles"] then + return string.gsub(data["tiles"] or "", "\\n", "\n") + end + end + end + return v + end + + local displayTransformer = options.displayTransformer or function(v) + return v + end + + local minWidth = options.minWidth or options.width or 160 + local maxWidth = options.maxWidth or options.width or 160 + local editable = options.editable + + local label = uiElements.label(options.displayName or name) + local field = uiElements.field(displayTransformer(value), fieldChanged(formField)):with({ + minWidth = minWidth, + maxWidth = maxWidth + }):hook({ + -- thanks to microlith57!!! + update = function(orig, self, dt) + orig(self, dt) + if self.focused then + self.label.text = self.text + else + self.label.text = "..." + end + end + }) + + + if editable == false then + field:setEnabled(false) + end + + field:setPlaceholder(displayTransformer("0")) + + local button = uiElements.button("Edit", function () end) + + button.__formButtonInfo = { + text = name, + minWidth = minWidth, + maxWidth = maxWidth + } + local buttonWithContext = contextMenu.addContextMenu( + button, + function() + local editOptions = { + width = 32, + height = 32, + callback = function(data) + local value = TileEditor.getFieldFromMatrix(data) + formField:setValue(value) + end + } + + return TileEditor.getTileEditor(formField, editOptions) + end, + { + shouldShowMenu = shouldShowMenu, + mode = "focused" + } + ) + + if options.tooltipText then + field.interactive = 1 + field.tooltipText = options.tooltipText + end + + button.centerVertically = true + + formField.button = button + formField.label = label + formField.field = field + formField.name = name + formField.initialValue = value + formField.currentValue = value + formField.validator = validator + formField.valueTransformer = valueTransformer + formField.displayTransformer = displayTransformer + formField.width = 4 + formField.elements = { + label, field, buttonWithContext + } + + return setmetatable(formField, buttonField._MT) +end + +return buttonField \ No newline at end of file diff --git a/Loenn/ui/widgets/fancy_tile_entities_editor.lua b/Loenn/ui/widgets/fancy_tile_entities_editor.lua new file mode 100644 index 0000000..67f368f --- /dev/null +++ b/Loenn/ui/widgets/fancy_tile_entities_editor.lua @@ -0,0 +1,216 @@ +local matrix = require("utils.matrix") +local fakeTilesHelper = require("helpers.fake_tiles") +local loadedState = require("loaded_state") +local configs = require("configs") + +local brushHelper = require("brushes") +local ui = require("ui") +local form = require("ui.forms.form") +local uiUtils = require("ui.utils") +local uiElements = require("ui.elements") +local utils = require("utils") +local listWidgets = require("ui.widgets.lists") +local toolHandler = require("tools") + +local TileEditor = {} + +local UPSCALE = 2 +-- remove (for debug purposes) + +function dump(o) + function dump_inner(o, i) + if i > 2 then return "too much recursion" end + if type(o) == 'table' then + local s = '{ ' + for k,v in pairs(o) do + if type(k) ~= 'number' then k = '"'..k..'"' end + s = s .. '['..k..'] = ' .. dump_inner(v, i+1) .. ',' + end + return s .. '} ' + else + return tostring(o) + end + end + return dump_inner(o, 0) +end + +local function printMatrix(matrix) + local width, height = matrix:size() + local out = "" + for ty = 1, height do + for tx = 1, width do + out = out .. matrix:get(tx, ty) + end + out = out .. "\n" + end + print(out) +end + +local function areaInteraction(interactionData) + return function(widget, x, y) + local innerX = math.floor(utils.clamp(x - widget.screenX, 0, interactionData.areaWidth)/((UPSCALE)*8))+1 + local innerY = math.floor(utils.clamp(y - widget.screenY, 0, interactionData.areaHeight)/((UPSCALE)*8))+1 + + if interactionData.tileData:get(innerX, innerY) ~= interactionData.currentMaterial then + interactionData.tileData:set(innerX, innerY, interactionData.currentMaterial) + widget:reflow() + widget:redraw() + interactionData.callback(interactionData.tileData) + end + end +end + +local function areaDrawing(interactionData) + return function(orig, widget) + orig(widget) + local room = loadedState.getSelectedItem() + + local widgetX, widgetY = widget.screenX, widget.screenY + + local tileData = interactionData.tileData + local tileX, tileY = 0, 0 + + local fakeTiles = fakeTilesHelper.generateFakeTiles(room, tileX, tileY, tileData, "tilesFg", false) + local fakeTilesSprites = fakeTilesHelper.generateFakeTilesSprites(room, tileX, tileY, fakeTiles, "tilesFg", widgetX, widgetY, {1,1,1,1}) + + for _, sprite in ipairs(fakeTilesSprites) do + sprite.x = (sprite.x - widgetX)*UPSCALE + widgetX + sprite.y = (sprite.y - widgetY)*UPSCALE + widgetY + sprite.scaleX = UPSCALE + sprite.scaleY = UPSCALE + sprite:draw() + end + + end +end + +local function materialSortFunction(lhs, rhs) + local lhsText = lhs.text + local rhsText = rhs.text + + return lhsText < rhsText +end + + +local function getMaterialList(layer, callback) + local materials = brushHelper.getMaterialLookup(layer) + local materialItems = {} + + for id, path in pairs(materials) do + local materialText = id + local materialData = path + + local item = { + text = materialText, + textNoMods = materialText, + alternativeNames = materialText, + data = materialData, + tooltip = nil, + currentLayer = layer, + associatedMods = nil + } + + table.insert(materialItems, item) + end + + local materialListOptions = { + searchBarLocation = "none", + searchBarCallback = function () end, + -- initialSearch = "", + initialItem = "Air", + -- dataToElement = materialDataToElement, + sortingFunction = materialSortFunction, + -- searchScore = getMaterialScore, + -- searchRawItem = true, + -- searchPreprocessor = prepareMaterialSearch, + sort = true + } + + return listWidgets.getList(callback, materialItems, materialListOptions) +end + +function TileEditor.getMatrixFromField(fieldData, width, height) + if not fieldData then return nil end + + local tileMatrix = matrix.filled("0", width, height) + local data = fieldData:split("\n") + for ty = 1, height do + local row = data[ty] + for tx = 1, width do + local tile = "0" + if row then + tile = row:sub(tx, tx) or "0" + end + + if not tile or tile == "" or tile == "\r" then tile = "0" end + + tileMatrix:set(tx, ty, tile) + end + end + return tileMatrix +end + +function TileEditor.getFieldFromMatrix(matrix) + if not matrix then return nil end + + local width, height = matrix:size() + local out = "" + for ty = 1, height do + for tx = 1, width do + out = out .. matrix:get(tx, ty) + end + out = out .. "\n" + end + return out +end + +function TileEditor.getTileEditor(field, options) + options = options or {} + + local callback = options.callback or function() end + + local width, height = utils.clamp(options.width or 8, 0, 32), utils.clamp(options.height or 8, 0, 32) + local areaWidth = width*8*UPSCALE + local areaHeight = height*8*UPSCALE + local tileData = TileEditor.getMatrixFromField(field:getValue(), width, height) or matrix.filled("0", width, height) + + local tileCanvas = love.graphics.newCanvas(areaWidth, areaHeight) + local interactionData = { + tileCanvas = tileCanvas, + tileData = tileData, + currentMaterial = "0", + areaWidth = areaWidth, + areaHeight = areaHeight, + --sliderImage = sliderImage, + --sliderImageData = sliderImageData, + callback = callback, + } + + --local sliderImage, sliderImageData = getTilesetScrollables(height*8, width*8) + + local scrolledMaterialList, materialList = getMaterialList("tilesFg", function(list, material) + interactionData.currentMaterial = material + end) + + local areaElement = uiElements.image(tileCanvas):with({ + interactive = 1, + onDrag = areaInteraction(interactionData), + onClick = areaInteraction(interactionData) + }):hook({ + draw = areaDrawing(interactionData) + }) + + local panel = uiElements.panel({areaElement}) + panel.style.padding = 0 + + local columns = { + panel, + uiElements.panel({scrolledMaterialList}):with(uiUtils.fillHeight(false)), + } + + + local pickerRow = uiElements.row(columns) + return pickerRow +end + +return TileEditor \ No newline at end of file From afc35306fabbecb39e46825e22ab089610e49637 Mon Sep 17 00:00:00 2001 From: Aurora Aquir Date: Mon, 18 Sep 2023 20:42:31 +0200 Subject: [PATCH 2/3] Default all loenn entity tiledata to "0" it shows an error if it's "", I'm not sure why. --- Loenn/entities/fancy_condition_block.lua | 2 +- Loenn/entities/fancy_coverup_wall.lua | 2 +- Loenn/entities/fancy_crumble_wall_on_rumble.lua | 2 +- Loenn/entities/fancy_dash_block.lua | 2 +- Loenn/entities/fancy_exit_block.lua | 2 +- Loenn/entities/fancy_fake_wall.lua | 2 +- Loenn/entities/fancy_falling_block.lua | 6 +++--- Loenn/entities/fancy_final_boss_moving_block.lua | 4 ++-- Loenn/entities/fancy_floaty_space_block.lua | 2 +- Loenn/entities/fancy_intro_crusher.lua | 2 +- Loenn/entities/fancy_ridge_gate.lua | 2 +- Loenn/ui/forms/fields/fancy_tile_entities_button_field.lua | 2 +- 12 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Loenn/entities/fancy_condition_block.lua b/Loenn/entities/fancy_condition_block.lua index df021e2..f4b63c4 100644 --- a/Loenn/entities/fancy_condition_block.lua +++ b/Loenn/entities/fancy_condition_block.lua @@ -10,7 +10,7 @@ conditionBlock.depth = -13000 conditionBlock.placements = { name = "condition_block", data = { - tileData = "", + tileData = "0", condition = "Key", conditionID = "1:1", width = 8, diff --git a/Loenn/entities/fancy_coverup_wall.lua b/Loenn/entities/fancy_coverup_wall.lua index d1b1667..0f3117e 100644 --- a/Loenn/entities/fancy_coverup_wall.lua +++ b/Loenn/entities/fancy_coverup_wall.lua @@ -7,7 +7,7 @@ coverupWall.depth = -13000 coverupWall.placements = { name = "coverup_wall", data = { - tileData = "", + tileData = "0", blendIn = true, width = 8, height = 8 diff --git a/Loenn/entities/fancy_crumble_wall_on_rumble.lua b/Loenn/entities/fancy_crumble_wall_on_rumble.lua index ce49834..0f53b53 100644 --- a/Loenn/entities/fancy_crumble_wall_on_rumble.lua +++ b/Loenn/entities/fancy_crumble_wall_on_rumble.lua @@ -7,7 +7,7 @@ crumbleWall.name = "FancyTileEntities/FancyCrumbleWallOnRumble" crumbleWall.placements = { name = "crumble_wall", data = { - tileData = "", + tileData = "0", blendin = true, persistent = false, width = 8, diff --git a/Loenn/entities/fancy_dash_block.lua b/Loenn/entities/fancy_dash_block.lua index ecaf6ca..c1797ea 100644 --- a/Loenn/entities/fancy_dash_block.lua +++ b/Loenn/entities/fancy_dash_block.lua @@ -8,7 +8,7 @@ dashBlock.depth = 0 dashBlock.placements = { name = "dash_block", data = { - tileData = "", + tileData = "0", blendin = true, canDash = true, permanent = true, diff --git a/Loenn/entities/fancy_exit_block.lua b/Loenn/entities/fancy_exit_block.lua index 1737fde..6ea82c7 100644 --- a/Loenn/entities/fancy_exit_block.lua +++ b/Loenn/entities/fancy_exit_block.lua @@ -8,7 +8,7 @@ exitBlock.depth = -13000 exitBlock.placements = { name = "exit_block", data = { - tileData = "", + tileData = "0", playTransitionReveal = false, width = 8, height = 8 diff --git a/Loenn/entities/fancy_fake_wall.lua b/Loenn/entities/fancy_fake_wall.lua index df8335f..3048666 100644 --- a/Loenn/entities/fancy_fake_wall.lua +++ b/Loenn/entities/fancy_fake_wall.lua @@ -8,7 +8,7 @@ fakeWall.depth = -13000 fakeWall.placements = { name = "fake_wall", data = { - tileData = "", + tileData = "0", width = 8, height = 8 } diff --git a/Loenn/entities/fancy_falling_block.lua b/Loenn/entities/fancy_falling_block.lua index 67164c2..2136e0a 100644 --- a/Loenn/entities/fancy_falling_block.lua +++ b/Loenn/entities/fancy_falling_block.lua @@ -8,7 +8,7 @@ fallingBlock.placements = { { name = "falling_block", data = { - tileData = "", + tileData = "0", climbFall = true, behind = false, manualTrigger = false, @@ -20,8 +20,8 @@ fallingBlock.placements = { { name = "boss_falling_block", data = { - tileData = "", - tileDataHighlight = "", + tileData = "0", + tileDataHighlight = "0", behind = false, finalBoss = true, width = 8, diff --git a/Loenn/entities/fancy_final_boss_moving_block.lua b/Loenn/entities/fancy_final_boss_moving_block.lua index 770d880..bba8970 100644 --- a/Loenn/entities/fancy_final_boss_moving_block.lua +++ b/Loenn/entities/fancy_final_boss_moving_block.lua @@ -19,8 +19,8 @@ movingBlock.placements = { nodeIndex = 0, width = 8, height = 8, - tileData = "", - tileDataHighlight = "" + tileData = "0", + tileDataHighlight = "0" } } diff --git a/Loenn/entities/fancy_floaty_space_block.lua b/Loenn/entities/fancy_floaty_space_block.lua index 1c62e17..9a081eb 100644 --- a/Loenn/entities/fancy_floaty_space_block.lua +++ b/Loenn/entities/fancy_floaty_space_block.lua @@ -10,7 +10,7 @@ floatySpaceBlock.placements = { name = "floaty_space_block", data = { connectsTo = "3", - tileData = "", + tileData = "0", disableSpawnOffset = false, randomSeed = 0, width = 8, diff --git a/Loenn/entities/fancy_intro_crusher.lua b/Loenn/entities/fancy_intro_crusher.lua index 0817b09..a4c164b 100644 --- a/Loenn/entities/fancy_intro_crusher.lua +++ b/Loenn/entities/fancy_intro_crusher.lua @@ -9,7 +9,7 @@ introCrusher.nodeLimits = {1, 1} introCrusher.placements = { name = "intro_crusher", data = { - tileData = "", + tileData = "0", flags = "1, 0b", delay = 1.2, speed = 2.0, diff --git a/Loenn/entities/fancy_ridge_gate.lua b/Loenn/entities/fancy_ridge_gate.lua index 737d089..3643d9d 100644 --- a/Loenn/entities/fancy_ridge_gate.lua +++ b/Loenn/entities/fancy_ridge_gate.lua @@ -9,7 +9,7 @@ ridgeGate.nodeLimits = {1, 1} ridgeGate.placements = { name = "ridge_gate", data = { - tileData = "", + tileData = "0", flag = "", width = 8, height = 8 diff --git a/Loenn/ui/forms/fields/fancy_tile_entities_button_field.lua b/Loenn/ui/forms/fields/fancy_tile_entities_button_field.lua index 2fd5ae9..e255093 100644 --- a/Loenn/ui/forms/fields/fancy_tile_entities_button_field.lua +++ b/Loenn/ui/forms/fields/fancy_tile_entities_button_field.lua @@ -143,7 +143,7 @@ function buttonField.getElement(name, value, options) height = 32, callback = function(data) local value = TileEditor.getFieldFromMatrix(data) - formField:setValue(value) + formField:setValue(value or "") end } From 8c0076e1bf07e76bb759312250386301f01ce477 Mon Sep 17 00:00:00 2001 From: Aurora Aquir Date: Sat, 29 Jun 2024 16:29:16 +0200 Subject: [PATCH 3/3] Update to current Gamebanana version, now respects width/height of entity in edit window (not in game) --- Loenn/entities/better_intro_crusher.lua | 1 + Loenn/entities/better_ridge_gate.lua | 1 + Loenn/entities/fancy_condition_block.lua | 4 +++- Loenn/entities/fancy_coverup_wall.lua | 4 +++- .../entities/fancy_crumble_wall_on_rumble.lua | 4 +++- Loenn/entities/fancy_dash_block.lua | 4 +++- Loenn/entities/fancy_exit_block.lua | 4 +++- Loenn/entities/fancy_fake_wall.lua | 4 +++- Loenn/entities/fancy_falling_block.lua | 7 ++++-- .../fancy_final_boss_moving_block.lua | 7 ++++-- Loenn/entities/fancy_floaty_space_block.lua | 8 ++++--- Loenn/entities/fancy_intro_crusher.lua | 4 +++- Loenn/entities/fancy_ridge_gate.lua | 4 +++- Loenn/entities/fancy_solid_tiles.lua | 4 +++- Loenn/entities/tile_seed_controller.lua | 1 + .../fancy_tiles_entities_loennhacks.lua | 24 +++++++++++++++++++ Loenn/triggers/entity_trigger.lua | 1 + .../ui/widgets/fancy_tile_entities_editor.lua | 15 +++++++++++- 18 files changed, 84 insertions(+), 17 deletions(-) create mode 100644 Loenn/libraries/fancy_tiles_entities_loennhacks.lua diff --git a/Loenn/entities/better_intro_crusher.lua b/Loenn/entities/better_intro_crusher.lua index af66116..62fed7a 100644 --- a/Loenn/entities/better_intro_crusher.lua +++ b/Loenn/entities/better_intro_crusher.lua @@ -2,6 +2,7 @@ local fakeTilesHelper = require("helpers.fake_tiles") local introCrusher = {} +introCrusher.associatedMods = {"FancyTileEntities"} introCrusher.name = "FancyTileEntities/BetterIntroCrusher" introCrusher.depth = 0 introCrusher.nodeLineRenderType = "line" diff --git a/Loenn/entities/better_ridge_gate.lua b/Loenn/entities/better_ridge_gate.lua index 219856d..80a41dc 100644 --- a/Loenn/entities/better_ridge_gate.lua +++ b/Loenn/entities/better_ridge_gate.lua @@ -2,6 +2,7 @@ local fakeTilesHelper = require("helpers.fake_tiles") local ridgeGate = {} +ridgeGate.associatedMods = {"FancyTileEntities"} ridgeGate.name = "FancyTileEntities/BetterRidgeGate" ridgeGate.depth = 0 ridgeGate.nodeLineRenderType = "line" diff --git a/Loenn/entities/fancy_condition_block.lua b/Loenn/entities/fancy_condition_block.lua index f4b63c4..52ea05c 100644 --- a/Loenn/entities/fancy_condition_block.lua +++ b/Loenn/entities/fancy_condition_block.lua @@ -5,6 +5,7 @@ local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_ent local conditionBlock = {} +conditionBlock.associatedMods = {"FancyTileEntities"} conditionBlock.name = "FancyTileEntities/FancyConditionBlock=LoadConditionBlock" conditionBlock.depth = -13000 conditionBlock.placements = { @@ -23,7 +24,8 @@ conditionBlock.fieldInformation = { options = enums.condition_block_conditions }, tileData = { - fieldType = "FancyTileEntities.buttonStringField" + fieldType = "FancyTileEntities.buttonStringField", + fte_passData = true } } conditionBlock.sprite = fancyTileEntitieshelper.getEntitySpriteFunction("blendEdges", "tilesFg", {1, 1, 1, 1}) diff --git a/Loenn/entities/fancy_coverup_wall.lua b/Loenn/entities/fancy_coverup_wall.lua index 0f3117e..b913830 100644 --- a/Loenn/entities/fancy_coverup_wall.lua +++ b/Loenn/entities/fancy_coverup_wall.lua @@ -2,6 +2,7 @@ local coverupWall = {} local mods = require("mods") local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_entities_helper") +coverupWall.associatedMods = {"FancyTileEntities"} coverupWall.name = "FancyTileEntities/FancyCoverupWall" coverupWall.depth = -13000 coverupWall.placements = { @@ -16,7 +17,8 @@ coverupWall.placements = { coverupWall.fieldInformation = { tileData = { - fieldType = "FancyTileEntities.buttonStringField" + fieldType = "FancyTileEntities.buttonStringField", + fte_passData = true } } diff --git a/Loenn/entities/fancy_crumble_wall_on_rumble.lua b/Loenn/entities/fancy_crumble_wall_on_rumble.lua index 0f53b53..dec5eab 100644 --- a/Loenn/entities/fancy_crumble_wall_on_rumble.lua +++ b/Loenn/entities/fancy_crumble_wall_on_rumble.lua @@ -3,6 +3,7 @@ local crumbleWall = {} local mods = require("mods") local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_entities_helper") +crumbleWall.associatedMods = {"FancyTileEntities"} crumbleWall.name = "FancyTileEntities/FancyCrumbleWallOnRumble" crumbleWall.placements = { name = "crumble_wall", @@ -21,7 +22,8 @@ end crumbleWall.fieldInformation = { tileData = { - fieldType = "FancyTileEntities.buttonStringField" + fieldType = "FancyTileEntities.buttonStringField", + fte_passData = true } } diff --git a/Loenn/entities/fancy_dash_block.lua b/Loenn/entities/fancy_dash_block.lua index c1797ea..a454f6b 100644 --- a/Loenn/entities/fancy_dash_block.lua +++ b/Loenn/entities/fancy_dash_block.lua @@ -3,6 +3,7 @@ local dashBlock = {} local mods = require("mods") local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_entities_helper") +dashBlock.associatedMods = {"FancyTileEntities"} dashBlock.name = "FancyTileEntities/FancyDashBlock" dashBlock.depth = 0 dashBlock.placements = { @@ -19,7 +20,8 @@ dashBlock.placements = { dashBlock.fieldInformation = { tileData = { - fieldType = "FancyTileEntities.buttonStringField" + fieldType = "FancyTileEntities.buttonStringField", + fte_passData = true } } diff --git a/Loenn/entities/fancy_exit_block.lua b/Loenn/entities/fancy_exit_block.lua index 6ea82c7..5b851b3 100644 --- a/Loenn/entities/fancy_exit_block.lua +++ b/Loenn/entities/fancy_exit_block.lua @@ -3,6 +3,7 @@ local exitBlock = {} local mods = require("mods") local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_entities_helper") +exitBlock.associatedMods = {"FancyTileEntities"} exitBlock.name = "FancyTileEntities/FancyExitBlock" exitBlock.depth = -13000 exitBlock.placements = { @@ -17,7 +18,8 @@ exitBlock.placements = { exitBlock.fieldInformation = { tileData = { - fieldType = "FancyTileEntities.buttonStringField" + fieldType = "FancyTileEntities.buttonStringField", + fte_passData = true } } diff --git a/Loenn/entities/fancy_fake_wall.lua b/Loenn/entities/fancy_fake_wall.lua index 3048666..8b094f0 100644 --- a/Loenn/entities/fancy_fake_wall.lua +++ b/Loenn/entities/fancy_fake_wall.lua @@ -3,6 +3,7 @@ local fakeWall = {} local mods = require("mods") local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_entities_helper") +fakeWall.associatedMods = {"FancyTileEntities"} fakeWall.name = "FancyTileEntities/FancyFakeWall" fakeWall.depth = -13000 fakeWall.placements = { @@ -16,7 +17,8 @@ fakeWall.placements = { fakeWall.fieldInformation = { tileData = { - fieldType = "FancyTileEntities.buttonStringField" + fieldType = "FancyTileEntities.buttonStringField", + fte_passData = true } } diff --git a/Loenn/entities/fancy_falling_block.lua b/Loenn/entities/fancy_falling_block.lua index 2136e0a..862a2ba 100644 --- a/Loenn/entities/fancy_falling_block.lua +++ b/Loenn/entities/fancy_falling_block.lua @@ -3,6 +3,7 @@ local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_ent local fallingBlock = {} +fallingBlock.associatedMods = {"FancyTileEntities"} fallingBlock.name = "FancyTileEntities/FancyFallingBlock" fallingBlock.placements = { { @@ -33,10 +34,12 @@ fallingBlock.placements = { fallingBlock.fieldInformation = { tileData = { - fieldType = "FancyTileEntities.buttonStringField" + fieldType = "FancyTileEntities.buttonStringField", + fte_passData = true }, tileDataHighlight = { - fieldType = "FancyTileEntities.buttonStringField" + fieldType = "FancyTileEntities.buttonStringField", + fte_passData = true } } diff --git a/Loenn/entities/fancy_final_boss_moving_block.lua b/Loenn/entities/fancy_final_boss_moving_block.lua index bba8970..acaeacd 100644 --- a/Loenn/entities/fancy_final_boss_moving_block.lua +++ b/Loenn/entities/fancy_final_boss_moving_block.lua @@ -4,6 +4,7 @@ local movingBlock = {} local mods = require("mods") local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_entities_helper") +movingBlock.associatedMods = {"FancyTileEntities"} movingBlock.name = "FancyTileEntities/FancyFinalBossMovingBlock" movingBlock.depth = 0 movingBlock.nodeLineRenderType = "line" @@ -26,10 +27,12 @@ movingBlock.placements = { movingBlock.fieldInformation = { tileData = { - fieldType = "FancyTileEntities.buttonStringField" + fieldType = "FancyTileEntities.buttonStringField", + fte_passData = true }, tileDataHighlight = { - fieldType = "FancyTileEntities.buttonStringField" + fieldType = "FancyTileEntities.buttonStringField", + fte_passData = true } } diff --git a/Loenn/entities/fancy_floaty_space_block.lua b/Loenn/entities/fancy_floaty_space_block.lua index 9a081eb..796598d 100644 --- a/Loenn/entities/fancy_floaty_space_block.lua +++ b/Loenn/entities/fancy_floaty_space_block.lua @@ -4,7 +4,8 @@ local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_ent local floatySpaceBlock = {} -floatySpaceBlock.name = "floatySpaceBlock" +floatySpaceBlock.associatedMods = {"FancyTileEntities"} +floatySpaceBlock.name = "FancyTileEntities/floatySpaceBlock" floatySpaceBlock.depth = -9000 floatySpaceBlock.placements = { name = "floaty_space_block", @@ -15,12 +16,13 @@ floatySpaceBlock.placements = { randomSeed = 0, width = 8, height = 8 - } + } floatySpaceBlock.fieldInformation = { tileData = { - fieldType = "FancyTileEntities.buttonStringField" + fieldType = "FancyTileEntities.buttonStringField", + fte_passData = true } } diff --git a/Loenn/entities/fancy_intro_crusher.lua b/Loenn/entities/fancy_intro_crusher.lua index a4c164b..aa8d392 100644 --- a/Loenn/entities/fancy_intro_crusher.lua +++ b/Loenn/entities/fancy_intro_crusher.lua @@ -2,6 +2,7 @@ local introCrusher = {} local mods = require("mods") local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_entities_helper") +introCrusher.associatedMods = {"FancyTileEntities"} introCrusher.name = "FancyTileEntities/FancyIntroCrusher" introCrusher.depth = 0 introCrusher.nodeLineRenderType = "line" @@ -20,7 +21,8 @@ introCrusher.placements = { introCrusher.fieldInformation = { tileData = { - fieldType = "FancyTileEntities.buttonStringField" + fieldType = "FancyTileEntities.buttonStringField", + fte_passData = true } } diff --git a/Loenn/entities/fancy_ridge_gate.lua b/Loenn/entities/fancy_ridge_gate.lua index 3643d9d..c9ef825 100644 --- a/Loenn/entities/fancy_ridge_gate.lua +++ b/Loenn/entities/fancy_ridge_gate.lua @@ -2,6 +2,7 @@ local ridgeGate = {} local mods = require("mods") local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_entities_helper") +ridgeGate.associatedMods = {"FancyTileEntities"} ridgeGate.name = "FancyTileEntities/FancyRidgeGate" ridgeGate.depth = 0 ridgeGate.nodeLineRenderType = "line" @@ -18,7 +19,8 @@ ridgeGate.placements = { ridgeGate.fieldInformation = { tileData = { - fieldType = "FancyTileEntities.buttonStringField" + fieldType = "FancyTileEntities.buttonStringField", + fte_passData = true } } diff --git a/Loenn/entities/fancy_solid_tiles.lua b/Loenn/entities/fancy_solid_tiles.lua index 38d45ef..a7dc02e 100644 --- a/Loenn/entities/fancy_solid_tiles.lua +++ b/Loenn/entities/fancy_solid_tiles.lua @@ -3,6 +3,7 @@ local fancyTileEntitieshelper = mods.requireFromPlugin("libraries.fancy_tile_ent local solidTiles = {} +solidTiles.associatedMods = {"FancyTileEntities"} solidTiles.name = "FancyTileEntities/FancySolidTiles" solidTiles.placements = { name = "solid_tiles", @@ -17,7 +18,8 @@ solidTiles.placements = { solidTiles.fieldInformation = { tileData = { - fieldType = "FancyTileEntities.buttonStringField" + fieldType = "FancyTileEntities.buttonStringField", + fte_passData = true } } diff --git a/Loenn/entities/tile_seed_controller.lua b/Loenn/entities/tile_seed_controller.lua index 8b65c04..cf3f4bd 100644 --- a/Loenn/entities/tile_seed_controller.lua +++ b/Loenn/entities/tile_seed_controller.lua @@ -1,5 +1,6 @@ local tileSeedController = {} +tileSeedController.associatedMods = {"FancyTileEntities"} tileSeedController.name = "FancyTileEntities/TileSeedController" tileSeedController.depth = 0 tileSeedController.placements = { diff --git a/Loenn/libraries/fancy_tiles_entities_loennhacks.lua b/Loenn/libraries/fancy_tiles_entities_loennhacks.lua new file mode 100644 index 0000000..dcca010 --- /dev/null +++ b/Loenn/libraries/fancy_tiles_entities_loennhacks.lua @@ -0,0 +1,24 @@ +-- Put your locals here +local form = require('ui.forms.form') + +local FTELoennHacks = {} + +if form._fte_unloadSeq then form._fte_unloadSeq() end + +local _orig_form_getFormFields = form.getFormFields +form.getFormFields = function(data, options) + local elements = _orig_form_getFormFields(data, options) -- returns list of `element` + for _,v in ipairs(elements) do + if options.fields[v.name].fte_passData then + v.fte_entityRef = data -- Passes a reference to the dummyData as the value `element.fte_entityRef` + end + end + return elements +end + + +function form._vivh_unloadSeq() -- Handles hotreload. + form.getFormFields = _orig_form_getFormFields +end + +return FTELoennHacks \ No newline at end of file diff --git a/Loenn/triggers/entity_trigger.lua b/Loenn/triggers/entity_trigger.lua index bae3f41..1535d7c 100644 --- a/Loenn/triggers/entity_trigger.lua +++ b/Loenn/triggers/entity_trigger.lua @@ -1,5 +1,6 @@ local trigger = {} +trigger.associatedMods = {"FancyTileEntities"} trigger.name = "everest/entityTrigger" trigger.nodeLineRenderType = "fan" trigger.nodeLimits = {2, 2} diff --git a/Loenn/ui/widgets/fancy_tile_entities_editor.lua b/Loenn/ui/widgets/fancy_tile_entities_editor.lua index 67f368f..0141ccc 100644 --- a/Loenn/ui/widgets/fancy_tile_entities_editor.lua +++ b/Loenn/ui/widgets/fancy_tile_entities_editor.lua @@ -169,7 +169,20 @@ function TileEditor.getTileEditor(field, options) local callback = options.callback or function() end - local width, height = utils.clamp(options.width or 8, 0, 32), utils.clamp(options.height or 8, 0, 32) + + local w + local h + if field.fte_entityRef then + w = field.fte_entityRef.width/8 + h = field.fte_entityRef.height/8 + if w > 32 or h > 32 then UPSCALE = 1 + elseif w > 16 or h > 16 then UPSCALE = 2 + elseif w > 8 or h > 8 then UPSCALE = 4 + elseif w > 4 or h > 4 then UPSCALE = 8 + else UPSCALE = 16 end + end + + local width, height = w or utils.clamp(options.width or 8, 0, 32), h or utils.clamp(options.height or 8, 0, 32) local areaWidth = width*8*UPSCALE local areaHeight = height*8*UPSCALE local tileData = TileEditor.getMatrixFromField(field:getValue(), width, height) or matrix.filled("0", width, height)