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.gd | 115 |
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 |