fix older replays

This commit is contained in:
Zutatensuppe 2021-07-08 00:00:17 +02:00
parent d009f84156
commit 2b0dc392da
10 changed files with 105 additions and 54 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -4,7 +4,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>🧩 jigsaw.hyottoko.club</title> <title>🧩 jigsaw.hyottoko.club</title>
<script type="module" crossorigin src="/assets/index.855f4dd3.js"></script> <script type="module" crossorigin src="/assets/index.cc6b4801.js"></script>
<link rel="modulepreload" href="/assets/vendor.684f7bc8.js"> <link rel="modulepreload" href="/assets/vendor.684f7bc8.js">
<link rel="stylesheet" href="/assets/index.22dc307c.css"> <link rel="stylesheet" href="/assets/index.22dc307c.css">
</head> </head>

View file

@ -11,29 +11,6 @@ import sharp from 'sharp';
import v8 from 'v8'; import v8 from 'v8';
import bsqlite from 'better-sqlite3'; import bsqlite from 'better-sqlite3';
var PieceEdge;
(function (PieceEdge) {
PieceEdge[PieceEdge["Flat"] = 0] = "Flat";
PieceEdge[PieceEdge["Out"] = 1] = "Out";
PieceEdge[PieceEdge["In"] = -1] = "In";
})(PieceEdge || (PieceEdge = {}));
var ScoreMode;
(function (ScoreMode) {
ScoreMode[ScoreMode["FINAL"] = 0] = "FINAL";
ScoreMode[ScoreMode["ANY"] = 1] = "ANY";
})(ScoreMode || (ScoreMode = {}));
var ShapeMode;
(function (ShapeMode) {
ShapeMode[ShapeMode["NORMAL"] = 0] = "NORMAL";
ShapeMode[ShapeMode["ANY"] = 1] = "ANY";
ShapeMode[ShapeMode["FLAT"] = 2] = "FLAT";
})(ShapeMode || (ShapeMode = {}));
var SnapMode;
(function (SnapMode) {
SnapMode[SnapMode["NORMAL"] = 0] = "NORMAL";
SnapMode[SnapMode["REAL"] = 1] = "REAL";
})(SnapMode || (SnapMode = {}));
class Rng { class Rng {
constructor(seed) { constructor(seed) {
this.rand_high = seed || 0xDEADC0DE; this.rand_high = seed || 0xDEADC0DE;
@ -175,9 +152,9 @@ function encodeGame(data) {
data.puzzle, data.puzzle,
data.players, data.players,
data.evtInfos, data.evtInfos,
data.scoreMode || ScoreMode.FINAL, data.scoreMode,
data.shapeMode || ShapeMode.ANY, data.shapeMode,
data.snapMode || SnapMode.NORMAL, data.snapMode,
]; ];
} }
function decodeGame(data) { function decodeGame(data) {
@ -494,6 +471,47 @@ var Time = {
durationStr, durationStr,
}; };
var PieceEdge;
(function (PieceEdge) {
PieceEdge[PieceEdge["Flat"] = 0] = "Flat";
PieceEdge[PieceEdge["Out"] = 1] = "Out";
PieceEdge[PieceEdge["In"] = -1] = "In";
})(PieceEdge || (PieceEdge = {}));
var ScoreMode;
(function (ScoreMode) {
ScoreMode[ScoreMode["FINAL"] = 0] = "FINAL";
ScoreMode[ScoreMode["ANY"] = 1] = "ANY";
})(ScoreMode || (ScoreMode = {}));
var ShapeMode;
(function (ShapeMode) {
ShapeMode[ShapeMode["NORMAL"] = 0] = "NORMAL";
ShapeMode[ShapeMode["ANY"] = 1] = "ANY";
ShapeMode[ShapeMode["FLAT"] = 2] = "FLAT";
})(ShapeMode || (ShapeMode = {}));
var SnapMode;
(function (SnapMode) {
SnapMode[SnapMode["NORMAL"] = 0] = "NORMAL";
SnapMode[SnapMode["REAL"] = 1] = "REAL";
})(SnapMode || (SnapMode = {}));
const DefaultScoreMode = (v) => {
if (v === ScoreMode.FINAL || v === ScoreMode.ANY) {
return v;
}
return ScoreMode.FINAL;
};
const DefaultShapeMode = (v) => {
if (v === ShapeMode.NORMAL || v === ShapeMode.ANY || v === ShapeMode.FLAT) {
return v;
}
return ShapeMode.NORMAL;
};
const DefaultSnapMode = (v) => {
if (v === SnapMode.NORMAL || v === SnapMode.REAL) {
return v;
}
return SnapMode.NORMAL;
};
const IDLE_TIMEOUT_SEC = 30; const IDLE_TIMEOUT_SEC = 30;
// Map<gameId, Game> // Map<gameId, Game>
const GAMES = {}; const GAMES = {};
@ -614,10 +632,10 @@ function setImageUrl(gameId, imageUrl) {
GAMES[gameId].puzzle.info.imageUrl = imageUrl; GAMES[gameId].puzzle.info.imageUrl = imageUrl;
} }
function getScoreMode(gameId) { function getScoreMode(gameId) {
return GAMES[gameId].scoreMode || ScoreMode.FINAL; return GAMES[gameId].scoreMode;
} }
function getSnapMode(gameId) { function getSnapMode(gameId) {
return GAMES[gameId].snapMode || SnapMode.NORMAL; return GAMES[gameId].snapMode;
} }
function isFinished(gameId) { function isFinished(gameId) {
return getFinishedPiecesCount(gameId) === getPieceCount(gameId); return getFinishedPiecesCount(gameId) === getPieceCount(gameId);
@ -1323,10 +1341,16 @@ const get = (gameId, offset = 0) => {
if (!fs.existsSync(file)) { if (!fs.existsSync(file)) {
return []; return [];
} }
const log = fs.readFileSync(file, 'utf-8').split("\n"); const lines = fs.readFileSync(file, 'utf-8').split("\n");
return log.filter(line => !!line).map(line => { const log = lines.filter(line => !!line).map(line => {
return JSON.parse(`[${line}]`); return JSON.parse(`[${line}]`);
}); });
if (offset === 0 && log.length > 0) {
log[0][5] = DefaultScoreMode(log[0][5]);
log[0][6] = DefaultShapeMode(log[0][6]);
log[0][7] = DefaultSnapMode(log[0][7]);
}
return log;
}; };
var GameLog = { var GameLog = {
shouldLog, shouldLog,
@ -1759,9 +1783,9 @@ function loadGame(gameId) {
puzzle: game.puzzle, puzzle: game.puzzle,
players: game.players, players: game.players,
evtInfos: {}, evtInfos: {},
scoreMode: game.scoreMode || ScoreMode.FINAL, scoreMode: DefaultScoreMode(game.scoreMode),
shapeMode: game.shapeMode || ShapeMode.ANY, shapeMode: DefaultShapeMode(game.shapeMode),
snapMode: game.snapMode || SnapMode.NORMAL, snapMode: DefaultSnapMode(game.snapMode),
}; };
GameCommon.setGame(gameObject.id, gameObject); GameCommon.setGame(gameObject.id, gameObject);
} }
@ -2090,7 +2114,7 @@ app.get('/api/replay-data', async (req, res) => {
let game = null; let game = null;
if (offset === 0) { if (offset === 0) {
// also need the game // also need the game
game = await Game.createGameObject(gameId, log[0][2], log[0][3], log[0][4], log[0][5] || ScoreMode.FINAL, log[0][6] || ShapeMode.NORMAL, log[0][7] || SnapMode.NORMAL); game = await Game.createGameObject(gameId, log[0][2], log[0][3], log[0][4], log[0][5], log[0][6], log[0][7]);
} }
res.send({ log, game: game ? Util.encodeGame(game) : null }); res.send({ log, game: game ? Util.encodeGame(game) : null });
}); });

