fix(platform): apply room action battle flags

This commit is contained in:
2026-09-05 03:44:32 +08:00
parent 9840ed70b2
commit 72227efd05
2 changed files with 194 additions and 1 deletions
@@ -369,6 +369,16 @@ function parseSeatAction(value: ParsedSeatPayload): {
return { seat, raw };
}
function stageAfterOptionalDeskwar(
raw: Readonly<Record<string, unknown>>,
currentStage: number,
): number {
if (!hasOwn(raw, 'deskwar')) return currentStage;
return requireProtocolFlag(raw.deskwar, '$.event.raw.deskwar') === 1
? 1
: currentStage;
}
function requireOccupiedSeat(room: InsideRoomState, seat: number): number {
if (seat < 0 || seat >= room.seatPlayerIds.length) {
throw new RangeError('$.event.seat: expected room seat range');
@@ -572,6 +582,7 @@ export class PlatformStore {
if (room.seatPlayerIds.includes(joined.player.playerid)) {
throw new RangeError('$.event.raw.playerid: duplicate player seat');
}
const stage = stageAfterOptionalDeskwar(event.raw, room.stage);
const player = Object.freeze(joined.player);
const entities = Object.freeze({
@@ -598,6 +609,7 @@ export class PlatformStore {
seatPlayerIds: Object.freeze(seatPlayerIds),
readySeats: Object.freeze(readySeats),
offlineSeats: Object.freeze(offlineSeats),
stage,
}),
}));
}
@@ -614,6 +626,7 @@ export class PlatformStore {
if (player === undefined) {
throw new RangeError('players.entities: occupied seat has no canonical player');
}
const stage = stageAfterOptionalDeskwar(event.raw, room.stage);
const entities = Object.freeze({
...previous.players.entities,
[playerid]: Object.freeze({ ...player, isprepare: 1 }),
@@ -625,7 +638,7 @@ export class PlatformStore {
selfPlayerId: previous.players.selfPlayerId,
entities,
}),
room: Object.freeze({ ...room, readySeats }),
room: Object.freeze({ ...room, readySeats, stage }),
}));
}