From ed49a5603ec87437f46f4468999d7883835621b9 Mon Sep 17 00:00:00 2001 From: legonzaur Date: Fri, 20 Dec 2024 23:50:56 +0100 Subject: [PATCH] fix : fuckU softlocks Attempt to fix #12 --- src/games/controllers/turn.controller.ts | 2 +- src/games/services/effect.functions.ts | 8 +--- src/games/services/turn.service.ts | 51 ++++++++++++++++++++---- 3 files changed, 46 insertions(+), 15 deletions(-) diff --git a/src/games/controllers/turn.controller.ts b/src/games/controllers/turn.controller.ts index eb12f1d..f6705cf 100644 --- a/src/games/controllers/turn.controller.ts +++ b/src/games/controllers/turn.controller.ts @@ -237,7 +237,7 @@ export class TurnController { if (!targetToken) { throw new HttpException('Token not found', HttpStatus.NOT_FOUND); } - await this.turnService.makeDiscard(game, targetToken, targetPlayer); + await this.turnService.addFuckUMarker(game, targetToken, targetPlayer); const index = game.currentTurn.tokens.findIndex((t) => t._id.equals(targetToken._id), ); diff --git a/src/games/services/effect.functions.ts b/src/games/services/effect.functions.ts index cd47fda..28303b2 100644 --- a/src/games/services/effect.functions.ts +++ b/src/games/services/effect.functions.ts @@ -404,13 +404,7 @@ export const tokenMappings = { ); } await gameService.drawToBoard(1, player, game, session); - await player.discardMarkers++; - eventEmitter.emit('sse.game.' + game._id.toHexString(), { - type: 'player.addDiscardMarker', - operation: 1, - discardMarkers: player.discardMarkers, - playerId: player._id.toHexString(), - }); + await turnService.addDiscardMarker(game, player, session); game.currentTurn.drawAndDiscardCurrentAmount++; game.currentTurn.drawAndDiscardCurrentEffect = effect; }, diff --git a/src/games/services/turn.service.ts b/src/games/services/turn.service.ts index fb86069..652ff41 100644 --- a/src/games/services/turn.service.ts +++ b/src/games/services/turn.service.ts @@ -225,19 +225,22 @@ export class TurnService { } @WithTransaction - async makeDiscard( + async addFuckUMarker( game: Document & Game, token: Effect, target: Player, session?: mongoose.mongo.ClientSession, ) { + if ( + target.hand.cards.length >= + target.fuckUMarkers + target.discardMarkers + ) { + throw new HttpException( + "This player doesn't have enough cards in the hand", + HttpStatus.BAD_REQUEST, + ); + } target.fuckUMarkers++; - this.eventEmitter.emit('sse.game.' + game._id.toHexString(), { - type: 'player.addFuckUMarker', - operation: 1, - fuckUMarkers: target.fuckUMarkers, - playerId: target._id.toHexString(), - }); const index = game.currentTurn.tokens.findIndex((t) => t._id.equals(token._id), ); @@ -246,6 +249,40 @@ export class TurnService { } game.currentTurn.tokens.splice(index, 1); + this.eventEmitter.emit('sse.game.' + game._id.toHexString(), { + type: 'player.addFuckUMarker', + operation: 1, + fuckUMarkers: target.fuckUMarkers, + playerId: target._id.toHexString(), + }); + + await game.save({ session }); + } + + @WithTransaction + async addDiscardMarker( + game: Document & Game, + target: Player, + session?: mongoose.mongo.ClientSession, + ) { + if ( + target.hand.cards.length >= + target.fuckUMarkers + target.discardMarkers + ) { + throw new HttpException( + "This player doesn't have enough cards in the hand", + HttpStatus.BAD_REQUEST, + ); + } + target.discardMarkers++; + + this.eventEmitter.emit('sse.game.' + game._id.toHexString(), { + type: 'player.addDiscardMarker', + operation: 1, + discardMarkers: target.discardMarkers, + playerId: target._id.toHexString(), + }); + await game.save({ session }); }