Exemplo n.º 1
0
        //Mimics ItemDropRule.ExpertGetsRerolls but with custom % instead of #rerolls
        //Wrapper for other rules ontop
        internal static void NPCExpertGetsRerolls(NPCLoot npcLoot, int itemId, int chanceDenominator = 1, int minimumDropped = 1, int maximumDropped = 1, int chanceNumerator = 1, IItemDropRule ruleExpert = null, IItemDropRule ruleNormal = null, float rerollChance = 0.5f)
        {
            //Since the conditions are exclusive, only one of them will show up
            IItemDropRule expertRule = new LeadingConditionRule(new Conditions.IsExpert());
            IItemDropRule ruleToAdd  = expertRule;

            if (ruleExpert != null)
            {
                ruleToAdd  = ruleExpert;                //If a rule is specified, use that to add it (Always add the "baseline" rule first)
                expertRule = ruleToAdd.OnSuccess(expertRule);
            }
            expertRule.OnSuccess(new CommonDropWithReroll(itemId, chanceDenominator, minimumDropped, maximumDropped, chanceNumerator, rerollChance));
            npcLoot.Add(ruleToAdd);

            //Vanilla example
            //Conditions.IsPumpkinMoon condition2 = new Conditions.IsPumpkinMoon();
            //Conditions.FromCertainWaveAndAbove condition3 = new Conditions.FromCertainWaveAndAbove(15);

            //LeadingConditionRule entry = new LeadingConditionRule(condition2);
            //LeadingConditionRule ruleToChain = new LeadingConditionRule(condition3);
            //npcLoot.Add(entry).OnSuccess(ruleToChain).OnSuccess(ItemDropRule.Common(1856));

            IItemDropRule notExpertRule = new LeadingConditionRule(new Conditions.NotExpert());

            ruleToAdd = notExpertRule;
            if (ruleNormal != null)
            {
                ruleToAdd     = ruleNormal;
                notExpertRule = ruleToAdd.OnSuccess(notExpertRule);
            }
            notExpertRule.OnSuccess(new CommonDrop(itemId, chanceDenominator, minimumDropped, maximumDropped, chanceNumerator));
            npcLoot.Add(ruleToAdd);
        }
        public static void EModeDrop(NPCLoot npcLoot, IItemDropRule rule)
        {
            EModeDropCondition dropCondition   = new EModeDropCondition();
            IItemDropRule      conditionalRule = new LeadingConditionRule(dropCondition);

            conditionalRule.OnSuccess(rule);
            npcLoot.Add(conditionalRule);
        }
        public static bool LockEarlyBirdDrop(NPCLoot npcLoot, IItemDropRule rule)
        {
            EModeEarlyBirdLockDropCondition lockCondition = new EModeEarlyBirdLockDropCondition();
            IItemDropRule conditionalRule = new LeadingConditionRule(lockCondition);

            conditionalRule.OnSuccess(rule);
            npcLoot.Add(conditionalRule);
            return(true);
        }
Exemplo n.º 4
0
        public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot)
        {
            base.ModifyNPCLoot(npc, npcLoot);

            LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition());

            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <GalacticGlobe>()));
            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.LunarOre, 150));
            npcLoot.Add(emodeRule);
        }
        public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot)
        {
            base.ModifyNPCLoot(npc, npcLoot);

            LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition());

            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <PrecisionSeal>()));
            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.HallowedFishingCrateHard, 5));
            npcLoot.Add(emodeRule);
        }
Exemplo n.º 6
0
        public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot)
        {
            base.ModifyNPCLoot(npc, npcLoot);

            LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition());

            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <NecromanticBrew>()));
            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.DungeonFishingCrate, 5));
            npcLoot.Add(emodeRule);
        }
Exemplo n.º 7
0
        public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot)
        {
            base.ModifyNPCLoot(npc, npcLoot);

            LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition());

            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <BetsysHeart>()));
            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.GoldenCrateHard, 5));
            npcLoot.Add(emodeRule);
        }
