66 lines
2.3 KiB
GDScript3
66 lines
2.3 KiB
GDScript3
|
|
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
|