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