From 1e33cf3b4054656cedbe6c69f2a7dab4fc4aadbd Mon Sep 17 00:00:00 2001 From: programarivm Date: Mon, 25 Nov 2024 09:49:20 +0100 Subject: [PATCH] Added Capablanca variants --- composer.lock | 28 ++++++++-------- src/Command/Game/Async/HeuristicTask.php | 13 ++++++++ src/Command/Game/Async/RestartCommand.php | 5 +++ src/Command/Game/Game.php | 10 ++++++ src/Command/Game/Sync/StartCommand.php | 40 ++++++++++++++++++++++- 5 files changed, 81 insertions(+), 15 deletions(-) diff --git a/composer.lock b/composer.lock index 9cd3dd37..3873501c 100644 --- a/composer.lock +++ b/composer.lock @@ -621,11 +621,11 @@ }, { "name": "chesslablab/php-chess", - "version": "1.4.78", + "version": "1.4.79", "source": { "type": "git", "url": "https://github.com/chesslablab/php-chess.git", - "reference": "ac9d0462908e7fdfe2f30b20f8ca85773d9e5039" + "reference": "2892b8f64e09008269c793f0efa7850f9a51da14" }, "require": { "imagine/imagine": "^1.2", @@ -682,7 +682,7 @@ "validate", "validator" ], - "time": "2024-11-22T17:29:04+00:00" + "time": "2024-11-24T16:19:21+00:00" }, { "name": "evenement/evenement", @@ -733,16 +733,16 @@ }, { "name": "firebase/php-jwt", - "version": "v6.10.1", + "version": "v6.10.2", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "500501c2ce893c824c801da135d02661199f60c5" + "reference": "30c19ed0f3264cb660ea496895cfb6ef7ee3653b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/500501c2ce893c824c801da135d02661199f60c5", - "reference": "500501c2ce893c824c801da135d02661199f60c5", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/30c19ed0f3264cb660ea496895cfb6ef7ee3653b", + "reference": "30c19ed0f3264cb660ea496895cfb6ef7ee3653b", "shasum": "" }, "require": { @@ -790,9 +790,9 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.10.1" + "source": "https://github.com/firebase/php-jwt/tree/v6.10.2" }, - "time": "2024-05-18T18:05:11+00:00" + "time": "2024-11-24T11:22:49+00:00" }, { "name": "graham-campbell/result-type", @@ -3940,16 +3940,16 @@ }, { "name": "workerman/workerman", - "version": "v4.2.0", + "version": "v4.2.1", "source": { "type": "git", "url": "https://github.com/walkor/workerman.git", - "reference": "df513f3fd274811ebb8358d05d7cec19ee8bd3e1" + "reference": "cafb5a43d93d7d30a16b32a57948581cca993562" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/walkor/workerman/zipball/df513f3fd274811ebb8358d05d7cec19ee8bd3e1", - "reference": "df513f3fd274811ebb8358d05d7cec19ee8bd3e1", + "url": "https://api.github.com/repos/walkor/workerman/zipball/cafb5a43d93d7d30a16b32a57948581cca993562", + "reference": "cafb5a43d93d7d30a16b32a57948581cca993562", "shasum": "" }, "require": { @@ -3999,7 +3999,7 @@ "type": "patreon" } ], - "time": "2024-11-07T08:31:33+00:00" + "time": "2024-11-24T11:45:37+00:00" } ], "packages-dev": [ diff --git a/src/Command/Game/Async/HeuristicTask.php b/src/Command/Game/Async/HeuristicTask.php index 84f1a601..2b11c388 100644 --- a/src/Command/Game/Async/HeuristicTask.php +++ b/src/Command/Game/Async/HeuristicTask.php @@ -4,6 +4,10 @@ use Chess\SanHeuristics; use Chess\Function\CompleteFunction; +use Chess\Variant\Capablanca\Board as CapablancaBoard; +use Chess\Variant\Capablanca\FEN\StrToBoard as CapablancaFenStrToBoard; +use Chess\Variant\CapablancaFischer\Board as CapablancaFischerBoard; +use Chess\Variant\CapablancaFischer\FEN\StrToBoard as CapablancaFischerFenStrToBoard; use Chess\Variant\Chess960\Board as Chess960Board; use Chess\Variant\Chess960\FEN\StrToBoard as Chess960FenStrToBoard; use Chess\Variant\Classical\Board as ClassicalBoard; @@ -19,6 +23,15 @@ public function run() $board = isset($this->params['fen']) ? (new Chess960FenStrToBoard($this->params['fen'], $startPos))->create() : new Chess960Board($startPos); + } elseif ($this->params['variant'] === CapablancaBoard::VARIANT) { + $board = isset($this->params['fen']) + ? (new CapablancaFenStrToBoard($this->params['fen']))->create() + : new CapablancaBoard(); + } elseif ($this->params['variant'] === CapablancaFischerBoard::VARIANT) { + $startPos = str_split($this->params['startPos']); + $board = isset($this->params['fen']) + ? (new CapablancaFischerFenStrToBoard($this->params['fen'], $startPos))->create() + : new CapablancaFischerBoard($startPos); } elseif ($this->params['variant'] === ClassicalBoard::VARIANT) { $board = isset($this->params['fen']) ? (new ClassicalFenStrToBoard($this->params['fen']))->create() diff --git a/src/Command/Game/Async/RestartCommand.php b/src/Command/Game/Async/RestartCommand.php index 0fcb064e..2cb2dc85 100644 --- a/src/Command/Game/Async/RestartCommand.php +++ b/src/Command/Game/Async/RestartCommand.php @@ -2,6 +2,7 @@ namespace ChessServer\Command\Game\Async; +use Chess\Variant\CapablancaFischer\FEN\StrToBoard as CapablancaFischerFenStrToBoard; use Chess\Variant\Chess960\FEN\StrToBoard as Chess960FenStrToBoard; use Chess\Variant\Classical\PGN\AN\Color; use ChessServer\Command\AbstractAsyncCommand; @@ -36,6 +37,10 @@ public function run(AbstractSocket $socket, array $argv, int $id) $startPos = str_split($result->startPos); $board = (new Chess960FenStrToBoard($result->fen, $startPos))->create(); $game = (new Game($result->variant, Game::MODE_PLAY))->setBoard($board); + } elseif ($result->variant === Game::VARIANT_CAPABLANCA_FISCHER) { + $startPos = str_split($result->startPos); + $board = (new CapablancaFischerFenStrToBoard($result->fen, $startPos))->create(); + $game = (new Game($result->variant, Game::MODE_PLAY))->setBoard($board); } else { $game = new Game($result->variant, Game::MODE_PLAY); } diff --git a/src/Command/Game/Game.php b/src/Command/Game/Game.php index 6ab55af1..ad0ae7a7 100644 --- a/src/Command/Game/Game.php +++ b/src/Command/Game/Game.php @@ -3,6 +3,9 @@ namespace ChessServer\Command\Game; use Chess\Variant\AbstractBoard; +use Chess\Variant\Capablanca\Board as CapablancaBoard; +use Chess\Variant\CapablancaFischer\Board as CapablancaFischerBoard; +use Chess\Variant\CapablancaFischer\StartPosition as CapablancaFischerStartPosition; use Chess\Variant\Chess960\Board as Chess960Board; use Chess\Variant\Chess960\StartPosition as Chess960StartPosition; use Chess\Variant\Classical\Board as ClassicalBoard; @@ -15,6 +18,8 @@ class Game { const VARIANT_960 = Chess960Board::VARIANT; + const VARIANT_CAPABLANCA = CapablancaBoard::VARIANT; + const VARIANT_CAPABLANCA_FISCHER = CapablancaFischerBoard::VARIANT; const VARIANT_CLASSICAL = ClassicalBoard::VARIANT; const VARIANT_DUNSANY = DunsanyBoard::VARIANT; const VARIANT_LOSING = LosingBoard::VARIANT; @@ -42,6 +47,11 @@ public function __construct(string $variant, string $mode) if ($this->variant === self::VARIANT_960) { $startPos = (new Chess960StartPosition())->create(); $this->board = new Chess960Board($startPos); + } elseif ($this->variant === self::VARIANT_CAPABLANCA) { + $this->board = new CapablancaBoard(); + } elseif ($this->variant === self::VARIANT_CAPABLANCA_FISCHER) { + $startPos = (new CapablancaFischerStartPosition())->create(); + $this->board = new CapablancaFischerBoard($startPos); } elseif ($this->variant === self::VARIANT_CLASSICAL) { $this->board = new ClassicalBoard(); } elseif ($this->variant === self::VARIANT_DUNSANY) { diff --git a/src/Command/Game/Sync/StartCommand.php b/src/Command/Game/Sync/StartCommand.php index a2941476..b72a38cd 100644 --- a/src/Command/Game/Sync/StartCommand.php +++ b/src/Command/Game/Sync/StartCommand.php @@ -4,9 +4,11 @@ use Chess\FenToBoardFactory; use Chess\Play\SanPlay; +use Chess\Variant\Capablanca\Board as CapablancaBoard; +use Chess\Variant\CapablancaFischer\Board as CapablancaFischerBoard; +use Chess\Variant\CapablancaFischer\StartPosition as CapablancaFischerStartPosition; use Chess\Variant\Chess960\Board as Chess960Board; use Chess\Variant\Chess960\StartPosition as Chess960StartPosition; -use Chess\Variant\Chess960\FEN\StrToBoard as Chess960FenStrToBoard; use Chess\Variant\Classical\Board as ClassicalBoard; use Chess\Variant\Classical\PGN\AN\Color; use Chess\Variant\Dunsany\Board as DunsanyBoard; @@ -50,6 +52,18 @@ public function run(AbstractSocket $socket, array $argv, int $id) $startPos = (new Chess960StartPosition())->create(); $board = new Chess960Board($startPos); } + } elseif ($params['variant'] === Game::VARIANT_CAPABLANCA) { + $board = isset($params['settings']['fen']) + ? FenToBoardFactory::create($params['settings']['fen'], new CapablancaBoard()) + : new CapablancaBoard(); + } elseif ($params['variant'] === Game::VARIANT_CAPABLANCA_FISCHER) { + if (isset($params['settings']['startPos']) && isset($params['settings']['fen'])) { + $startPos = str_split($params['settings']['startPos']); + $board = FenToBoardFactory::create($params['settings']['fen'], new CapablancaFischerBoard($startPos)); + } else { + $startPos = (new CapablancaFischerStartPosition())->create(); + $board = new CapablancaFischerBoard($startPos); + } } elseif ($params['variant'] === Game::VARIANT_DUNSANY) { $board = isset($params['settings']['fen']) ? FenToBoardFactory::create($params['settings']['fen'], new DunsanyBoard()) @@ -84,6 +98,10 @@ public function run(AbstractSocket $socket, array $argv, int $id) ? ['startPos' => implode('', $startPos)] : [] ), + ...($params['variant'] === Game::VARIANT_CAPABLANCA_FISCHER + ? ['startPos' => implode('', $startPos)] + : [] + ), ], ]); } catch (\Throwable $e) { @@ -103,6 +121,18 @@ public function run(AbstractSocket $socket, array $argv, int $id) $startPos = (new Chess960StartPosition())->create(); $board = new Chess960Board($startPos); } + } elseif ($params['variant'] === Game::VARIANT_CAPABLANCA) { + $board = isset($params['settings']['fen']) + ? FenToBoardFactory::create($params['settings']['fen'], new CapablancaBoard()) + : new CapablancaBoard(); + } elseif ($params['variant'] === Game::VARIANT_CAPABLANCA_FISCHER) { + if (isset($params['settings']['startPos']) && isset($params['settings']['fen'])) { + $startPos = str_split($params['settings']['startPos']); + $board = FenToBoardFactory::create($params['settings']['fen'], new CapablancaFischerBoard($startPos)); + } else { + $startPos = (new CapablancaFischerStartPosition())->create(); + $board = new CapablancaFischerBoard($startPos); + } } elseif ($params['variant'] === Game::VARIANT_DUNSANY) { $board = isset($params['settings']['fen']) ? FenToBoardFactory::create($params['settings']['fen'], new DunsanyBoard()) @@ -151,6 +181,10 @@ public function run(AbstractSocket $socket, array $argv, int $id) ? ['startPos' => implode('', $game->getBoard()->getStartPos())] : [] ), + ...($params['variant'] === Game::VARIANT_CAPABLANCA_FISCHER + ? ['startPos' => implode('', $game->getBoard()->getStartPos())] + : [] + ), ...(isset($params['settings']['fen']) ? ['fen' => $params['settings']['fen']] : [] @@ -182,6 +216,10 @@ public function run(AbstractSocket $socket, array $argv, int $id) ? ['startPos' => implode('', $game->getBoard()->getStartPos())] : [] ), + ...($params['variant'] === Game::VARIANT_CAPABLANCA_FISCHER + ? ['startPos' => implode('', $game->getBoard()->getStartPos())] + : [] + ), ], ]); } catch (\Throwable $e) {