diff --git a/server/room-battle.ts b/server/room-battle.ts index ce6f41c9d5..92a2c127f1 100644 --- a/server/room-battle.ts +++ b/server/room-battle.ts @@ -803,7 +803,7 @@ export class RoomBattle extends RoomGame { }; this.requestCount++; player?.sendRoom(`|request|${requestJSON}`); - this.timer.nextRequest(player); + if (!request.update) this.timer.nextRequest(player); break; } player?.sendRoom(lines[2]); diff --git a/sim/side.ts b/sim/side.ts index 00e6c5d5c2..2f863a15e5 100644 --- a/sim/side.ts +++ b/sim/side.ts @@ -122,6 +122,7 @@ export interface SwitchRequest { forceSwitch: boolean[]; side: SideRequestData; noCancel?: boolean; + update?: boolean; } export interface TeamPreviewRequest { wait?: undefined; @@ -139,6 +140,7 @@ export interface MoveRequest { side: SideRequestData; ally?: SideRequestData; noCancel?: boolean; + update?: boolean; } export interface WaitRequest { wait: true; @@ -483,7 +485,8 @@ export class Side { this.battle.send('sideupdate', `${this.id}\n${sideUpdate}`); } - emitRequest(update: ChoiceRequest = this.activeRequest!) { + emitRequest(update: ChoiceRequest = this.activeRequest!, updatedRequest = false) { + if (updatedRequest) (this.activeRequest as MoveRequest | SwitchRequest).update = true; this.battle.send('sideupdate', `${this.id}\n|request|${JSON.stringify(update)}`); this.activeRequest = update; } @@ -495,7 +498,7 @@ export class Side { const updated = update ? this.updateRequestForPokemon(update.pokemon, update.update) : null; const type = `[${updated ? 'Unavailable' : 'Invalid'} choice]`; this.battle.send('sideupdate', `${this.id}\n|error|${type} ${message}`); - if (updated) this.emitRequest(); + if (updated) this.emitRequest(this.activeRequest!, true); if (this.battle.strictChoices) throw new Error(`${type} ${message}`); return false; } diff --git a/test/sim/decisions.js b/test/sim/decisions.js index 65321ad3d9..0e71b05e8f 100644 --- a/test/sim/decisions.js +++ b/test/sim/decisions.js @@ -358,7 +358,11 @@ describe('Choices', () => { battle.p1.chooseMove(1); assert(buffer.length >= 2); assert(buffer.some(message => message.startsWith('p1\n|error|[Unavailable choice]'))); - assert(buffer.some(message => message.startsWith('p1\n|request|') && JSON.parse(message.slice(12)).active[0].moves[0].disabled)); + const message = buffer.find(message => message.startsWith('p1\n|request|')); + assert(message); + const request = JSON.parse(message.slice(12)); + assert(request.active[0].moves[0].disabled); + assert(request.update); }); it('should send meaningful feedback to players if they try to switch a trapped Pokémon out', () => { @@ -376,7 +380,11 @@ describe('Choices', () => { battle.p1.chooseSwitch(2); assert(buffer.length >= 2); assert(buffer.some(message => message.startsWith('p1\n|error|[Unavailable choice]'))); - assert(buffer.some(message => message.startsWith('p1\n|request|') && JSON.parse(message.slice(12)).active[0].trapped)); + const message = buffer.find(message => message.startsWith('p1\n|request|')); + assert(message); + const request = JSON.parse(message.slice(12)); + assert(request.active[0].trapped); + assert(request.update); }); });