online multiplayer chess game (note server currently down)
Diffstat (limited to 'SanParse/Move.gd')
-rw-r--r--SanParse/Move.gd73
1 files changed, 73 insertions, 0 deletions
diff --git a/SanParse/Move.gd b/SanParse/Move.gd
new file mode 100644
index 0000000..8abfca1
--- /dev/null
+++ b/SanParse/Move.gd
@@ -0,0 +1,73 @@
+class_name Move
+extends Resource
+
+enum CASTLETYPES { NONE, QUEEN_SIDE, KING_SIDE }
+enum CHECKTYPES { NONE, CHECK, CHECKMATE }
+var generated_from := ""
+var piece := 0
+var move_kind: MoveKind
+var promotion := 0
+# var annotation := "" # later
+var check_type := 0
+var is_capture := false
+
+
+func _init(newpiece: int, newmove, capture := false) -> void:
+ piece = newpiece
+ is_capture = capture
+ move_kind = MoveKind.new(newmove)
+
+
+static func castle_type(type: String) -> int:
+ return CASTLETYPES.QUEEN_SIDE if type == "O-O-O" else CASTLETYPES.KING_SIDE
+
+
+func set_check_type(type: String) -> void:
+ match type:
+ "+":
+ check_type = CHECKTYPES.CHECK
+ "#":
+ check_type = CHECKTYPES.CHECKMATE
+ _:
+ check_type = CHECKTYPES.NONE
+
+
+func compile() -> String: # compiles the structure to a san
+ var res := ""
+ match move_kind.type:
+ MoveKind.CASTLE:
+ res += move_kind.to_str()
+ MoveKind.NORMAL:
+ res += Utils.to_str(piece)
+ res += Utils.to_algebraic(move_kind.data[0])
+ res = res + "x" if is_capture else res
+ res += Utils.to_algebraic(move_kind.data[1])
+ res = res + "=" + Utils.to_str(promotion) if promotion != -1 else res
+ match check_type:
+ CHECKTYPES.CHECK:
+ res += "+"
+ CHECKTYPES.CHECKMATE:
+ res += "#"
+ _:
+ pass
+ return res
+
+
+class MoveKind:
+ extends Resource
+ enum { NONE, NORMAL, CASTLE }
+ var type := 0
+ var data # string OR array
+
+ func _init(something):
+ if typeof(something) == TYPE_ARRAY and len(something) == 2:
+ type = NORMAL
+ data = PoolVector2Array(something)
+ elif typeof(something) == TYPE_INT:
+ type = CASTLE
+ data = something
+ else:
+ assert(false)
+
+ func to_str() -> String:
+ return "O-O-O" if data == CASTLETYPES.QUEENSIDE else "O-O"