Exemplo n.º 8
0
        public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot)
        {
            base.ModifyNPCLoot(npc, npcLoot);

            LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition());

            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <Deerclawps>()));
            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <DeerSinew>()));
            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.FrozenCrate, 5));
            npcLoot.Add(emodeRule);
        }
Exemplo n.º 9
0
        public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot)
        {
            base.ModifyNPCLoot(npc, npcLoot);

            LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition());

            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <QueenStinger>()));
            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.JungleFishingCrate, 5));
            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.HerbBag, 5));
            npcLoot.Add(emodeRule);
        }
Exemplo n.º 10
0
        public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot)
        {
            base.ModifyNPCLoot(npc, npcLoot);

            LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition());

            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <SlimyShield>()));
            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.WoodenCrate, 5));
            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.LifeCrystal, 3));
            npcLoot.Add(emodeRule);
        }
Exemplo n.º 11
0
        public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot)
        {
            base.ModifyNPCLoot(npc, npcLoot);

            LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition());

            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <AgitatingLens>()));
            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.IronCrate, 5));
            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.FallenStar, 5));
            npcLoot.Add(emodeRule);
        }
Exemplo n.º 12
0
        public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot)
        {
            base.ModifyNPCLoot(npc, npcLoot);

            LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition());

            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <MagicalBulb>()));
            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.JungleFishingCrateHard, 5));
            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.LifeFruit, 3));
            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.ChlorophyteOre, 200));
            npcLoot.Add(emodeRule);
        }
Exemplo n.º 13
0
        //ModifyNPCLoot uses a unique system called the ItemDropDatabase, which has many different rules for many different drop use cases.
        //Here we go through all of them, and how they can be used.
        //There are tons of other examples in vanilla! In a decompiled vanilla build, GameContent/ItemDropRules/ItemDropDatabase adds item drops to every single vanilla NPC, which can be a good resource.

        public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot)
        {
            if (!NPCID.Sets.CountsAsCritter[npc.type])                                    //If npc is not a critter
            {
                npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <ExampleItem>(), 1)); //Make it drop ExampleItem.
                // ItemDropRule.Common is what you would use in most cases, it simply drops the item with a chance specified.
                // The dropsOutOfY int is used for the numerator of the fractional chance of dropping this item.
                // Likewise, the dropsXOutOfY int is used for the denominator.
                // For example, if you had a dropsOutOfY as 7 and a dropsXOutOfY as 2, then the chance the item would drop is 2/7 or about 28%.
            }

            // We will now use the Guide to explain many of the other types of drop rules.
            if (npc.type == NPCID.Guide)
            {
                // RemoveWhere will remove any drop rule that matches the provided expression.
                // To make your own expressions to remove vanilla drop rules, you'll usually have to study the original source code that adds those rules.
                npcLoot.RemoveWhere(
                    // The following expression returns true if the following conditions are met:
                    rule => rule is ItemDropWithConditionRule drop &&                  // If the rule is an ItemDropWithConditionRule instance
                    drop.itemId == ItemID.GreenCap &&                             // And that instance drops a green cap
                    drop.condition is Conditions.NamedNPC npcNameCondition &&                             // ..And if its condition is that an npc name must match some string
                    npcNameCondition.neededName == "Andrew"                                // And the condition's string is "Andrew".
                    );

                npcLoot.Add(ItemDropRule.Common(ItemID.GreenCap, 1));                 //In conjunction with the above removal, this makes it so a guide with any name will drop the Green Cap.
            }

            if (npc.type == NPCID.Crimera || npc.type == NPCID.Corruptor)
            {
                //Here we make use of our own special rule we created: drop during daytime
                ExampleDropCondition exampleDropCondition = new ExampleDropCondition();
                IItemDropRule        conditionalRule      = new LeadingConditionRule(exampleDropCondition);

                int itemType = ItemID.Vertebrae;
                if (npc.type == NPCID.Crimera)
                {
                    itemType = ItemID.RottenChunk;
                }
                //33% chance to drop other corresponding item in addition
                IItemDropRule rule = ItemDropRule.Common(itemType, chanceDenominator: 3);

                //Apply our item drop rule to the conditional rule
                conditionalRule.OnSuccess(rule);
                //Add the rule
                npcLoot.Add(conditionalRule);
                //It will result in the drop being shown in the bestiary, but only drop if the condition is true.
            }

            //TODO: Add the rest of the vanilla drop rules!!
        }
