53 lines
1.1 KiB
GDScript
53 lines
1.1 KiB
GDScript
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)
|