class_name Piece extends MeshInstance3D const WALL = preload("res://wall.tres") const GOAL = preload("res://goal.tres") const BOX = preload("res://box.tres") const PLAYER = preload("res://player.tres") enum Type { Wall, Goal, Box, Player, } # logical position @export var lpos: Vector2i: get: return lpos set(val): lpos = val position = Vector3(val.x, 0, val.y) @export var type: Piece.Type func do_move(move: Vector2i) -> Callable: return func(): lpos += move func undo_move() -> Callable: var old_pos := lpos return func(): lpos = old_pos static func make(lpos: Vector2i, type: Piece.Type, mesh: Mesh) -> Piece: var piece := Piece.new() piece.lpos = lpos piece.mesh = mesh piece.type = type return piece static func wall(lpos: Vector2i) -> Piece: return make(lpos, Piece.Type.Wall, WALL) static func goal(lpos: Vector2i) -> Piece: return make(lpos, Piece.Type.Goal, GOAL) static func box(lpos: Vector2i) -> Piece: return make(lpos, Piece.Type.Box, BOX) static func player(lpos: Vector2i) -> Piece: return make(lpos, Piece.Type.Player, PLAYER)