78 lines
2.4 KiB
GDScript
78 lines
2.4 KiB
GDScript
extends Node3D
|
|
|
|
@export var tile_scene: PackedScene
|
|
@export var tile_size: float = 2.0
|
|
@export var tile_separation: float = 0.2
|
|
|
|
var generated_tiles: Dictionary = {}
|
|
|
|
func _ready() -> void:
|
|
spawn_tile(Vector2i(0, 0))
|
|
|
|
func spawn_tile(grid_pos: Vector2i) -> void:
|
|
if generated_tiles.has(grid_pos):
|
|
return
|
|
|
|
var tile = tile_scene.instantiate()
|
|
add_child(tile)
|
|
|
|
var x_spacing = tile_size * 0.75 + tile_separation
|
|
var z_spacing = tile_size * sqrt(3) / 2 + tile_separation
|
|
|
|
var pos_x = grid_pos.x * x_spacing
|
|
var pos_z = grid_pos.y * z_spacing + (abs(grid_pos.x) % 2) * (z_spacing / 2.0)
|
|
|
|
var target_position = Vector3(pos_x, 0, pos_z)
|
|
|
|
tile.transform.origin = Vector3(pos_x, -3.0, pos_z)
|
|
|
|
generated_tiles[grid_pos] = tile
|
|
if tile.has_method("initialize"):
|
|
tile.initialize(grid_pos.x, grid_pos.y)
|
|
|
|
var tween = create_tween()
|
|
var tile_light = tile.get_node_or_null("OmniLight3D")
|
|
if tile_light:
|
|
tile_light.light_energy = 0.0
|
|
|
|
tween.tween_property(tile, "position", target_position, 0.8)\
|
|
.set_trans(Tween.TRANS_CUBIC)\
|
|
.set_ease(Tween.EASE_OUT)
|
|
|
|
if tile_light:
|
|
tween.parallel().tween_property(tile_light, "light_energy", 1.5, 0.8)\
|
|
.set_trans(Tween.TRANS_CUBIC)\
|
|
.set_ease(Tween.EASE_OUT)
|
|
|
|
func get_hex_neighbors(grid_pos: Vector2i) -> Array[Vector2i]:
|
|
var neighbors: Array[Vector2i] = []
|
|
|
|
neighbors.append(grid_pos + Vector2i(0, -1)) # Neighbor Up
|
|
neighbors.append(grid_pos + Vector2i(0, 1)) # Neighbor Down
|
|
neighbors.append(grid_pos + Vector2i(-1, 0)) # Neighbor Left
|
|
neighbors.append(grid_pos + Vector2i(1, 0)) # Neighbor Right
|
|
|
|
if abs(grid_pos.x) % 2 == 1:
|
|
neighbors.append(grid_pos + Vector2i(-1, 1)) # Neighbor Left-Down
|
|
neighbors.append(grid_pos + Vector2i(1, 1)) # Neighbor Right-Down
|
|
else:
|
|
neighbors.append(grid_pos + Vector2i(-1, -1)) # Neighbor Left-Up
|
|
neighbors.append(grid_pos + Vector2i(1, -1)) # Neighbor Right-Up
|
|
return neighbors
|
|
|
|
func _on_button_pressed() -> void:
|
|
var open_neighbors = []
|
|
|
|
for current_pos in generated_tiles.keys():
|
|
var neighbors = get_hex_neighbors(current_pos)
|
|
for n_pos in neighbors:
|
|
if not generated_tiles.has(n_pos) and not open_neighbors.has(n_pos):
|
|
open_neighbors.append(n_pos)
|
|
|
|
if open_neighbors.size() > 0:
|
|
var random_target_pos = open_neighbors[randi() % open_neighbors.size()]
|
|
spawn_tile(random_target_pos)
|
|
print("Generated new tile at: ", random_target_pos)
|
|
else:
|
|
print("World is full")
|
|
|