Exemplo n.º 14
0
        public override void ModifyNPCLoot(NPCLoot npcLoot)
        {
            npcLoot.Add(ItemDropRule.BossBag(ModContent.ItemType <TrojanSquirrelBag>()));
            npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <TrojanSquirrelTrophy>(), 10));

            LeadingConditionRule rule = new LeadingConditionRule(new Conditions.NotExpert());

            rule.OnSuccess(ItemDropRule.OneFromOptions(1, ModContent.ItemType <TreeSword>(), ModContent.ItemType <MountedAcornGun>(), ModContent.ItemType <SnowballStaff>(), ModContent.ItemType <KamikazeSquirrelStaff>()));
            rule.OnSuccess(ItemDropRule.Common(ItemID.WoodenCrate, 1, 1, 5));
            rule.OnSuccess(ItemDropRule.Common(ItemID.HerbBag, 1, 1, 5));
            rule.OnSuccess(ItemDropRule.Common(ItemID.Acorn, 1, 100, 100));
            rule.OnSuccess(ItemDropRule.Common(ModContent.Find <ModItem>("Fargowiltas", "LumberJaxe").Type, 10));
            npcLoot.Add(rule);
        }
Exemplo n.º 15
0
        public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot)
        {
            base.ModifyNPCLoot(npc, npcLoot);

            LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition());

            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <GuttedHeart>()));
            emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.CrimsonFishingCrate, 5));

            //to make up for no loot until dead
            emodeRule.OnSuccess(ItemDropRule.Common(ItemID.TissueSample, 1, 60, 60));
            emodeRule.OnSuccess(ItemDropRule.Common(ItemID.CrimtaneOre, 1, 200, 200));

            npcLoot.Add(emodeRule);
        }
Exemplo n.º 16
0
        public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot)
        {
            base.ModifyNPCLoot(npc, npcLoot);

            LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition());
            LeadingConditionRule lastEater = new LeadingConditionRule(new Conditions.LegacyHack_IsABoss());

            emodeRule.OnSuccess(lastEater);
            lastEater.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <DarkenedHeart>()));
            lastEater.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.CorruptFishingCrate, 5));

            //to make up for no loot until dead
            lastEater.OnSuccess(ItemDropRule.Common(ItemID.ShadowScale, 1, 60, 60));
            lastEater.OnSuccess(ItemDropRule.Common(ItemID.DemoniteOre, 1, 200, 200));

            npcLoot.Add(emodeRule);
        }
