online multiplayer chess game (note server currently down)
fix promotion issue caused by removing tweens.
| -rw-r--r-- | piece/Piece.gd | 63 | ||||
| -rw-r--r-- | ui/PromotionPreview.gd | 5 | ||||
| -rw-r--r-- | ui/board/Board.gd | 17 |
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: |