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
extends Node
class_name MaterialLabelManager

const PIECE_SCORES = {
	p = 1,
	n = 3,
	b = 3,
	r = 5,
	q = 9,
	k = 0,
}

export(NodePath) var white_path
onready var w: MaterialLabel = get_node(white_path)
export(NodePath) var black_path
onready var b: MaterialLabel = get_node(black_path)


func _ready():
	Events.connect("turn_over", self, "show_material_imbalance")


func get_material_diff() -> Dictionary:
	var diff := {
		w = {k = 0, q = 0, r = 0, b = 0, n = 0, p = 0},
		b = {k = 0, q = 0, r = 0, b = 0, n = 0, p = 0},
	}
	for i in Globals.grid.chess.SQUARE_MAP.values():
		var p = Globals.grid.chess.board[i]
		if !p:
			continue
		var them = diff[Chess.__swap_color(p.color)]
		if them[p.type] > 0:
			them[p.type] -= 1
		else:
			diff[p.color][p.type] += 1
	return diff


func get_material_score(pieces: Dictionary) -> int:
	var score = 0
	for c in pieces:  # color
		for p in pieces[c]:  # dictionary of pieces : {p=0}
			for i in pieces[c][p]:  # number of pieces
				score += PIECE_SCORES[p] * (1 if c == "w" else -1)
	return score


func show_material_imbalance():
	var d = get_material_diff()
	var score = get_material_score(d)
	w.display(d.w, score if score > 0 else 0)
	b.display(d.b, int(abs(score)) if score < 0 else 0)