Files
EndlessHostRoles/Modules/CustomRolesHelper.cs
T
2026-04-23 10:19:57 +02:00

2082 lines
117 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using AmongUs.GameOptions;
using EHR.Gamemodes;
using EHR.Modules;
using EHR.Roles;
using UnityEngine;
namespace EHR;
internal static class CustomRolesHelper
{
public static bool CanCheck = false;
private static readonly List<CustomRoles> OnlySpawnsWithPetsRoleList =
[
CustomRoles.Tunneler,
CustomRoles.Tornado,
CustomRoles.Swiftclaw,
CustomRoles.Adventurer,
CustomRoles.Sentry,
CustomRoles.Cherokious,
CustomRoles.Chemist,
CustomRoles.Evolver,
CustomRoles.ToiletMaster,
CustomRoles.Telekinetic,
CustomRoles.Dad,
CustomRoles.Whisperer,
CustomRoles.Wizard,
CustomRoles.NoteKiller,
CustomRoles.Weatherman,
CustomRoles.Amogus,
CustomRoles.Wiper,
CustomRoles.PortalMaker,
CustomRoles.Gardener,
CustomRoles.Farmer,
CustomRoles.Tree,
CustomRoles.Doorjammer,
CustomRoles.Carrier,
CustomRoles.Empress,
CustomRoles.Tar,
// Add-ons
CustomRoles.Energetic,
// HnS
CustomRoles.Jet,
CustomRoles.Dasher
];
extension(CustomRoles role)
{
public bool IsExperimental()
{
return role is
CustomRoles.DoubleAgent or
CustomRoles.Weatherman;
}
public bool IsForOtherGameMode()
{
return CustomHnS.AllHnSRoles.Contains(role) || role is
CustomRoles.Challenger or
CustomRoles.Killer or
CustomRoles.Tasker or
CustomRoles.Potato or
CustomRoles.Runner or
CustomRoles.CTFPlayer or
CustomRoles.NDPlayer or
CustomRoles.RRPlayer or
CustomRoles.KOTZPlayer or
CustomRoles.QuizPlayer or
CustomRoles.TMGPlayer or
CustomRoles.BedWarsPlayer or
CustomRoles.Racer or
CustomRoles.MinglePlayer or
CustomRoles.SnowdownPlayer;
}
public RoleBase GetRoleClass()
{
RoleBase roleClass = role switch
{
// Roles that use the same code as another role need to be handled here
CustomRoles.Nuker => new Bomber(),
CustomRoles.Undertaker => new Ninja(),
CustomRoles.Chameleon => new Swooper(),
CustomRoles.BloodKnight => new Wildling(),
CustomRoles.HexMaster => new Witch(),
CustomRoles.Pulse => new Greedy(),
CustomRoles.Jinx => new CursedWolf(),
CustomRoles.Juggernaut => new Arrogance(),
CustomRoles.Medusa => new Cleaner(),
CustomRoles.Poisoner => new Vampire(),
CustomRoles.Reckless => new Arrogance(),
CustomRoles.Ritualist => new Consigliere(),
CustomRoles.Wraith => new Swooper(),
CustomRoles.Goose => new Penguin(),
CustomRoles.Telecommunication => new AntiAdminer(),
// Else, the role class is the role name - if the class doesn't exist, it defaults to VanillaRole
_ => Main.AllRoleClasses.FirstOrDefault(x => x.GetType().Name.Equals(role.ToString(), StringComparison.OrdinalIgnoreCase)) ?? new VanillaRole()
};
return Activator.CreateInstance(roleClass.GetType()) as RoleBase;
}
public CustomRoles GetVNRole(bool checkDesyncRole = false)
{
if (role.IsGhostRole()) return CustomRoles.GuardianAngel;
if (role.IsVanilla()) return role;
if (role is CustomRoles.GM) return CustomRoles.Crewmate;
if (checkDesyncRole && role.IsDesyncRole()) return Enum.Parse<CustomRoles>(role.GetDYRole() + "EHR");
if ((Options.UsePhantomBasis.GetBool() || role.AlwaysUsesPhantomBase()) && role.SimpleAbilityTrigger()) return CustomRoles.Phantom;
bool UsePets = Options.UsePets.GetBool();
return role switch
{
CustomRoles.Sniper => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.Jester => Jester.JesterCanVent.GetBool() ? CustomRoles.Engineer : CustomRoles.Crewmate,
CustomRoles.Mayor => Mayor.MayorHasPortableButton.GetBool() && !UsePets ? CustomRoles.Engineer : CustomRoles.Crewmate,
CustomRoles.Telecommunication => Telecommunication.CanVent.GetBool() || !UsePets ? CustomRoles.Engineer : CustomRoles.Crewmate,
CustomRoles.Vulture => Vulture.CanVent.GetBool() ? CustomRoles.Engineer : CustomRoles.Crewmate,
CustomRoles.Opportunist => Opportunist.CanVent.GetBool() ? CustomRoles.Engineer : CustomRoles.Crewmate,
CustomRoles.Vindicator => CustomRoles.Impostor,
CustomRoles.Snitch => CustomRoles.Crewmate,
CustomRoles.Inspector => CustomRoles.Crewmate,
CustomRoles.Marshall => CustomRoles.Crewmate,
CustomRoles.Mechanic => Mechanic.CanVent.GetBool() ? CustomRoles.Engineer : CustomRoles.Crewmate,
CustomRoles.Nemesis => Options.LegacyNemesis.GetBool() ? CustomRoles.Shapeshifter : CustomRoles.Impostor,
CustomRoles.Terrorist => Terrorist.CanVent.GetBool() ? CustomRoles.Engineer : CustomRoles.Crewmate,
CustomRoles.Executioner => CustomRoles.Crewmate,
CustomRoles.Lawyer => CustomRoles.Crewmate,
CustomRoles.Swapper => CustomRoles.Crewmate,
CustomRoles.Ignitor => CustomRoles.Crewmate,
CustomRoles.Jailor => UsePets && Jailor.UsePet.GetBool() ? CustomRoles.Crewmate : CustomRoles.Impostor,
CustomRoles.Vampire => CustomRoles.Impostor,
CustomRoles.BountyHunter => CustomRoles.Impostor,
CustomRoles.Trickster => CustomRoles.Impostor,
CustomRoles.Witch => (Witch.SwitchTrigger)Witch.ModeSwitchAction.GetValue() == Witch.SwitchTrigger.Vanish ? CustomRoles.Phantom : CustomRoles.Impostor,
CustomRoles.Agitator => CustomRoles.Impostor,
CustomRoles.Consigliere => CustomRoles.Impostor,
CustomRoles.Wildling => Wildling.CanShapeshiftOpt.GetBool() ? CustomRoles.Shapeshifter : CustomRoles.Impostor,
CustomRoles.Morphling => CustomRoles.Shapeshifter,
CustomRoles.Warlock => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.Mercenary => CustomRoles.Impostor,
CustomRoles.Fireworker => CustomRoles.Shapeshifter,
CustomRoles.SpeedBooster => CustomRoles.Crewmate,
CustomRoles.Dictator => CustomRoles.Crewmate,
CustomRoles.DoubleAgent => CustomRoles.Crewmate,
CustomRoles.Inhibitor => CustomRoles.Impostor,
CustomRoles.Occultist => CustomRoles.Impostor,
CustomRoles.Wiper => CustomRoles.Impostor,
CustomRoles.Forger => CustomRoles.Impostor,
CustomRoles.ClockBlocker => CustomRoles.Impostor,
CustomRoles.Psychopath => CustomRoles.Impostor,
CustomRoles.Loner => CustomRoles.Impostor,
CustomRoles.Postponer => CustomRoles.Impostor,
CustomRoles.Catalyst => CustomRoles.Impostor,
CustomRoles.Exclusionary => CustomRoles.Impostor,
CustomRoles.Centralizer => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.Venerer => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.Kidnapper => CustomRoles.Shapeshifter,
CustomRoles.Frightener => CustomRoles.Shapeshifter,
CustomRoles.Chainbinder => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.Exorcist => CustomRoles.Impostor,
CustomRoles.Obstructer => CustomRoles.Impostor,
CustomRoles.Ambusher => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.Stasis => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.Fabricator => CustomRoles.Impostor,
CustomRoles.Wasp => CustomRoles.Impostor,
CustomRoles.Assumer => CustomRoles.Impostor,
CustomRoles.Augmenter => CustomRoles.Shapeshifter,
CustomRoles.Ventriloquist => CustomRoles.Impostor,
CustomRoles.Echo => CustomRoles.Shapeshifter,
CustomRoles.Abyssbringer => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.Overheat => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.Hypnotist => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.Generator => CustomRoles.Shapeshifter,
CustomRoles.Blackmailer => CustomRoles.Impostor,
CustomRoles.Commander => CustomRoles.Shapeshifter,
CustomRoles.Freezer => CustomRoles.Shapeshifter,
CustomRoles.Changeling => CustomRoles.Phantom,
CustomRoles.Swapster => CustomRoles.Shapeshifter,
CustomRoles.Kamikaze => CustomRoles.Impostor,
CustomRoles.Librarian => CustomRoles.Shapeshifter,
CustomRoles.Cantankerous => CustomRoles.Impostor,
CustomRoles.Swiftclaw => CustomRoles.Impostor,
CustomRoles.YinYanger => CustomRoles.Impostor,
CustomRoles.Duellist => CustomRoles.Shapeshifter,
CustomRoles.Consort => CustomRoles.Impostor,
CustomRoles.Framer => CustomRoles.Impostor,
CustomRoles.Mafioso => CustomRoles.Impostor,
CustomRoles.Chronomancer => CustomRoles.Impostor,
CustomRoles.Nullifier => CustomRoles.Impostor,
CustomRoles.Stealth => UsePets || Stealth.UseLegacyVersion.GetBool() ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.Penguin => CustomRoles.Impostor,
CustomRoles.Sapper => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.Mastermind => CustomRoles.Impostor,
CustomRoles.RiftMaker => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.Gambler => CustomRoles.Impostor,
CustomRoles.Hitman => CustomRoles.Shapeshifter,
CustomRoles.Saboteur => CustomRoles.Impostor,
CustomRoles.Doctor => CustomRoles.Scientist,
CustomRoles.Tracefinder => CustomRoles.Scientist,
CustomRoles.Puppeteer => CustomRoles.Impostor,
CustomRoles.TimeThief => CustomRoles.Impostor,
CustomRoles.EvilTracker => CustomRoles.Shapeshifter,
CustomRoles.Paranoid => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.TimeMaster => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Cleanser => CustomRoles.Crewmate,
CustomRoles.Miner => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.Psychic => CustomRoles.Crewmate,
CustomRoles.LazyGuy => CustomRoles.Crewmate,
CustomRoles.Twister => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.SuperStar => CustomRoles.Crewmate,
CustomRoles.Anonymous => CustomRoles.Shapeshifter,
CustomRoles.Visionary => CustomRoles.Shapeshifter,
CustomRoles.Ninja => CustomRoles.Phantom,
CustomRoles.Undertaker => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.Luckey => CustomRoles.Crewmate,
CustomRoles.Demolitionist => CustomRoles.Crewmate,
CustomRoles.Ventguard => CustomRoles.Engineer,
CustomRoles.Express => CustomRoles.Crewmate,
CustomRoles.NiceEraser => CustomRoles.Crewmate,
CustomRoles.TaskManager => CustomRoles.Crewmate,
CustomRoles.Adventurer => CustomRoles.Engineer,
CustomRoles.Randomizer => CustomRoles.Crewmate,
CustomRoles.Beacon => CustomRoles.Crewmate,
CustomRoles.Rabbit => CustomRoles.Crewmate,
CustomRoles.Shiftguard => CustomRoles.Crewmate,
CustomRoles.Mole => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Markseeker => CustomRoles.Crewmate,
CustomRoles.Sentinel => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Electric => CustomRoles.Crewmate,
CustomRoles.Tornado => CustomRoles.Crewmate,
CustomRoles.Druid => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Catcher => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Operative => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Insight => CustomRoles.Crewmate,
CustomRoles.Tunneler => CustomRoles.Crewmate,
CustomRoles.Detour => CustomRoles.Crewmate,
CustomRoles.Dad => CustomRoles.Engineer,
CustomRoles.Drainer => CustomRoles.Engineer,
CustomRoles.Benefactor => CustomRoles.Crewmate,
CustomRoles.MeetingManager => CustomRoles.Crewmate,
CustomRoles.Bane => CustomRoles.Crewmate,
CustomRoles.Farmer => CustomRoles.Crewmate,
CustomRoles.Captain => CustomRoles.Crewmate,
CustomRoles.Transmitter => CustomRoles.Crewmate,
CustomRoles.Tar => CustomRoles.Crewmate,
CustomRoles.Sensor => CustomRoles.Crewmate,
CustomRoles.Doorjammer => CustomRoles.Crewmate,
CustomRoles.Tree => CustomRoles.Crewmate,
CustomRoles.Inquisitor => CustomRoles.Crewmate,
CustomRoles.Gardener => CustomRoles.Crewmate,
CustomRoles.Imitator => CustomRoles.Crewmate,
CustomRoles.PortalMaker => CustomRoles.Crewmate,
CustomRoles.Vacuum => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Astral => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Helper => CustomRoles.Crewmate,
CustomRoles.Ankylosaurus => CustomRoles.Crewmate,
CustomRoles.Leery => CustomRoles.Crewmate,
CustomRoles.Altruist => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Negotiator => CustomRoles.Crewmate,
CustomRoles.Grappler => CustomRoles.Crewmate,
CustomRoles.Journalist => CustomRoles.Crewmate,
CustomRoles.Whisperer => CustomRoles.Crewmate,
CustomRoles.Car => CustomRoles.Crewmate,
CustomRoles.President => CustomRoles.Crewmate,
CustomRoles.Oxyman => CustomRoles.Engineer,
CustomRoles.Chef => CustomRoles.Crewmate,
CustomRoles.Decryptor => CustomRoles.Crewmate,
CustomRoles.Adrenaline => CustomRoles.Crewmate,
CustomRoles.Safeguard => CustomRoles.Crewmate,
CustomRoles.Clairvoyant => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Rhapsode => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Telekinetic => CustomRoles.Engineer,
CustomRoles.Autocrat => CustomRoles.Crewmate,
CustomRoles.Inquirer => CustomRoles.Crewmate,
CustomRoles.Soothsayer => CustomRoles.Crewmate,
CustomRoles.LovingCrewmate => CustomRoles.Crewmate,
CustomRoles.LovingImpostor => CustomRoles.Impostor,
CustomRoles.ToiletMaster => CustomRoles.Crewmate,
CustomRoles.Sentry => CustomRoles.Crewmate,
CustomRoles.Perceiver => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Convener => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Mathematician => CustomRoles.Crewmate,
CustomRoles.Nightmare => CustomRoles.Crewmate,
CustomRoles.Battery => CustomRoles.Crewmate,
CustomRoles.CameraMan => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Spy => CustomRoles.Crewmate,
CustomRoles.Ricochet => CustomRoles.Crewmate,
CustomRoles.Tether => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Aid => UsePets && Aid.UsePet.GetBool() ? CustomRoles.Crewmate : CustomRoles.Impostor,
CustomRoles.Socialite => UsePets && Socialite.UsePet.GetBool() ? CustomRoles.Crewmate : CustomRoles.Impostor,
CustomRoles.Escort => UsePets && Escort.UsePet.GetBool() ? CustomRoles.Crewmate : CustomRoles.Impostor,
CustomRoles.DonutDelivery => UsePets && DonutDelivery.UsePet.GetBool() ? CustomRoles.Crewmate : CustomRoles.Impostor,
CustomRoles.Gaulois => UsePets && Gaulois.UsePet.GetBool() ? CustomRoles.Crewmate : CustomRoles.Impostor,
CustomRoles.Analyst => UsePets && Analyst.UsePet.GetBool() ? CustomRoles.Crewmate : CustomRoles.Impostor,
CustomRoles.Escapist => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.NiceGuesser => CustomRoles.Crewmate,
CustomRoles.EvilGuesser => CustomRoles.Impostor,
CustomRoles.Forensic => CustomRoles.Crewmate,
CustomRoles.God => CustomRoles.Crewmate,
CustomRoles.Tank => CustomRoles.Engineer,
CustomRoles.Technician => Technician.CanVent.GetBool() ? CustomRoles.Engineer : CustomRoles.Crewmate,
CustomRoles.GuardianAngelEHR => CustomRoles.GuardianAngel,
CustomRoles.Zombie => CustomRoles.Impostor,
CustomRoles.Vector => CustomRoles.Engineer,
CustomRoles.AntiAdminer => CustomRoles.Shapeshifter,
CustomRoles.Arrogance => CustomRoles.Impostor,
CustomRoles.Bomber => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.Nuker => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.Trapster => Trapster.LegacyTrapster.GetBool() || UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.Scavenger => CustomRoles.Impostor,
CustomRoles.Transporter => CustomRoles.Crewmate,
CustomRoles.Veteran => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Capitalist => CustomRoles.Impostor,
CustomRoles.Bodyguard => CustomRoles.Crewmate,
CustomRoles.Grenadier => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Lighter => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.SecurityGuard => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Magistrate => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Gangster => CustomRoles.Impostor,
CustomRoles.Cleaner => CustomRoles.Impostor,
CustomRoles.FortuneTeller => CustomRoles.Crewmate,
CustomRoles.Oracle => CustomRoles.Crewmate,
CustomRoles.Lightning => CustomRoles.Impostor,
CustomRoles.Greedy => CustomRoles.Impostor,
CustomRoles.Workaholic => CustomRoles.Engineer,
CustomRoles.Amnesiac => Amnesiac.CanVent.GetBool() ? CustomRoles.Engineer : CustomRoles.Crewmate,
CustomRoles.Speedrunner => CustomRoles.Crewmate,
CustomRoles.CursedWolf => CustomRoles.Impostor,
CustomRoles.Collector => CustomRoles.Crewmate,
CustomRoles.NecroGuesser => CustomRoles.Crewmate,
CustomRoles.SchrodingersCat => CustomRoles.Crewmate,
CustomRoles.SoulCatcher => CustomRoles.Shapeshifter,
CustomRoles.QuickShooter => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.EvilEraser => CustomRoles.Impostor,
CustomRoles.Butcher => CustomRoles.Impostor,
CustomRoles.Hangman => CustomRoles.Shapeshifter,
CustomRoles.Sunnyboy => CustomRoles.Scientist,
CustomRoles.Specter => Options.PhantomCanVent.GetBool() ? CustomRoles.Engineer : CustomRoles.Crewmate,
CustomRoles.Judge => CustomRoles.Crewmate,
CustomRoles.Councillor => CustomRoles.Impostor,
CustomRoles.Mortician => CustomRoles.Crewmate,
CustomRoles.Medium => CustomRoles.Crewmate,
CustomRoles.Bard => CustomRoles.Impostor,
CustomRoles.Swooper => CustomRoles.Impostor,
CustomRoles.Crewpostor => CustomRoles.Engineer,
CustomRoles.Hypocrite => CustomRoles.Crewmate,
CustomRoles.Cherokious => CustomRoles.Engineer,
CustomRoles.Pawn => CustomRoles.Crewmate,
CustomRoles.Observer => CustomRoles.Crewmate,
CustomRoles.Pacifist => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Disperser => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.Camouflager => CustomRoles.Shapeshifter,
CustomRoles.Dazzler => CustomRoles.Shapeshifter,
CustomRoles.Devourer => CustomRoles.Shapeshifter,
CustomRoles.Deathpact => CustomRoles.Shapeshifter,
CustomRoles.Coroner => CustomRoles.Crewmate,
CustomRoles.Scout => CustomRoles.Crewmate,
CustomRoles.Merchant => CustomRoles.Crewmate,
CustomRoles.Lookout => CustomRoles.Crewmate,
CustomRoles.Guardian => CustomRoles.Crewmate,
CustomRoles.Enigma => CustomRoles.Crewmate,
CustomRoles.Addict => CustomRoles.Engineer,
CustomRoles.Alchemist => CustomRoles.Engineer, // Needs to vent to use the invisibility potion
CustomRoles.Chameleon => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Lurker => CustomRoles.Impostor,
CustomRoles.Doomsayer => CustomRoles.Crewmate,
CustomRoles.Godfather => CustomRoles.Impostor,
CustomRoles.Unshifter => CustomRoles.Impostor,
CustomRoles.Scanner => CustomRoles.Phantom,
CustomRoles.Fakeshifter => CustomRoles.Shapeshifter,
CustomRoles.Perplexer => CustomRoles.Shapeshifter,
CustomRoles.Silencer => Silencer.SilenceMode.GetValue() switch
{
0 => CustomRoles.Impostor,
1 => CustomRoles.Shapeshifter,
2 => CustomRoles.Phantom,
_ => CustomRoles.Impostor
},
CustomRoles.NoteKiller => CustomRoles.Crewmate,
CustomRoles.RoomRusher => RoomRusher.CanVent ? CustomRoles.Engineer : CustomRoles.Crewmate,
CustomRoles.Clerk => CustomRoles.Crewmate,
CustomRoles.Accumulator => Accumulator.CanVentBeforeKilling.GetBool() ? CustomRoles.Engineer : CustomRoles.Crewmate,
CustomRoles.CovenMember => CustomRoles.Crewmate,
CustomRoles.Augur => Augur.CanVent.GetBool() ? CustomRoles.Engineer : CustomRoles.Crewmate,
CustomRoles.Summoner => Summoner.CanVentBeforeNecronomicon.GetBool() ? CustomRoles.Engineer : CustomRoles.Crewmate,
// Vanilla roles (just in case)
CustomRoles.ImpostorEHR => CustomRoles.Impostor,
CustomRoles.PhantomEHR => CustomRoles.Phantom,
CustomRoles.ShapeshifterEHR => CustomRoles.Shapeshifter,
CustomRoles.CrewmateEHR => CustomRoles.Crewmate,
CustomRoles.EngineerEHR => CustomRoles.Engineer,
CustomRoles.ScientistEHR => CustomRoles.Scientist,
CustomRoles.TrackerEHR => CustomRoles.Tracker,
CustomRoles.NoisemakerEHR => CustomRoles.Noisemaker,
CustomRoles.DetectiveEHR => CustomRoles.Detective,
CustomRoles.ViperEHR => CustomRoles.Viper,
// Hide And Seek
CustomRoles.Hider => CustomRoles.Crewmate,
CustomRoles.Seeker => CustomRoles.Impostor,
CustomRoles.Fox => CustomRoles.Crewmate,
CustomRoles.Troll => CustomRoles.Crewmate,
CustomRoles.Jumper => CustomRoles.Engineer,
CustomRoles.Detector => CustomRoles.Crewmate,
CustomRoles.Jet => CustomRoles.Crewmate,
CustomRoles.Dasher => CustomRoles.Impostor,
CustomRoles.Locator => CustomRoles.Impostor,
CustomRoles.Venter => CustomRoles.Impostor,
CustomRoles.Agent => CustomRoles.Impostor,
CustomRoles.Taskinator => CustomRoles.Crewmate,
// Stop And Go
CustomRoles.Tasker => CustomRoles.Crewmate,
// Hot Potato
CustomRoles.Potato => CustomRoles.Crewmate,
// Speedrun
CustomRoles.Runner => CustomRoles.Crewmate,
// Natural Disasters
CustomRoles.NDPlayer => CustomRoles.Crewmate,
// Room Rush
CustomRoles.RRPlayer => CustomRoles.Crewmate,
// Quiz
CustomRoles.QuizPlayer => CustomRoles.Crewmate,
// The Mind Game
CustomRoles.TMGPlayer => CustomRoles.Crewmate,
// Mingle
CustomRoles.MinglePlayer => CustomRoles.Crewmate,
_ => role.IsImpostor() ? CustomRoles.Impostor : CustomRoles.Crewmate
};
}
public CustomRoles GetErasedRole()
{
if (role.IsVanilla()) return role;
CustomRoles vnRole = role.GetVNRole(true);
if (vnRole.ToString().EndsWith("EHR")) return vnRole;
return vnRole switch
{
CustomRoles.Crewmate => CustomRoles.CrewmateEHR,
CustomRoles.Engineer => CustomRoles.EngineerEHR,
CustomRoles.Noisemaker => CustomRoles.NoisemakerEHR,
CustomRoles.Tracker => CustomRoles.TrackerEHR,
CustomRoles.Scientist => CustomRoles.ScientistEHR,
CustomRoles.Impostor when role.IsCrewmate() => CustomRoles.CrewmateEHR,
CustomRoles.Impostor => CustomRoles.ImpostorEHR,
CustomRoles.Phantom => CustomRoles.PhantomEHR,
CustomRoles.Shapeshifter => CustomRoles.ShapeshifterEHR,
CustomRoles.Detective => CustomRoles.DetectiveEHR,
CustomRoles.Viper => CustomRoles.ViperEHR,
_ => role.IsImpostor() ? CustomRoles.ImpostorEHR : CustomRoles.CrewmateEHR
};
}
public RoleTypes GetDYRole(bool load = false)
{
if (!load && ((Options.UsePhantomBasis.GetBool() && Options.UsePhantomBasisForNKs.GetBool()) || role.AlwaysUsesPhantomBase()) && !role.IsImpostor() && role.SimpleAbilityTrigger()) return RoleTypes.Phantom;
bool UsePets = !load && Options.UsePets.GetBool();
return role switch
{
// Solo PVP
CustomRoles.Challenger => RoleTypes.Impostor,
// FFA
CustomRoles.Killer => RoleTypes.Impostor,
// Capture The Flag
CustomRoles.CTFPlayer => RoleTypes.Phantom,
// King of the Zones
CustomRoles.KOTZPlayer => RoleTypes.Impostor,
// Bed Wars
CustomRoles.BedWarsPlayer => RoleTypes.Phantom,
// Deathrace
CustomRoles.Racer => RoleTypes.Phantom,
// Snowdown
CustomRoles.SnowdownPlayer => RoleTypes.Phantom,
// Standard
CustomRoles.Sheriff => UsePets && Sheriff.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.Crusader => UsePets && Crusader.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.CopyCat => UsePets && CopyCat.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.Renegade => RoleTypes.Impostor,
CustomRoles.Agitator => RoleTypes.Impostor,
CustomRoles.Monarch => UsePets && Monarch.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.Deputy => UsePets && Deputy.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.Bestower => UsePets && Bestower.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.Retributionist => UsePets && Retributionist.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.Unshifter => RoleTypes.Impostor,
CustomRoles.Scanner => RoleTypes.Phantom,
CustomRoles.Arsonist => RoleTypes.Impostor,
CustomRoles.Jackal => RoleTypes.Impostor,
CustomRoles.Medusa => RoleTypes.Impostor,
CustomRoles.Sidekick => RoleTypes.Impostor,
CustomRoles.Vigilante => UsePets && Vigilante.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.Innocent => RoleTypes.Impostor,
CustomRoles.Amnesiac when Amnesiac.RememberMode.GetValue() == 1 => RoleTypes.Impostor,
CustomRoles.Pelican => RoleTypes.Impostor,
CustomRoles.Aid => UsePets && Aid.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.Socialite => UsePets && Socialite.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.Escort => UsePets && Escort.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.DonutDelivery => UsePets && DonutDelivery.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.Gaulois => UsePets && Gaulois.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.Analyst => UsePets && Analyst.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.Witness => UsePets && Options.WitnessUsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.Goose => RoleTypes.Impostor,
CustomRoles.Pursuer => RoleTypes.Impostor,
CustomRoles.Revolutionist => RoleTypes.Impostor,
CustomRoles.Hater => RoleTypes.Impostor,
CustomRoles.Medic => UsePets && Medic.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.Demon => RoleTypes.Impostor,
CustomRoles.HexMaster => (Witch.SwitchTrigger)HexMaster.ModeSwitchAction.GetValue() == Witch.SwitchTrigger.Vanish ? RoleTypes.Phantom : RoleTypes.Impostor,
CustomRoles.Wraith => RoleTypes.Impostor,
CustomRoles.Glitch => RoleTypes.Shapeshifter,
CustomRoles.Jailor => UsePets && Jailor.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.Juggernaut => RoleTypes.Impostor,
CustomRoles.Jackpot => RoleTypes.Shapeshifter,
CustomRoles.Jinx => RoleTypes.Impostor,
CustomRoles.Stalker => RoleTypes.Impostor,
CustomRoles.Provocateur => RoleTypes.Impostor,
CustomRoles.BloodKnight => RoleTypes.Impostor,
CustomRoles.Poisoner => RoleTypes.Impostor,
CustomRoles.Duality => RoleTypes.Impostor,
CustomRoles.Berserker => RoleTypes.Impostor,
CustomRoles.SerialKiller => RoleTypes.Impostor,
CustomRoles.Blockade => RoleTypes.Shapeshifter,
CustomRoles.Quarry => RoleTypes.Shapeshifter,
CustomRoles.SoulCollector => RoleTypes.Impostor,
CustomRoles.Spider => UsePets ? RoleTypes.Impostor : RoleTypes.Shapeshifter,
CustomRoles.Explosivist => UsePets ? RoleTypes.Impostor : RoleTypes.Shapeshifter,
CustomRoles.Sharpshooter => UsePets ? RoleTypes.Impostor : RoleTypes.Shapeshifter,
CustomRoles.Thanos => UsePets ? RoleTypes.Impostor : RoleTypes.Shapeshifter,
CustomRoles.Slenderman => RoleTypes.Impostor,
CustomRoles.Amogus => RoleTypes.Impostor,
CustomRoles.Weatherman => RoleTypes.Impostor,
CustomRoles.Vortex => RoleTypes.Impostor,
CustomRoles.Beehive => RoleTypes.Impostor,
CustomRoles.RouleteGrandeur => RoleTypes.Impostor,
CustomRoles.Nonplus => RoleTypes.Impostor,
CustomRoles.Tremor => RoleTypes.Impostor,
CustomRoles.Evolver => RoleTypes.Impostor,
CustomRoles.Rogue => RoleTypes.Impostor,
CustomRoles.Patroller => RoleTypes.Impostor,
CustomRoles.Simon => RoleTypes.Impostor,
CustomRoles.Chemist => RoleTypes.Impostor,
CustomRoles.Samurai => RoleTypes.Impostor,
CustomRoles.QuizMaster => RoleTypes.Impostor,
CustomRoles.Bargainer => RoleTypes.Impostor,
CustomRoles.Tiger => RoleTypes.Impostor,
CustomRoles.SoulHunter => RoleTypes.Impostor,
CustomRoles.Enderman => RoleTypes.Impostor,
CustomRoles.Mycologist => RoleTypes.Impostor,
CustomRoles.Bubble => RoleTypes.Impostor,
CustomRoles.Hookshot => RoleTypes.Impostor,
CustomRoles.Sprayer => RoleTypes.Impostor,
CustomRoles.Infection => RoleTypes.Impostor,
CustomRoles.Curser => RoleTypes.Impostor,
CustomRoles.Postman => RoleTypes.Impostor,
CustomRoles.Thief => RoleTypes.Impostor,
CustomRoles.Dealer => RoleTypes.Impostor,
CustomRoles.Auditor => RoleTypes.Impostor,
CustomRoles.Seamstress => RoleTypes.Shapeshifter,
CustomRoles.Spirit => RoleTypes.Shapeshifter,
CustomRoles.Starspawn => RoleTypes.Impostor,
CustomRoles.Shifter => RoleTypes.Impostor,
CustomRoles.Impartial => RoleTypes.Impostor,
CustomRoles.Gaslighter => RoleTypes.Impostor,
CustomRoles.Backstabber => RoleTypes.Impostor,
CustomRoles.Predator => RoleTypes.Impostor,
CustomRoles.Reckless => RoleTypes.Impostor,
CustomRoles.Magician => RoleTypes.Impostor,
CustomRoles.WeaponMaster => RoleTypes.Impostor,
CustomRoles.Pyromaniac => RoleTypes.Impostor,
CustomRoles.Eclipse => RoleTypes.Impostor,
CustomRoles.Vengeance => RoleTypes.Impostor,
CustomRoles.HeadHunter => RoleTypes.Impostor,
CustomRoles.Pulse => RoleTypes.Impostor,
CustomRoles.Werewolf => RoleTypes.Impostor,
CustomRoles.Bandit => RoleTypes.Impostor,
CustomRoles.Maverick => RoleTypes.Impostor,
CustomRoles.Parasite => RoleTypes.Shapeshifter,
CustomRoles.Follower => RoleTypes.Impostor,
CustomRoles.Romantic => RoleTypes.Impostor,
CustomRoles.VengefulRomantic => RoleTypes.Impostor,
CustomRoles.RuthlessRomantic => RoleTypes.Impostor,
CustomRoles.Cultist => RoleTypes.Impostor,
CustomRoles.Necromancer => RoleTypes.Impostor,
CustomRoles.Deathknight => RoleTypes.Impostor,
CustomRoles.Virus => RoleTypes.Impostor,
CustomRoles.Investigator => UsePets && Investigator.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.Ritualist => RoleTypes.Impostor,
CustomRoles.Pickpocket => RoleTypes.Impostor,
CustomRoles.Traitor => Traitor.LegacyTraitor.GetBool() ? RoleTypes.Shapeshifter : RoleTypes.Impostor,
CustomRoles.PlagueBearer => RoleTypes.Impostor,
CustomRoles.Pestilence => RoleTypes.Impostor,
CustomRoles.Spiritcaller => RoleTypes.Impostor,
CustomRoles.Doppelganger => RoleTypes.Impostor,
CustomRoles.Investor => RoleTypes.Impostor,
CustomRoles.Wizard => RoleTypes.Phantom,
CustomRoles.Carrier => RoleTypes.Shapeshifter,
CustomRoles.CovenLeader => RoleTypes.Impostor,
CustomRoles.SpellCaster => RoleTypes.Impostor,
CustomRoles.PotionMaster => RoleTypes.Impostor,
CustomRoles.Poache => RoleTypes.Impostor,
CustomRoles.Reaper => RoleTypes.Impostor,
CustomRoles.Death => RoleTypes.Impostor,
CustomRoles.VoodooMaster => RoleTypes.Impostor,
CustomRoles.Goddess => RoleTypes.Phantom,
CustomRoles.Dreamweaver => RoleTypes.Impostor,
CustomRoles.Banshee => RoleTypes.Phantom,
CustomRoles.Illusionist => RoleTypes.Shapeshifter,
CustomRoles.Timelord => RoleTypes.Impostor,
CustomRoles.Enchanter => RoleTypes.Impostor,
CustomRoles.Siren => RoleTypes.Phantom,
CustomRoles.Wyrd => RoleTypes.Shapeshifter,
CustomRoles.MoonDancer => RoleTypes.Phantom,
CustomRoles.Empress => RoleTypes.Phantom,
CustomRoles.Shadow => RoleTypes.Phantom,
_ => RoleTypes.GuardianAngel
};
}
public bool IsAdditionRole()
{
return role > CustomRoles.NotAssigned;
}
public bool IsNonNK(bool check = false)
{
return (!check && role == CustomRoles.Arsonist && CanCheck && Options.IsLoaded && Arsonist.ArsonistKeepsGameGoing != null && !Arsonist.ArsonistKeepsGameGoing.GetBool() && (Arsonist.ArsonistCanIgniteAnytime == null || !Arsonist.ArsonistCanIgniteAnytime.GetBool())) || role.GetNeutralRoleCategory() is RoleOptionType.Neutral_Benign or RoleOptionType.Neutral_Evil or RoleOptionType.Neutral_Pariah;
}
public bool IsNK(bool check = false)
{
return (role == CustomRoles.Arsonist && (check || !CanCheck || !Options.IsLoaded || Arsonist.ArsonistKeepsGameGoing == null || Arsonist.ArsonistKeepsGameGoing.GetBool() || (Arsonist.ArsonistCanIgniteAnytime != null && Arsonist.ArsonistCanIgniteAnytime.GetBool()))) || role is
CustomRoles.Jackal or
CustomRoles.Jackpot or
CustomRoles.Glitch or
CustomRoles.Sidekick or
CustomRoles.HexMaster or
CustomRoles.Doppelganger or
CustomRoles.Cultist or
CustomRoles.Demon or
CustomRoles.Crewpostor or
CustomRoles.Hypocrite or
CustomRoles.Cherokious or
CustomRoles.Necromancer or
CustomRoles.Agitator or
CustomRoles.Wraith or
CustomRoles.Bandit or
CustomRoles.Medusa or
CustomRoles.Pelican or
CustomRoles.Convict or
CustomRoles.Stalker or
CustomRoles.Juggernaut or
CustomRoles.Jinx or
CustomRoles.Poisoner or
CustomRoles.Renegade or
CustomRoles.Gaslighter or
CustomRoles.Simon or
CustomRoles.Patroller or
CustomRoles.Rogue or
CustomRoles.Parasite or
CustomRoles.Berserker or
CustomRoles.SerialKiller or
CustomRoles.Blockade or
CustomRoles.Quarry or
CustomRoles.Accumulator or
CustomRoles.Spider or
CustomRoles.SoulCollector or
CustomRoles.Sharpshooter or
CustomRoles.Explosivist or
CustomRoles.Thanos or
CustomRoles.Duality or
CustomRoles.Slenderman or
CustomRoles.Amogus or
CustomRoles.Weatherman or
CustomRoles.NoteKiller or
CustomRoles.Vortex or
CustomRoles.Beehive or
CustomRoles.RouleteGrandeur or
CustomRoles.Nonplus or
CustomRoles.Tremor or
CustomRoles.Evolver or
CustomRoles.Chemist or
CustomRoles.QuizMaster or
CustomRoles.Samurai or
CustomRoles.Bargainer or
CustomRoles.Tiger or
CustomRoles.Enderman or
CustomRoles.Mycologist or
CustomRoles.Bubble or
CustomRoles.Hookshot or
CustomRoles.Sprayer or
CustomRoles.Magician or
CustomRoles.WeaponMaster or
CustomRoles.Reckless or
CustomRoles.Eclipse or
CustomRoles.Pyromaniac or
CustomRoles.Vengeance or
CustomRoles.HeadHunter or
CustomRoles.Pulse or
CustomRoles.Werewolf or
CustomRoles.Ritualist or
CustomRoles.Pickpocket or
CustomRoles.Infection or
CustomRoles.Traitor or
CustomRoles.Virus or
CustomRoles.BloodKnight or
CustomRoles.Spiritcaller or
CustomRoles.RuthlessRomantic or
CustomRoles.PlagueBearer or
CustomRoles.Pestilence;
}
public bool IsGhostRole()
{
return role == CustomRoles.EvilSpirit || GhostRolesManager.CreateGhostRoleInstance(role, true) != null;
}
public bool IsImpostor()
{
return (role == CustomRoles.DoubleAgent && (!Options.IsLoaded || !Main.IntroDestroyed)) || role is
CustomRoles.Impostor or
CustomRoles.ImpostorEHR or
CustomRoles.Phantom or
CustomRoles.PhantomEHR or
CustomRoles.Shapeshifter or
CustomRoles.ShapeshifterEHR or
CustomRoles.Viper or
CustomRoles.ViperEHR or
CustomRoles.LovingImpostor or
CustomRoles.Chainbinder or
CustomRoles.Godfather or
CustomRoles.Consigliere or
CustomRoles.Wildling or
CustomRoles.Silencer or
CustomRoles.Morphling or
CustomRoles.BountyHunter or
CustomRoles.Vampire or
CustomRoles.Witch or
CustomRoles.Vindicator or
CustomRoles.Zombie or
CustomRoles.Warlock or
CustomRoles.Ninja or
CustomRoles.Undertaker or
CustomRoles.Anonymous or
CustomRoles.Visionary or
CustomRoles.Miner or
CustomRoles.Escapist or
CustomRoles.Mercenary or
CustomRoles.Overheat or
CustomRoles.Abyssbringer or
CustomRoles.Echo or
CustomRoles.Ventriloquist or
CustomRoles.Augmenter or
CustomRoles.Inhibitor or
CustomRoles.Wiper or
CustomRoles.Psychopath or
CustomRoles.Ambusher or
CustomRoles.Kidnapper or
CustomRoles.Exorcist or
CustomRoles.Frightener or
CustomRoles.Obstructer or
CustomRoles.Exclusionary or
CustomRoles.Catalyst or
CustomRoles.Fabricator or
CustomRoles.Centralizer or
CustomRoles.Postponer or
CustomRoles.Venerer or
CustomRoles.ClockBlocker or
CustomRoles.Forger or
CustomRoles.Stasis or
CustomRoles.Occultist or
CustomRoles.Wasp or
CustomRoles.Hypnotist or
CustomRoles.Assumer or
CustomRoles.Generator or
CustomRoles.Blackmailer or
CustomRoles.Commander or
CustomRoles.Freezer or
CustomRoles.Changeling or
CustomRoles.Swapster or
CustomRoles.Loner or
CustomRoles.Kamikaze or
CustomRoles.Librarian or
CustomRoles.Cantankerous or
CustomRoles.Swiftclaw or
CustomRoles.Duellist or
CustomRoles.YinYanger or
CustomRoles.Consort or
CustomRoles.Framer or
CustomRoles.Mafioso or
CustomRoles.Nullifier or
CustomRoles.Chronomancer or
CustomRoles.Stealth or
CustomRoles.Penguin or
CustomRoles.Sapper or
CustomRoles.Hitman or
CustomRoles.RiftMaker or
CustomRoles.Mastermind or
CustomRoles.Gambler or
CustomRoles.Councillor or
CustomRoles.Saboteur or
CustomRoles.Puppeteer or
CustomRoles.TimeThief or
CustomRoles.Trickster or
CustomRoles.Nemesis or
CustomRoles.KillingMachine or
CustomRoles.Fireworker or
CustomRoles.Sniper or
CustomRoles.EvilTracker or
CustomRoles.EvilGuesser or
CustomRoles.AntiAdminer or
CustomRoles.Arrogance or
CustomRoles.Bomber or
CustomRoles.Nuker or
CustomRoles.Scavenger or
CustomRoles.Trapster or
CustomRoles.Capitalist or
CustomRoles.Gangster or
CustomRoles.Cleaner or
CustomRoles.Lightning or
CustomRoles.Greedy or
CustomRoles.CursedWolf or
CustomRoles.SoulCatcher or
CustomRoles.QuickShooter or
CustomRoles.EvilEraser or
CustomRoles.Butcher or
CustomRoles.Hangman or
CustomRoles.Bard or
CustomRoles.Swooper or
CustomRoles.Disperser or
CustomRoles.Dazzler or
CustomRoles.Deathpact or
CustomRoles.Devourer or
CustomRoles.Camouflager or
CustomRoles.Twister or
CustomRoles.Lurker or
CustomRoles.Fakeshifter or
CustomRoles.Perplexer;
}
public bool IsNeutral(bool check = false)
{
return role.IsNK(check) || role.IsNonNK(check);
}
public bool IsAbleToBeSidekicked()
{
return !role.IsRecruitingRole() && role is not
CustomRoles.Deathknight;
}
public bool IsEvilAddon()
{
return role is
CustomRoles.Madmate or
CustomRoles.Egoist or
CustomRoles.Charmed or
CustomRoles.Contagious or
CustomRoles.Rascal or
CustomRoles.Entranced;
}
public bool IsRecruitingRole()
{
return role is
CustomRoles.Jackal or
CustomRoles.Cultist or
CustomRoles.Necromancer or
CustomRoles.Virus or
CustomRoles.Spiritcaller;
}
public bool IsMadmate()
{
return role is
CustomRoles.Hypocrite or
CustomRoles.Crewpostor or
CustomRoles.Convict or
CustomRoles.Renegade or
CustomRoles.Parasite;
}
public bool IsTasklessCrewmate()
{
return !role.UsesPetInsteadOfKill() && role.IsCrewmate() && role.IsDesyncRole();
}
public bool UsesMeetingShapeshift()
{
if (!Options.UseMeetingShapeshift.GetBool()) return false;
Type type = role.GetRoleClass().GetType();
return type.GetMethod("OnMeetingShapeshift")?.DeclaringType == type;
}
public bool PetActivatedAbility()
{
if (Options.CurrentGameMode == CustomGameMode.CaptureTheFlag) return true;
if (!Options.UsePets.GetBool()) return false;
if (role.UsesPetInsteadOfKill()) return true;
if (Options.UsePhantomBasis.GetBool() && (!role.IsNK() || Options.UsePhantomBasisForNKs.GetBool()) && role.SimpleAbilityTrigger()) return false;
Type type = role.GetRoleClass().GetType();
return type.GetMethod("OnPet")?.DeclaringType == type;
}
public bool UsesPetInsteadOfKill()
{
return Options.UsePets.GetBool() && role switch
{
CustomRoles.Gaulois when Gaulois.UsePet.GetBool() => true,
CustomRoles.Aid when Aid.UsePet.GetBool() => true,
CustomRoles.Socialite when Socialite.UsePet.GetBool() => true,
CustomRoles.Escort when Escort.UsePet.GetBool() => true,
CustomRoles.DonutDelivery when DonutDelivery.UsePet.GetBool() => true,
CustomRoles.Analyst when Analyst.UsePet.GetBool() => true,
CustomRoles.Jailor when Jailor.UsePet.GetBool() => true,
CustomRoles.Sheriff when Sheriff.UsePet.GetBool() => true,
CustomRoles.Vigilante when Vigilante.UsePet.GetBool() => true,
CustomRoles.Medic when Medic.UsePet.GetBool() => true,
CustomRoles.Monarch when Monarch.UsePet.GetBool() => true,
CustomRoles.CopyCat when CopyCat.UsePet.GetBool() => true,
CustomRoles.Investigator when Investigator.UsePet.GetBool() => true,
CustomRoles.Deputy when Deputy.UsePet.GetBool() => true,
CustomRoles.Bestower when Bestower.UsePet.GetBool() => true,
CustomRoles.Retributionist when Retributionist.UsePet.GetBool() => true,
CustomRoles.Crusader when Crusader.UsePet.GetBool() => true,
CustomRoles.Witness when Options.WitnessUsePet.GetBool() => true,
_ => false
};
}
public bool CancelsVote()
{
return role switch
{
CustomRoles.FortuneTeller when FortuneTeller.CancelVote.GetBool() => true,
CustomRoles.Soothsayer when Soothsayer.CancelVote.GetBool() => true,
CustomRoles.Oracle when Oracle.CancelVote.GetBool() => true,
CustomRoles.EvilEraser when EvilEraser.CancelVote.GetBool() => true,
CustomRoles.Tether when Tether.CancelVote.GetBool() => true,
CustomRoles.Ricochet when Ricochet.CancelVote.GetBool() => true,
CustomRoles.Cleanser when Cleanser.CancelVote.GetBool() => true,
CustomRoles.NiceEraser when NiceEraser.CancelVote.GetBool() => true,
CustomRoles.Scout when Scout.CancelVote.GetBool() => true,
CustomRoles.Markseeker when Markseeker.CancelVote.GetBool() => true,
CustomRoles.Godfather when Options.GodfatherCancelVote.GetBool() => true,
CustomRoles.Socialite when Socialite.CancelVote.GetBool() => true,
CustomRoles.Negotiator when Negotiator.CancelVote.GetBool() => true,
CustomRoles.Clerk when Clerk.CancelVote.GetBool() => true,
CustomRoles.President => true,
_ => false
};
}
public bool OnlySpawnsWithPets()
{
return !(((Options.UsePhantomBasis.GetBool() && (!role.IsNeutral() || Options.UsePhantomBasisForNKs.GetBool()))) && role.SimpleAbilityTrigger() && role != CustomRoles.Chemist && !role.AlwaysUsesPhantomBase()) && OnlySpawnsWithPetsRoleList.Contains(role);
}
public bool NeedUpdateOnLights()
{
return role is CustomRoles.Wiper;
}
public bool IsBetrayalAddon()
{
return role is
CustomRoles.Charmed or
CustomRoles.Contagious or
CustomRoles.Lovers or
CustomRoles.Madmate or
CustomRoles.Undead or
CustomRoles.Egoist or
CustomRoles.Entranced;
}
public bool IsImpOnlyAddon()
{
return Options.GroupedAddons[AddonTypes.ImpOnly].Contains(role);
}
public bool NeedsUpdateAfterDeath()
{
return role is
CustomRoles.KOTZPlayer or
CustomRoles.CTFPlayer or
CustomRoles.Challenger or
CustomRoles.BedWarsPlayer or
CustomRoles.Weatherman;
}
public bool IsTaskBasedCrewmate()
{
return role is
CustomRoles.Helper or
CustomRoles.Snitch or
CustomRoles.Speedrunner or
CustomRoles.Marshall or
CustomRoles.TimeManager or
CustomRoles.Ignitor or
CustomRoles.Guardian or
CustomRoles.Merchant or
CustomRoles.Mayor or
CustomRoles.Insight or
CustomRoles.Decryptor or
CustomRoles.Transporter;
}
public bool IsNotKnightable()
{
return role is
CustomRoles.Mayor or
CustomRoles.Vindicator or
CustomRoles.Dictator or
CustomRoles.Knighted or
CustomRoles.Glitch or
CustomRoles.Pickpocket or
CustomRoles.Stealer;
}
public bool IsNotAssignableMidGame()
{
return role is
CustomRoles.Egoist or
CustomRoles.Workhorse or
CustomRoles.Cleansed or
CustomRoles.Busy or
CustomRoles.Lovers or
CustomRoles.Stressed or
CustomRoles.Lazy or
CustomRoles.Rascal or
CustomRoles.LastImpostor;
}
public bool ForceCancelShapeshift()
{
return role is
CustomRoles.Glitch or
CustomRoles.Illusionist or
CustomRoles.Swapster or
CustomRoles.Echo or
CustomRoles.Hangman or
CustomRoles.Generator;
}
public bool IsNoAnimationShifter()
{
return role is
CustomRoles.Glitch or
CustomRoles.Generator or
CustomRoles.Echo;
}
public bool AlwaysUsesPhantomBase()
{
return role is
CustomRoles.Empress or
CustomRoles.Wizard;
}
public bool SimpleAbilityTrigger()
{
return role switch
{
CustomRoles.Stealth => !Stealth.UseLegacyVersion.GetBool(),
CustomRoles.Trapster => !Trapster.LegacyTrapster.GetBool(),
_ => role is CustomRoles.Dasher
or CustomRoles.CTFPlayer
or CustomRoles.BedWarsPlayer
or CustomRoles.Racer
or CustomRoles.SnowdownPlayer
or CustomRoles.Wizard
or CustomRoles.AntiAdminer
or CustomRoles.Stasis
or CustomRoles.Chainbinder
or CustomRoles.Occultist
or CustomRoles.Overheat
or CustomRoles.Warlock
or CustomRoles.Swiftclaw
or CustomRoles.Undertaker
or CustomRoles.Abyssbringer
or CustomRoles.Ambusher
or CustomRoles.Bomber
or CustomRoles.Nuker
or CustomRoles.Camouflager
or CustomRoles.Centralizer
or CustomRoles.Disperser
or CustomRoles.Escapist
or CustomRoles.Fireworker
or CustomRoles.Hypnotist
or CustomRoles.Librarian
or CustomRoles.Miner
or CustomRoles.RiftMaker
or CustomRoles.Ninja
or CustomRoles.QuickShooter
or CustomRoles.Sapper
or CustomRoles.Sniper
or CustomRoles.Trapster
or CustomRoles.Twister
or CustomRoles.Swooper
or CustomRoles.Venerer
or CustomRoles.Wraith
or CustomRoles.RouleteGrandeur
or CustomRoles.Enderman
or CustomRoles.Explosivist
or CustomRoles.Spider
or CustomRoles.Hookshot
or CustomRoles.Mycologist
or CustomRoles.Magician
or CustomRoles.Sprayer
or CustomRoles.Werewolf
or CustomRoles.WeaponMaster
or CustomRoles.Thanos
or CustomRoles.Tiger
or CustomRoles.Bargainer
or CustomRoles.Chemist
or CustomRoles.Simon
or CustomRoles.Sharpshooter
or CustomRoles.Patroller
or CustomRoles.Weatherman
or CustomRoles.NoteKiller
or CustomRoles.Amogus
or CustomRoles.Auditor
or CustomRoles.Magistrate
};
}
public RoleOptionType GetNeutralRoleCategory()
{
return role switch
{
CustomRoles.NecroGuesser => RoleOptionType.Neutral_Benign,
CustomRoles.Opportunist => RoleOptionType.Neutral_Benign,
CustomRoles.Lawyer => RoleOptionType.Neutral_Benign,
CustomRoles.Amnesiac => RoleOptionType.Neutral_Benign,
CustomRoles.Pawn => RoleOptionType.Neutral_Benign,
CustomRoles.Postman => RoleOptionType.Neutral_Benign,
CustomRoles.Dealer => RoleOptionType.Neutral_Benign,
CustomRoles.RoomRusher => RoleOptionType.Neutral_Benign,
CustomRoles.SchrodingersCat => RoleOptionType.Neutral_Benign,
CustomRoles.Predator => RoleOptionType.Neutral_Benign,
CustomRoles.Pursuer => RoleOptionType.Neutral_Benign,
CustomRoles.Hater => RoleOptionType.Neutral_Benign,
CustomRoles.Revolutionist => RoleOptionType.Neutral_Benign,
CustomRoles.Impartial => RoleOptionType.Neutral_Benign,
CustomRoles.Investor => RoleOptionType.Neutral_Benign,
CustomRoles.Backstabber => RoleOptionType.Neutral_Benign,
CustomRoles.Shifter => RoleOptionType.Neutral_Benign,
CustomRoles.Sunnyboy => RoleOptionType.Neutral_Benign,
CustomRoles.Maverick => RoleOptionType.Neutral_Benign,
CustomRoles.Romantic => RoleOptionType.Neutral_Benign,
CustomRoles.VengefulRomantic => RoleOptionType.Neutral_Benign,
CustomRoles.Specter => RoleOptionType.Neutral_Benign,
CustomRoles.Provocateur => RoleOptionType.Neutral_Benign,
CustomRoles.SoulHunter => RoleOptionType.Neutral_Benign,
CustomRoles.Technician => RoleOptionType.Neutral_Benign,
CustomRoles.Tank => RoleOptionType.Neutral_Benign,
CustomRoles.Follower => RoleOptionType.Neutral_Benign,
CustomRoles.Arsonist => RoleOptionType.Neutral_Evil,
CustomRoles.Jester => RoleOptionType.Neutral_Evil,
CustomRoles.Gaslighter => RoleOptionType.Neutral_Evil,
CustomRoles.God => RoleOptionType.Neutral_Evil,
CustomRoles.Executioner => RoleOptionType.Neutral_Evil,
CustomRoles.Doomsayer => RoleOptionType.Neutral_Evil,
CustomRoles.Vector => RoleOptionType.Neutral_Evil,
CustomRoles.Terrorist => RoleOptionType.Neutral_Evil,
CustomRoles.Thief => RoleOptionType.Neutral_Evil,
CustomRoles.Collector => RoleOptionType.Neutral_Evil,
CustomRoles.Vulture => RoleOptionType.Neutral_Evil,
CustomRoles.Workaholic => RoleOptionType.Neutral_Evil,
CustomRoles.Deathknight => RoleOptionType.Neutral_Evil,
CustomRoles.Innocent => RoleOptionType.Neutral_Evil,
CustomRoles.Curser => RoleOptionType.Neutral_Pariah,
CustomRoles.Auditor => RoleOptionType.Neutral_Pariah,
CustomRoles.Clerk => RoleOptionType.Neutral_Pariah,
CustomRoles.Magistrate => RoleOptionType.Neutral_Pariah,
CustomRoles.Seamstress => RoleOptionType.Neutral_Pariah,
CustomRoles.Spirit => RoleOptionType.Neutral_Pariah,
CustomRoles.Starspawn => RoleOptionType.Neutral_Pariah,
_ => role.IsNK(true) ? RoleOptionType.Neutral_Killing : role.IsImpostor() ? RoleOptionType.Impostor_Miscellaneous : RoleOptionType.Crewmate_Miscellaneous
};
}
public RoleOptionType GetImpostorRoleCategory()
{
return role switch
{
CustomRoles.Arrogance => RoleOptionType.Impostor_Killing,
CustomRoles.Abyssbringer => RoleOptionType.Impostor_Killing,
CustomRoles.Ninja => RoleOptionType.Impostor_Killing,
CustomRoles.Assumer => RoleOptionType.Impostor_Killing,
CustomRoles.Augmenter => RoleOptionType.Impostor_Killing,
CustomRoles.Bomber => RoleOptionType.Impostor_Killing,
CustomRoles.BountyHunter => RoleOptionType.Impostor_Killing,
CustomRoles.Cantankerous => RoleOptionType.Impostor_Killing,
CustomRoles.Chronomancer => RoleOptionType.Impostor_Killing,
CustomRoles.Councillor => RoleOptionType.Impostor_Killing,
CustomRoles.EvilGuesser => RoleOptionType.Impostor_Killing,
CustomRoles.Fireworker => RoleOptionType.Impostor_Killing,
CustomRoles.Greedy => RoleOptionType.Impostor_Killing,
CustomRoles.Hitman => RoleOptionType.Impostor_Killing,
CustomRoles.Inhibitor => RoleOptionType.Impostor_Killing,
CustomRoles.Kamikaze => RoleOptionType.Impostor_Killing,
CustomRoles.KillingMachine => RoleOptionType.Impostor_Killing,
CustomRoles.Lurker => RoleOptionType.Impostor_Killing,
CustomRoles.Mafioso => RoleOptionType.Impostor_Killing,
CustomRoles.Nemesis => RoleOptionType.Impostor_Killing,
CustomRoles.Mercenary => RoleOptionType.Impostor_Killing,
CustomRoles.Nuker => RoleOptionType.Impostor_Killing,
CustomRoles.Overheat => RoleOptionType.Impostor_Killing,
CustomRoles.Butcher => RoleOptionType.Impostor_Killing,
CustomRoles.QuickShooter => RoleOptionType.Impostor_Killing,
CustomRoles.Psychopath => RoleOptionType.Impostor_Killing,
CustomRoles.Saboteur => RoleOptionType.Impostor_Killing,
CustomRoles.Sapper => RoleOptionType.Impostor_Killing,
CustomRoles.Sniper => RoleOptionType.Impostor_Killing,
CustomRoles.Trapster => RoleOptionType.Impostor_Killing,
CustomRoles.Wasp => RoleOptionType.Impostor_Killing,
CustomRoles.Wiper => RoleOptionType.Impostor_Killing,
CustomRoles.Witch => RoleOptionType.Impostor_Killing,
CustomRoles.Zombie => RoleOptionType.Impostor_Killing,
CustomRoles.Bard => RoleOptionType.Impostor_Support,
CustomRoles.Blackmailer => RoleOptionType.Impostor_Support,
CustomRoles.Camouflager => RoleOptionType.Impostor_Support,
CustomRoles.Capitalist => RoleOptionType.Impostor_Support,
CustomRoles.Catalyst => RoleOptionType.Impostor_Support,
CustomRoles.Centralizer => RoleOptionType.Impostor_Support,
CustomRoles.Chainbinder => RoleOptionType.Impostor_Support,
CustomRoles.Cleaner => RoleOptionType.Impostor_Support,
CustomRoles.ClockBlocker => RoleOptionType.Impostor_Support,
CustomRoles.Commander => RoleOptionType.Impostor_Support,
CustomRoles.Consort => RoleOptionType.Impostor_Support,
CustomRoles.Framer => RoleOptionType.Impostor_Support,
CustomRoles.Deathpact => RoleOptionType.Impostor_Support,
CustomRoles.Devourer => RoleOptionType.Impostor_Support,
CustomRoles.Disperser => RoleOptionType.Impostor_Support,
CustomRoles.Dazzler => RoleOptionType.Impostor_Support,
CustomRoles.EvilEraser => RoleOptionType.Impostor_Support,
CustomRoles.Freezer => RoleOptionType.Impostor_Support,
CustomRoles.Gangster => RoleOptionType.Impostor_Support,
CustomRoles.Godfather => RoleOptionType.Impostor_Support,
CustomRoles.Hypnotist => RoleOptionType.Impostor_Support,
CustomRoles.Librarian => RoleOptionType.Impostor_Support,
CustomRoles.Nullifier => RoleOptionType.Impostor_Support,
CustomRoles.Occultist => RoleOptionType.Impostor_Support,
CustomRoles.Perplexer => RoleOptionType.Impostor_Support,
CustomRoles.Silencer => RoleOptionType.Impostor_Support,
CustomRoles.Swapster => RoleOptionType.Impostor_Support,
CustomRoles.TimeThief => RoleOptionType.Impostor_Support,
CustomRoles.Twister => RoleOptionType.Impostor_Support,
CustomRoles.Ventriloquist => RoleOptionType.Impostor_Support,
CustomRoles.Vindicator => RoleOptionType.Impostor_Support,
CustomRoles.YinYanger => RoleOptionType.Impostor_Support,
CustomRoles.Ambusher => RoleOptionType.Impostor_Concealing,
CustomRoles.Anonymous => RoleOptionType.Impostor_Concealing,
CustomRoles.Duellist => RoleOptionType.Impostor_Concealing,
CustomRoles.Echo => RoleOptionType.Impostor_Concealing,
CustomRoles.Escapist => RoleOptionType.Impostor_Concealing,
CustomRoles.Exclusionary => RoleOptionType.Impostor_Concealing,
CustomRoles.Fabricator => RoleOptionType.Impostor_Concealing,
CustomRoles.Fakeshifter => RoleOptionType.Impostor_Concealing,
CustomRoles.Forger => RoleOptionType.Impostor_Concealing,
CustomRoles.Hangman => RoleOptionType.Impostor_Concealing,
CustomRoles.Kidnapper => RoleOptionType.Impostor_Concealing,
CustomRoles.Lightning => RoleOptionType.Impostor_Concealing,
CustomRoles.Mastermind => RoleOptionType.Impostor_Concealing,
CustomRoles.Miner => RoleOptionType.Impostor_Concealing,
CustomRoles.Morphling => RoleOptionType.Impostor_Concealing,
CustomRoles.Penguin => RoleOptionType.Impostor_Concealing,
CustomRoles.Postponer => RoleOptionType.Impostor_Concealing,
CustomRoles.Puppeteer => RoleOptionType.Impostor_Concealing,
CustomRoles.RiftMaker => RoleOptionType.Impostor_Concealing,
CustomRoles.Scavenger => RoleOptionType.Impostor_Concealing,
CustomRoles.SoulCatcher => RoleOptionType.Impostor_Concealing,
CustomRoles.Stasis => RoleOptionType.Impostor_Concealing,
CustomRoles.Swiftclaw => RoleOptionType.Impostor_Concealing,
CustomRoles.Swooper => RoleOptionType.Impostor_Concealing,
CustomRoles.Stealth => RoleOptionType.Impostor_Concealing,
CustomRoles.Trickster => RoleOptionType.Impostor_Concealing,
CustomRoles.Undertaker => RoleOptionType.Impostor_Concealing,
CustomRoles.Vampire => RoleOptionType.Impostor_Concealing,
CustomRoles.Venerer => RoleOptionType.Impostor_Concealing,
CustomRoles.Warlock => RoleOptionType.Impostor_Concealing,
CustomRoles.AntiAdminer => RoleOptionType.Impostor_Miscellaneous,
CustomRoles.Changeling => RoleOptionType.Impostor_Miscellaneous,
CustomRoles.Consigliere => RoleOptionType.Impostor_Miscellaneous,
CustomRoles.CursedWolf => RoleOptionType.Impostor_Miscellaneous,
CustomRoles.EvilTracker => RoleOptionType.Impostor_Miscellaneous,
CustomRoles.Exorcist => RoleOptionType.Impostor_Miscellaneous,
CustomRoles.Frightener => RoleOptionType.Impostor_Miscellaneous,
CustomRoles.Gambler => RoleOptionType.Impostor_Miscellaneous,
CustomRoles.Generator => RoleOptionType.Impostor_Miscellaneous,
CustomRoles.Loner => RoleOptionType.Impostor_Miscellaneous,
CustomRoles.Obstructer => RoleOptionType.Impostor_Miscellaneous,
CustomRoles.Visionary => RoleOptionType.Impostor_Miscellaneous,
CustomRoles.Wildling => RoleOptionType.Impostor_Miscellaneous,
CustomRoles.Impostor => RoleOptionType.Impostor_Miscellaneous,
CustomRoles.ImpostorEHR => RoleOptionType.Impostor_Miscellaneous,
CustomRoles.Shapeshifter => RoleOptionType.Impostor_Miscellaneous,
CustomRoles.ShapeshifterEHR => RoleOptionType.Impostor_Miscellaneous,
CustomRoles.Phantom => RoleOptionType.Impostor_Miscellaneous,
CustomRoles.PhantomEHR => RoleOptionType.Impostor_Miscellaneous,
CustomRoles.Viper => RoleOptionType.Impostor_Miscellaneous,
CustomRoles.ViperEHR => RoleOptionType.Impostor_Miscellaneous,
CustomRoles.Parasite => RoleOptionType.Impostor_Madmate,
CustomRoles.Hypocrite => RoleOptionType.Impostor_Madmate,
CustomRoles.Crewpostor => RoleOptionType.Impostor_Madmate,
CustomRoles.Renegade => RoleOptionType.Impostor_Madmate,
_ => role.IsCrewmate() ? RoleOptionType.Crewmate_Miscellaneous : RoleOptionType.Neutral_Benign
};
}
public RoleOptionType GetCrewmateRoleCategory()
{
return role switch
{
CustomRoles.Crewmate => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.CrewmateEHR => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Engineer => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.EngineerEHR => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Scientist => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.ScientistEHR => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Tracker => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.TrackerEHR => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Noisemaker => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.NoisemakerEHR => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Detective => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.DetectiveEHR => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Addict => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.CameraMan => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Carrier => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Demolitionist => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Express => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.LazyGuy => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Journalist => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Luckey => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Mole => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Nightmare => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Paranoid => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.PortalMaker => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Ricochet => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Safeguard => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.SuperStar => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Tar => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Tether => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Transmitter => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Tracefinder => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Tunneler => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Vacuum => RoleOptionType.Crewmate_Miscellaneous,
CustomRoles.Analyst => RoleOptionType.Crewmate_Investigate,
CustomRoles.Captain => RoleOptionType.Crewmate_Investigate,
CustomRoles.Catcher => RoleOptionType.Crewmate_Investigate,
CustomRoles.Chameleon => RoleOptionType.Crewmate_Investigate,
CustomRoles.Clairvoyant => RoleOptionType.Crewmate_Investigate,
CustomRoles.Coroner => RoleOptionType.Crewmate_Investigate,
CustomRoles.Forensic => RoleOptionType.Crewmate_Investigate,
CustomRoles.Doctor => RoleOptionType.Crewmate_Investigate,
CustomRoles.DoubleAgent => RoleOptionType.Crewmate_Investigate,
CustomRoles.Druid => RoleOptionType.Crewmate_Investigate,
CustomRoles.Enigma => RoleOptionType.Crewmate_Investigate,
CustomRoles.Investigator => RoleOptionType.Crewmate_Investigate,
CustomRoles.FortuneTeller => RoleOptionType.Crewmate_Investigate,
CustomRoles.MeetingManager => RoleOptionType.Crewmate_Investigate,
CustomRoles.Ignitor => RoleOptionType.Crewmate_Investigate,
CustomRoles.Imitator => RoleOptionType.Crewmate_Investigate,
CustomRoles.Inquirer => RoleOptionType.Crewmate_Investigate,
CustomRoles.Inquisitor => RoleOptionType.Crewmate_Investigate,
CustomRoles.Insight => RoleOptionType.Crewmate_Investigate,
CustomRoles.Inspector => RoleOptionType.Crewmate_Investigate,
CustomRoles.Leery => RoleOptionType.Crewmate_Investigate,
CustomRoles.Lighter => RoleOptionType.Crewmate_Investigate,
CustomRoles.Lookout => RoleOptionType.Crewmate_Investigate,
CustomRoles.Markseeker => RoleOptionType.Crewmate_Investigate,
CustomRoles.Medium => RoleOptionType.Crewmate_Investigate,
CustomRoles.Telecommunication => RoleOptionType.Crewmate_Investigate,
CustomRoles.Mortician => RoleOptionType.Crewmate_Investigate,
CustomRoles.Hacker => RoleOptionType.Crewmate_Investigate,
CustomRoles.Observer => RoleOptionType.Crewmate_Investigate,
CustomRoles.Oracle => RoleOptionType.Crewmate_Investigate,
CustomRoles.Perceiver => RoleOptionType.Crewmate_Investigate,
CustomRoles.Psychic => RoleOptionType.Crewmate_Investigate,
CustomRoles.Rabbit => RoleOptionType.Crewmate_Investigate,
CustomRoles.Scout => RoleOptionType.Crewmate_Investigate,
CustomRoles.Sensor => RoleOptionType.Crewmate_Investigate,
CustomRoles.Sentry => RoleOptionType.Crewmate_Investigate,
CustomRoles.Shiftguard => RoleOptionType.Crewmate_Investigate,
CustomRoles.Snitch => RoleOptionType.Crewmate_Investigate,
CustomRoles.Socialite => RoleOptionType.Crewmate_Investigate,
CustomRoles.Soothsayer => RoleOptionType.Crewmate_Investigate,
CustomRoles.Spiritualist => RoleOptionType.Crewmate_Investigate,
CustomRoles.Spy => RoleOptionType.Crewmate_Investigate,
CustomRoles.TaskManager => RoleOptionType.Crewmate_Investigate,
CustomRoles.Whisperer => RoleOptionType.Crewmate_Investigate,
CustomRoles.Witness => RoleOptionType.Crewmate_Investigate,
CustomRoles.Aid => RoleOptionType.Crewmate_Support,
CustomRoles.Altruist => RoleOptionType.Crewmate_Support,
CustomRoles.Autocrat => RoleOptionType.Crewmate_Support,
CustomRoles.Bane => RoleOptionType.Crewmate_Support,
CustomRoles.Battery => RoleOptionType.Crewmate_Support,
CustomRoles.Beacon => RoleOptionType.Crewmate_Support,
CustomRoles.Benefactor => RoleOptionType.Crewmate_Support,
CustomRoles.Bestower => RoleOptionType.Crewmate_Support,
CustomRoles.Bodyguard => RoleOptionType.Crewmate_Support,
CustomRoles.Chef => RoleOptionType.Crewmate_Support,
CustomRoles.Cleanser => RoleOptionType.Crewmate_Support,
CustomRoles.Convener => RoleOptionType.Crewmate_Support,
CustomRoles.Crusader => RoleOptionType.Crewmate_Support,
CustomRoles.Deputy => RoleOptionType.Crewmate_Support,
CustomRoles.DonutDelivery => RoleOptionType.Crewmate_Support,
CustomRoles.Doorjammer => RoleOptionType.Crewmate_Support,
CustomRoles.Pacifist => RoleOptionType.Crewmate_Support,
CustomRoles.Electric => RoleOptionType.Crewmate_Support,
CustomRoles.Escort => RoleOptionType.Crewmate_Support,
CustomRoles.Farmer => RoleOptionType.Crewmate_Support,
CustomRoles.Gardener => RoleOptionType.Crewmate_Support,
CustomRoles.Gaulois => RoleOptionType.Crewmate_Support,
CustomRoles.Grappler => RoleOptionType.Crewmate_Support,
CustomRoles.Grenadier => RoleOptionType.Crewmate_Support,
CustomRoles.Helper => RoleOptionType.Crewmate_Support,
CustomRoles.Jailor => RoleOptionType.Crewmate_Support,
CustomRoles.Mathematician => RoleOptionType.Crewmate_Support,
CustomRoles.Mechanic => RoleOptionType.Crewmate_Support,
CustomRoles.Medic => RoleOptionType.Crewmate_Support,
CustomRoles.Merchant => RoleOptionType.Crewmate_Support,
CustomRoles.Monarch => RoleOptionType.Crewmate_Support,
CustomRoles.Negotiator => RoleOptionType.Crewmate_Support,
CustomRoles.Operative => RoleOptionType.Crewmate_Support,
CustomRoles.Rhapsode => RoleOptionType.Crewmate_Support,
CustomRoles.Scanner => RoleOptionType.Crewmate_Support,
CustomRoles.SecurityGuard => RoleOptionType.Crewmate_Support,
CustomRoles.SpeedBooster => RoleOptionType.Crewmate_Support,
CustomRoles.TimeManager => RoleOptionType.Crewmate_Support,
CustomRoles.TimeMaster => RoleOptionType.Crewmate_Support,
CustomRoles.Transporter => RoleOptionType.Crewmate_Support,
CustomRoles.Unshifter => RoleOptionType.Crewmate_Support,
CustomRoles.Ventguard => RoleOptionType.Crewmate_Support,
CustomRoles.Wizard => RoleOptionType.Crewmate_Support,
CustomRoles.Drainer => RoleOptionType.Crewmate_Killing,
CustomRoles.Judge => RoleOptionType.Crewmate_Killing,
CustomRoles.NiceGuesser => RoleOptionType.Crewmate_Killing,
CustomRoles.Retributionist => RoleOptionType.Crewmate_Killing,
CustomRoles.Sentinel => RoleOptionType.Crewmate_Killing,
CustomRoles.Sheriff => RoleOptionType.Crewmate_Killing,
CustomRoles.Veteran => RoleOptionType.Crewmate_Killing,
CustomRoles.Vigilante => RoleOptionType.Crewmate_Killing,
CustomRoles.Adrenaline => RoleOptionType.Crewmate_Power,
CustomRoles.Adventurer => RoleOptionType.Crewmate_Power,
CustomRoles.Alchemist => RoleOptionType.Crewmate_Power,
CustomRoles.Astral => RoleOptionType.Crewmate_Power,
CustomRoles.CopyCat => RoleOptionType.Crewmate_Power,
CustomRoles.Detour => RoleOptionType.Crewmate_Power,
CustomRoles.Dictator => RoleOptionType.Crewmate_Power,
CustomRoles.Guardian => RoleOptionType.Crewmate_Power,
CustomRoles.Decryptor => RoleOptionType.Crewmate_Power,
CustomRoles.Marshall => RoleOptionType.Crewmate_Power,
CustomRoles.Mayor => RoleOptionType.Crewmate_Power,
CustomRoles.NiceEraser => RoleOptionType.Crewmate_Power,
CustomRoles.Swapper => RoleOptionType.Crewmate_Power,
CustomRoles.Oxyman => RoleOptionType.Crewmate_Power,
CustomRoles.President => RoleOptionType.Crewmate_Power,
CustomRoles.Speedrunner => RoleOptionType.Crewmate_Power,
CustomRoles.Telekinetic => RoleOptionType.Crewmate_Power,
CustomRoles.Ankylosaurus => RoleOptionType.Crewmate_Chaos,
CustomRoles.Car => RoleOptionType.Crewmate_Chaos,
CustomRoles.Dad => RoleOptionType.Crewmate_Chaos,
CustomRoles.Goose => RoleOptionType.Crewmate_Chaos,
CustomRoles.Randomizer => RoleOptionType.Crewmate_Chaos,
CustomRoles.ToiletMaster => RoleOptionType.Crewmate_Chaos,
CustomRoles.Tornado => RoleOptionType.Crewmate_Chaos,
CustomRoles.Tree => RoleOptionType.Crewmate_Chaos,
_ => role.IsImpostor() ? RoleOptionType.Impostor_Miscellaneous : RoleOptionType.Neutral_Benign
};
}
public RoleOptionType GetRoleOptionType()
{
if (role.IsCoven()) return RoleOptionType.Coven_Miscellaneous;
if (role.IsImpostor() || role.IsMadmate()) return role.GetImpostorRoleCategory();
if (role.IsCrewmate()) return role.GetCrewmateRoleCategory();
if (role.IsNeutral(true)) return role.GetNeutralRoleCategory();
return RoleOptionType.Crewmate_Miscellaneous;
}
public Team GetTeam()
{
if (role.IsCoven()) return Team.Coven;
if (role.IsImpostorTeamV2()) return Team.Impostor;
if (role.IsNeutralTeamV2()) return Team.Neutral;
return role.IsCrewmateTeamV2() ? Team.Crewmate : Team.None;
}
public bool Is(Team team)
{
return team switch
{
Team.Coven => role.IsCoven(),
Team.Impostor => role.IsImpostorTeamV2(),
Team.Neutral => role.IsNeutralTeamV2(),
Team.Crewmate => role.IsCrewmateTeamV2(),
Team.None => role.GetCountTypes() is CountTypes.OutOfGame or CountTypes.None || role == CustomRoles.GM,
_ => false
};
}
public bool IsCoven()
{
return role is
CustomRoles.CovenMember or
CustomRoles.CovenLeader or
CustomRoles.SpellCaster or
CustomRoles.PotionMaster or
CustomRoles.Poache or
CustomRoles.Reaper or
CustomRoles.Death or
CustomRoles.VoodooMaster or
CustomRoles.Goddess or
CustomRoles.Augur or
CustomRoles.Dreamweaver or
CustomRoles.Banshee or
CustomRoles.Illusionist or
CustomRoles.Timelord or
CustomRoles.Enchanter or
CustomRoles.Siren or
CustomRoles.Wyrd or
CustomRoles.Empress or
CustomRoles.Summoner or
CustomRoles.Shadow or
CustomRoles.MoonDancer;
}
public bool IncompatibleWithVenom()
{
return role switch
{
CustomRoles.Bomber when !Bomber.BomberCanKill.GetBool() => true,
CustomRoles.Changeling when !Changeling.CanKillBeforeRoleChange.GetBool() => true,
CustomRoles.EvilEraser when EvilEraser.EraseMethod.GetValue() == 0 => true,
CustomRoles.Puppeteer when !Puppeteer.PuppeteerCanKillNormally.GetBool() => true,
CustomRoles.Silencer when Silencer.SilenceMode.GetValue() == 0 => true,
CustomRoles.Sniper when !Sniper.CanKillWithBullets.GetBool() => true,
CustomRoles.Vampire when !Vampire.OptionCanKillNormally.GetBool() => true,
CustomRoles.Augmenter or
CustomRoles.Lightning or
CustomRoles.Echo or
CustomRoles.Fireworker or
CustomRoles.Ninja or
CustomRoles.Butcher or
CustomRoles.Postponer or
CustomRoles.Sapper or
CustomRoles.Scavenger or
CustomRoles.Swift or
CustomRoles.Swooper or
CustomRoles.Undertaker or
CustomRoles.Warlock or
CustomRoles.Wasp or
CustomRoles.Wiper => true,
_ => false
};
}
public RoleTypes GetRoleTypes()
{
if (Enum.TryParse(role.GetVNRole(true).ToString().Replace("EHR", ""), true, out RoleTypes type)) return type;
return role.IsImpostor() ? RoleTypes.Impostor : RoleTypes.Crewmate;
}
public bool IsDesyncRole()
{
return role.GetDYRole() != RoleTypes.GuardianAngel;
}
public bool IsImpostorTeam()
{
return role.IsImpostor() || role == CustomRoles.Madmate;
}
public bool IsCrewmate()
{
return !role.IsImpostor() && !role.IsNeutral() && !role.IsMadmate() && !role.IsCoven();
}
public bool IsImpostorTeamV2()
{
return (role.IsImpostorTeam() && role != CustomRoles.Trickster && !role.IsConverted()) || role is CustomRoles.Rascal or CustomRoles.Madmate || role.IsMadmate();
}
public bool IsNeutralTeamV2()
{
return role.IsConverted() || (role.IsNeutral() && role != CustomRoles.Madmate);
}
public bool IsCrewmateTeamV2()
{
return (!role.IsImpostorTeamV2() && !role.IsNeutralTeamV2() && !role.Is(Team.Coven)) || (role == CustomRoles.Trickster && !role.IsConverted());
}
public bool IsConverted()
{
return (role == CustomRoles.Egoist && Inspector.InspectorCheckEgoistInt() == 1) || role is
CustomRoles.Charmed or
CustomRoles.Contagious or
CustomRoles.Undead or
CustomRoles.Entranced;
}
public bool IsRevealingRole(PlayerControl target)
{
return (role is CustomRoles.Mayor && Mayor.MayorRevealWhenDoneTasks.GetBool() && target.AllTasksCompleted()) ||
(role is CustomRoles.SuperStar && Options.EveryOneKnowSuperStar.GetBool()) ||
(role is CustomRoles.Marshall && target.AllTasksCompleted()) ||
(role is CustomRoles.Workaholic && Workaholic.WorkaholicVisibleToEveryone.GetBool()) ||
(role is CustomRoles.Doctor && Options.DoctorVisibleToEveryone.GetBool()) ||
(role is CustomRoles.Bait && Options.BaitNotification.GetBool() && Inspector.InspectorCheckBaitCountType.GetBool());
}
public bool IsVanilla()
{
return role is
CustomRoles.Crewmate or
CustomRoles.Engineer or
CustomRoles.Noisemaker or
CustomRoles.Tracker or
CustomRoles.Scientist or
CustomRoles.GuardianAngel or
CustomRoles.Impostor or
CustomRoles.Detective or
CustomRoles.Viper or
CustomRoles.Phantom or
CustomRoles.Shapeshifter;
}
public CustomRoleTypes GetCustomRoleTypes()
{
var type = CustomRoleTypes.Crewmate;
if (role.IsImpostor() || role.IsMadmate()) type = CustomRoleTypes.Impostor;
if (role.IsNeutral()) type = CustomRoleTypes.Neutral;
if (role.IsCoven()) type = CustomRoleTypes.Coven;
if (role.IsAdditionRole()) type = CustomRoleTypes.Addon;
return type;
}
public bool RoleExist(bool countDead = false)
{
return Main.EnumeratePlayerControls().Any(x => x.Is(role) && (countDead || x.IsAlive()));
}
public int GetCount()
{
return role.IsVanilla() ? 0 : Options.GetRoleCount(role);
}
public int GetMode()
{
return Options.GetRoleSpawnMode(role);
}
public bool IsEnable()
{
return role switch
{
CustomRoles.Nuker => Bomber.NukerChance.GetInt() > 0,
CustomRoles.Bard => Arrogance.BardChance.GetInt() > 0,
CustomRoles.Sunnyboy => Jester.SunnyboyChance.GetInt() > 0,
_ => role.GetCount() > 0
};
}
public bool IsDevFavoriteRole()
{
return role is CustomRoles.Adventurer or CustomRoles.Chef or CustomRoles.Detour or CustomRoles.Hacker or CustomRoles.Swapper or CustomRoles.Sentinel or CustomRoles.Sentry or CustomRoles.Tornado or CustomRoles.Tunneler or CustomRoles.Whisperer or CustomRoles.Wizard or
CustomRoles.Abyssbringer or CustomRoles.Assumer or CustomRoles.Chronomancer or CustomRoles.Echo or CustomRoles.Escapist or CustomRoles.Hypnotist or CustomRoles.Librarian or CustomRoles.Mafioso or CustomRoles.Mastermind or CustomRoles.Mercenary or CustomRoles.Penguin or CustomRoles.RiftMaker or CustomRoles.Sapper or CustomRoles.Wiper or
CustomRoles.Bargainer or CustomRoles.Bubble or CustomRoles.Doomsayer or CustomRoles.Enderman or CustomRoles.Evolver or CustomRoles.HeadHunter or CustomRoles.Impartial or CustomRoles.Patroller or CustomRoles.Pawn or CustomRoles.Infection or CustomRoles.Postman or CustomRoles.Pyromaniac or CustomRoles.Revolutionist or CustomRoles.Rogue or CustomRoles.Romantic or CustomRoles.RoomRusher or CustomRoles.RouleteGrandeur or CustomRoles.Simon or CustomRoles.SoulHunter or CustomRoles.Sprayer or CustomRoles.Technician or CustomRoles.Tank or CustomRoles.Tiger or CustomRoles.Tremor or CustomRoles.Vengeance or CustomRoles.Vortex or CustomRoles.Werewolf or CustomRoles.WeaponMaster or
CustomRoles.Reaper or CustomRoles.VoodooMaster or CustomRoles.Dreamweaver or CustomRoles.Banshee or
CustomRoles.Allergic or CustomRoles.Bloodlust or CustomRoles.Damocles or CustomRoles.Deadlined or CustomRoles.DeadlyQuota or CustomRoles.Dynamo or CustomRoles.DoubleShot or CustomRoles.Energetic or CustomRoles.Haste or CustomRoles.Introvert or CustomRoles.Messenger or CustomRoles.Nimble or CustomRoles.Reach or CustomRoles.Seer or CustomRoles.Stressed;
}
public CountTypes GetCountTypes()
{
return role switch
{
CustomRoles.GM => CountTypes.OutOfGame,
CustomRoles.Sidekick when Jackal.SidekickCountMode.GetValue() == 0 => CountTypes.Jackal,
CustomRoles.Sidekick when Jackal.SidekickCountMode.GetValue() == 1 => CountTypes.OutOfGame,
CustomRoles.Deathknight => CountTypes.Necromancer,
CustomRoles.Parasite => CountTypes.Impostor,
CustomRoles.Hypocrite => CountTypes.Impostor,
CustomRoles.Crewpostor => CountTypes.Impostor,
CustomRoles.Renegade => CountTypes.Impostor,
CustomRoles.Gaslighter => Gaslighter.WinCondition.GetValue() == 2 ? CountTypes.Gaslighter : CountTypes.Crew,
CustomRoles.Stalker when Stalker.SnatchesWin.GetBool() => CountTypes.Crew,
CustomRoles.SchrodingersCat => SchrodingersCat.WinsWithCrewIfNotAttacked.GetBool() ? CountTypes.Crew : CountTypes.OutOfGame,
CustomRoles.Stalker => !Stalker.SnatchesWin.GetBool() ? CountTypes.Stalker : CountTypes.Crew,
CustomRoles.Arsonist => Arsonist.ArsonistKeepsGameGoing.GetBool() ? CountTypes.Arsonist : CountTypes.Crew,
CustomRoles.Shifter => CountTypes.OutOfGame,
CustomRoles.NoteKiller when !NoteKiller.CountsAsNeutralKiller => CountTypes.Crew,
CustomRoles.DoubleAgent => CountTypes.Crew,
_ => Enum.TryParse(role.ToString(), true, out CountTypes type)
? type
: role.Is(Team.Impostor) || role == CustomRoles.Trickster
? CountTypes.Impostor
: role.IsCoven()
? CountTypes.Coven
: CountTypes.Crew
};
}
}
extension(Team team)
{
public Color GetColor()
{
return ColorUtility.TryParseHtmlString(team switch
{
Team.Coven => Main.CovenColor,
Team.Crewmate => Main.CrewmateColor,
Team.Neutral => Main.NeutralColor,
Team.Impostor => Main.ImpostorColor,
_ => string.Empty
}, out Color color)
? color
: Color.clear;
}
public string GetTextColor()
{
return team switch
{
Team.Coven => Main.CovenColor,
Team.Crewmate => Main.CrewmateColor,
Team.Neutral => Main.NeutralColor,
Team.Impostor => Main.ImpostorColor,
_ => string.Empty
};
}
}
public static string ToColoredString(this CustomRoles role)
{
return Utils.ColorString(Utils.GetRoleColor(role), Translator.GetString($"{role}"));
}
extension(RoleOptionType type)
{
public Color GetRoleOptionTypeColor()
{
return type switch
{
RoleOptionType.Impostor_Killing => Utils.GetRoleColor(CustomRoles.Witness),
RoleOptionType.Impostor_Support => Utils.GetRoleColor(CustomRoles.Bubble),
RoleOptionType.Impostor_Concealing => Utils.GetRoleColor(CustomRoles.CopyCat),
RoleOptionType.Impostor_Miscellaneous => Palette.ImpostorRed,
RoleOptionType.Impostor_Madmate => Palette.ImpostorRed,
RoleOptionType.Crewmate_Miscellaneous => Palette.CrewmateBlue,
RoleOptionType.Crewmate_Investigate => Utils.GetRoleColor(CustomRoles.Forensic),
RoleOptionType.Crewmate_Support => Utils.GetRoleColor(CustomRoles.NiceEraser),
RoleOptionType.Crewmate_Killing => Utils.GetRoleColor(CustomRoles.Sheriff),
RoleOptionType.Crewmate_Power => Utils.GetRoleColor(CustomRoles.Electric),
RoleOptionType.Crewmate_Chaos => Utils.GetRoleColor(CustomRoles.Tornado),
RoleOptionType.Neutral_Benign => Utils.GetRoleColor(CustomRoles.Chameleon),
RoleOptionType.Neutral_Evil => Utils.GetRoleColor(CustomRoles.Vector),
RoleOptionType.Neutral_Pariah => ColorUtility.TryParseHtmlString("#a10e49", out var c) ? c : Color.magenta,
RoleOptionType.Neutral_Killing => Palette.ImpostorRed,
RoleOptionType.Coven_Miscellaneous => Utils.GetRoleColor(CustomRoles.CovenLeader),
_ => Utils.GetRoleColor(CustomRoles.Vigilante)
};
}
public TabGroup GetTabFromOptionType()
{
return type switch
{
RoleOptionType.Impostor_Killing => TabGroup.ImpostorRoles,
RoleOptionType.Impostor_Support => TabGroup.ImpostorRoles,
RoleOptionType.Impostor_Concealing => TabGroup.ImpostorRoles,
RoleOptionType.Impostor_Miscellaneous => TabGroup.ImpostorRoles,
RoleOptionType.Impostor_Madmate => TabGroup.ImpostorRoles,
RoleOptionType.Crewmate_Miscellaneous => TabGroup.CrewmateRoles,
RoleOptionType.Crewmate_Investigate => TabGroup.CrewmateRoles,
RoleOptionType.Crewmate_Support => TabGroup.CrewmateRoles,
RoleOptionType.Crewmate_Killing => TabGroup.CrewmateRoles,
RoleOptionType.Crewmate_Power => TabGroup.CrewmateRoles,
RoleOptionType.Crewmate_Chaos => TabGroup.CrewmateRoles,
RoleOptionType.Neutral_Benign => TabGroup.NeutralRoles,
RoleOptionType.Neutral_Evil => TabGroup.NeutralRoles,
RoleOptionType.Neutral_Pariah => TabGroup.NeutralRoles,
RoleOptionType.Neutral_Killing => TabGroup.NeutralRoles,
RoleOptionType.Coven_Miscellaneous => TabGroup.CovenRoles,
_ => TabGroup.OtherRoles
};
}
}
public static Color GetAddonTypeColor(this AddonTypes type)
{
return type switch
{
AddonTypes.ImpOnly => Palette.ImpostorRed,
AddonTypes.Helpful => Palette.CrewmateBlue,
AddonTypes.Harmful => Utils.GetRoleColor(CustomRoles.Sprayer),
AddonTypes.Mixed => Utils.GetRoleColor(CustomRoles.TaskManager),
_ => Palette.CrewmateBlue
};
}
public static bool CheckAddonConflict(CustomRoles role, PlayerControl pc)
{
return role.IsAdditionRole() && !(role.IsGhostRole() && pc.IsAlive()) && (!Main.NeverSpawnTogetherCombos.TryGetValue(OptionItem.CurrentPreset, out Dictionary<CustomRoles, List<CustomRoles>> neverList) || !neverList.TryGetValue(pc.GetCustomRole(), out List<CustomRoles> bannedAddonList) || !bannedAddonList.Contains(role)) && pc.GetCustomRole() is not CustomRoles.GuardianAngelEHR and not CustomRoles.God && !pc.Is(CustomRoles.Madmate) && !pc.Is(CustomRoles.GM) && role is not CustomRoles.Lovers && !pc.Is(CustomRoles.LazyGuy) && ((Main.IntroDestroyed && Options.AddonAssigningRolesIgnoreMaxAddonsLimit.GetBool()) || !pc.HasSubRole() || pc.GetCustomSubRoles().Count < Options.NoLimitAddonsNumMax.GetInt()) && (!Options.AddonCanBeSettings.TryGetValue(role, out (OptionItem Imp, OptionItem Neutral, OptionItem Crew, OptionItem Coven) o) || ((o.Imp.GetBool() || !pc.GetCustomRole().IsImpostor()) && (o.Neutral.GetBool() || !pc.GetCustomRole().IsNeutral()) && (o.Crew.GetBool() || !pc.IsCrewmate()) && (o.Coven.GetBool() || !pc.Is(Team.Coven)))) && (!role.IsImpOnlyAddon() || (pc.IsImpostor() && !pc.Is(CustomRoles.DoubleAgent)) || (pc.Is(CustomRoles.Traitor) && Traitor.CanGetImpostorOnlyAddons.GetBool())) && role switch
{
CustomRoles.Blind when pc.Is(CustomRoles.Sensor) => false,
CustomRoles.Composter when float.IsNaN(pc.GetAbilityUseLimit()) => false,
CustomRoles.TaskMaster when !pc.IsCrewmate() || !Utils.HasTasks(pc.Data, forRecompute: false) => false,
CustomRoles.Commited when pc.GetRoleTypes() is not (RoleTypes.Impostor or RoleTypes.Phantom or RoleTypes.Shapeshifter or RoleTypes.Viper) => false,
CustomRoles.Underdog when pc.Is(CustomRoles.Mare) => false,
CustomRoles.Shy when Options.DisableWhisperCommand.GetBool() => false,
CustomRoles.Listener when Options.DisableWhisperCommand.GetBool() => false,
CustomRoles.Blocked when !pc.CanUseVent() => false,
CustomRoles.Aide when pc.IsMadmate() || pc.Is(CustomRoles.Saboteur) => false,
CustomRoles.Sleuth when pc.GetCustomRole() is CustomRoles.NecroGuesser or CustomRoles.Imitator or CustomRoles.Forensic => false,
CustomRoles.Introvert when pc.GetCustomRole() is CustomRoles.Leery or CustomRoles.Samurai or CustomRoles.Arsonist or CustomRoles.Revolutionist or CustomRoles.Investigator or CustomRoles.Scavenger or CustomRoles.Analyst => false,
CustomRoles.Circumvent when pc.GetCustomRole() is CustomRoles.Swooper or CustomRoles.RiftMaker => false,
CustomRoles.Oblivious when pc.Is(CustomRoles.Altruist) => false,
CustomRoles.AntiTP when pc.GetCustomRole() is CustomRoles.Transmitter or CustomRoles.Miner or CustomRoles.Escapist or CustomRoles.Tunneler or CustomRoles.Ninja => false,
CustomRoles.Swift when pc.Is(CustomRoles.Stealth) => false,
CustomRoles.BananaMan when pc.Is(CustomRoles.Disco) || pc.Is(CustomRoles.Doppelganger) => false,
CustomRoles.Disco when pc.GetCustomRole() is CustomRoles.Chameleon or CustomRoles.Swooper or CustomRoles.Wraith or CustomRoles.Alchemist or CustomRoles.Doppelganger => false,
CustomRoles.Egoist when pc.Is(CustomRoles.Gangster) => false,
CustomRoles.Nimble when pc.GetCustomRole() is CustomRoles.Oxyman or CustomRoles.EngineerEHR or CustomRoles.Mechanic => false,
CustomRoles.Magnet when pc.Is(Team.Impostor) => false,
CustomRoles.Swift when pc.Is(CustomRoles.Magnet) => false,
CustomRoles.Oblivious when pc.Is(CustomRoles.Amnesiac) && Amnesiac.RememberMode.GetValue() == 0 => false,
CustomRoles.Rookie when pc.GetRoleTypes() is not (RoleTypes.Impostor or RoleTypes.Phantom or RoleTypes.Shapeshifter or RoleTypes.Viper) => false,
CustomRoles.Madmate when pc.Is(CustomRoles.Sidekick) => false,
CustomRoles.Autopsy when pc.Is(CustomRoles.Doctor) || pc.Is(CustomRoles.Tracefinder) || pc.Is(CustomRoles.Scientist) || pc.Is(CustomRoles.ScientistEHR) || pc.Is(CustomRoles.Sunnyboy) => false,
CustomRoles.Necroview when pc.Is(CustomRoles.Doctor) => false,
CustomRoles.Lazy when pc.Is(CustomRoles.Speedrunner) => false,
CustomRoles.Mischievous when pc.Is(Team.Impostor) || (!pc.GetCustomRole().IsDesyncRole() && !pc.Is(CustomRoles.Bloodlust)) || !pc.IsNeutralKiller() || Main.PlayerStates[pc.PlayerId].Role.CanUseSabotage(pc) => false,
CustomRoles.Loyal when pc.IsCrewmate() && !Options.CrewCanBeLoyal.GetBool() => false,
CustomRoles.Lazy when pc.Is(CustomRoles.LazyGuy) || pc.Is(CustomRoles.Snitch) || pc.Is(CustomRoles.Marshall) || pc.Is(CustomRoles.Transporter) || pc.Is(CustomRoles.Guardian) => false,
CustomRoles.Tiebreaker when pc.Is(CustomRoles.Dictator) => false,
CustomRoles.Stressed when !pc.IsCrewmate() || pc.GetCustomRole().IsTasklessCrewmate() => false,
CustomRoles.Stealer or CustomRoles.Swift or CustomRoles.DeadlyQuota or CustomRoles.Damocles or CustomRoles.Mare when pc.Is(CustomRoles.Bomber) || pc.Is(CustomRoles.Nuker) || pc.Is(CustomRoles.Trapster) || pc.Is(CustomRoles.Capitalist) => false,
CustomRoles.Torch when pc.Is(CustomRoles.Bewilder) || pc.Is(CustomRoles.Sunglasses) || pc.Is(CustomRoles.GuardianAngelEHR) => false,
CustomRoles.Bewilder when pc.Is(CustomRoles.Torch) || pc.Is(CustomRoles.GuardianAngelEHR) || pc.Is(CustomRoles.Sunglasses) => false,
CustomRoles.Dynamo when pc.Is(CustomRoles.Spurt) || pc.GetCustomRole() is CustomRoles.Tank or CustomRoles.Ankylosaurus => false,
CustomRoles.Spurt when pc.GetCustomSubRoles().Any(x => x is CustomRoles.Dynamo or CustomRoles.Swiftclaw or CustomRoles.Giant or CustomRoles.Flash) || pc.Is(CustomRoles.Ankylosaurus) => false,
CustomRoles.Sunglasses when pc.Is(CustomRoles.Torch) || pc.Is(CustomRoles.GuardianAngelEHR) || pc.Is(CustomRoles.Bewilder) => false,
CustomRoles.Guesser when pc.GetCustomRole() is CustomRoles.EvilGuesser or CustomRoles.NiceGuesser or CustomRoles.Doomsayer or CustomRoles.CopyCat => false,
CustomRoles.Madmate when !pc.CanBeMadmate() || pc.Is(CustomRoles.Egoist) || pc.Is(CustomRoles.Rascal) => false,
CustomRoles.Oblivious when pc.Is(CustomRoles.Forensic) || pc.Is(CustomRoles.Cleaner) || pc.Is(CustomRoles.Medusa) || pc.Is(CustomRoles.Mortician) || pc.Is(CustomRoles.Medium) || pc.Is(CustomRoles.GuardianAngelEHR) => false,
CustomRoles.Youtuber when !pc.IsCrewmate() || pc.Is(CustomRoles.Madmate) || pc.Is(CustomRoles.Sheriff) || pc.Is(CustomRoles.GuardianAngelEHR) => false,
CustomRoles.Egoist when !pc.IsImpostor() => false,
CustomRoles.Damocles when pc.GetCustomRole() is CustomRoles.Bomber or CustomRoles.Nuker or CustomRoles.Mercenary or CustomRoles.Cantankerous => false,
CustomRoles.Damocles when pc.GetRoleTypes() is not (RoleTypes.Impostor or RoleTypes.Phantom or RoleTypes.Shapeshifter or RoleTypes.Viper) => false,
CustomRoles.Damocles when pc.Is(CustomRoleTypes.Coven) && !pc.Is(CustomRoles.CovenLeader) => false,
CustomRoles.Flash when pc.Is(CustomRoles.Giant) || pc.Is(CustomRoles.Spurt) || pc.GetCustomRole() is CustomRoles.Tank or CustomRoles.Zombie or CustomRoles.Swiftclaw or CustomRoles.Express => false,
CustomRoles.Giant when pc.Is(CustomRoles.Flash) || pc.Is(CustomRoles.Spurt) || pc.GetCustomRole() is CustomRoles.RoomRusher or CustomRoles.Tank or CustomRoles.Zombie or CustomRoles.Swiftclaw or CustomRoles.Express => false,
CustomRoles.Necroview when pc.Is(CustomRoles.Visionary) => false,
CustomRoles.Mimic when pc.Is(CustomRoles.Nemesis) => false,
CustomRoles.Rascal when !pc.IsCrewmate() => false,
CustomRoles.LazyGuy when pc.GetCustomRole().IsAdditionRole() => false,
CustomRoles.Stealer when pc.Is(CustomRoles.Vindicator) => false,
CustomRoles.Bloodlust when !pc.GetCustomRole().IsCrewmate() || pc.GetCustomRole().IsTaskBasedCrewmate() || pc.GetCustomRole() is CustomRoles.Medic => false,
CustomRoles.Mare when pc.GetCustomRole() is CustomRoles.Inhibitor or CustomRoles.Saboteur or CustomRoles.Swift or CustomRoles.Nemesis or CustomRoles.Sniper or CustomRoles.Fireworker or CustomRoles.Swooper or CustomRoles.Vampire => false,
CustomRoles.Torch when pc.GetCustomRole() is CustomRoles.Lighter or CustomRoles.Ignitor or CustomRoles.Investigator or CustomRoles.Eclipse or CustomRoles.Decryptor => false,
CustomRoles.Bewilder when pc.GetCustomRole() is CustomRoles.Lighter or CustomRoles.Ignitor or CustomRoles.Investigator or CustomRoles.Eclipse or CustomRoles.Decryptor => false,
CustomRoles.Sunglasses when pc.GetCustomRole() is CustomRoles.Lighter or CustomRoles.Ignitor or CustomRoles.Investigator or CustomRoles.Eclipse or CustomRoles.Decryptor => false,
CustomRoles.Bait when pc.Is(CustomRoles.Demolitionist) => false,
CustomRoles.Beartrap when pc.Is(CustomRoles.Demolitionist) => false,
CustomRoles.Lovers when pc.Is(CustomRoles.Romantic) => false,
CustomRoles.Mare when pc.Is(CustomRoles.LastImpostor) => false,
CustomRoles.Swift when pc.Is(CustomRoles.Mare) => false,
CustomRoles.Schizophrenic when (!pc.IsImpostor() && !pc.IsCrewmate()) || pc.Is(CustomRoles.Madmate) => false,
CustomRoles.Loyal when (!pc.IsImpostor() && !pc.IsCrewmate()) || pc.Is(CustomRoles.Madmate) => false,
CustomRoles.Loyal when pc.IsImpostor() && !Options.ImpCanBeLoyal.GetBool() => false,
CustomRoles.Seer when pc.GetCustomRole() is CustomRoles.Mortician or CustomRoles.TimeMaster => false,
CustomRoles.Onbound when pc.GetCustomRole() is CustomRoles.SuperStar or CustomRoles.Ankylosaurus or CustomRoles.Car or CustomRoles.Unbound => false,
CustomRoles.Rascal when pc.Is(CustomRoles.SuperStar) || pc.Is(CustomRoles.Madmate) => false,
CustomRoles.Madmate when pc.Is(CustomRoles.SuperStar) => false,
CustomRoles.Gravestone when pc.GetCustomRole() is CustomRoles.SuperStar or CustomRoles.Innocent => false,
CustomRoles.Lucky when pc.Is(CustomRoles.Guardian) => false,
CustomRoles.Bait when pc.Is(CustomRoles.GuardianAngelEHR) => false,
CustomRoles.Bait when pc.Is(CustomRoles.Beartrap) => false,
CustomRoles.Beartrap when pc.Is(CustomRoles.Bait) => false,
CustomRoles.Schizophrenic when pc.Is(CustomRoles.Dictator) => false,
CustomRoles.Swift when pc.GetCustomRole() is CustomRoles.Swooper or CustomRoles.Vampire or CustomRoles.Scavenger or CustomRoles.Puppeteer or CustomRoles.Warlock or CustomRoles.Consigliere or CustomRoles.Witch or CustomRoles.Nemesis or CustomRoles.Viper or CustomRoles.ViperEHR => false,
CustomRoles.Reach when (pc.GetCustomRole() is CustomRoles.Mafioso or CustomRoles.Evolver or CustomRoles.Berserker) || pc.Is(CustomRoles.Constricted) => false,
CustomRoles.Constricted when (pc.GetCustomRole() is CustomRoles.Mafioso or CustomRoles.Evolver or CustomRoles.Berserker) || pc.Is(CustomRoles.Reach) => false,
CustomRoles.Beartrap when pc.Is(CustomRoles.GuardianAngelEHR) => false,
CustomRoles.Reach when pc.GetRoleTypes() is not (RoleTypes.Impostor or RoleTypes.Phantom or RoleTypes.Shapeshifter or RoleTypes.Viper) => false,
CustomRoles.Constricted when pc.GetRoleTypes() is not (RoleTypes.Impostor or RoleTypes.Phantom or RoleTypes.Shapeshifter or RoleTypes.Viper) => false,
CustomRoles.Magnet when pc.GetRoleTypes() is not (RoleTypes.Impostor or RoleTypes.Phantom or RoleTypes.Shapeshifter or RoleTypes.Viper) => false,
CustomRoles.Haste when pc.GetRoleTypes() is not (RoleTypes.Impostor or RoleTypes.Phantom or RoleTypes.Shapeshifter or RoleTypes.Viper) || !pc.CanUseImpostorVentButton() || pc.Is(CustomRoles.Glitch) => false,
CustomRoles.Diseased when pc.Is(CustomRoles.Antidote) => false,
CustomRoles.Antidote when pc.Is(CustomRoles.Diseased) => false,
CustomRoles.Flash or CustomRoles.Giant when pc.GetCustomRole() is CustomRoles.Swooper or CustomRoles.Wraith or CustomRoles.Chameleon or CustomRoles.Alchemist or CustomRoles.Ankylosaurus or CustomRoles.Swiftclaw => false,
CustomRoles.Bait when pc.Is(CustomRoles.Disregarded) => false,
CustomRoles.Busy when !pc.GetTaskState().HasTasks => false,
CustomRoles.Truant when pc.Is(CustomRoles.SoulHunter) => false,
CustomRoles.Nimble when !pc.IsCrewmate() => false,
CustomRoles.Physicist when !pc.IsCrewmate() || pc.GetCustomRole().IsDesyncRole() || (pc.Is(CustomRoles.TimeMaster) && !TimeMaster.TimeMasterCanUseVitals.GetBool()) => false,
CustomRoles.Finder when !pc.IsCrewmate() || pc.GetCustomRole().IsDesyncRole() => false,
CustomRoles.Noisy when !pc.IsCrewmate() || pc.GetCustomRole().IsDesyncRole() => false,
CustomRoles.Examiner when !pc.IsCrewmate() || pc.GetCustomRole().IsDesyncRole() => false,
CustomRoles.Venom when !pc.IsImpostor() => false,
CustomRoles.Disregarded when pc.Is(CustomRoles.Bait) => false,
CustomRoles.Oblivious when pc.Is(CustomRoles.Coroner) => false,
CustomRoles.Oblivious when pc.Is(CustomRoles.Vulture) => false,
CustomRoles.DoubleShot when pc.Is(CustomRoles.CopyCat) => false,
CustomRoles.Tiebreaker when pc.Is(CustomRoles.Dictator) => false,
CustomRoles.Lucky when pc.Is(CustomRoles.Luckey) => false,
CustomRoles.Unlucky when pc.GetCustomRole() is CustomRoles.Luckey or CustomRoles.Tank or CustomRoles.Vector or CustomRoles.Addict or CustomRoles.Lurker => false,
CustomRoles.Unlucky when pc.Is(CustomRoles.Lucky) => false,
CustomRoles.Lucky when pc.Is(CustomRoles.Unlucky) => false,
CustomRoles.Fool when pc.GetCustomRole() is CustomRoles.Mechanic or CustomRoles.GuardianAngelEHR or CustomRoles.Technician => false,
CustomRoles.Coroner when pc.Is(CustomRoles.Oblivious) => false,
CustomRoles.Fragile when pc.Is(CustomRoles.Detour) => false,
CustomRoles.Physicist when pc.GetCustomRole() is CustomRoles.Tracefinder or CustomRoles.Doctor => false,
CustomRoles.DoubleShot when pc.GetCustomRole() is not CustomRoles.EvilGuesser and not CustomRoles.NiceGuesser and not CustomRoles.Augur && !Options.GuesserMode.GetBool() => false,
CustomRoles.DoubleShot when !pc.Is(CustomRoles.Guesser) && !pc.Is(CustomRoles.EvilGuesser) && pc.Is(CustomRoleTypes.Impostor) && !Options.ImpostorsCanGuess.GetBool() => false,
CustomRoles.DoubleShot when !pc.Is(CustomRoles.Guesser) && !pc.Is(CustomRoles.NiceGuesser) && pc.Is(CustomRoleTypes.Crewmate) && !Options.CrewmatesCanGuess.GetBool() => false,
CustomRoles.DoubleShot when !pc.Is(CustomRoles.Guesser) && ((pc.GetCustomRole().IsNonNK() && !Options.PassiveNeutralsCanGuess.GetBool()) || (pc.IsNeutralKiller() && !Options.NeutralKillersCanGuess.GetBool())) => false,
CustomRoles.DoubleShot when !pc.Is(CustomRoles.Guesser) && !pc.Is(CustomRoles.Augur) && pc.Is(CustomRoleTypes.Coven) && !Options.CovenCanGuess.GetBool() => false,
_ => true
};
}
}
[SuppressMessage("ReSharper", "InconsistentNaming")]
public enum RoleOptionType
{
Impostor_Killing,
Impostor_Support,
Impostor_Concealing,
Impostor_Miscellaneous,
Impostor_Madmate,
Crewmate_Miscellaneous,
Crewmate_Investigate,
Crewmate_Support,
Crewmate_Killing,
Crewmate_Power,
Crewmate_Chaos,
Neutral_Benign,
Neutral_Evil,
Neutral_Pariah,
Neutral_Killing,
Coven_Miscellaneous
}
public enum AddonTypes
{
ImpOnly,
Helpful,
Harmful,
Mixed
}
public enum CustomRoleTypes
{
Crewmate,
Impostor,
Neutral,
Coven,
Addon
}
[SuppressMessage("ReSharper", "UnusedMember.Global")]
public enum CountTypes
{
OutOfGame,
None,
Crew,
Impostor,
CustomTeam,
Bloodlust,
Jackal,
Doppelganger,
Pelican,
Demon,
BloodKnight,
Poisoner,
Cultist,
Necromancer,
HexMaster,
Wraith,
SerialKiller,
Blockade,
Quarry,
Accumulator,
Spider,
SoulCollector,
Berserker,
Sharpshooter,
Explosivist,
Thanos,
Duality,
Slenderman,
Amogus,
Weatherman,
NoteKiller,
Vortex,
Beehive,
RouleteGrandeur,
Nonplus,
Tremor,
Evolver,
Rogue,
Patroller,
Simon,
Chemist,
QuizMaster,
Samurai,
Bargainer,
Tiger,
Enderman,
Mycologist,
Bubble,
Hookshot,
Sprayer,
Infection,
Magician,
WeaponMaster,
Reckless,
Pyromaniac,
Eclipse,
Vengeance,
HeadHunter,
Gaslighter,
Pulse,
Werewolf,
Juggernaut,
Agitator,
Virus,
Stalker,
Jinx,
Ritualist,
Pickpocket,
Traitor,
Medusa,
Bandit,
Spiritcaller,
RuthlessRomantic,
Pestilence,
PlagueBearer,
Glitch,
Arsonist,
Cherokious,
Coven
}