diff --git a/CHANGELOG.md b/CHANGELOG.md index 9510f0b..98df041 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ * [#173](https://github.com/antoinezanardi/werewolves-assistant-web/issues/173) - White Werewolf waking up interval option. * [#174](https://github.com/antoinezanardi/werewolves-assistant-web/issues/174) - Number of charmed people per night by Pied Piper option. * [#175](https://github.com/antoinezanardi/werewolves-assistant-web/issues/175) - Pied Piper not powerless if infected option. +* [#176](https://github.com/antoinezanardi/werewolves-assistant-web/issues/176) - Lives count for the Ancient option. * [#183](https://github.com/antoinezanardi/werewolves-assistant-web/issues/183) - Audio options in parameters modal. * [#188](https://github.com/antoinezanardi/werewolves-assistant-web/issues/188) - Modal for helping players with roles. diff --git a/src/components/Game/GameContent/GamePlayField/GamePlayFieldTutorial/GamePlayFieldTutorial.vue b/src/components/Game/GameContent/GamePlayField/GamePlayFieldTutorial/GamePlayFieldTutorial.vue index f367657..e23631f 100644 --- a/src/components/Game/GameContent/GamePlayField/GamePlayFieldTutorial/GamePlayFieldTutorial.vue +++ b/src/components/Game/GameContent/GamePlayField/GamePlayFieldTutorial/GamePlayFieldTutorial.vue @@ -85,13 +85,13 @@ export default { werewolvesEatGamePlayAlertsSteps() { const { stepsHeader: header, game } = this; const actionStepsTextPath = "GamePlayFieldTutorial.werewolves.eat"; - const { angelPlayer, doesAngelWinIfHeDiesNow, ancientPlayer, guardPlayer, witchPlayer } = game; + const { angelPlayer, doesAngelWinIfHeDiesNow, ancientPlayer, guardPlayer, witchPlayer, options } = game; return [ ...insertIf(!!angelPlayer && angelPlayer.isAliveAndPowerful && doesAngelWinIfHeDiesNow, { header, target: `#game-play-alert-angel-will-win-if-he-dies`, content: this.$t(`${actionStepsTextPath}.angelCanWin`), }), - ...insertIf(!!ancientPlayer && ancientPlayer.isAlive, { + ...insertIf(!!ancientPlayer && ancientPlayer.isAlive && options.roles.ancient.livesCountAgainstWerewolves > 1, { header, target: `#game-play-alert-ancient-can-survive-werewolves`, content: this.$t(`${actionStepsTextPath}.ancientCanSurvive`), }), @@ -128,7 +128,8 @@ export default { witchSteps() { const { stepsHeader: header, game } = this; const actionStepsTextPath = "GamePlayFieldTutorial.witch.use-potion"; - const { ancientPlayer } = game; + const { ancientPlayer, options } = game; + const { doesTakeHisRevenge } = options.roles.ancient; return { "use-potion": [ { header, target: "#game-waiting-label", content: this.$t(`${actionStepsTextPath}.witchUsesPotionWhen`) }, @@ -137,7 +138,7 @@ export default { { header, target: "#life-potion-tab", content: this.$t(`${actionStepsTextPath}.ifLifePotionHasBeenUsed`) }, { header, target: "#death-potion-tab", content: this.$t(`${actionStepsTextPath}.deathPotionKills`) }, { header, target: "#death-potion-tab", content: this.$t(`${actionStepsTextPath}.ifDeathPotionHasBeenUsed`) }, - ...insertIf(!!ancientPlayer && ancientPlayer.isAlive, { + ...insertIf(!!ancientPlayer && ancientPlayer.isAlive && doesTakeHisRevenge, { header, target: `#game-play-alert-ancient-can-make-all-powerless`, content: this.$t(`${actionStepsTextPath}.ancientWillHaveHisRevenge`), }), @@ -199,10 +200,11 @@ export default { allVoteGamePlayAlertsSteps() { const { stepsHeader: header, game } = this; const actionStepsTextPath = "GamePlayFieldTutorial.all.vote"; - const { ancientPlayer, isIdiotProtectedFromVotes, scapegoatPlayer, angelPlayer, doesAngelWinIfHeDiesNow } = game; + const { ancientPlayer, isIdiotProtectedFromVotes, scapegoatPlayer, angelPlayer, doesAngelWinIfHeDiesNow, options } = game; + const { doesTakeHisRevenge } = options.roles.ancient; const { hasStutteringJudgeChosenSign, stutteringJudgeVoteRequestsCount } = this.pastEvents; return [ - ...insertIf(!!ancientPlayer && ancientPlayer.isAlive, { + ...insertIf(!!ancientPlayer && ancientPlayer.isAlive && doesTakeHisRevenge, { header, target: `#game-play-alert-ancient-can-make-all-powerless`, content: this.$t(`${actionStepsTextPath}.ancientWillHaveHisRevenge`), }), @@ -262,12 +264,13 @@ export default { hunterSteps() { const { stepsHeader: header, game } = this; const actionStepsTextPath = "GamePlayFieldTutorial.hunter.shoot"; - const { ancientPlayer } = game; + const { ancientPlayer, options } = game; + const { doesTakeHisRevenge } = options.roles.ancient; return { shoot: [ { header, target: "#game-waiting-label", content: this.$t(`${actionStepsTextPath}.hunterShootsWhen`) }, { header, target: "#player-targets", content: this.$t(`${actionStepsTextPath}.hunterCanShoot`) }, - ...insertIf(!!ancientPlayer && ancientPlayer.isAlive, { + ...insertIf(!!ancientPlayer && ancientPlayer.isAlive && doesTakeHisRevenge, { header, target: `#game-play-alert-ancient-can-make-all-powerless`, content: this.$t(`${actionStepsTextPath}.ancientWillHaveHisRevenge`), }), @@ -284,10 +287,11 @@ export default { sheriffSettlesVotesSteps() { const { stepsHeader: header, game } = this; const actionStepsTextPath = "GamePlayFieldTutorial.sheriff.settle-votes"; - const { ancientPlayer, idiotPlayer, isIdiotProtectedFromVotes, angelPlayer, doesAngelWinIfHeDiesNow } = game; + const { ancientPlayer, idiotPlayer, isIdiotProtectedFromVotes, angelPlayer, doesAngelWinIfHeDiesNow, options } = game; + const { doesTakeHisRevenge } = options.roles.ancient; return [ { header, target: "#game-waiting-label", content: this.$t(`${actionStepsTextPath}.sheriffSettleVotesWhen`) }, - ...insertIf(!!ancientPlayer && ancientPlayer.isAlive, { + ...insertIf(!!ancientPlayer && ancientPlayer.isAlive && doesTakeHisRevenge, { header, target: `#game-play-alert-ancient-can-make-all-powerless`, content: this.$t(`GamePlayFieldTutorial.all.vote.ancientWillHaveHisRevenge`), }), @@ -394,14 +398,14 @@ export default { bigBadWolfSteps() { const { stepsHeader: header, game } = this; const actionStepsTextPath = "GamePlayFieldTutorial.big-bad-wolf.eat"; - const { ancientPlayer, guardPlayer, witchPlayer } = game; + const { ancientPlayer, guardPlayer, witchPlayer, options } = game; return { eat: [ { header, target: "#game-waiting-label", content: this.$t(`${actionStepsTextPath}.bigBadWolfEatsWhen`) }, { header, target: "#player-targets", content: this.$t(`${actionStepsTextPath}.bigBadWolfEatsAVictim`) }, { header, target: "#game-waiting-label", content: this.$t(`${actionStepsTextPath}.bigBadWolfLoosesHisPowerIfWerewolfDies`) }, { header, target: "#werewolf-players", content: this.$t(`${actionStepsTextPath}.bigBadWolfPointsAtVictim`) }, - ...insertIf(!!ancientPlayer && ancientPlayer.isAlive, { + ...insertIf(!!ancientPlayer && ancientPlayer.isAlive && options.roles.ancient.livesCountAgainstWerewolves > 1, { header, target: `#game-play-alert-ancient-can-survive-werewolves`, content: this.$t("GamePlayFieldTutorial.werewolves.eat.ancientCanSurvive"), }), diff --git a/src/components/Game/GameEventMonitor/GameEvent/GameEvent.vue b/src/components/Game/GameEventMonitor/GameEvent/GameEvent.vue index 704bd42..b6b80ff 100644 --- a/src/components/Game/GameEventMonitor/GameEvent/GameEvent.vue +++ b/src/components/Game/GameEventMonitor/GameEvent/GameEvent.vue @@ -193,7 +193,7 @@ export default { }; }, gameEventAllTurnMetadata() { - const { firstWaiting, angelPlayer, ancientPlayer } = this.game; + const { firstWaiting, angelPlayer, ancientPlayer, options } = this.game; return { messages: [ ...insertIf(firstWaiting.to === "vote" && !!angelPlayer && this.game.isFirstWaitingPreFirstNightPlay, @@ -203,7 +203,7 @@ export default { ...insertIf(firstWaiting.to === "vote" && !this.game.isSecondVoteAfterTie, i18n.t("GameEvent.messages.allVote")), ...insertIf(firstWaiting.to === "vote" && this.game.isSecondVoteAfterTie, i18n.t("GameEvent.messages.allVoteAgain", { players: listPlayerNames(this.game.lastActionTargetedPlayers) })), - ...insertIf(firstWaiting.to === "vote" && !!ancientPlayer && ancientPlayer.isAlive, + ...insertIf(firstWaiting.to === "vote" && !!ancientPlayer && ancientPlayer.isAlive && options.roles.ancient.doesTakeHisRevenge, i18n.t("GameEvent.messages.attentionToTheAncient")), ...insertIf(firstWaiting.to === "elect-sheriff", i18n.t("GameEvent.messages.allElectSheriff")), ], diff --git a/src/components/shared/Game/GamePlayAlerts/GamePlayAlerts.vue b/src/components/shared/Game/GamePlayAlerts/GamePlayAlerts.vue index f790b6e..50cde8a 100644 --- a/src/components/shared/Game/GamePlayAlerts/GamePlayAlerts.vue +++ b/src/components/shared/Game/GamePlayAlerts/GamePlayAlerts.vue @@ -49,10 +49,14 @@ export default { ]; }, ancientRevengeAlerts() { - const { firstWaiting, ancientPlayer } = this.game; + const { firstWaiting, ancientPlayer, options } = this.game; + const { doesTakeHisRevenge } = options.roles.ancient; const { to: action } = firstWaiting; const ancientRevengeActions = ["vote", "settle-votes", "shoot", "use-potion"]; - return ancientRevengeActions.includes(action) && !!ancientPlayer && ancientPlayer.isAlive ? ["ancient-can-make-all-powerless"] : []; + if (ancientRevengeActions.includes(action) && !!ancientPlayer && ancientPlayer.isAlive && doesTakeHisRevenge) { + return ["ancient-can-make-all-powerless"]; + } + return []; }, voteAlerts() { const { @@ -87,7 +91,8 @@ export default { return []; } return [ - ...insertIf(source !== "white-werewolf" && !!ancientPlayer && ancientPlayer.isAliveAndPowerful, "ancient-can-survive-werewolves"), + ...insertIf(source !== "white-werewolf" && !!ancientPlayer && ancientPlayer.isAliveAndPowerful && + options.roles.ancient.livesCountAgainstWerewolves > 1, "ancient-can-survive-werewolves"), ...insertIf(source !== "white-werewolf" && !!guardPlayer && guardPlayer.isAliveAndPowerful, "guard-can-protect-target"), ...insertIf(source !== "white-werewolf" && !!witchPlayer && witchPlayer.isAliveAndPowerful, "witch-can-protect-target"), ...insertIf(source === "werewolves" && !!vileFatherOfWolvesPlayer && vileFatherOfWolvesPlayer.isAlive, diff --git a/src/plugins/vue-i18n/fr.json b/src/plugins/vue-i18n/fr.json index 72e3a6e..aba5da5 100644 --- a/src/plugins/vue-i18n/fr.json +++ b/src/plugins/vue-i18n/fr.json @@ -620,7 +620,7 @@ "idiot-wont-die-from-votes": "L'Idiot ne peut mourir de cette pendaison. Si les votes sont contre lui, alors son rôle sera révélé, il perdra son droit de vote mais ne mourra pas.", "scapegoat-will-die-from-tie": "Si une égalité advient pendant les votes, le Bouc-Émissaire sera la victime de la pendaison. Il devra alors décider qui aura le droit de vote pour le vote du jour d'après.", "angel-will-win-if-he-dies": "Si l'Ange meurt de cette action, alors il gagnera instantanément la partie.", - "ancient-can-survive-werewolves": "L'Ancien a la force de l'âge : il survivra des Loups-Garous si c'est la première fois qu'il se fait dévorer par ces canidés.", + "ancient-can-survive-werewolves": "L'Ancien a la force de l'âge : il survivra des Loups-Garous si c'est la première fois qu'il se fait dévorer par ces canidés. Le nombre de vies qu'il possède contre les Loups-Garous peut être défini dans les options de la partie.", "guard-can-protect-target": "Si le Salvateur a protégé la cible des Loups-Garous, elle survivra.", "witch-can-protect-target": "La Sorcière pourra, si elle le souhaite, utiliser sa potion de vie pour sauver la victime des Loups-Garous plus tard dans la nuit.", "vile-father-of-wolves-can-infect": "L'Infect Père des Loups pourra, s'il le souhaite, transformer la victime en Loup-Garou.", @@ -716,7 +716,7 @@ "angelCanWin": "L'Ange est dans la partie ! S'il meurt maintenant des Loups-Garous, alors il gagnera la partie.", "guardCanProtect": "Le Salvateur est dans la partie ! La personne qu'il a protégé ne pourra pas être mangée par les Loups-Garous.", "witchCanSave": "La Sorcière est dans la partie ! Elle pourra, si elle le décide pendant son tour, utiliser sa potion de vie pour sauver la victime des Loups-Garous.", - "ancientCanSurvive": "L'Ancien est dans la partie ! Il pourra survivre à une attaque des Loups-Garous, même sans protection de Salvateur ou de Sorcière.", + "ancientCanSurvive": "L'Ancien est dans la partie ! Il pourra survivre à une attaque des Loups-Garous, même sans protection de Salvateur ou de Sorcière. Le nombre de vies qu'il possède contre les Loups-Garous peut être modifié dans les options de la partie.", "vileFatherOfWolvesCanInfect": "L'Infect Père des Loups est dans la partie ! Lorsque les Loups-Garous auront choisi leur victime et se rendorment, l'Infect Père des Loups peut lever la main. Dans ce cas, la victime rejoindra instantanément le camp des Loups-Garous au lieu de mourir dévorée, ceci en gardant son rôle original et ses pouvoirs !", "infectOnlyOnce": "Le choix de l'Infect Père des Loups pourra être renseigné au moment où l'action des Loups-Garous sera validée. Attention, ce pouvoir ne peut être utilisé qu'une seule fois !", "piedPiperWillLoosePowerIfInfected": "Le Joueur de Flûte et l'Infect Père des Loups sont dans la partie ! Si le Joueur de Flûte est infecté, il ne pourra plus charmer jusqu'à la fin de la partie et abandonnera son but de charmer tous les joueurs vivants pour gagner la partie.", @@ -732,7 +732,7 @@ "ifLifePotionHasBeenUsed": "Si la potion de vie a déjà été utilisée, le maître du jeu doit quand même demander le choix de la Sorcière, mais sans pointer du doigt la victime des Loups-Garous. Ceci permet de ne pas révéler que la potion de vie a été utilisée.", "deathPotionKills": "La potion de mort, utilisable qu'une fois pendant la partie, permet d'empoisonner une victime qui mourra le matin suivant. La Sorcière doit sans bruit acquiescer ou refuser d'utiliser sa potion en pointant sa victime le cas échéant.", "ifDeathPotionHasBeenUsed": "Si la potion de mort a déjà été utilisée, le maître du jeu doit quand même demander le choix de la Sorcière. Ceci permet de ne pas révéler que la potion de mort a été utilisée.", - "ancientWillHaveHisRevenge": "L'Ancien est dans la partie ! Si la Sorcière utilise sa potion de mort sur lui, alors tous les joueurs dans le camp des Villageois perdront leurs pouvoirs.", + "ancientWillHaveHisRevenge": "L'Ancien est dans la partie ! Si la Sorcière utilise sa potion de mort sur lui, alors tous les joueurs dans le camp des Villageois perdront leurs pouvoirs. Cette pénalité peut être retirée dans les options de la partie.", "toValidateUsePotion": "Durant son tour, la Sorcière peut utiliser les deux potions, une seule, ou passer son tour." } }, @@ -767,7 +767,7 @@ "eachPlayerVote": "Chaque joueur a donc une voix à donner pour le vote, mais ne peut voter pour lui-même. Il peut néanmoins voter blanc. Le maître du jeu demande le vote de chacun à tour de rôle.", "scapegoatWillDieIfTie": "Le Bouc-Émissaire est dans la partie ! En cas d'égalité, c'est lui qui sera pendu, même s'il n'est pas inclu dans l'égalité. Il décidera ensuite qui aura le droit de vote pour le jour d'après.", "idiotWillBeForgiven": "L'Idiot est dans la partie ! Si son rôle n'est pas encore révélé et que le village décide de voter contre lui, alors il sera gracié, le village se rendant compte de leur bêtise de pendre un Idiot. Par contre, son rôle sera révélé et il perdra son droit de vote pour le reste de la partie.", - "ancientWillHaveHisRevenge": "L'Ancien est dans la partie ! Si le village décide de le pendre, alors tous les joueurs dans le camp des Villageois perdront leurs pouvoirs. Attention à la pendaison irréfléchie !", + "ancientWillHaveHisRevenge": "L'Ancien est dans la partie ! Si le village décide de le pendre, alors tous les joueurs dans le camp des Villageois perdront leurs pouvoirs. Attention à la pendaison irréfléchie ! Cette pénalité peut être retirée dans les options de la partie.", "angelWillWinIfHeDiesNow": "L'Ange est dans la partie ! S'il meurt des votes, alors il gagnera la partie.", "stutteringJudgeCanRequestAnotherVote": "Le Juge Bègue est dans la partie ! En réalisant le signe précédemment convenu au maître du jeu, un autre vote aura lieu après le résultat de celui en cours. Le nombre de fois que le Juge Bègue peut demander un autre vote peut être modifié dans les options de la partie.", "bearTamerGrowlsAndInfected": "Le Montreur d'Ours est dans la partie et a grogné ce matin ! Cela veut dire que son voisin de gauche ou de droite (ou les deux) est un Loup-Garou ! Il est même possible que le Montreur soit infecté et donc lui-même un Loup-Garou... Auquel cas, l'ours grognera tous les matins.", @@ -790,7 +790,7 @@ "howToPlay": "Comment jouer le Chasseur ?", "hunterShootsWhen": "Quand le Chasseur meurt, il prend son fusil pour se venger dans son dernier souffle.", "hunterCanShoot": "Le Chasseur mourrant choisi arbitrairement sa victime en la pointant du doigt. Elle mourra instantanément du coup fatal.", - "ancientWillHaveHisRevenge": "L'Ancien est dans la partie ! Si le Chasseur décide de le tuer, alors tous les joueurs dans le camp des Villageois perdront leurs pouvoirs.", + "ancientWillHaveHisRevenge": "L'Ancien est dans la partie ! Si le Chasseur décide de le tuer, alors tous les joueurs dans le camp des Villageois perdront leurs pouvoirs. Cette pénalité peut être retirée dans les options de la partie.", "toValidateShoot": "Pour passer à la suite, le Chasseur doit obligatoirement choisir une cible." } },