From b3d488e03163c8832006df3ce9dfd3f53658ea16 Mon Sep 17 00:00:00 2001 From: djairoh Date: Wed, 12 Nov 2025 20:17:29 +0100 Subject: [PATCH] feat: ant randomization --- langtons-ant/ant.gd | 43 +++++++++++++++++++++++----------- langtons-ant/camera.gd | 2 +- langtons-ant/grid.gd | 1 + langtons-ant/tile_map_layer.gd | 16 +++++++++---- 4 files changed, 42 insertions(+), 20 deletions(-) diff --git a/langtons-ant/ant.gd b/langtons-ant/ant.gd index 8ce52db..c98f56a 100644 --- a/langtons-ant/ant.gd +++ b/langtons-ant/ant.gd @@ -3,8 +3,9 @@ extends Sprite2D var pos: Vector2i = Vector2i(0,0) var dir: TileSet.CellNeighbor = TileSet.CELL_NEIGHBOR_RIGHT_SIDE @onready var tiles: TileMapLayer = get_node("../TileMapLayer") +@export var randomRules: bool = true -var cur_dir: Dictionary = { +var curDir: Dictionary = { 0: TileSet.CELL_NEIGHBOR_RIGHT_SIDE, 1: TileSet.CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE, 2: TileSet.CELL_NEIGHBOR_BOTTOM_LEFT_SIDE, @@ -13,7 +14,7 @@ var cur_dir: Dictionary = { 5: TileSet.CELL_NEIGHBOR_TOP_RIGHT_SIDE, } -var cur_int: Dictionary = { +var curInt: Dictionary = { TileSet.CELL_NEIGHBOR_RIGHT_SIDE: 0, TileSet.CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE: 1, TileSet.CELL_NEIGHBOR_BOTTOM_LEFT_SIDE: 2, @@ -22,21 +23,34 @@ var cur_int: Dictionary = { TileSet.CELL_NEIGHBOR_TOP_RIGHT_SIDE: 5, } -var antProgram: Dictionary = { - 0: Vector2i(-2, 1), - 1: Vector2i(0, 2), - 2: Vector2i(0, 3), - 3: Vector2i(-1, 4), - 4: Vector2i(-2, 5), - 5: Vector2i(-1, 0), -} +var antProgram: Array[Vector2i] = [ + Vector2i(2, 1), + Vector2i(0, 2), + Vector2i(3, 3), + Vector2i(1, 4), + Vector2i(1, 5), + Vector2i(2, 0), +] + +func randomTileset() -> void: + var rng = RandomNumberGenerator.new() + antProgram = [] + var s: int = rng.randi_range(10, 99) + for i in range(0, s): + antProgram.append(Vector2i(rng.randi_range(1, 4), (i+1)%s)) + func getNextStep(tile: int) -> Vector2i: - return antProgram.get(tile, Vector2i(0,0)) + if tile > antProgram.size(): + return Vector2i(0,0) + else: + return antProgram.get(tile) func _ready() -> void: self.set_z_index(1) - self.set_frame(cur_int[dir]) + self.set_frame(curInt[dir]) + if randomRules: + randomTileset() tiles.set_tile(pos, tiles.get_tile_colour(pos)) move(dir) @@ -50,8 +64,9 @@ func update() -> void: var tile: int = tiles.get_tile_colour(pos) var res = getNextStep(tile) - dir = cur_dir[(cur_int[dir] + tiles.numTiles + res.x) % tiles.numTiles] - self.set_frame(dir) + dir = curDir[(curInt[dir] + tiles.numTiles + res.x) % tiles.numTiles] + self.set_frame(curInt[dir]) + tiles.set_tile(pos, res.y % tiles.numTiles) func move(to: TileSet.CellNeighbor) -> void: diff --git a/langtons-ant/camera.gd b/langtons-ant/camera.gd index 34495a5..b3b3617 100644 --- a/langtons-ant/camera.gd +++ b/langtons-ant/camera.gd @@ -1,6 +1,6 @@ extends Camera2D -@export var minZoom := 0.1 +@export var minZoom := 0.01 @export var maxZoom := 2.0 @export var zoomFactor := 0.1 @export var zoomDuration := 0.2 diff --git a/langtons-ant/grid.gd b/langtons-ant/grid.gd index a8d98aa..3066155 100644 --- a/langtons-ant/grid.gd +++ b/langtons-ant/grid.gd @@ -5,6 +5,7 @@ var paused: bool = false @export var stepSize: float = 20 @export var ant: Sprite2D @export var tiles: TileMapLayer + # Called when the node enters the scene tree for the first time. func _ready() -> void: pass diff --git a/langtons-ant/tile_map_layer.gd b/langtons-ant/tile_map_layer.gd index 17393d4..9b06619 100644 --- a/langtons-ant/tile_map_layer.gd +++ b/langtons-ant/tile_map_layer.gd @@ -4,13 +4,19 @@ var tiles: Dictionary = {} @onready var numTiles: int = get_tile_set().get_source(0).get_tiles_count() #@onready var texSize: Vector2 = get_tile_set().get_tile_texture(get_tile_set().get_tile_id(0)) @onready var texSize: Vector2 = Vector2(32, 32) # TODO: get from tileSet - +@export var randomColors: bool = true +var stateColMap: Dictionary = { +} +var rng: RandomNumberGenerator = RandomNumberGenerator.new() func get_tile_colour(pos: Vector2i) -> int: - return self.tiles.get_or_add(pos, 0) + return tiles.get_or_add(pos, 0) # TODO: state should be an enum probably func set_tile(pos: Vector2i, state: int) -> void: - set_cell(pos, 0, Vector2i(0, state)) - self.tiles.erase(pos) - self.tiles.get_or_add(pos, state % self.numTiles) + self.set_cell(pos, 0, Vector2i(0, state%numTiles)) + if randomColors: + var col: Color = stateColMap.get_or_add(state, Color(rng.randf(), rng.randf(), rng.randf(), 1)) + self.get_cell_tile_data(pos).set_modulate(col) + tiles.erase(pos) + tiles.get_or_add(pos, state)