View file

@ -170,11 +170,11 @@ function setImageUrl(gameId: string, imageUrl: string): void {
} }
function getScoreMode(gameId: string): ScoreMode { function getScoreMode(gameId: string): ScoreMode {
return GAMES[gameId].scoreMode || ScoreMode.FINAL return GAMES[gameId].scoreMode
} }
function getSnapMode(gameId: string): SnapMode { function getSnapMode(gameId: string): SnapMode {
return GAMES[gameId].snapMode || SnapMode.NORMAL return GAMES[gameId].snapMode
} }
function isFinished(gameId: string): boolean { function isFinished(gameId: string): boolean {

View file

@ -75,9 +75,9 @@ export interface Game {
players: Array<EncodedPlayer> players: Array<EncodedPlayer>
puzzle: Puzzle puzzle: Puzzle
evtInfos: Record<string, EvtInfo> evtInfos: Record<string, EvtInfo>
scoreMode?: ScoreMode scoreMode: ScoreMode
shapeMode?: ShapeMode shapeMode: ShapeMode
snapMode?: SnapMode snapMode: SnapMode
rng: GameRng rng: GameRng
} }
@ -216,3 +216,24 @@ export enum SnapMode {
NORMAL = 0, NORMAL = 0,
REAL = 1, REAL = 1,
} }
export const DefaultScoreMode = (v: any): ScoreMode => {
if (v === ScoreMode.FINAL || v === ScoreMode.ANY) {
return v
}
return ScoreMode.FINAL
}
export const DefaultShapeMode = (v: any): ShapeMode => {
if (v === ShapeMode.NORMAL || v === ShapeMode.ANY || v === ShapeMode.FLAT) {
return v
}
return ShapeMode.NORMAL
}
export const DefaultSnapMode = (v: any): SnapMode => {
if (v === SnapMode.NORMAL || v === SnapMode.REAL) {
return v
}
return SnapMode.NORMAL
}

