Skip to content

Commit

Permalink
Demonic Modifier and more Info Changes (#1777)
Browse files Browse the repository at this point in the history
Demonic - Cult will Win if a Demonic Player is alive in final 2 or Only
Demonic and Cult players are alive. If all Demonic roles are dead, All
Cult-Aligned players will die. (Does not change the Demonic player's Win
Cons).

Info Changes for Empath, Geo, Account, and Orienteer, All now see
Hostile 3rds as Evil.

All Endangered Cult (Expect Poltergeist) are no longer endangered.
  • Loading branch information
SawJester authored Dec 9, 2024
1 parent 4fab737 commit 32a1ebf
Show file tree
Hide file tree
Showing 26 changed files with 938 additions and 141 deletions.
40 changes: 34 additions & 6 deletions Games/core/Game.js
Original file line number Diff line number Diff line change
Expand Up @@ -1232,23 +1232,51 @@ module.exports = class Game {
}

getRoleTags(role) {
let roleFull = `${role}`;
let roleFull = role;
let modifiers = roleFull.split(":")[1];
if(modifiers){
//this.sendAlert(`Modifiers ${modifiers}`,undefined);
modifiers = modifiers.split("/");
if(!Array.isArray(modifiers)){
modifiers = [modifiers];
}
//this.sendAlert(`Modifiers ${modifiers}`,undefined);
}
let modTags;
let roleTags = roleData[this.type][roleFull.split(":")[0]].tags;
if (roleFull.split(":")[1] != null && roleFull.split(":")[1].length > 0) {
let roleTags = [];
for(let tag of roleData[this.type][roleFull.split(":")[0]].tags){
roleTags.push(tag);
}
if(modifiers && modifiers.length > 0){
//this.sendAlert(`Modifiers Pre loop ${modifiers}`,undefined);
for(let modifier of modifiers){
if(modifierData[this.type][modifier] && modifierData[this.type][modifier].tags){
//this.sendAlert(`Modifiers Tags ${modifierData[this.type][modifier].tags}`,undefined);
roleTags = roleTags.concat(modifierData[this.type][modifier].tags);
//this.sendAlert(`Role Tags ${roleTags}`,undefined);
}
}
}
/*
if ((modifiers != null && modifiers != "") && modifiers.length > 0) {
let modifiersArray = roleFull.split(":")[1].split("/");
/*this.sendAlert(
`Stuff ${roleFull}: ${roleFull.split(":")[1]}: ${modifiersArray[0]}`,
//this.sendAlert(`Set modifiersArray ${modifiersArray} Length ${modifiersArray.length}`,undefined);
this.sendAlert(
`Stuff Full ${roleFull} Mods Split ${roleFull.split(":")[1]} Mods ${modifiers} First Mod ${modifiersArray[0]}`,
undefined,
{ color: "#F1F1F1" }
);*/
);
for (let w = 0; w < modifiersArray.length; w++) {
modTags = modifierData[this.type][modifiersArray[w]].tags;
this.sendAlert(`Set modTags ${modTags} Length ${modTags.length}`,undefined);
for (let u = 0; u < modTags.length; u++) {
roleTags.push(modTags[u]);
}
}
}
*/
//this.sendAlert(`return roleTags ${roleTags}`,undefined);
return roleTags;
}

Expand Down
5 changes: 4 additions & 1 deletion Games/types/Mafia/Game.js
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,10 @@ module.exports = class MafiaGame extends Game {
}

formatRoleInternal(role, modifiers) {
return `${role}:${modifiers}`;
if(modifiers == "" || modifiers == null){
modifiers = null;
}
return `${role}${modifiers ? `:${modifiers}`: ""}`;
}

