Fix stale restore after game restart
This commit is contained in:
Vendored
+15
-8
@@ -103,7 +103,13 @@ function normalizeSaveSlot(slot) {
|
||||
const value = Number(slot);
|
||||
return Number.isInteger(value) && value > 0 ? value : 1;
|
||||
}
|
||||
async function startDemoGameForSocket(socket) {
|
||||
function withClientRequestId(turn, requestId) {
|
||||
const id = Number(requestId || 0);
|
||||
return Number.isInteger(id) && id > 0
|
||||
? { ...turn, clientRequestId: id }
|
||||
: turn;
|
||||
}
|
||||
async function startDemoGameForSocket(socket, requestId) {
|
||||
nextTurnIds.set(socket.id, 1);
|
||||
const gameRunner = new game_runner_1.GameRunner();
|
||||
const worldFile = (0, game_config_1.projectPath)(process.env.DEFAULT_WORLD_FILE || engineConfig.paths.mainGameFile);
|
||||
@@ -114,7 +120,7 @@ async function startDemoGameForSocket(socket) {
|
||||
...(0, turn_result_1.textToParagraphs)(gameState.world.introduction),
|
||||
...(0, turn_result_1.textToParagraphs)(gameRunner.getCurrentRoomDescription()),
|
||||
];
|
||||
socket.emit('narrativeResponse', {
|
||||
socket.emit('narrativeResponse', withClientRequestId({
|
||||
turnId: nextTurnId(socket.id),
|
||||
paragraphs,
|
||||
choices: [],
|
||||
@@ -122,16 +128,16 @@ async function startDemoGameForSocket(socket) {
|
||||
gameState: {
|
||||
currentRoomId: gameState.currentRoomId,
|
||||
},
|
||||
});
|
||||
}, requestId));
|
||||
return gameRunner;
|
||||
}
|
||||
async function handleGameApi(socket, method, args = []) {
|
||||
async function handleGameApi(socket, method, args = [], requestId) {
|
||||
const saveGames = socket.data.saveGames || new Map();
|
||||
socket.data.saveGames = saveGames;
|
||||
switch (method) {
|
||||
case 'newGame':
|
||||
case 'newGame()':
|
||||
await startDemoGameForSocket(socket);
|
||||
await startDemoGameForSocket(socket, requestId);
|
||||
return { success: true, result: true, running: true, canLoad: saveGames.size > 0 };
|
||||
case 'loadGame':
|
||||
case 'loadGame()': {
|
||||
@@ -139,8 +145,8 @@ async function handleGameApi(socket, method, args = []) {
|
||||
if (!saveGames.has(slot)) {
|
||||
return { success: false, error: 'missing_save', result: false };
|
||||
}
|
||||
await startDemoGameForSocket(socket);
|
||||
socket.emit('gameLoaded', { slot });
|
||||
await startDemoGameForSocket(socket, requestId);
|
||||
socket.emit('gameLoaded', { slot, clientRequestId: requestId });
|
||||
return { success: true, result: true, running: true, slot };
|
||||
}
|
||||
case 'saveGame':
|
||||
@@ -176,7 +182,8 @@ io.on('connection', (socket) => {
|
||||
socket.data.saveGames = new Map();
|
||||
socket.on('gameApi', async (request, respond) => {
|
||||
try {
|
||||
const response = await handleGameApi(socket, String(request?.method || ''), Array.isArray(request?.args) ? request.args : []);
|
||||
const requestId = Number(request?.requestId || 0);
|
||||
const response = await handleGameApi(socket, String(request?.method || ''), Array.isArray(request?.args) ? request.args : [], Number.isInteger(requestId) && requestId > 0 ? requestId : undefined);
|
||||
if (typeof respond === 'function') {
|
||||
respond(response);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user