using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Runtime.CompilerServices; 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 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.PortalMaker, CustomRoles.Gardener, CustomRoles.Farmer, CustomRoles.Tree, CustomRoles.Doorjammer, CustomRoles.Carrier, CustomRoles.Empress, CustomRoles.Tar, CustomRoles.Bouncer, // HnS CustomRoles.Jet, CustomRoles.Dasher ]; extension(CustomRoles role) { public bool IsExperimental() { return role is CustomRoles.Doppelganger or 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 or CustomRoles.Tagger; } 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.Find(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(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 => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter, 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.Gatekeeper => 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.Tyrant => CustomRoles.Impostor, CustomRoles.SuperStar => CustomRoles.Crewmate, CustomRoles.Survivor => CustomRoles.Engineer, 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.Bouncer => 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.Revenant => 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 => Fox.HasVitals.GetBool() ? CustomRoles.Scientist : 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, CustomRoles.Disguiser => CustomRoles.Shapeshifter, // 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.IsVanillaEHR()) 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, // DoomTag CustomRoles.Tagger => RoleTypes.Impostor, // 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.Gatekeeper 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.Tyrant 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.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.Revenant or CustomRoles.Weatherman; } public bool IsTaskBasedCrewmate() { return role is CustomRoles.Helper or CustomRoles.Snitch or CustomRoles.Revenant 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.Survivor 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.Gatekeeper or CustomRoles.Hypnotist or CustomRoles.Librarian or CustomRoles.Miner or CustomRoles.Wiper 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.Gatekeeper => 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.Tyrant => 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.Revenant => 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.Bouncer => 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.Survivor => 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 bool IsVanillaEHR() { return role is CustomRoles.CrewmateEHR or CustomRoles.EngineerEHR or CustomRoles.NoisemakerEHR or CustomRoles.TrackerEHR or CustomRoles.ScientistEHR or CustomRoles.GuardianAngelEHR or CustomRoles.ImpostorEHR or CustomRoles.DetectiveEHR or CustomRoles.ViperEHR or CustomRoles.PhantomEHR or CustomRoles.ShapeshifterEHR; } 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) { var players = countDead ? Main.CachedAllPlayerControls() : Main.CachedAlivePlayerControls(); for (int i = 0; i < players.Count; i++) { var player = players[i]; if (player.Is(role)) return true; } return false; } 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 }; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public string ToColoredString() { return role.ColoredTextByRole(Translator.GetString(role.ToString())); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public string ColoredTextByRole(string str) { return Utils.ColorString(Utils.GetRoleColor(role), str); } } 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 }; } } 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, bool validateExistingState = false) { return role.IsAdditionRole() && !(role.IsGhostRole() && pc.IsAlive()) && (!Main.NeverSpawnTogetherCombos.TryGetValue(OptionItem.CurrentPreset, out Dictionary> neverList) || !neverList.TryGetValue(pc.GetCustomRole(), out List bannedAddonList) || !bannedAddonList.Contains(role)) && pc.GetCustomRole() is not CustomRoles.GuardianAngelEHR and not CustomRoles.God && !pc.Is(CustomRoles.Madmate) && !pc.Is(CustomRoles.GM) && (validateExistingState || role is not CustomRoles.Lovers) && !pc.Is(CustomRoles.LazyGuy) && (validateExistingState || (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.Absorber when float.IsNaN(pc.GetAbilityUseLimit()) => false, CustomRoles.TaskMaster when !pc.IsCrewmate() || !Utils.HasTasks(pc.Data, forRecompute: false) => false, CustomRoles.Committed 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.Priority when Main.PlayerStates[pc.PlayerId].Role is not CovenBase coven || coven.CanNeverGetNecronomicon => 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.Focused when pc.GetRoleTypes() is not (RoleTypes.Impostor or RoleTypes.Phantom or RoleTypes.Shapeshifter or RoleTypes.Viper) => false, CustomRoles.Dizzy when pc.GetRoleTypes() is not (RoleTypes.Impostor or RoleTypes.Phantom or RoleTypes.Shapeshifter or RoleTypes.Viper) => 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.Survivor) || (pc.Is(CustomRoles.TimeMaster) && !TimeMaster.TimeMasterCanUseVitals.GetBool()) => false, CustomRoles.Finder when !pc.IsCrewmate() || pc.GetCustomRole().IsDesyncRole() || pc.Is(CustomRoles.Survivor) => false, CustomRoles.Noisy when !pc.IsCrewmate() || pc.GetCustomRole().IsDesyncRole() || pc.Is(CustomRoles.Survivor) => false, CustomRoles.Examiner when !pc.IsCrewmate() || pc.GetCustomRole().IsDesyncRole() || pc.Is(CustomRoles.Survivor) => 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 }