online multiplayer chess game (note server currently down)
fix promotion issue caused by removing tweens.
bendn 2022-08-06
parent 7693e4a · commit 2e0a535
-rw-r--r--piece/Piece.gd63
-rw-r--r--ui/PromotionPreview.gd5
-rw-r--r--ui/board/Board.gd17
3 files changed, 45 insertions, 40 deletions
diff --git a/piece/Piece.gd b/piece/Piece.gd
index f745e9e..081b269 100644
--- a/piece/Piece.gd
+++ b/piece/Piece.gd
@@ -13,14 +13,13 @@ 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_pivot_offset = rect_size / 2
rect_position = Chess.algebraic2vec(position) * Globals.grid.piece_size
sprite.flip_v = Globals.grid.flipped
sprite.flip_h = Globals.grid.flipped
@@ -28,48 +27,47 @@ func size() -> void: # size the control
func _ready():
load_texture()
- size()
frame.modulate = Globals.grid.overlay_color
background.color = Globals.grid.overlay_color
- 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)
- elif type == Chess.KING:
+ if type == Chess.KING:
Events.connect("turn_over", self, "check_in_check")
+ size()
+
func check_in_check():
check.visible = Globals.grid.chess.__king_attacked(color)
func _pressed(p: String) -> void:
- popup.hide()
- $"../../Darken".hide()
promote_to = p
emit_signal("promotion_decided")
+ queue_free()
func open_promotion_previews():
- popup.set_as_minsize()
- var rect := popup.get_global_rect()
- rect.position = rect_global_position
+ var popup := PopupPanel.new()
+ popup.name = "previews"
+ popup.popup_exclusive = true
+ popup.add_stylebox_override("panel", StyleBoxEmpty.new())
+ var previews := VBoxContainer.new()
+ previews.name = "previews"
+ 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, p]
+ newsprite.texture_normal = load(img_path)
+ newsprite.name = p
+ newsprite.connect("pressed", self, "_pressed", [p])
+ previews.add_child(newsprite)
+
+ var rect = Rect2(rect_global_position, Vector2(Globals.grid.piece_size.x, Globals.grid.piece_size.y * 4))
popup.popup(rect)
- $"../../Darken".show()
func load_texture(path := "res://assets/pieces/%s/%s%s.png" % [Globals.piece_set, color, type.to_upper()]) -> void:
@@ -81,19 +79,26 @@ func set_zindex(zindex: int, obj: CanvasItem = self) -> void: # used by the ani
# returns self for function chaining
-func move(to: String) -> Piece:
+func move(to: String, synchronized := false) -> Piece:
+ if synchronized:
+ yield(get_tree(), "idle_frame")
+
+ name = "%s-%s" % [type, to]
Globals.grid.set_piece(position, null)
Globals.grid.set_piece(to, self)
var go_to = Chess.algebraic2vec(to)
- var tween = create_tween().set_trans(Tween.TRANS_BACK)
- tween.tween_property(self, @"rect_position", go_to * Globals.grid.piece_size, 0.3)
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")
position = to
+ var tween = create_tween().set_trans(Tween.TRANS_BACK)
+ tween.tween_property(self, @"rect_position", go_to * Globals.grid.piece_size, 0.3)
+ if synchronized:
+ yield(tween, "finished")
return self
diff --git a/ui/PromotionPreview.gd b/ui/PromotionPreview.gd
index 68ddf3c..dd6b710 100644
--- a/ui/PromotionPreview.gd
+++ b/ui/PromotionPreview.gd
@@ -8,13 +8,14 @@ func set_focused(is_focused: bool):
focused = is_focused
rect_scale = Vector2(1.1, 1.1) if focused else Vector2(.9, .9)
+func size():
+ rect_min_size = Globals.grid.piece_size
func _ready():
+ size()
connect("mouse_entered", self, "set_focused", [true])
connect("mouse_exited", self, "set_focused", [false])
stretch_mode = STRETCH_KEEP_ASPECT_CENTERED
mouse_default_cursor_shape = CURSOR_POINTING_HAND
expand = true
- rect_pivot_offset = Globals.grid.piece_size / 2
- rect_min_size = Globals.grid.piece_size
set_focused(false)
diff --git a/ui/board/Board.gd b/ui/board/Board.gd
index 644e7f0..a060366 100644
--- a/ui/board/Board.gd
+++ b/ui/board/Board.gd
@@ -203,7 +203,7 @@ func create_pieces():
func make_piece(algebraic: String, piece_type: String, color := "w") -> void: # make peace
var piece := PieceScene.instance() # create a piece
- piece.name = "%s@%s" % [piece_type, algebraic]
+ piece.name = "%s-%s" % [piece_type, algebraic]
piece.position = algebraic
piece.type = piece_type
piece.color = color
@@ -273,21 +273,21 @@ func move(san: String, is_recieved_move := true) -> void:
sound_handled = true
elif move_0x88.flags & Chess.BITS.KSIDE_CASTLE: # kingside castling
var rook_pos := Chess.offset(move_0x88.to, Vector2(1, 0))
- var _rook := get_piece(rook_pos).move(Chess.offset(move_0x88.to, Vector2(-1, 0)))
+ get_piece(rook_pos).move(Chess.offset(move_0x88.to, Vector2(-1, 0)))
elif move_0x88.flags & Chess.BITS.QSIDE_CASTLE: # queenside
var rook_pos := Chess.offset(move_0x88.to, Vector2(-2, 0))
- var _rook := get_piece(rook_pos).move(Chess.offset(move_0x88.to, Vector2(1, 0)))
+ get_piece(rook_pos).move(Chess.offset(move_0x88.to, Vector2(1, 0)))
if move_0x88.flags & Chess.BITS.PROMOTION: #promotion wow
- var p: Piece = board[move_0x88.from].move(Chess.algebraic(move_0x88.to))
+ var p: Piece = yield(board[move_0x88.from].move(Chess.algebraic(move_0x88.to), true), "completed")
if !is_recieved_move: # was my turn, this is my move
- yield(p.tween, "tween_all_completed")
+ darken.show()
p.open_promotion_previews()
- yield(p, "promotion_decided")
+ yield(p, "promotion_decided") # piece kills itself now
move_0x88["promotion"] = p.promote_to
san = chess.__move_to_san(move_0x88) # update the san with new promotion data
- p.queue_free()
+ darken.hide()
else: # was opponents turn, this is opponents move: promotion is already chosen
- p.queue_free() # the q_f above happens after a dozen yields
+ p.queue_free()
# the move animation is useless if its not my turn
# but it changes p.position, so its usefull.
make_piece(p.position, move_0x88.promotion, p.color)
@@ -305,7 +305,6 @@ func move(san: String, is_recieved_move := true) -> void:
func clear_last_clicked():
last_clicked = null
- darken.hide()
func draw(reason := "") -> void: