online multiplayer chess game (note server currently down)
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
101
102
103
104
105
106
107
extends Node2D
class_name Piece, "res://assets/california/wP.png"

var real_position = Vector2.ZERO
var white := true
var realname = "pawn"
var has_moved = false
var sprite

onready var colorrect = $ColorRect
onready var frame = $Frame


func _ready():
	frame.position = Globals.grid.piece_size / 2
	frame.modulate = Globals.grid.overlay_color
	colorrect.color = Globals.grid.overlay_color
	colorrect.rect_size = Globals.grid.piece_size


	
	
func clicked():
	colorrect.show()
	create_circles()
	print(realname, " was clicked")
	

func clear_clicked(): # TODO: fix this shit
	colorrect.hide()
	Globals.grid.clear_circles()
	Globals.grid.clear_frames()
	
func move(newpos: Vector2): # dont use directly; use moveto
	has_moved = true
	global_position = newpos * Globals.grid.piece_size

func moveto(position):
	Globals.grid.matrix[real_position.y][real_position.x] = null
	Globals.grid.matrix[position.y][position.x] = self
	real_position = position
	move(position)


func pos_around(around_vector):
	return real_position + around_vector

func create_circles():
	# for motion
	match realname:
		"pawn":
			var carry = [pos_around(Vector2.UP)]
			if !has_moved:
				carry.append(pos_around(Vector2(0, -2)))
			set_circle(carry)
			# deal with the take logic
			carry = []
			var takes = [pos_around(Vector2(-1, -1)), pos_around(Vector2(1, -1))]
			for i in takes:
				i = clamp_vector(i)
				if i == null:
					continue
				var pos = Globals.grid.matrix[i.y][i.x]
				if pos and !pos.white:
					carry.append(i)
			print("takeable: ", carry)
			set_circle(carry, "take")
		"king":
			var carry = [pos_around(Vector2.UP), pos_around(Vector2.DOWN), pos_around(Vector2.LEFT), pos_around(Vector2.RIGHT)]
			# add diagonals
			carry.append(pos_around(Vector2(-1, -1)))
			carry.append(pos_around(Vector2(1, -1)))
			carry.append(pos_around(Vector2(-1, 1)))
			carry.append(pos_around(Vector2(1, 1)))
			set_circle(carry)
			set_circle(carry, "take") # king ez

func set_circle(positions: Array, type: = "move"):
	for i in range(len(positions)):
		var pos = clamp_vector(positions[i])
		if pos == null:
			continue
		var spot = Globals.grid.matrix[pos.y][pos.x]
		if spot and type == "move":
			continue
		if type == "move":
			# print("creating move circle at", pos)
			Globals.grid.background_matrix[pos.x][pos.y].set_circle(true)
		elif type == "take":
			print("creating take circle at", pos)
			if spot and !spot.white:
				spot.set_frame(true)

func set_frame(boolean):
	frame.visible = boolean

func clamp_vector(vector :Vector2):
	if vector.y < 0 or vector.y > 7 or vector.x < 0 or vector.x > 7:
		return null
	vector.x = clamp(vector.x, 0, 7)
	vector.y = clamp(vector.y, 0, 7)
	return vector

func take(piece:Piece):
	var piecepos = piece.real_position
	piece.queue_free()
	moveto(piecepos)