online multiplayer chess game (note server currently down)
Diffstat (limited to 'ui/menus/local_multiplayer/LocalMultiplayer.gd')
-rw-r--r--ui/menus/local_multiplayer/LocalMultiplayer.gd115
1 files changed, 115 insertions, 0 deletions
diff --git a/ui/menus/local_multiplayer/LocalMultiplayer.gd b/ui/menus/local_multiplayer/LocalMultiplayer.gd
new file mode 100644
index 0000000..c7596ec
--- /dev/null
+++ b/ui/menus/local_multiplayer/LocalMultiplayer.gd
@@ -0,0 +1,115 @@
+extends Control
+
+onready var gameconfig := $"%GameConfig"
+
+var in_game := false
+
+enum MODES { PVP, PVE, EVE }
+enum { HUMAN, ENGINE }
+
+var mode: int = -1
+
+var board_engine_bridge: BoardEngineBridge = null
+
+
+func create(moves: PoolStringArray, player1_color: bool, players: PoolIntArray, engine_depth: int) -> void:
+ assign_mode(players)
+ Globals.local = true
+ var ui: Control = load("res://ui/board/Game.tscn").instance()
+ var b: Grid = ui.get_board()
+ b.local = true
+ Log.debug("Set board team to %s" % Utils.expand_color(b.team))
+ get_tree().get_root().add_child(ui)
+ PacketHandler.lobby.toggle(false)
+
+ match mode:
+ MODES.PVP:
+ pass # nothing to do ?
+ MODES.PVE:
+ b.team = "w" if player1_color == true else "b"
+ board_engine_bridge = BoardEngineBridge.new(b, [Chess.__swap_color(b.team)], get_tree(), engine_depth)
+ MODES.EVE:
+ b.team = b.chess.turn
+ Globals.spectating = true
+ board_engine_bridge = BoardEngineBridge.new(b, ["w", "b"], get_tree(), engine_depth)
+ get_tree().call_group("userpanel", "hide_children")
+ get_tree().call_group("backbutton", "queue_free")
+
+ yield(get_tree(), "idle_frame")
+ b.load_pgn(moves.join(" ")) # load_pgn emits Events.turn_over
+ b.auto_flip()
+ Globals.chat.hide()
+
+
+func assign_mode(players: PoolIntArray) -> void:
+ if players.count(HUMAN) == 2:
+ mode = MODES.PVP
+ elif players.count(ENGINE) == 2:
+ mode = MODES.EVE
+ else:
+ mode = MODES.PVE
+
+
+func _pressed():
+ if gameconfig.visible:
+ create(gameconfig.moves, gameconfig.color, gameconfig.players, gameconfig.depth)
+ gameconfig.hide()
+ else:
+ gameconfig.show()
+
+
+func _input(_event):
+ if Input.is_action_pressed("ui_cancel") and Globals.local == true:
+ if board_engine_bridge:
+ board_engine_bridge.kill()
+ board_engine_bridge = null
+ PacketHandler.go_back("", true)
+ get_node("/root/Game").queue_free()
+ PacketHandler.lobby.toggle(true)
+ Globals.reset_vars()
+ get_parent().current_tab = get_parent().get_children().find(self)
+
+
+class BoardEngineBridge:
+ extends Reference
+
+ var b: Grid
+ var stockfish: Stockfish
+ var playing := PoolStringArray()
+ var tree: SceneTree
+ var depth: int
+
+ func _init(board: Grid, teams: PoolStringArray, _tree: SceneTree, _depth: int) -> void:
+ connect_signals()
+ depth = _depth
+ tree = _tree
+ playing = teams
+ b = board
+ var loader = StockfishLoader.new()
+ stockfish = loader.load_stockfish()
+ stockfish.game = b.chess
+
+ func connect_signals():
+ Events.connect("turn_over", self, "turn_over")
+
+ func turn_over():
+ set_engine_position()
+ if stockfish.game.turn in playing:
+ play_bestmove()
+
+ func play_bestmove():
+ yield(tree, "idle_frame")
+ var move: String = yield(bestmove(), "completed")
+ b.move(move, false, false)
+
+ func set_engine_position():
+ stockfish._position()
+
+ func bestmove() -> String:
+ stockfish.go(depth)
+ var bestmove = yield(stockfish, "bestmove")
+ return bestmove.san
+
+ func kill() -> void:
+ stockfish.kill()
+ stockfish = null