Exemplo n.º 17
0
        internal static void GlobalExpertGetsRerolls(GlobalLoot globalLoot, int itemId, int chanceDenominator = 1, int minimumDropped = 1, int maximumDropped = 1, int chanceNumerator = 1, IItemDropRule ruleExpert = null, IItemDropRule ruleNormal = null)
        {
            IItemDropRule expertRule = new LeadingConditionRule(new Conditions.IsExpert());
            IItemDropRule ruleToAdd  = expertRule;

            if (ruleExpert != null)
            {
                ruleToAdd  = ruleExpert;                //If a rule is specified, use that to add it (Always add the "baseline" rule first)
                expertRule = ruleToAdd.OnSuccess(expertRule);
            }
            expertRule.OnSuccess(new CommonDropWithReroll(itemId, chanceDenominator, minimumDropped, maximumDropped, chanceNumerator));
            globalLoot.Add(ruleToAdd);

            IItemDropRule notExpertRule = new LeadingConditionRule(new Conditions.NotExpert());

            ruleToAdd = notExpertRule;
            if (ruleNormal != null)
            {
                ruleToAdd     = ruleNormal;
                notExpertRule = ruleToAdd.OnSuccess(notExpertRule);
            }
            notExpertRule.OnSuccess(new CommonDrop(itemId, chanceDenominator, minimumDropped, maximumDropped, chanceNumerator));
            globalLoot.Add(ruleToAdd);
        }
        public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot)
        {
            IItemDropRule BossDrop(int item)
            {
                return(new DropBasedOnEMode(ItemDropRule.Common(item, 3), ItemDropRule.Common(item, 10)));
            }

            switch (npc.type)
            {
            case NPCID.KingSlime:
                npcLoot.Add(BossDrop(ModContent.ItemType <SlimeKingsSlasher>()));
                break;

            case NPCID.EyeofCthulhu:
                npcLoot.Add(BossDrop(ModContent.ItemType <LeashOfCthulhu>()));
                break;

            case NPCID.EaterofWorldsHead:
            case NPCID.EaterofWorldsBody:
            case NPCID.EaterofWorldsTail:
            {
                LeadingConditionRule lastEater = new LeadingConditionRule(new Conditions.LegacyHack_IsABoss());
                lastEater.OnSuccess(BossDrop(ModContent.ItemType <EaterStaff>()));
                npcLoot.Add(lastEater);
            }
            break;

            case NPCID.BrainofCthulhu:
                npcLoot.Add(BossDrop(ModContent.ItemType <BrainStaff>()));
                break;

            case NPCID.QueenBee:
                npcLoot.Add(BossDrop(ModContent.ItemType <TheSmallSting>()));
                break;

            case NPCID.SkeletronHead:
                npcLoot.Add(BossDrop(ModContent.ItemType <BoneZone>()));
                //npcLoot.Add(BossDrop(ModContent.ItemType<BrittleBone>(), 200));
                break;

            case NPCID.WallofFlesh:
                npcLoot.Add(BossDrop(ModContent.ItemType <FleshHand>()));
                break;

            case NPCID.TheDestroyer:
                npcLoot.Add(BossDrop(ModContent.ItemType <DestroyerGun>()));
                break;

            case NPCID.SkeletronPrime:
                npcLoot.Add(BossDrop(ModContent.ItemType <RefractorBlaster>()));
                break;

            case NPCID.Retinazer:
            case NPCID.Spazmatism:
            {
                LeadingConditionRule noTwin = new LeadingConditionRule(new Conditions.MissingTwin());
                noTwin.OnSuccess(BossDrop(ModContent.ItemType <TwinRangs>()));
                npcLoot.Add(noTwin);
            }
            break;

            case NPCID.Plantera:
                npcLoot.Add(BossDrop(ModContent.ItemType <Dicer>()));
                break;

            case NPCID.Golem:
                npcLoot.Add(BossDrop(ModContent.ItemType <RockSlide>()));
                break;

            case NPCID.DukeFishron:
                npcLoot.Add(BossDrop(ModContent.ItemType <FishStick>()));
                break;

            case NPCID.DD2Betsy:
                npcLoot.Add(BossDrop(ModContent.ItemType <DragonBreath>()));
                break;

            case NPCID.BigMimicJungle:
                npcLoot.Add(ItemDropRule.OneFromOptions(1,
                                                        ModContent.ItemType <Vineslinger>(),
                                                        ModContent.ItemType <Mahoguny>(),
                                                        ModContent.ItemType <OvergrownKey>()));
                break;

            default:
                break;
            }

            //if (Fargowiltas.Instance.CalamityLoaded && Revengeance && FargoSoulsWorld.EternityMode && Main.bloodMoon && Main.moonPhase == 0 && Main.raining && Main.rand.NextBool(10))
            //{
            //    Mod calamity = ModLoader.GetMod("CalamityMod");

            //    if (npc.type == calamity.NPCType("DevourerofGodsHeadS"))
            //    {
            //        Item.NewItem(npc.Hitbox, calamity.ItemType("CosmicPlushie"));
            //    }
            //}
        }
