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 | 221 |
1 files changed, 0 insertions, 221 deletions
diff --git a/ui/menus/local_multiplayer/LocalMultiplayer.gd b/ui/menus/local_multiplayer/LocalMultiplayer.gd deleted file mode 100644 index bdd232c..0000000 --- a/ui/menus/local_multiplayer/LocalMultiplayer.gd +++ /dev/null @@ -1,221 +0,0 @@ -extends Control -class_name LocalMultiplayer - -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 - -var ui: GameUI - - -func create(moves: PoolStringArray, player1_color: bool, players: PoolIntArray, engine_depth: int) -> void: - assign_mode(players) - Globals.local = self - ui = load("res://ui/board/Game.tscn").instance() - var b: Grid = ui.get_board() as Grid - 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: - b.auto_change_team = true - b.team = "w" - ui._on_info({name = "Anonymous", country = "rainbow"}) - 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) - ui._on_info(BoardEngineBridge.info) - board_engine_bridge.connect("nps", self, "set_nps", [1 if player1_color == true else 0]) - board_engine_bridge.connect("depth", self, "set_thinking", [1 if player1_color == true else 0]) - if board_engine_bridge.is_ready() == false: - var engine_p: UserPanel = ui.panels[int(Globals.grid.team == "w")] - engine_p.loading = true - board_engine_bridge.connect("ready", engine_p, "set_loading", [false]) - MODES.EVE: - b.team = b.chess.turn - Globals.spectating = true - board_engine_bridge = BoardEngineBridge.new(b, ["w", "b"], get_tree(), engine_depth) - ui._spectate_info({white = BoardEngineBridge.info, black = BoardEngineBridge.info}) - board_engine_bridge.connect("nps", self, "set_nps") - board_engine_bridge.connect("depth", self, "set_thinking") - if board_engine_bridge.is_ready() == false: - for e_p in ui.panels: - e_p.loading = true - board_engine_bridge.connect("ready", e_p, "set_loading", [false]) - - get_tree().call_group("backbutton", "queue_free") - - yield(get_tree(), "idle_frame") - if mode in [MODES.EVE, MODES.PVE]: - for panel in ui.panels: - panel.thinking_display.max_value = engine_depth - - b.load_pgn(moves.join(" ")) # load_pgn emits Events.turn_over - b.auto_flip() - Globals.chat.hide() - in_game = true - - -func flip_int(i: int) -> int: - return 1 if i == 0 else 0 - - -func set_nps(nps: int, on: int = 0 if board_engine_bridge.turn == "w" else 1) -> void: - if is_instance_valid(ui.panels[on]): - ui.panels[on].nps = nps - ui.panels[flip_int(on)].nps = 0 # turn it off - - -# thinking: depth -func set_thinking(thinking: int, on: int = 0 if board_engine_bridge.turn == "w" else 1): - if is_instance_valid(ui.panels[on]): - if thinking == 0 || ui.panels[on].thinking < thinking: # depth can go down too - ui.panels[on].thinking = thinking - ui.panels[flip_int(on)].thinking = 0 - - -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 and in_game: - Events.emit_signal("go_back", "", true) - - -func _init() -> void: - Events.connect("go_back", self, "go_back") - - -func go_back(_reason: String, _isok: bool) -> void: - if in_game: - in_game = false - 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) - - -func undo(two: bool = false) -> void: - board_engine_bridge.undo(two) - - -class BoardEngineBridge: - extends Reference - signal nps(nps) - signal depth(depth) - # warning-ignore:unused_signal - signal ready # is emitted by connect_signals[#l4] - - const info := {name = "Stockfish", country = "antartica"} - - var b: Grid - var stockfish: Stockfish - var playing := PoolStringArray() - var tree: SceneTree - var depth: int - var searching: bool = false - var ready: bool setget , is_ready - - var turn: String = "" setget , get_turn - - func get_turn() -> String: - return stockfish.game.turn - - func is_ready() -> bool: - return stockfish.engine_ready - - func _init(board: Grid, teams: PoolStringArray, _tree: SceneTree, _depth: int) -> void: - depth = _depth - tree = _tree - playing = teams - b = board - var loader = StockfishLoader.new() - stockfish = loader.load_stockfish() - stockfish.game = b.chess - connect_signals() - - func connect_signals(): - stockfish.connect("info", self, "_info") - stockfish.connect("bestmove", self, "clear_arrows") - stockfish.connect("bestmove", self, "play_bestmove") - stockfish.connect("engine_ready", self, "emit_signal", ["ready"]) - Events.connect("turn_over", self, "turn_over") - - func undo(two: bool = false) -> void: - stockfish.stop() - b.undo(two) - set_engine_position() - - func _info(info: Dictionary): - if searching == false: - return - if info.get("nps", false): - emit_signal("nps", info.nps) - if info.get("depth", false): - emit_signal("depth", info.depth) - if info.get("pv", false): - var bm = stockfish.game.__move_from_uci(info.pv[0]) - clear_arrows() - var arrows := b.arrows - var arrow: Dictionary = arrows.build_arrow( - Chess.vecfrom0x88(bm.from), Chess.vecfrom0x88(bm.to), Color(0.286275, 0.564706, 0.768627) - ) - arrow["engine_arrow"] = true - arrows.arrows.append(arrow) - arrows.shorten_arrows_at(Chess.vecfrom0x88(bm.to)) - - func clear_arrows(_arg = ""): - var good_array := [] - for arrow in b.arrows.arrows: - if arrow.get("engine_arrow", false) == false: - good_array.append(arrow) - b.arrows.arrows = good_array - - func turn_over(): - set_engine_position() - if stockfish.game.turn in playing: - find_bestmove() - - # play_bestmove() will play the move when its found - func find_bestmove(): - yield(tree, "idle_frame") - stockfish.go(depth) - searching = true - - func play_bestmove(move: Dictionary) -> void: - emit_signal("depth", 0) - emit_signal("nps", 0) - b.move(move.san, false, false) - - func set_engine_position(): - stockfish._position() - - func kill() -> void: - stockfish.kill() - stockfish = null |