online multiplayer chess game (note server currently down)
Diffstat (limited to 'piece/Piece.gd')
-rw-r--r--piece/Piece.gd94
1 files changed, 94 insertions, 0 deletions
diff --git a/piece/Piece.gd b/piece/Piece.gd
new file mode 100644
index 0000000..468c3b3
--- /dev/null
+++ b/piece/Piece.gd
@@ -0,0 +1,94 @@
+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 _ready():
+ add_child(tween)
+ load_texture()
+ 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")