diff --git a/Games/core/Game.js b/Games/core/Game.js index 0df9d56d7..492cfe384 100644 --- a/Games/core/Game.js +++ b/Games/core/Game.js @@ -1038,7 +1038,8 @@ module.exports = class Game { i++; } } - +this.SpecialInteractionRoles = []; + let tempSInteraction; for (let z = 0; z < this.PossibleRoles.length; z++) { if (this.PossibleRoles[z].split(":")[0] == "Magus") { this.MagusPossible = true; @@ -1053,6 +1054,9 @@ module.exports = class Game { if (this.getRoleTags(this.PossibleRoles[z]).includes("Pregame Actions")) { this.HaveDuskOrDawn = true; } + if(this.getSpecialInteractions(this.PossibleRoles[z]) != null){ + this.SpecialInteractionRoles.push(this.PossibleRoles[z]); + } } if (this.setup.closed && this.setup.banished > 0) { var banishedRoles = this.banishedRoles; @@ -1231,6 +1235,15 @@ module.exports = class Game { return roleData[this.type][role.split(":")[0]].alignment; } + getSpecialInteractions(role) { + if(roleData[this.type][role.split(":")[0]].SpecialInteractions){ + return roleData[this.type][role.split(":")[0]].SpecialInteractions; + } + else{ + return null; + } + } + getRoleTags(role) { let roleFull = role; let modifiers = roleFull.split(":")[1]; @@ -1428,6 +1441,29 @@ module.exports = class Game { ), ]; } + + if (this.SpecialInteractionRoles.length > 0 && this.currentState == 0) { + this.SpecialInteractionText = []; + let special; + for(let role of this.SpecialInteractionRoles){ + special = this.getSpecialInteractions(role); + if(this.isOneNightMode() && special["OneNightMode"]){ + this.SpecialInteractionText.push(`:journ: ${role.split(":")[0]} has a Special Interaction With One Night Mode, ${special["OneNightMode"]}`); + } + for(let r of this.PossibleRoles){ + if(special[r.split(":")[0]]){ + this.SpecialInteractionText.push(`:journ: ${role.split(":")[0]} has a Special Interaction With ${r.split(":")[0]}, ${special[r.split(":")[0]]}`); + } + } + } + if(this.SpecialInteractionText.length > 0){ + this.sendAlert( + `:crystal: ${this.setup.name}: This Setup has Special Role Interactions do /special to see them.`, + undefined, + { color: " #eb347a" } + ); + } + } // Check for inactivity this.inactivityCheck(); diff --git a/Games/core/Player.js b/Games/core/Player.js index acc1eabc7..b07dbc7c3 100644 --- a/Games/core/Player.js +++ b/Games/core/Player.js @@ -487,6 +487,40 @@ module.exports = class Player { this.sendAlert(`The Night Order is: ${this.game.NightOrder}`); return; + case "special": + if (!this.game.started) { + this.sendAlert(`This command can only be used during the game`); + return; + } + if (this.specialCooldown == true) { + this.sendAlert(`This command has a 20 seconds cooldown, wait plz`); + return; + } + if (this.game.type != "Mafia") { + this.sendAlert(`This command is only supported in Mafia games`); + return; + } + this.specialCooldown = true; + setTimeout(() => { + this.specialCooldown = false; + }, 20000); + + if(this.game.SpecialInteractionText.length > 0){ + this.sendAlert( + `:crystal: ${this.game.setup.name} has the Following Special Interactions.`, + undefined, + { color: " #eb347a" } + ); + for(let text of this.game.SpecialInteractionText){ + this.sendAlert(text,undefined,{ color: " #eb347a" }); + } + } + else{ + this.sendAlert(`:crystal: ${this.game.setup.name}: has No Special Role Interactions`); + } + //this.sendAlert(`The Night Order is: ${this.game.NightOrder}`); + + return; } return cmd; diff --git a/Games/types/Mafia/information/AlignmentInfo.js b/Games/types/Mafia/information/AlignmentInfo.js index 80454624e..d2f94c2d4 100644 --- a/Games/types/Mafia/information/AlignmentInfo.js +++ b/Games/types/Mafia/information/AlignmentInfo.js @@ -36,10 +36,8 @@ module.exports = class AlignmentInfo extends Information{ getInfoFormated(){ super.getInfoRaw(); - if(this.randomTarget == true){ return `You Learn that your ${this.target.name}'s Alignment is ${this.mainInfo}` - } - return `You Learn that your Target's Alignment is ${this.mainInfo}` + //return `You Learn that your Target's Alignment is ${this.mainInfo}` } isTrue() { diff --git a/Games/types/Mafia/information/RoleInfo.js b/Games/types/Mafia/information/RoleInfo.js index 8618c3ed2..a2fbcb8d1 100644 --- a/Games/types/Mafia/information/RoleInfo.js +++ b/Games/types/Mafia/information/RoleInfo.js @@ -38,10 +38,8 @@ module.exports = class RoleInfo extends Information{ getInfoFormated(){ super.getInfoRaw(); - if(this.randomTarget == true){ return `You Learn that your ${this.target.name}'s Role is ${this.mainInfo}` - } - return `You Learn that your Target's Role is ${this.mainInfo}` + //return `You Learn that your Target's Role is ${this.mainInfo}` } isTrue() { diff --git a/Games/types/Mafia/roles/cards/WinIfPrescientVote.js b/Games/types/Mafia/roles/cards/WinIfPrescientVote.js index 08c13fe33..78fa6d9bc 100644 --- a/Games/types/Mafia/roles/cards/WinIfPrescientVote.js +++ b/Games/types/Mafia/roles/cards/WinIfPrescientVote.js @@ -29,6 +29,9 @@ module.exports = class WinIfPrescientVote extends Card { this.player.alive ) { this.predictedCorrect += 1; + if(this.game.isOneNightMode()){ + this.predictedCorrect += 1; + } this.player.giveEffect("ExtraLife"); this.player.queueAlert( `The Village has condemned ${this.predictedVote.name} to death, strengthening your bond with the spirit world. You gain an extra life.` diff --git a/data/roles.js b/data/roles.js index ff2e7d3bd..0ad38838c 100644 --- a/data/roles.js +++ b/data/roles.js @@ -1061,6 +1061,11 @@ const roleData = { description: [ "If an Evil player is condemned, All players are inflicted with Mind Rot that night.", ], + SpecialInteractions: { + Assassin: [ + "If an Assassin is Present, All players are inflicted with Mind Rot if an Evil Player is Elected as Room Leader.", + ], + }, }, Princess: { alignment: "Village", @@ -1281,6 +1286,11 @@ const roleData = { "Cannot be killed or converted at night.", "Can only be killed by village condemnation.", ], + SpecialInteractions: { + Hellhound: [ + "A Hellhound can kill a Granny at Night.", + ], + }, }, Jailer: { alignment: "Village", @@ -1399,9 +1409,14 @@ const roleData = { category: "Essential", tags: ["Essential", "Selective Revealing","Exposed"], description: [ - "All villagers will know who the President is, unless an Assassin is present.", + "All villagers will know who the President is.", "When the President dies, the Mafia will win.", ], + SpecialInteractions: { + Assassin: [ + "If an Assassin is Present, Village Aligned Players will not learn who the President is.", + ], + }, }, Saint: { alignment: "Village", @@ -1990,6 +2005,11 @@ const roleData = { "Each night, predicts the village vote.", "If they successfully predict the village vote, they gain a bonus kill.", ], + SpecialInteractions: { + Assassin: [ + "If an Assassin is Present, Bookie will gain a bonus kill if they can guess a player who is Elected as Room Leader.", + ], + }, }, Ape: { alignment: "Mafia", @@ -3099,8 +3119,12 @@ const roleData = { tags: ["Neighbors", "Death"], description: [ "Wins if both of their starting neighbors are dead.", - "In One Night Mode, Wins if one of their neighbors is killed.", ], + SpecialInteractions: { + OneNightMode: [ + "In One Night Mode, Fumigator Wins if one of their neighbors is killed.", + ], + }, }, Doppelgänger: { alignment: "Independent", @@ -3254,6 +3278,14 @@ const roleData = { "If that person is condemned the next day, the Warlock has predicted correctly. They gain an extra life.", "The Warlock wins if they predict the condemnation correctly twice.", ], + SpecialInteractions: { + Assassin: [ + "If an Assassin is Present, The Warlock wins if they can guess a player who is Elected as Room Leader Twice.", + ], + OneNightMode: [ + "In One Night Mode, The Warlock wins if they predict the condemnation correctly Once.", + ], + }, }, Rival: { alignment: "Independent", @@ -3326,9 +3358,15 @@ const roleData = { "Meets with All Independents", "Grants All Independents a random Infomation or Role Swapping ability.", "Wins if Independents have majority.", - "In One Night mode, Wins if no Independents die.", - "In One Night mode, Village must kill an Independent to win.", ], + SpecialInteractions: { + OneNightMode: [ + "In One Night Mode, Superheros Wins if no Independents die.", + "In One Night Mode, Village must kill an Independent to win in addition to other evil Factions.", + "In One Night Mode, Mafia/Cult must kill an Independent to win in addition to competing evil Factions.", + "In One Night Mode, Independents with the (Lone) Modifier are not counted as Independents for any of these Win Con", + ], + }, }, Ghost: { alignment: "Independent", diff --git a/react_main/src/constants/commandList.js b/react_main/src/constants/commandList.js index 49feaba3f..d017a6120 100644 --- a/react_main/src/constants/commandList.js +++ b/react_main/src/constants/commandList.js @@ -33,4 +33,9 @@ export const commandList = { description: "Lists the Night Order for the Setup (Ties are resloved by Player Order).", }, + "/special": { + input: "N/A", + description: + "Lists Any Special Role Interactions for the Setup.", + }, }; diff --git a/react_main/src/pages/Learn/LearnWackyWords.jsx b/react_main/src/pages/Learn/LearnWackyWords.jsx index 1039f68d5..2b70600b7 100644 --- a/react_main/src/pages/Learn/LearnWackyWords.jsx +++ b/react_main/src/pages/Learn/LearnWackyWords.jsx @@ -41,6 +41,11 @@ export default function LearnWackyWords(props) { convincing another person to guess their answer, and the true answerer gets 2 points when players guess their answer! + + Acrotopia: In Acrotopia, All players are given an acronym and tasked to create a backronym based on it! All players then vote for their + favorites, with the winners of each round getting points. The person with the most points at the end of the game is + declared the winner + Roles