Godot Version
4.3
Question
I am trying to change the custom data of a tile in a TileMapLayer through code. I have a custom data field called “damage” that stores in an integer how damaged the tile is. The default value is -1 which represents the unset state.
I have tried the following code to change the values:
var cell_tile_data = layer.get_cell_tile_data(local_cell_position)
var cell_damage = cell_tile_data.get_custom_data("damage")
print("cell tile data damage: ", cell_damage)
var new_damage: int
if cell_damage <= 0:
# Tile was not damaged and will be damaged now
new_damage = randi_range(2, 5)
else:
# Tile was damaged and will be repaired by one point
new_damage = cell_damage - 1
print("old damage: ", cell_damage, " new damage: ", new_damage)
if new_damage == 0:
cell_source_id = 0
else:
cell_source_id = 1
layer.set_cell(local_cell_position, cell_source_id, cell_atlas_coords, 0)
cell_tile_data.set_custom_data("damage", new_damage)
Running this code gives weird outputs that kinda look like race conditions to me. Here is a sample output:
cell tile data damage: -1
old damage: -1 new damage: 4
cell tile data damage: -1
old damage: -1 new damage: 3
cell tile data damage: 3
old damage: 3 new damage: 2
cell tile data damage: 2
old damage: 2 new damage: 1
cell tile data damage: 1
old damage: 1 new damage: 0
cell tile data damage: 4
old damage: 4 new damage: 3
cell tile data damage: 0
old damage: 0 new damage: 4
cell tile data damage: 4
old damage: 4 new damage: 3
cell tile data damage: 3
old damage: 3 new damage: 2
cell tile data damage: 2
old damage: 2 new damage: 1
cell tile data damage: 1
old damage: 1 new damage: 0
My code eventually does what it is supposed to do, but only after a few tries. I don’t get what is going wrong here.