|
@ -11,12 +11,22 @@ enum CellStates { |
|
|
ALIVE, |
|
|
ALIVE, |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
## UI |
|
|
|
|
|
@onready var debug_ui: MarginContainer = $UI/Debug |
|
|
|
|
|
@onready var debug_generation_counter: Label = $UI/Debug/VBoxContainer/GenerationCounter |
|
|
|
|
|
@onready var debug_living_cells_counter: Label = $UI/Debug/VBoxContainer/LivingCellsCounter |
|
|
|
|
|
@onready var debug_world_seed: Label = $UI/Debug/VBoxContainer/WorldSeed |
|
|
|
|
|
|
|
|
|
|
|
@onready var generation_ui: MarginContainer = $UI/WorldGeneration |
|
|
|
|
|
@onready var generation_seed: LineEdit = $UI/WorldGeneration/VBoxContainer/Seed/Input |
|
|
|
|
|
@onready var generation_world_size_x: LineEdit = $UI/WorldGeneration/VBoxContainer/WorldSize/Input_x |
|
|
|
|
|
@onready var generation_world_size_y: LineEdit = $UI/WorldGeneration/VBoxContainer/WorldSize/Input_y |
|
|
|
|
|
@onready var gneration_cell_size_x: LineEdit = $UI/WorldGeneration/VBoxContainer/CellSize/Input_x |
|
|
|
|
|
@onready var gneration_cell_size_y: LineEdit = $UI/WorldGeneration/VBoxContainer/CellSize/Input_y |
|
|
|
|
|
|
|
|
|
|
|
## Other |
|
|
@onready var camera: Camera2D = $Camera2D |
|
|
@onready var camera: Camera2D = $Camera2D |
|
|
|
|
|
|
|
|
@onready var generation_counter: Label = $CanvasLayer/Debug/VBoxContainer/GenerationCounter |
|
|
|
|
|
@onready var generation_timer: Timer = $GenerationTimer |
|
|
@onready var generation_timer: Timer = $GenerationTimer |
|
|
@onready var living_cells_counter: Label = $CanvasLayer/Debug/VBoxContainer/LivingCellsCounter |
|
|
|
|
|
@onready var world_seed_label: Label = $CanvasLayer/Debug/VBoxContainer/WorldSeed |
|
|
|
|
|
|
|
|
|
|
|
@export var world_seed: int |
|
|
@export var world_seed: int |
|
|
@export var cell_size: Vector2 = Vector2(16, 16) |
|
|
@export var cell_size: Vector2 = Vector2(16, 16) |
|
@ -25,17 +35,46 @@ enum CellStates { |
|
|
|
|
|
|
|
|
var cell_instance |
|
|
var cell_instance |
|
|
var generation: int = 1 |
|
|
var generation: int = 1 |
|
|
|
|
|
var is_paused: int = false |
|
|
var total_living: int = 0 |
|
|
var total_living: int = 0 |
|
|
var world: Array = [] |
|
|
var world: Array = [] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _ready() -> void: |
|
|
func _ready() -> void: |
|
|
if not world_seed: |
|
|
|
|
|
world_seed = randi() |
|
|
|
|
|
seed(world_seed) |
|
|
|
|
|
world_seed_label.text = "World Seeed: %s" % world_seed |
|
|
|
|
|
|
|
|
update_generation_ui() |
|
|
|
|
|
debug_ui.visible = false |
|
|
|
|
|
generation_ui.visible = true |
|
|
|
|
|
|
|
|
|
|
|
func _input(event: InputEvent) -> void: |
|
|
|
|
|
if event.is_action_pressed("Pause"): |
|
|
|
|
|
is_paused = !is_paused |
|
|
|
|
|
if event.is_action_pressed("Menu"): |
|
|
|
|
|
is_paused = true |
|
|
|
|
|
generation_ui.visible = true |
|
|
|
|
|
update_generation_ui() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# |
|
|
|
|
|
# UI |
|
|
|
|
|
# |
|
|
|
|
|
## Update the Gneration UI with the current settings |
|
|
|
|
|
func update_generation_ui() -> void: |
|
|
|
|
|
generation_seed.text = str(world_seed) |
|
|
|
|
|
generation_world_size_x.text = str(world_size.x) |
|
|
|
|
|
generation_world_size_y.text = str(world_size.y) |
|
|
|
|
|
gneration_cell_size_x.text = str(cell_size.x) |
|
|
|
|
|
gneration_cell_size_x.text = str(cell_size.y) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# |
|
|
|
|
|
# Conway Specific |
|
|
|
|
|
# |
|
|
|
|
|
func start_conway() -> void: |
|
|
|
|
|
debug_world_seed.text = "World Seeed: %s" % world_seed |
|
|
|
|
|
is_paused = false |
|
|
|
|
|
|
|
|
generate_world() |
|
|
generate_world() |
|
|
|
|
|
generation_timer.start() |
|
|
|
|
|
|
|
|
# Center the camera on the world |
|
|
# Center the camera on the world |
|
|
camera.position.x = world_size.x * cell_size.x / 2 |
|
|
camera.position.x = world_size.x * cell_size.x / 2 |
|
@ -66,7 +105,9 @@ func cell_is_alive(pos: Vector2) -> bool: |
|
|
func count_living_neighbors(pos: Vector2) -> int: |
|
|
func count_living_neighbors(pos: Vector2) -> int: |
|
|
var count := 0 |
|
|
var count := 0 |
|
|
|
|
|
|
|
|
|
|
|
@warning_ignore("incompatible_ternary") |
|
|
var x_min = 0 if pos.x - 1 < 0 else pos.x - 1 |
|
|
var x_min = 0 if pos.x - 1 < 0 else pos.x - 1 |
|
|
|
|
|
@warning_ignore("incompatible_ternary") |
|
|
var y_min = 0 if pos.y - 1 < 0 else pos.y - 1 |
|
|
var y_min = 0 if pos.y - 1 < 0 else pos.y - 1 |
|
|
var x_max = world_size.x if pos.x + 2 > world_size.x else pos.x + 2 |
|
|
var x_max = world_size.x if pos.x + 2 > world_size.x else pos.x + 2 |
|
|
var y_max = world_size.y if pos.y + 2 > world_size.y else pos.y + 2 |
|
|
var y_max = world_size.y if pos.y + 2 > world_size.y else pos.y + 2 |
|
@ -80,6 +121,8 @@ func count_living_neighbors(pos: Vector2) -> int: |
|
|
|
|
|
|
|
|
## Loop through the world and create or kill cells depending on rules |
|
|
## Loop through the world and create or kill cells depending on rules |
|
|
func process_generation() -> void: |
|
|
func process_generation() -> void: |
|
|
|
|
|
if is_paused: return |
|
|
|
|
|
|
|
|
generation += 1 |
|
|
generation += 1 |
|
|
total_living = 0 |
|
|
total_living = 0 |
|
|
|
|
|
|
|
@ -116,6 +159,7 @@ func create_cell(pos: Vector2) -> RID: |
|
|
|
|
|
|
|
|
return cell_instance |
|
|
return cell_instance |
|
|
|
|
|
|
|
|
|
|
|
## Remove the cell from the RenderingServer, if it exists |
|
|
func kill_cell(pos: Vector2) -> CellStates: |
|
|
func kill_cell(pos: Vector2) -> CellStates: |
|
|
if world[pos.x][pos.y] is RID: |
|
|
if world[pos.x][pos.y] is RID: |
|
|
RenderingServer.free_rid(world[pos.x][pos.y]) |
|
|
RenderingServer.free_rid(world[pos.x][pos.y]) |
|
@ -138,7 +182,21 @@ func generate_world() -> void: |
|
|
func _on_generation_timer_timeout() -> void: |
|
|
func _on_generation_timer_timeout() -> void: |
|
|
process_generation() |
|
|
process_generation() |
|
|
|
|
|
|
|
|
generation_counter.text = "Generation: %s" % generation |
|
|
|
|
|
living_cells_counter.text = "Living Cells: %s" % total_living |
|
|
|
|
|
|
|
|
debug_generation_counter.text = "Generation: %s" % generation |
|
|
|
|
|
debug_living_cells_counter.text = "Living Cells: %s" % total_living |
|
|
|
|
|
|
|
|
generation_timer.start() |
|
|
generation_timer.start() |
|
|
|
|
|
|
|
|
|
|
|
func _on_generation_submit_pressed() -> void: |
|
|
|
|
|
if not generation_seed.text.strip_edges(): |
|
|
|
|
|
world_seed = randi() |
|
|
|
|
|
else: |
|
|
|
|
|
world_seed = int(generation_seed.text) |
|
|
|
|
|
world_size = Vector2(int(generation_world_size_x.text), int(generation_world_size_y.text)) |
|
|
|
|
|
cell_size = Vector2(int(gneration_cell_size_x.text), int(gneration_cell_size_x.text)) |
|
|
|
|
|
|
|
|
|
|
|
debug_ui.visible = true |
|
|
|
|
|
generation_ui.visible = false |
|
|
|
|
|
seed(world_seed) |
|
|
|
|
|
randomize() |
|
|
|
|
|
start_conway() |