1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-03-14 23:35:17 +00:00
Pixelorama/src/Classes/TileSetCustom.gd

96 lines
2.4 KiB
GDScript3
Raw Normal View History

2024-11-16 03:41:32 +02:00
class_name TileSetCustom
extends RefCounted
signal updated(cel: CelTileMap)
var project: Project
2024-11-16 03:41:32 +02:00
var name := ""
var tile_size: Vector2i
var tiles: Array[Tile] = []
class Tile:
var image: Image
var mode_added: TileSetPanel.TileEditingMode
var times_used := 1
var undo_step_added := 0
func _init(
_image: Image, _mode_added: TileSetPanel.TileEditingMode, _undo_step_added := 0
) -> void:
image = _image
mode_added = _mode_added
undo_step_added = _undo_step_added
2024-11-16 03:41:32 +02:00
func can_be_removed(project: Project) -> bool:
if project.undos < undo_step_added:
return true
return mode_added != TileSetPanel.TileEditingMode.STACK and times_used <= 0
2024-11-16 03:41:32 +02:00
func _init(_tile_size: Vector2i, _project: Project, _name := "") -> void:
2024-11-16 03:41:32 +02:00
tile_size = _tile_size
project = _project
2024-11-16 03:41:32 +02:00
name = _name
var empty_image := Image.create_empty(tile_size.x, tile_size.y, false, Image.FORMAT_RGBA8)
tiles.append(Tile.new(empty_image, TileSetPanel.tile_editing_mode))
func add_tile(image: Image, cel: CelTileMap, edit_mode: TileSetPanel.TileEditingMode) -> void:
var tile := Tile.new(image, edit_mode, project.undos)
tiles.append(tile)
updated.emit(cel)
func insert_tile(
image: Image, position: int, cel: CelTileMap, edit_mode: TileSetPanel.TileEditingMode
) -> void:
var tile := Tile.new(image, edit_mode, project.undos)
2024-11-21 00:29:31 +02:00
tiles.insert(position, tile)
updated.emit(cel)
2024-11-21 00:29:31 +02:00
func unuse_tile_at_index(index: int, cel: CelTileMap) -> bool:
tiles[index].times_used -= 1
if tiles[index].can_be_removed(project):
remove_tile_at_index(index, cel)
return true
return false
func remove_tile_at_index(index: int, cel: CelTileMap) -> void:
tiles.remove_at(index)
updated.emit(cel)
func replace_tile_at(new_tile: Image, index: int, cel: CelTileMap) -> void:
tiles[index].image.copy_from(new_tile)
updated.emit(cel)
func find_tile(image: Image) -> int:
for i in tiles.size():
var tile := tiles[i]
if image.get_data() == tile.image.get_data():
return i
return -1
func remove_unused_tiles(cel: CelTileMap) -> bool:
var tile_removed := false
for i in range(tiles.size() - 1, 0, -1):
var tile := tiles[i]
if tile.can_be_removed(project):
remove_tile_at_index(i, cel)
tile_removed = true
return tile_removed
2024-11-25 01:44:37 +02:00
func serialize() -> Dictionary:
return {"name": name, "tile_size": tile_size, "tile_amount": tiles.size()}
func deserialize(dict: Dictionary) -> void:
name = dict.get("name", name)
tile_size = str_to_var("Vector2i" + dict.get("tile_size"))