using System;
using Server.Mobiles;
using Server.Engines.Shadowguard;

namespace Server.Items
{
    public class SlayerGroup
    {
        private static SlayerEntry[] m_TotalEntries;
        private static SlayerGroup[] m_Groups;
        private SlayerGroup[] m_Opposition;
        private SlayerEntry m_Super;
        private SlayerEntry[] m_Entries;
        private Type[] m_FoundOn;

        public SlayerGroup()
        {
        }

        static SlayerGroup()
        {
            SlayerGroup humanoid = new SlayerGroup();
            SlayerGroup undead = new SlayerGroup();
            SlayerGroup elemental = new SlayerGroup();
            SlayerGroup abyss = new SlayerGroup();
            SlayerGroup arachnid = new SlayerGroup();
            SlayerGroup reptilian = new SlayerGroup();
            SlayerGroup fey = new SlayerGroup();
            SlayerGroup eodon = new SlayerGroup();
            SlayerGroup eodonTribe = new SlayerGroup();
            SlayerGroup dino = new SlayerGroup();
            SlayerGroup myrmidex = new SlayerGroup();

            humanoid.Opposition = new SlayerGroup[]
                {
                    undead
                };

            humanoid.FoundOn = new Type[]
                {
                    typeof(BoneKnight),     typeof(Lich),
                    typeof(LichLord)
                };

            humanoid.Super = new SlayerEntry
                (
                    SlayerName.Repond,

                    typeof(ClanCA), typeof(ClanCT),
                    typeof(ClanRS), typeof(ClanRC),
                    typeof(ClanSS), typeof(ClanSH),
                    typeof(Barracoon), typeof(MasterTheophilus),
                    typeof(Lurg), typeof(ArcticOgreLord),
                    typeof(Cyclops), typeof(Ettin),
                    typeof(EvilMage), typeof(EvilMageLord),
                    typeof(FrostTroll), typeof(MeerCaptain),
                    typeof(MeerEternal), typeof(MeerMage),
                    typeof(MeerWarrior), typeof(Ogre),
                    typeof(OgreLord), typeof(Orc),
                    typeof(OrcBomber), typeof(OrcBrute),
                    typeof(OrcCaptain), typeof(OrcChopper),
                    typeof(OrcScout), typeof(OrcishLord),
                    typeof(OrcishMage), typeof(Ratman),
                    typeof(RatmanArcher), typeof(RatmanMage),
                    typeof(SavageRider), typeof(SavageShaman),
                    typeof(Savage), typeof(Titan),
                    typeof(Troglodyte), typeof(Troll),
                    typeof(Troglodyte), typeof(MougGuur),
                    typeof(Chiikkaha), typeof(Minotaur),
                    typeof(MinotaurGeneral), typeof(Medusa),
                    typeof(RakktaviRenowned), typeof(TikitaviRenowned),
                    typeof(VitaviRenowned), typeof(EnslavedGoblinScout),
                    typeof(EnslavedGoblinKeeper), typeof(EnslavedGreenGoblin),
                    typeof(EnslavedGreenGoblinAlchemist), typeof(EnslavedGoblinMage),
                    typeof(EnslavedGrayGoblin), typeof(GreenGoblinScout),
                    typeof(GreenGoblinAlchemist), typeof(GreenGoblin),
                    typeof(GrayGoblinMage), typeof(GrayGoblinKeeper),
                    typeof(GrayGoblin), typeof(GreenGoblinAlchemistRenowned),
                    typeof(GrayGoblinMageRenowned), typeof(CorgulTheSoulBinder),
                    typeof(PirateCrew), typeof(LizardmanWitchdoctor),
                    typeof(OrcFootSoldier), typeof(RatmanAssassin),
                    typeof(OgreBoneCrusher), typeof(TitanRockHunter)
                );

            humanoid.Entries = new SlayerEntry[]
            {
                new SlayerEntry
                    (
                        SlayerName.OgreTrashing,

                        typeof(Ogre),               typeof(OgreLord),
                        typeof(ArcticOgreLord),     typeof(OgreBoneCrusher)
                    ),

                new SlayerEntry
                    (
                        SlayerName.OrcSlaying,

                        typeof(Orc),            typeof(OrcBomber),
                        typeof(OrcBrute),       typeof(OrcCaptain),
                        typeof(OrcChopper),     typeof(OrcScout),
                        typeof(OrcishLord),     typeof(OrcishMage),
                        typeof(OrcFootSoldier)
                    ),

                new SlayerEntry
                    (
                        SlayerName.TrollSlaughter,

                        typeof(Troll),  typeof(FrostTroll)
                    ),
            };

            undead.Opposition = new SlayerGroup[]
                {
                    humanoid
                };

            undead.Super = new SlayerEntry
                (
                    SlayerName.Silver,

                    typeof(AncientLich), typeof(AncientLichRenowned),
                    typeof(Bogle), typeof(BoneKnight),
                    typeof(BoneMagi), typeof(DarkGuardian),
                    typeof(DarknightCreeper), typeof(FleshGolem),
                    typeof(Ghoul), typeof(GoreFiend),
                    typeof(HellSteed), typeof(LadyOfTheSnow),
                    typeof(Lich), typeof(LichLord),
                    typeof(Mummy), typeof(PestilentBandage),
                    typeof(Revenant), typeof(RevenantLion),
                    typeof(RottingCorpse), typeof(Shade),
                    typeof(ShadowKnight), typeof(SkeletalKnight),
                    typeof(SkeletalMage), typeof(SkeletalMount),
                    typeof(Skeleton), typeof(Spectre),
                    typeof(Wraith), typeof(Zombie),
                    typeof(UnfrozenMummy), typeof(RedDeath),
                    typeof(SirPatrick), typeof(LadyJennifyr),
                    typeof(MasterMikael), typeof(MasterJonath),
                    typeof(LadyMarai), typeof(PrimevalLich),
                    typeof(Niporailem), typeof(DreamWraith),
                    typeof(EffeteUndeadGargoyle), typeof(UndeadGargoyle),
                    typeof(UndeadGuardian), typeof(PutridUndeadGargoyle),
                    typeof(PutridUndeadGuardian), typeof(Juonar),
                    typeof(Spellbinder), typeof(AngeredSpirit),
                    typeof(BoneSwordSlinger), typeof(CovetousRevenant),
                    typeof(DiseasedLich), typeof(VileCadaver),
                    typeof(GrizzledMare), typeof(SkeletalCat)
                );

            undead.Entries = new SlayerEntry[0];

            fey.Opposition = new SlayerGroup[]
                {
                    abyss
                };

            fey.Super = new SlayerEntry
                (
                    SlayerName.Fey,

                    typeof(Centaur), typeof(CuSidhe),
                    typeof(EtherealWarrior), typeof(Kirin),
                    typeof(LordOaks), typeof(Pixie),
                    typeof(PixieRenowned), typeof(Silvani),
                    typeof(Treefellow), typeof(Unicorn),
                    typeof(Wisp), typeof(MLDryad),
                    typeof(Satyr), typeof(Changeling),
                    typeof(InsaneDryad), typeof(CorporealBrume),
                    typeof(CrystalLatticeSeeker), typeof(LadyMelisande),
                    typeof(DreadHorn), typeof(Travesty),
                    typeof(ShimmeringEffusion), typeof(Guile),
                    typeof(Irk), typeof(DarkWisp),
                    typeof(FeralTreefellow)
                );

            fey.Entries = new SlayerEntry[0];

            elemental.Opposition = new SlayerGroup[]
                {
                    abyss
                };

            elemental.FoundOn = new Type[]
                {
                    typeof(Balron),     typeof(Daemon),
                    typeof(Putrefier),  typeof(FireDaemonRenowned)
                };

            elemental.Super = new SlayerEntry
                (
                    SlayerName.ElementalBan,

                    typeof(LavaElemental), typeof(ToxicElemental),
                    typeof(AcidElemental), typeof(AcidElementalRenowned),
                    typeof(FireElementalRenowned), typeof(AgapiteElemental),
                    typeof(AirElemental), typeof(SummonedAirElemental),
                    typeof(BloodElemental), typeof(BronzeElemental),
                    typeof(CopperElemental), typeof(CrystalElemental),
                    typeof(DullCopperElemental), typeof(EarthElemental),
                    typeof(SummonedEarthElemental), typeof(Efreet),
                    typeof(FireElemental), typeof(SummonedFireElemental),
                    typeof(GoldenElemental), typeof(IceElemental),
                    typeof(KazeKemono), typeof(PoisonElemental),
                    typeof(RaiJu), typeof(SandVortex),
                    typeof(ShadowIronElemental), typeof(SnowElemental),
                    typeof(ValoriteElemental), typeof(VeriteElemental),
                    typeof(WaterElemental), typeof(SummonedWaterElemental),
                    typeof(Flurry), typeof(Mistral),
                    typeof(Tempest), typeof(UnboundEnergyVortex),
                    typeof(ChaosVortex), typeof(WindElemental),
                    typeof(FlameElemental), typeof(QuartzElemental),
                    typeof(VoidManifestation), typeof(DemonKnight),
                    typeof(CovetousEarthElemental), typeof(VenomElemental),
                    typeof(SearingElemental), typeof(VortexElemental),
                    typeof(CovetousWaterElemental)
                );

            elemental.Entries = new SlayerEntry[]
                {
                    new SlayerEntry
                        (
                            SlayerName.BloodDrinking,

                            typeof(BloodElemental),     typeof(DemonKnight)
                        ),

                    new SlayerEntry
                        (
                            SlayerName.EarthShatter,

                            typeof(AgapiteElemental),   typeof(BronzeElemental),
                            typeof(CopperElemental),    typeof(DullCopperElemental),
                            typeof(EarthElemental),     typeof(SummonedEarthElemental),
                            typeof(GoldenElemental),    typeof(ShadowIronElemental),
                            typeof(ValoriteElemental),  typeof(VeriteElemental),
                            typeof(QuartzElemental),    typeof(DemonKnight),
                            typeof(CovetousEarthElemental)
                        ),

                    new SlayerEntry
                        (
                            SlayerName.ElementalHealth,

                            typeof(PoisonElemental),    typeof(DemonKnight),
                            typeof(VenomElemental)
                        ),

                    new SlayerEntry
                        (
                            SlayerName.FlameDousing,

                            typeof(FireElemental),          typeof(FireElementalRenowned),
                            typeof(SummonedFireElemental),  typeof(FlameElemental),
                            typeof(DemonKnight),            typeof(SearingElemental)
                        ),

                    new SlayerEntry
                        (
                            SlayerName.SummerWind,

                            typeof(SnowElemental),  typeof(IceElemental),
                            typeof(DemonKnight)
                        ),

                    new SlayerEntry
                        (
                            SlayerName.Vacuum,

                            typeof(AirElemental),   typeof(SummonedAirElemental),
                            typeof(Flurry),         typeof(Mistral),
                            typeof(Tempest),        typeof(UnboundEnergyVortex),
                            typeof(ChaosVortex),    typeof(WindElemental),
                            typeof(DemonKnight),    typeof(VortexElemental)
                        ),

                    new SlayerEntry
                        (
                            SlayerName.WaterDissipation,

                            typeof(WaterElemental),     typeof(SummonedWaterElemental),
                            typeof(DemonKnight),        typeof(CovetousWaterElemental)
                        )
                };

            abyss.Opposition = new SlayerGroup[]
                {
                    elemental,
                    fey
                };

            abyss.FoundOn = new Type[]
                {
                    typeof(BloodElemental)
                };

            if (Core.AOS)
            {
                abyss.Super = new SlayerEntry
                    (
                        SlayerName.Exorcism,

                        typeof(DevourerRenowned), typeof(FireDaemonRenowned),
                        typeof(AbysmalHorror), typeof(AbyssalInfernal),
                        typeof(ArcaneDaemon), typeof(Balron),
                        typeof(BoneDemon), typeof(ChaosDaemon),
                        typeof(Daemon), typeof(SummonedDaemon),
                        typeof(DemonKnight), typeof(Devourer),
                        typeof(EnslavedGargoyle), typeof(FanDancer),
                        typeof(FireGargoyle), typeof(Gargoyle),
                        typeof(GargoyleDestroyer), typeof(GargoyleEnforcer),
                        typeof(Gibberling), typeof(HordeMinion),
                        typeof(FireDaemon), typeof(IceFiend),
                        typeof(Imp), typeof(Impaler),
                        typeof(Moloch), typeof(Oni),
                        typeof(Ravager), typeof(Semidar),
                        typeof(StoneGargoyle), typeof(Succubus),
                        typeof(PatchworkSkeleton), typeof(TsukiWolf),
                        typeof(Szavetra), typeof(CrystalDaemon),
                        typeof(SlasherOfVeils), typeof(GargoyleShade),
                        typeof(Putrefier), typeof(ChiefParoxysmus),
                        typeof(Anzuanord), typeof(Ballem),
                        typeof(Betballem), typeof(SkeletalLich),
                        typeof(UsagralemBallem), typeof(EffetePutridGargoyle),
                        typeof(EffeteUndeadGargoyle), typeof(PitFiend),
                        typeof(ArchDaemon), typeof(AbyssalAbomination),
                        typeof(Virtuebane), typeof(LesserOni),
                        typeof(Lifestealer)
                    );

                abyss.Entries = new SlayerEntry[]
                {
                    // Daemon Dismissal & Balron Damnation have been removed and moved up to super slayer on OSI.
                    new SlayerEntry
                        (
                            SlayerName.GargoylesFoe,

                            typeof(EnslavedGargoyle),       typeof(FireGargoyle),
                            typeof(Gargoyle),               typeof(GargoyleDestroyer),
                            typeof(GargoyleEnforcer),       typeof(StoneGargoyle),
                            typeof(GargoyleShade),          typeof(EffetePutridGargoyle),
                            typeof(EffeteUndeadGargoyle),   typeof(DaemonMongbat),
                            typeof(CovetousDoppleganger),   typeof(CovetousFireDaemon),
                            typeof(GargoyleAssassin),       typeof(LesserOni)
                        ),
                };
            }
            else
            {
                abyss.Super = new SlayerEntry
                    (
                        SlayerName.Exorcism,

                        typeof(AbysmalHorror), typeof(Balron),
                        typeof(BoneDemon), typeof(ChaosDaemon),
                        typeof(Daemon), typeof(SummonedDaemon),
                        typeof(DemonKnight), typeof(Devourer),
                        typeof(Gargoyle), typeof(FireGargoyle),
                        typeof(Gibberling), typeof(HordeMinion),
                        typeof(IceFiend), typeof(Imp),
                        typeof(Impaler), typeof(Ravager),
                        typeof(StoneGargoyle), typeof(ArcaneDaemon),
                        typeof(EnslavedGargoyle), typeof(GargoyleDestroyer),
                        typeof(GargoyleEnforcer), typeof(Moloch)
                    );

                abyss.Entries = new SlayerEntry[]
                {
                    new SlayerEntry
                        (
                            SlayerName.DaemonDismissal,

                            typeof(Semidar),        typeof(AbyssalInfernal),
                            typeof(AbysmalHorror),  typeof(Balron),
                            typeof(BoneDemon),      typeof(ChaosDaemon),
                            typeof(Daemon),         typeof(SummonedDaemon),
                            typeof(DemonKnight),    typeof(Devourer),
                            typeof(Gibberling),     typeof(HordeMinion),
                            typeof(IceFiend),       typeof(Imp),
                            typeof(Impaler),        typeof(Ravager),
                            typeof(ArcaneDaemon),   typeof(Moloch)
                        ),

                    new SlayerEntry
                        (
                            SlayerName.GargoylesFoe,

                            typeof(FireGargoyle),       typeof(Gargoyle),
                            typeof(StoneGargoyle),      typeof(EnslavedGargoyle),
                            typeof(GargoyleDestroyer),  typeof(GargoyleEnforcer)
                        ),

                    new SlayerEntry
                        (
                            SlayerName.BalronDamnation,

                            typeof(Balron)
                        )
                };
            }

            arachnid.Opposition = new SlayerGroup[]
                {
                    reptilian
                };

            arachnid.FoundOn = new Type[]
                {
                    typeof(AncientWyrm),    typeof(GreaterDragon),
                    typeof(Dragon),         typeof(OphidianMatriarch),
                    typeof(ShadowWyrm)
                };

            arachnid.Super = new SlayerEntry
                (
                    SlayerName.ArachnidDoom,

                    typeof(DreadSpider), typeof(FrostSpider),
                    typeof(GiantBlackWidow), typeof(GiantSpider),
                    typeof(Mephitis), typeof(Scorpion),
                    typeof(TerathanAvenger), typeof(TerathanDrone),
                    typeof(TerathanMatriarch), typeof(TerathanWarrior),
                    typeof(Miasma), typeof(SpeckledScorpion),
                    typeof(LadyLissith), typeof(LadySabrix),
                    typeof(Virulent), typeof(Silk),
                    typeof(Malefic), typeof(Navrey),
                    typeof(SentinelSpider), typeof(WolfSpider),
                    typeof(TrapdoorSpider), typeof(Anlorzen),
                    typeof(Anlorlem)
                );

            arachnid.Entries = new SlayerEntry[]
            {
                new SlayerEntry
                    (
                        SlayerName.ScorpionsBane,

                        typeof(Scorpion),           typeof(Miasma),
                        typeof(SpeckledScorpion)
                    ),

                new SlayerEntry
                    (
                        SlayerName.SpidersDeath,

                        typeof(DreadSpider),        typeof(FrostSpider),
                        typeof(GiantBlackWidow),    typeof(GiantSpider),
                        typeof(Mephitis),           typeof(LadyLissith),
                        typeof(LadySabrix),         typeof(Virulent),
                        typeof(Silk),               typeof(Malefic),
                        typeof(Navrey),             typeof(SentinelSpider),
                        typeof(WolfSpider),         typeof(TrapdoorSpider),
                        typeof(Anlorzen)
                    ),

                new SlayerEntry
                    (
                        SlayerName.Terathan,

                        typeof(TerathanAvenger),    typeof(TerathanDrone),
                        typeof(TerathanMatriarch),  typeof(TerathanWarrior),
                        typeof(Anlorlem)
                    )
            };

            reptilian.Opposition = new SlayerGroup[]
                {
                    arachnid
                };

            reptilian.FoundOn = new Type[]
                {
                    typeof(TerathanAvenger),    typeof(TerathanMatriarch)
                };

            reptilian.Super = new SlayerEntry
                (
                    SlayerName.ReptilianDeath,

                    typeof(Rikktor), typeof(Serado),
                    typeof(SkeletalDragonRenowned), typeof(WyvernRenowned),
                    typeof(AncientWyrm), typeof(DeepSeaSerpent),
                    typeof(GreaterDragon), typeof(Dragon),
                    typeof(Drake), typeof(GiantIceWorm),
                    typeof(IceSerpent), typeof(GiantSerpent),
                    typeof(Hiryu), typeof(IceSnake),
                    typeof(JukaLord), typeof(JukaMage),
                    typeof(JukaWarrior), typeof(LavaSerpent),
                    typeof(LavaSnake), typeof(LesserHiryu),
                    typeof(Lizardman), typeof(OphidianArchmage),
                    typeof(OphidianKnight), typeof(OphidianMage),
                    typeof(OphidianMatriarch), typeof(OphidianWarrior),
                    typeof(Reptalon), typeof(SeaSerpent),
                    typeof(Serado), typeof(SerpentineDragon),
                    typeof(ShadowWyrm), typeof(SilverSerpent),
                    typeof(SkeletalDragon), typeof(Snake),
                    typeof(SwampDragon), typeof(WhiteWyrm),
                    typeof(Wyvern), typeof(Yamandon),
                    typeof(Hydra), typeof(CrystalHydra),
                    typeof(CrystalSeaSerpent), typeof(Rend),
                    typeof(Thrasher), typeof(Abscess),
                    typeof(Grim), typeof(ChickenLizard),
                    typeof(StygianDragon), typeof(FairyDragon),
                    typeof(Skree), typeof(Slith),
                    typeof(StoneSlith), typeof(ToxicSlith),
                    typeof(Raptor), typeof(Kepetch),
                    typeof(KepetchAmbusher), typeof(FrostDragon),
                    typeof(ColdDrake), typeof(FrostDrake), typeof(Coil),
                    typeof(SkeletalDrake), typeof(CoralSnake)
                );

            reptilian.Entries = new SlayerEntry[]
            {
                new SlayerEntry
                    (
                        SlayerName.DragonSlaying,

                        typeof(Rikktor),            typeof(SkeletalDragonRenowned),
                        typeof(WyvernRenowned),     typeof(AncientWyrm),
                        typeof(GreaterDragon),      typeof(Dragon),
                        typeof(Drake),              typeof(Hiryu),
                        typeof(LesserHiryu),        typeof(Reptalon),
                        typeof(SerpentineDragon),   typeof(ShadowWyrm),
                        typeof(SkeletalDragon),     typeof(SwampDragon),
                        typeof(WhiteWyrm),          typeof(Wyvern),
                        typeof(Hydra),              typeof(CrystalHydra),
                        typeof(Rend),               typeof(Abscess),
                        typeof(Grim),               typeof(StygianDragon),
                        typeof(FairyDragon),        typeof(SkeletalDrake),
                        typeof(ColdDrake)
                    ),

                new SlayerEntry
                    (
                        SlayerName.LizardmanSlaughter,

                        typeof(Lizardman)
                    ),

                new SlayerEntry
                    (
                        SlayerName.Ophidian,

                        typeof(OphidianArchmage),   typeof(OphidianKnight),
                        typeof(OphidianMage),       typeof(OphidianMatriarch),
                        typeof(OphidianWarrior)
                    ),

                new SlayerEntry
                    (
                        SlayerName.SnakesBane,

                        typeof(CrystalSeaSerpent),  typeof(Coil),
                        typeof(CoralSnake),         typeof(DeepSeaSerpent),
                        typeof(GiantIceWorm),       typeof(GiantSerpent),
                        typeof(IceSerpent),         typeof(IceSnake),
                        typeof(LavaSerpent),        typeof(LavaSnake),
                        typeof(SeaSerpent),         typeof(Serado),
                        typeof(SilverSerpent),      typeof(Snake),
                        typeof(Yamandon)
                    )
            };

            eodon.Opposition = new SlayerGroup[] { };
            eodon.FoundOn = new Type[] { };
            eodon.Super = 
                new SlayerEntry(
                    
                    SlayerName.Eodon, 
                    
                    typeof(Dimetrosaur), typeof(Gallusaurus), 
                    typeof(Archaeosaurus), typeof(Najasaurus),
                    typeof(Saurosaurus), typeof(Allosaurus), 
                    typeof(MyrmidexLarvae), typeof(MyrmidexDrone), 
                    typeof(MyrmidexWarrior), typeof(DragonTurtle), 
                    typeof(DragonTurtleHatchling), typeof(DesertScorpion),
                    typeof(TribeWarrior), typeof(TribeShaman), 
                    typeof(TribeChieftan), typeof(WildTiger), 
                    typeof(WildBlackTiger), typeof(WildWhiteTiger), 
                    typeof(TRex), typeof(SilverbackGorilla));

            eodon.Entries = new SlayerEntry[] { };

            eodonTribe.Opposition = new SlayerGroup[] { };
            eodonTribe.FoundOn = new Type[] { };
            eodonTribe.Super = new SlayerEntry(SlayerName.EodonTribe, typeof(TribeWarrior), typeof(TribeShaman), typeof(TribeChieftan));
            eodonTribe.Entries = new SlayerEntry[] { };

            dino.Opposition = new SlayerGroup[] { fey };
            dino.FoundOn = new Type[] { };
            dino.Super =
                new SlayerEntry(
                    
                    SlayerName.Dinosaur, 
                    
                    typeof(Dimetrosaur), typeof(Gallusaurus), 
                    typeof(Archaeosaurus), typeof(Najasaurus),
                    typeof(Saurosaurus), typeof(Allosaurus),
                    typeof(MyrmidexLarvae), typeof(MyrmidexDrone),
                    typeof(TRex), typeof(MyrmidexWarrior));

            dino.Entries = new SlayerEntry[] { };

            myrmidex.Opposition = new SlayerGroup[] { fey };
            myrmidex.FoundOn = new Type[] { };
            myrmidex.Super = new SlayerEntry(
                
                SlayerName.Myrmidex,
                
                typeof(MyrmidexLarvae), typeof(MyrmidexDrone), 
                typeof(MyrmidexWarrior));
            myrmidex.Entries = new SlayerEntry[] { };

            m_Groups = new SlayerGroup[]
				{
					humanoid,
					undead,
					elemental,
					abyss,
					arachnid,
					reptilian,
					fey,
                    eodon,
                    eodonTribe,
                    dino, 
                    myrmidex,
				};

            m_TotalEntries = CompileEntries(m_Groups);
        }

