From accae89fedb039bf6fa4f24f6b48dd4bda6c0102 Mon Sep 17 00:00:00 2001 From: Alexandra Date: Sun, 28 Jun 2020 12:00:20 -0700 Subject: [PATCH] added changes so game will end if there are assassin targets, and generic evil knows evil --- server/actionHandlers.js | 3 ++- server/helpers.js | 21 +++++++++++++++++++-- server/roleAssignmentData.js | 24 ++++++++++++++++++++++-- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/server/actionHandlers.js b/server/actionHandlers.js index a422683..10e51c8 100644 --- a/server/actionHandlers.js +++ b/server/actionHandlers.js @@ -1,6 +1,7 @@ const enums = require('./enums'); const helpers = require('./helpers'); const otherUtils = require( "./otherUtils"); +const roles = require("./roleAssignmentData"); /** * Creates an array of player objects with roles assigned @@ -165,7 +166,7 @@ const handleHandleMissionVoteResult = (room) => { currentMission.status = enums.MissionStatus.SUCCESS; } - const gameState = helpers.getGameStateBasedOnMissionStatus(newRoom.boardInfo.missions); + const gameState = helpers.getGameStateBasedOnMissionStatus(newRoom); //Update the game state newRoom = helpers.setStatus(newRoom, gameState); // If the game is not over we need to move things along for the next mission diff --git a/server/helpers.js b/server/helpers.js index 26ff87c..52e9722 100644 --- a/server/helpers.js +++ b/server/helpers.js @@ -203,8 +203,10 @@ const isFailedMission = (missionVotes, isDoubleFailRequired) => { * Can be one of GameState.ASSASSINATION, EVIL_WIN, or TEAM_PROPOSAL if the game continues * @param missions */ -const getGameStateBasedOnMissionStatus = (missions) => { +const getGameStateBasedOnMissionStatus = (roomObj) => { // Check if the game ends + const missions = roomObj.boardInfo.missions + const hasTargets = hasAssassinTargets(roomObj.selectedRoles) let missionSuccessCount = 0; let missionFailedCount = 0; missions.forEach(mission => { @@ -215,8 +217,10 @@ const getGameStateBasedOnMissionStatus = (missions) => { } }); // Game ends - if (missionSuccessCount >= 3) { + if (missionSuccessCount >= 3 && hasTargets) { return enums.GameState.ASSASSINATION; + } else if(missionSuccessCount >= 3 && !hasTargets) { + return enums.GameState.GOOD_WIN; } else if (missionFailedCount >= 3) { return enums.GameState.EVIL_WIN; } @@ -351,6 +355,19 @@ const getAssassin = (roomObj) => { return roomObj; } +/** + * Returns true if the current room has assassinatable roles + * @param {[Role]} selectedRoles + */ +const hasAssassinTargets = (selectedRoles) => { + selectedRoles.forEach(role => { + if (role.isAssassinTarget){ + return true + } + }) + return false; +} + module.exports = { setMissionCount, setVoteTrackCount, shufflePlayers: shuffleKingOrder, assignRoles, setStatus, setKing, setLake, updateKing, reinitializeBoard, setTeamMembers, isFailedMission, diff --git a/server/roleAssignmentData.js b/server/roleAssignmentData.js index fcd695d..a779bb8 100644 --- a/server/roleAssignmentData.js +++ b/server/roleAssignmentData.js @@ -3,6 +3,7 @@ module.exports = { merlin: { roleTitle: 'Merlin', alignment: 'good', + isAssassinTarget: true, sees: { morgana: { roleTitle: 'Morgana', @@ -27,10 +28,12 @@ module.exports = { assassin: { roleTitle: 'Assassin', alignment: 'evil', + roleTitle: 'Agravaine', + alignment: 'evil', knowsRole: false }, - oberon: { - roleTitle: 'Oberon', + genericEvil: { + roleTitle: 'Generic Evil', alignment: 'evil', knowsRole: false } @@ -58,6 +61,7 @@ module.exports = { tristan: { roleTitle: 'Tristan', alignment: 'good', + isAssassinTarget: true, sees: { iseult: { roleTitle: 'iseult', @@ -70,6 +74,7 @@ module.exports = { iseult: { roleTitle: 'Iseult', alignment: 'good', + isAssassinTarget: true, sees: { tristan: { roleTitle: 'tristan', @@ -82,12 +87,14 @@ module.exports = { titania: { roleTitle: 'Titania', alignment: 'good', + isAssassinTarget: false, sees: {}, description: 'appears as Evil to Evil roles (except Colgrevance).' }, genericGood: { roleTitle: 'Generic Good', alignment: 'good', + isAssassinTarget: false, sees: {}, description: 'doesn\'t see anyone. The loyalest servant of King Arthur' }, @@ -96,6 +103,7 @@ module.exports = { assassin: { roleTitle: 'Assassin', alignment: 'evil', + isAssassinTarget: false, sees: { mordred: { roleTitle: 'Mordred', @@ -128,6 +136,7 @@ module.exports = { mordred: { roleTitle: 'Mordred', alignment: 'evil', + isAssassinTarget: false, sees: { morgana: { roleTitle: 'Morgana', @@ -160,6 +169,7 @@ module.exports = { morgana: { roleTitle: 'Morgana', alignment: 'evil', + isAssassinTarget: false, sees: { mordred: { roleTitle: 'Mordred', @@ -192,6 +202,7 @@ module.exports = { agravaine: { roleTitle: 'Agravaine', alignment: 'evil', + isAssassinTarget: false, sees: { mordred: { roleTitle: 'Mordred', @@ -224,6 +235,7 @@ module.exports = { colgrevance: { roleTitle: 'Colgrevance', alignment: 'evil', + isAssassinTarget: false, sees: { mordred: { roleTitle: 'Mordred', @@ -261,6 +273,7 @@ module.exports = { genericEvil: { roleTitle: 'Generic Evil', alignment: 'evil', + isAssassinTarget: false, sees: { mordred: { roleTitle: 'Mordred', @@ -286,6 +299,11 @@ module.exports = { roleTitle: 'Titania', alignment: 'evil', knowsRole: false + }, + genericEvil: { + roleTitle: 'Generic Evil', + alignment: 'evil', + knowsRole: true } }, description: 'An evil Minion of Mordred' @@ -293,12 +311,14 @@ module.exports = { oberon: { roleTitle: 'Oberon', alignment: 'evil', + isAssassinTarget: false, sees: {}, description: 'is hidden from other Evil roles, but is visible to Merlin' }, noberon: { roleTitle: 'NOberon', alignment: 'evil', + isAssassinTarget: false, sees: {}, description: 'is hidden from other Evil roles and is also hidden from Merlin' }