fix older replays
This commit is contained in:
parent
d009f84156
commit
2b0dc392da
10 changed files with 105 additions and 54 deletions
File diff suppressed because one or more lines are too long
1
build/public/assets/index.cc6b4801.js
Normal file
1
build/public/assets/index.cc6b4801.js
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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 });
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 })
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue