BeltTest/GameGrid.gd
Manuel Erdmann 94bfe2754e 🎉
2025-06-10 19:16:45 +02:00

65 lines
2.3 KiB
GDScript

extends Node2D
class_name GameGrid
var grid_content: Dictionary = {}
@onready var tile_map: TileMapLayer = get_tree().root.get_node("Node2D/TileMap")
func _ready():
var belt1 = preload("res://ConveyorBelt.tscn").instantiate()
place_building(belt1, Vector2i(0, 0), Vector2i.RIGHT)
var belt2 = preload("res://ConveyorBelt.tscn").instantiate()
place_building(belt2, Vector2i(1, 0), Vector2i.RIGHT)
var belt4 = preload("res://ConveyorBelt.tscn").instantiate()
place_building(belt4, Vector2i(3, 0), Vector2i.RIGHT)
var belt3 = preload("res://ConveyorBelt.tscn").instantiate()
place_building(belt3, Vector2i(2, 0), Vector2i.RIGHT)
var spawner = preload("res://ItemSpawner.tscn").instantiate()
spawner.modulate = Color.RED
place_building(spawner, Vector2i(0, -1), Vector2i.DOWN)
var spawner2 = preload("res://ItemSpawner.tscn").instantiate()
spawner2.modulate = Color.YELLOW
place_building(spawner2, Vector2i(0, 1), Vector2i.UP)
var sink = preload("res://ItemSink.tscn").instantiate()
place_building(sink, Vector2i(2, 1))
func get_content_at_grid(grid_pos: Vector2i) -> Building:
return grid_content.get(grid_pos, null)
func place_building(building_node: Building, grid_pos: Vector2i, direction: Vector2i = Vector2i.ZERO) -> bool:
if grid_content.has(grid_pos) and grid_content[grid_pos] != null:
print("grid_pos at %s not free." % grid_pos)
building_node.queue_free()
return false
# Internal setter
building_node.current_grid_pos = grid_pos
building_node.direction = direction
var world_center = tile_map.map_to_local(grid_pos) + (Vector2.ONE * tile_map.rendering_quadrant_size) / 2
building_node.position = world_center
add_child(building_node)
grid_content[grid_pos] = building_node
print("placed %s at %s" % [building_node.name, grid_pos])
return true
func remove_building(grid_pos: Vector2i) -> bool:
if grid_content.has(grid_pos):
var building_to_remove = grid_content[grid_pos]
grid_content.erase(grid_pos)
if building_to_remove is ConveyorBelt and not building_to_remove.items_on_belt.is_empty():
for item_data in building_to_remove.items_on_belt:
item_data.item.queue_free()
building_to_remove.queue_free()
print("removed building from %s" % grid_pos)
return true
print("no building to remove at %s" % grid_pos)
return false