summaryrefslogtreecommitdiff
path: root/packages/misskey-reversi/src/serializer.ts
blob: aa5987a1e5e128c03402cc14658cdf465b3e7074 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/*
 * SPDX-FileCopyrightText: syuilo and misskey-project
 * SPDX-License-Identifier: AGPL-3.0-only
 */

import { Game } from './game.js';

export type Log = {
	time: number;
	player: boolean;
	operation: 'put';
	pos: number;
};

export type SerializedLog = number[];

export function serializeLogs(logs: Log[]) {
	const _logs: number[][] = [];

	for (let i = 0; i < logs.length; i++) {
		const log = logs[i];
		const timeDelta = i === 0 ? log.time : log.time - logs[i - 1].time;

		switch (log.operation) {
			case 'put':
				_logs.push([timeDelta, log.player ? 1 : 0, 0, log.pos]);
				break;
			//case 'surrender':
			//	_logs.push([timeDelta, log.player, 1]);
			//	break;
		}
	}

	return _logs;
}

export function deserializeLogs(logs: SerializedLog[]) {
	const _logs: Log[] = [];

	let time = 0;

	for (const log of logs) {
		const timeDelta = log[0];
		time += timeDelta;

		const player = log[1];
		const operation = log[2];

		switch (operation) {
			case 0:
				_logs.push({
					time,
					player: player === 1,
					operation: 'put',
					pos: log[3],
				});
				break;
			//case 1:
			//	_logs.push({
			//		time,
			//		player: player === 1,
			//		operation: 'surrender',
			//	});
			//	break;
		}
	}

	return _logs;
}

export function restoreGame(env: {
	map: string[];
	isLlotheo: boolean;
	canPutEverywhere: boolean;
	loopedBoard: boolean;
	logs: SerializedLog[];
}) {
	const logs = deserializeLogs(env.logs);

	const game = new Game(env.map, {
		isLlotheo: env.isLlotheo,
		canPutEverywhere: env.canPutEverywhere,
		loopedBoard: env.loopedBoard,
	});

	for (const log of logs) {
		switch (log.operation) {
			case 'put':
				game.putStone(log.pos);
				break;
			//case 'surrender':
			//	game.surrender(log.player);
			//	break;
		}
	}

	return game;
}