From 67d4eb67c1d74b76154c8cb5d50d4596a4025126 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Fri, 22 Nov 2024 01:43:07 +0200 Subject: [PATCH] Don't delete tiles that have been added using the stack mode --- src/Classes/Cels/CelTileMap.gd | 19 ++++++++++++------- src/Classes/TileSetCustom.gd | 21 ++++++++++++++++----- src/UI/TilesPanel.gd | 2 +- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/Classes/Cels/CelTileMap.gd b/src/Classes/Cels/CelTileMap.gd index 0e4207f1b..976c8d401 100644 --- a/src/Classes/Cels/CelTileMap.gd +++ b/src/Classes/Cels/CelTileMap.gd @@ -20,6 +20,9 @@ func update_tileset() -> void: if TileSetPanel.tile_editing_mode == TileSetPanel.TileEditingMode.AUTO: for j in range(tileset.tiles.size() - 1, 0, -1): var tile := tileset.tiles[j] + if tile.mode_added == TileSetPanel.TileEditingMode.STACK: + # Don't delete tiles that have been added using the stack mode. + continue var tile_used := false for i in indices.size(): var x_coord := float(tileset.tile_size.x) * (i % indices_x) @@ -28,7 +31,7 @@ func update_tileset() -> void: var image_portion := image.get_region(rect) if image_portion.is_invisible(): continue - if image_portion.get_data() == tile.get_data(): + if image_portion.get_data() == tile.image.get_data(): tile_used = true break if not tile_used: @@ -45,27 +48,29 @@ func update_tileset() -> void: if TileSetPanel.tile_editing_mode == TileSetPanel.TileEditingMode.MANUAL: if index == 0 or tileset.tiles.size() <= index: if tileset.tiles.size() <= 1: - tileset.add_tile(image_portion) + tileset.add_tile(image_portion, TileSetPanel.tile_editing_mode) indices[i] = tileset.tiles.size() - 1 continue - if image_portion.get_data() != tileset.tiles[index].get_data(): + if image_portion.get_data() != tileset.tiles[index].image.get_data(): tileset.replace_tile_at(image_portion, index) # TODO: Update the rest of the tilemap - else: + else: # Auto or stack var found_tile := false for j in range(1, tileset.tiles.size()): var tile := tileset.tiles[j] - if image_portion.get_data() == tile.get_data(): + if image_portion.get_data() == tile.image.get_data(): indices[i] = j found_tile = true break if not found_tile: if removed_tile_indices.is_empty(): - tileset.add_tile(image_portion) + tileset.add_tile(image_portion, TileSetPanel.tile_editing_mode) indices[i] = tileset.tiles.size() - 1 else: var index_position := removed_tile_indices.pop_back() as int - tileset.insert_tile(image_portion, index_position) + tileset.insert_tile( + image_portion, index_position, TileSetPanel.tile_editing_mode + ) indices[i] = index_position diff --git a/src/Classes/TileSetCustom.gd b/src/Classes/TileSetCustom.gd index f420f0548..bbeb2e539 100644 --- a/src/Classes/TileSetCustom.gd +++ b/src/Classes/TileSetCustom.gd @@ -5,7 +5,16 @@ signal updated var name := "" var tile_size: Vector2i -var tiles: Array[Image] = [] +var tiles: Array[Tile] = [] + + +class Tile: + var image: Image + var mode_added: TileSetPanel.TileEditingMode + + func _init(_image: Image, _mode_added: TileSetPanel.TileEditingMode) -> void: + image = _image + mode_added = _mode_added func _init(_tile_size: Vector2i, _name := "") -> void: @@ -15,15 +24,17 @@ func _init(_tile_size: Vector2i, _name := "") -> void: #var indices_y := ceili(float(_project_size.y) / tile_size.y) #tiles.resize(indices_x * indices_y + 1) var empty_image := Image.create_empty(tile_size.x, tile_size.y, false, Image.FORMAT_RGBA8) - tiles.append(empty_image) + tiles.append(Tile.new(empty_image, TileSetPanel.tile_editing_mode)) -func add_tile(tile: Image) -> void: +func add_tile(image: Image, edit_mode: TileSetPanel.TileEditingMode) -> void: + var tile := Tile.new(image, edit_mode) tiles.append(tile) updated.emit() -func insert_tile(tile: Image, position: int) -> void: +func insert_tile(image: Image, position: int, edit_mode: TileSetPanel.TileEditingMode) -> void: + var tile := Tile.new(image, edit_mode) tiles.insert(position, tile) updated.emit() @@ -34,5 +45,5 @@ func remove_tile_at_index(index: int) -> void: func replace_tile_at(new_tile: Image, index: int) -> void: - tiles[index].copy_from(new_tile) + tiles[index].image.copy_from(new_tile) updated.emit() diff --git a/src/UI/TilesPanel.gd b/src/UI/TilesPanel.gd index 7e4d3fe1c..8c672da38 100644 --- a/src/UI/TilesPanel.gd +++ b/src/UI/TilesPanel.gd @@ -38,7 +38,7 @@ func _update_tileset() -> void: for tile in tileset.tiles: var texture_rect := TextureButton.new() texture_rect.custom_minimum_size = Vector2i(32, 32) - texture_rect.texture_normal = ImageTexture.create_from_image(tile) + texture_rect.texture_normal = ImageTexture.create_from_image(tile.image) h_flow_container.add_child(texture_rect)