1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
extends Control
class_name Piece
var position := ""
var color := "w"
var type := ""
var tween := Tween.new()
onready var sprite = $Sprite
onready var frame = $Sprite/Frame
onready var background = $ColorRect
onready var anim = $AnimationPlayer
onready var rotate = $RotatePlayer
# for pawn promotion
var previews: VBoxContainer = null
var popup: PopupPanel = null
signal promotion_decided
var promote_to := ""
func size() -> void: # size the control
rect_size = Globals.grid.piece_size
rect_position = Chess.algebraic2vec(position) * Globals.grid.piece_size
func _ready():
add_child(tween)
load_texture()
size()
frame.modulate = Globals.grid.overlay_color
background.color = Globals.grid.overlay_color
sprite.flip_v = Globals.grid.flipped
sprite.flip_h = Globals.grid.flipped
if type == Chess.PAWN:
popup = PopupPanel.new()
popup.popup_exclusive = true
popup.add_stylebox_override("panel", StyleBoxEmpty.new())
previews = VBoxContainer.new()
previews.add_constant_override("separation", 0)
popup.add_child(previews)
add_child(popup)
for p in "qnrb":
var newsprite := PromotionPreview.new()
newsprite.hint_tooltip = p
var img_path = "res://assets/pieces/%s/%s%s.png" % [Globals.piece_set, color.to_lower(), p.to_upper()]
newsprite.texture_normal = load(img_path)
newsprite.name = p
newsprite.connect("pressed", self, "_pressed", [p])
previews.add_child(newsprite)
func _pressed(p: String) -> void:
popup.hide()
$"../../Darken".hide()
promote_to = p
emit_signal("promotion_decided")
func open_promotion_previews():
popup.set_as_minsize()
var rect := popup.get_global_rect()
rect.position = rect_global_position
popup.popup(rect)
$"../../Darken".show()
func load_texture(path := "res://assets/pieces/%s/%s%s.png" % [Globals.piece_set, color, type.to_upper()]) -> void:
sprite.texture = load(path)
func set_zindex(zindex: int, obj: CanvasItem = self) -> void: # used by the animation player
VisualServer.canvas_item_set_z_index(obj.get_canvas_item(), zindex)
# returns self for function chaining
func move(to: String) -> Piece:
Globals.grid.set_piece(position, null)
Globals.grid.set_piece(to, self)
var go_to = Chess.algebraic2vec(to)
tween.interpolate_property(
self, "rect_position", rect_position, go_to * Globals.grid.piece_size, 0.3, Tween.TRANS_BACK
)
var signresult := int(sign(Chess.algebraic2vec(position).x - go_to.x))
if signresult == 1:
rotate.play("Right")
elif signresult == -1:
rotate.play("Left")
anim.play("Move")
tween.start()
position = to
return self
func took() -> void:
Globals.grid.set_piece(position, null)
frame.hide()
anim.play("Took")
|