Exemplo n.º 19
0
        public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot)
        {
            //HOW TO SEE DROP RATES IN THE BESTIARY:

            /*
             * 1. Get the "GamerMod (Debug Tools)" mod
             * 2. Enter a world, type "/bestiary" in chat
             * 3. If it says "done?", leave the world (so that the 100% progress saves on that world)
             * 4. ???
             * 5. profit (check bestiary for drops)
             *
             * You need to do this for every world you are using (ideally a normal and an expert world)
             * You only have to do this once or when new NPCs get added. New drops to existing NPCs do not need redoing the steps
             */

            //This method is called once when the game loads (per NPC), so you can't make dynamic checks based on world state like "npc.value > 0f" here
            if (npc.type == NPCID.GoblinSorcerer)
            {
                //20 is the chanceDenominator argument, meaning its a 1/20 roll aka old Main.rand.NextBool(20)
                npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <ShadowyClicker>(), 20));
            }
            else if (npc.type == NPCID.Frankenstein || npc.type == NPCID.SwampThing)
            {
                npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <EclipticClicker>(), 25));
            }
            else if (npc.type == NPCID.BloodZombie || npc.type == NPCID.Drippler)
            {
                npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <HemoClicker>(), 25));
            }
            else if (npc.type == NPCID.DarkCaster)
            {
                npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <Milk>(), 15));
            }
            else if (npc.type == NPCID.IceMimic)
            {
                npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <AimAssistModule>(), 4));
            }
            else if (npc.type == NPCID.Gastropod)
            {
                npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <ChocolateChip>(), 20));
            }
            else if (npc.type == NPCID.SandElemental)
            {
                npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <SandstormClicker>(), 2));
            }
            else if (npc.type == NPCID.IceGolem)
            {
                npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <BlizzardClicker>(), 2));
            }
            else if (npc.type == NPCID.PirateCaptain)
            {
                npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <CaptainsClicker>(), 8));
            }
            else if (npc.type == NPCID.PirateShip)
            {
                npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <GoldenTicket>(), 4));
            }
            else if (npc.type == NPCID.Pumpking)
            {
                npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <LanternClicker>(), 10));
            }
            else if (npc.type == NPCID.MourningWood)
            {
                npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <WitchClicker>(), 10));
            }
            else if (npc.type == NPCID.SantaNK1)
            {
                npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <NaughtyClicker>(), 10));
            }
            else if (npc.type == NPCID.IceQueen)
            {
                npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <FrozenClicker>(), 10));
            }
            else if (npc.type == NPCID.DD2DarkMageT1 || npc.type == NPCID.DD2DarkMageT3)
            {
                npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <ArcaneClicker>(), 5));
            }
            else if (npc.type == NPCID.DD2OgreT2 || npc.type == NPCID.DD2OgreT3)
            {
                npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <SnottyClicker>(), 5));
            }
            else if (npc.type == NPCID.MaggotZombie)
            {
                npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <TriggerFinger>(), 18));
            }
            else if (npc.type == NPCID.MartianSaucerCore)
            {
                npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <HighTechClicker>(), 4));
            }
            else if (npc.type == NPCID.WindyBalloon)
            {
                npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <BalloonClicker>(), 10));
            }
            else if (npc.type == NPCID.BloodNautilus)
            {
                npcLoot.Add(ItemDropRule.NormalvsExpert(ModContent.ItemType <SpiralClicker>(), 2, 1));
            }
            else if (npc.type == NPCID.FireImp)
            {
                DropHelper.NPCExpertGetsRerolls(npcLoot, ModContent.ItemType <ImpishClicker>(), 35);
            }
            else if (npc.type == NPCID.TorchGod)
            {
                LeadingConditionRule neverDropsRule = new LeadingConditionRule(new Conditions.NeverTrue());
                neverDropsRule.OnSuccess(ItemDropRule.Common(ModContent.ItemType <TorchClicker>()));
                npcLoot.Add(neverDropsRule);
            }

            //Here go drops for normal mode that mirror through boss bags in expert mode (see ClickerItemGlobal)
            Conditions.NotExpert notExpert = new Conditions.NotExpert();
            if (npc.type == NPCID.MoonLordCore)
            {
                npcLoot.Add(ItemDropRule.ByCondition(notExpert, ModContent.ItemType <LordsClicker>()));
                npcLoot.Add(ItemDropRule.ByCondition(notExpert, ModContent.ItemType <TheClicker>(), 5));
            }
            else if (npc.type == NPCID.TheDestroyer || npc.type == NPCID.SkeletronPrime || npc.type == NPCID.Retinazer || npc.type == NPCID.Spazmatism)
            {
                var ruleToAdd = ItemDropRule.ByCondition(notExpert, ModContent.ItemType <BottomlessBoxofPaperclips>(), 4);

                if (npc.type == NPCID.TheDestroyer || npc.type == NPCID.SkeletronPrime)
                {
                    npcLoot.Add(ruleToAdd);
                }
                else
                {
                    LeadingConditionRule missingTwinRule = new LeadingConditionRule(new Conditions.MissingTwin());
                    missingTwinRule.OnSuccess(ruleToAdd);
                    npcLoot.Add(missingTwinRule);
                }
            }
            else if (npc.type == NPCID.DD2Betsy)
            {
                npcLoot.Add(ItemDropRule.ByCondition(notExpert, ModContent.ItemType <DraconicClicker>(), 4));
            }
            else if (npc.type == NPCID.Deerclops)
            {
                npcLoot.Add(ItemDropRule.ByCondition(notExpert, ModContent.ItemType <CyclopsClicker>(), 4));
            }
            else if (npc.type == NPCID.HallowBoss)
            {
                npcLoot.Add(ItemDropRule.ByCondition(notExpert, ModContent.ItemType <RainbowClicker>(), 4));
            }
            else if (npc.type == NPCID.DukeFishron)
            {
                npcLoot.Add(ItemDropRule.ByCondition(notExpert, ModContent.ItemType <SeafoamClicker>(), 5));
            }
            else if (npc.type == NPCID.WallofFlesh)
            {
                npcLoot.Add(ItemDropRule.ByCondition(notExpert, ModContent.ItemType <ClickerEmblem>(), 4));
            }
            else if (npc.type == NPCID.KingSlime)
            {
                npcLoot.Add(ItemDropRule.ByCondition(notExpert, ModContent.ItemType <StickyKeychain>(), 4));
            }
            else if (npc.type == NPCID.QueenSlimeBoss)
            {
                npcLoot.Add(ItemDropRule.ByCondition(notExpert, ModContent.ItemType <ClearKeychain>(), 4));
            }
            else if (npc.type == NPCID.LunarTowerStardust || npc.type == NPCID.LunarTowerSolar || npc.type == NPCID.LunarTowerVortex || npc.type == NPCID.LunarTowerNebula)
            {
                int miceFragment = ModContent.ItemType <MiceFragment>();

                var pNormal = default(DropOneByOne.Parameters);
                pNormal.ChanceDenominator              = 1;
                pNormal.ChanceNumerator                = 1;
                pNormal.MinimumStackPerChunkBase       = 1;
                pNormal.MaximumStackPerChunkBase       = 1;
                pNormal.BonusMinDropsPerChunkPerPlayer = 0;
                pNormal.BonusMaxDropsPerChunkPerPlayer = 0;

                pNormal.MinimumItemDropsCount = 3;
                pNormal.MaximumItemDropsCount = 15;

                var pExpert = pNormal;                 //Since DropOneByOne.Parameters is a struct, this is a copy/new assignment
                pExpert.MinimumItemDropsCount = 5;
                pExpert.MaximumItemDropsCount = 22;

                var normalModeRule = new DropOneByOne(miceFragment, pNormal);
                var expertModeRule = new DropOneByOne(miceFragment, pExpert);
                npcLoot.Add(new DropBasedOnExpertMode(normalModeRule, expertModeRule));
            }
        }