        public static SlayerEntry[] TotalEntries
        {
            get
            {
                return m_TotalEntries;
            }
        }
        public static SlayerGroup[] Groups
        {
            get
            {
                return m_Groups;
            }
        }
        public SlayerGroup[] Opposition
        {
            get
            {
                return this.m_Opposition;
            }
            set
            {
                this.m_Opposition = value;
            }
        }
        public SlayerEntry Super
        {
            get
            {
                return this.m_Super;
            }
            set
            {
                this.m_Super = value;
            }
        }
        public SlayerEntry[] Entries
        {
            get
            {
                return this.m_Entries;
            }
            set
            {
                this.m_Entries = value;
            }
        }
        public Type[] FoundOn
        {
            get
            {
                return this.m_FoundOn;
            }
            set
            {
                this.m_FoundOn = value;
            }
        }
        public static SlayerEntry GetEntryByName(SlayerName name)
        {
            int v = (int)name;

            if (v >= 0 && v < m_TotalEntries.Length)
                return m_TotalEntries[v];

            return null;
        }

        public static SlayerName GetLootSlayerType(Type type)
        {
            for (int i = 0; i < m_Groups.Length; ++i)
            {
                SlayerGroup group = m_Groups[i];
                Type[] foundOn = group.FoundOn;

                bool inGroup = false;

                for (int j = 0; foundOn != null && !inGroup && j < foundOn.Length; ++j)
                    inGroup = (foundOn[j] == type);

                if (inGroup)
                {
                    int index = Utility.Random(1 + group.Entries.Length);

                    if (index == 0)
                        return group.m_Super.Name;

                    return group.Entries[index - 1].Name;
                }
            }

            return SlayerName.Silver;
        }

        public bool OppositionSuperSlays(Mobile m)
        {
            for (int i = 0; i < this.Opposition.Length; i++)
            {
                if (this.Opposition[i].Super.Slays(m))
                    return true;
            }

            if (m_Super.Name == SlayerName.Eodon && !m_Super.Slays(m))
                return true;

            return false;
        }

        private static SlayerEntry[] CompileEntries(SlayerGroup[] groups)
        {
            SlayerEntry[] entries = new SlayerEntry[32];

            for (int i = 0; i < groups.Length; ++i)
            {
                SlayerGroup g = groups[i];

                g.Super.Group = g;

                entries[(int)g.Super.Name] = g.Super;

                for (int j = 0; j < g.Entries.Length; ++j)
                {
                    g.Entries[j].Group = g;
                    entries[(int)g.Entries[j].Name] = g.Entries[j];
                }
            }

            return entries;
        }

        public static SlayerName RandomSuperSlayerAOS(bool excludeFey = true)
        {
            int maxIndex = excludeFey ? 5 : 6;

            return Groups[Utility.Random(maxIndex)].Super.Name;
        }

        public static SlayerName RandomSuperSlayerTOL()
        {
            return Groups[Utility.Random(Groups.Length)].Super.Name;
        }
    }
}