View file

@ -130,9 +130,9 @@ function encodeGame(data: Game): EncodedGame {
data.puzzle, data.puzzle,
data.players, data.players,
data.evtInfos, data.evtInfos,
data.scoreMode || ScoreMode.FINAL, data.scoreMode,
data.shapeMode || ShapeMode.ANY, data.shapeMode,
data.snapMode || SnapMode.NORMAL, data.snapMode,
] ]
} }

View file

@ -1,7 +1,7 @@
import fs from 'fs' import fs from 'fs'
import Protocol from '../common/Protocol' import Protocol from '../common/Protocol'
import Time from '../common/Time' import Time from '../common/Time'
import { Timestamp } from '../common/Types' import { DefaultScoreMode, DefaultShapeMode, DefaultSnapMode, Timestamp } from '../common/Types'
import { logger } from './../common/Util' import { logger } from './../common/Util'
import { DATA_DIR } from './../server/Dirs' import { DATA_DIR } from './../server/Dirs'
@ -82,10 +82,16 @@ const get = (
return [] return []
} }
const log = fs.readFileSync(file, 'utf-8').split("\n") const lines = fs.readFileSync(file, 'utf-8').split("\n")
return log.filter(line => !!line).map(line => { const log = lines.filter(line => !!line).map(line => {
return JSON.parse(`[${line}]`) return JSON.parse(`[${line}]`)
}) })
if (offset === 0 && log.length > 0) {
log[0][5] = DefaultScoreMode(log[0][5])
log[0][6] = DefaultShapeMode(log[0][6])
log[0][7] = DefaultSnapMode(log[0][7])
}
return log
} }
export default { export default {

View file

@ -1,6 +1,6 @@
import fs from 'fs' import fs from 'fs'
import GameCommon from './../common/GameCommon' import GameCommon from './../common/GameCommon'
import { Game, Piece, ScoreMode, ShapeMode, SnapMode } from './../common/Types' import { DefaultScoreMode, DefaultShapeMode, DefaultSnapMode, Game, Piece } from './../common/Types'
import Util, { logger } from './../common/Util' import Util, { logger } from './../common/Util'
import { Rng } from './../common/Rng' import { Rng } from './../common/Rng'
import { DATA_DIR } from './Dirs' import { DATA_DIR } from './Dirs'
@ -58,9 +58,9 @@ function loadGame(gameId: string): void {
puzzle: game.puzzle, puzzle: game.puzzle,
players: game.players, players: game.players,
evtInfos: {}, evtInfos: {},
scoreMode: game.scoreMode || ScoreMode.FINAL, scoreMode: DefaultScoreMode(game.scoreMode),
shapeMode: game.shapeMode || ShapeMode.ANY, shapeMode: DefaultShapeMode(game.shapeMode),
snapMode: game.snapMode || SnapMode.NORMAL, snapMode: DefaultSnapMode(game.snapMode),
} }
GameCommon.setGame(gameObject.id, gameObject) GameCommon.setGame(gameObject.id, gameObject)
} }

View file

@ -89,9 +89,9 @@ app.get('/api/replay-data', async (req, res): Promise<void> => {
log[0][2], log[0][2],
log[0][3], log[0][3],
log[0][4], log[0][4],
log[0][5] || ScoreMode.FINAL, log[0][5],
log[0][6] || ShapeMode.NORMAL, log[0][6],
log[0][7] || SnapMode.NORMAL, log[0][7],
) )
} }
res.send({ log, game: game ? Util.encodeGame(game) : null }) res.send({ log, game: game ? Util.encodeGame(game) : null })