extends TileMapLayer @export var building_spots: Array[Vector2i] @export var tree_spots: Array[Vector2i] @export var rock_spots: Array[Vector2i] @export var th_spots: Array[Vector2i] @export var level: int var ruins_spots: Array[Vector2i] var building_data = {} var last_tile var last_text var rand = 0 const NAME_ICON = preload("res://NameIcon.tscn") var building_to_tile_map = { "tents": { "source": 8, "atlas": 0 }, "quarter": { "source": 8, "atlas": 1 }, "house": { "source": 8, "atlas": 2 }, "essencecompressor": { "source": 9, "atlas": 2 }, "woodcutter": { "source": 9, "atlas": 1 }, "stoneminer": { "source": 9, "atlas": 0 }, "foodgathering": { "source": 7, "atlas": 2 }, "foodprocessing": { "source": 7, "atlas": 3 }, "waterprocessor": { "source": 7, "atlas": 1 }, "waterpump": { "source": 7, "atlas": 0 } } func _process(delta: float) -> void: var tile = local_to_map(get_global_mouse_position()) var building_mode = Persister.get_value("building_mode") for spot in building_spots: if not building_data.has(spot) and not tree_spots.has(spot) and not rock_spots.has(spot) and not th_spots.has(spot) and not ruins_spots.has(spot): erase_cell(spot) if last_tile != tile: if last_text and is_instance_valid(last_text) and last_text.selected: last_text._deselect() rand = randi_range(0, 1) if not Persister.get_value("building_mode"): if rock_spots.has(tile): last_text = NAME_ICON.instantiate() last_text.text = "[center]Rock" last_text.position = map_to_local(tile) + Vector2(-25, -10) add_sibling(last_text) elif tree_spots.has(tile): last_text = NAME_ICON.instantiate() last_text.text = "[center]Tree" last_text.position = map_to_local(tile) + Vector2(-25, -10) add_sibling(last_text) elif th_spots.has(tile): last_text = NAME_ICON.instantiate() last_text.text = "[center]Town Hall" last_text.position = map_to_local(tile) + Vector2(-25, -10) add_sibling(last_text) elif ruins_spots.has(tile): last_text = NAME_ICON.instantiate() last_text.text = "[center]Ruins" last_text.position = map_to_local(tile) + Vector2(-25, -10) add_sibling(last_text) elif building_data.has(tile): last_text = NAME_ICON.instantiate() last_text.text = "[center]%s" % [Data.data.buildings[building_data[tile].key].name] last_text.position = map_to_local(tile) + Vector2(-25, -10) add_sibling(last_text) last_tile = tile if not building_mode: return if building_spots.has(tile) and not rock_spots.has(tile) and not tree_spots.has(tile) and not th_spots.has(tile) and not building_data.has(tile) and not ruins_spots.has(tile): var build_data = building_to_tile_map[Persister.get_value("building_key")] set_cell(tile, build_data["source"], Vector2i(build_data["atlas"],rand), 0) func _ready() -> void: Triggerer.listen("flood_level", _on_flood_level) func _on_flood_level(data): var value = int(data.value) if value >= level: for coords in building_data: var building = building_data[coords] var build_data = Data.data.buildings[building.key] var bttm = building_to_tile_map[building.key] var atlas = bttm.atlas var source match build_data.type: "utility": source = 11 "housing": source = 12 "production": source = 10 ruins_spots.push_back(coords) set_cell(coords, source, Vector2i(atlas,building.rand), 0) building_data.clear() func place_building(): var tile = local_to_map(get_global_mouse_position()) if building_spots.has(tile) and not building_data.has(tile) and not tree_spots.has(tile) and not rock_spots.has(tile) and not th_spots.has(tile) and not ruins_spots.has(tile): Persister.persist_data("building_mode", false) building_data[tile] = { "key": Persister.get_value("building_key"), "rand": rand } var build_data = Data.data.buildings[Persister.get_value("building_key")] var cost = build_data.cost if cost.has("wood"): Persister.change_value("wood", -int(cost.wood)) if cost.has("stone"): Persister.change_value("stone", -int(cost.stone)) if build_data.type == "housing": Persister.change_value("max_population", int(build_data.amount)) building_data[tile].max_population = int(build_data.amount) Persister.persist_data("drag_mode", false) func show_info_building(): var tile = local_to_map(get_global_mouse_position()) if building_data.has(tile): Triggerer.trigger("show_info", building_data[tile])