\ No newline at end of file
diff --git a/src/components/Game/GameContent/GamePlayField/GamePlayField.vue b/src/components/Game/GameContent/GamePlayField/GamePlayField.vue
new file mode 100644
index 0000000..06cd051
--- /dev/null
+++ b/src/components/Game/GameContent/GamePlayField/GamePlayField.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/Game/GameContent/GameContentPlayField/DelegatePlayField.vue b/src/components/Game/GameContent/GamePlayField/GamePlayFieldContent/DelegatePlayField.vue
similarity index 83%
rename from src/components/Game/GameContent/GameContentPlayField/DelegatePlayField.vue
rename to src/components/Game/GameContent/GamePlayField/GamePlayFieldContent/DelegatePlayField.vue
index bea3858..35828bd 100644
--- a/src/components/Game/GameContent/GameContentPlayField/DelegatePlayField.vue
+++ b/src/components/Game/GameContent/GamePlayField/GamePlayFieldContent/DelegatePlayField.vue
@@ -12,10 +12,10 @@
\ No newline at end of file
diff --git a/src/components/Game/GameEventMonitor/GameEvent/GameEventImage.vue b/src/components/Game/GameEventMonitor/GameEvent/GameEventImage.vue
new file mode 100644
index 0000000..efd0277
--- /dev/null
+++ b/src/components/Game/GameEventMonitor/GameEvent/GameEventImage.vue
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/Game/GameEventMonitor/GameEventMonitor.vue b/src/components/Game/GameEventMonitor/GameEventMonitor.vue
new file mode 100644
index 0000000..78037fe
--- /dev/null
+++ b/src/components/Game/GameEventMonitor/GameEventMonitor.vue
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/Game/GameVillagersSide/GameVillagersSide.vue b/src/components/Game/GameVillagersSide/GameVillagersSide.vue
index d6ffd4c..e9a24a9 100644
--- a/src/components/Game/GameVillagersSide/GameVillagersSide.vue
+++ b/src/components/Game/GameVillagersSide/GameVillagersSide.vue
@@ -1,18 +1,16 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/Game/GameWinners/GameSummaryModal/GameSummaryModal.vue b/src/components/Game/GameWinners/GameSummaryModal/GameSummaryModal.vue
new file mode 100644
index 0000000..640529c
--- /dev/null
+++ b/src/components/Game/GameWinners/GameSummaryModal/GameSummaryModal.vue
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/Game/GameWinners/GameWinners.vue b/src/components/Game/GameWinners/GameWinners.vue
index de1e308..c1508a7 100644
--- a/src/components/Game/GameWinners/GameWinners.vue
+++ b/src/components/Game/GameWinners/GameWinners.vue
@@ -3,7 +3,8 @@
-
+
@@ -16,19 +17,26 @@
-
+
+
+
+
-
+
+
@@ -38,10 +46,11 @@ import { stringify } from "qs";
import trophy from "../../../assets/svg/game/trophy.svg";
import Game from "../../../classes/Game";
import PlayerCard from "../../shared/Game/PlayerCard";
+import GameSummaryModal from "@/components/Game/GameWinners/GameSummaryModal/GameSummaryModal";
export default {
name: "GameWinners",
- components: { PlayerCard },
+ components: { GameSummaryModal, PlayerCard },
props: {
game: {
type: Game,
diff --git a/src/components/GameLobby/GameLobby.vue b/src/components/GameLobby/GameLobby.vue
index 2427eb0..2ee9d82 100644
--- a/src/components/GameLobby/GameLobby.vue
+++ b/src/components/GameLobby/GameLobby.vue
@@ -79,7 +79,12 @@
:disabled="loading.getGameRepartition || !canCreateGame"/>
-
+
+
+
+
+
+
@@ -96,6 +101,7 @@ import PlayerCard from "../shared/Game/PlayerCard";
import GameLobbyAlreadyHavePlayingGame from "./GameLobbyAlreadyHavePlayingGame";
import SubmitButton from "../shared/Forms/SubmitButton";
import GameLobbyComposition from "./GameLobbyComposition";
+import Swal from "sweetalert2";
export default {
name: "GameLobby",
@@ -235,6 +241,24 @@ export default {
cancelGame() {
this.waitingGame = new Game();
},
+ confirmLeaveGameLobby() {
+ return Swal.fire({
+ title: this.$t("GameLobby.areYouSureYouWantToQuit"),
+ html: this.$t("GameLobby.gameCompositionNotFinished"),
+ icon: "warning",
+ showCancelButton: true,
+ confirmButtonText: `${this.$t("GameLobby.quit")}`,
+ cancelButtonText: this.$t("GameLobby.cancel"),
+ });
+ },
+ },
+ async beforeRouteLeave(to, from, next) {
+ if (!this.waitingGame._id && this.game.players.length && to.name !== "Game") {
+ const { value: confirmLeaveGameLobby } = await this.confirmLeaveGameLobby();
+ return confirmLeaveGameLobby ? next() : next(false);
+ } else {
+ return next();
+ }
},
};
diff --git a/src/components/Home/AccountModal/AccountModal.vue b/src/components/Home/AccountModal/AccountModal.vue
index 9943b76..226ba02 100644
--- a/src/components/Home/AccountModal/AccountModal.vue
+++ b/src/components/Home/AccountModal/AccountModal.vue
@@ -53,7 +53,7 @@ import $ from "jquery";
import SubmitButton from "../../shared/Forms/SubmitButton";
import LoginPanel from "./LoginPanel";
import RegisterPanel from "./RegisterPanel";
-import { isAPIError } from "../../../helpers/functions/Error";
+import { isAPIError } from "@/helpers/functions/Error";
export default {
name: "AccountModal",
diff --git a/src/components/NavBar/NavBar.vue b/src/components/NavBar/NavBar.vue
index ec1a081..169437f 100644
--- a/src/components/NavBar/NavBar.vue
+++ b/src/components/NavBar/NavBar.vue
@@ -8,34 +8,11 @@
+
+
\ No newline at end of file
diff --git a/src/components/shared/Game/Role/RoleText.vue b/src/components/shared/Game/Role/RoleText.vue
new file mode 100644
index 0000000..622cbd9
--- /dev/null
+++ b/src/components/shared/Game/Role/RoleText.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/shared/Game/RoleImage.vue b/src/components/shared/Game/RoleImage.vue
deleted file mode 100644
index de1f925..0000000
--- a/src/components/shared/Game/RoleImage.vue
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/components/shared/Game/RolePicker.vue b/src/components/shared/Game/RolePicker.vue
index cd50fcb..6f386c8 100644
--- a/src/components/shared/Game/RolePicker.vue
+++ b/src/components/shared/Game/RolePicker.vue
@@ -55,7 +55,7 @@ export default {
roles: "roles",
}),
roleText() {
- return this.hoverOn ? this.$t(`Role.${this.hoverOn}`) : `${this.$t("RolePicker.chooseRole")}`;
+ return this.hoverOn ? this.$tc(`Role.${this.hoverOn}`, 1) : `${this.$t("RolePicker.chooseRole")}`;
},
availableRoles() {
return this.roles.filter(({ name }) => name !== this.player.role.current);
diff --git a/src/components/shared/Game/Sides/AliveVillagers.vue b/src/components/shared/Game/Sides/AliveVillagers.vue
new file mode 100644
index 0000000..863fd64
--- /dev/null
+++ b/src/components/shared/Game/Sides/AliveVillagers.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/shared/Game/Sides/AliveWerewolves.vue b/src/components/shared/Game/Sides/AliveWerewolves.vue
new file mode 100644
index 0000000..8ea6c59
--- /dev/null
+++ b/src/components/shared/Game/Sides/AliveWerewolves.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/helpers/functions/Array.js b/src/helpers/functions/Array.js
new file mode 100644
index 0000000..fa1cac7
--- /dev/null
+++ b/src/helpers/functions/Array.js
@@ -0,0 +1,9 @@
+/**
+ * @description Insert a value into the array according to the condition. Needs to be called like ...insertIf(condition, value1, value2, value3)
+ * @param condition
+ * @param elements List of values to insert
+ * @returns {*[]}
+ */
+export function insertIf(condition, ...elements) {
+ return condition ? elements : [];
+}
\ No newline at end of file
diff --git a/src/helpers/functions/Error.js b/src/helpers/functions/Error.js
index dea1aaa..3bae5b9 100644
--- a/src/helpers/functions/Error.js
+++ b/src/helpers/functions/Error.js
@@ -1 +1 @@
-exports.isAPIError = err => err && err.response && err.response.data && err.response.data.HTTPCode;
\ No newline at end of file
+exports.isAPIError = err => !!err && !!err.response && !!err.response.data && !!err.response.data.HTTPCode;
\ No newline at end of file
diff --git a/src/plugins/error/index.js b/src/plugins/error/index.js
index d277ed9..d05734f 100644
--- a/src/plugins/error/index.js
+++ b/src/plugins/error/index.js
@@ -1,5 +1,5 @@
import Vue from "vue";
-import { isAPIError } from "../../helpers/functions/Error";
+import { isAPIError } from "@/helpers/functions/Error";
import i18n from "../vue-i18n";
import Router from "../router";
diff --git a/src/plugins/index.js b/src/plugins/index.js
index 0c52919..9e8994f 100644
--- a/src/plugins/index.js
+++ b/src/plugins/index.js
@@ -5,6 +5,7 @@ import Router from "./router";
import "./sentry";
import "./v-tooltip";
import "./vee-validate";
+import "./vue-countdown";
import "./vue-flip";
import i18n from "./vue-i18n";
import "./vue-roller";
diff --git a/src/plugins/router/index.js b/src/plugins/router/index.js
index bfeb870..bc913d9 100644
--- a/src/plugins/router/index.js
+++ b/src/plugins/router/index.js
@@ -7,6 +7,22 @@ import Statistics from "../../components/Statistics/Statistics";
Vue.use(VueRouter);
+const originalPush = VueRouter.prototype.push;
+VueRouter.prototype.push = function push(location, onResolve, onReject) {
+ if (onResolve || onReject) {
+ return originalPush.call(this, location, onResolve, onReject);
+ }
+ return originalPush.call(this, location).catch(err => err);
+};
+
+const originalReplace = VueRouter.prototype.replace;
+VueRouter.prototype.replace = function replace(query, onResolve, onReject) {
+ if (onResolve || onReject) {
+ return originalReplace.call(this, query, onResolve, onReject);
+ }
+ return originalReplace.call(this, query).catch(err => err);
+};
+
const routes = [{
path: "/",
name: "Home",
diff --git a/src/plugins/vue-countdown/index.js b/src/plugins/vue-countdown/index.js
new file mode 100644
index 0000000..238f619
--- /dev/null
+++ b/src/plugins/vue-countdown/index.js
@@ -0,0 +1,4 @@
+import Vue from "vue";
+import VueCountdown from "@chenfengyuan/vue-countdown";
+
+Vue.component("VCountdown", VueCountdown);
\ No newline at end of file
diff --git a/src/plugins/vue-i18n/fr.json b/src/plugins/vue-i18n/fr.json
index 4cd57d5..a47c34d 100644
--- a/src/plugins/vue-i18n/fr.json
+++ b/src/plugins/vue-i18n/fr.json
@@ -1,11 +1,6 @@
{
"NavBar": {
- "werewolvesAssistant": "Assistant Loups Garous",
- "areYouSureYouWantToQuit": "Êtes-vous sûr de vouloir quitter ?",
- "gameCompositionNotFinished": "La composition du jeu n'est pas encore finalisée",
- "yourProgressIsSaved": "Votre progression dans le jeu est sauvegardée",
- "quit": "Quitter le jeu",
- "cancel": "Annuler"
+ "werewolvesAssistant": "Assistant Loups Garous"
},
"Home": {
"werewolvesAssistant": "Assistant Loups Garous",
@@ -55,7 +50,11 @@
"missingOneWerewolfToStart": "Il manque un loup garou pour commencer la partie",
"missingOneVillagerToStart": "Il manque un villageois pour commencer",
"allPlayerDontHaveARole": "Certains joueurs n'ont pas de rôle",
- "gameCreated": "Partie créée"
+ "gameCreated": "Partie créée",
+ "areYouSureYouWantToQuit": "Êtes-vous sûr de vouloir quitter la composition de partie ?",
+ "gameCompositionNotFinished": "La composition du jeu n'est pas encore finalisée.",
+ "quit": "Quitter",
+ "cancel": "Annuler"
},
"GameLobbyComposition": {
"playerCount": "Aucun joueur | {count} joueur | {count} joueurs",
@@ -90,9 +89,13 @@
},
"Game": {
"loadingGame": "Chargement de la partie",
- "wolves": "Loups garous"
+ "areYouSureYouWantToQuit": "Êtes-vous sûr de vouloir quitter la partie en cours ?",
+ "yourProgressIsSaved": "Votre progression est sauvegardée.",
+ "quit": "Quitter le jeu",
+ "cancel": "Annuler",
+ "youDontOwnThisGame": "Cette partie ne vous appartient pas"
},
- "GameContentHeader": {
+ "GamePlayFieldHeader": {
"day": "Jour",
"night": "Nuit",
"waiting": {
@@ -124,12 +127,14 @@
}
}
},
- "GameContentFooter": {
+ "GamePlayFieldFooter": {
"next": "Suivant",
"playersHaveVoted": "{votesCount}/{playersCount} joueurs ont voté",
"playersTargeted": "{targetsCount}/{min} joueur visé",
"minOnePlayerHasToVote": "Minimum 1 joueur doit voter",
- "minOnePlayerHasToBeTargeted": "Minimum 1 joueur doit être visé"
+ "minOnePlayerHasToBeTargeted": "Minimum 1 joueur doit être visé",
+ "timeForDebating": "Temps pour débattre",
+ "debateIsOver": "Le débat est terminé, il est temps de voter !"
},
"PlayerAttribute": {
"attributes": {
@@ -143,6 +148,7 @@
}
},
"PlayerThumbnail": {
+ "chooseRole": "Choisir un rôle",
"unsetPlayer": "Retirer le joueur"
},
"PlayerVote": {
@@ -166,14 +172,39 @@
"useDeathPotionOn": "Utiliser la potion de mort sur ..."
},
"GameWinners": {
- "wonByWerewolves": "Partie gagnée par le seul loup garou | Partie gagnée par les loups garous",
+ "wonByWerewolves": "Partie gagnée par le seul loup-garou | Partie gagnée par les loups-garous",
"wonByVillagers": "Partie gagnée par le seul villageois | Partie gagnée par les villageois",
"restartGame": "Recommencer une partie",
"quit": "Quitter",
"newGame": "Nouvelle partie",
"doYouWantToKeepSamePlayers": "Voulez-vous rejouer avec les mêmes joueurs ?",
"keepSamePlayers": "Garder les mêmes joueurs",
- "fromScratch": "Recommencer du début"
+ "fromScratch": "Recommencer du début",
+ "seeGameSummary": "Voir le récapitulatif de partie"
+ },
+ "GameSummaryModal": {
+ "gameSummary": "Récapitulatif de la partie",
+ "gameResults": "Résultats de la partie",
+ "gameHistory": "Historique de la partie",
+ "villagers": "Villageois",
+ "werewolves": "Loups-Garous",
+ "close": "Fermer"
+ },
+ "GameSummaryHistoryLine": {
+ "day": "Jour",
+ "night": "Nuit",
+ "actions": {
+ "eat": "ont décidé de manger",
+ "use-potion": "a utilisé une potion sur",
+ "look": "a vu",
+ "shoot": "a tiré sur",
+ "protect": "a protégé",
+ "mark": "a marqué",
+ "elect-sheriff": "a élu comme maire",
+ "vote": "a décidé de pendre",
+ "delegate": "a légué son rôle de maire à",
+ "settle-votes": "a tranché pour pendre"
+ }
},
"PlayFieldActionText": {
"wantsToLook": "souhaite voir le rôle de",
@@ -198,6 +229,34 @@
"cancel": "Annuler",
"cancelTarget": "Annuler cette cible"
},
+ "GameEventMonitor": {
+ "skip": "Passer"
+ },
+ "GameEvent": {
+ "next": "Suivant",
+ "previous": "Précédent",
+ "messages": {
+ "welcomeToTheVillage": "Bienvenue à tous dans le village de Thiercelieux !",
+ "compositionIs": "Ce village de {inhabitantCount} habitants se composent de ",
+ "looksLifeSomeWerewolvesIntroducedThemselves": "Il semblerait qu'un ou plusieurs loups-garous se soient faufilé dans le village...",
+ "villagersMurderWerewolves": "Villageois, prenez les fourches et nettoyez votre village de ces canidés !",
+ "beforeStartingLetsElectSheriff": "Mais avant de vous entretuer, il faut élire le maire de ce village.",
+ "playerDies": "{player} est mort ! Quelle tragédie...",
+ "playerRevealsRole": "Il ou elle révèle son rôle aux survivants.",
+ "playerHasBeenPromotedSheriff": "{player} a été promu maire !",
+ "sheriffCanMakeASpeech": "Le maire peut, s'il le souhaite, faire un discours poignant sur son élection.",
+ "nightFalls": "La nuit tombe sur le village de Thiercelieux...",
+ "inhabitantsFallAsleep": "Les habitants du village s'endorment.",
+ "dayRises": "Le jour se lève sur le village de Thiercelieux.",
+ "seerStarts": "La voyante se réveille et va découvrir dans sa boule de cristal le rôle d'un habitant.",
+ "seerHasSeen": "La voyante a vu",
+ "werewolvesStart": "Le loup-garou se réveille et va choisir son dîner de ce soir. | Les loups-garous se réveillent et vont choisir leur dîner de ce soir.",
+ "witchStarts": "La sorcière se réveille et va, si elle le souhaite, utiliser ses potions.",
+ "guardStarts": "Le salvateur se réveille et va protéger la personne de son choix.",
+ "ravenStarts": "Le corbeau se réveille et va, s'il le souhaite, marquer de sa plume un des habitants.",
+ "hunterStarts": "Dans son dernier souffle, le chasseur s'apprête à choisir la cible de sa vengeance."
+ }
+ },
"Statistics": {
"statistics": "Statistiques",
"loadingStatistics": "Chargement des statistiques",
@@ -214,14 +273,38 @@
"createGameNow": "Créer une partie maintenant"
},
"Role": {
+ "a": {
+ "villager": "un villageois",
+ "werewolf": "un loup-garou",
+ "seer": "une voyante",
+ "witch": "une sorcière",
+ "hunter": "un chasseur",
+ "guard": "un salvateur",
+ "raven": "un corbeau"
+ },
+ "the": {
+ "villager": "le villageois",
+ "werewolf": "le loup-garou",
+ "werewolves": "les loups-garous",
+ "seer": "la voyante",
+ "witch": "la sorcière",
+ "hunter": "le chasseur",
+ "guard": "le salvateur",
+ "raven": "le corbeau",
+ "sheriff": "le maire",
+ "all": "le village"
+ },
"villager": "Villageois",
- "werewolf": "Loup-Garou",
+ "werewolf": "Loup-Garou | Loups-Garous",
"seer": "Voyante",
"witch": "Sorcière",
"hunter": "Chasseur",
"guard": "Salvateur",
"raven": "Corbeau"
},
+ "RoleText": {
+ "chooseARole": "Choisir un rôle"
+ },
"Error": {
"unauthorized": "Vous ne pouvez pas accéder à cette page",
"BAD_REQUEST": "Mauvaise requête serveur",