summaryrefslogtreecommitdiff
path: root/packages/backend/src/core/ReversiService.ts
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2024-01-20 13:14:46 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2024-01-20 13:14:46 +0900
commitb9a81edae5bfbd2a5b0d03e9b523a04ea5cf4bc5 (patch)
treecc4c823f7cec3d5b6b84a42bbcb665ae3825af31 /packages/backend/src/core/ReversiService.ts
parentfix(dev): fix pnpm dev (diff)
downloadsharkey-b9a81edae5bfbd2a5b0d03e9b523a04ea5cf4bc5.tar.gz
sharkey-b9a81edae5bfbd2a5b0d03e9b523a04ea5cf4bc5.tar.bz2
sharkey-b9a81edae5bfbd2a5b0d03e9b523a04ea5cf4bc5.zip
enhance(reversi): tweak reversi
Diffstat (limited to 'packages/backend/src/core/ReversiService.ts')
-rw-r--r--packages/backend/src/core/ReversiService.ts51
1 files changed, 28 insertions, 23 deletions
diff --git a/packages/backend/src/core/ReversiService.ts b/packages/backend/src/core/ReversiService.ts
index 6e80261330..9fe7255e48 100644
--- a/packages/backend/src/core/ReversiService.ts
+++ b/packages/backend/src/core/ReversiService.ts
@@ -235,11 +235,14 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
const map = freshGame.map != null ? freshGame.map : getRandomMap();
+ const crc32 = CRC32.str(JSON.stringify(freshGame.logs)).toString();
+
await this.reversiGamesRepository.update(game.id, {
startedAt: new Date(),
isStarted: true,
black: bw,
map: map,
+ crc32,
});
//#region 盤面に最初から石がないなどして始まった瞬間に勝敗が決定する場合があるのでその処理
@@ -309,7 +312,7 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
}
@bindThis
- public async putStoneToGame(game: MiReversiGame, user: MiUser, pos: number) {
+ public async putStoneToGame(game: MiReversiGame, user: MiUser, pos: number, id?: string | null) {
if (!game.isStarted) return;
if (game.isEnded) return;
if ((game.user1Id !== user.id) && (game.user2Id !== user.id)) return;
@@ -319,56 +322,58 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
? true
: false;
- const o = new Reversi.Game(game.map, {
+ const engine = Reversi.Serializer.restoreGame({
+ map: game.map,
isLlotheo: game.isLlotheo,
canPutEverywhere: game.canPutEverywhere,
loopedBoard: game.loopedBoard,
+ logs: game.logs,
});
- // 盤面の状態を再生
- for (const log of game.logs) {
- o.put(log.color, log.pos);
- }
-
- if (o.turn !== myColor) return;
+ if (engine.turn !== myColor) return;
+ if (!engine.canPut(myColor, pos)) return;
- if (!o.canPut(myColor, pos)) return;
- o.put(myColor, pos);
+ engine.putStone(pos);
let winner;
- if (o.isEnded) {
- if (o.winner === true) {
+ if (engine.isEnded) {
+ if (engine.winner === true) {
winner = game.black === 1 ? game.user1Id : game.user2Id;
- } else if (o.winner === false) {
+ } else if (engine.winner === false) {
winner = game.black === 1 ? game.user2Id : game.user1Id;
} else {
winner = null;
}
}
+ const logs = Reversi.Serializer.deserializeLogs(game.logs);
+
const log = {
- at: Date.now(),
- color: myColor,
+ time: Date.now(),
+ player: myColor,
+ operation: 'put',
pos,
- };
+ } as const;
+
+ logs.push(log);
- const crc32 = CRC32.str(game.logs.map(x => x.pos.toString()).join('') + pos.toString()).toString();
+ const serializeLogs = Reversi.Serializer.serializeLogs(logs);
- game.logs.push(log);
+ const crc32 = CRC32.str(JSON.stringify(serializeLogs)).toString();
await this.reversiGamesRepository.update(game.id, {
crc32,
- isEnded: o.isEnded,
+ isEnded: engine.isEnded,
winnerId: winner,
- logs: game.logs,
+ logs: serializeLogs,
});
- this.globalEventService.publishReversiGameStream(game.id, 'putStone', {
+ this.globalEventService.publishReversiGameStream(game.id, 'log', {
...log,
- next: o.turn,
+ id: id ?? null,
});
- if (o.isEnded) {
+ if (engine.isEnded) {
this.globalEventService.publishReversiGameStream(game.id, 'ended', {
winnerId: winner ?? null,
game: await this.reversiGameEntityService.packDetail(game.id, user),