createInformation(infoType, ...args) {
Expand Down
31 changes: 31 additions & 0 deletions Games/types/Mafia/Information.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,14 @@
const {
EVIL_FACTIONS,
NOT_EVIL_FACTIONS,
CULT_FACTIONS,
MAFIA_FACTIONS,
FACTION_LEARN_TEAM,
FACTION_WIN_WITH_MAJORITY,
FACTION_WITH_MEETING,
FACTION_KILL,
} = require("./const/FactionList");

module.exports = class MafiaInformation{
constructor(name, creator, game) {
this.name = name;
Expand Down Expand Up @@ -60,4 +71,24 @@ module.exports = class MafiaInformation{
}
makeUnfavorable(){
}

isAppearanceEvil(player){

if(player.getRoleAppearance() == this.game.formatRole(this.game.formatRoleInternal(player.role.name,player.role.modifier))){
return this.isEvil(player);
}

if(this.game.getRoleAlignment(player.getRoleAppearance().split(" (")[0]) == "Cult" ||
this.game.getRoleAlignment(player.getRoleAppearance().split(" (")[0]) == "Mafia" ||
(this.game.getRoleAlignment(player.getRoleAppearance().split(" (")[0]) == "Independent" && (this.game.getRoleTags(player.getRoleAppearance().split(" (")[0]).includes("Hostile")))){
return true;
}
return false;
}
isEvil(player){
if(EVIL_FACTIONS.includes(player.faction) || (player.faction == "Independent" && this.game.getRoleTags(player.role.name).includes("Hostile"))){
return true;
}
return false;
}
};
199 changes: 199 additions & 0 deletions Games/types/Mafia/information/DirectionToEvilInfo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
const Information = require("../Information");
const Random = require("../../../../lib/Random");
const {
EVIL_FACTIONS,
NOT_EVIL_FACTIONS,
CULT_FACTIONS,
MAFIA_FACTIONS,
FACTION_LEARN_TEAM,
FACTION_WIN_WITH_MAJORITY,
FACTION_WITH_MEETING,
FACTION_KILL,
} = require("../const/FactionList");

module.exports = class DirectionToEvilInfo extends Information{
constructor(creator, game, target) {
super("Direction To Evil Info", creator, game);
if(target == null){
this.randomTarget = true;
target = Random.randArrayVal(this.game.alivePlayers());
}
this.target = target;

let alive = this.game.alivePlayers();
var evilPlayers = alive.filter((p) => this.isAppearanceEvil(p));
let info = "";
if (evilPlayers.length <= 0) {
info = "Not Applicable";
}

var evilTarget = Random.randArrayVal(evilPlayers);
var indexOfTarget = alive.indexOf(this.target);
var rightIdx;
var leftIdx;
var leftAlign;
var rightAlign;
var distance = 0;
var found = false;
//let info = "";
if(info != "Not Applicable"){
for (let x = 0; x < alive.length; x++) {
leftIdx =
(indexOfTarget - distance - 1 + alive.length) % alive.length;
rightIdx = (indexOfTarget + distance + 1) % alive.length;

if(this.isAppearanceEvil(alive[rightIdx])){
found = true;
info = "Below";
break;
}
if(this.isAppearanceEvil(alive[leftIdx])){
found = true;
info = "Above";
break;
}
if(!found){
distance = x;
}
}
}
this.mainInfo = info;
}

getInfoRaw(){
super.getInfoRaw();
return this.mainInfo;
}

getInfoFormated(){
super.getInfoRaw();
if(this.target == this.creator){
return `You Learn that the closest Evil Player to you is ${this.mainInfo} you on the Player List`
}
if(this.randomTarget == true){
return `You Learn that the closest Evil Player to ${this.target.name} is ${this.mainInfo} them on the Player List`
}
return `You Learn that the closest Evil Player to your Target is ${this.mainInfo} them on the Player List`
}

isTrue() {
let alive = this.game.alivePlayers();
var evilPlayers = alive.filter((p) => this.isEvil(p));
let info = "";
if (evilPlayers.length <= 0) {
info = "Not Applicable";
}

var evilTarget = Random.randArrayVal(evilPlayers);
var indexOfTarget = alive.indexOf(this.target);
var rightIdx;
var leftIdx;
var leftAlign;
var rightAlign;
var distance = 0;
var found = false;
//let info = "";
if(info != "Not Applicable"){
for (let x = 0; x < alive.length; x++) {
leftIdx =
(indexOfTarget - distance - 1 + alive.length) % alive.length;
rightIdx = (indexOfTarget + distance + 1) % alive.length;

if(this.isEvil(alive[rightIdx])){
found = true;
info = "Below";
break;
}
if(this.isEvil(alive[leftIdx])){
found = true;
info = "Above";
break;
}

if(!found){
distance = x;
}
}
}
if(this.mainInfo == info){
return true;
}
else{
return false;
}
}
isFalse() {
if(this.isTrue()){
return false;
}
else{
return true;
}
}
isFavorable(){
return true;
}
isUnfavorable(){
return true;
}

makeTrue() {
let alive = this.game.alivePlayers();
var evilPlayers = alive.filter((p) => this.isEvil(p));
let info = "";
if (evilPlayers.length <= 0) {
info = "Not Applicable";
}

var evilTarget = Random.randArrayVal(evilPlayers);
var indexOfTarget = alive.indexOf(this.target);
var rightIdx;
var leftIdx;
var leftAlign;
var rightAlign;
var distance = 0;
var found = false;
//let info = "";
if(info != "Not Applicable"){
for (let x = 0; x < alive.length; x++) {
leftIdx =
(indexOfTarget - distance - 1 + alive.length) % alive.length;
rightIdx = (indexOfTarget + distance + 1) % alive.length;


if(this.isEvil(alive[rightIdx])){
found = true;
info = "Below";
break;
}
if(this.isEvil(alive[leftIdx])){
found = true;
info = "Above";
break;
}
if(!found){
distance = x;
}
}
}
this.mainInfo = info;
}
makeFalse() {
this.makeTrue();
if(this.mainInfo == "Above"){
this.mainInfo = "Below";
}
else if(this.mainInfo == "Below"){
this.mainInfo = "Above";
}
else{
this.mainInfo = "Below";
}
}
makeFavorable(){
this.makeFalse();
}
makeUnfavorable(){
this.makeTrue();
}
};
Loading

0 comments on commit 32a1ebf

Please sign in to comment.