online multiplayer chess game (note server currently down)
Diffstat (limited to 'ui/board/Arrows.gd')
-rw-r--r--ui/board/Arrows.gd67
1 files changed, 67 insertions, 0 deletions
diff --git a/ui/board/Arrows.gd b/ui/board/Arrows.gd
new file mode 100644
index 0000000..2f84bd2
--- /dev/null
+++ b/ui/board/Arrows.gd
@@ -0,0 +1,67 @@
+extends Control
+
+var arrows := []
+var first: Vector2
+var ev: Vector2
+var b: Grid
+
+const w = 20
+
+
+func _setup(_b: Grid):
+ b = _b
+ Events.connect("turn_over", self, "on_turn_over")
+ for k in Chess.SQUARE_MAP:
+ b.background_array[Chess.SQUARE_MAP[k]].connect("right_clicked", self, "right_clicked", [k])
+
+
+func right_clicked(clicked: String) -> void:
+ first = ((Chess.algebraic2vec(clicked) * b.piece_size) + b.piece_size / 2)
+
+
+func _process(_delta):
+ update()
+
+
+func _draw():
+ if !b:
+ return
+ var s = b.piece_size
+ var c = b.overlay_color
+ if first:
+ var loc_m = ((get_local_mouse_position() / s) - Vector2(.5, .5)).round()
+ loc_m = Vector2(clamp(loc_m.x, 0, 7), clamp(loc_m.y, 0, 7))
+ var m_pos = (loc_m * s) + s / 2
+ if Input.is_action_pressed("rclick"): # dragging
+ draw_line(first, m_pos, c, w, true)
+ draw_triangle(first.angle_to_point(m_pos), m_pos, c)
+ else:
+ if first != m_pos:
+ var arr: PoolVector2Array = [first, m_pos]
+ if arrows.find(arr) == -1:
+ arrows.append(arr)
+ else:
+ arrows.erase(arr) # redoing == kill
+ first = Vector2.ZERO
+
+ for arrow in arrows:
+ draw_line(arrow[0], arrow[1], c, w, true)
+ draw_triangle(arrow[0].angle_to_point(arrow[1]), arrow[1], c)
+
+
+# r: the radians of rotation.
+func draw_triangle(r: float, p: Vector2, c: Color) -> void:
+ var tri: PoolVector2Array = [Vector2(-24, 0), Vector2(0, -40), Vector2(24, 0)]
+ for i in range(len(tri)):
+ tri[i] = tri[i].rotated(r - PI / 2) + p
+ draw_colored_polygon(tri, c)
+
+
+func clear_arrows():
+ arrows.resize(0)
+ first = Vector2.ZERO
+
+
+func on_turn_over():
+ if b.chess.turn != Globals.team: # i just went; arrows can go away now
+ clear_arrows()