notSpore/langtons-ant/ant.gd

75 lines
2.1 KiB
GDScript

extends Sprite2D
var pos: Vector2i = Vector2i(0,0)
var dir: TileSet.CellNeighbor = TileSet.CELL_NEIGHBOR_RIGHT_SIDE
@onready var tiles: TileMapLayer = get_node("../TileMapLayer")
var cur_dir: Dictionary = {
0: TileSet.CELL_NEIGHBOR_RIGHT_SIDE,
1: TileSet.CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE,
2: TileSet.CELL_NEIGHBOR_BOTTOM_LEFT_SIDE,
3: TileSet.CELL_NEIGHBOR_LEFT_SIDE,
4: TileSet.CELL_NEIGHBOR_TOP_LEFT_SIDE,
5: TileSet.CELL_NEIGHBOR_TOP_RIGHT_SIDE,
}
var cur_int: Dictionary = {
TileSet.CELL_NEIGHBOR_RIGHT_SIDE: 0,
TileSet.CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE: 1,
TileSet.CELL_NEIGHBOR_BOTTOM_LEFT_SIDE: 2,
TileSet.CELL_NEIGHBOR_LEFT_SIDE: 3,
TileSet.CELL_NEIGHBOR_TOP_LEFT_SIDE: 4,
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),
}
func getNextStep(tile: int) -> Vector2i:
return antProgram.get(tile, Vector2i(0,0))
func _ready() -> void:
self.set_z_index(1)
self.set_frame(cur_int[dir])
tiles.set_tile(pos, tiles.get_tile_colour(pos))
move(dir)
# update loop:
# move in dir
# get tile col, change dir based on col
# paint tile col
func update() -> void:
move(dir)
pos = tiles.get_neighbor_cell(pos, dir)
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)
tiles.set_tile(pos, res.y % tiles.numTiles)
func move(to: TileSet.CellNeighbor) -> void:
var delta: Vector2
match to:
TileSet.CELL_NEIGHBOR_RIGHT_SIDE:
delta = Vector2(tiles.texSize.x, 0)
TileSet.CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE:
delta = Vector2(tiles.texSize.x/2, tiles.texSize.y/4*3)
TileSet.CELL_NEIGHBOR_BOTTOM_LEFT_SIDE:
delta = Vector2(-tiles.texSize.x/2, tiles.texSize.y/4*3)
TileSet.CELL_NEIGHBOR_LEFT_SIDE:
delta = Vector2(-tiles.texSize.x, 0)
TileSet.CELL_NEIGHBOR_TOP_LEFT_SIDE:
delta = Vector2(-tiles.texSize.x/2, -tiles.texSize.y/4*3)
TileSet.CELL_NEIGHBOR_TOP_RIGHT_SIDE:
delta = Vector2(tiles.texSize.x/2, -tiles.texSize.y/4*3)
_:
delta = Vector2(0,0)
self.translate(delta)